@polkahub/vault 0.1.0 → 0.2.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.
package/dist/provider.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { createV4Tx } from '@polkadot-api/signers-common';
2
2
  import { unifyMetadata, decAnyMetadata, compact } from '@polkadot-api/substrate-bindings';
3
- import { localStorageProvider, persistedState } from '@polkahub/plugin';
3
+ import { localStorageProvider, persistedState, addrEq } from '@polkahub/plugin';
4
4
  import { state, withDefault } from '@react-rxjs/core';
5
5
  import { createSignal } from '@react-rxjs/utils';
6
6
  import { getSs58AddressInfo, Binary } from 'polkadot-api';
@@ -113,7 +113,7 @@ const createPolkadotVaultProvider = (opts) => {
113
113
  vaultAccounts$.pipe(
114
114
  map(
115
115
  (accounts) => accounts.find(
116
- (acc) => acc.address === account.address && acc.genesis === account.extra
116
+ (acc) => addrEq(acc.address, account.address) && acc.genesis === account.extra
117
117
  ) ?? null
118
118
  ),
119
119
  map(
@@ -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 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\";\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 const createPolkadotVaultProvider = (\n opts?: Partial<{\n persist: PersistenceProvider;\n }>\n): PolkadotVaultProvider => {\n const { persist } = {\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 const decMeta = unifyMetadata(decAnyMetadata(metadata));\n const extra: Array<Uint8Array> = [];\n const additionalSigned: Array<Uint8Array> = [];\n decMeta.extrinsic.signedExtensions.map(({ identifier }) => {\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 = 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 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 LoadMetadataUpdate = 0x80,\n LoadTypesUpdate = 0x81,\n AddSpecsUpdate = 0xc1,\n DerivationsImport = 0xce,\n}\n\nconst createQrTransaction = (\n encrpytion: VaultQrEncryption,\n publicKey: Uint8Array,\n callData: Uint8Array,\n extensions: Uint8Array,\n genesisHash: Uint8Array\n) =>\n mergeUint8([\n VAULT_QR_HEADER,\n new Uint8Array([encrpytion]),\n new Uint8Array([VaultQrPayloadType.Tx]),\n publicKey,\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 compact.enc(data.length),\n data,\n genesisHash,\n ]);\n"],"names":[],"mappings":";;;;;;;;;AAyBO,MAAM,uBAAA,GAA0B;AAwBhC,MAAM,2BAAA,GAA8B,CACzC,IAAA,KAG0B;AAC1B,EAAA,MAAM,EAAE,SAAQ,GAAI;AAAA,IAClB,OAAA,EAAS,qBAAqB,uBAAuB,CAAA;AAAA,IACrD,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,CAAC,cAAA,EAAgB,gBAAgB,CAAA,GAAI,cAAA;AAAA,IACzC,OAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,CAAC,MAAA,EAAQ,KAAK,CAAA,GAAI,YAAA,EAAyB;AACjD,EAAA,MAAM,CAAC,iBAAA,EAAmB,YAAY,CAAA,GAAI,YAAA,EAAyB;AACnE,EAAA,MAAM,CAAC,YAAA,EAAc,QAAQ,CAAA,GAAI,YAAA,EAAa;AAE9C,EAAA,MAAM,SAAA,GAAY,KAAA;AAAA,IAChB,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,iBAAA,EAAmB,YAAY,CAAA,CAAE,IAAA,CAAK,GAAA,CAAI,MAAM,IAAI,CAAC,CAAC,CAAA;AAAA,IAC1E;AAAA,GACF;AACA,EAAA,MAAM,wBAAA,GAA2B,IAAA;AAAA,IAC/B,iBAAA;AAAA,IACA,KAAA,CAAM,QAAQ,YAAY,CAAA,CAAE,KAAK,GAAA,CAAI,MAAM,IAAI,CAAC;AAAA,GAClD;AAEA,EAAA,MAAM,oBAAoB,CAAC;AAAA,IACzB,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX,KAAwC;AACtC,IAAA,MAAM,IAAA,GAAO,mBAAmB,OAAO,CAAA;AACvC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,uBAAA,GAA0B,OAAO,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AAEvB,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,MAAM,UAAU,IAAA,EAAM;AACpB,QAAA,MAAM,SAAA,GAAY,eAAA;AAAA,UAChB,CAAA;AAAA,UACA,SAAA;AAAA,UACA,IAAA;AAAA,UACA,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,CAAE,OAAA;AAAQ,SACzC;AACA,QAAA,KAAA,CAAM,SAAS,CAAA;AAEf,QAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,wBAAwB,CAAA;AAC/D,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAM,IAAI,MAAM,WAAW,CAAA;AAAA,QAC7B;AAEA,QAAA,OAAO,SAAA;AAAA,MACT,CAAA;AAAA,MACA,MAAM,MAAA,CAAO,QAAA,EAAU,gBAAA,EAAkB,QAAA,EAAU;AACjD,QAAA,MAAM,OAAA,GAAU,aAAA,CAAc,cAAA,CAAe,QAAQ,CAAC,CAAA;AACtD,QAAA,MAAM,QAA2B,EAAC;AAClC,QAAA,MAAM,mBAAsC,EAAC;AAC7C,QAAA,OAAA,CAAQ,UAAU,gBAAA,CAAiB,GAAA,CAAI,CAAC,EAAE,YAAW,KAAM;AACzD,UAAA,MAAM,eAAA,GAAkB,iBAAiB,UAAU,CAAA;AACnD,UAAA,IAAI,CAAC,eAAA;AACH,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,UAAU,CAAA,iBAAA,CAAmB,CAAA;AAC1D,UAAA,KAAA,CAAM,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAChC,UAAA,gBAAA,CAAiB,IAAA,CAAK,gBAAgB,gBAAgB,CAAA;AAAA,QACxD,CAAC,CAAA;AACD,QAAA,MAAM,aAAa,UAAA,CAAW,CAAC,GAAG,KAAA,EAAO,GAAG,gBAAgB,CAAC,CAAA;AAE7D,QAAA,MAAM,OAAA,GACJ,iBAAiB,YAAA,EAAc,gBAAA,IAC/B,OAAO,OAAA,CAAQ,cAAc,EAAE,OAAA,EAAQ;AAEzC,QAAA,MAAM,SAAA,GAAY,mBAAA;AAAA,UAChB,CAAA;AAAA,UACA,SAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,KAAA,CAAM,SAAS,CAAA;AAEf,QAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,wBAAwB,CAAA;AAC/D,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAM,IAAI,MAAM,WAAW,CAAA;AAAA,QAC7B;AAEA,QAAA,MAAM,EAAA,GAAK,UAAA;AAAA,UACT,OAAA;AAAA,UACA,SAAA;AAAA;AAAA,UAEA,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,UACjB,KAAA;AAAA,UACA,QAAA;AAAA;AAAA,UAEA;AAAA,SACF;AAEA,QAAA,OAAO,EAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAC3B,IAAA,MAC0B;AAAA,IAC1B,QAAA,EAAU,uBAAA;AAAA,IACV,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,MAAA,EAAQ,kBAAkB,IAAI;AAAA,GAChC,CAAA;AAEA,EAAA,MAAM,YAAY,cAAA,CAAe,SAAA;AAAA,IAC/B,IAAI,CAAC,QAAA,KAAa,QAAA,CAAS,GAAA,CAAI,oBAAoB,CAAC,CAAA;AAAA,IACpD,WAAA,CAAY,EAAE;AAAA,GAChB;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,uBAAA;AAAA,IACJ,WAAW,CAAC,EAAE,OAAA,EAAS,OAAA,EAAS,UAAS,MAAO;AAAA,MAC9C,OAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT,CAAA;AAAA,IACA,WAAA,EAAa,CAAC,OAAA,KACZ,cAAA;AAAA,MACE,cAAA,CAAe,IAAA;AAAA,QACb,GAAA;AAAA,UACE,CAAC,aACC,QAAA,CAAS,IAAA;AAAA,YACP,CAAC,QACC,GAAA,CAAI,OAAA,KAAY,QAAQ,OAAA,IACxB,GAAA,CAAI,YAAY,OAAA,CAAQ;AAAA,WAC5B,IAAK;AAAA,SACT;AAAA,QACA,GAAA;AAAA,UAAI,CAAC,IAAA,KACH,IAAA,GAAO,oBAAA,CAAqB,IAAI,CAAA,GAAI;AAAA;AACtC;AACF,KACF;AAAA,IACF,SAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA,EAAa,gBAAA;AAAA,IACb,UAAA,EAAY,CAAC,OAAA,KAAY;AACvB,MAAA,MAAM,aAAa,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI,QAAQ,OAAO,CAAA,CAAA;AACxD,MAAA,gBAAA,CAAiB,CAAC,WAAA,KAAgB;AAChC,QAAA,IACE,WAAA,CAAY,IAAA;AAAA,UACV,CAAC,QAAQ,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,CAAA,KAAO;AAAA,SAC/C;AAEA,UAAA,OAAO,WAAA;AACT,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA,MACjC,CAAC,CAAA;AACD,MAAA,OAAO,qBAAqB,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,aAAA,EAAe,CAAC,OAAA,KACd,gBAAA;AAAA,MAAiB,CAAC,MAChB,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAA,KAAY,OAAA,CAAQ,OAAO;AAAA;AACnD,GACJ;AACF;AAGA,MAAM,eAAA,GAAkB,IAAI,UAAA,CAAW,CAAC,EAAI,CAAC,CAAA;AAkB7C,MAAM,sBAAsB,CAC1B,UAAA,EACA,WACA,QAAA,EACA,UAAA,EACA,gBAEA,UAAA,CAAW;AAAA,EACT,eAAA;AAAA,EACA,IAAI,UAAA,CAAW,CAAC,UAAU,CAAC,CAAA;AAAA,EAC3B,IAAI,UAAA,CAAW,CAAC,CAAA,UAAsB,CAAA;AAAA,EACtC,SAAA;AAAA,EACA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA;AAAA,EAC3B,QAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEH,MAAM,kBAAkB,CACtB,UAAA,EACA,SAAA,EACA,IAAA,EACA,gBAEA,UAAA,CAAW;AAAA,EACT,eAAA;AAAA,EACA,IAAI,UAAA,CAAW,CAAC,UAAU,CAAC,CAAA;AAAA,EAC3B,IAAI,UAAA,CAAW,CAAC,CAAA,eAA2B,CAAA;AAAA,EAC3C,SAAA;AAAA,EACA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EACvB,IAAA;AAAA,EACA;AACF,CAAC,CAAA;;;;"}
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\";\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 const createPolkadotVaultProvider = (\n opts?: Partial<{\n persist: PersistenceProvider;\n }>\n): PolkadotVaultProvider => {\n const { persist } = {\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 const decMeta = unifyMetadata(decAnyMetadata(metadata));\n const extra: Array<Uint8Array> = [];\n const additionalSigned: Array<Uint8Array> = [];\n decMeta.extrinsic.signedExtensions.map(({ identifier }) => {\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 = 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 LoadMetadataUpdate = 0x80,\n LoadTypesUpdate = 0x81,\n AddSpecsUpdate = 0xc1,\n DerivationsImport = 0xce,\n}\n\nconst createQrTransaction = (\n encrpytion: VaultQrEncryption,\n publicKey: Uint8Array,\n callData: Uint8Array,\n extensions: Uint8Array,\n genesisHash: Uint8Array\n) =>\n mergeUint8([\n VAULT_QR_HEADER,\n new Uint8Array([encrpytion]),\n new Uint8Array([VaultQrPayloadType.Tx]),\n publicKey,\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 compact.enc(data.length),\n data,\n genesisHash,\n ]);\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polkahub/vault",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "license": "MIT",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -30,10 +30,10 @@
30
30
  "lucide-react": "^0.552.0",
31
31
  "polkadot-api": "^1.20.1",
32
32
  "rxjs": "^7.8.2",
33
- "@polkahub/context": "0.1.0",
34
- "@polkahub/plugin": "0.1.0",
35
- "@polkahub/select-account": "0.1.0",
36
- "@polkahub/ui-components": "0.1.0"
33
+ "@polkahub/context": "0.2.0",
34
+ "@polkahub/plugin": "0.2.0",
35
+ "@polkahub/select-account": "0.2.0",
36
+ "@polkahub/ui-components": "0.2.0"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@types/react": "^19.2.2",