From f8009176a04d27a8ee384484aaf1eb2e902c8689 Mon Sep 17 00:00:00 2001 From: xLaRc Date: Sat, 14 Feb 2026 01:34:17 +0300 Subject: [PATCH 1/7] feat: add UpMint Shelby - upload files & mint NFTs on ShelbyNet --- apps/upmint-shelby/.gitignore | 24 + apps/upmint-shelby/README.md | 76 +++ apps/upmint-shelby/index.html | 20 + apps/upmint-shelby/package.json | 30 + apps/upmint-shelby/public/vite.svg | 1 + apps/upmint-shelby/src/main.tsx | 36 ++ apps/upmint-shelby/src/shelby-app.tsx | 549 ++++++++++++++++ apps/upmint-shelby/src/style.css | 540 ++++++++++++++++ apps/upmint-shelby/src/typescript.svg | 1 + apps/upmint-shelby/vite.config.ts | 31 + pnpm-lock.yaml | 887 ++++++++++---------------- 11 files changed, 1634 insertions(+), 561 deletions(-) create mode 100644 apps/upmint-shelby/.gitignore create mode 100644 apps/upmint-shelby/README.md create mode 100644 apps/upmint-shelby/index.html create mode 100644 apps/upmint-shelby/package.json create mode 100644 apps/upmint-shelby/public/vite.svg create mode 100644 apps/upmint-shelby/src/main.tsx create mode 100644 apps/upmint-shelby/src/shelby-app.tsx create mode 100644 apps/upmint-shelby/src/style.css create mode 100644 apps/upmint-shelby/src/typescript.svg create mode 100644 apps/upmint-shelby/vite.config.ts diff --git a/apps/upmint-shelby/.gitignore b/apps/upmint-shelby/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/apps/upmint-shelby/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/apps/upmint-shelby/README.md b/apps/upmint-shelby/README.md new file mode 100644 index 0000000..ef17f11 --- /dev/null +++ b/apps/upmint-shelby/README.md @@ -0,0 +1,76 @@ +# UpMint Shelby + +Upload files to the Shelby network and mint them as NFTs on Aptos (ShelbyNet). Built with Shelby Protocol for decentralized storage and Petra wallet for authentication. + +![UpMint Shelby](https://img.shields.io/badge/Shelby-NFT-blue) ![Aptos](https://img.shields.io/badge/Aptos-ShelbyNet-purple) + +## Features + +- **Upload to Shelby** – Select files and upload them to the Shelby decentralized network +- **Create Collections** – Define a collection name before minting NFTs +- **Mint NFTs** – Turn your uploaded images into on-chain NFTs (Aptos Token standard) +- **My NFTs** – View your minted NFTs grouped by collection, with Explorer links +- **Petra Wallet** – Connect via Petra and use ShelbyNet for all transactions + +## Tech Stack + +- **React + TypeScript + Vite** +- **Shelby Protocol** – Blob storage and coordination +- **Aptos** – NFT minting (ShelbyNet) +- **Petra Wallet** – Wallet adapter for Aptos + +## Getting Started + +### Prerequisites + +- [Node.js](https://nodejs.org/) (v18+) +- [Petra Wallet](https://petra.app/) browser extension +- Petra configured for **ShelbyNet** + +### Installation + +```bash +git clone https://github.com/10ur5en/UpMint-Shelby.git +cd UpMint-Shelby +npm install +``` + +### Development + +```bash +npm run dev +``` + +Open [http://localhost:5173](http://localhost:5173) in your browser. + +### Build + +```bash +npm run build +npm run preview +``` + +## Usage + +1. **Connect** – Click "Connect with Petra" and approve the connection to ShelbyNet +2. **Upload** – Select image files to upload to the Shelby network +3. **Create Collection** – Enter a collection name and click "Create Collection" +4. **Mint** – Click "Mint NFT" on each uploaded image +5. **View** – See your NFTs in "My NFTs", grouped by collection + +## Notes + +- Only image files can be minted as NFTs +- Collection must be created before minting +- If Petra shows empty collection details, view NFTs on [Aptos Explorer](https://explorer.aptoslabs.com/?network=shelbynet) +- Proxy is used in dev for CORS; production should use proper backend or Shelby/Aptos endpoints + +## Links + +- [Shelby](https://shelby.xyz/) +- [Shelby Docs](https://docs.shelby.xyz/) +- [Aptos Explorer (ShelbyNet)](https://explorer.aptoslabs.com/?network=shelbynet) + +## License + +MIT diff --git a/apps/upmint-shelby/index.html b/apps/upmint-shelby/index.html new file mode 100644 index 0000000..83b840e --- /dev/null +++ b/apps/upmint-shelby/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + Shelby - Upload & Mint NFTs + + +
+ + + + diff --git a/apps/upmint-shelby/package.json b/apps/upmint-shelby/package.json new file mode 100644 index 0000000..75d4d28 --- /dev/null +++ b/apps/upmint-shelby/package.json @@ -0,0 +1,30 @@ +{ + "name": "@shelby-protocol/upmint-shelby", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "~5.9.3", + "vite": "^7.3.1" + }, + "dependencies": { + "@aptos-labs/ts-sdk": "^5.2.1", + "@aptos-labs/wallet-adapter-react": "^7.2.8", + "@shelby-protocol/react": "^1.0.0", + "@shelby-protocol/sdk": "^0.1.0", + "@shelby-protocol/solana-kit": "^0.2.1", + "@solana/client": "^1.7.0", + "@solana/react-hooks": "^1.4.1", + "@tanstack/react-query": "^5.90.21", + "@types/react": "^19.2.13", + "@types/react-dom": "^19.2.3", + "buffer": "^6.0.3", + "react": "^19.2.4", + "react-dom": "^19.2.4" + } +} diff --git a/apps/upmint-shelby/public/vite.svg b/apps/upmint-shelby/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/apps/upmint-shelby/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/upmint-shelby/src/main.tsx b/apps/upmint-shelby/src/main.tsx new file mode 100644 index 0000000..c2b499a --- /dev/null +++ b/apps/upmint-shelby/src/main.tsx @@ -0,0 +1,36 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { ShelbyClientProvider } from '@shelby-protocol/react' +import { ShelbyClient } from '@shelby-protocol/sdk/browser' +import { Network } from '@aptos-labs/ts-sdk' +import { AptosWalletAdapterProvider } from '@aptos-labs/wallet-adapter-react' +import { Buffer } from 'buffer' +import './style.css' +import { App } from './shelby-app' + +;(window as any).Buffer = (window as any).Buffer || Buffer + +const queryClient = new QueryClient() +const isDev = typeof window !== 'undefined' && import.meta.env.DEV +const origin = typeof window !== 'undefined' ? window.location.origin : '' +const shelbyRpcBase = isDev ? `${origin}/shelby-rpc` : undefined +const aptosFullnode = isDev ? `${origin}/shelby-aptos` : undefined +const shelbyClient = new ShelbyClient({ + network: Network.SHELBYNET, + ...(shelbyRpcBase && { rpc: { baseUrl: shelbyRpcBase } }), + ...(aptosFullnode && { aptos: { fullnode: aptosFullnode } }), +}) + +ReactDOM.createRoot(document.getElementById('app') as HTMLElement).render( + + + + + + + + + , +) + diff --git a/apps/upmint-shelby/src/shelby-app.tsx b/apps/upmint-shelby/src/shelby-app.tsx new file mode 100644 index 0000000..a9d53a1 --- /dev/null +++ b/apps/upmint-shelby/src/shelby-app.tsx @@ -0,0 +1,549 @@ +import React, { useEffect, useState } from 'react' +import { useWallet } from '@aptos-labs/wallet-adapter-react' +import { useShelbyClient } from '@shelby-protocol/react' +import { + createDefaultErasureCodingProvider, + DEFAULT_CHUNKSET_SIZE_BYTES, + expectedTotalChunksets, + generateCommitments, + ShelbyBlobClient, +} from '@shelby-protocol/sdk/browser' +import { AccountAddress, Aptos, AptosConfig, Network } from '@aptos-labs/ts-sdk' + +const SHELBY_BLOB_API_BASE = 'https://api.shelbynet.shelby.xyz/shelby/v1/blobs' +const SHELBY_EXPLORER_BASE = 'https://explorer.shelby.xyz/shelbynet/blobs' +const EXPLORER_TXN = (hash: string) => + `https://explorer.aptoslabs.com/txn/${hash}?network=shelbynet` +const EXPLORER_ACCOUNT_NFTS = (addr: string) => + `https://explorer.aptoslabs.com/account/${addr}/nfts?network=shelbynet` +const EXPLORER_OBJECT = (addr: string) => + `https://explorer.aptoslabs.com/object/${addr}?network=shelbynet` + +type UploadedItem = { + id: string + name: string + blobName: string + storageOwner: string + previewDataUrl?: string + mimeType: string + uploadTxHash?: string + uploadedAt: string +} + +export const App: React.FC = () => { + const [uploads, setUploads] = useState([]) + const [isUploading, setIsUploading] = useState(false) + const [uploadError, setUploadError] = useState(null) + const [uploadSuccessTx, setUploadSuccessTx] = useState(null) + const [mintingId, setMintingId] = useState(null) + const [mintError, setMintError] = useState(null) + const [lastMintTxHash, setLastMintTxHash] = useState(null) + const [collectionName, setCollectionName] = useState('') + const [creatingCollection, setCreatingCollection] = useState(false) + const [collectionCreateTx, setCollectionCreateTx] = useState(null) + const [myNfts, setMyNfts] = useState>([]) + const [nftsLoading, setNftsLoading] = useState(false) + + const { account, connect, disconnect, connected, wallets, network, signAndSubmitTransaction } = + useWallet() + const shelbyClient = useShelbyClient() + const walletConnected = connected && account?.address + + useEffect(() => { + if (!connected || !network) return + const info = network as any + const name = String(info?.name ?? '').toLowerCase() + if (name === 'mainnet' || name === 'testnet') { + alert(`Switch your wallet to ShelbyNet for Shelby.\nCurrent: ${name}`) + } + }, [connected, network]) + + useEffect(() => { + if (!walletConnected || !account?.address) { + setMyNfts([]) + return + } + setNftsLoading(true) + const aptos = new Aptos(new AptosConfig({ network: Network.SHELBYNET })) + aptos + .getOwnedDigitalAssets({ ownerAddress: String(account.address), options: { limit: 100 } }) + .then((list) => { + setMyNfts( + list.map((o: any) => ({ + token_data_id: o.token_data_id, + token_name: o.current_token_data?.token_name, + token_uri: o.current_token_data?.token_uri, + collection_name: o.current_token_data?.current_collection?.collection_name, + })) + ) + }) + .catch(() => setMyNfts([])) + .finally(() => setNftsLoading(false)) + }, [walletConnected, account?.address, lastMintTxHash]) + + const handleUpload = async (e: React.ChangeEvent) => { + const files = e.target.files + if (!files?.length || !walletConnected) return + + setUploadError(null) + setUploadSuccessTx(null) + setIsUploading(true) + const accountAddress = String(account!.address) + + try { + for (let i = 0; i < files.length; i++) { + const file = files[i] + const ext = file.name.split('.').pop() || 'bin' + const baseName = file.name.replace(/\.[^/.]+$/, '').replace(/\s+/g, '_') || 'file' + const blobName = `${baseName}_${Date.now()}_${i}.${ext}` + const data = new Uint8Array(await file.arrayBuffer()) + const expirationMicros = Date.now() * 1000 + 365 * 24 * 60 * 60 * 1_000_000 + const blobs = [{ blobName, blobData: data }] + + const provider = await createDefaultErasureCodingProvider() + const commitments = await Promise.all( + blobs.map((b) => generateCommitments(provider, b.blobData)), + ) + + const pending = await signAndSubmitTransaction({ + data: ShelbyBlobClient.createBatchRegisterBlobsPayload({ + account: AccountAddress.from(accountAddress), + expirationMicros, + blobs: blobs.map((blob, idx) => ({ + blobName: blob.blobName, + blobSize: blob.blobData.length, + blobMerkleRoot: commitments[idx].blob_merkle_root, + numChunksets: expectedTotalChunksets(blob.blobData.length, DEFAULT_CHUNKSET_SIZE_BYTES), + })), + }), + }) + + try { + await shelbyClient.coordination.aptos.waitForTransaction({ + transactionHash: pending.hash, + }) + } catch (waitErr) { + console.warn('waitForTransaction:', waitErr) + } + + for (const blob of blobs) { + await shelbyClient.rpc.putBlob({ + account: accountAddress, + blobName: blob.blobName, + blobData: blob.blobData, + }) + } + + let previewDataUrl: string | undefined + if (file.type.startsWith('image/')) { + previewDataUrl = await new Promise((res, rej) => { + const r = new FileReader() + r.onload = () => res(r.result as string) + r.onerror = rej + r.readAsDataURL(file) + }) + } + + const item: UploadedItem = { + id: `${blobName}-${Date.now()}`, + name: baseName, + blobName, + storageOwner: accountAddress, + previewDataUrl, + mimeType: file.type, + uploadTxHash: pending.hash, + uploadedAt: new Date().toISOString(), + } + setUploads((prev) => [item, ...prev]) + setUploadSuccessTx(pending.hash) + } + } catch (err: any) { + console.error(err) + setUploadError(err?.message || 'Upload error') + } finally { + setIsUploading(false) + e.target.value = '' + } + } + + const handleCreateCollection = async () => { + const collName = collectionName.trim() + if (!collName || !walletConnected || !signAndSubmitTransaction) return + setMintError(null) + setCreatingCollection(true) + try { + const imageUri = 'https://shelby.xyz' + const createRes = await signAndSubmitTransaction({ + data: { + function: '0x4::aptos_token::create_collection', + functionArguments: [ + `${collName} - NFT collection stored on the Shelby network`, + '999999', + collName, + imageUri, + true, true, true, true, true, true, true, true, true, + '0', '1', + ], + }, + }) + await shelbyClient.coordination.aptos + .waitForTransaction({ transactionHash: createRes.hash }) + .catch(() => {}) + setMintError(null) + setCollectionCreateTx(createRes.hash) + } catch (err: any) { + const raw = err?.message ?? err?.reason ?? err?.error ?? '' + const msg = String(raw).toLowerCase() + const alreadyExists = + msg.includes('collection_already_exists') || + msg.includes('object already exists') || + msg.includes('already exists at') + if (alreadyExists) { + setMintError(null) + } else { + setMintError(err?.message || 'Collection creation error') + } + } finally { + setCreatingCollection(false) + } + } + + const handleMint = async (item: UploadedItem) => { + if (!walletConnected || !signAndSubmitTransaction) return + if (!item.mimeType.startsWith('image/')) { + setMintError('Image file required for NFT minting.') + return + } + const collName = collectionName.trim() + if (!collName) { + setMintError('Enter collection name first for NFT minting.') + return + } + + setMintError(null) + setLastMintTxHash(null) + setMintingId(item.id) + + try { + const imageUri = `${SHELBY_BLOB_API_BASE}/${item.storageOwner}/${encodeURIComponent(item.blobName)}` + const tokenName = item.blobName.replace(/\.[^/.]+$/, '') + + const mintTxn = await signAndSubmitTransaction({ + data: { + function: '0x4::aptos_token::mint', + functionArguments: [ + collName, + `${collName}: ${item.name}`, + tokenName, + imageUri, + [], [], [], + ], + }, + }) + + setLastMintTxHash(mintTxn.hash) + setUploads((prev) => prev.filter((u) => u.id !== item.id)) + } catch (err: any) { + console.error(err) + const msg = String(err?.message || '').toLowerCase() + const noCollection = msg.includes('object does not exist') || msg.includes('not found') || msg.includes('collection') + setMintError( + noCollection + ? 'Collection not found. Click "Create Collection" first.' + : err?.message || 'Mint error' + ) + } finally { + setMintingId(null) + } + } + + const shelbyExplorerUrl = (item: UploadedItem) => + `${SHELBY_EXPLORER_BASE}/${item.storageOwner}?blobName=${encodeURIComponent(item.blobName)}` + + return ( +
+
+
+
+

Shelby

+

Upload files to the Shelby network, mint as NFT if you wish.

+
+ {walletConnected && ( +
+ +
+ )} +
+
+ +
+ {!walletConnected ? ( +
+

Upload to Shelby

+

To get started, connect to ShelbyNet with your Petra wallet.

+ {wallets.some((w) => w.name === 'Petra') ? ( + + ) : ( +

Petra wallet not found. Install the browser extension.

+ )} +
+ ) : ( + <> +
+

Upload to Shelby

+

Select files to upload to the Shelby network. They will appear in Uploads and you can mint as NFT if you wish.

+ + {uploadError &&

{uploadError}

} + {uploadSuccessTx && ( +

+ Upload successful.{' '} + + View on Explorer → + +

+ )} +
+ +
+

Uploads

+ {uploads.length === 0 ? ( +

No uploads yet. Upload from above.

+ ) : ( + <> +
+ + setCollectionName(e.target.value)} + className="form-row input" + style={{ + padding: '0.6rem 0.8rem', + borderRadius: '0.6rem', + border: '1px solid rgba(148, 163, 184, 0.3)', + background: 'rgba(15, 12, 22, 0.6)', + color: '#e8e6ed', + fontSize: '0.95rem', + maxWidth: '320px', + }} + /> + +

+ First click the button above to create the collection, then mint each image. Collection details may appear empty in Petra; you can view your NFTs on{' '} + + Aptos Explorer + + . +

+
+
+ {uploads.map((item) => ( +
+
+ {item.previewDataUrl ? ( + {item.name} + ) : ( +
📄 {item.name}
+ )} +
+
+ {item.name} + + Shelby Explorer → + + {item.uploadTxHash && ( + + Upload transaction → + + )} +
+ + {!item.mimeType.startsWith('image/') && ( + Only images can be minted as NFT + )} +
+ ))} +
+ + )} +
+ +
+

My NFTs

+

+ Your minted NFTs. If they appear empty in Petra, view them here or on{' '} + + Aptos Explorer + + . +

+ {nftsLoading ? ( +

Loading...

+ ) : myNfts.length === 0 ? ( +

No minted NFTs yet.

+ ) : ( + (() => { + const byCollection = myNfts.reduce>((acc, nft) => { + const key = nft.collection_name?.trim() || '(No collection)' + if (!acc[key]) acc[key] = [] + acc[key].push(nft) + return acc + }, {}) + const sortedCollections = Object.keys(byCollection).sort() + return ( +
+ {sortedCollections.map((collName) => ( +
+

+ {collName} ({byCollection[collName].length}) +

+
+ {byCollection[collName].map((nft) => ( +
+
+ {nft.token_uri ? ( + {nft.token_name { (e.target as HTMLImageElement).style.display = 'none' }} /> + ) : ( +
🖼️ {nft.token_name || 'NFT'}
+ )} +
+
+ {nft.token_name || 'NFT'} + + View on Explorer → + +
+
+ ))} +
+
+ ))} +
+ ) + })() + )} +
+ + {(mintError || lastMintTxHash || collectionCreateTx) && ( +
+ {mintError &&

{mintError}

} + {collectionCreateTx && ( +

+ Collection created.{' '} + + View on Explorer → + +

+ )} + {lastMintTxHash && ( +
+

NFT minted successfully!

+ + View mint transaction on Explorer → + +

+ Collection content may appear empty when clicked in Petra. View your NFTs on{' '} + + Aptos Explorer → + +

+
+ )} +
+ )} + + )} +
+
+ ) +} diff --git a/apps/upmint-shelby/src/style.css b/apps/upmint-shelby/src/style.css new file mode 100644 index 0000000..e44feed --- /dev/null +++ b/apps/upmint-shelby/src/style.css @@ -0,0 +1,540 @@ +:root { + font-family: 'DM Sans', system-ui, -apple-system, sans-serif; + line-height: 1.5; + font-weight: 400; + color: #0f172a; + background: linear-gradient(160deg, #0c0a14 0%, #1a1625 40%, #0f0d14 100%); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +body { + margin: 0; + min-width: 320px; + min-height: 100vh; + color: #e8e6ed; +} + +a { + color: inherit; + text-decoration: none; +} + +#app { + max-width: 960px; + margin: 0 auto; + padding: 2rem 1.5rem 4rem; +} + +.page { + display: flex; + flex-direction: column; + gap: 2rem; +} + +/* Header */ +.header { + text-align: left; +} + +.header-top { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 1.5rem; + flex-wrap: wrap; +} + +.header h1 { + font-size: clamp(1.8rem, 4vw, 2.5rem); + margin: 0 0 0.5rem; + background: linear-gradient(135deg, #a78bfa, #f472b6); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +.header p { + margin: 0; + max-width: 32rem; + color: #94a3b8; + font-size: 0.95rem; +} + +.wallet-actions { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.wallet-address-btn { + padding: 0.4rem 0.8rem; + border-radius: 0.75rem; + background: rgba(167, 139, 250, 0.15); + border: 1px solid rgba(167, 139, 250, 0.4); + font-size: 0.85rem; + color: #c4b5fd; + cursor: pointer; +} + +.wallet-address-btn:hover { + background: rgba(167, 139, 250, 0.25); +} + +/* Cards */ +.card { + background: rgba(26, 22, 37, 0.85); + border-radius: 1rem; + padding: 1.5rem 1.4rem; + border: 1px solid rgba(167, 139, 250, 0.12); + backdrop-filter: blur(12px); +} + +.card h2 { + margin: 0 0 0.5rem; + font-size: 1.15rem; + color: #f1eef7; +} + +.card p { + margin: 0 0 1rem; + color: #94a3b8; + font-size: 0.9rem; +} + +/* Connect */ +.connect-card { + text-align: center; + padding: 2.5rem; +} + +.cta-button { + padding: 0.75rem 1.5rem; + font-size: 1rem; + border-radius: 0.75rem; + background: linear-gradient(135deg, #8b5cf6, #ec4899); + border: none; + color: white; + cursor: pointer; + font-weight: 500; + transition: transform 0.15s, box-shadow 0.2s; +} + +.cta-button:hover { + transform: translateY(-2px); + box-shadow: 0 10px 30px rgba(139, 92, 246, 0.4); +} + +/* Collection settings */ +.collection-form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.form-row { + display: flex; + flex-direction: column; + gap: 0.35rem; +} + +.form-row label { + font-size: 0.8rem; + color: #94a3b8; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.form-row input[type='text'], +.form-row input[type='number'] { + padding: 0.6rem 0.8rem; + border-radius: 0.6rem; + border: 1px solid rgba(148, 163, 184, 0.3); + background: rgba(15, 12, 22, 0.6); + color: #e8e6ed; + font-size: 0.95rem; +} + +.form-row input::placeholder { + color: #64748b; +} + +.form-row-inline { + display: flex; + gap: 1.5rem; + flex-wrap: wrap; +} + +.checkbox-label { + display: flex; + align-items: center; + gap: 0.5rem; + cursor: pointer; + text-transform: none !important; +} + +.checkbox-label input[type='checkbox'] { + width: 1.1rem; + height: 1.1rem; + accent-color: #8b5cf6; +} + +/* Upload zone */ +.upload-zone { + display: flex; + align-items: center; + justify-content: center; + min-height: 120px; + border: 2px dashed rgba(167, 139, 250, 0.35); + border-radius: 1rem; + background: rgba(139, 92, 246, 0.05); + cursor: pointer; + transition: border-color 0.2s, background 0.2s; +} + +.upload-zone:hover { + border-color: rgba(167, 139, 250, 0.6); + background: rgba(139, 92, 246, 0.1); +} + +.file-input-hidden { + position: absolute; + opacity: 0; + pointer-events: none; + width: 0; + height: 0; +} + +.upload-zone-text { + font-size: 0.95rem; + color: #a78bfa; +} + +/* NFT Grid */ +.nft-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); + gap: 1.25rem; +} + +.nft-card { + background: rgba(15, 12, 22, 0.7); + border-radius: 0.75rem; + overflow: hidden; + border: 1px solid rgba(167, 139, 250, 0.15); + display: flex; + flex-direction: column; +} + +.nft-card-image { + aspect-ratio: 1; + overflow: hidden; + background: rgba(0, 0, 0, 0.3); +} + +.nft-card-image img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +.nft-card-info { + padding: 0.75rem 0.9rem; + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.nft-card-name { + font-size: 0.95rem; + font-weight: 500; + color: #f1eef7; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.nft-explorer-link { + font-size: 0.75rem; + color: #a78bfa; +} + +.nft-explorer-link:hover { + text-decoration: underline; +} + +.nft-mint-btn { + margin: 0 0.9rem 0.9rem; + padding: 0.6rem 1rem; + border-radius: 0.6rem; + background: linear-gradient(135deg, #8b5cf6, #ec4899); + border: none; + color: white; + font-size: 0.9rem; + font-weight: 500; + cursor: pointer; + transition: transform 0.15s, opacity 0.15s; +} + +.nft-mint-btn:hover:not(:disabled) { + transform: translateY(-1px); +} + +.nft-mint-btn:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.nft-card-placeholder { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: 0.85rem; + color: #94a3b8; + text-align: center; + padding: 0.5rem; +} + +.mint-hint { + font-size: 0.7rem; + color: #64748b; + margin: 0 0.9rem 0.5rem; + display: block; +} + +/* Messages */ +.error { + color: #fca5a5; + font-size: 0.9rem; + margin: 0; +} + +.success { + color: #86efac; + font-size: 0.9rem; + margin: 0 0 0.5rem; +} + +.hint { + color: #94a3b8; + font-size: 0.9rem; +} + +.empty-hint { + color: #64748b; + font-size: 0.9rem; + margin: 0; +} + +.explorer-link { + display: inline-block; + font-size: 0.9rem; + color: #a78bfa; + margin-top: 0.5rem; +} + +.explorer-link:hover { + text-decoration: underline; +} + +.layout { + max-width: 800px; + margin: 0 auto; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +/* Tabs */ +.app-tabs { + display: flex; + gap: 0.5rem; +} + +.app-tab { + padding: 0.5rem 1rem; + border-radius: 0.75rem; + background: rgba(15, 12, 22, 0.8); + border: 1px solid rgba(148, 163, 184, 0.3); + color: #94a3b8; + font-size: 0.9rem; + cursor: pointer; + font-family: inherit; + transition: all 0.2s ease; +} + +.app-tab:hover { + border-color: rgba(148, 163, 184, 0.6); + color: #e5e7eb; +} + +.app-tab.active { + background: linear-gradient(135deg, #8b5cf6, #ec4899); + border-color: transparent; + color: white; +} + +/* Collections grid */ +.collections-grid { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.collection-card { + padding: 1rem 1.1rem; + border-radius: 0.75rem; + background: rgba(15, 12, 22, 0.6); + border: 1px solid rgba(167, 139, 250, 0.2); + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.collection-card-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.75rem; +} + +.collection-name { + font-size: 1rem; + font-weight: 600; + color: #f1eef7; +} + +.collection-supply { + font-size: 0.85rem; + font-weight: 500; + color: #a78bfa; + background: rgba(139, 92, 246, 0.15); + padding: 0.25rem 0.5rem; + border-radius: 0.4rem; +} + +.collection-meta { + display: flex; + align-items: center; + gap: 0.75rem; + font-size: 0.8rem; + color: #94a3b8; +} + +.collection-creator { + font-family: ui-monospace, monospace; +} + +.collection-price { + color: #86efac; +} + +.collection-actions { + display: flex; + align-items: center; + gap: 0.75rem; + margin-top: 0.25rem; +} + +.share-link, +.share-btn { + font-size: 0.8rem; + color: #a78bfa; + cursor: pointer; + background: none; + border: none; + padding: 0; + font-family: inherit; +} + +.share-link:hover, +.share-btn:hover { + text-decoration: underline; +} + +.select-coll-btn { + padding: 0.4rem 0.75rem; + font-size: 0.8rem; + border-radius: 0.5rem; + background: rgba(139, 92, 246, 0.3); + border: 1px solid rgba(167, 139, 250, 0.4); + color: #e8e6ed; + cursor: pointer; + font-family: inherit; +} + +.select-coll-btn:hover { + background: rgba(139, 92, 246, 0.5); +} + +.select-coll-btn.pay-btn { + background: rgba(34, 197, 94, 0.3); + border-color: rgba(34, 197, 94, 0.5); +} + +.select-coll-btn.pay-btn:hover { + background: rgba(34, 197, 94, 0.5); +} + +.add-collection-form { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin-bottom: 1rem; +} + +.add-collection-form input { + flex: 1; + min-width: 140px; + padding: 0.5rem 0.7rem; + border-radius: 0.6rem; + border: 1px solid rgba(148, 163, 184, 0.3); + background: rgba(15, 12, 22, 0.6); + color: #e8e6ed; + font-size: 0.9rem; +} + +.add-coll-btn { + padding: 0.5rem 1rem; + font-size: 0.9rem; + border-radius: 0.6rem; + background: linear-gradient(135deg, #8b5cf6, #ec4899); + border: none; + color: white; + cursor: pointer; + font-family: inherit; +} + +.add-coll-btn:hover { + opacity: 0.9; +} + +button { + font-family: inherit; +} + +@media (max-width: 640px) { + #app { + padding-inline: 1rem; + } + + .nft-grid { + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + } + + .form-row-inline { + flex-direction: column; + } +} diff --git a/apps/upmint-shelby/src/typescript.svg b/apps/upmint-shelby/src/typescript.svg new file mode 100644 index 0000000..d91c910 --- /dev/null +++ b/apps/upmint-shelby/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/upmint-shelby/vite.config.ts b/apps/upmint-shelby/vite.config.ts new file mode 100644 index 0000000..4388f59 --- /dev/null +++ b/apps/upmint-shelby/vite.config.ts @@ -0,0 +1,31 @@ +import { defineConfig } from 'vite' + +// Proxy Shelby indexer/RPC requests via Vite dev server to bypass +// browser CORS. The browser talks to localhost:5173, Vite forwards to Shelby. + +export default defineConfig({ + server: { + proxy: { + '/shelby-indexer': { + target: + 'https://api.shelbynet.aptoslabs.com/nocode/v1/public/cmforrguw0042s601fn71f9l2/v1/graphql', + changeOrigin: true, + secure: true, + rewrite: () => '', + }, + '/shelby-rpc': { + target: 'https://api.shelbynet.shelby.xyz', + changeOrigin: true, + secure: true, + rewrite: (path) => path.replace(/^\/shelby-rpc/, '/shelby'), + }, + '/shelby-aptos': { + target: 'https://api.shelbynet.shelby.xyz', + changeOrigin: true, + secure: true, + rewrite: (path) => path.replace(/^\/shelby-aptos/, '/v1'), + }, + }, + }, +}) + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0989b1..4f9db13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -157,7 +157,7 @@ importers: version: 0.1.1(@wallet-standard/core@1.1.1)(bufferutil@4.1.0)(got@11.8.6)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.5))(zod@4.3.5) '@shelby-protocol/react': specifier: ^0.0.4 - version: 0.0.4(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@shelby-protocol/sdk@0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + version: 0.0.4(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@aptos-labs/wallet-adapter-react@7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.10)(@wallet-standard/core@1.1.1)(react@19.2.4))(@shelby-protocol/sdk@0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) '@shelby-protocol/sdk': specifier: ^0.0.9 version: 0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)) @@ -249,7 +249,7 @@ importers: dependencies: '@shelby-protocol/react': specifier: latest - version: 0.0.5(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@shelby-protocol/sdk@0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + version: 0.0.5(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@aptos-labs/wallet-adapter-react@7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.10)(@wallet-standard/core@1.1.1)(react@19.2.4))(@shelby-protocol/sdk@0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) '@shelby-protocol/sdk': specifier: latest version: 0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)) @@ -319,7 +319,7 @@ importers: version: 0.31.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@shelby-protocol/react': specifier: latest - version: 0.0.5(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@shelby-protocol/sdk@0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + version: 0.0.5(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@aptos-labs/wallet-adapter-react@7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.10)(@wallet-standard/core@1.1.1)(react@19.2.4))(@shelby-protocol/sdk@0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) '@shelby-protocol/sdk': specifier: latest version: 0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)) @@ -413,6 +413,55 @@ importers: specifier: ^3.2.4 version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + apps/upmint-shelby: + dependencies: + '@aptos-labs/ts-sdk': + specifier: ^5.2.1 + version: 5.2.1(got@11.8.6) + '@aptos-labs/wallet-adapter-react': + specifier: ^7.2.8 + version: 7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.14)(@wallet-standard/core@1.1.1)(react@19.2.4) + '@shelby-protocol/react': + specifier: ^1.0.0 + version: 1.0.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@aptos-labs/wallet-adapter-react@7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.14)(@wallet-standard/core@1.1.1)(react@19.2.4))(@shelby-protocol/sdk@0.1.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.21(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + '@shelby-protocol/sdk': + specifier: ^0.1.0 + version: 0.1.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)) + '@shelby-protocol/solana-kit': + specifier: ^0.2.1 + version: 0.2.2(@wallet-standard/core@1.1.1)(bs58@6.0.0)(got@11.8.6)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + '@solana/client': + specifier: ^1.7.0 + version: 1.7.0(@solana/sysvars@5.5.1(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4)) + '@solana/react-hooks': + specifier: ^1.4.1 + version: 1.4.1(@solana/sysvars@5.5.1(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4)) + '@tanstack/react-query': + specifier: ^5.90.21 + version: 5.90.21(react@19.2.4) + '@types/react': + specifier: ^19.2.13 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + buffer: + specifier: ^6.0.3 + version: 6.0.3 + react: + specifier: ^19.2.4 + version: 19.2.4 + react-dom: + specifier: ^19.2.4 + version: 19.2.4(react@19.2.4) + devDependencies: + typescript: + specifier: ~5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + packages/table-generator: dependencies: tsx: @@ -587,11 +636,21 @@ packages: resolution: {integrity: sha512-kazYjqfsPCBx2UJI+nYUOb6Ov7q7brSgYEfxp2sP27IeJWdDNa50lfs0WIpDJ92kQxdtlm9q3ZWw7Toh9f1gxQ==} engines: {node: '>=20.0.0'} + '@aptos-labs/wallet-adapter-core@7.10.2': + resolution: {integrity: sha512-8my6jCfjLT0HqShGbnKXnqoERA1dTYuiH4of5WHEGHsB5OxYI5o+NHnDyCf/LQGtsZ8tEGaU5pOE+kGgFnlV8g==} + peerDependencies: + '@aptos-labs/ts-sdk': ^5.1.1 + '@aptos-labs/wallet-adapter-core@8.2.0': resolution: {integrity: sha512-vN9CMMVSMT1b4pMKdwgvdc/CwYX8x91mxvhzmMfyhrPt6w4ydv/0Q/pj1fKcHPSlWtpWY48aphebBWSH3XGOow==} peerDependencies: '@aptos-labs/ts-sdk': ^5.1.1 + '@aptos-labs/wallet-adapter-react@7.2.8': + resolution: {integrity: sha512-WHPLvfvpXRBdjlnKY13fufy+oAov4J7PWIGlVD0XwgpMDWgi1WuMb8iYtGePcRqfDan5nvhALV04qRAsWwMGqQ==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + '@aptos-labs/wallet-adapter-react@8.2.0': resolution: {integrity: sha512-IWpdeOEZ88wHNW3vmZI9L60MQbaP0bifrUsdDKNQwR0ZbivBhyowEzayQCvlloftgYWyIq6qvr/SFIX/+wzbtw==} peerDependencies: @@ -2042,6 +2101,20 @@ packages: '@aptos-labs/wallet-adapter-react': optional: true + '@shelby-protocol/react@1.0.0': + resolution: {integrity: sha512-Tzzo2OZ5rPXeWRmObNDnrKDVghC7eoNXIkR/AOKKKeQE9fkVnKBJhC1TOmKZFaVZdBD+bFhrGNQUS/JZerqgsA==} + peerDependencies: + '@aptos-labs/ts-sdk': '>=5.0.0' + '@aptos-labs/wallet-adapter-react': ^6.0.0 || ^7.0.0 + '@shelby-protocol/sdk': 0.1.0 + '@tanstack/react-query': '>=5.0.0' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + typescript: '>=5.0.4' + peerDependenciesMeta: + '@aptos-labs/wallet-adapter-react': + optional: true + '@shelby-protocol/reed-solomon@0.0.1': resolution: {integrity: sha512-Li+7Uj2LLe247YppsZDbZdnyhxGAmTBOx14QPvLNJzeq1lCmjeV7X2BtRzlvyElsvymQQI/WWcKIHu21ysCR9g==} @@ -2050,6 +2123,16 @@ packages: peerDependencies: '@aptos-labs/ts-sdk': ^2.0.1 || ^3.0.0 || ^4.0.0 || ^5.0.0 + '@shelby-protocol/sdk@0.1.0': + resolution: {integrity: sha512-R0nLr6GWzqrEqYLpGUG143C62M2p9Psneo/lqcFgGmCu5Mi2dK9WJtioWJIwQaNIXKg4l26lHt8otq1Rpz9N5Q==} + peerDependencies: + '@aptos-labs/ts-sdk': ^2.0.1 || ^3.0.0 || ^4.0.0 || ^5.0.0 + + '@shelby-protocol/sdk@0.2.0': + resolution: {integrity: sha512-lGDkAoU5ayOSjXquPlilvQV2YkM81m1SYhntW90183J8rFNv6jxBBgeZF6oW6h5/KQiUeFSvwLWfqFLV2ox8Ag==} + peerDependencies: + '@aptos-labs/ts-sdk': ^2.0.1 || ^3.0.0 || ^4.0.0 || ^5.0.0 + '@shelby-protocol/solana-kit@0.2.0': resolution: {integrity: sha512-lKIBrVNZxeIod1RlG4VM+YcBbZIkIWLp9sBlae7H+EV7dzE/t5ECUuKb9MrH1a/S213rAnrV8OpxDazoYp39vw==} peerDependencies: @@ -2061,6 +2144,17 @@ packages: react-dom: optional: true + '@shelby-protocol/solana-kit@0.2.2': + resolution: {integrity: sha512-l2yTxBq87Un1x6pPfndtzBs3TWIpqvl3vf4l5knRpYtxifbkaBYAa4eNiio2cVo7Udt53lqxQfBLJUSMGjyeiw==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -2109,15 +2203,6 @@ packages: typescript: optional: true - '@solana/addresses@5.4.0': - resolution: {integrity: sha512-YRHiH30S8qDV4bZ+mtEk589PGfBuXHzD/fK2Z+YI5f/+s+yi/5le/fVw7PN6LxnnmVQKiRCDUiNF+WmFFKi6QQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/addresses@5.5.1': resolution: {integrity: sha512-5xoah3Q9G30HQghu/9BiHLb5pzlPKRC3zydQDmE3O9H//WfayxTFppsUDCL6FjYUHqj/wzK6CWHySglc2RkpdA==} engines: {node: '>=20.18.0'} @@ -2127,15 +2212,6 @@ packages: typescript: optional: true - '@solana/assertions@5.4.0': - resolution: {integrity: sha512-8EP7mkdnrPc9y67FqWeAPzdWq2qAOkxsuo+ZBIXNWtIixDtXIdHrgjZ/wqbWxLgSTtXEfBCjpZU55Xw2Qfbwyg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/assertions@5.5.1': resolution: {integrity: sha512-YTCSWAlGwSlVPnWtWLm3ukz81wH4j2YaCveK+TjpvUU88hTy6fmUqxi0+hvAMAe4zKXpJyj3Az7BrLJRxbIm4Q==} engines: {node: '>=20.18.0'} @@ -2294,15 +2370,6 @@ packages: typescript: optional: true - '@solana/fast-stable-stringify@5.4.0': - resolution: {integrity: sha512-KB7PUL7yalPvbWCezzyUDVRDp39eHLPH7OJ6S8VFT8YNIFUANwwj5ctui50Fim76kvSYDdYJOclXV45O2gfQ8Q==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/fast-stable-stringify@5.5.1': resolution: {integrity: sha512-Ni7s2FN33zTzhTFgRjEbOVFO+UAmK8qi3Iu0/GRFYK4jN696OjKHnboSQH/EacQ+yGqS54bfxf409wU5dsLLCw==} engines: {node: '>=20.18.0'} @@ -2312,15 +2379,6 @@ packages: typescript: optional: true - '@solana/functional@5.4.0': - resolution: {integrity: sha512-32ghHO0bg6GgX/7++0/7Lps6RgeXD2gKF1okiuyEGuVfKENIapgaQdcGhUwb3q6D6fv6MRAVn/Yve4jopGVNMQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/functional@5.5.1': resolution: {integrity: sha512-tTHoJcEQq3gQx5qsdsDJ0LEJeFzwNpXD80xApW9o/PPoCNimI3SALkZl+zNW8VnxRrV3l3yYvfHWBKe/X3WG3w==} engines: {node: '>=20.18.0'} @@ -2339,15 +2397,6 @@ packages: typescript: optional: true - '@solana/instructions@5.4.0': - resolution: {integrity: sha512-//a7jpHbNoAgTqy3YyqG1X6QhItJLKzJa6zuYJGCwaAAJye7BxS9pxJBgb2mUt7CGidhUksf+U8pmLlxCNWYyg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/instructions@5.5.1': resolution: {integrity: sha512-h0G1CG6S+gUUSt0eo6rOtsaXRBwCq1+Js2a+Ps9Bzk9q7YHNFA75/X0NWugWLgC92waRp66hrjMTiYYnLBoWOQ==} engines: {node: '>=20.18.0'} @@ -2357,15 +2406,6 @@ packages: typescript: optional: true - '@solana/keys@5.4.0': - resolution: {integrity: sha512-zQVbAwdoXorgXjlhlVTZaymFG6N8n1zn2NT+xI6S8HtbrKIB/42xPdXFh+zIihGzRw+9k8jzU7Axki/IPm6qWQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/keys@5.5.1': resolution: {integrity: sha512-KRD61cL7CRL+b4r/eB9dEoVxIf/2EJ1Pm1DmRYhtSUAJD2dJ5Xw8QFuehobOGm9URqQ7gaQl+Fkc1qvDlsWqKg==} engines: {node: '>=20.18.0'} @@ -2384,15 +2424,6 @@ packages: typescript: optional: true - '@solana/nominal-types@5.4.0': - resolution: {integrity: sha512-h4dTRQwTerzksE5B1WmObN6TvLo8dYUd7kpUUynGd8WJjK0zz3zkDhq0MkA3aF6A1C2C82BSGqSsN9EN0E6Exg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/nominal-types@5.5.1': resolution: {integrity: sha512-I1ImR+kfrLFxN5z22UDiTWLdRZeKtU0J/pkWkO8qm/8WxveiwdIv4hooi8pb6JnlR4mSrWhq0pCIOxDYrL9GIQ==} engines: {node: '>=20.18.0'} @@ -2402,15 +2433,6 @@ packages: typescript: optional: true - '@solana/offchain-messages@5.4.0': - resolution: {integrity: sha512-DjdlYJCcKfgh4dkdk+owH1bP+Q4BRqCs55mgWWp9PTwm/HHy/a5vcMtCi1GyIQXfhtNNvKBLbXrUE0Fxej8qlg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/offchain-messages@5.5.1': resolution: {integrity: sha512-g+xHH95prTU+KujtbOzj8wn+C7ZNoiLhf3hj6nYq3MTyxOXtBEysguc97jJveUZG0K97aIKG6xVUlMutg5yxhw==} engines: {node: '>=20.18.0'} @@ -2456,15 +2478,6 @@ packages: typescript: optional: true - '@solana/promises@5.4.0': - resolution: {integrity: sha512-23mfgNBbuP6Q+4vsixGy+GkyZ7wBLrxTBNXqrG/XWrJhjuuSkjEUGaK4Fx5o7LIrBi6KGqPknKxmTlvqnJhy2Q==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/promises@5.5.1': resolution: {integrity: sha512-T9lfuUYkGykJmppEcssNiCf6yiYQxJkhiLPP+pyAc2z84/7r3UVIb2tNJk4A9sucS66pzJnVHZKcZVGUUp6wzA==} engines: {node: '>=20.18.0'} @@ -2480,15 +2493,6 @@ packages: peerDependencies: react: '>=18' - '@solana/rpc-api@5.4.0': - resolution: {integrity: sha512-FJL6KaAsQ4DhfhLKKMcqbTpToNFwHlABCemIpOunE3OSqJFDrmc/NbsEaLIoeHyIg3d1Imo49GIUOn2TEouFUA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc-api@5.5.1': resolution: {integrity: sha512-XWOQQPhKl06Vj0xi3RYHAc6oEQd8B82okYJ04K7N0Vvy3J4PN2cxeK7klwkjgavdcN9EVkYCChm2ADAtnztKnA==} engines: {node: '>=20.18.0'} @@ -2498,15 +2502,6 @@ packages: typescript: optional: true - '@solana/rpc-parsed-types@5.4.0': - resolution: {integrity: sha512-IRQuSzx+Sj1A3XGiIzguNZlMjMMybXTTjV/RnTwBgnJQPd/H4us4pfPD94r+/yolWDVfGjJRm04hnKVMjJU8Rg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc-parsed-types@5.5.1': resolution: {integrity: sha512-HEi3G2nZqGEsa3vX6U0FrXLaqnUCg4SKIUrOe8CezD+cSFbRTOn3rCLrUmJrhVyXlHoQVaRO9mmeovk31jWxJg==} engines: {node: '>=20.18.0'} @@ -2516,15 +2511,6 @@ packages: typescript: optional: true - '@solana/rpc-spec-types@5.4.0': - resolution: {integrity: sha512-JU9hC5/iyJx30ym17gpoXDtT9rCbO6hLpB6UDhSFFoNeirxtTVb4OdnKtsjJDfXAiXsynJRsZRwfj3vGxRLgQw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc-spec-types@5.5.1': resolution: {integrity: sha512-6OFKtRpIEJQs8Jb2C4OO8KyP2h2Hy1MFhatMAoXA+0Ik8S3H+CicIuMZvGZ91mIu/tXicuOOsNNLu3HAkrakrw==} engines: {node: '>=20.18.0'} @@ -2534,15 +2520,6 @@ packages: typescript: optional: true - '@solana/rpc-spec@5.4.0': - resolution: {integrity: sha512-XMhxBb1GuZ3Kaeu5WNHB5KteCQ/aVuMByZmUKPqaanD+gs5MQZr0g62CvN7iwRlFU7GC18Q73ROWR3/JjzbXTA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc-spec@5.5.1': resolution: {integrity: sha512-m3LX2bChm3E3by4mQrH4YwCAFY57QBzuUSWqlUw7ChuZ+oLLOq7b2czi4i6L4Vna67j3eCmB3e+4tqy1j5wy7Q==} engines: {node: '>=20.18.0'} @@ -2552,15 +2529,6 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-api@5.4.0': - resolution: {integrity: sha512-euAFIG6ruEsqK+MsrL1tGSMbbOumm8UAyGzlD/kmXsAqqhcVsSeZdv5+BMIHIBsQ93GHcloA8UYw1BTPhpgl9w==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc-subscriptions-api@5.5.1': resolution: {integrity: sha512-5Oi7k+GdeS8xR2ly1iuSFkAv6CZqwG0Z6b1QZKbEgxadE1XGSDrhM2cn59l+bqCozUWCqh4c/A2znU/qQjROlw==} engines: {node: '>=20.18.0'} @@ -2570,15 +2538,6 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-channel-websocket@5.4.0': - resolution: {integrity: sha512-kWCmlW65MccxqXwKsIz+LkXUYQizgvBrrgYOkyclJHPa+zx4gqJjam87+wzvO9cfbDZRer3wtJBaRm61gTHNbw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc-subscriptions-channel-websocket@5.5.1': resolution: {integrity: sha512-7tGfBBrYY8TrngOyxSHoCU5shy86iA9SRMRrPSyBhEaZRAk6dnbdpmUTez7gtdVo0BCvh9nzQtUycKWSS7PnFQ==} engines: {node: '>=20.18.0'} @@ -2588,15 +2547,6 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-spec@5.4.0': - resolution: {integrity: sha512-ELaV9Z39GtKyUO0++he00ymWleb07QXYJhSfA0e1N5Q9hXu/Y366kgXHDcbZ/oUJkT3ylNgTupkrsdtiy8Ryow==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc-subscriptions-spec@5.5.1': resolution: {integrity: sha512-iq+rGq5fMKP3/mKHPNB6MC8IbVW41KGZg83Us/+LE3AWOTWV1WT20KT2iH1F1ik9roi42COv/TpoZZvhKj45XQ==} engines: {node: '>=20.18.0'} @@ -2606,15 +2556,6 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions@5.4.0': - resolution: {integrity: sha512-051t1CEjjAzM9ohjj2zb3ED70yeS3ZY8J5wSytL6tthTGImw/JB2a0D9DWMOKriFKt496n95IC+IdpJ35CpBWA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc-subscriptions@5.5.1': resolution: {integrity: sha512-CTMy5bt/6mDh4tc6vUJms9EcuZj3xvK0/xq8IQ90rhkpYvate91RjBP+egvjgSayUg9yucU9vNuUpEjz4spM7w==} engines: {node: '>=20.18.0'} @@ -2624,15 +2565,6 @@ packages: typescript: optional: true - '@solana/rpc-transformers@5.4.0': - resolution: {integrity: sha512-dZ8keYloLW+eRAwAPb471uWCFs58yHloLoI+QH0FulYpsSJ7F2BNWYcdnjSS/WiggsNcU6DhpWzYAzlEY66lGQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc-transformers@5.5.1': resolution: {integrity: sha512-OsWqLCQdcrRJKvHiMmwFhp9noNZ4FARuMkHT5us3ustDLXaxOjF0gfqZLnMkulSLcKt7TGXqMhBV+HCo7z5M8Q==} engines: {node: '>=20.18.0'} @@ -2642,15 +2574,6 @@ packages: typescript: optional: true - '@solana/rpc-transport-http@5.4.0': - resolution: {integrity: sha512-vidA+Qtqrnqp3QSVumWHdWJ/986yCr5+qX3fbc9KPm9Ofoto88OMWB/oLJvi2Tfges1UBu/jl+lJdsVckCM1bA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc-transport-http@5.5.1': resolution: {integrity: sha512-yv8GoVSHqEV0kUJEIhkdOVkR2SvJ6yoWC51cJn2rSV7plr6huLGe0JgujCmB7uZhhaLbcbP3zxXxu9sOjsi7Fg==} engines: {node: '>=20.18.0'} @@ -2660,15 +2583,6 @@ packages: typescript: optional: true - '@solana/rpc-types@5.4.0': - resolution: {integrity: sha512-+C4N4/5AYzBdt3Y2yzkScknScy/jTx6wfvuJIY9XjOXtdDyZ8TmrnMwdPMTZPGLdLuHplJwlwy1acu/4hqmrBQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc-types@5.5.1': resolution: {integrity: sha512-bibTFQ7PbHJJjGJPmfYC2I+/5CRFS4O2p9WwbFraX1Keeel+nRrt/NBXIy8veP5AEn2sVJIyJPpWBRpCx1oATA==} engines: {node: '>=20.18.0'} @@ -2678,15 +2592,6 @@ packages: typescript: optional: true - '@solana/rpc@5.4.0': - resolution: {integrity: sha512-S6GRG+usnubDs0JSpgc0ZWEh9IPL5KPWMuBoD8ggGVOIVWntp53FpvhYslNzbxWBXlTvJecr2todBipGVM/AqQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/rpc@5.5.1': resolution: {integrity: sha512-ku8zTUMrkCWci66PRIBC+1mXepEnZH/q1f3ck0kJZ95a06bOTl5KU7HeXWtskkyefzARJ5zvCs54AD5nxjQJ+A==} engines: {node: '>=20.18.0'} @@ -2696,15 +2601,6 @@ packages: typescript: optional: true - '@solana/signers@5.4.0': - resolution: {integrity: sha512-s+fZxpi6UPr6XNk2pH/R84WjNRoSktrgG8AGNfsj/V8MJ++eKX7hhIf4JsHZtnnQXXrHmS3ozB2oHlc8yEJvCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/signers@5.5.1': resolution: {integrity: sha512-FY0IVaBT2kCAze55vEieR6hag4coqcuJ31Aw3hqRH7mv6sV8oqwuJmUrx+uFwOp1gwd5OEAzlv6N4hOOple4sQ==} engines: {node: '>=20.18.0'} @@ -2714,15 +2610,6 @@ packages: typescript: optional: true - '@solana/subscribable@5.4.0': - resolution: {integrity: sha512-72LmfNX7UENgA24sn/xjlWpPAOsrxkWb9DQhuPZxly/gq8rl/rvr7Xu9qBkvFF2po9XpdUrKlccqY4awvfpltA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/subscribable@5.5.1': resolution: {integrity: sha512-9K0PsynFq0CsmK1CDi5Y2vUIJpCqkgSS5yfDN0eKPgHqEptLEaia09Kaxc90cSZDZU5mKY/zv1NBmB6Aro9zQQ==} engines: {node: '>=20.18.0'} @@ -2741,15 +2628,6 @@ packages: typescript: optional: true - '@solana/transaction-confirmation@5.4.0': - resolution: {integrity: sha512-EdSDgxs84/4gkjQw2r7N+Kgus8x9U+NFo0ufVG+48V8Hzy2t0rlBuXgIxwx0zZwUuTIgaKhpIutJgVncwZ5koA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/transaction-confirmation@5.5.1': resolution: {integrity: sha512-j4mKlYPHEyu+OD7MBt3jRoX4ScFgkhZC6H65on4Fux6LMScgivPJlwnKoZMnsgxFgWds0pl+BYzSiALDsXlYtw==} engines: {node: '>=20.18.0'} @@ -2759,15 +2637,6 @@ packages: typescript: optional: true - '@solana/transaction-messages@5.4.0': - resolution: {integrity: sha512-qd/3kZDaPiHM0amhn3vXnupfcsFTVz6CYuHXvq9HFv/fq32+5Kp1FMLnmHwoSxQxdTMDghPdOhC4vhNhuWmuVQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/transaction-messages@5.5.1': resolution: {integrity: sha512-aXyhMCEaAp3M/4fP0akwBBQkFPr4pfwoC5CLDq999r/FUwDax2RE/h4Ic7h2Xk+JdcUwsb+rLq85Y52hq84XvQ==} engines: {node: '>=20.18.0'} @@ -2777,15 +2646,6 @@ packages: typescript: optional: true - '@solana/transactions@5.4.0': - resolution: {integrity: sha512-OuY4M4x/xna8KZQIrz8tSrI9EEul9Od97XejqFmGGkEjbRsUOfJW8705TveTW8jU3bd5RGecFYscPgS2F+m7jQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@solana/transactions@5.5.1': resolution: {integrity: sha512-8hHtDxtqalZ157pnx6p8k10D7J/KY/biLzfgh9R09VNLLY3Fqi7kJvJCr7M2ik3oRll56pxhraAGCC9yIT6eOA==} engines: {node: '>=20.18.0'} @@ -2929,6 +2789,11 @@ packages: peerDependencies: react: ^18 || ^19 + '@tanstack/react-query@5.90.21': + resolution: {integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==} + peerDependencies: + react: ^18 || ^19 + '@telegram-apps/bridge@1.9.2': resolution: {integrity: sha512-SJLcNWLXhbbZr9MiqFH/g2ceuitSJKMxUIZysK4zUNyTUNuonrQG80Q/yrO+XiNbKUj8WdDNM86NBARhuyyinQ==} deprecated: This package is not supported anymore. Use @tma.js/bridge instead @@ -3020,6 +2885,9 @@ packages: '@types/react@19.2.10': resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==} + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -5357,9 +5225,6 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici-types@7.19.2: resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} @@ -5785,9 +5650,9 @@ snapshots: '@aptos-labs/derived-wallet-base': 0.10.1(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@wallet-standard/core@1.1.1) '@aptos-labs/ts-sdk': 5.2.1(got@11.8.6) '@aptos-labs/wallet-standard': 0.5.2(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@wallet-standard/core@1.1.1) - '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(typescript@5.9.3)) '@solana/wallet-standard-util': 1.1.2 - '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@6.0.0) + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(typescript@5.9.3))(bs58@6.0.0) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@wallet-standard/app': 1.1.0 transitivePeerDependencies: @@ -5803,9 +5668,9 @@ snapshots: '@aptos-labs/derived-wallet-base': 0.11.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@wallet-standard/core@1.1.1) '@aptos-labs/ts-sdk': 5.2.1(got@11.8.6) '@aptos-labs/wallet-standard': 0.5.2(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@wallet-standard/core@1.1.1) - '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(typescript@5.9.3)) '@solana/wallet-standard-util': 1.1.2 - '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@6.0.0) + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(typescript@5.9.3))(bs58@6.0.0) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@wallet-standard/app': 1.1.0 tweetnacl: 1.0.3 @@ -5838,7 +5703,7 @@ snapshots: transitivePeerDependencies: - got - '@aptos-labs/wallet-adapter-core@8.2.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@wallet-standard/core@1.1.1)': + '@aptos-labs/wallet-adapter-core@7.10.2(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@wallet-standard/core@1.1.1)': dependencies: '@aptos-connect/wallet-adapter-plugin': 3.0.2(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@wallet-standard/core@1.1.1) '@aptos-labs/ts-sdk': 5.2.1(got@11.8.6) @@ -5851,13 +5716,51 @@ snapshots: - '@wallet-standard/core' - debug - '@aptos-labs/wallet-adapter-react@8.2.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@18.3.27)(@wallet-standard/core@1.1.1)(react@19.2.4)': + '@aptos-labs/wallet-adapter-core@8.2.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@wallet-standard/core@1.1.1)': dependencies: - '@aptos-labs/wallet-adapter-core': 8.2.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@wallet-standard/core@1.1.1) - '@radix-ui/react-slot': 1.2.4(@types/react@18.3.27)(react@19.2.4) - react: 19.2.4 + '@aptos-connect/wallet-adapter-plugin': 3.0.2(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@wallet-standard/core@1.1.1) + '@aptos-labs/ts-sdk': 5.2.1(got@11.8.6) + '@aptos-labs/wallet-standard': 0.5.2(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@wallet-standard/core@1.1.1) + buffer: 6.0.3 + eventemitter3: 4.0.7 + tweetnacl: 1.0.3 transitivePeerDependencies: - - '@aptos-labs/ts-sdk' + - '@telegram-apps/bridge' + - '@wallet-standard/core' + - debug + + '@aptos-labs/wallet-adapter-react@7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.10)(@wallet-standard/core@1.1.1)(react@19.2.4)': + dependencies: + '@aptos-labs/wallet-adapter-core': 7.10.2(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@wallet-standard/core@1.1.1) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + transitivePeerDependencies: + - '@aptos-labs/ts-sdk' + - '@telegram-apps/bridge' + - '@types/react' + - '@wallet-standard/core' + - debug + optional: true + + '@aptos-labs/wallet-adapter-react@7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.14)(@wallet-standard/core@1.1.1)(react@19.2.4)': + dependencies: + '@aptos-labs/wallet-adapter-core': 7.10.2(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@wallet-standard/core@1.1.1) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + transitivePeerDependencies: + - '@aptos-labs/ts-sdk' + - '@telegram-apps/bridge' + - '@types/react' + - '@wallet-standard/core' + - debug + + '@aptos-labs/wallet-adapter-react@8.2.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@18.3.27)(@wallet-standard/core@1.1.1)(react@19.2.4)': + dependencies: + '@aptos-labs/wallet-adapter-core': 8.2.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@wallet-standard/core@1.1.1) + '@radix-ui/react-slot': 1.2.4(@types/react@18.3.27)(react@19.2.4) + react: 19.2.4 + transitivePeerDependencies: + - '@aptos-labs/ts-sdk' - '@telegram-apps/bridge' - '@types/react' - '@wallet-standard/core' @@ -6785,6 +6688,12 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-context@1.1.2(@types/react@18.3.27)(react@19.2.4)': dependencies: react: 19.2.4 @@ -7007,6 +6916,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 + '@radix-ui/react-slot@1.2.4(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-tabs@1.1.13(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -7217,7 +7133,7 @@ snapshots: - utf-8-validate - zod - '@shelby-protocol/react@0.0.4(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@shelby-protocol/sdk@0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)': + '@shelby-protocol/react@0.0.4(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@aptos-labs/wallet-adapter-react@7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.10)(@wallet-standard/core@1.1.1)(react@19.2.4))(@shelby-protocol/sdk@0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)': dependencies: '@aptos-labs/ts-sdk': 5.2.1(got@11.8.6) '@shelby-protocol/sdk': 0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)) @@ -7226,8 +7142,10 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) typescript: 5.9.3 + optionalDependencies: + '@aptos-labs/wallet-adapter-react': 7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.10)(@wallet-standard/core@1.1.1)(react@19.2.4) - '@shelby-protocol/react@0.0.5(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@shelby-protocol/sdk@0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)': + '@shelby-protocol/react@0.0.5(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@aptos-labs/wallet-adapter-react@7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.10)(@wallet-standard/core@1.1.1)(react@19.2.4))(@shelby-protocol/sdk@0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)': dependencies: '@aptos-labs/ts-sdk': 5.2.1(got@11.8.6) '@shelby-protocol/sdk': 0.0.9(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)) @@ -7236,6 +7154,20 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) typescript: 5.9.3 + optionalDependencies: + '@aptos-labs/wallet-adapter-react': 7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.10)(@wallet-standard/core@1.1.1)(react@19.2.4) + + '@shelby-protocol/react@1.0.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@aptos-labs/wallet-adapter-react@7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.14)(@wallet-standard/core@1.1.1)(react@19.2.4))(@shelby-protocol/sdk@0.1.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)))(@tanstack/react-query@5.90.21(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)': + dependencies: + '@aptos-labs/ts-sdk': 5.2.1(got@11.8.6) + '@shelby-protocol/sdk': 0.1.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)) + '@tanstack/react-query': 5.90.21(react@19.2.4) + p-limit: 7.2.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + typescript: 5.9.3 + optionalDependencies: + '@aptos-labs/wallet-adapter-react': 7.2.8(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@telegram-apps/bridge@1.9.2)(@types/react@19.2.14)(@wallet-standard/core@1.1.1)(react@19.2.4) '@shelby-protocol/reed-solomon@0.0.1': {} @@ -7250,6 +7182,28 @@ snapshots: p-limit: 7.1.1 zod: 3.25.76 + '@shelby-protocol/sdk@0.1.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))': + dependencies: + '@aptos-labs/ts-sdk': 5.2.1(got@11.8.6) + '@shelby-protocol/clay-codes': 0.0.2 + '@shelby-protocol/reed-solomon': 0.0.1 + graphql: 16.12.0 + graphql-request: 7.4.0(graphql@16.12.0) + graphql-tag: 2.12.6(graphql@16.12.0) + p-limit: 7.1.1 + zod: 3.25.76 + + '@shelby-protocol/sdk@0.2.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))': + dependencies: + '@aptos-labs/ts-sdk': 5.2.1(got@11.8.6) + '@shelby-protocol/clay-codes': 0.0.2 + '@shelby-protocol/reed-solomon': 0.0.1 + graphql: 16.12.0 + graphql-request: 7.4.0(graphql@16.12.0) + graphql-tag: 2.12.6(graphql@16.12.0) + p-limit: 7.1.1 + zod: 3.25.76 + '@shelby-protocol/solana-kit@0.2.0(@wallet-standard/core@1.1.1)(bs58@6.0.0)(bufferutil@4.1.0)(got@11.8.6)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: '@aptos-labs/derived-wallet-solana': 0.12.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@wallet-standard/core@1.1.1)(bs58@6.0.0)(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -7271,32 +7225,53 @@ snapshots: - typescript - utf-8-validate + '@shelby-protocol/solana-kit@0.2.2(@wallet-standard/core@1.1.1)(bs58@6.0.0)(got@11.8.6)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)': + dependencies: + '@aptos-labs/derived-wallet-solana': 0.12.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@wallet-standard/core@1.1.1)(bs58@6.0.0)(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@aptos-labs/gas-station-client': 2.0.3(got@11.8.6) + '@aptos-labs/ts-sdk': 5.2.1(got@11.8.6) + '@aptos-labs/wallet-standard': 0.5.2(@aptos-labs/ts-sdk@5.2.1(got@11.8.6))(@wallet-standard/core@1.1.1) + '@shelby-protocol/sdk': 0.2.0(@aptos-labs/ts-sdk@5.2.1(got@11.8.6)) + '@solana/wallet-standard-features': 1.3.0 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + transitivePeerDependencies: + - '@wallet-standard/core' + - bs58 + - bufferutil + - encoding + - got + - typescript + - utf-8-validate + '@sindresorhus/is@4.6.0': {} '@socket.io/component-emitter@3.1.2': {} - '@solana-program/address-lookup-table@0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/address-lookup-table@0.10.0(@solana/kit@5.5.1(typescript@5.9.3))': dependencies: '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana-program/compute-budget@0.11.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/compute-budget@0.11.0(@solana/kit@5.5.1(typescript@5.9.3))': dependencies: '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana-program/stake@0.5.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/stake@0.5.0(@solana/kit@5.5.1(typescript@5.9.3))': dependencies: '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana-program/system@0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/system@0.10.0(@solana/kit@5.5.1(typescript@5.9.3))': dependencies: '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana-program/token-2022@0.7.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@5.5.1(typescript@5.9.3))': + '@solana-program/token-2022@0.7.0(@solana/kit@5.5.1(typescript@5.9.3))(@solana/sysvars@5.5.1(typescript@5.9.3))': dependencies: '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/sysvars': 5.5.1(typescript@5.9.3) - '@solana-program/token@0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/token@0.9.0(@solana/kit@5.5.1(typescript@5.9.3))': dependencies: '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -7313,18 +7288,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/addresses@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/assertions': 5.4.0(typescript@5.9.3) - '@solana/codecs-core': 5.4.0(typescript@5.9.3) - '@solana/codecs-strings': 5.4.0(typescript@5.9.3) - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/nominal-types': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/addresses@5.5.1(typescript@5.9.3)': dependencies: '@solana/assertions': 5.5.1(typescript@5.9.3) @@ -7337,12 +7300,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/assertions@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - '@solana/assertions@5.5.1(typescript@5.9.3)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) @@ -7355,16 +7312,16 @@ snapshots: '@solana/client@1.7.0(@solana/sysvars@5.5.1(typescript@5.9.3))(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)': dependencies: - '@solana-program/address-lookup-table': 0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana-program/compute-budget': 0.11.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana-program/stake': 0.5.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana-program/system': 0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana-program/token': 0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana-program/token-2022': 0.7.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@5.5.1(typescript@5.9.3)) - '@solana/codecs-strings': 5.4.0(typescript@5.9.3) + '@solana-program/address-lookup-table': 0.10.0(@solana/kit@5.5.1(typescript@5.9.3)) + '@solana-program/compute-budget': 0.11.0(@solana/kit@5.5.1(typescript@5.9.3)) + '@solana-program/stake': 0.5.0(@solana/kit@5.5.1(typescript@5.9.3)) + '@solana-program/system': 0.10.0(@solana/kit@5.5.1(typescript@5.9.3)) + '@solana-program/token': 0.9.0(@solana/kit@5.5.1(typescript@5.9.3)) + '@solana-program/token-2022': 0.7.0(@solana/kit@5.5.1(typescript@5.9.3))(@solana/sysvars@5.5.1(typescript@5.9.3)) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/transaction-confirmation': 5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/transactions': 5.4.0(typescript@5.9.3) + '@solana/transaction-confirmation': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/transactions': 5.5.1(typescript@5.9.3) '@solana/wallet-standard-features': 1.3.0 '@wallet-standard/app': 1.1.0 '@wallet-standard/base': 1.1.0 @@ -7383,6 +7340,36 @@ snapshots: - use-sync-external-store - utf-8-validate + '@solana/client@1.7.0(@solana/sysvars@5.5.1(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))': + dependencies: + '@solana-program/address-lookup-table': 0.10.0(@solana/kit@5.5.1(typescript@5.9.3)) + '@solana-program/compute-budget': 0.11.0(@solana/kit@5.5.1(typescript@5.9.3)) + '@solana-program/stake': 0.5.0(@solana/kit@5.5.1(typescript@5.9.3)) + '@solana-program/system': 0.10.0(@solana/kit@5.5.1(typescript@5.9.3)) + '@solana-program/token': 0.9.0(@solana/kit@5.5.1(typescript@5.9.3)) + '@solana-program/token-2022': 0.7.0(@solana/kit@5.5.1(typescript@5.9.3))(@solana/sysvars@5.5.1(typescript@5.9.3)) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/transaction-confirmation': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/transactions': 5.5.1(typescript@5.9.3) + '@solana/wallet-standard-features': 1.3.0 + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/errors': 0.1.1 + '@wallet-standard/features': 1.1.0 + bs58: 6.0.0 + typescript: 5.9.3 + zustand: 5.0.10(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) + transitivePeerDependencies: + - '@solana/sysvars' + - '@types/react' + - bufferutil + - fastestsmallesttextencoderdecoder + - immer + - react + - use-sync-external-store + - utf-8-validate + '@solana/codecs-core@2.3.0(typescript@5.9.3)': dependencies: '@solana/errors': 2.3.0(typescript@5.9.3) @@ -7496,18 +7483,10 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/fast-stable-stringify@5.4.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - '@solana/fast-stable-stringify@5.5.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/functional@5.4.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - '@solana/functional@5.5.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -7525,13 +7504,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/instructions@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 5.4.0(typescript@5.9.3) - '@solana/errors': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - '@solana/instructions@5.5.1(typescript@5.9.3)': dependencies: '@solana/codecs-core': 5.5.1(typescript@5.9.3) @@ -7539,18 +7511,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/keys@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/assertions': 5.4.0(typescript@5.9.3) - '@solana/codecs-core': 5.4.0(typescript@5.9.3) - '@solana/codecs-strings': 5.4.0(typescript@5.9.3) - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/nominal-types': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/keys@5.5.1(typescript@5.9.3)': dependencies: '@solana/assertions': 5.5.1(typescript@5.9.3) @@ -7594,29 +7554,10 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/nominal-types@5.4.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - '@solana/nominal-types@5.5.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/offchain-messages@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 5.4.0(typescript@5.9.3) - '@solana/codecs-core': 5.4.0(typescript@5.9.3) - '@solana/codecs-data-structures': 5.4.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) - '@solana/codecs-strings': 5.4.0(typescript@5.9.3) - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/keys': 5.4.0(typescript@5.9.3) - '@solana/nominal-types': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/offchain-messages@5.5.1(typescript@5.9.3)': dependencies: '@solana/addresses': 5.5.1(typescript@5.9.3) @@ -7669,26 +7610,22 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/promises@5.4.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - '@solana/promises@5.5.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 '@solana/react-hooks@1.4.1(@solana/sysvars@5.5.1(typescript@5.9.3))(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)': dependencies: - '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/addresses': 5.5.1(typescript@5.9.3) '@solana/client': 1.7.0(@solana/sysvars@5.5.1(typescript@5.9.3))(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10) - '@solana/codecs-core': 5.4.0(typescript@5.9.3) - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/keys': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(typescript@5.9.3) '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/promises': 5.4.0(typescript@5.9.3) - '@solana/signers': 5.4.0(typescript@5.9.3) - '@solana/transaction-messages': 5.4.0(typescript@5.9.3) - '@solana/transactions': 5.4.0(typescript@5.9.3) + '@solana/promises': 5.5.1(typescript@5.9.3) + '@solana/signers': 5.5.1(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(typescript@5.9.3) + '@solana/transactions': 5.5.1(typescript@5.9.3) react: 19.2.4 swr: 2.3.8(react@19.2.4) zustand: 5.0.10(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) @@ -7703,23 +7640,31 @@ snapshots: - use-sync-external-store - utf-8-validate - '@solana/rpc-api@5.4.0(typescript@5.9.3)': + '@solana/react-hooks@1.4.1(@solana/sysvars@5.5.1(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))': dependencies: - '@solana/addresses': 5.4.0(typescript@5.9.3) - '@solana/codecs-core': 5.4.0(typescript@5.9.3) - '@solana/codecs-strings': 5.4.0(typescript@5.9.3) - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/keys': 5.4.0(typescript@5.9.3) - '@solana/rpc-parsed-types': 5.4.0(typescript@5.9.3) - '@solana/rpc-spec': 5.4.0(typescript@5.9.3) - '@solana/rpc-transformers': 5.4.0(typescript@5.9.3) - '@solana/rpc-types': 5.4.0(typescript@5.9.3) - '@solana/transaction-messages': 5.4.0(typescript@5.9.3) - '@solana/transactions': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/client': 1.7.0(@solana/sysvars@5.5.1(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4)) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(typescript@5.9.3) + '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/promises': 5.5.1(typescript@5.9.3) + '@solana/signers': 5.5.1(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(typescript@5.9.3) + '@solana/transactions': 5.5.1(typescript@5.9.3) + react: 19.2.4 + swr: 2.3.8(react@19.2.4) + zustand: 5.0.10(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) transitivePeerDependencies: + - '@solana/connector' + - '@solana/sysvars' + - '@types/react' + - bufferutil - fastestsmallesttextencoderdecoder + - immer + - typescript + - use-sync-external-store + - utf-8-validate '@solana/rpc-api@5.5.1(typescript@5.9.3)': dependencies: @@ -7739,29 +7684,14 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-parsed-types@5.4.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - '@solana/rpc-parsed-types@5.5.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/rpc-spec-types@5.4.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - '@solana/rpc-spec-types@5.5.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/rpc-spec@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - '@solana/rpc-spec@5.5.1(typescript@5.9.3)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) @@ -7769,20 +7699,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-subscriptions-api@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 5.4.0(typescript@5.9.3) - '@solana/keys': 5.4.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 5.4.0(typescript@5.9.3) - '@solana/rpc-transformers': 5.4.0(typescript@5.9.3) - '@solana/rpc-types': 5.4.0(typescript@5.9.3) - '@solana/transaction-messages': 5.4.0(typescript@5.9.3) - '@solana/transactions': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/rpc-subscriptions-api@5.5.1(typescript@5.9.3)': dependencies: '@solana/addresses': 5.5.1(typescript@5.9.3) @@ -7797,19 +7713,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-subscriptions-channel-websocket@5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/functional': 5.4.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 5.4.0(typescript@5.9.3) - '@solana/subscribable': 5.4.0(typescript@5.9.3) - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@solana/rpc-subscriptions-channel-websocket@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) @@ -7823,15 +7726,6 @@ snapshots: - bufferutil - utf-8-validate - '@solana/rpc-subscriptions-spec@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/promises': 5.4.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) - '@solana/subscribable': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - '@solana/rpc-subscriptions-spec@5.5.1(typescript@5.9.3)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) @@ -7841,26 +7735,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-subscriptions@5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 5.4.0(typescript@5.9.3) - '@solana/functional': 5.4.0(typescript@5.9.3) - '@solana/promises': 5.4.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) - '@solana/rpc-subscriptions-api': 5.4.0(typescript@5.9.3) - '@solana/rpc-subscriptions-channel-websocket': 5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-subscriptions-spec': 5.4.0(typescript@5.9.3) - '@solana/rpc-transformers': 5.4.0(typescript@5.9.3) - '@solana/rpc-types': 5.4.0(typescript@5.9.3) - '@solana/subscribable': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - bufferutil - - fastestsmallesttextencoderdecoder - - utf-8-validate - '@solana/rpc-subscriptions@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) @@ -7881,18 +7755,6 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/rpc-transformers@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/functional': 5.4.0(typescript@5.9.3) - '@solana/nominal-types': 5.4.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) - '@solana/rpc-types': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/rpc-transformers@5.5.1(typescript@5.9.3)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) @@ -7905,15 +7767,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-transport-http@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/rpc-spec': 5.4.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) - undici-types: 7.18.2 - optionalDependencies: - typescript: 5.9.3 - '@solana/rpc-transport-http@5.5.1(typescript@5.9.3)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) @@ -7923,19 +7776,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-types@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 5.4.0(typescript@5.9.3) - '@solana/codecs-core': 5.4.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) - '@solana/codecs-strings': 5.4.0(typescript@5.9.3) - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/nominal-types': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/rpc-types@5.5.1(typescript@5.9.3)': dependencies: '@solana/addresses': 5.5.1(typescript@5.9.3) @@ -7949,22 +7789,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 5.4.0(typescript@5.9.3) - '@solana/functional': 5.4.0(typescript@5.9.3) - '@solana/rpc-api': 5.4.0(typescript@5.9.3) - '@solana/rpc-spec': 5.4.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) - '@solana/rpc-transformers': 5.4.0(typescript@5.9.3) - '@solana/rpc-transport-http': 5.4.0(typescript@5.9.3) - '@solana/rpc-types': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/rpc@5.5.1(typescript@5.9.3)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) @@ -7981,22 +7805,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/signers@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 5.4.0(typescript@5.9.3) - '@solana/codecs-core': 5.4.0(typescript@5.9.3) - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/instructions': 5.4.0(typescript@5.9.3) - '@solana/keys': 5.4.0(typescript@5.9.3) - '@solana/nominal-types': 5.4.0(typescript@5.9.3) - '@solana/offchain-messages': 5.4.0(typescript@5.9.3) - '@solana/transaction-messages': 5.4.0(typescript@5.9.3) - '@solana/transactions': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/signers@5.5.1(typescript@5.9.3)': dependencies: '@solana/addresses': 5.5.1(typescript@5.9.3) @@ -8013,12 +7821,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/subscribable@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - '@solana/subscribable@5.5.1(typescript@5.9.3)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) @@ -8036,25 +7838,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transaction-confirmation@5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/addresses': 5.4.0(typescript@5.9.3) - '@solana/codecs-strings': 5.4.0(typescript@5.9.3) - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/keys': 5.4.0(typescript@5.9.3) - '@solana/promises': 5.4.0(typescript@5.9.3) - '@solana/rpc': 5.4.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-types': 5.4.0(typescript@5.9.3) - '@solana/transaction-messages': 5.4.0(typescript@5.9.3) - '@solana/transactions': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - bufferutil - - fastestsmallesttextencoderdecoder - - utf-8-validate - '@solana/transaction-confirmation@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: '@solana/addresses': 5.5.1(typescript@5.9.3) @@ -8074,22 +7857,6 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/transaction-messages@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 5.4.0(typescript@5.9.3) - '@solana/codecs-core': 5.4.0(typescript@5.9.3) - '@solana/codecs-data-structures': 5.4.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/functional': 5.4.0(typescript@5.9.3) - '@solana/instructions': 5.4.0(typescript@5.9.3) - '@solana/nominal-types': 5.4.0(typescript@5.9.3) - '@solana/rpc-types': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/transaction-messages@5.5.1(typescript@5.9.3)': dependencies: '@solana/addresses': 5.5.1(typescript@5.9.3) @@ -8106,25 +7873,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transactions@5.4.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 5.4.0(typescript@5.9.3) - '@solana/codecs-core': 5.4.0(typescript@5.9.3) - '@solana/codecs-data-structures': 5.4.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) - '@solana/codecs-strings': 5.4.0(typescript@5.9.3) - '@solana/errors': 5.4.0(typescript@5.9.3) - '@solana/functional': 5.4.0(typescript@5.9.3) - '@solana/instructions': 5.4.0(typescript@5.9.3) - '@solana/keys': 5.4.0(typescript@5.9.3) - '@solana/nominal-types': 5.4.0(typescript@5.9.3) - '@solana/rpc-types': 5.4.0(typescript@5.9.3) - '@solana/transaction-messages': 5.4.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/transactions@5.5.1(typescript@5.9.3)': dependencies: '@solana/addresses': 5.5.1(typescript@5.9.3) @@ -8144,7 +7892,7 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(typescript@5.9.3))': dependencies: '@solana/wallet-standard-features': 1.3.0 '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -8167,9 +7915,9 @@ snapshots: '@solana/wallet-standard-chains': 1.1.1 '@solana/wallet-standard-features': 1.3.0 - '@solana/wallet-standard-wallet-adapter-base@1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@6.0.0)': + '@solana/wallet-standard-wallet-adapter-base@1.1.4(@solana/web3.js@1.98.4(typescript@5.9.3))(bs58@6.0.0)': dependencies: - '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(typescript@5.9.3)) '@solana/wallet-standard-chains': 1.1.1 '@solana/wallet-standard-features': 1.3.0 '@solana/wallet-standard-util': 1.1.2 @@ -8291,6 +8039,11 @@ snapshots: '@tanstack/query-core': 5.90.20 react: 19.2.4 + '@tanstack/react-query@5.90.21(react@19.2.4)': + dependencies: + '@tanstack/query-core': 5.90.20 + react: 19.2.4 + '@telegram-apps/bridge@1.9.2': dependencies: '@telegram-apps/signals': 1.1.2 @@ -8383,6 +8136,10 @@ snapshots: dependencies: '@types/react': 19.2.10 + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + '@types/react@18.3.27': dependencies: '@types/prop-types': 15.7.15 @@ -8392,6 +8149,10 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + '@types/responselike@1.0.3': dependencies: '@types/node': 22.19.7 @@ -9960,7 +9721,7 @@ snapshots: isexe@2.0.0: {} - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + isomorphic-ws@4.0.1(ws@7.5.10): dependencies: ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -9986,7 +9747,7 @@ snapshots: delay: 5.0.0 es6-promisify: 5.0.0 eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + isomorphic-ws: 4.0.1(ws@7.5.10) json-stringify-safe: 5.0.1 stream-json: 1.9.1 uuid: 8.3.2 @@ -11035,8 +10796,6 @@ snapshots: undici-types@7.16.0: {} - undici-types@7.18.2: {} - undici-types@7.19.2: {} unrs-resolver@1.11.1: @@ -11377,3 +11136,9 @@ snapshots: '@types/react': 19.2.10 react: 19.2.4 use-sync-external-store: 1.6.0(react@19.2.4) + + zustand@5.0.10(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.14 + react: 19.2.4 + use-sync-external-store: 1.6.0(react@19.2.4) From 482d929b0daea4619dfbe338514dfdbd03a8235e Mon Sep 17 00:00:00 2001 From: xLaRc Date: Sat, 14 Feb 2026 01:54:12 +0300 Subject: [PATCH 2/7] fix: Biome lint and format issues in upmint-shelby --- apps/upmint-shelby/package.json | 5 +- apps/upmint-shelby/src/main.tsx | 44 +- apps/upmint-shelby/src/shelby-app.tsx | 585 ++++++++++++++++---------- apps/upmint-shelby/src/style.css | 22 +- apps/upmint-shelby/vite.config.ts | 23 +- 5 files changed, 411 insertions(+), 268 deletions(-) diff --git a/apps/upmint-shelby/package.json b/apps/upmint-shelby/package.json index 75d4d28..06bc2f1 100644 --- a/apps/upmint-shelby/package.json +++ b/apps/upmint-shelby/package.json @@ -6,9 +6,12 @@ "scripts": { "dev": "vite", "build": "tsc && vite build", - "preview": "vite preview" + "preview": "vite preview", + "lint": "biome check .", + "fmt": "biome check . --write" }, "devDependencies": { + "@biomejs/biome": "2.2.4", "typescript": "~5.9.3", "vite": "^7.3.1" }, diff --git a/apps/upmint-shelby/src/main.tsx b/apps/upmint-shelby/src/main.tsx index c2b499a..6eaa5cd 100644 --- a/apps/upmint-shelby/src/main.tsx +++ b/apps/upmint-shelby/src/main.tsx @@ -1,28 +1,33 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import { ShelbyClientProvider } from '@shelby-protocol/react' -import { ShelbyClient } from '@shelby-protocol/sdk/browser' -import { Network } from '@aptos-labs/ts-sdk' -import { AptosWalletAdapterProvider } from '@aptos-labs/wallet-adapter-react' -import { Buffer } from 'buffer' -import './style.css' -import { App } from './shelby-app' +import { Network } from "@aptos-labs/ts-sdk"; +import { AptosWalletAdapterProvider } from "@aptos-labs/wallet-adapter-react"; +import { ShelbyClientProvider } from "@shelby-protocol/react"; +import { ShelbyClient } from "@shelby-protocol/sdk/browser"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { Buffer } from "buffer"; +import React from "react"; +import ReactDOM from "react-dom/client"; +import "./style.css"; +import { App } from "./shelby-app"; -;(window as any).Buffer = (window as any).Buffer || Buffer +declare global { + interface Window { + Buffer?: typeof Buffer; + } +} +window.Buffer = window.Buffer ?? Buffer; -const queryClient = new QueryClient() -const isDev = typeof window !== 'undefined' && import.meta.env.DEV -const origin = typeof window !== 'undefined' ? window.location.origin : '' -const shelbyRpcBase = isDev ? `${origin}/shelby-rpc` : undefined -const aptosFullnode = isDev ? `${origin}/shelby-aptos` : undefined +const queryClient = new QueryClient(); +const isDev = typeof window !== "undefined" && import.meta.env.DEV; +const origin = typeof window !== "undefined" ? window.location.origin : ""; +const shelbyRpcBase = isDev ? `${origin}/shelby-rpc` : undefined; +const aptosFullnode = isDev ? `${origin}/shelby-aptos` : undefined; const shelbyClient = new ShelbyClient({ network: Network.SHELBYNET, ...(shelbyRpcBase && { rpc: { baseUrl: shelbyRpcBase } }), ...(aptosFullnode && { aptos: { fullnode: aptosFullnode } }), -}) +}); -ReactDOM.createRoot(document.getElementById('app') as HTMLElement).render( +ReactDOM.createRoot(document.getElementById("app") as HTMLElement).render( @@ -32,5 +37,4 @@ ReactDOM.createRoot(document.getElementById('app') as HTMLElement).render( , -) - +); diff --git a/apps/upmint-shelby/src/shelby-app.tsx b/apps/upmint-shelby/src/shelby-app.tsx index a9d53a1..54fc72b 100644 --- a/apps/upmint-shelby/src/shelby-app.tsx +++ b/apps/upmint-shelby/src/shelby-app.tsx @@ -1,114 +1,148 @@ -import React, { useEffect, useState } from 'react' -import { useWallet } from '@aptos-labs/wallet-adapter-react' -import { useShelbyClient } from '@shelby-protocol/react' +import { + AccountAddress, + Aptos, + AptosConfig, + Network, +} from "@aptos-labs/ts-sdk"; +import { useWallet } from "@aptos-labs/wallet-adapter-react"; +import { useShelbyClient } from "@shelby-protocol/react"; import { createDefaultErasureCodingProvider, DEFAULT_CHUNKSET_SIZE_BYTES, expectedTotalChunksets, generateCommitments, ShelbyBlobClient, -} from '@shelby-protocol/sdk/browser' -import { AccountAddress, Aptos, AptosConfig, Network } from '@aptos-labs/ts-sdk' +} from "@shelby-protocol/sdk/browser"; +import type React from "react"; +import { useEffect, useId, useState } from "react"; + +type DigitalAssetItem = { + token_data_id: string; + current_token_data?: { + token_name?: string | null; + token_uri?: string | null; + current_collection?: { collection_name?: string | null }; + }; +}; -const SHELBY_BLOB_API_BASE = 'https://api.shelbynet.shelby.xyz/shelby/v1/blobs' -const SHELBY_EXPLORER_BASE = 'https://explorer.shelby.xyz/shelbynet/blobs' +const SHELBY_BLOB_API_BASE = "https://api.shelbynet.shelby.xyz/shelby/v1/blobs"; +const SHELBY_EXPLORER_BASE = "https://explorer.shelby.xyz/shelbynet/blobs"; const EXPLORER_TXN = (hash: string) => - `https://explorer.aptoslabs.com/txn/${hash}?network=shelbynet` + `https://explorer.aptoslabs.com/txn/${hash}?network=shelbynet`; const EXPLORER_ACCOUNT_NFTS = (addr: string) => - `https://explorer.aptoslabs.com/account/${addr}/nfts?network=shelbynet` + `https://explorer.aptoslabs.com/account/${addr}/nfts?network=shelbynet`; const EXPLORER_OBJECT = (addr: string) => - `https://explorer.aptoslabs.com/object/${addr}?network=shelbynet` + `https://explorer.aptoslabs.com/object/${addr}?network=shelbynet`; type UploadedItem = { - id: string - name: string - blobName: string - storageOwner: string - previewDataUrl?: string - mimeType: string - uploadTxHash?: string - uploadedAt: string -} + id: string; + name: string; + blobName: string; + storageOwner: string; + previewDataUrl?: string; + mimeType: string; + uploadTxHash?: string; + uploadedAt: string; +}; export const App: React.FC = () => { - const [uploads, setUploads] = useState([]) - const [isUploading, setIsUploading] = useState(false) - const [uploadError, setUploadError] = useState(null) - const [uploadSuccessTx, setUploadSuccessTx] = useState(null) - const [mintingId, setMintingId] = useState(null) - const [mintError, setMintError] = useState(null) - const [lastMintTxHash, setLastMintTxHash] = useState(null) - const [collectionName, setCollectionName] = useState('') - const [creatingCollection, setCreatingCollection] = useState(false) - const [collectionCreateTx, setCollectionCreateTx] = useState(null) - const [myNfts, setMyNfts] = useState>([]) - const [nftsLoading, setNftsLoading] = useState(false) + const collectionNameId = useId(); + const [uploads, setUploads] = useState([]); + const [isUploading, setIsUploading] = useState(false); + const [uploadError, setUploadError] = useState(null); + const [uploadSuccessTx, setUploadSuccessTx] = useState(null); + const [mintingId, setMintingId] = useState(null); + const [mintError, setMintError] = useState(null); + const [lastMintTxHash, setLastMintTxHash] = useState(null); + const [collectionName, setCollectionName] = useState(""); + const [creatingCollection, setCreatingCollection] = useState(false); + const [collectionCreateTx, setCollectionCreateTx] = useState( + null, + ); + const [myNfts, setMyNfts] = useState< + Array<{ + token_data_id: string; + token_name?: string | null; + token_uri?: string | null; + collection_name?: string | null; + }> + >([]); + const [nftsLoading, setNftsLoading] = useState(false); - const { account, connect, disconnect, connected, wallets, network, signAndSubmitTransaction } = - useWallet() - const shelbyClient = useShelbyClient() - const walletConnected = connected && account?.address + const { + account, + connect, + disconnect, + connected, + wallets, + network, + signAndSubmitTransaction, + } = useWallet(); + const shelbyClient = useShelbyClient(); + const walletConnected = connected && account?.address; useEffect(() => { - if (!connected || !network) return - const info = network as any - const name = String(info?.name ?? '').toLowerCase() - if (name === 'mainnet' || name === 'testnet') { - alert(`Switch your wallet to ShelbyNet for Shelby.\nCurrent: ${name}`) + if (!connected || !network) return; + const info = network as { name?: string }; + const name = String(info?.name ?? "").toLowerCase(); + if (name === "mainnet" || name === "testnet") { + alert(`Switch your wallet to ShelbyNet for Shelby.\nCurrent: ${name}`); } - }, [connected, network]) + }, [connected, network]); + // biome-ignore lint/correctness/useExhaustiveDependencies: lastMintTxHash triggers refetch after mint useEffect(() => { if (!walletConnected || !account?.address) { - setMyNfts([]) - return + setMyNfts([]); + return; } - setNftsLoading(true) - const aptos = new Aptos(new AptosConfig({ network: Network.SHELBYNET })) + setNftsLoading(true); + const aptos = new Aptos(new AptosConfig({ network: Network.SHELBYNET })); aptos - .getOwnedDigitalAssets({ ownerAddress: String(account.address), options: { limit: 100 } }) + .getOwnedDigitalAssets({ + ownerAddress: String(account.address), + options: { limit: 100 }, + }) .then((list) => { setMyNfts( - list.map((o: any) => ({ + (list as DigitalAssetItem[]).map((o) => ({ token_data_id: o.token_data_id, token_name: o.current_token_data?.token_name, token_uri: o.current_token_data?.token_uri, - collection_name: o.current_token_data?.current_collection?.collection_name, - })) - ) + collection_name: + o.current_token_data?.current_collection?.collection_name, + })), + ); }) .catch(() => setMyNfts([])) - .finally(() => setNftsLoading(false)) - }, [walletConnected, account?.address, lastMintTxHash]) + .finally(() => setNftsLoading(false)); + }, [walletConnected, account?.address, lastMintTxHash]); const handleUpload = async (e: React.ChangeEvent) => { - const files = e.target.files - if (!files?.length || !walletConnected) return + const files = e.target.files; + if (!files?.length || !walletConnected || !account?.address) return; - setUploadError(null) - setUploadSuccessTx(null) - setIsUploading(true) - const accountAddress = String(account!.address) + setUploadError(null); + setUploadSuccessTx(null); + setIsUploading(true); + const accountAddress = String(account.address); try { for (let i = 0; i < files.length; i++) { - const file = files[i] - const ext = file.name.split('.').pop() || 'bin' - const baseName = file.name.replace(/\.[^/.]+$/, '').replace(/\s+/g, '_') || 'file' - const blobName = `${baseName}_${Date.now()}_${i}.${ext}` - const data = new Uint8Array(await file.arrayBuffer()) - const expirationMicros = Date.now() * 1000 + 365 * 24 * 60 * 60 * 1_000_000 - const blobs = [{ blobName, blobData: data }] + const file = files[i]; + const ext = file.name.split(".").pop() || "bin"; + const baseName = + file.name.replace(/\.[^/.]+$/, "").replace(/\s+/g, "_") || "file"; + const blobName = `${baseName}_${Date.now()}_${i}.${ext}`; + const data = new Uint8Array(await file.arrayBuffer()); + const expirationMicros = + Date.now() * 1000 + 365 * 24 * 60 * 60 * 1_000_000; + const blobs = [{ blobName, blobData: data }]; - const provider = await createDefaultErasureCodingProvider() + const provider = await createDefaultErasureCodingProvider(); const commitments = await Promise.all( blobs.map((b) => generateCommitments(provider, b.blobData)), - ) + ); const pending = await signAndSubmitTransaction({ data: ShelbyBlobClient.createBatchRegisterBlobsPayload({ @@ -118,17 +152,20 @@ export const App: React.FC = () => { blobName: blob.blobName, blobSize: blob.blobData.length, blobMerkleRoot: commitments[idx].blob_merkle_root, - numChunksets: expectedTotalChunksets(blob.blobData.length, DEFAULT_CHUNKSET_SIZE_BYTES), + numChunksets: expectedTotalChunksets( + blob.blobData.length, + DEFAULT_CHUNKSET_SIZE_BYTES, + ), })), }), - }) + }); try { await shelbyClient.coordination.aptos.waitForTransaction({ transactionHash: pending.hash, - }) + }); } catch (waitErr) { - console.warn('waitForTransaction:', waitErr) + console.warn("waitForTransaction:", waitErr); } for (const blob of blobs) { @@ -136,17 +173,17 @@ export const App: React.FC = () => { account: accountAddress, blobName: blob.blobName, blobData: blob.blobData, - }) + }); } - let previewDataUrl: string | undefined - if (file.type.startsWith('image/')) { + let previewDataUrl: string | undefined; + if (file.type.startsWith("image/")) { previewDataUrl = await new Promise((res, rej) => { - const r = new FileReader() - r.onload = () => res(r.result as string) - r.onerror = rej - r.readAsDataURL(file) - }) + const r = new FileReader(); + r.onload = () => res(r.result as string); + r.onerror = rej; + r.readAsDataURL(file); + }); } const item: UploadedItem = { @@ -158,112 +195,135 @@ export const App: React.FC = () => { mimeType: file.type, uploadTxHash: pending.hash, uploadedAt: new Date().toISOString(), - } - setUploads((prev) => [item, ...prev]) - setUploadSuccessTx(pending.hash) + }; + setUploads((prev) => [item, ...prev]); + setUploadSuccessTx(pending.hash); } - } catch (err: any) { - console.error(err) - setUploadError(err?.message || 'Upload error') + } catch (err: unknown) { + console.error(err); + const msg = err instanceof Error ? err.message : "Upload error"; + setUploadError(msg); } finally { - setIsUploading(false) - e.target.value = '' + setIsUploading(false); + e.target.value = ""; } - } + }; const handleCreateCollection = async () => { - const collName = collectionName.trim() - if (!collName || !walletConnected || !signAndSubmitTransaction) return - setMintError(null) - setCreatingCollection(true) + const collName = collectionName.trim(); + if (!collName || !walletConnected || !signAndSubmitTransaction) return; + setMintError(null); + setCreatingCollection(true); try { - const imageUri = 'https://shelby.xyz' + const imageUri = "https://shelby.xyz"; const createRes = await signAndSubmitTransaction({ data: { - function: '0x4::aptos_token::create_collection', + function: "0x4::aptos_token::create_collection", functionArguments: [ `${collName} - NFT collection stored on the Shelby network`, - '999999', + "999999", collName, imageUri, - true, true, true, true, true, true, true, true, true, - '0', '1', + true, + true, + true, + true, + true, + true, + true, + true, + true, + "0", + "1", ], }, - }) + }); await shelbyClient.coordination.aptos .waitForTransaction({ transactionHash: createRes.hash }) - .catch(() => {}) - setMintError(null) - setCollectionCreateTx(createRes.hash) - } catch (err: any) { - const raw = err?.message ?? err?.reason ?? err?.error ?? '' - const msg = String(raw).toLowerCase() + .catch(() => {}); + setMintError(null); + setCollectionCreateTx(createRes.hash); + } catch (err: unknown) { + const raw = + err instanceof Error + ? err.message + : typeof err === "object" && err !== null && "message" in err + ? String((err as { message?: string }).message) + : ""; + const msg = String(raw).toLowerCase(); const alreadyExists = - msg.includes('collection_already_exists') || - msg.includes('object already exists') || - msg.includes('already exists at') + msg.includes("collection_already_exists") || + msg.includes("object already exists") || + msg.includes("already exists at"); if (alreadyExists) { - setMintError(null) + setMintError(null); } else { - setMintError(err?.message || 'Collection creation error') + setMintError( + err instanceof Error ? err.message : "Collection creation error", + ); } } finally { - setCreatingCollection(false) + setCreatingCollection(false); } - } + }; const handleMint = async (item: UploadedItem) => { - if (!walletConnected || !signAndSubmitTransaction) return - if (!item.mimeType.startsWith('image/')) { - setMintError('Image file required for NFT minting.') - return + if (!walletConnected || !signAndSubmitTransaction) return; + if (!item.mimeType.startsWith("image/")) { + setMintError("Image file required for NFT minting."); + return; } - const collName = collectionName.trim() + const collName = collectionName.trim(); if (!collName) { - setMintError('Enter collection name first for NFT minting.') - return + setMintError("Enter collection name first for NFT minting."); + return; } - setMintError(null) - setLastMintTxHash(null) - setMintingId(item.id) + setMintError(null); + setLastMintTxHash(null); + setMintingId(item.id); try { - const imageUri = `${SHELBY_BLOB_API_BASE}/${item.storageOwner}/${encodeURIComponent(item.blobName)}` - const tokenName = item.blobName.replace(/\.[^/.]+$/, '') + const imageUri = `${SHELBY_BLOB_API_BASE}/${item.storageOwner}/${encodeURIComponent(item.blobName)}`; + const tokenName = item.blobName.replace(/\.[^/.]+$/, ""); const mintTxn = await signAndSubmitTransaction({ data: { - function: '0x4::aptos_token::mint', + function: "0x4::aptos_token::mint", functionArguments: [ collName, `${collName}: ${item.name}`, tokenName, imageUri, - [], [], [], + [], + [], + [], ], }, - }) + }); - setLastMintTxHash(mintTxn.hash) - setUploads((prev) => prev.filter((u) => u.id !== item.id)) - } catch (err: any) { - console.error(err) - const msg = String(err?.message || '').toLowerCase() - const noCollection = msg.includes('object does not exist') || msg.includes('not found') || msg.includes('collection') + setLastMintTxHash(mintTxn.hash); + setUploads((prev) => prev.filter((u) => u.id !== item.id)); + } catch (err: unknown) { + console.error(err); + const errMsg = err instanceof Error ? err.message : ""; + const msg = String(errMsg).toLowerCase(); + const noCollection = + msg.includes("object does not exist") || + msg.includes("not found") || + msg.includes("collection"); setMintError( noCollection ? 'Collection not found. Click "Create Collection" first.' - : err?.message || 'Mint error' - ) + : errMsg || "Mint error", + ); } finally { - setMintingId(null) + setMintingId(null); } - } + }; const shelbyExplorerUrl = (item: UploadedItem) => - `${SHELBY_EXPLORER_BASE}/${item.storageOwner}?blobName=${encodeURIComponent(item.blobName)}` + `${SHELBY_EXPLORER_BASE}/${item.storageOwner}?blobName=${encodeURIComponent(item.blobName)}`; return (
@@ -281,7 +341,9 @@ export const App: React.FC = () => { onClick={() => disconnect()} title="Disconnect" > - {String(account!.address).slice(0, 6)}...{String(account!.address).slice(-4)} + {account + ? `${String(account.address).slice(0, 6)}...${String(account.address).slice(-4)}` + : ""}
)} @@ -293,26 +355,31 @@ export const App: React.FC = () => {

Upload to Shelby

To get started, connect to ShelbyNet with your Petra wallet.

- {wallets.some((w) => w.name === 'Petra') ? ( + {wallets.some((w) => w.name === "Petra") ? ( ) : ( -

Petra wallet not found. Install the browser extension.

+

+ Petra wallet not found. Install the browser extension. +

)}
) : ( <>

Upload to Shelby

-

Select files to upload to the Shelby network. They will appear in Uploads and you can mint as NFT if you wish.

+

+ Select files to upload to the Shelby network. They will appear + in Uploads and you can mint as NFT if you wish. +

{uploadError &&

{uploadError}

} {uploadSuccessTx && (

- Upload successful.{' '} + Upload successful.{" "} {

No uploads yet. Upload from above.

) : ( <> -
- +
+ setCollectionName(e.target.value)} className="form-row input" style={{ - padding: '0.6rem 0.8rem', - borderRadius: '0.6rem', - border: '1px solid rgba(148, 163, 184, 0.3)', - background: 'rgba(15, 12, 22, 0.6)', - color: '#e8e6ed', - fontSize: '0.95rem', - maxWidth: '320px', + padding: "0.6rem 0.8rem", + borderRadius: "0.6rem", + border: "1px solid rgba(148, 163, 184, 0.3)", + background: "rgba(15, 12, 22, 0.6)", + color: "#e8e6ed", + fontSize: "0.95rem", + maxWidth: "320px", }} /> -

- First click the button above to create the collection, then mint each image. Collection details may appear empty in Petra; you can view your NFTs on{' '} +

+ First click the button above to create the collection, + then mint each image. Collection details may appear empty + in Petra; you can view your NFTs on{" "} Aptos Explorer .

-
- {uploads.map((item) => ( -
-
- {item.previewDataUrl ? ( - {item.name} - ) : ( -
📄 {item.name}
- )} -
-
- {item.name} - - Shelby Explorer → - - {item.uploadTxHash && ( +
+ {uploads.map((item) => ( +
+
+ {item.previewDataUrl ? ( + {item.name} + ) : ( +
+ 📄 {item.name} +
+ )} +
+ + + {!item.mimeType.startsWith("image/") && ( + + Only images can be minted as NFT + )}
- - {!item.mimeType.startsWith('image/') && ( - Only images can be minted as NFT - )} -
- ))} -
+ ))} +
)}

My NFTs

-

- Your minted NFTs. If they appear empty in Petra, view them here or on{' '} +

+ Your minted NFTs. If they appear empty in Petra, view them here + or on{" "} {

No minted NFTs yet.

) : ( (() => { - const byCollection = myNfts.reduce>((acc, nft) => { - const key = nft.collection_name?.trim() || '(No collection)' - if (!acc[key]) acc[key] = [] - acc[key].push(nft) - return acc - }, {}) - const sortedCollections = Object.keys(byCollection).sort() + const byCollection = myNfts.reduce< + Record + >((acc, nft) => { + const key = + nft.collection_name?.trim() || "(No collection)"; + if (!acc[key]) acc[key] = []; + acc[key].push(nft); + return acc; + }, {}); + const sortedCollections = Object.keys(byCollection).sort(); return ( -
@@ -508,9 +626,14 @@ export const App: React.FC = () => {
{mintError &&

{mintError}

} {collectionCreateTx && ( -

- Collection created.{' '} - +

+ Collection created.{" "} + View on Explorer →

@@ -526,10 +649,18 @@ export const App: React.FC = () => { > View mint transaction on Explorer → -

- Collection content may appear empty when clicked in Petra. View your NFTs on{' '} +

+ Collection content may appear empty when clicked in Petra. + View your NFTs on{" "} { )} - ) -} + ); +}; diff --git a/apps/upmint-shelby/src/style.css b/apps/upmint-shelby/src/style.css index e44feed..de3a471 100644 --- a/apps/upmint-shelby/src/style.css +++ b/apps/upmint-shelby/src/style.css @@ -1,5 +1,5 @@ :root { - font-family: 'DM Sans', system-ui, -apple-system, sans-serif; + font-family: "DM Sans", system-ui, -apple-system, sans-serif; line-height: 1.5; font-weight: 400; color: #0f172a; @@ -125,7 +125,9 @@ a { color: white; cursor: pointer; font-weight: 500; - transition: transform 0.15s, box-shadow 0.2s; + transition: + transform 0.15s, + box-shadow 0.2s; } .cta-button:hover { @@ -153,8 +155,8 @@ a { letter-spacing: 0.05em; } -.form-row input[type='text'], -.form-row input[type='number'] { +.form-row input[type="text"], +.form-row input[type="number"] { padding: 0.6rem 0.8rem; border-radius: 0.6rem; border: 1px solid rgba(148, 163, 184, 0.3); @@ -178,10 +180,10 @@ a { align-items: center; gap: 0.5rem; cursor: pointer; - text-transform: none !important; + text-transform: none; } -.checkbox-label input[type='checkbox'] { +.checkbox-label input[type="checkbox"] { width: 1.1rem; height: 1.1rem; accent-color: #8b5cf6; @@ -197,7 +199,9 @@ a { border-radius: 1rem; background: rgba(139, 92, 246, 0.05); cursor: pointer; - transition: border-color 0.2s, background 0.2s; + transition: + border-color 0.2s, + background 0.2s; } .upload-zone:hover { @@ -282,7 +286,9 @@ a { font-size: 0.9rem; font-weight: 500; cursor: pointer; - transition: transform 0.15s, opacity 0.15s; + transition: + transform 0.15s, + opacity 0.15s; } .nft-mint-btn:hover:not(:disabled) { diff --git a/apps/upmint-shelby/vite.config.ts b/apps/upmint-shelby/vite.config.ts index 4388f59..7bbe4f2 100644 --- a/apps/upmint-shelby/vite.config.ts +++ b/apps/upmint-shelby/vite.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from 'vite' +import { defineConfig } from "vite"; // Proxy Shelby indexer/RPC requests via Vite dev server to bypass // browser CORS. The browser talks to localhost:5173, Vite forwards to Shelby. @@ -6,26 +6,25 @@ import { defineConfig } from 'vite' export default defineConfig({ server: { proxy: { - '/shelby-indexer': { + "/shelby-indexer": { target: - 'https://api.shelbynet.aptoslabs.com/nocode/v1/public/cmforrguw0042s601fn71f9l2/v1/graphql', + "https://api.shelbynet.aptoslabs.com/nocode/v1/public/cmforrguw0042s601fn71f9l2/v1/graphql", changeOrigin: true, secure: true, - rewrite: () => '', + rewrite: () => "", }, - '/shelby-rpc': { - target: 'https://api.shelbynet.shelby.xyz', + "/shelby-rpc": { + target: "https://api.shelbynet.shelby.xyz", changeOrigin: true, secure: true, - rewrite: (path) => path.replace(/^\/shelby-rpc/, '/shelby'), + rewrite: (path) => path.replace(/^\/shelby-rpc/, "/shelby"), }, - '/shelby-aptos': { - target: 'https://api.shelbynet.shelby.xyz', + "/shelby-aptos": { + target: "https://api.shelbynet.shelby.xyz", changeOrigin: true, secure: true, - rewrite: (path) => path.replace(/^\/shelby-aptos/, '/v1'), + rewrite: (path) => path.replace(/^\/shelby-aptos/, "/v1"), }, }, }, -}) - +}); From 1ab13517e3b2085e3c82ca89e04b94c6f5e330fd Mon Sep 17 00:00:00 2001 From: xLaRc Date: Sat, 14 Feb 2026 02:01:49 +0300 Subject: [PATCH 3/7] fix: narrow mint error matching to avoid hiding real failures --- apps/upmint-shelby/src/shelby-app.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/upmint-shelby/src/shelby-app.tsx b/apps/upmint-shelby/src/shelby-app.tsx index 54fc72b..28be629 100644 --- a/apps/upmint-shelby/src/shelby-app.tsx +++ b/apps/upmint-shelby/src/shelby-app.tsx @@ -308,10 +308,11 @@ export const App: React.FC = () => { console.error(err); const errMsg = err instanceof Error ? err.message : ""; const msg = String(errMsg).toLowerCase(); + // Only treat as missing-collection when Aptos reports the collection object is missing const noCollection = msg.includes("object does not exist") || - msg.includes("not found") || - msg.includes("collection"); + msg.includes("collection_does_not_exist") || + /collection.*(?:does not exist|not found)/.test(msg); setMintError( noCollection ? 'Collection not found. Click "Create Collection" first.' From b76885fcb59f0bbedf3169ff4c2f63cea72c7dd9 Mon Sep 17 00:00:00 2001 From: xLaRc Date: Sat, 14 Feb 2026 02:09:28 +0300 Subject: [PATCH 4/7] fix: show feedback when collection already exists --- apps/upmint-shelby/src/shelby-app.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/upmint-shelby/src/shelby-app.tsx b/apps/upmint-shelby/src/shelby-app.tsx index 28be629..f9043a0 100644 --- a/apps/upmint-shelby/src/shelby-app.tsx +++ b/apps/upmint-shelby/src/shelby-app.tsx @@ -59,6 +59,7 @@ export const App: React.FC = () => { const [collectionCreateTx, setCollectionCreateTx] = useState( null, ); + const [collectionAlreadyExists, setCollectionAlreadyExists] = useState(false); const [myNfts, setMyNfts] = useState< Array<{ token_data_id: string; @@ -213,6 +214,7 @@ export const App: React.FC = () => { const collName = collectionName.trim(); if (!collName || !walletConnected || !signAndSubmitTransaction) return; setMintError(null); + setCollectionAlreadyExists(false); setCreatingCollection(true); try { const imageUri = "https://shelby.xyz"; @@ -242,6 +244,7 @@ export const App: React.FC = () => { .waitForTransaction({ transactionHash: createRes.hash }) .catch(() => {}); setMintError(null); + setCollectionAlreadyExists(false); setCollectionCreateTx(createRes.hash); } catch (err: unknown) { const raw = @@ -257,6 +260,7 @@ export const App: React.FC = () => { msg.includes("already exists at"); if (alreadyExists) { setMintError(null); + setCollectionAlreadyExists(true); } else { setMintError( err instanceof Error ? err.message : "Collection creation error", @@ -623,9 +627,17 @@ export const App: React.FC = () => { )}

- {(mintError || lastMintTxHash || collectionCreateTx) && ( + {(mintError || + lastMintTxHash || + collectionCreateTx || + collectionAlreadyExists) && (
{mintError &&

{mintError}

} + {collectionAlreadyExists && ( +

+ Collection already exists. You can mint NFTs now. +

+ )} {collectionCreateTx && (

Collection created.{" "} From a6ac572772e8a6f588e51622f75b219ff388d1b3 Mon Sep 17 00:00:00 2001 From: xLaRc Date: Sat, 14 Feb 2026 02:57:20 +0300 Subject: [PATCH 5/7] fix: clear stale collectionCreateTx when collection already exists --- apps/upmint-shelby/src/shelby-app.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/upmint-shelby/src/shelby-app.tsx b/apps/upmint-shelby/src/shelby-app.tsx index f9043a0..2440a33 100644 --- a/apps/upmint-shelby/src/shelby-app.tsx +++ b/apps/upmint-shelby/src/shelby-app.tsx @@ -260,6 +260,7 @@ export const App: React.FC = () => { msg.includes("already exists at"); if (alreadyExists) { setMintError(null); + setCollectionCreateTx(null); // clear stale "Collection created" from previous run setCollectionAlreadyExists(true); } else { setMintError( From 0bad28d34f09c89257250186bb9f80fd3d77358b Mon Sep 17 00:00:00 2001 From: xLaRc Date: Sat, 14 Feb 2026 03:06:43 +0300 Subject: [PATCH 6/7] fix: wait for mint tx confirmation before removing item and refetching NFTs --- apps/upmint-shelby/src/shelby-app.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/upmint-shelby/src/shelby-app.tsx b/apps/upmint-shelby/src/shelby-app.tsx index 2440a33..395d84c 100644 --- a/apps/upmint-shelby/src/shelby-app.tsx +++ b/apps/upmint-shelby/src/shelby-app.tsx @@ -307,6 +307,10 @@ export const App: React.FC = () => { }, }); + await shelbyClient.coordination.aptos.waitForTransaction({ + transactionHash: mintTxn.hash, + }); + setLastMintTxHash(mintTxn.hash); setUploads((prev) => prev.filter((u) => u.id !== item.id)); } catch (err: unknown) { From de27df5090e25e1fb89ca9baaedac1758abd9d8c Mon Sep 17 00:00:00 2001 From: xLaRc Date: Sat, 14 Feb 2026 03:17:18 +0300 Subject: [PATCH 7/7] fix: add missing tsconfig.json for upmint-shelby build --- apps/upmint-shelby/tsconfig.json | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 apps/upmint-shelby/tsconfig.json diff --git a/apps/upmint-shelby/tsconfig.json b/apps/upmint-shelby/tsconfig.json new file mode 100644 index 0000000..e259262 --- /dev/null +++ b/apps/upmint-shelby/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "types": ["vite/client"] + }, + "include": ["src"] +}