apply new ghost-connect features into lite version

Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
This commit is contained in:
Uncle Fatso 2026-10-08 18:54:16 +03:00
parent a4203934d7
commit 3d15aff0ef
Signed by: f4ts0
GPG Key ID: 565F4F2860226EBB
8 changed files with 28 additions and 74 deletions

View File

@ -1,6 +1,6 @@
{
"name": "ghost-lite",
"version": "0.3.0",
"version": "0.4.0",
"description": "Web application for Ghost and Casper chain.",
"author": "Uncle f4ts0 <f4ts0@ghostchain.io>",
"maintainers": [

View File

@ -18,7 +18,7 @@ import {
const chainData = [
{
label: "CASPER",
value: "0x475e48fab52f3d0587b6b03101d224560c549e984d1dee197b7d8b55830e7da3",
value: "0xcaf9c5ddccc7ba6f96149a6b8a81c26a3641742795cd5e7e0aee79bf3f4e77b7",
chainSpec: casperDevelopment,
}
]

View File

@ -11,14 +11,14 @@ export const chainSpec: string = `{
"chainType": "Live",
"forkBlocks": null,
"genesis": {
"stateRootHash": "0xfcb09113f5c18bb681bd0376bdb01a1d672030cf021ff24f017f9c90d6340669"
"stateRootHash": "0xb4784a3c8f2f29ba3f191d563f1166f08f4e0337e114679c0f24ef77d06e10e4"
},
"id": "casper_staging_testnet",
"lightSyncState": {
"babeEpochChanges": "0x0486e94817613148af08d25b61d10de83b314aad94478565e9d5070ad5bf1384de181c00000164dc951100000000c4e59511000000000468c4943cf7c7ced2abbe900614a80a5e8a3029eca80186350ff93745379523007825000001c4e595110000000024ef951100000000047460d5a9745e7ac79c62165f29bfc35ca816684a91e0afe30464781ec663ffd3d82e00000124ef95110000000084f895110000000000000c68c4943cf7c7ced2abbe900614a80a5e8a3029eca80186350ff937453795230078250000010500000000000000c4e5951100000000600900000000000010daaaaab6a6e574099e24ae9bb75b543610edef9d374fa85a378edb573b47615f010000000000000074fa7381a7a74b316afb6793a00387eed9d95d46a69866cbb316b5d9c918af0e01000000000000006c4dd88b43e2011cf9a6a73d53446336ac9e04cdd4ca23587df63187ac455e4901000000000000003c944c704cae203619b9e7a5a4b6742736da6a8e76c762291bebdc7652cfec2f01000000000000000e662d4ad2b3bf5eb96ec0fade8662d2225d4717319580d1c4eb932e8bce917d01000000000000000400000000000000027460d5a9745e7ac79c62165f29bfc35ca816684a91e0afe30464781ec663ffd3d82e000001060000000000000024ef951100000000600900000000000028426ab855ba3d0eaade067c62f197989e13c28641948d018d657c13c139da9e450100000000000000daaaaab6a6e574099e24ae9bb75b543610edef9d374fa85a378edb573b47615f010000000000000074fa7381a7a74b316afb6793a00387eed9d95d46a69866cbb316b5d9c918af0e0100000000000000dee45a9f88b2829e831f26908a7769db5fd38e7c0fc0cfec3fd83cede451fc120100000000000000c66631a4b6220beb0ad83498ddd36b2cb53fc0e345edd50e6d40dcfc74cc6b7b01000000000000006c4dd88b43e2011cf9a6a73d53446336ac9e04cdd4ca23587df63187ac455e4901000000000000003c944c704cae203619b9e7a5a4b6742736da6a8e76c762291bebdc7652cfec2f01000000000000002c4d7c0e011f53f81f31a071f3d4c42f1e85ad60e50918bc841a5001b9763f4f01000000000000003a9afa87f78c79af14753c30851f66414604987dc5ba85dd568403e0963c927d01000000000000001e06092d5210b61cadd1118e3142ecafc4d53de4267c1d7ad8205d50e64c5d4601000000000000003584ab6c4870be3cb13b2b69b7569fd593d8354b202917d61a6f139f70187b24010000000000000004000000000000000286e94817613148af08d25b61d10de83b314aad94478565e9d5070ad5bf1384de181c000001040000000000000064dc951100000000600900000000000010daaaaab6a6e574099e24ae9bb75b543610edef9d374fa85a378edb573b47615f010000000000000074fa7381a7a74b316afb6793a00387eed9d95d46a69866cbb316b5d9c918af0e01000000000000006c4dd88b43e2011cf9a6a73d53446336ac9e04cdd4ca23587df63187ac455e4901000000000000003c944c704cae203619b9e7a5a4b6742736da6a8e76c762291bebdc7652cfec2f010000000000000005cfbdbd5ccbf25f2bc82b8488ef493b8ee1205d2d1e0b2a52689d8ed252c1470100000000000000040000000000000002",
"babeFinalizedBlockWeight": 3115,
"finalizedBlockHeader": "0x40ab762007d6e2d1dddb18a10073e637712b425bac09fe2d87e50373afa1fcb111bd1cd1b45c2547cc5123ca78564a1fe0bcaced95cf3e0c7cf305b7cb443e2c037d6a40040ac0406b97a19a74625c9a717e9a0a922e41d733a88e8ce860fce8e278080642414245b501030100000030e69511000000006279297ea7ba3278c5a8fcbd16a7fd02d14fa771983443ff8d1fc4d536c8684a00ac542d13f1b03c54f5c4e51f473d326bad1feae09b95a632aa87da9c491c0cae7d5981d364a093b341db9a0028af5540957f6a01b952d3c0ef18b52c2f490d054241424501016e1a35643f1fe6e1f08e8ef0b2165368d2ae2a576a0bb10584c58a27005e2c5b5ef4d86c1f2dd98ac498c8cb3b314def9e72aaaf1b446c36f345339091a76487",
"grandpaAuthoritySet": "0x1055446f9a7aa99ced06b317c80ce90d56b84e56526775683af2525969e8da0b640100000000000000236d2fa03f4ed8cb65de7e514d7540159b328f1c170dd402b094ad7fbf54721801000000000000008f9ea20bf4a807a8e710f7559dece86e94672b5b361de157bdaa5c1f37849f8d01000000000000000aa3a88f6b777c95c3dfe7e997b76798413f16aa325f34824cae0c9102b281d5010000000000000000000000000000000001442f00000000"
"babeEpochChanges": "0x042c315b655c7144df4bfdc41837eeacb84d80aee06eaba51f6941a0c7a26cb1bf5d090000015e9de408000000000ea2e40800000000049b2e88b8ce43a677c1ca90f62134800b7e510c0c353dad719cad82faf6136cfb0d0e0000010ea2e40800000000bea6e408000000000000082c315b655c7144df4bfdc41837eeacb84d80aee06eaba51f6941a0c7a26cb1bf5d0900000103000000000000005e9de40800000000b00400000000000014daaaaab6a6e574099e24ae9bb75b543610edef9d374fa85a378edb573b47615f010000000000000074fa7381a7a74b316afb6793a00387eed9d95d46a69866cbb316b5d9c918af0e0100000000000000e0f0a776ecc9fa5e1f22e2fa001fe3fba5aea52b9444bc894b45589d4213247501000000000000006c4dd88b43e2011cf9a6a73d53446336ac9e04cdd4ca23587df63187ac455e4901000000000000003c944c704cae203619b9e7a5a4b6742736da6a8e76c762291bebdc7652cfec2f01000000000000002ff7c765405e9c11a59525a08173bb1fa59e5e281090f8e4d1824469f513d0cc01000000000000000400000000000000029b2e88b8ce43a677c1ca90f62134800b7e510c0c353dad719cad82faf6136cfb0d0e00000104000000000000000ea2e40800000000b00400000000000014daaaaab6a6e574099e24ae9bb75b543610edef9d374fa85a378edb573b47615f010000000000000074fa7381a7a74b316afb6793a00387eed9d95d46a69866cbb316b5d9c918af0e0100000000000000e0f0a776ecc9fa5e1f22e2fa001fe3fba5aea52b9444bc894b45589d4213247501000000000000006c4dd88b43e2011cf9a6a73d53446336ac9e04cdd4ca23587df63187ac455e4901000000000000003c944c704cae203619b9e7a5a4b6742736da6a8e76c762291bebdc7652cfec2f0100000000000000dea465ff8bf16938cc9ead89bf9fdb5d9c495fad61fd952b2067ebdc51c4e1c10100000000000000040000000000000002",
"babeFinalizedBlockWeight": 1039,
"finalizedBlockHeader": "0x6ed6c2debc2e5fd4e7db0d14426d1b904e6c101f2c62a71b8e891c217ba79079f9433280c0257a860f793833bd6bed6b9f86094400aa8e5ea24a81752f0f046ff5ed560f7231760c622ae35d3968fbab033ed34d950b57a7937ae45c411d1d384748080642414245b50103000000004fa0e40800000000a2c7d71b4e1f94c0208c9730ab93955b08c8d7ac86d2fc6ec5f62cc3272a5f1ec0e28c798461372109ee3e12f03ff66ea5ad9cac5b1c37d7280d2333d0226f0865ea77a801bad79785a8ca83c87f0dbf1e36936a6f65cd7b125a41c52f38f80105424142450101caaa6fe5f9df57930e2ac08aef43b75d5477d410c73c3a8e6dea9d5503b9fd25eae1d12b6604194389e22f3f4265d581eb162d1dc5a9034247fe33765dddbe8c",
"grandpaAuthoritySet": "0x1455446f9a7aa99ced06b317c80ce90d56b84e56526775683af2525969e8da0b640100000000000000236d2fa03f4ed8cb65de7e514d7540159b328f1c170dd402b094ad7fbf5472180100000000000000b63c5a0cf342b9b04931bc8ed74d7d0165ab99ab5f8a4514797d4b299a4501fe01000000000000008f9ea20bf4a807a8e710f7559dece86e94672b5b361de157bdaa5c1f37849f8d01000000000000000aa3a88f6b777c95c3dfe7e997b76798413f16aa325f34824cae0c9102b281d5010000000000000000000000000000000001fe1000000000"
},
"name": "Casper Staging Testnet",
"properties": {

View File

@ -1,15 +1,5 @@
import React from "react"
import { Unstable } from "@substrate/connect-discovery"
import {
Select,
SelectValue,
SelectTrigger,
SelectContent,
SelectGroup,
SelectItem,
} from "../components/ui/select"
import {
Accordion,
AccordionContent,
@ -23,57 +13,31 @@ import { Row } from "./Row"
interface SenderProps {
account: string
accounts: string[]
senderAccount: SystemAccountStorage | undefined
senderBalance: string
tokenDecimals: number
tokenSymbol: string
connectAccount: (account: Unstable.Account) => void
applyDecimals: (value: bigint, decimals: number, tokenSymbol: string) => string
}
export const Sender: React.FC<SenderProps> = ({
account,
accounts,
senderAccount,
senderBalance,
tokenDecimals,
tokenSymbol,
connectAccount,
applyDecimals
}) => {
return (
<>
<Row title="Account" element={<Select
<Row title="Account" element={<Input
disabled
value={account}
disabled={!accounts || accounts.length === 0}
onValueChange={(address) => {
try {
const unstableAccount: Unstable.Account = { address }
connectAccount(unstableAccount)
} catch (e) {
console.log(e)
}
}}
>
<SelectTrigger
className={"text-muted-foreground sm:w-[300px] w-full"}
data-testid="chain-select"
>
<SelectValue placeholder="Select Account" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
{accounts?.map((address, index) => (
<SelectItem
key={index}
data-testid={`address-${address}`}
value={address}>{address.slice(0, 10)}...{address.slice(-10)}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>} />
aria-label="Transfer Sender"
type="text"
className="sm:w-[300px] w-full"
placeholder="Waiting for acitve account address"
/>} />
<Row title="Balance" element={<Input
readOnly
aria-label="Account Balance"

View File

@ -198,7 +198,7 @@ export const Nominations = () => {
handleTransaction,
renderStatus,
} = useTransactionStatusProvider()
const { account, accounts, connectAccount } = useUnstableProvider()
const { account } = useUnstableProvider()
const chainSpecV1 = useChainSpecV1()
const eraIndex = useEraIndex()
@ -373,12 +373,10 @@ export const Nominations = () => {
<hr />
<Sender
account={account?.address ?? ""}
accounts={accounts?.map(acc => acc?.address ?? "") ?? []}
senderAccount={senderAccount}
senderBalance={applyDecimals(senderAccount?.data.free ?? 0n, tokenDecimals, tokenSymbol)}
tokenDecimals={tokenDecimals}
tokenSymbol={tokenSymbol}
connectAccount={connectAccount}
applyDecimals={applyDecimals}
/>
{ledger && ledger.total > 0n && (<Accordion type="multiple" className="w-full flex flex-col gap-4 mb-4">

View File

@ -90,11 +90,7 @@ export const Transactions = () => {
return `${days} days, ${hours} hours, ${minutes} minutes, ${seconds} seconds`
}
const {
account,
accounts,
connectAccount
} = useUnstableProvider()
const { account } = useUnstableProvider()
const receiverObject = useMemo(() => {
try {
@ -242,12 +238,10 @@ export const Transactions = () => {
<>
<Sender
account={account?.address ?? ""}
accounts={accounts?.map(acc => acc?.address ?? "") ?? []}
senderAccount={senderAccount}
senderBalance={applyDecimals(senderAccount?.data.free ?? 0n, tokenDecimals, tokenSymbol)}
tokenDecimals={tokenDecimals}
tokenSymbol={tokenSymbol}
connectAccount={connectAccount}
applyDecimals={applyDecimals}
/>
<Receiver

View File

@ -5,15 +5,16 @@ import { getObservableClient, ObservableClient } from "@polkadot-api/observable-
import { createClient as createFullClient } from "polkadot-api"
import useSWR from "swr"
type ExtendedProvider = Unstable.Provider & {
getAccount: (chainId: string) => Promise<any>;
}
type Context = {
providerDetails?: Unstable.SubstrateConnectProviderDetail[]
providerDetail?: Unstable.SubstrateConnectProviderDetail
connectProviderDetail(detail: Unstable.SubstrateConnectProviderDetail): void
disconnectProviderDetail(): void
accounts?: Unstable.Account[]
account?: Unstable.Account
connectAccount(account: Unstable.Account): void
disconnectAccount(): void
provider?: Unstable.Provider
chainId: string
setChainId: (chainId: string) => void
@ -45,9 +46,13 @@ export const UnstableProviderProvider = ({
)
const [chainId, setChainId_] = useState(defaultChainId)
const { data: accounts } = useSWR(
() => `providerDetail.${providerDetail!.info.uuid}.provider.getAccounts(${chainId})`,
async () => (await providerDetail!.provider).getAccounts(chainId),
const { data: account } = useSWR(
() => `providerDetail.${providerDetail!.info.uuid}.provider.getAccount(${chainId})`,
async () => {
const resProvider = await providerDetail!.provider;
return (resProvider as ExtendedProvider).getAccount(chainId);
},
)
const client = useMemo(() => {
@ -72,15 +77,11 @@ export const UnstableProviderProvider = ({
return observableClient ? observableClient.chainHead$() : undefined
}, [observableClient])
const [account, setAccount] = useState<Unstable.Account>()
const disconnectAccount = () => setAccount(undefined)
const disconnectProviderDetail = () => {
disconnectAccount()
setProviderDetail(undefined)
}
const setChainId = (chainId: string) => {
setChainId_(chainId)
disconnectAccount()
}
return (
@ -90,10 +91,7 @@ export const UnstableProviderProvider = ({
providerDetail,
connectProviderDetail: setProviderDetail,
disconnectProviderDetail,
accounts,
account,
connectAccount: setAccount,
disconnectAccount,
provider,
chainId,
setChainId,

View File

@ -1 +1 @@
export const DEFAULT_CHAIN_ID = "0x475e48fab52f3d0587b6b03101d224560c549e984d1dee197b7d8b55830e7da3"
export const DEFAULT_CHAIN_ID = "0xcaf9c5ddccc7ba6f96149a6b8a81c26a3641742795cd5e7e0aee79bf3f4e77b7"