@polkahub/vault 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@ import { Camera, ChevronLeft } from 'lucide-react';
5
5
  import { Binary } from 'polkadot-api';
6
6
  import { mergeUint8 } from 'polkadot-api/utils';
7
7
  import { useState, useCallback, useEffect } from 'react';
8
- import { encodeQR } from './qr/index.js';
8
+ import encodeQR from './qr/index.js';
9
9
  import { QrCamera } from './QrCamera.js';
10
10
  import { usePlugin } from '@polkahub/context';
11
11
  import { polkadotVaultProviderId } from './provider.js';
@@ -26,7 +26,7 @@ const VaultTxContent = ({ activeTx }) => {
26
26
  );
27
27
  const [mode, setMode] = useState("tx");
28
28
  const onRead = useCallback(
29
- (res) => polkadotVaultProvider.setSignature(Binary.fromHex(res).asBytes()),
29
+ (res) => polkadotVaultProvider.setSignature(Binary.fromHex(res)),
30
30
  [polkadotVaultProvider]
31
31
  );
32
32
  if (mode === "tx") {
@@ -98,8 +98,8 @@ const createFrames = (payload) => {
98
98
  return frames.map(
99
99
  (f, i) => mergeUint8([
100
100
  new Uint8Array([0]),
101
- Binary.fromHex(frames.length.toString(16).padStart(4, "0")).asBytes(),
102
- Binary.fromHex(i.toString(16).padStart(4, "0")).asBytes(),
101
+ Binary.fromHex(frames.length.toString(16).padStart(4, "0")),
102
+ Binary.fromHex(i.toString(16).padStart(4, "0")),
103
103
  f
104
104
  ])
105
105
  );
@@ -1 +1 @@
1
- {"version":3,"file":"VaultTxModal.js","sources":["../src/VaultTxModal.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogBody,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@polkahub/ui-components\";\nimport { useStateObservable } from \"@react-rxjs/core\";\nimport { Camera, ChevronLeft } from \"lucide-react\";\nimport { Binary } from \"polkadot-api\";\nimport { mergeUint8 } from \"polkadot-api/utils\";\nimport { useCallback, useEffect, useState, type FC } from \"react\";\nimport encodeQr from \"./qr\";\nimport { QrCamera } from \"./QrCamera\";\nimport { usePlugin } from \"@polkahub/context\";\nimport { PolkadotVaultProvider, polkadotVaultProviderId } from \"./provider\";\n\nexport const VaultTxModal: FC = () => {\n const polkadotVaultProvider = usePlugin<PolkadotVaultProvider>(\n polkadotVaultProviderId\n )!;\n const activeTx = useStateObservable(polkadotVaultProvider.activeTx$);\n\n return (\n <Dialog open={!!activeTx} onOpenChange={polkadotVaultProvider.cancelTx}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Vault Transaction</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <VaultTxContent activeTx={activeTx} />\n </DialogBody>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst VaultTxContent: FC<{\n activeTx: Uint8Array<ArrayBufferLike> | null;\n}> = ({ activeTx }) => {\n const polkadotVaultProvider = usePlugin<PolkadotVaultProvider>(\n polkadotVaultProviderId\n )!;\n const [mode, setMode] = useState<\"tx\" | \"sig\">(\"tx\");\n\n const onRead = useCallback(\n (res: string) =>\n polkadotVaultProvider.setSignature(Binary.fromHex(res).asBytes()),\n [polkadotVaultProvider]\n );\n\n if (mode === \"tx\") {\n return (\n <div className=\"flex flex-col items-center gap-2\">\n <VaultTx tx={activeTx} />\n <Button type=\"button\" variant=\"outline\" onClick={() => setMode(\"sig\")}>\n <Camera />\n Scan Signature\n </Button>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col items-center gap-2\">\n <QrCamera onRead={onRead} />\n <Button type=\"button\" variant=\"outline\" onClick={() => setMode(\"tx\")}>\n <ChevronLeft />\n Back\n </Button>\n </div>\n );\n};\n\nconst uint8ToB64 = (value: Uint8Array) => {\n if (\"toBase64\" in value) {\n return (value as any).toBase64() as string;\n }\n\n let binary = \"\";\n for (let i = 0; i < value.length; i++) {\n binary += String.fromCharCode(value[i]);\n }\n return window.btoa(binary);\n};\n\nconst VaultTx: FC<{\n tx: Uint8Array<ArrayBufferLike> | null;\n}> = ({ tx }) => {\n const [imgSrc, setImgSrc] = useState<string | null>(null);\n\n useEffect(() => {\n if (!tx) return;\n\n const frames = createFrames(tx);\n const drawFrame = (frame: Uint8Array) => {\n const encoded = encodeQr(binaryToString(frame), \"gif\", {\n encoding: \"byte\",\n textEncoder: stringToBinary,\n scale: 4,\n });\n\n setImgSrc(`data:image/gif;base64,${uint8ToB64(encoded)}`);\n };\n drawFrame(frames[0]);\n\n if (frames.length === 1) return;\n\n let i = 1;\n const token = setInterval(() => {\n drawFrame(frames[i]);\n i = (i + 1) % frames.length;\n }, 300);\n return () => clearInterval(token);\n }, [tx]);\n\n return (\n <div className=\"text-center\">\n <p>Scan the transaction with your device</p>\n <img src={imgSrc ?? undefined} className=\"m-auto\" />\n </div>\n );\n};\n\nconst binaryToString = (value: Uint8Array) =>\n Array.from(value, (b) => String.fromCharCode(b)).join(\"\");\nconst stringToBinary = (value: string) =>\n Uint8Array.from(value, (c) => c.charCodeAt(0) & 0xff);\n\nconst createFrames = (payload: Uint8Array): Uint8Array[] => {\n const frames = [];\n const MAX_FRAME_SIZE = 1024;\n const frameAmount = Math.ceil(payload.length / MAX_FRAME_SIZE);\n const frameSize = Math.ceil(payload.length / frameAmount);\n\n let idx = 0;\n while (idx < payload.length) {\n frames.push(payload.subarray(idx, idx + frameSize));\n idx += frameSize;\n }\n\n return frames.map(\n (f, i): Uint8Array =>\n mergeUint8([\n new Uint8Array([0x00]),\n Binary.fromHex(frames.length.toString(16).padStart(4, \"0\")).asBytes(),\n Binary.fromHex(i.toString(16).padStart(4, \"0\")).asBytes(),\n f,\n ])\n );\n};\n"],"names":["encodeQr"],"mappings":"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"}
1
+ {"version":3,"file":"VaultTxModal.js","sources":["../src/VaultTxModal.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogBody,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@polkahub/ui-components\";\nimport { useStateObservable } from \"@react-rxjs/core\";\nimport { Camera, ChevronLeft } from \"lucide-react\";\nimport { Binary } from \"polkadot-api\";\nimport { mergeUint8 } from \"polkadot-api/utils\";\nimport { useCallback, useEffect, useState, type FC } from \"react\";\nimport encodeQr from \"./qr\";\nimport { QrCamera } from \"./QrCamera\";\nimport { usePlugin } from \"@polkahub/context\";\nimport { PolkadotVaultProvider, polkadotVaultProviderId } from \"./provider\";\n\nexport const VaultTxModal: FC = () => {\n const polkadotVaultProvider = usePlugin<PolkadotVaultProvider>(\n polkadotVaultProviderId\n )!;\n const activeTx = useStateObservable(polkadotVaultProvider.activeTx$);\n\n return (\n <Dialog open={!!activeTx} onOpenChange={polkadotVaultProvider.cancelTx}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Vault Transaction</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <VaultTxContent activeTx={activeTx} />\n </DialogBody>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst VaultTxContent: FC<{\n activeTx: Uint8Array<ArrayBufferLike> | null;\n}> = ({ activeTx }) => {\n const polkadotVaultProvider = usePlugin<PolkadotVaultProvider>(\n polkadotVaultProviderId\n )!;\n const [mode, setMode] = useState<\"tx\" | \"sig\">(\"tx\");\n\n const onRead = useCallback(\n (res: string) => polkadotVaultProvider.setSignature(Binary.fromHex(res)),\n [polkadotVaultProvider]\n );\n\n if (mode === \"tx\") {\n return (\n <div className=\"flex flex-col items-center gap-2\">\n <VaultTx tx={activeTx} />\n <Button type=\"button\" variant=\"outline\" onClick={() => setMode(\"sig\")}>\n <Camera />\n Scan Signature\n </Button>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col items-center gap-2\">\n <QrCamera onRead={onRead} />\n <Button type=\"button\" variant=\"outline\" onClick={() => setMode(\"tx\")}>\n <ChevronLeft />\n Back\n </Button>\n </div>\n );\n};\n\nconst uint8ToB64 = (value: Uint8Array) => {\n if (\"toBase64\" in value) {\n return (value as any).toBase64() as string;\n }\n\n let binary = \"\";\n for (let i = 0; i < value.length; i++) {\n binary += String.fromCharCode(value[i]);\n }\n return window.btoa(binary);\n};\n\nconst VaultTx: FC<{\n tx: Uint8Array<ArrayBufferLike> | null;\n}> = ({ tx }) => {\n const [imgSrc, setImgSrc] = useState<string | null>(null);\n\n useEffect(() => {\n if (!tx) return;\n\n const frames = createFrames(tx);\n const drawFrame = (frame: Uint8Array) => {\n const encoded = encodeQr(binaryToString(frame), \"gif\", {\n encoding: \"byte\",\n textEncoder: stringToBinary,\n scale: 4,\n });\n\n setImgSrc(`data:image/gif;base64,${uint8ToB64(encoded)}`);\n };\n drawFrame(frames[0]);\n\n if (frames.length === 1) return;\n\n let i = 1;\n const token = setInterval(() => {\n drawFrame(frames[i]);\n i = (i + 1) % frames.length;\n }, 300);\n return () => clearInterval(token);\n }, [tx]);\n\n return (\n <div className=\"text-center\">\n <p>Scan the transaction with your device</p>\n <img src={imgSrc ?? undefined} className=\"m-auto\" />\n </div>\n );\n};\n\nconst binaryToString = (value: Uint8Array) =>\n Array.from(value, (b) => String.fromCharCode(b)).join(\"\");\nconst stringToBinary = (value: string) =>\n Uint8Array.from(value, (c) => c.charCodeAt(0) & 0xff);\n\nconst createFrames = (payload: Uint8Array): Uint8Array[] => {\n const frames = [];\n const MAX_FRAME_SIZE = 1024;\n const frameAmount = Math.ceil(payload.length / MAX_FRAME_SIZE);\n const frameSize = Math.ceil(payload.length / frameAmount);\n\n let idx = 0;\n while (idx < payload.length) {\n frames.push(payload.subarray(idx, idx + frameSize));\n idx += frameSize;\n }\n\n return frames.map(\n (f, i): Uint8Array =>\n mergeUint8([\n new Uint8Array([0x00]),\n Binary.fromHex(frames.length.toString(16).padStart(4, \"0\")),\n Binary.fromHex(i.toString(16).padStart(4, \"0\")),\n f,\n ])\n );\n};\n"],"names":["encodeQr"],"mappings":"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"}
package/dist/provider.js CHANGED
@@ -45,7 +45,7 @@ const createPolkadotVaultProvider = (opts) => {
45
45
  1 /* Sr25519 */,
46
46
  publicKey,
47
47
  data,
48
- Binary.fromHex(accountGenesis).asBytes()
48
+ Binary.fromHex(accountGenesis)
49
49
  );
50
50
  setTx(qrPayload);
51
51
  const signature = await firstValueFrom(currentScannedSignature$);
@@ -59,7 +59,7 @@ const createPolkadotVaultProvider = (opts) => {
59
59
  const decMeta = unifyMetadata(decAnyMetadata(metadata));
60
60
  const extra = [];
61
61
  const additionalSigned = [];
62
- for (const { identifier } of decMeta.extrinsic.signedExtensions) {
62
+ for (const { identifier } of decMeta.extrinsic.signedExtensions[0]) {
63
63
  if (identifier === "CheckMetadataHash") {
64
64
  if (getNetworkInfo) {
65
65
  merkleizer = merkleizeMetadata(metadata, await getNetworkInfo());
@@ -81,7 +81,7 @@ const createPolkadotVaultProvider = (opts) => {
81
81
  additionalSigned.push(signedExtension.additionalSigned);
82
82
  }
83
83
  const extensions = mergeUint8([...extra, ...additionalSigned]);
84
- const genesis = signedExtensions.CheckGenesis?.additionalSigned ?? Binary.fromHex(accountGenesis).asBytes();
84
+ const genesis = signedExtensions.CheckGenesis?.additionalSigned ?? Binary.fromHex(accountGenesis);
85
85
  const qrPayload = merkleizer ? createQrProofedTransaction(
86
86
  1 /* Sr25519 */,
87
87
  publicKey,
@@ -197,11 +197,7 @@ const createQrMessage = (encrpytion, publicKey, data, genesisHash) => mergeUint8
197
197
  new Uint8Array([encrpytion]),
198
198
  new Uint8Array([3 /* Message */]),
199
199
  publicKey,
200
- mergeUint8([
201
- Binary.fromText("<Bytes>").asBytes(),
202
- data,
203
- Binary.fromText("</Bytes>").asBytes()
204
- ]),
200
+ mergeUint8([Binary.fromText("<Bytes>"), data, Binary.fromText("</Bytes>")]),
205
201
  genesisHash
206
202
  ]);
207
203
 
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sources":["../src/provider.ts"],"sourcesContent":["import { createV4Tx } from \"@polkadot-api/signers-common\";\nimport {\n compact,\n decAnyMetadata,\n unifyMetadata,\n} from \"@polkadot-api/substrate-bindings\";\nimport {\n Account,\n AccountAddress,\n addrEq,\n localStorageProvider,\n persistedState,\n PersistenceProvider,\n Plugin,\n} from \"@polkahub/plugin\";\nimport { DefaultedStateObservable, state, withDefault } from \"@react-rxjs/core\";\nimport { createSignal } from \"@react-rxjs/utils\";\nimport {\n Binary,\n getSs58AddressInfo,\n HexString,\n PolkadotSigner,\n} from \"polkadot-api\";\nimport { mergeUint8 } from \"polkadot-api/utils\";\nimport { firstValueFrom, map, merge, race } from \"rxjs\";\nimport {\n merkleizeMetadata,\n MetadataMerkleizer,\n} from \"@polkadot-api/merkleize-metadata\";\n\nexport const polkadotVaultProviderId = \"polkadot-vault\";\nexport interface VaultAccountInfo {\n address: AccountAddress;\n genesis: HexString;\n}\nexport interface PolkadotVaultAccount extends Account {\n provider: \"polkadot-vault\";\n genesis: HexString;\n}\n\nexport interface PolkadotVaultProvider extends Plugin<PolkadotVaultAccount> {\n id: \"polkadot-vault\";\n accounts$: DefaultedStateObservable<PolkadotVaultAccount[]>;\n\n setAccounts: (payload: VaultAccountInfo[]) => void;\n addAccount: (payload: VaultAccountInfo) => PolkadotVaultAccount;\n removeAccount: (payload: VaultAccountInfo) => void;\n\n activeTx$: DefaultedStateObservable<Uint8Array<ArrayBufferLike> | null>;\n setTx: (payload: Uint8Array<ArrayBufferLike>) => void;\n setSignature: (payload: Uint8Array<ArrayBufferLike>) => void;\n cancelTx: () => void;\n}\n\nexport type NetworkInfo = {\n decimals: number;\n tokenSymbol: string;\n};\n\nexport const createPolkadotVaultProvider = (\n opts?: Partial<{\n persist: PersistenceProvider;\n getNetworkInfo: () => Promise<NetworkInfo>;\n }>\n): PolkadotVaultProvider => {\n const { persist, getNetworkInfo } = {\n persist: localStorageProvider(polkadotVaultProviderId),\n ...opts,\n };\n\n const [vaultAccounts$, setVaultAccounts] = persistedState(\n persist,\n [] as VaultAccountInfo[]\n );\n\n const [newTx$, setTx] = createSignal<Uint8Array>();\n const [scannedSignature$, setSignature] = createSignal<Uint8Array>();\n const [cancelledTx$, cancelTx] = createSignal();\n\n const activeTx$ = state(\n merge(newTx$, merge(scannedSignature$, cancelledTx$).pipe(map(() => null))),\n null\n );\n const currentScannedSignature$ = race(\n scannedSignature$,\n merge(newTx$, cancelledTx$).pipe(map(() => null))\n );\n\n const createVaultSigner = ({\n address,\n genesis: accountGenesis,\n }: VaultAccountInfo): PolkadotSigner => {\n const info = getSs58AddressInfo(address);\n if (!info.isValid) {\n throw new Error(\"Invalid SS58 address \" + address);\n }\n\n const publicKey = info.publicKey;\n\n return {\n publicKey,\n async signBytes(data) {\n const qrPayload = createQrMessage(\n VaultQrEncryption.Sr25519,\n publicKey,\n data,\n Binary.fromHex(accountGenesis).asBytes()\n );\n setTx(qrPayload);\n\n const signature = await firstValueFrom(currentScannedSignature$);\n if (!signature) {\n throw new Error(\"Cancelled\");\n }\n\n return signature;\n },\n async signTx(callData, signedExtensions, metadata) {\n let merkleizer: MetadataMerkleizer | null = null;\n const decMeta = unifyMetadata(decAnyMetadata(metadata));\n const extra: Array<Uint8Array> = [];\n const additionalSigned: Array<Uint8Array> = [];\n for (const { identifier } of decMeta.extrinsic.signedExtensions) {\n if (identifier === \"CheckMetadataHash\") {\n if (getNetworkInfo) {\n merkleizer = merkleizeMetadata(metadata, await getNetworkInfo());\n extra.push(Uint8Array.from([1]));\n additionalSigned.push(\n mergeUint8([Uint8Array.from([1]), merkleizer.digest()])\n );\n continue;\n } else {\n console.warn(\n \"The chain supports `CheckMetadataHash`, but `getNetworkInfo` was not provided. Polkadot Vault will need the whole metadata downloaded beforehand.\"\n );\n }\n }\n const signedExtension = signedExtensions[identifier];\n if (!signedExtension)\n throw new Error(`Missing ${identifier} signed extension`);\n extra.push(signedExtension.value);\n additionalSigned.push(signedExtension.additionalSigned);\n }\n const extensions = mergeUint8([...extra, ...additionalSigned]);\n\n const genesis =\n signedExtensions.CheckGenesis?.additionalSigned ??\n Binary.fromHex(accountGenesis).asBytes();\n\n const qrPayload = merkleizer\n ? createQrProofedTransaction(\n VaultQrEncryption.Sr25519,\n publicKey,\n merkleizer.getProofForExtrinsicParts(\n callData,\n mergeUint8(extra),\n mergeUint8(additionalSigned)\n ),\n callData,\n extensions,\n genesis\n )\n : createQrTransaction(\n VaultQrEncryption.Sr25519,\n publicKey,\n callData,\n extensions,\n genesis\n );\n setTx(qrPayload);\n\n const signature = await firstValueFrom(currentScannedSignature$);\n if (!signature) {\n throw new Error(\"Cancelled\");\n }\n\n const tx = createV4Tx(\n decMeta,\n publicKey,\n // Remove encryption code, we already know it\n signature.slice(1),\n extra,\n callData,\n // TODO schema?\n \"Sr25519\"\n );\n\n return tx;\n },\n };\n };\n\n const accountInfoToAccount = (\n info: VaultAccountInfo\n ): PolkadotVaultAccount => ({\n provider: polkadotVaultProviderId,\n address: info.address,\n genesis: info.genesis,\n signer: createVaultSigner(info),\n });\n\n const accounts$ = vaultAccounts$.pipeState(\n map((accounts) => accounts.map(accountInfoToAccount)),\n withDefault([])\n );\n\n return {\n id: polkadotVaultProviderId,\n serialize: ({ address, genesis, provider }) => ({\n address,\n provider,\n extra: genesis,\n }),\n deserialize: (account) =>\n firstValueFrom(\n vaultAccounts$.pipe(\n map(\n (accounts) =>\n accounts.find(\n (acc) =>\n addrEq(acc.address, account.address) &&\n acc.genesis === account.extra\n ) ?? null\n ),\n map((info): PolkadotVaultAccount | null =>\n info ? accountInfoToAccount(info) : null\n )\n )\n ),\n accounts$,\n activeTx$,\n cancelTx,\n setSignature,\n setTx,\n setAccounts: setVaultAccounts,\n addAccount: (account) => {\n const accountKey = `${account.address}:${account.genesis}`;\n setVaultAccounts((oldAccounts) => {\n if (\n oldAccounts.some(\n (acc) => `${acc.address}:${acc.genesis}` === accountKey\n )\n )\n return oldAccounts;\n return [...oldAccounts, account];\n });\n return accountInfoToAccount(account);\n },\n removeAccount: (account) =>\n setVaultAccounts((v) =>\n v.filter((acc) => acc.address !== account.address)\n ),\n };\n};\n\n// https://github.com/novasamatech/parity-signer/blob/738e34f0b60f86b718267cfe1ca766bd291640ed/docs/src/development/UOS.md\nconst VAULT_QR_HEADER = new Uint8Array([0x53]);\nenum VaultQrEncryption {\n Ed25519 = 0x00,\n Sr25519 = 0x01,\n Ecdsa = 0x02,\n Unsigned = 0xff,\n}\nenum VaultQrPayloadType {\n LegacyTx = 0x00,\n Tx = 0x02,\n Message = 0x03,\n BulkTx = 0x04,\n ProofTx = 0x06,\n LoadMetadataUpdate = 0x80,\n LoadTypesUpdate = 0x81,\n AddSpecsUpdate = 0xc1,\n DerivationsImport = 0xce,\n}\n\nconst createQrTransaction = (\n encryption: VaultQrEncryption,\n publicKey: Uint8Array,\n callData: Uint8Array,\n extensions: Uint8Array,\n genesisHash: Uint8Array\n) =>\n mergeUint8([\n VAULT_QR_HEADER,\n new Uint8Array([encryption]),\n new Uint8Array([VaultQrPayloadType.Tx]),\n publicKey,\n compact.enc(callData.length),\n callData,\n extensions,\n genesisHash,\n ]);\n\nconst createQrProofedTransaction = (\n encryption: VaultQrEncryption,\n publicKey: Uint8Array,\n metadataProof: Uint8Array,\n callData: Uint8Array,\n extensions: Uint8Array,\n genesisHash: Uint8Array\n) =>\n mergeUint8([\n VAULT_QR_HEADER,\n new Uint8Array([encryption]),\n new Uint8Array([VaultQrPayloadType.ProofTx]),\n publicKey,\n metadataProof,\n compact.enc(callData.length),\n callData,\n extensions,\n genesisHash,\n ]);\n\nconst createQrMessage = (\n encrpytion: VaultQrEncryption,\n publicKey: Uint8Array,\n data: Uint8Array,\n genesisHash: Uint8Array\n) =>\n mergeUint8([\n VAULT_QR_HEADER,\n new Uint8Array([encrpytion]),\n new Uint8Array([VaultQrPayloadType.Message]),\n publicKey,\n mergeUint8([\n Binary.fromText(\"<Bytes>\").asBytes(),\n data,\n Binary.fromText(\"</Bytes>\").asBytes(),\n ]),\n genesisHash,\n ]);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sources":["../src/provider.ts"],"sourcesContent":["import { createV4Tx } from \"@polkadot-api/signers-common\";\nimport {\n compact,\n decAnyMetadata,\n unifyMetadata,\n} from \"@polkadot-api/substrate-bindings\";\nimport {\n Account,\n AccountAddress,\n addrEq,\n localStorageProvider,\n persistedState,\n PersistenceProvider,\n Plugin,\n} from \"@polkahub/plugin\";\nimport { DefaultedStateObservable, state, withDefault } from \"@react-rxjs/core\";\nimport { createSignal } from \"@react-rxjs/utils\";\nimport {\n Binary,\n getSs58AddressInfo,\n HexString,\n PolkadotSigner,\n} from \"polkadot-api\";\nimport { mergeUint8 } from \"polkadot-api/utils\";\nimport { firstValueFrom, map, merge, race } from \"rxjs\";\nimport {\n merkleizeMetadata,\n MetadataMerkleizer,\n} from \"@polkadot-api/merkleize-metadata\";\n\nexport const polkadotVaultProviderId = \"polkadot-vault\";\nexport interface VaultAccountInfo {\n address: AccountAddress;\n genesis: HexString;\n}\nexport interface PolkadotVaultAccount extends Account {\n provider: \"polkadot-vault\";\n genesis: HexString;\n}\n\nexport interface PolkadotVaultProvider extends Plugin<PolkadotVaultAccount> {\n id: \"polkadot-vault\";\n accounts$: DefaultedStateObservable<PolkadotVaultAccount[]>;\n\n setAccounts: (payload: VaultAccountInfo[]) => void;\n addAccount: (payload: VaultAccountInfo) => PolkadotVaultAccount;\n removeAccount: (payload: VaultAccountInfo) => void;\n\n activeTx$: DefaultedStateObservable<Uint8Array<ArrayBufferLike> | null>;\n setTx: (payload: Uint8Array<ArrayBufferLike>) => void;\n setSignature: (payload: Uint8Array<ArrayBufferLike>) => void;\n cancelTx: () => void;\n}\n\nexport type NetworkInfo = {\n decimals: number;\n tokenSymbol: string;\n};\n\nexport const createPolkadotVaultProvider = (\n opts?: Partial<{\n persist: PersistenceProvider;\n getNetworkInfo: () => Promise<NetworkInfo>;\n }>\n): PolkadotVaultProvider => {\n const { persist, getNetworkInfo } = {\n persist: localStorageProvider(polkadotVaultProviderId),\n ...opts,\n };\n\n const [vaultAccounts$, setVaultAccounts] = persistedState(\n persist,\n [] as VaultAccountInfo[]\n );\n\n const [newTx$, setTx] = createSignal<Uint8Array>();\n const [scannedSignature$, setSignature] = createSignal<Uint8Array>();\n const [cancelledTx$, cancelTx] = createSignal();\n\n const activeTx$ = state(\n merge(newTx$, merge(scannedSignature$, cancelledTx$).pipe(map(() => null))),\n null\n );\n const currentScannedSignature$ = race(\n scannedSignature$,\n merge(newTx$, cancelledTx$).pipe(map(() => null))\n );\n\n const createVaultSigner = ({\n address,\n genesis: accountGenesis,\n }: VaultAccountInfo): PolkadotSigner => {\n const info = getSs58AddressInfo(address);\n if (!info.isValid) {\n throw new Error(\"Invalid SS58 address \" + address);\n }\n\n const publicKey = info.publicKey;\n\n return {\n publicKey,\n async signBytes(data) {\n const qrPayload = createQrMessage(\n VaultQrEncryption.Sr25519,\n publicKey,\n data,\n Binary.fromHex(accountGenesis)\n );\n setTx(qrPayload);\n\n const signature = await firstValueFrom(currentScannedSignature$);\n if (!signature) {\n throw new Error(\"Cancelled\");\n }\n\n return signature;\n },\n async signTx(callData, signedExtensions, metadata) {\n let merkleizer: MetadataMerkleizer | null = null;\n const decMeta = unifyMetadata(decAnyMetadata(metadata));\n const extra: Array<Uint8Array> = [];\n const additionalSigned: Array<Uint8Array> = [];\n // TODO use the best version\n for (const { identifier } of decMeta.extrinsic.signedExtensions[0]) {\n if (identifier === \"CheckMetadataHash\") {\n if (getNetworkInfo) {\n merkleizer = merkleizeMetadata(metadata, await getNetworkInfo());\n extra.push(Uint8Array.from([1]));\n additionalSigned.push(\n mergeUint8([Uint8Array.from([1]), merkleizer.digest()])\n );\n continue;\n } else {\n console.warn(\n \"The chain supports `CheckMetadataHash`, but `getNetworkInfo` was not provided. Polkadot Vault will need the whole metadata downloaded beforehand.\"\n );\n }\n }\n const signedExtension = signedExtensions[identifier];\n if (!signedExtension)\n throw new Error(`Missing ${identifier} signed extension`);\n extra.push(signedExtension.value);\n additionalSigned.push(signedExtension.additionalSigned);\n }\n const extensions = mergeUint8([...extra, ...additionalSigned]);\n\n const genesis =\n signedExtensions.CheckGenesis?.additionalSigned ??\n Binary.fromHex(accountGenesis);\n\n const qrPayload = merkleizer\n ? createQrProofedTransaction(\n VaultQrEncryption.Sr25519,\n publicKey,\n merkleizer.getProofForExtrinsicParts(\n callData,\n mergeUint8(extra),\n mergeUint8(additionalSigned)\n ),\n callData,\n extensions,\n genesis\n )\n : createQrTransaction(\n VaultQrEncryption.Sr25519,\n publicKey,\n callData,\n extensions,\n genesis\n );\n setTx(qrPayload);\n\n const signature = await firstValueFrom(currentScannedSignature$);\n if (!signature) {\n throw new Error(\"Cancelled\");\n }\n\n const tx = createV4Tx(\n decMeta,\n publicKey,\n // Remove encryption code, we already know it\n signature.slice(1),\n extra,\n callData,\n // TODO schema?\n \"Sr25519\"\n );\n\n return tx;\n },\n };\n };\n\n const accountInfoToAccount = (\n info: VaultAccountInfo\n ): PolkadotVaultAccount => ({\n provider: polkadotVaultProviderId,\n address: info.address,\n genesis: info.genesis,\n signer: createVaultSigner(info),\n });\n\n const accounts$ = vaultAccounts$.pipeState(\n map((accounts) => accounts.map(accountInfoToAccount)),\n withDefault([])\n );\n\n return {\n id: polkadotVaultProviderId,\n serialize: ({ address, genesis, provider }) => ({\n address,\n provider,\n extra: genesis,\n }),\n deserialize: (account) =>\n firstValueFrom(\n vaultAccounts$.pipe(\n map(\n (accounts) =>\n accounts.find(\n (acc) =>\n addrEq(acc.address, account.address) &&\n acc.genesis === account.extra\n ) ?? null\n ),\n map((info): PolkadotVaultAccount | null =>\n info ? accountInfoToAccount(info) : null\n )\n )\n ),\n accounts$,\n activeTx$,\n cancelTx,\n setSignature,\n setTx,\n setAccounts: setVaultAccounts,\n addAccount: (account) => {\n const accountKey = `${account.address}:${account.genesis}`;\n setVaultAccounts((oldAccounts) => {\n if (\n oldAccounts.some(\n (acc) => `${acc.address}:${acc.genesis}` === accountKey\n )\n )\n return oldAccounts;\n return [...oldAccounts, account];\n });\n return accountInfoToAccount(account);\n },\n removeAccount: (account) =>\n setVaultAccounts((v) =>\n v.filter((acc) => acc.address !== account.address)\n ),\n };\n};\n\n// https://github.com/novasamatech/parity-signer/blob/738e34f0b60f86b718267cfe1ca766bd291640ed/docs/src/development/UOS.md\nconst VAULT_QR_HEADER = new Uint8Array([0x53]);\nenum VaultQrEncryption {\n Ed25519 = 0x00,\n Sr25519 = 0x01,\n Ecdsa = 0x02,\n Unsigned = 0xff,\n}\nenum VaultQrPayloadType {\n LegacyTx = 0x00,\n Tx = 0x02,\n Message = 0x03,\n BulkTx = 0x04,\n ProofTx = 0x06,\n LoadMetadataUpdate = 0x80,\n LoadTypesUpdate = 0x81,\n AddSpecsUpdate = 0xc1,\n DerivationsImport = 0xce,\n}\n\nconst createQrTransaction = (\n encryption: VaultQrEncryption,\n publicKey: Uint8Array,\n callData: Uint8Array,\n extensions: Uint8Array,\n genesisHash: Uint8Array\n) =>\n mergeUint8([\n VAULT_QR_HEADER,\n new Uint8Array([encryption]),\n new Uint8Array([VaultQrPayloadType.Tx]),\n publicKey,\n compact.enc(callData.length),\n callData,\n extensions,\n genesisHash,\n ]);\n\nconst createQrProofedTransaction = (\n encryption: VaultQrEncryption,\n publicKey: Uint8Array,\n metadataProof: Uint8Array,\n callData: Uint8Array,\n extensions: Uint8Array,\n genesisHash: Uint8Array\n) =>\n mergeUint8([\n VAULT_QR_HEADER,\n new Uint8Array([encryption]),\n new Uint8Array([VaultQrPayloadType.ProofTx]),\n publicKey,\n metadataProof,\n compact.enc(callData.length),\n callData,\n extensions,\n genesisHash,\n ]);\n\nconst createQrMessage = (\n encrpytion: VaultQrEncryption,\n publicKey: Uint8Array,\n data: Uint8Array,\n genesisHash: Uint8Array\n) =>\n mergeUint8([\n VAULT_QR_HEADER,\n new Uint8Array([encrpytion]),\n new Uint8Array([VaultQrPayloadType.Message]),\n publicKey,\n mergeUint8([Binary.fromText(\"<Bytes>\"), data, Binary.fromText(\"</Bytes>\")]),\n genesisHash,\n ]);\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { AccountAddress, Account, Plugin, PersistenceProvider } from '@polkahub/plugin';
1
+ import { Account, Plugin, AccountAddress, PersistenceProvider } from '@polkahub/plugin';
2
2
  import { DefaultedStateObservable } from '@react-rxjs/core';
3
3
  import { HexString } from 'polkadot-api';
4
4
  import { FC } from 'react';
package/package.json CHANGED
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "name": "@polkahub/vault",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
+ "author": "Victor Oliva (https://github.com/voliva)",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/polkadot-api/polkahub.git"
8
+ },
4
9
  "license": "MIT",
5
10
  "sideEffects": false,
6
11
  "type": "module",
@@ -23,29 +28,28 @@
23
28
  "index.css"
24
29
  ],
25
30
  "dependencies": {
26
- "@polkadot-api/merkleize-metadata": "^1.1.27",
27
- "@polkadot-api/signers-common": "^0.1.18",
28
- "@polkadot-api/substrate-bindings": "^0.16.5",
31
+ "@polkadot-api/merkleize-metadata": "^1.1.31",
32
+ "@polkadot-api/signers-common": "^0.1.22",
33
+ "@polkadot-api/substrate-bindings": "^0.19.0",
29
34
  "@react-rxjs/core": "^0.10.8",
30
35
  "@react-rxjs/utils": "^0.9.7",
31
- "lucide-react": "^0.554.0",
32
- "polkadot-api": "^1.20.7",
36
+ "lucide-react": "^0.575.0",
37
+ "polkadot-api": "^2.0.0-rc.2",
33
38
  "rxjs": "^7.8.2",
34
- "@polkahub/plugin": "0.3.2",
35
- "@polkahub/select-account": "0.3.2",
36
- "@polkahub/ui-components": "0.3.2",
37
- "@polkahub/context": "0.3.2"
39
+ "@polkahub/context": "0.5.0",
40
+ "@polkahub/ui-components": "0.5.0",
41
+ "@polkahub/plugin": "0.5.0",
42
+ "@polkahub/select-account": "0.5.0"
38
43
  },
39
44
  "peerDependencies": {
40
45
  "@types/react": "^19.2.2",
41
46
  "react": "^19.2.0"
42
47
  },
43
48
  "devDependencies": {
44
- "@types/react": "^19.2.6",
45
- "react": "^19.2.0"
49
+ "@types/react": "^19.2.14",
50
+ "react": "^19.2.4"
46
51
  },
47
52
  "scripts": {
48
- "build": "tsc -b && rollup -c ../../rollup.config.js",
49
- "lint": "eslint ."
53
+ "build": "tsc -b && rollup -c ../../rollup.config.js"
50
54
  }
51
55
  }