From f44071fa7659772dea2040e7cf22f173c0f75342 Mon Sep 17 00:00:00 2001 From: Dmytro Vynnyk Date: Thu, 23 Oct 2025 23:29:00 +0200 Subject: [PATCH 01/11] Change `balance` type from `number` to `string` in token and account response models to ensure consistent handling of large values. --- src/data/repositories/accountInfo/types.ts | 2 +- src/data/repositories/tokens/index.ts | 2 +- src/data/repositories/tokens/types.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/repositories/accountInfo/types.ts b/src/data/repositories/accountInfo/types.ts index 5ee4539..26dbd12 100644 --- a/src/data/repositories/accountInfo/types.ts +++ b/src/data/repositories/accountInfo/types.ts @@ -2,7 +2,7 @@ import { Maybe } from '../../../typings'; export interface IGetAccountsInfoResponse { account_hash: string; - balance: number; + balance: string; main_purse_uref: string; public_key: string; account_info?: ICloudAccountInfoResult; diff --git a/src/data/repositories/tokens/index.ts b/src/data/repositories/tokens/index.ts index c3a1221..7eb294c 100644 --- a/src/data/repositories/tokens/index.ts +++ b/src/data/repositories/tokens/index.ts @@ -66,7 +66,7 @@ export class TokensRepository implements ITokensRepository { return new CsprBalanceDto(resp?.data); } catch (e) { if (e instanceof HttpClientNotFoundError) { - return new CsprBalanceDto({ balance: 0 }); + return new CsprBalanceDto({ balance: '0' }); } else { this._processError(e, 'getCsprBalance'); } diff --git a/src/data/repositories/tokens/types.ts b/src/data/repositories/tokens/types.ts index 462de13..4848356 100644 --- a/src/data/repositories/tokens/types.ts +++ b/src/data/repositories/tokens/types.ts @@ -2,7 +2,7 @@ import { DataResponse, Network } from '../../../domain'; import { Maybe } from '../../../typings'; export interface IGetCsprBalanceResponse { - balance: number; + balance: string; delegated_balance?: number; undelegating_balance?: number; From 1737d5f0d4549ba9d98e1963dbd61b66f1b7888e Mon Sep 17 00:00:00 2001 From: Dmytro Vynnyk Date: Fri, 24 Oct 2025 00:21:54 +0200 Subject: [PATCH 02/11] Refactor repositories to utilize environment-based and network-based Casper Wallet API URLs; update setup logic for improved configurability and maintainability. --- src/data/repositories/accountInfo/index.ts | 12 +++-- src/data/repositories/appEvents/index.ts | 11 ++-- .../repositories/contractPackage/index.ts | 9 ++-- src/data/repositories/deploys/index.ts | 11 ++-- src/data/repositories/nfts/index.ts | 9 ++-- src/data/repositories/tokens/index.ts | 13 +++-- .../repositories/txSignatureRequest/index.ts | 20 +++++--- src/data/repositories/validators/index.ts | 13 +++-- src/domain/constants/casperNetwork.ts | 5 +- src/domain/tx-signature-request/repository.ts | 2 + src/setup.ts | 50 +++++++++++++++---- 11 files changed, 107 insertions(+), 48 deletions(-) diff --git a/src/data/repositories/accountInfo/index.ts b/src/data/repositories/accountInfo/index.ts index 2050206..9d3f467 100644 --- a/src/data/repositories/accountInfo/index.ts +++ b/src/data/repositories/accountInfo/index.ts @@ -1,7 +1,6 @@ import { LRUCache } from 'lru-cache'; import { CSPR_API_PROXY_HEADERS, - CasperWalletApiUrl, isAccountInfoError, AccountInfoError, IAccountInfoRepository, @@ -23,7 +22,10 @@ import { IGetCsprBalanceResponse } from '../tokens'; export * from './types'; export class AccountInfoRepository implements IAccountInfoRepository { - constructor(private _httpProvider: IHttpDataProvider) {} + constructor( + private _httpProvider: IHttpDataProvider, + private _casperWalletApiUrl: Record, + ) {} private _accountsInfoMapCache = new LRUCache({ max: 100, @@ -45,7 +47,7 @@ export class AccountInfoRepository implements IAccountInfoRepository { ); const resp = await this._httpProvider.post>({ - url: `${CasperWalletApiUrl[network]}/accounts?includes=account_info,centralized_account_info,cspr_name`, + url: `${this._casperWalletApiUrl[network]}/accounts?includes=account_info,centralized_account_info,cspr_name`, data: { account_hashes: accountsHashesForFetch, }, @@ -88,7 +90,7 @@ export class AccountInfoRepository implements IAccountInfoRepository { }: IGetAccountsBalancesParams): Promise> { try { const resp = await this._httpProvider.post>({ - url: `${CasperWalletApiUrl[network]}/accounts${withDelegationBalances ? '?includes=delegated_balance,undelegating_balance' : ''}`, + url: `${this._casperWalletApiUrl[network]}/accounts${withDelegationBalances ? '?includes=delegated_balance,undelegating_balance' : ''}`, data: { account_hashes: accountHashes, }, @@ -119,7 +121,7 @@ export class AccountInfoRepository implements IAccountInfoRepository { ): Promise> { try { const resp = await this._httpProvider.get>({ - url: `${CasperWalletApiUrl[network]}/cspr-name-resolutions/${csprName}`, + url: `${this._casperWalletApiUrl[network]}/cspr-name-resolutions/${csprName}`, params: { includes: 'resolved_public_key,account_info,centralized_account_info', }, diff --git a/src/data/repositories/appEvents/index.ts b/src/data/repositories/appEvents/index.ts index 2883959..fbfd30a 100644 --- a/src/data/repositories/appEvents/index.ts +++ b/src/data/repositories/appEvents/index.ts @@ -1,7 +1,6 @@ import { AppEventsError, AppEventsErrorType, - CasperWalletApiEndpoints, CSPR_API_PROXY_HEADERS, DataResponse, IAppEventsRepository, @@ -17,11 +16,15 @@ import { IMarketingEventApiResponse, IReleaseEventApiResponse } from './types'; import { AppMarketingEventDto, AppReleaseEventDto } from '../../dto'; import { Maybe } from '../../../typings'; import { isAppEventActive } from '../../../utils'; +import { IEnv } from '../../../domain/env'; export * from './types'; export class AppEventsRepository implements IAppEventsRepository { - constructor(private _httpProvider: IHttpDataProvider) {} + constructor( + private _httpProvider: IHttpDataProvider, + private _casperWalletApiByEnvUrl: Record, + ) {} async getReleaseEvents({ currentVersion, @@ -30,7 +33,7 @@ export class AppEventsRepository implements IAppEventsRepository { }: IGetReleaseUpdatesParams): Promise { try { const response = await this._httpProvider.get>({ - url: `${CasperWalletApiEndpoints[env]}/mobile-client-versions`, + url: `${this._casperWalletApiByEnvUrl[env]}/mobile-client-versions`, params: { after: `v${currentVersion}`, }, @@ -50,7 +53,7 @@ export class AppEventsRepository implements IAppEventsRepository { }: IGetMarketingEventsParams = {}): Promise { try { const response = await this._httpProvider.get>({ - url: `${CasperWalletApiEndpoints[env]}/marketing-events`, + url: `${this._casperWalletApiByEnvUrl[env]}/marketing-events`, errorType: 'getMarketingEvents', ...(withProxyHeader ? { headers: CSPR_API_PROXY_HEADERS } : {}), }); diff --git a/src/data/repositories/contractPackage/index.ts b/src/data/repositories/contractPackage/index.ts index 644f490..9752e78 100644 --- a/src/data/repositories/contractPackage/index.ts +++ b/src/data/repositories/contractPackage/index.ts @@ -1,5 +1,5 @@ import { - CasperWalletApiUrl, + CasperNetwork, ContractPackageError, ContractPackageErrorType, CSPR_API_PROXY_HEADERS, @@ -15,7 +15,10 @@ import { ContractPackageDto } from '../../dto'; export * from './types'; export class ContractPackageRepository implements IContractPackageRepository { - constructor(private _httpProvider: IHttpDataProvider) {} + constructor( + private _httpProvider: IHttpDataProvider, + private _casperWalletApiUrl: Record, + ) {} async getContractPackage({ contractPackageHash, @@ -24,7 +27,7 @@ export class ContractPackageRepository implements IContractPackageRepository { }: IGetContractPackageParams) { try { const resp = await this._httpProvider.get>({ - url: `${CasperWalletApiUrl[network]}/contract-packages/${contractPackageHash}`, + url: `${this._casperWalletApiUrl[network]}/contract-packages/${contractPackageHash}`, baseURL: '', errorType: 'getContractPackageRequest', ...(withProxyHeader ? { headers: CSPR_API_PROXY_HEADERS } : {}), diff --git a/src/data/repositories/deploys/index.ts b/src/data/repositories/deploys/index.ts index 872db44..5ae5c53 100644 --- a/src/data/repositories/deploys/index.ts +++ b/src/data/repositories/deploys/index.ts @@ -5,7 +5,6 @@ import { HttpClientNotFoundError, CSPR_API_PROXY_HEADERS, EMPTY_PAGINATED_RESPONSE, - CasperWalletApiUrl, IDeploysRepository, IGetDeploysParams, CloudPaginatedResponse, @@ -13,6 +12,7 @@ import { DataResponse, IDeploy, PaginatedResponse, + CasperNetwork, } from '../../../domain'; import type { IHttpDataProvider, IAccountInfoRepository } from '../../../domain'; import { getAccountHashFromPublicKey } from '../../../utils'; @@ -29,6 +29,7 @@ export class DeploysRepository implements IDeploysRepository { constructor( private _httpProvider: IHttpDataProvider, private _accountInfoRepository: IAccountInfoRepository, + private _casperWalletApiUrl: Record, ) {} async getDeploys({ @@ -41,7 +42,7 @@ export class DeploysRepository implements IDeploysRepository { }: IGetDeploysParams) { try { const resp = await this._httpProvider.get>({ - url: `${CasperWalletApiUrl[network]}/accounts/${activePublicKey}/deploys`, + url: `${this._casperWalletApiUrl[network]}/accounts/${activePublicKey}/deploys`, params: { public_key: activePublicKey, page, @@ -94,7 +95,7 @@ export class DeploysRepository implements IDeploysRepository { const accountHash = getAccountHashFromPublicKey(activePublicKey); const resp = await this._httpProvider.get>({ - url: `${CasperWalletApiUrl[network]}/accounts/${accountHash}/transfers`, + url: `${this._casperWalletApiUrl[network]}/accounts/${accountHash}/transfers`, params: { page, page_size: limit, @@ -142,7 +143,7 @@ export class DeploysRepository implements IDeploysRepository { }: IGetSingleDeployParams) { try { const resp = await this._httpProvider.get>({ - url: `${CasperWalletApiUrl[network]}/deploys/${deployHash}`, + url: `${this._casperWalletApiUrl[network]}/deploys/${deployHash}`, params: { includes: 'rate(1),contract,contract_package,contract_entrypoint,account_info,transfers,nft_token_actions,ft_token_actions', @@ -190,7 +191,7 @@ export class DeploysRepository implements IDeploysRepository { const resp = await this._httpProvider.get< CloudPaginatedResponse >({ - url: `${CasperWalletApiUrl[network]}/accounts/${accountHash}/ft-token-actions`, + url: `${this._casperWalletApiUrl[network]}/accounts/${accountHash}/ft-token-actions`, params: { contract_package_hash: contractPackageHash, // TODO do not worked account_identifier: accountHash, diff --git a/src/data/repositories/nfts/index.ts b/src/data/repositories/nfts/index.ts index 7f8921e..665fc05 100644 --- a/src/data/repositories/nfts/index.ts +++ b/src/data/repositories/nfts/index.ts @@ -1,5 +1,4 @@ import { - CasperWalletApiUrl, DEFAULT_PAGE_LIMIT, EMPTY_PAGINATED_RESPONSE, CSPR_API_PROXY_HEADERS, @@ -11,6 +10,7 @@ import { INft, NftContentType, PaginatedResponse, + CasperNetwork, } from '../../../domain'; import type { IHttpDataProvider } from '../../../domain'; import { getAccountHashFromPublicKey } from '../../../utils'; @@ -20,7 +20,10 @@ import { IApiNft } from './types'; export * from './types'; export class NftsRepository implements INftsRepository { - constructor(private _httpProvider: IHttpDataProvider) {} + constructor( + private _httpProvider: IHttpDataProvider, + private _casperWalletApiUrl: Record, + ) {} async getNfts({ network, @@ -33,7 +36,7 @@ export class NftsRepository implements INftsRepository { const accountHash = getAccountHashFromPublicKey(publicKey); const resp = await this._httpProvider.get>({ - url: `${CasperWalletApiUrl[network]}/accounts/${accountHash}/nft-tokens`, + url: `${this._casperWalletApiUrl[network]}/accounts/${accountHash}/nft-tokens`, params: { page, page_size: limit, diff --git a/src/data/repositories/tokens/index.ts b/src/data/repositories/tokens/index.ts index 7eb294c..0cf48a7 100644 --- a/src/data/repositories/tokens/index.ts +++ b/src/data/repositories/tokens/index.ts @@ -4,7 +4,6 @@ import { TokensError, HttpClientNotFoundError, CSPR_API_PROXY_HEADERS, - CasperWalletApiUrl, ITokensRepository, DataResponse, IGetTokensParams, @@ -12,6 +11,7 @@ import { IToken, IGetCsprFiatCurrencyRateParams, ITokenWithFiatBalance, + CasperNetwork, } from '../../../domain'; import type { IHttpDataProvider } from '../../../domain'; import { CsprBalanceDto, TokenDto, TokenFiatRateDto } from '../../dto'; @@ -21,7 +21,10 @@ import { Erc20Token, IGetCsprBalanceResponse, IGetCurrencyRateResponse } from '. export * from './types'; export class TokensRepository implements ITokensRepository { - constructor(private _httpProvider: IHttpDataProvider) {} + constructor( + private _httpProvider: IHttpDataProvider, + private _casperWalletApiUrl: Record, + ) {} async getTokens({ network, @@ -32,7 +35,7 @@ export class TokensRepository implements ITokensRepository { const accountHash = getAccountHashFromPublicKey(publicKey); const tokensList = await this._httpProvider.get>({ - url: `${CasperWalletApiUrl[network]}/accounts/${accountHash}/ft-token-ownership`, + url: `${this._casperWalletApiUrl[network]}/accounts/${accountHash}/ft-token-ownership`, params: { page_size: 100, // TODO pagination? includes: 'contract_package,friendlymarket_data(1),coingecko_data(1)', @@ -55,7 +58,7 @@ export class TokensRepository implements ITokensRepository { async getCsprBalance({ publicKey, network, withProxyHeader = true }: IGetCsprBalanceParams) { try { const resp = await this._httpProvider.get>({ - url: `${CasperWalletApiUrl[network]}/accounts/${publicKey}`, + url: `${this._casperWalletApiUrl[network]}/accounts/${publicKey}`, errorType: 'getCsprBalance', params: { includes: 'delegated_balance,undelegating_balance', @@ -100,7 +103,7 @@ export class TokensRepository implements ITokensRepository { }: IGetCsprFiatCurrencyRateParams) { try { const resp = await this._httpProvider.get({ - url: `${CasperWalletApiUrl[network]}/rates/1/amount`, + url: `${this._casperWalletApiUrl[network]}/rates/1/amount`, ...(withProxyHeader ? { headers: CSPR_API_PROXY_HEADERS } : {}), errorType: 'getCsprFiatCurrencyRate', }); diff --git a/src/data/repositories/txSignatureRequest/index.ts b/src/data/repositories/txSignatureRequest/index.ts index e0a193f..b66ebe8 100644 --- a/src/data/repositories/txSignatureRequest/index.ts +++ b/src/data/repositories/txSignatureRequest/index.ts @@ -1,9 +1,7 @@ import { CasperNetwork, - CasperWalletApiEndpoints, CSPR_API_PROXY_HEADERS, DataResponse, - GrpcUrl, IAccountInfoRepository, IContractPackage, IContractPackageRepository, @@ -38,6 +36,7 @@ import { TxSignatureRequestDto, } from '../../dto'; import { blake2b } from '@noble/hashes/blake2'; +import { IEnv } from '../../../domain/env'; export * from './types'; @@ -47,12 +46,15 @@ export class TxSignatureRequestRepository implements ITxSignatureRequestReposito private _accountInfoRepository: IAccountInfoRepository, private _tokensRepository: ITokensRepository, private _contractPackageRepository: IContractPackageRepository, + private _casperWalletApiByEnvUrl: Record, + private _grpcUrl: Record, ) {} async prepareSignatureRequest({ transactionJson, signingPublicKeyHex, withProxyHeader = true, + env = 'PRODUCTION', }: IPrepareSignatureRequestParams): Promise { try { const tx = Transaction.fromJSON(transactionJson); @@ -88,7 +90,7 @@ export class TxSignatureRequestRepository implements ITxSignatureRequestReposito } catch (e) {} try { - isWasmProxyOnApi = await this._checkIsWasmProxyTx(tx, withProxyHeader); + isWasmProxyOnApi = await this._checkIsWasmProxyTx(tx, withProxyHeader, env); } catch (e) {} try { @@ -130,7 +132,7 @@ export class TxSignatureRequestRepository implements ITxSignatureRequestReposito } catch (e) {} try { - const handler = new HttpHandler(GrpcUrl[network], 'fetch'); + const handler = new HttpHandler(this._grpcUrl[network], 'fetch'); if (withProxyHeader) { handler.setReferrer(CSPR_API_PROXY_HEADERS.Referer); @@ -263,7 +265,7 @@ export class TxSignatureRequestRepository implements ITxSignatureRequestReposito return null; } - const handler = new HttpHandler(GrpcUrl[network], 'fetch'); + const handler = new HttpHandler(this._grpcUrl[network], 'fetch'); if (withProxyHeader) { handler.setReferrer(CSPR_API_PROXY_HEADERS.Referer); @@ -290,7 +292,11 @@ export class TxSignatureRequestRepository implements ITxSignatureRequestReposito } } - private async _checkIsWasmProxyTx(tx: Transaction, withProxyHeader = true): Promise { + private async _checkIsWasmProxyTx( + tx: Transaction, + withProxyHeader = true, + env: IEnv = 'PRODUCTION', + ): Promise { try { if (!tx.target.session?.moduleBytes) { return false; @@ -301,7 +307,7 @@ export class TxSignatureRequestRepository implements ITxSignatureRequestReposito ); await this._httpProvider.get>({ - url: `${CasperWalletApiEndpoints.PRODUCTION}/odra-wasm-proxies/${blake2bHash}`, + url: `${this._casperWalletApiByEnvUrl[env]}/odra-wasm-proxies/${blake2bHash}`, baseURL: '', errorType: 'checkWasmProxyRequest', ...(withProxyHeader ? { headers: CSPR_API_PROXY_HEADERS } : {}), diff --git a/src/data/repositories/validators/index.ts b/src/data/repositories/validators/index.ts index ecb3737..0e4b2c5 100644 --- a/src/data/repositories/validators/index.ts +++ b/src/data/repositories/validators/index.ts @@ -1,5 +1,5 @@ import { - CasperWalletApiUrl, + CasperNetwork, CloudPaginatedResponse, CSPR_API_PROXY_HEADERS, DataResponse, @@ -20,7 +20,10 @@ import { IApiValidator, IApiValidatorWithStake, IAuctionMetricsResponse } from ' export * from './types'; export class ValidatorsRepository implements IValidatorsRepository { - constructor(private _httpProvider: IHttpDataProvider) {} + constructor( + private _httpProvider: IHttpDataProvider, + private _casperWalletApiUrl: Record, + ) {} async getValidators({ network, @@ -32,7 +35,7 @@ export class ValidatorsRepository implements IValidatorsRepository { const eraId = await this.getCurrentEraId({ network, withProxyHeader }); const resp = await this._httpProvider.get>({ - url: `${CasperWalletApiUrl[network]}/validators`, + url: `${this._casperWalletApiUrl[network]}/validators`, params: { page, page_size: limit, @@ -68,7 +71,7 @@ export class ValidatorsRepository implements IValidatorsRepository { const eraId = await this.getCurrentEraId({ network, withProxyHeader }); const validatorsList = await this._httpProvider.get>({ - url: `${CasperWalletApiUrl[network]}/accounts/${publicKey}/delegations`, + url: `${this._casperWalletApiUrl[network]}/accounts/${publicKey}/delegations`, params: { page: 1, page_size: 100, // TODO Pagination? @@ -90,7 +93,7 @@ export class ValidatorsRepository implements IValidatorsRepository { async getCurrentEraId({ withProxyHeader, network }: IGetGetCurrentEraIdParams): Promise { try { const resp = await this._httpProvider.get>({ - url: `${CasperWalletApiUrl[network]}/auction-metrics`, + url: `${this._casperWalletApiUrl[network]}/auction-metrics`, ...(withProxyHeader ? { headers: CSPR_API_PROXY_HEADERS } : {}), errorType: 'getCurrentEraId', }); diff --git a/src/domain/constants/casperNetwork.ts b/src/domain/constants/casperNetwork.ts index dc2d4a6..b62ad04 100644 --- a/src/domain/constants/casperNetwork.ts +++ b/src/domain/constants/casperNetwork.ts @@ -12,14 +12,15 @@ export const CasperLiveUrl: Record = { integration: 'https://integration.cspr.live', }; -export const CasperWalletApiUrl: Record = { +export const CasperWalletApiByNetworkUrl: Record = { mainnet: 'https://api.mainnet.casperwallet.io', testnet: 'https://api.testnet.casperwallet.io', devnet: 'https://cspr-wallet-api.dev.make.services', integration: 'https://api.integration.casperwallet.io', }; -export const CasperWalletApiEndpoints: Record = { +/** Environment-based url for Casper Wallet Api. Some API network agnostic and do not belong to any {@link CasperWalletApiByNetworkUrl}. Default env is PRODUCTION (in all places where it is used) */ +export const CasperWalletApiByEnvUrl: Record = { PRODUCTION: 'https://api.casperwallet.io', STAGING: 'https://cspr-wallet-api.stg.make.services', }; diff --git a/src/domain/tx-signature-request/repository.ts b/src/domain/tx-signature-request/repository.ts index 75b0175..efeba4f 100644 --- a/src/domain/tx-signature-request/repository.ts +++ b/src/domain/tx-signature-request/repository.ts @@ -1,4 +1,5 @@ import { ITxSignatureRequest } from './entities'; +import { IEnv } from '../env'; export interface ITxSignatureRequestRepository { prepareSignatureRequest(params: IPrepareSignatureRequestParams): Promise; @@ -8,4 +9,5 @@ export interface IPrepareSignatureRequestParams { transactionJson: string; signingPublicKeyHex: string; withProxyHeader?: boolean; + env?: IEnv; } diff --git a/src/setup.ts b/src/setup.ts index 85bbc96..13dba55 100644 --- a/src/setup.ts +++ b/src/setup.ts @@ -11,30 +11,62 @@ import { ContractPackageRepository, } from './data/repositories'; import { Logger } from './utils'; -import { ILogger } from './domain'; +import { + CasperNetwork, + CasperWalletApiByNetworkUrl, + CasperWalletApiByEnvUrl, + GrpcUrl, + ILogger, +} from './domain'; +import { IEnv } from './domain/env'; export interface ISetupRepositoriesParams { debug?: boolean; logger?: ILogger; + casperWalletApiByNetworkUrl?: Record; + /** Environment-based url for Casper Wallet Api. Some API network agnostic and do not belong to any {@link CasperWalletApiByNetworkUrl}. Default env is PRODUCTION (in all places where it is used) */ + casperWalletApiByEnvUrl?: Record; + grpcUrl?: Record; } -export const setupRepositories = ({ logger, debug }: ISetupRepositoriesParams = {}) => { +export const setupRepositories = ({ + logger, + debug, + casperWalletApiByNetworkUrl = CasperWalletApiByNetworkUrl, + casperWalletApiByEnvUrl = CasperWalletApiByEnvUrl, + grpcUrl = GrpcUrl, +}: ISetupRepositoriesParams = {}) => { const log = logger ?? new Logger(); const httpDataProvider = new HttpDataProvider(debug ? log : null); - const accountInfoRepository = new AccountInfoRepository(httpDataProvider); - const tokensRepository = new TokensRepository(httpDataProvider); + const accountInfoRepository = new AccountInfoRepository( + httpDataProvider, + casperWalletApiByNetworkUrl, + ); + const tokensRepository = new TokensRepository(httpDataProvider, casperWalletApiByNetworkUrl); const onRampRepository = new OnRampRepository(httpDataProvider); - const nftsRepository = new NftsRepository(httpDataProvider); - const validatorsRepository = new ValidatorsRepository(httpDataProvider); - const deploysRepository = new DeploysRepository(httpDataProvider, accountInfoRepository); - const appEventsRepository = new AppEventsRepository(httpDataProvider); - const contractPackageRepository = new ContractPackageRepository(httpDataProvider); + const nftsRepository = new NftsRepository(httpDataProvider, casperWalletApiByNetworkUrl); + const validatorsRepository = new ValidatorsRepository( + httpDataProvider, + casperWalletApiByNetworkUrl, + ); + const deploysRepository = new DeploysRepository( + httpDataProvider, + accountInfoRepository, + casperWalletApiByNetworkUrl, + ); + const appEventsRepository = new AppEventsRepository(httpDataProvider, casperWalletApiByEnvUrl); + const contractPackageRepository = new ContractPackageRepository( + httpDataProvider, + casperWalletApiByNetworkUrl, + ); const txSignatureRequestRepository = new TxSignatureRequestRepository( httpDataProvider, accountInfoRepository, tokensRepository, contractPackageRepository, + casperWalletApiByEnvUrl, + grpcUrl, ); return { From a6da9353a84def36e200c6b4b3c79ffe439daaed Mon Sep 17 00:00:00 2001 From: Dmytro Vynnyk Date: Mon, 10 Nov 2025 13:10:03 +0100 Subject: [PATCH 03/11] Update `cep-nft-transfer` to specify `CLTypeUInt8` for `CLOption` initialization, ensuring proper type handling --- src/utils/casperSdk/cep-nft-transfer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/casperSdk/cep-nft-transfer.ts b/src/utils/casperSdk/cep-nft-transfer.ts index a44e033..5245f6b 100644 --- a/src/utils/casperSdk/cep-nft-transfer.ts +++ b/src/utils/casperSdk/cep-nft-transfer.ts @@ -16,6 +16,7 @@ import { StoredVersionedContractByHash, Timestamp, Transaction, + CLTypeUInt8, } from 'casper-js-sdk'; export enum NFTTokenStandard { @@ -304,6 +305,6 @@ export function getRuntimeArgsForCep95Transfer({ ), ), token_id: CLValue.newCLUInt256(tokenId), - data: CLValue.newCLOption(null), + data: CLValue.newCLOption(null, CLTypeUInt8), }); } From 043df32658ae584c17520a9916ece0db2f7e065e Mon Sep 17 00:00:00 2001 From: Dmytro Vynnyk Date: Mon, 1 Dec 2025 22:40:50 +0100 Subject: [PATCH 04/11] Add support for handling CEP-18 entry points and improve `TxSignatureRequestDto` logic with `isCep18Action` validation --- .../txSignatureRequest/TxSignatureRequestDto.ts | 15 +++++++++++---- src/domain/constants/casperNetwork.ts | 11 +++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts b/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts index 81153eb..59979b9 100644 --- a/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts +++ b/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts @@ -5,6 +5,7 @@ import { AssociatedKeysContractInfo, AuctionManagerContractInfo, CasperNetwork, + CEP_18_ACTION_ENTRY_POINTS, CSPR_COIN, CSPRMarketContractInfo, IAccountInfo, @@ -188,10 +189,7 @@ export function getTxSignatureRequestAction( contractPackage, collectionContractPackage, ); - } else if ( - contractTypeId === ContractTypeId.CustomCep18 || - contractTypeId === ContractTypeId.Cep18 - ) { + } else if (isCep18Action(tx, contractTypeId)) { return getTxSignatureRequestCep18Action(tx, accountInfoMap, contractPackage); } else if ( contractTypeId === ContractTypeId.CEP78Nft || @@ -263,3 +261,12 @@ function isContractSpecificContractCall(tx: Transaction, contractInfo: IContract storedTargetId?.byPackageName?.name === contractInfo.contractPackageName ); } + +function isCep18Action(tx: Transaction, contractTypeId?: number): boolean { + const entryPoint = tx.entryPoint.customEntryPoint ?? ''; + + return ( + (contractTypeId === ContractTypeId.CustomCep18 || contractTypeId === ContractTypeId.Cep18) && + CEP_18_ACTION_ENTRY_POINTS.includes(entryPoint.toLowerCase()) + ); +} diff --git a/src/domain/constants/casperNetwork.ts b/src/domain/constants/casperNetwork.ts index b62ad04..f21d0b6 100644 --- a/src/domain/constants/casperNetwork.ts +++ b/src/domain/constants/casperNetwork.ts @@ -219,3 +219,14 @@ export const casperChainNameToCasperNetwork: Record Date: Mon, 1 Dec 2025 23:11:18 +0100 Subject: [PATCH 05/11] Add `iconUrl` support to deploy DTOs and entities; refine CEP-18 entry point validation logic --- src/data/dto/deploys/CsprTransferDeployDto.ts | 2 ++ src/data/dto/deploys/DeployDto.ts | 2 ++ src/data/dto/deploys/common.ts | 5 +++-- src/domain/deploys/entities.ts | 1 + 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/data/dto/deploys/CsprTransferDeployDto.ts b/src/data/dto/deploys/CsprTransferDeployDto.ts index 4ecfcaf..60d3921 100644 --- a/src/data/dto/deploys/CsprTransferDeployDto.ts +++ b/src/data/dto/deploys/CsprTransferDeployDto.ts @@ -108,6 +108,7 @@ export class CsprTransferDeployDto implements INativeCsprDeploy { this.cep18ActionsResult = []; this.deployHash = data?.deploy_hash ?? ''; this.id = getUniqueId(); + this.iconUrl = null; } readonly recipientAccountInfo: Maybe; @@ -144,4 +145,5 @@ export class CsprTransferDeployDto implements INativeCsprDeploy { readonly cep18ActionsResult: ICep18ActionsResult[]; readonly id: string; readonly deployHash: string; + readonly iconUrl: Maybe; } diff --git a/src/data/dto/deploys/DeployDto.ts b/src/data/dto/deploys/DeployDto.ts index ad8f0d8..2de5945 100644 --- a/src/data/dto/deploys/DeployDto.ts +++ b/src/data/dto/deploys/DeployDto.ts @@ -50,6 +50,7 @@ export class DeployDto implements IDeploy { ); this.contractHash = data?.contract_hash ?? ''; this.contractPackageHash = data?.contract_package_hash ?? ''; + this.iconUrl = data?.contract_package?.icon_url ?? null; this.entryPoint = getEntryPoint(data) ?? null; this.contractName = data?.contract_package?.name ?? null; @@ -75,6 +76,7 @@ export class DeployDto implements IDeploy { readonly executionTypeId: number; readonly contractHash: string; readonly contractPackageHash: string; + readonly iconUrl: Maybe; readonly entryPoint: Maybe; readonly status: DeployStatus; readonly cost: string; diff --git a/src/data/dto/deploys/common.ts b/src/data/dto/deploys/common.ts index 42212cf..547ea0a 100644 --- a/src/data/dto/deploys/common.ts +++ b/src/data/dto/deploys/common.ts @@ -12,6 +12,7 @@ import { AccountKeyType, AssociatedKeysContractHash, AuctionManagerContractHash, + CEP_18_ACTION_ENTRY_POINTS, CSPRMarketContractHash, CSPRStudioCep47ContractHash, DeployType, @@ -41,8 +42,8 @@ export function getDeployType(network: Network, deploy?: Partial; readonly status: DeployStatus; readonly callerPublicKey: string; From 9375f47147667d0532f5fa63533689b88ba85705 Mon Sep 17 00:00:00 2001 From: Dmytro Vynnyk Date: Mon, 15 Dec 2025 22:19:08 +0100 Subject: [PATCH 06/11] Refactor `TxSignatureRequestDto` and related actions to replace `signingPublicKeyHex` with `senderPublicKeyHex` for improved clarity and consistency. --- src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts | 8 ++++---- src/data/dto/txSignatureRequest/actions/auctionAction.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts b/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts index 59979b9..063d6ab 100644 --- a/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts +++ b/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts @@ -88,7 +88,7 @@ export class TxSignatureRequestDto implements ITxSignatureRequest { tx, csprFiatRate, network, - signingPublicKeyHex, + this.senderKey, accountInfoMap, contractPackage, collectionContractPackage, @@ -124,7 +124,7 @@ export function getTxSignatureRequestAction( tx: Transaction, csprFiatRate: string, network: Maybe, - signingPublicKeyHex: string, + senderPublicKeyHex: string, accountInfoMap: Record = {}, contractPackage: Maybe, collectionContractPackage: Maybe, @@ -150,7 +150,7 @@ export function getTxSignatureRequestAction( tx, accountInfoMap, csprFiatRate, - signingPublicKeyHex, + senderPublicKeyHex, contractPackage, ); @@ -173,7 +173,7 @@ export function getTxSignatureRequestAction( tx, accountInfoMap, csprFiatRate, - signingPublicKeyHex, + senderPublicKeyHex, contractPackage, ); } else if ( diff --git a/src/data/dto/txSignatureRequest/actions/auctionAction.ts b/src/data/dto/txSignatureRequest/actions/auctionAction.ts index 8b756b2..f281b87 100644 --- a/src/data/dto/txSignatureRequest/actions/auctionAction.ts +++ b/src/data/dto/txSignatureRequest/actions/auctionAction.ts @@ -14,7 +14,7 @@ export function getTxSignatureRequestAuctionAction( tx: Transaction, accountInfoMap: Record = {}, csprFiatRate: string, - signingPublicKeyHex: string, + senderPublicKeyHex: string, contractPackage: Maybe, ): ITxSignatureRequestAuctionAction { const amount = tx.args.getByName('amount')?.toString() ?? '0'; @@ -28,7 +28,7 @@ export function getTxSignatureRequestAuctionAction( fromValidatorKeyType, ); - const toValidator = getToValidator(tx, entryPoint, signingPublicKeyHex); + const toValidator = getToValidator(tx, entryPoint, senderPublicKeyHex); const toValidatorKeyType = deriveKeyType(toValidator); const toValidatorAccountInfo = getAccountInfoFromMap( accountInfoMap, @@ -75,7 +75,7 @@ function getFromValidator(tx: Transaction, entryPoint: string): string | null { return null; } -function getToValidator(tx: Transaction, entryPoint: string, signingPublicKeyHex: string) { +function getToValidator(tx: Transaction, entryPoint: string, senderPublicKeyHex: string) { const new_validator = tx.args.getByName('new_validator'); if (new_validator) { @@ -85,7 +85,7 @@ function getToValidator(tx: Transaction, entryPoint: string, signingPublicKeyHex return validator?.type.getTypeID() === TypeID.PublicKey ? validator.toString() : ''; } else if (entryPoint.toLowerCase() === 'undelegate') { - return signingPublicKeyHex; + return senderPublicKeyHex; } return null; From ad5cad10bf3794016995ef713e6cef4f75334281 Mon Sep 17 00:00:00 2001 From: Dmytro Vynnyk Date: Mon, 15 Dec 2025 22:43:40 +0100 Subject: [PATCH 07/11] Refactor CEP-18 and NFT entry point validation logic by introducing `isCep18Action` and `isNftAction` utilities; clean up related DTOs and constants. --- src/data/dto/common.ts | 19 +++++++++++++ src/data/dto/deploys/common.ts | 16 +++-------- .../TxSignatureRequestDto.ts | 27 +++++++------------ src/domain/constants/casperNetwork.ts | 10 +++++++ 4 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/data/dto/common.ts b/src/data/dto/common.ts index 93de871..dc9094b 100644 --- a/src/data/dto/common.ts +++ b/src/data/dto/common.ts @@ -8,8 +8,10 @@ import { import Decimal from 'decimal.js'; import { AccountKeyType, + CEP_18_ACTION_ENTRY_POINTS, CSPR_COIN, IAccountInfo, + NFT_ACTION_ENTRY_POINTS, SupportedMarketDataProviders, } from '../../domain'; import { Maybe } from '../../typings'; @@ -103,3 +105,20 @@ export function getMarketDataProviderUrl( return null; } } + +export function isCep18Action(entryPointName: string, contractTypeId?: Maybe): boolean { + return ( + (contractTypeId === ContractTypeId.CustomCep18 || contractTypeId === ContractTypeId.Cep18) && + CEP_18_ACTION_ENTRY_POINTS.includes(entryPointName.toLowerCase()) + ); +} + +export function isNftAction(entryPointName: string, contractTypeId?: Maybe): boolean { + return ( + (contractTypeId === ContractTypeId.CEP78Nft || + contractTypeId === ContractTypeId.CEP47Nft || + contractTypeId === ContractTypeId.CustomCEP78Nft || + contractTypeId === ContractTypeId.CustomCEP47Nft) && + NFT_ACTION_ENTRY_POINTS.includes(entryPointName.toLowerCase()) + ); +} diff --git a/src/data/dto/deploys/common.ts b/src/data/dto/deploys/common.ts index 547ea0a..636aee5 100644 --- a/src/data/dto/deploys/common.ts +++ b/src/data/dto/deploys/common.ts @@ -12,7 +12,6 @@ import { AccountKeyType, AssociatedKeysContractHash, AuctionManagerContractHash, - CEP_18_ACTION_ENTRY_POINTS, CSPRMarketContractHash, CSPRStudioCep47ContractHash, DeployType, @@ -22,7 +21,7 @@ import { import { ExtendedCloudDeploy, ExtendedDeployArgsResult, IApiDeployArgs } from '../../repositories'; import { Maybe } from '../../../typings'; -import { ContractTypeId, getHashByType } from '../common'; +import { getHashByType, isCep18Action, isNftAction } from '../common'; export function getDeployType(network: Network, deploy?: Partial): DeployType { const contractTypeId = @@ -41,18 +40,9 @@ export function getDeployType(network: Network, deploy?: Partial Date: Mon, 15 Dec 2025 22:50:55 +0100 Subject: [PATCH 08/11] Remove unused `isCep18Action` function from `TxSignatureRequestDto` to simplify code structure. --- src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts b/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts index bdf9efa..3cc6301 100644 --- a/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts +++ b/src/data/dto/txSignatureRequest/TxSignatureRequestDto.ts @@ -262,12 +262,3 @@ function isContractSpecificContractCall(tx: Transaction, contractInfo: IContract storedTargetId?.byPackageName?.name === contractInfo.contractPackageName ); } - -function isCep18Action(tx: Transaction, contractTypeId?: number): boolean { - const entryPoint = tx.entryPoint.customEntryPoint ?? ''; - - return ( - (contractTypeId === ContractTypeId.CustomCep18 || contractTypeId === ContractTypeId.Cep18) && - CEP_18_ACTION_ENTRY_POINTS.includes(entryPoint.toLowerCase()) - ); -} From 620915098fd7cc11a571df02aa8eac61532e2733 Mon Sep 17 00:00:00 2001 From: Dmytro Vynnyk Date: Thu, 18 Dec 2025 21:21:49 +0100 Subject: [PATCH 09/11] Add `WASM` and `WASM_PROXY` deploy types and related utilities for deploy type detection --- src/data/dto/deploys/common.ts | 5 ++++- src/domain/deploys/entities.ts | 2 ++ src/utils/deploy.ts | 8 ++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/data/dto/deploys/common.ts b/src/data/dto/deploys/common.ts index 4161912..1d20ee0 100644 --- a/src/data/dto/deploys/common.ts +++ b/src/data/dto/deploys/common.ts @@ -12,7 +12,6 @@ import { AccountKeyType, AssociatedKeysContractHash, AuctionManagerContractHash, - CEP_18_ACTION_ENTRY_POINTS, CSPRMarketContractHash, CSPRStudioCep47ContractHash, DeployType, @@ -47,6 +46,10 @@ export function getDeployType(network: Network, deploy?: Partial { return deploy.type === 'NFT'; }; +export const isWasmDeploy = (deploy: IDeploy): deploy is INftDeploy => { + return deploy.type === 'WASM'; +}; +export const isWasmProxyDeploy = (deploy: IDeploy): deploy is INftDeploy => { + return deploy.type === 'WASM_PROXY'; +}; export const isUnknownDeploy = (deploy: IDeploy): deploy is IDeploy => { return deploy.type === 'UNKNOWN'; }; -export const isWasmDeployExecutionType = (deploy: IDeploy) => - Number(deploy.executionTypeId) === 1 || Number(deploy.executionTypeId) === 7; export const isContractCallExecutionType = (deploy: IDeploy) => Number(deploy.executionTypeId) > 1 && Number(deploy.executionTypeId) < 6; export const isTransferExecutionType = (deploy: IDeploy) => Number(deploy.executionTypeId) === 6; From 9e68c6e6fd2f39db9078d5fdc05348ea27f22e45 Mon Sep 17 00:00:00 2001 From: Dmytro Vynnyk Date: Mon, 22 Dec 2025 17:11:20 +0100 Subject: [PATCH 10/11] Extend `Cep18DeployDto` to handle `recipientAccountHash` by utilizing `deriveSplitDataFromNamedKeyValue`. --- src/data/dto/deploys/Cep18DeployDto.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/data/dto/deploys/Cep18DeployDto.ts b/src/data/dto/deploys/Cep18DeployDto.ts index 87a2a1a..f8f1c1a 100644 --- a/src/data/dto/deploys/Cep18DeployDto.ts +++ b/src/data/dto/deploys/Cep18DeployDto.ts @@ -1,4 +1,9 @@ -import { getDeployAmount, getEntryPoint, guardedDeriveSplitDataFromArguments } from './common'; +import { + deriveSplitDataFromNamedKeyValue, + getDeployAmount, + getEntryPoint, + guardedDeriveSplitDataFromArguments, +} from './common'; import { formatTokenBalance, getAccountHashFromPublicKey, @@ -101,7 +106,15 @@ export function getCep18RecipientKeyAndType( const owner = guardedDeriveSplitDataFromArguments(data?.args?.owner, 'Account'); const spender = guardedDeriveSplitDataFromArguments(data?.args?.spender, 'Hash'); - const info = recipientAccount ?? owner ?? recipient ?? spender; + const recipientAccountHash = + typeof data?.args?.recipient?.parsed === 'string' + ? { + ...deriveSplitDataFromNamedKeyValue(data?.args?.recipient?.parsed), + keyType: 'accountHash' as const, + } + : null; + + const info = recipientAccount ?? owner ?? recipient ?? spender ?? recipientAccountHash; if (info?.keyType === 'accountHash' && info?.hash) { const publicKey = derivePublicKeyFromCep18ActionResults(info.hash, data); From 3c21b4e37cd03b93153b97242555a3996c47d4d7 Mon Sep 17 00:00:00 2001 From: Dmytro Vynnyk Date: Mon, 22 Dec 2025 18:55:32 +0100 Subject: [PATCH 11/11] Lockfile updates: bump dependencies (`@noble/curves`, `@scure/base`, `@types/node`, `axios`, `humanize-duration`, `undici-types`, and others) to latest compatible versions. --- package.json | 2 +- yarn.lock | 64 ++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 82333d5..86670df 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@react-native/typescript-config": "0.74.83", "@types/uuid": "^10.0.0", "apisauce": "^3.1.1", - "casper-js-sdk": "^5.0.6", + "casper-js-sdk": "5.0.6", "date-fns": "^2.30.0", "decimal.js": "^10.4.3", "lru-cache": "10.4.3", diff --git a/yarn.lock b/yarn.lock index ffc2138..21e1979 100644 --- a/yarn.lock +++ b/yarn.lock @@ -352,11 +352,11 @@ __metadata: linkType: hard "@noble/curves@npm:^1.1.0, @noble/curves@npm:~1.9.0": - version: 1.9.1 - resolution: "@noble/curves@npm:1.9.1" + version: 1.9.7 + resolution: "@noble/curves@npm:1.9.7" dependencies: "@noble/hashes": "npm:1.8.0" - checksum: 10c0/39c84dbfecdca80cfde2ecea4b06ef2ec1255a4df40158d22491d1400057a283f57b2b26c8b1331006e6e061db791f31d47764961c239437032e2f45e8888c1e + checksum: 10c0/150014751ebe8ca06a8654ca2525108452ea9ee0be23430332769f06808cddabfe84f248b6dbf836916bc869c27c2092957eec62c7506d68a1ed0a624017c2a3 languageName: node linkType: hard @@ -466,9 +466,9 @@ __metadata: linkType: hard "@scure/base@npm:~1.2.5": - version: 1.2.5 - resolution: "@scure/base@npm:1.2.5" - checksum: 10c0/078928dbcdd21a037b273b81b8b0bd93af8a325e2ffd535b7ccaadd48ee3c15bab600ec2920a209fca0910abc792cca9b01d3336b472405c407440e6c0aa8bd6 + version: 1.2.6 + resolution: "@scure/base@npm:1.2.6" + checksum: 10c0/49bd5293371c4e062cb6ba689c8fe3ea3981b7bb9c000400dc4eafa29f56814cdcdd27c04311c2fec34de26bc373c593a1d6ca6d754398a488d587943b7c128a languageName: node linkType: hard @@ -501,11 +501,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 22.15.24 - resolution: "@types/node@npm:22.15.24" + version: 25.0.3 + resolution: "@types/node@npm:25.0.3" dependencies: - undici-types: "npm:~6.21.0" - checksum: 10c0/16c38e98168fa6c3d2f2b6e95f14f80878d969b39093bc5384385a884d73a7fe361c563b36f14bc27536b337f5baad74321f717b31d2c061b9c48074567eb8c6 + undici-types: "npm:~7.16.0" + checksum: 10c0/b7568f0d765d9469621615e2bb257c7fd1953d95e9acbdb58dffb6627a2c4150d405a4600aa1ad8a40182a94fe5f903cafd3c0a2f5132814debd0e3bfd61f835 languageName: node linkType: hard @@ -727,7 +727,7 @@ __metadata: "@react-native/typescript-config": "npm:0.74.83" "@types/uuid": "npm:^10.0.0" apisauce: "npm:^3.1.1" - casper-js-sdk: "npm:^5.0.6" + casper-js-sdk: "npm:5.0.6" date-fns: "npm:^2.30.0" decimal.js: "npm:^10.4.3" eslint: "npm:8.22.0" @@ -959,7 +959,7 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.7.7, axios@npm:^1.8.4": +"axios@npm:^1.7.7": version: 1.9.0 resolution: "axios@npm:1.9.0" dependencies: @@ -970,6 +970,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:^1.8.4": + version: 1.13.2 + resolution: "axios@npm:1.13.2" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.4" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/e8a42e37e5568ae9c7a28c348db0e8cf3e43d06fcbef73f0048669edfe4f71219664da7b6cc991b0c0f01c28a48f037c515263cb79be1f1ae8ff034cd813867b + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -1086,7 +1097,7 @@ __metadata: languageName: node linkType: hard -"casper-js-sdk@npm:^5.0.6": +"casper-js-sdk@npm:5.0.6": version: 5.0.6 resolution: "casper-js-sdk@npm:5.0.6" dependencies: @@ -2015,6 +2026,19 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.4": + version: 4.0.5 + resolution: "form-data@npm:4.0.5" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.2" + mime-types: "npm:^2.1.12" + checksum: 10c0/dd6b767ee0bbd6d84039db12a0fa5a2028160ffbfaba1800695713b46ae974a5f6e08b3356c3195137f8530dcd9dfcb5d5ae1eeff53d0db1e5aad863b619ce3b + languageName: node + linkType: hard + "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -2289,9 +2313,9 @@ __metadata: linkType: hard "humanize-duration@npm:^3.24.0": - version: 3.32.2 - resolution: "humanize-duration@npm:3.32.2" - checksum: 10c0/c267d69e3e1206b6326a33218a8dd4c5980adccdd750f1b3e9837719c4519e2587463e86e81fadfa8d8c0e107101b4dfcaa6dd8e99265a794c58907d266c679f + version: 3.33.2 + resolution: "humanize-duration@npm:3.33.2" + checksum: 10c0/eae493c113f1c11c96e42195002e8016ab7c08bfcc3414ba5459027da4faaa2df012429bc4eae200873a65d0a86b7cc6a9656783aa45705ffe6106b5256af973 languageName: node linkType: hard @@ -3957,10 +3981,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.21.0": - version: 6.21.0 - resolution: "undici-types@npm:6.21.0" - checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 +"undici-types@npm:~7.16.0": + version: 7.16.0 + resolution: "undici-types@npm:7.16.0" + checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a languageName: node linkType: hard