Skip to content

Commit

Permalink
chore: catalog polkadot-api dependencies (#2474)
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanleecode authored Oct 8, 2024
1 parent d405d48 commit 198b375
Show file tree
Hide file tree
Showing 16 changed files with 578 additions and 343 deletions.
14 changes: 14 additions & 0 deletions .changeset/lovely-owls-hammer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"@substrate/connect": minor
"@substrate/connect-discovery": minor
"@substrate/connect-extension-protocol": minor
"@substrate/connect-known-chains": minor
"@substrate/discovery": minor
"@substrate/light-client-extension-helpers": minor
"@substrate/smoldot-discovery": minor
"@substrate/smoldot-discovery-connector": minor
"@substrate/extension": minor
"@substrate/wallet-template": minor
---

chore: catalog and upgrade papi dependencies
12 changes: 6 additions & 6 deletions examples/light-client-dapp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,17 @@
},
"dependencies": {
"@picocss/pico": "^2.0.6",
"@polkadot-api/metadata-builders": "~0.5.0",
"@polkadot-api/observable-client": "~0.5.2",
"@polkadot-api/substrate-bindings": "~0.6.3",
"@polkadot-api/substrate-client": "~0.2.1",
"@polkadot-api/utils": "~0.1.1",
"@polkadot-api/metadata-builders": "catalog:polkadot-api",
"@polkadot-api/observable-client": "catalog:polkadot-api",
"@polkadot-api/substrate-bindings": "catalog:polkadot-api",
"@polkadot-api/substrate-client": "catalog:polkadot-api",
"@polkadot-api/utils": "catalog:polkadot-api",
"@polkadot-labs/hdkd-helpers": "^0.0.8",
"@substrate/connect-known-chains": "workspace:^",
"@zag-js/react": "^0.48.0",
"@zag-js/select": "^0.48.0",
"@zag-js/toast": "^0.48.0",
"polkadot-api": "^1.0.0",
"polkadot-api": "catalog:polkadot-api",
"react": "^18.3.1",
"react-dom": "^18.2.0",
"rxjs": "^7.8.1",
Expand Down
4 changes: 2 additions & 2 deletions examples/light-client-extension-helpers-dapp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
},
"dependencies": {
"@picocss/pico": "^2.0.6",
"@polkadot-api/observable-client": "~0.5.2",
"@polkadot-api/substrate-client": "~0.2.1",
"@polkadot-api/observable-client": "catalog:polkadot-api",
"@polkadot-api/substrate-client": "catalog:polkadot-api",
"@substrate/connect-known-chains": "workspace:*",
"@substrate/light-client-extension-helpers": "workspace:*",
"react": "^18.3.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
"playwright:chromium": "playwright test --project=chromium"
},
"dependencies": {
"@polkadot-api/substrate-client": "~0.2.1",
"@substrate/light-client-extension-helpers": "workspace:*",
"@polkadot-api/substrate-client": "catalog:polkadot-api",
"@substrate/light-client-extension-helpers": "workspace:^",
"smoldot": "2.0.30"
},
"devDependencies": {
Expand Down
22 changes: 11 additions & 11 deletions packages/light-client-extension-helpers/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,8 @@
},
"devDependencies": {
"typescript": "catalog:",
"@polkadot-api/json-rpc-provider": "~0.0.3",
"@polkadot-api/polkadot-signer": "~0.1.3",
"@polkadot-api/json-rpc-provider": "catalog:polkadot-api",
"@polkadot-api/polkadot-signer": "catalog:polkadot-api",
"@types/chrome": "^0.0.270",
"smoldot": "2.0.30",
"vitest": "^2.0.5"
Expand All @@ -225,15 +225,15 @@
}
},
"dependencies": {
"@polkadot-api/codegen": "~0.8.0",
"@polkadot-api/json-rpc-provider-proxy": "~0.2.0",
"@polkadot-api/metadata-builders": "~0.5.0",
"@polkadot-api/metadata-compatibility": "~0.1.2",
"@polkadot-api/observable-client": "~0.5.2",
"@polkadot-api/signer": "~0.1.4",
"@polkadot-api/substrate-bindings": "~0.6.3",
"@polkadot-api/substrate-client": "~0.2.1",
"@polkadot-api/utils": "~0.1.1",
"@polkadot-api/codegen": "catalog:polkadot-api",
"@polkadot-api/json-rpc-provider-proxy": "catalog:polkadot-api",
"@polkadot-api/metadata-builders": "catalog:polkadot-api",
"@polkadot-api/metadata-compatibility": "catalog:polkadot-api",
"@polkadot-api/observable-client": "catalog:polkadot-api",
"@polkadot-api/signer": "catalog:polkadot-api",
"@polkadot-api/substrate-bindings": "catalog:polkadot-api",
"@polkadot-api/substrate-client": "catalog:polkadot-api",
"@polkadot-api/utils": "catalog:polkadot-api",
"@substrate/connect-extension-protocol": "workspace:^",
"@substrate/connect-known-chains": "workspace:^",
"rxjs": "^7.8.1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,24 @@ import { Tuple, Vector } from "@polkadot-api/substrate-bindings"
import { Observable, combineLatest, filter, firstValueFrom, map } from "rxjs"
import type { ChainDefinition } from "./descriptors.js"

export class RuntimeToken<D = unknown> {
private constructor() {}

// @ts-ignore
protected _runtime(value: D) {}
}

export class CompatibilityToken<D = unknown> {
private constructor() {}

// @ts-ignore
protected _phantom(value: D) {}
protected _compatibility(value: D) {}
}

interface CompatibilityTokenApi {
interface RuntimeTokenApi {
runtime: () => RuntimeContext
}
interface CompatibilityTokenApi extends RuntimeTokenApi {
typedefNodes: TypedefNode[]
getPalletEntryPoint: (
opType: OpType,
Expand All @@ -40,14 +49,18 @@ const compatibilityTokenApi = new WeakMap<
CompatibilityToken,
CompatibilityTokenApi
>()
export const getCompatibilityApi = (token: CompatibilityToken) =>
compatibilityTokenApi.get(token)!
const runtimeTokenApi = new WeakMap<RuntimeToken, RuntimeTokenApi>()
export const getCompatibilityApi = (
token: RuntimeToken | CompatibilityToken,
): RuntimeTokenApi | CompatibilityTokenApi =>
token instanceof RuntimeToken
? runtimeTokenApi.get(token)!
: compatibilityTokenApi.get(token)!

export const enum OpType {
Storage = "storage",
Tx = "tx",
Event = "events",
Error = "errors",
Const = "constants",
}

Expand Down Expand Up @@ -91,6 +104,29 @@ export const createCompatibilityToken = <D extends ChainDefinition>(
return promise
}

export const createRuntimeToken = <D>(
chainHead: ReturnType<ReturnType<typeof getObservableClient>["chainHead$"]>,
): Promise<RuntimeToken<D>> => {
const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {
const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))

let latest = await firstValueFrom(loadedRuntime$)
loadedRuntime$.subscribe((v) => (latest = v))

resolve(() => latest)
})

const promise = awaitedRuntime.then((runtime) => {
const token = new (RuntimeToken as any)()
runtimeTokenApi.set(token, {
runtime,
})
return token
})

return promise
}

// metadataRaw -> cache
const metadataCache = new WeakMap<
Uint8Array,
Expand All @@ -111,7 +147,7 @@ const getMetadataCache = (ctx: RuntimeContext) => {
return metadataCache.get(ctx.metadataRaw)!
}
export const compatibilityHelper = (
descriptors: Promise<CompatibilityToken>,
descriptors: Promise<RuntimeToken | CompatibilityToken>,
getDescriptorEntryPoint: (descriptorApi: CompatibilityTokenApi) => EntryPoint,
getRuntimeEntryPoint: (ctx: RuntimeContext) => EntryPoint,
) => {
Expand All @@ -121,7 +157,7 @@ export const compatibilityHelper = (
}

function getCompatibilityLevels(
descriptors: CompatibilityToken,
descriptors: CompatibilityToken | RuntimeToken,
/**
* The `Runtime` of runtimeWithDescriptors already has a RuntimeContext,
* which is the runtime of the finalized block.
Expand All @@ -130,6 +166,12 @@ export const compatibilityHelper = (
*/
ctx?: RuntimeContext,
) {
if (descriptors instanceof RuntimeToken) {
return {
args: CompatibilityLevel.Identical,
values: CompatibilityLevel.Identical,
}
}
const compatibilityApi = compatibilityTokenApi.get(descriptors)!
ctx ||= compatibilityApi.runtime()
const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi)
Expand Down Expand Up @@ -164,17 +206,18 @@ export const compatibilityHelper = (
<T>(chainHead: ChainHead$, mapper: (x: T) => string) =>
(
source$: Observable<T>,
): Observable<[T, CompatibilityToken, RuntimeContext]> =>
): Observable<[T, CompatibilityToken | RuntimeToken, RuntimeContext]> =>
combineLatest([
source$.pipe(chainHead.withRuntime(mapper)),
waitDescriptors(),
]).pipe(map(([[x, ctx], descriptors]) => [x, descriptors, ctx]))

const argsAreCompatible = (
descriptors: CompatibilityToken,
descriptors: CompatibilityToken | RuntimeToken,
ctx: RuntimeContext,
args: unknown,
) => {
if (descriptors instanceof RuntimeToken) return true
const levels = getCompatibilityLevels(descriptors, ctx)
if (levels.args === CompatibilityLevel.Incompatible) return false
if (levels.args > CompatibilityLevel.Partial) return true
Expand All @@ -190,10 +233,11 @@ export const compatibilityHelper = (
)
}
const valuesAreCompatible = (
descriptors: CompatibilityToken,
descriptors: CompatibilityToken | RuntimeToken,
ctx: RuntimeContext,
values: unknown,
) => {
if (descriptors instanceof RuntimeToken) return true
const level = getCompatibilityLevels(descriptors, ctx).values
if (level === CompatibilityLevel.Incompatible) return false
if (level > CompatibilityLevel.Partial) return true
Expand Down Expand Up @@ -229,13 +273,16 @@ export const minCompatLevel = (levels: {
}) => Math.min(levels.args, levels.values)

const withOptionalToken =
<T, D, A extends [...any[], CompatibilityToken]>(
compatibilityToken: Promise<CompatibilityToken<D>>,
<T, D, A extends [...any[], CompatibilityToken | RuntimeToken]>(
compatibilityToken: Promise<CompatibilityToken<D> | RuntimeToken<D>>,
fn: (...args: A) => T,
): WithOptionalRuntime<T, D, A extends [...infer R, any] ? R : []> =>
(...args: any): any => {
const lastElement = args.at(-1)
if (lastElement instanceof CompatibilityToken) {
if (
lastElement instanceof CompatibilityToken ||
lastElement instanceof RuntimeToken
) {
return fn(...args)
}
return compatibilityToken.then((token) => (fn as any)(...args, token))
Expand All @@ -249,7 +296,7 @@ export type WithOptionalRuntime<T, D, A extends any[]> = {
/**
* Returns the result synchronously with the loaded runtime.
*/
(...args: [...A, runtime: CompatibilityToken<D>]): T
(...args: [...A, runtime: CompatibilityToken<D> | RuntimeToken<D>]): T
}

export interface CompatibilityFunctions<D> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export type ApisTypedef<
T extends DescriptorEntry<RuntimeDescriptor<any, any>>,
> = T

export { DescriptorValues }
export type { DescriptorValues }

export type ChainDefinition = {
descriptors: Promise<DescriptorValues> & {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,16 +58,17 @@ const computeState = (
const computeNextState = () => {
let current: string = pinnedBlocks.best
let analyzed: AnalyzedBlock | undefined = analyzedBlocks.get(current)
let analyzedNumber = pinnedBlocks.blocks.get(current)!.number

while (!analyzed) {
const block = pinnedBlocks.blocks.get(current)
if (!block) break
analyzed = analyzedBlocks.get((current = block.parent))
analyzedNumber--
}

if (!analyzed) return // this shouldn't happen, though

const analyzedNumber = pinnedBlocks.blocks.get(analyzed.hash)!.number
const isFinalized =
analyzedNumber <=
pinnedBlocks.blocks.get(pinnedBlocks.finalized)!.number
Expand Down Expand Up @@ -219,7 +220,10 @@ export const submit$ = (

const at$ = chainHead.pinnedBlocks$.pipe(
take(1),
map((blocks) => blocks.blocks.get(at!)?.hash ?? blocks.finalized),
map((blocks) => {
const block = blocks.blocks.get(at!)
return block && !block.unpinned ? block.hash : blocks.finalized
}),
)

const validate$: Observable<never> = at$.pipe(
Expand Down
Loading

0 comments on commit 198b375

Please sign in to comment.