@parity/product-sdk-terminal
npm install @parity/product-sdk-terminalExports
Functions
| Name | Summary |
|---|---|
createSessionSigner() | A transaction creator for the adapter’s product, default account (derivationIndex 0). |
createSessionSignerForAccount() | A transaction creator for any product account of the paired session. |
createTerminalAdapter() | @parity/product-sdk-terminal: QR pairing and signing for CLIs, through the |
defaultStorageDir() | @parity/product-sdk-terminal: QR pairing and signing for CLIs, through the |
deriveEntropy() | 32 bytes of entropy scoped to productId and key (1 to 32 bytes). |
deriveProductPublicKey() | The product account’s public key, derived from the product’s subtree key the wallet shares. |
getStatementStoreProver() | A prover for productId. Request StatementStoreAllowance for it first. |
renderQrCode() | Encode a string as a QR code rendered in Unicode half-block characters. |
requestResourceAllocation() | One outcome per requested resource, in order. A refused or unavailable |
sessionRootPublicKey() | The wallet’s root key for this session. Product accounts derive from per-product subtrees, not from it. |
submitPreimage() | Store data on Bulletin with the product’s Bulletin allowance and return |
submitStatement() | Submit a proved statement to the People chain’s statement store. |
Interfaces
| Name | Summary |
|---|---|
LoginOptions | — |
ProductAccountRef | Which product account signs. |
QrRenderOptions | Options for QR code rendering. |
SessionSignerOptions | — |
SignedStatement | A statement with a required (not optional) proof. |
Statement | A statement with optional proof and metadata. |
StatementStoreProver | Proves statements for one product with its statement-store allowance. |
TerminalAdapter | — |
TerminalAdapterOptions | — |
TerminalChain | — |
TerminalNetwork | — |
TerminalStack | A Trinity stack: its pointer and the signed descriptor it names. |
Type Aliases
| Name | Summary |
|---|---|
AllocatableResource | A resource the host can pre-allocate on behalf of the product (RFC 0010). |
AllocatableResource | A resource the host can pre-allocate on behalf of the product (RFC 0010). |
AllocationOutcome | Outcome of allocating a single resource (RFC 0010). |
AllocationOutcome | Outcome of allocating a single resource (RFC 0010). |
AuthState | Auth/session lifecycle state the core projects for host UI. The core owns |
AuthState | Auth/session lifecycle state the core projects for host UI. The core owns |
SignedStatement | — |
Statement | — |
StatementProof | Cryptographic proof for a statement. |
StatementProof | Cryptographic proof for a statement. |
TerminalApprovalRequest | What the core is asking the user to approve. |
TerminalApprovals | Answers true to approve once, false to refuse. |
TerminalNetworkName | — |
TerminalSession | The paired wallet session: its root key, identity and usernames. |
Variables
| Name | Summary |
|---|---|
approveAll | — |
TerminalNetworks | — |
Re-exports
Convenience re-exports from leaf packages. Click through for the canonical documentation.
| Name | Kind | Source package |
|---|---|---|
AllowanceExpiredError | class | @parity/product-sdk-signer |
SignerError | class | @parity/product-sdk-signer |
Functions
createSessionSigner()
A transaction creator for the adapter’s product, default account (derivationIndex 0).
createSessionSigner(adapter: TerminalAdapter, publicKey?: Uint8Array<ArrayBufferLike>, options?: SessionSignerOptions): Promise<CommonSignerTxCreator>createSessionSignerForAccount()
A transaction creator for any product account of the paired session.
createSessionSignerForAccount(adapter: TerminalAdapter, ref: ProductAccountRef, options?: SessionSignerOptions): Promise<CommonSignerTxCreator>createTerminalAdapter()
createTerminalAdapter(options: TerminalAdapterOptions): Promise<TerminalAdapter>defaultStorageDir()
defaultStorageDir(appId: string): stringderiveEntropy()
32 bytes of entropy scoped to productId and key (1 to 32 bytes).
productId is the identifier the product is served under in a container,
e.g. "my-app.dot". The core trims, NFC-normalises and lowercases it first,
so "My-App.dot" and "my-app.dot" give the same bytes.
deriveEntropy(adapter: TerminalAdapter, productId: string, key: Uint8Array): Promise<Uint8Array<ArrayBufferLike>>deriveProductPublicKey()
The product account’s public key, derived from the product’s subtree key the wallet shares.
deriveProductPublicKey(adapter: TerminalAdapter, ref: ProductAccountRef): Promise<Uint8Array<ArrayBufferLike>>getStatementStoreProver()
A prover for productId. Request StatementStoreAllowance for it first.
getStatementStoreProver(adapter: TerminalAdapter, productId?: string): Promise<StatementStoreProver>renderQrCode()
Encode a string as a QR code rendered in Unicode half-block characters.
Returns a multi-line string suitable for console.log.
renderQrCode(data: string, options?: QrRenderOptions): Promise<string>requestResourceAllocation()
One outcome per requested resource, in order. A refused or unavailable resource is an outcome, not an error; transport failures throw.
requestResourceAllocation(adapter: TerminalAdapter, resources: AllocatableResource[], options: { productId?: string } = {}): Promise<AllocationOutcome[]>sessionRootPublicKey()
The wallet’s root key for this session. Product accounts derive from per-product subtrees, not from it.
sessionRootPublicKey(session: SessionUiInfo): Uint8ArraysubmitPreimage()
Store data on Bulletin with the product’s Bulletin allowance and return
its preimage key. Request BulletinAllowance for the product first.
submitPreimage(adapter: TerminalAdapter, data: Uint8Array, productId?: string): Promise<`0x${string}`>submitStatement()
Submit a proved statement to the People chain’s statement store.
submitStatement(adapter: TerminalAdapter, statement: SignedStatement, productId?: string): Promise<void>Interfaces
interface LoginOptions
Properties
reason
stringShown by the wallet.
Methods
onPairing
Called with the polkadotapp://pair?… link to show as a QR code.
onPairing(deeplink: string): voidinterface ProductAccountRef
Which product account signs.
Properties
derivationIndex
numberChild index within the product; 0 is the default account.
productId
stringThe product, as a dotNS name. Usually the adapter’s appId.
publicKey
Uint8Array<ArrayBufferLike>The account’s public key when already known, which saves a round trip to the wallet.
interface QrRenderOptions
Options for QR code rendering.
Properties
errorCorrectionLevel
"L" | "M" | "Q" | "H"Error correction level. Default: “M”.
margin
numberQuiet zone size in modules. Default: 2.
interface SessionSignerOptions
Properties
txExtVersion
numberTransaction extension version to sign on when the payload names none.
Defaults to 0. A pipeline that cannot carry every supplied extension is
skipped for the lowest one that can.
interface SignedStatement
A statement with a required (not optional) proof.
Properties
channel
`0x${string}`Optional channel.
data
`0x${string}`Optional data payload.
decryptionKey
`0x${string}`Optional decryption key.
expiry
bigintOptional Unix timestamp expiry.
proof
StatementProofRequired cryptographic proof.
topics
`0x${string}`[][u8; 32] tags.
interface Statement
A statement with optional proof and metadata.
Properties
channel
`0x${string}`Optional channel.
data
`0x${string}`Optional data payload.
decryptionKey
`0x${string}`Optional decryption key.
expiry
bigintOptional Unix timestamp expiry.
proof
StatementProofOptional cryptographic proof.
topics
`0x${string}`[][u8; 32] tags.
interface StatementStoreProver
Proves statements for one product with its statement-store allowance.
Methods
createProof
createProof(statement: Statement): Promise<StatementProof>interface TerminalAdapter
Properties
appId
stringauthState
AuthStateruntime
WorkerPairingHostRuntimeThe pairing host runtime, for anything this adapter does not wrap.
session
SessionUiInfo | undefinedThe paired session, or undefined while there is none.
storageDir
stringMethods
client
A truapi client acting as productId, by default the adapter’s appId.
client(productId?: string): Promise<TrUApiClient>destroy
Stop the core’s thread. Idempotent.
destroy(): Promise<void>login
Resolve with the session, pairing first when there is none.
login(options?: LoginOptions): Promise<SessionUiInfo>logout
End the session and tell the paired wallet. Resolves once the wallet’s notice has been submitted; rejects when it could not be within 30 s. The local session is cleared either way.
logout(): Promise<void>onAuthStateChange
Called on every auth state change. Returns an unsubscribe function.
onAuthStateChange(listener: (state: AuthState) => void): () => voidinterface TerminalAdapterOptions
Properties
appId
stringThe product this CLI acts as: a dotNS id ending in .dot, .paseo or
.testnet, e.g. "my-cli.dot", or localhost. Scopes accounts and storage.
approvals
TerminalApprovalsAnswers the core’s reviews and permission requests. Defaults to approving them.
hostMetadata
{ icon?: string; name?: string; version?: string }Shown on the phone while pairing.
logLevel
stringThe core’s log level: off (default), error, warn, info, debug or trace.
network
TerminalNetwork | "paseo-next-v2"Chains to pair and sign over. Defaults to "paseo-next-v2".
requestTimeoutMs
numberPer-request timeout for product calls. Defaults to 300 s.
storageDir
stringThis app’s own directory, holding the session (core/) and the product’s
storage (product/). Defaults to ~/.polkadot-apps/<appId>.
interface TerminalChain
Properties
endpoint
stringgenesisHash
`0x${string}`interface TerminalNetwork
Properties
assetHub
TerminalChainbulletin
TerminalChainpeople
TerminalChainstack
TerminalStackThe stack the core takes its chains and network from. Its chains must be the ones below.
interface TerminalStack
A Trinity stack: its pointer and the signed descriptor it names.
Properties
descriptor
stringThe signed descriptor as served, which the core checks against the pointer’s key.
pointer
stringThe stack’s link, polkadotapp://stack?key=0x…&url=….
Type Aliases
type AllocatableResource
A resource the host can pre-allocate on behalf of the product (RFC 0010).
For the slot-table allowances (StatementStoreAllowance,
BulletinAllowance, SmartContractAllowance), pre-allocation is
opportunistic and the host may also fulfil the allowance implicitly on the
first submission. AutoSigning must be requested explicitly through this
call.
type AllocatableResource = Codec<AllocatableResource>type AllocatableResource
A resource the host can pre-allocate on behalf of the product (RFC 0010).
For the slot-table allowances (StatementStoreAllowance,
BulletinAllowance, SmartContractAllowance), pre-allocation is
opportunistic and the host may also fulfil the allowance implicitly on the
first submission. AutoSigning must be requested explicitly through this
call.
type AllocatableResource = { tag: "StatementStoreAllowance"; value?: undefined } | { tag: "BulletinAllowance"; value?: undefined } | { tag: "SmartContractAllowance"; value: DerivationIndex } | { tag: "AutoSigning"; value?: undefined }type AllocationOutcome
Outcome of allocating a single resource (RFC 0010).
type AllocationOutcome = Codec<AllocationOutcome>type AllocationOutcome
Outcome of allocating a single resource (RFC 0010).
type AllocationOutcome = "Allocated" | "Rejected" | "NotAvailable"type AuthState
Auth/session lifecycle state the core projects for host UI. The core owns every transition and emits states in order; hosts render the current state and never derive auth UI from any other signal.
type AuthState = Codec<AuthState>type AuthState
Auth/session lifecycle state the core projects for host UI. The core owns every transition and emits states in order; hosts render the current state and never derive auth UI from any other signal.
type AuthState = { tag: "Disconnected"; value?: undefined } | { tag: "Pairing"; value: { deeplink: string } } | { tag: "Connected"; value: SessionUiInfo } | { tag: "LoginFailed"; value: { kind: LoginFailureKind; reason: string } } | { tag: "Authenticating"; value?: undefined }type SignedStatement
type SignedStatement = Codec<SignedStatement>type Statement
type Statement = Codec<Statement>type StatementProof
Cryptographic proof for a statement.
type StatementProof = Codec<StatementProof>type StatementProof
Cryptographic proof for a statement.
type StatementProof = { tag: "Sr25519"; value: { signature: HexString; signer: HexString } } | { tag: "Ed25519"; value: { signature: HexString; signer: HexString } } | { tag: "Ecdsa"; value: { signature: HexString; signer: HexString } } | { tag: "OnChain"; value: { blockHash: HexString; event: bigint; who: HexString } }type TerminalApprovalRequest
What the core is asking the user to approve.
type TerminalApprovalRequest = { kind: "review"; review: UserConfirmationReview } | { kind: "permission"; permission: string }type TerminalApprovals
Answers true to approve once, false to refuse.
type TerminalApprovals = (request: TerminalApprovalRequest) => Promise<boolean>type TerminalNetworkName
type TerminalNetworkName = keyof typeof TerminalNetworkstype TerminalSession
The paired wallet session: its root key, identity and usernames.
type TerminalSession = SessionUiInfoVariables
approveAll
let approveAll: TerminalApprovals = ...TerminalNetworks
let TerminalNetworks: { readonly paseo-next-v2: { readonly assetHub: { readonly endpoint: "wss://paseo-asset-hub-next-rpc.polkadot.io"; readonly genesisHash: "0x4349b00e54897e21196fd331015fc5be0f14e118beb0375ed2bb1793737bb57a" }; readonly bulletin: { readonly endpoint: "wss://paseo-bulletin-next-rpc.polkadot.io"; readonly genesisHash: "0x8cfe6717dc4becfda2e13c488a1e2061ff2dfee96e7d031157f72d36716c0a22" }; readonly people: { readonly endpoint: "wss://paseo-people-next-system-rpc.polkadot.io"; readonly genesisHash: "0x4a2b5b737de1da59e209b0000a876ec2fa20035dc34fd292a848da32d255ad48" }; readonly stack: { readonly descriptor: "{\"$v\":1,\"payload\":\"ewogICIkdiI6IDEsCiAgImFzc2V0cyI6IFsKICAgIHsKICAgICAgImNoYWluIjogIkFzc2V0SHViIiwKICAgICAgImlkIjogNTAwMDA0MTMsCiAgICAgICJwYWxsZXQiOiAiQXNzZXRzIiwKICAgICAgInJvbGUiOiAicGF5bWVudCIKICAgIH0KICBdLAogICJjaGFpbnMiOiBbCiAgICB7CiAgICAgICJmdWxsU3BlYyI6IHsKICAgICAgICAic2hhMjU2IjogIjB4MDVjMjk0OWFiNGIwNDAxNDA0MTY5NzlmOTM2MjBkZWU0ZWJjNjdiMzBhODMwZTkyZDYyZTFjZDc2YTZhOGMyZCIsCiAgICAgICAgInVybCI6ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcGFzZW8tbmV0d29yay9wYXNlby1jaGFpbi1zcGVjcy8zMWE1ZTJjMmRkYTU2OWRhZGRkZWY4MmFjODJjODRmMTRhZjVhYmY1L3Bhc2VvLnJhdy5qc29uIgogICAgICB9LAogICAgICAiZ2VuZXNpc0hhc2giOiAiMHgzNzQwNTdiZTY3YjM1NTE1MWYyNzFmZjcwYzNkYjk4MzA4YzYyYzhhZGM0OGRjNjcyNGI2YTAwOWExYTAxNGZkIiwKICAgICAgImxpZ2h0U3BlYyI6IHsKICAgICAgICAic2hhMjU2IjogIjB4ZjNkZjM4MDY5MTI5NzY3ZDUzMTBmNGIxOWY0NDM0OWNhMTI3YTM1OTQwNjU2OWJiYTRlYTVjMzVhNDg5YTgxZCIsCiAgICAgICAgInVybCI6ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcGFzZW8tbmV0d29yay9wYXNlby1jaGFpbi1zcGVjcy83YjdhZWFkNTc4MWJlMWYxNWM5YmIzZDlkNjVjZDRhNmNmZDUzYjc2L3Bhc2VvLnJhdy5zbW9sLmpzb24iCiAgICAgIH0sCiAgICAgICJyb2xlIjogIlJlbGF5IiwKICAgICAgInJwYyI6IFsKICAgICAgICAid3NzOi8vcGFzZW8tcnBjLm4uZHdlbGxpci5jb20iLAogICAgICAgICJ3c3M6Ly9wYXNlby12Mi5ycGMudHVyYm9mbGFrZXMuaW8iLAogICAgICAgICJ3c3M6Ly9ycGMtcGFzZW8uc3Rha2V3b3JsZC5pbyIsCiAgICAgICAgIndzczovL3JwYy5pbnRlcndlYi1pdC5jb20vcGFzZW8iCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJmdWxsU3BlYyI6IHsKICAgICAgICAic2hhMjU2IjogIjB4YzJkYmJlM2RhZGRmMzAyZTJjMTI2YThmZmJlMjY4OTdmNGM4ZDcwOTgyNjk3MDU1ZjlkM2M1NzYyNzQ0NjVmYiIsCiAgICAgICAgInVybCI6ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcGFyaXR5dGVjaC9jaGFpbnNwZWNzL2VkMGMwNjhhY2M4NWQ3MzE0MGQxYWE5MzcxNjlhNDg0MDQ3ZmMyNWYvcGFzZW8vcGFyYWNoYWluL2Fzc2V0LWh1Yi1uZXh0L3Jhdy5qc29uIgogICAgICB9LAogICAgICAiZ2VuZXNpc0hhc2giOiAiMHg0MzQ5YjAwZTU0ODk3ZTIxMTk2ZmQzMzEwMTVmYzViZTBmMTRlMTE4YmViMDM3NWVkMmJiMTc5MzczN2JiNTdhIiwKICAgICAgImxpZ2h0U3BlYyI6IHsKICAgICAgICAic2hhMjU2IjogIjB4MzY3NTFjZmU1NWU3MmUxZjlmNWM5Mzc2ZmFhMTY3YTgxODdiMjczN2E4MWE3Y2ExMDhhMjc5MTgyZGJjMzFjZCIsCiAgICAgICAgInVybCI6ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcGFyaXR5dGVjaC9jaGFpbnNwZWNzLzBkNjgzN2FiYTg2OTRmMjQ0N2M0ZDM1YzEyNDg0YWFjNzZmM2Q0N2IvcGFzZW8vcGFyYWNoYWluL2Fzc2V0LWh1Yi1uZXh0L2xpZ2h0Lmpzb24iCiAgICAgIH0sCiAgICAgICJwYXJhSWQiOiAxNTAwLAogICAgICAicm9sZSI6ICJBc3NldEh1YiIsCiAgICAgICJycGMiOiBbCiAgICAgICAgIndzczovL3Bhc2VvLWFzc2V0LWh1Yi1uZXh0LXJwYy5wb2xrYWRvdC5pbyIKICAgICAgXQogICAgfSwKICAgIHsKICAgICAgImZ1bGxTcGVjIjogewogICAgICAgICJzaGEyNTYiOiAiMHgxMTgxNDZkYWQ2Y2UzODNkMTUyMjJmYjcxZWI0MWE2YmZiYTk4YjZmN2M2OWIyM2ExYzJjZTM2YzRkNmJkMzc1IiwKICAgICAgICAidXJsIjogImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9wYXJpdHl0ZWNoL2NoYWluc3BlY3MvZWQwYzA2OGFjYzg1ZDczMTQwZDFhYTkzNzE2OWE0ODQwNDdmYzI1Zi9wYXNlby9wYXJhY2hhaW4vcGVvcGxlLW5leHQtc3lzdGVtL3Jhdy5qc29uIgogICAgICB9LAogICAgICAiZ2VuZXNpc0hhc2giOiAiMHg0YTJiNWI3MzdkZTFkYTU5ZTIwOWIwMDAwYTg3NmVjMmZhMjAwMzVkYzM0ZmQyOTJhODQ4ZGEzMmQyNTVhZDQ4IiwKICAgICAgImxpZ2h0U3BlYyI6IHsKICAgICAgICAic2hhMjU2IjogIjB4MTQ2ZDg2YzVjNGZkZjY3OWE4YTQ4Y2FlNmNmYTAyNTY1NGMzMmU4ZWQyMGFjMzkxOGY2YzdiOGExOGE5MTEzYiIsCiAgICAgICAgInVybCI6ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcGFyaXR5dGVjaC9jaGFpbnNwZWNzLzBkNjgzN2FiYTg2OTRmMjQ0N2M0ZDM1YzEyNDg0YWFjNzZmM2Q0N2IvcGFzZW8vcGFyYWNoYWluL3Blb3BsZS1uZXh0LXN5c3RlbS9saWdodC5qc29uIgogICAgICB9LAogICAgICAicGFyYUlkIjogMTUwMiwKICAgICAgInJvbGUiOiAiUGVvcGxlIiwKICAgICAgInJwYyI6IFsKICAgICAgICAid3NzOi8vcGFzZW8tcGVvcGxlLW5leHQtc3lzdGVtLXJwYy5wb2xrYWRvdC5pbyIKICAgICAgXSwKICAgICAgInN0YXRlbWVudFN0b3JlIjogdHJ1ZQogICAgfSwKICAgIHsKICAgICAgImZ1bGxTcGVjIjogewogICAgICAgICJzaGEyNTYiOiAiMHhjZDBiNDI1ZTY1Y2Y0M2MwM2E3ZTZlZTlhMjllNDBjZDFiYThhMTA2YWE5ZTUyYWRmMTBhNTIxNGYwYzU5YWY3IiwKICAgICAgICAidXJsIjogImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9wYXJpdHl0ZWNoL2NoYWluc3BlY3MvODlkODk4MmIzNzNiODY5MjBlMDI3OGYwMDYwZmEwNWZkNmU4ZjM0NC9wYXNlby9wYXJhY2hhaW4vYnVsbGV0aW4tbmV4dC9yYXcuanNvbiIKICAgICAgfSwKICAgICAgImdlbmVzaXNIYXNoIjogIjB4OGNmZTY3MTdkYzRiZWNmZGEyZTEzYzQ4OGExZTIwNjFmZjJkZmVlOTZlN2QwMzExNTdmNzJkMzY3MTZjMGEyMiIsCiAgICAgICJsaWdodFNwZWMiOiB7CiAgICAgICAgInNoYTI1NiI6ICIweDAwYWMwMzY2N2M0NGZiMjY2NThjN2M4ZTYxZTlhNWI5ZWYxNDVkNTEzZTY0ZjkyOTA0Mjc5YzBjZDQwNjJjOWQiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Bhcml0eXRlY2gvY2hhaW5zcGVjcy8wZDY4MzdhYmE4Njk0ZjI0NDdjNGQzNWMxMjQ4NGFhYzc2ZjNkNDdiL3Bhc2VvL3BhcmFjaGFpbi9idWxsZXRpbi1uZXh0L2xpZ2h0Lmpzb24iCiAgICAgIH0sCiAgICAgICJwYXJhSWQiOiAxNTAxLAogICAgICAicm9sZSI6ICJCdWxsZXRpbiIsCiAgICAgICJycGMiOiBbCiAgICAgICAgIndzczovL3Bhc2VvLWJ1bGxldGluLW5leHQtcnBjLnBvbGthZG90LmlvIgogICAgICBdCiAgICB9CiAgXSwKICAiY29pbmFnZSI6IHsKICAgICJjaGFpbiI6ICJQZW9wbGUiLAogICAgImluc3RhbmNlIjogMAogIH0sCiAgImRvdG5zIjogewogICAgImNvbnRlbnRSZXNvbHZlciI6ICIweDdmNzRkN2NkNTBmNWE4MzQyNzBlMmFkMzk1YTAxYjAxODkxYWIzN2QiLAogICAgImNvbnRyb2xsZXIiOiAiMHhiZGFhMDFiZDFiYTY3ZDcwOWYyYjFmZjI4NmRhMGQ4NTQ5NzdlYTMwIiwKICAgICJjb3N0TW9kZWwiOiAiMHg4YmZkMWYwOTU3ZTczNzE2NzMyZTcyNTgwMmYxMzgzMGI1NjgyZGE0IiwKICAgICJjcmVhdGUzRmFjdG9yeSI6ICIweDg1MzNjNzllMDU4YzVhNjQ4OWNhZmVjYTg2ZGM2MDBlMDI5ZDc1ZjUiLAogICAgIm11bHRpY2FsbDMiOiAiMHhiNDQ2ODAwMGFiZDg3ZDNjNTZjYmZiZDE1MzE2MTIyM2Q3YjEwOWU1IiwKICAgICJuYW1lRXNjcm93IjogIjB4NDg4MWFmYjc4ZTdjOTA4Y2FlODE4MTY4YjkyNjIyOWQ5MzM3NjUyMCIsCiAgICAibmFtZVdoaXRlbGlzdCI6ICIweDQyMDE2NmNkNjdjYTAyMzMwOTRlNDkyYTRiYmE2NzA0NWVkN2MzOGMiLAogICAgInBvcENvbnRyb2xsZXIiOiAiMHhjYzkzMjM0ODYwNmNjMWYzMzE4Y2FkZWM1YTVjZDJjYTQ0N2Y4YTRiIiwKICAgICJwb3BHYXRld2F5IjogIjB4YTg4OWNjYTNmYjRiMDdiOThhMTFjYzU0YzEwZjEzZGRhMjBiYzNkYiIsCiAgICAicG9wTGVucyI6ICIweDMwOWM1ZmYyMWY5MDgyYTUzMjExNTAwYzZmMzNjYTJhMjEwMjRhZTQiLAogICAgInBvcFJlc29sdmVyIjogIjB4ZGFjOTg0ODg0ZWNhOGZjNDQwMTFmMWQ2YzQ5YjI3ODI4MzkwYTcyYiIsCiAgICAicG9wUnVsZXMiOiAiMHg3NDdiNDU2YmUwM2FlYzBiNDJiZDg1YzUxNTEzNzMwZmJkNDVkYTMxIiwKICAgICJwcm90b2NvbFJlZ2lzdHJ5IjogIjB4ZDE5ZTNkMGM5N2NmNTAxMTI1YTA0YTk3NDA1ZTNlNjU5MmZhODQ2ZSIsCiAgICAicmVnaXN0cmFyIjogIjB4NGYwNmU4MThiYTNkOTg3NzA0ZmQ5MWNmM2Q4NjhlNGIwMTkxMDZhYiIsCiAgICAicmVnaXN0cnkiOiAiMHhmMzQwNTRmZDc2YmJmODVmMjE2Y2Y5OTA4MjI2ZDVmMGE3MmU1MGNhIiwKICAgICJyZXNvbHZlciI6ICIweGJkMTE2NWU1NDlkZjk2ZjA4M2MwYTE2ZjYxNTkwOTI3YmMxODcwMDkiLAogICAgInJldmVyc2VSZXNvbHZlciI6ICIweGVlMzg4M2Q3ZWI2MGVlOWJjZDdmM2JjZDhmMmYwNTMwMmE5Y2MwMzUiLAogICAgInN0b3JlRmFjdG9yeSI6ICIweDk5NjA1YTkyNmZjYjQwYWI1MjBmNjU5YzY1MDVlNWZmODYyNzcxZjYiCiAgfSwKICAiZ2VuZXJhdGlvbiI6ICIweDZlYmJjYzgxMTYwZDdkZjI3NTMyYThiNmFkYWE0MmMwZGFjNDMyZWFjNjExYjIwZGZhM2YwMmQ5ZTA4NjhlMWMiLAogICJpZCI6ICJwYXNlby1uZXh0LXYyIiwKICAibmFtZSI6ICJQYXNlbyBOZXh0IHYyIiwKICAibmV0d29yayI6ICJwYXNlbyIsCiAgInNlcXVlbmNlIjogMTc5MzYxNTI4NywKICAic2VydmljZXMiOiBbCiAgICB7CiAgICAgICJraW5kIjogImR1YiIsCiAgICAgICJ1cmxzIjogWwogICAgICAgICJodHRwczovL2lkZW50aXR5LmRvdHNwYXJrLmFwcC8iCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJraW5kIjogInR1cm4iLAogICAgICAidXJscyI6IFsKICAgICAgICAiaHR0cHM6Ly9pZGVudGl0eS5kb3RzcGFyay5hcHAvIgogICAgICBdCiAgICB9LAogICAgewogICAgICAia2luZCI6ICJzdHVuIiwKICAgICAgInVybHMiOiBbCiAgICAgICAgInN0dW46c3R1bi5jbG91ZGZsYXJlLmNvbTozNDc4IiwKICAgICAgICAic3R1bjpzdHVuLmNsb3VkZmxhcmUuY29tOjQ0MyIKICAgICAgXQogICAgfSwKICAgIHsKICAgICAgImtpbmQiOiAiaXBmcy1nYXRld2F5IiwKICAgICAgInVybHMiOiBbCiAgICAgICAgImh0dHBzOi8vcGFzZW8tYnVsbGV0aW4tbmV4dC1pcGZzLnBvbGthZG90LmlvL2lwZnMvIgogICAgICBdCiAgICB9LAogICAgewogICAgICAia2luZCI6ICJob3AiLAogICAgICAidXJscyI6IFsKICAgICAgICAid3NzOi8vcGFzZW8taG9wLW5leHQtMC5wb2xrYWRvdC5pbyIsCiAgICAgICAgIndzczovL3Bhc2VvLWhvcC1uZXh0LTEucG9sa2Fkb3QuaW8iCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJjaGFpbklkIjogNDIwNDIwNDE3LAogICAgICAia2luZCI6ICJldGgtcnBjIiwKICAgICAgInVybHMiOiBbCiAgICAgICAgImh0dHBzOi8vZXRoLXJwYy1wYXNlby1uZXh0LnBvbGthZG90LmlvIgogICAgICBdCiAgICB9LAogICAgewogICAgICAia2luZCI6ICJ3ZWItZ2F0ZXdheSIsCiAgICAgICJ1cmxzIjogWwogICAgICAgICJodHRwczovL3Bhc2VvLmxpLyIKICAgICAgXQogICAgfSwKICAgIHsKICAgICAgImtpbmQiOiAiZXZtLWV4cGxvcmVyIiwKICAgICAgInVybHMiOiBbCiAgICAgICAgImh0dHBzOi8vYmxvY2tzY291dC1wYXNlby1uZXh0LnBvbGthZG90LmlvLyIKICAgICAgXQogICAgfQogIF0sCiAgInRsZCI6ICJwYXNlbyIKfQo=\",\"signature\":\"0x85d877075908dc4059c48561a604e67e8883566ba929b40e1cf93e20a6d99cd5435fb674dd65c1fb30ede47ea156050fe3cce9ba9bc8a3edb775995903600401\"}"; readonly pointer: "polkadotapp://stack?key=0x2b89d8ca74aa2e11ab55f5af1168cd6929b88d1998aecd979b42cfc1078d5377&url=https%3A%2F%2Fstack-paseo-next.parity-testnet.parity.io%2F.well-known%2Ftrinity-stack.json" } } } = ...