@polkahub/ledger 0.5.1 → 0.7.1
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/ManageLedger.js.map +1 -1
- package/dist/provider.js +2 -7
- package/dist/provider.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/package.json +12 -12
package/dist/ManageLedger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManageLedger.js","sources":["../src/ManageLedger.tsx"],"sourcesContent":["import {\n AddressBalance,\n AddressIdentity,\n externalizePlugin,\n ModalContext,\n usePlugin,\n} from \"@polkahub/context\";\nimport { useSetSelectedAccount } from \"@polkahub/select-account\";\nimport {\n Button,\n CardPlaceholder,\n Checkbox,\n SourceButton,\n} from \"@polkahub/ui-components\";\nimport { state, useStateObservable } from \"@react-rxjs/core\";\nimport { createSignal } from \"@react-rxjs/utils\";\nimport {\n ChevronLeft,\n ChevronRight,\n Trash2,\n TriangleAlert,\n Usb,\n} from \"lucide-react\";\nimport { FC, useContext } from \"react\";\nimport {\n catchError,\n concatMap,\n debounceTime,\n filter,\n map,\n Observable,\n startWith,\n switchMap,\n take,\n} from \"rxjs\";\nimport ledgerImg from \"./assets/ledger.webp\";\nimport {\n LedgerAccountInfo,\n LedgerProvider,\n ledgerProviderId,\n} from \"./provider\";\nimport { addrEq } from \"@polkahub/plugin\";\n\nexport const ManageLedger = () => {\n const { pushContent } = useContext(ModalContext)!;\n const ledgerProvider = usePlugin<LedgerProvider>(ledgerProviderId);\n\n return (\n <SourceButton\n label=\"Ledger\"\n onClick={() =>\n pushContent({ title: \"Ledger Accounts\", element: <LedgerAccounts /> })\n }\n disabled={!ledgerProvider}\n >\n <img src={ledgerImg} alt=\"Ledger\" className=\"h-10 rounded\" />\n </SourceButton>\n );\n};\n\nconst LedgerAccounts: FC = () => {\n const { pushContent, popContent } = useContext(ModalContext)!;\n const ledgerProvider = usePlugin<LedgerProvider>(ledgerProviderId)!;\n const ledgerAccounts = useStateObservable(ledgerProvider.accounts$);\n const setAccount = useSetSelectedAccount();\n\n return (\n <div className=\"space-y-4\">\n {ledgerAccounts.length ? (\n <div>\n <h3 className=\"font-medium text-muted-foreground\">Added addresses</h3>\n <ul className=\"space-y-2\">\n {ledgerAccounts.map((acc) => (\n <li\n key={`${acc.address}-${acc.deviceId}-${acc.index}`}\n className=\"flex gap-2 items-center\"\n >\n <Button\n variant=\"outline\"\n className=\"text-destructive\"\n type=\"button\"\n onClick={() => ledgerProvider.removeAccount(acc)}\n >\n <Trash2 />\n </Button>\n <AddressIdentity addr={acc.address} />\n <div className=\"grow\" />\n <AddressBalance addr={acc.address} />\n {setAccount && (\n <Button\n variant=\"secondary\"\n onClick={() => {\n setAccount(acc);\n }}\n >\n Select\n </Button>\n )}\n </li>\n ))}\n </ul>\n </div>\n ) : (\n <div className=\"text-sm text-muted-foreground text-center\">\n No accounts imported\n </div>\n )}\n <div className=\"flex justify-end\">\n <Button\n type=\"button\"\n onClick={() =>\n pushContent({\n title: \"Import Ledger Accounts\",\n element: <ImportAccounts onClose={popContent} />,\n })\n }\n >\n <Usb />\n Import accounts\n </Button>\n </div>\n </div>\n );\n};\n\nconst PAGE_SIZE = 5;\n\nconst [pageChange$, setPage] = createSignal<number>();\nconst page$ = state(pageChange$, 0);\ntype PageAccounts = {\n accounts: Array<LedgerAccountInfo | null>;\n error: string | null;\n};\n\nconst [plugin$, useLedgerProvider] =\n externalizePlugin<LedgerProvider>(ledgerProviderId);\n\nconst pageAccounts$ = state(\n (ctxId: string) =>\n page$.pipe(\n // React might mess it up with a double re-render.\n debounceTime(200),\n map((page) =>\n new Array(PAGE_SIZE).fill(0).map((_, i) => page * PAGE_SIZE + i)\n ),\n concatMap((idxs): Observable<PageAccounts> => {\n const value: PageAccounts = {\n accounts: idxs.map(() => null),\n error: null,\n };\n\n return plugin$(ctxId).pipe(\n filter((v) => v != null),\n take(1),\n switchMap((ledgerProvider) =>\n ledgerProvider.getLedgerAccounts$(idxs)\n ),\n map((account, i) => {\n value.accounts[i] = account;\n\n return { ...value };\n }),\n startWith({ ...value }),\n catchError((ex) => {\n console.error(ex);\n return [\n {\n ...value,\n error: ex.message,\n },\n ];\n })\n );\n })\n ),\n {\n accounts: new Array(PAGE_SIZE).fill(null),\n error: null,\n } as PageAccounts\n);\n\nconst ImportAccounts: FC<{ onClose: () => void }> = ({ onClose }) => {\n const [id, ledgerProvider] = useLedgerProvider();\n const ledgerAccounts = useStateObservable(ledgerProvider!.accounts$);\n const page = useStateObservable(page$);\n const { accounts, error } = useStateObservable(pageAccounts$(id));\n\n const allLoading = accounts.every((v) => v == null);\n const allLoaded = accounts.every((v) => v != null);\n\n const PLACEHOLDER_HEIGHT = 232;\n\n return (\n <div className=\"space-y-2\">\n {error ? (\n <div className=\"space-y-2\" style={{ height: PLACEHOLDER_HEIGHT }}>\n <div className=\"flex items-center gap-1\">\n <TriangleAlert className=\"text-destructive\" />\n <p>Error: {error}</p>\n </div>\n <Button type=\"button\" onClick={() => setPage(page)}>\n Retry\n </Button>\n </div>\n ) : allLoading ? (\n <CardPlaceholder height={PLACEHOLDER_HEIGHT} />\n ) : (\n <ul className=\"space-y-2\">\n {accounts.map((acc, i) => (\n <li key={i} className=\"flex gap-2 items-center\">\n {acc ? (\n <>\n <div className=\"text-xs text-muted-foreground tabular-nums\">\n {acc.index}.\n </div>\n <Checkbox\n checked={ledgerAccounts.some(\n (v) =>\n v.deviceId === acc.deviceId &&\n v.index === acc.index &&\n addrEq(v.address, acc.address)\n )}\n onCheckedChange={(chk) => {\n if (chk) {\n ledgerProvider!.addAccount(acc);\n } else {\n ledgerProvider!.removeAccount(acc);\n }\n }}\n />\n <AddressIdentity addr={acc.address} />\n <div className=\"grow\" />\n <AddressBalance addr={acc.address} />\n </>\n ) : (\n <div className=\"bg-muted w-full rounded shadow animate-pulse h-10\" />\n )}\n </li>\n ))}\n </ul>\n )}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={() => setPage(page - 1)}\n variant=\"secondary\"\n type=\"button\"\n disabled={!allLoaded || page == 0}\n >\n <ChevronLeft />\n Prev\n </Button>\n <Button\n onClick={() => setPage(page + 1)}\n variant=\"secondary\"\n type=\"button\"\n disabled={!allLoaded}\n >\n Next\n <ChevronRight />\n </Button>\n </div>\n <Button onClick={onClose} type=\"button\">\n Done\n </Button>\n </div>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ManageLedger.js","sources":["../src/ManageLedger.tsx"],"sourcesContent":["import {\n AddressBalance,\n AddressIdentity,\n externalizePlugin,\n ModalContext,\n usePlugin,\n} from \"@polkahub/context\"\nimport { useSetSelectedAccount } from \"@polkahub/select-account\"\nimport {\n Button,\n CardPlaceholder,\n Checkbox,\n SourceButton,\n} from \"@polkahub/ui-components\"\nimport { state, useStateObservable } from \"@react-rxjs/core\"\nimport { createSignal } from \"@react-rxjs/utils\"\nimport {\n ChevronLeft,\n ChevronRight,\n Trash2,\n TriangleAlert,\n Usb,\n} from \"lucide-react\"\nimport { FC, useContext } from \"react\"\nimport {\n catchError,\n concatMap,\n debounceTime,\n filter,\n map,\n Observable,\n startWith,\n switchMap,\n take,\n} from \"rxjs\"\nimport ledgerImg from \"./assets/ledger.webp\"\nimport { LedgerAccountInfo, LedgerProvider, ledgerProviderId } from \"./provider\"\nimport { addrEq } from \"@polkahub/plugin\"\n\nexport const ManageLedger = () => {\n const { pushContent } = useContext(ModalContext)!\n const ledgerProvider = usePlugin<LedgerProvider>(ledgerProviderId)\n\n return (\n <SourceButton\n label=\"Ledger\"\n onClick={() =>\n pushContent({ title: \"Ledger Accounts\", element: <LedgerAccounts /> })\n }\n disabled={!ledgerProvider}\n >\n <img src={ledgerImg} alt=\"Ledger\" className=\"h-10 rounded\" />\n </SourceButton>\n )\n}\n\nconst LedgerAccounts: FC = () => {\n const { pushContent, popContent } = useContext(ModalContext)!\n const ledgerProvider = usePlugin<LedgerProvider>(ledgerProviderId)!\n const ledgerAccounts = useStateObservable(ledgerProvider.accounts$)\n const setAccount = useSetSelectedAccount()\n\n return (\n <div className=\"space-y-4\">\n {ledgerAccounts.length ? (\n <div>\n <h3 className=\"font-medium text-muted-foreground\">Added addresses</h3>\n <ul className=\"space-y-2\">\n {ledgerAccounts.map((acc) => (\n <li\n key={`${acc.address}-${acc.deviceId}-${acc.index}`}\n className=\"flex gap-2 items-center\"\n >\n <Button\n variant=\"outline\"\n className=\"text-destructive\"\n type=\"button\"\n onClick={() => ledgerProvider.removeAccount(acc)}\n >\n <Trash2 />\n </Button>\n <AddressIdentity addr={acc.address} />\n <div className=\"grow\" />\n <AddressBalance addr={acc.address} />\n {setAccount && (\n <Button\n variant=\"secondary\"\n onClick={() => {\n setAccount(acc)\n }}\n >\n Select\n </Button>\n )}\n </li>\n ))}\n </ul>\n </div>\n ) : (\n <div className=\"text-sm text-muted-foreground text-center\">\n No accounts imported\n </div>\n )}\n <div className=\"flex justify-end\">\n <Button\n type=\"button\"\n onClick={() =>\n pushContent({\n title: \"Import Ledger Accounts\",\n element: <ImportAccounts onClose={popContent} />,\n })\n }\n >\n <Usb />\n Import accounts\n </Button>\n </div>\n </div>\n )\n}\n\nconst PAGE_SIZE = 5\n\nconst [pageChange$, setPage] = createSignal<number>()\nconst page$ = state(pageChange$, 0)\ntype PageAccounts = {\n accounts: Array<LedgerAccountInfo | null>\n error: string | null\n}\n\nconst [plugin$, useLedgerProvider] =\n externalizePlugin<LedgerProvider>(ledgerProviderId)\n\nconst pageAccounts$ = state(\n (ctxId: string) =>\n page$.pipe(\n // React might mess it up with a double re-render.\n debounceTime(200),\n map((page) =>\n new Array(PAGE_SIZE).fill(0).map((_, i) => page * PAGE_SIZE + i),\n ),\n concatMap((idxs): Observable<PageAccounts> => {\n const value: PageAccounts = {\n accounts: idxs.map(() => null),\n error: null,\n }\n\n return plugin$(ctxId).pipe(\n filter((v) => v != null),\n take(1),\n switchMap((ledgerProvider) =>\n ledgerProvider.getLedgerAccounts$(idxs),\n ),\n map((account, i) => {\n value.accounts[i] = account\n\n return { ...value }\n }),\n startWith({ ...value }),\n catchError((ex) => {\n console.error(ex)\n return [\n {\n ...value,\n error: ex.message,\n },\n ]\n }),\n )\n }),\n ),\n {\n accounts: new Array(PAGE_SIZE).fill(null),\n error: null,\n } as PageAccounts,\n)\n\nconst ImportAccounts: FC<{ onClose: () => void }> = ({ onClose }) => {\n const [id, ledgerProvider] = useLedgerProvider()\n const ledgerAccounts = useStateObservable(ledgerProvider!.accounts$)\n const page = useStateObservable(page$)\n const { accounts, error } = useStateObservable(pageAccounts$(id))\n\n const allLoading = accounts.every((v) => v == null)\n const allLoaded = accounts.every((v) => v != null)\n\n const PLACEHOLDER_HEIGHT = 232\n\n return (\n <div className=\"space-y-2\">\n {error ? (\n <div className=\"space-y-2\" style={{ height: PLACEHOLDER_HEIGHT }}>\n <div className=\"flex items-center gap-1\">\n <TriangleAlert className=\"text-destructive\" />\n <p>Error: {error}</p>\n </div>\n <Button type=\"button\" onClick={() => setPage(page)}>\n Retry\n </Button>\n </div>\n ) : allLoading ? (\n <CardPlaceholder height={PLACEHOLDER_HEIGHT} />\n ) : (\n <ul className=\"space-y-2\">\n {accounts.map((acc, i) => (\n <li key={i} className=\"flex gap-2 items-center\">\n {acc ? (\n <>\n <div className=\"text-xs text-muted-foreground tabular-nums\">\n {acc.index}.\n </div>\n <Checkbox\n checked={ledgerAccounts.some(\n (v) =>\n v.deviceId === acc.deviceId &&\n v.index === acc.index &&\n addrEq(v.address, acc.address),\n )}\n onCheckedChange={(chk) => {\n if (chk) {\n ledgerProvider!.addAccount(acc)\n } else {\n ledgerProvider!.removeAccount(acc)\n }\n }}\n />\n <AddressIdentity addr={acc.address} />\n <div className=\"grow\" />\n <AddressBalance addr={acc.address} />\n </>\n ) : (\n <div className=\"bg-muted w-full rounded shadow animate-pulse h-10\" />\n )}\n </li>\n ))}\n </ul>\n )}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={() => setPage(page - 1)}\n variant=\"secondary\"\n type=\"button\"\n disabled={!allLoaded || page == 0}\n >\n <ChevronLeft />\n Prev\n </Button>\n <Button\n onClick={() => setPage(page + 1)}\n variant=\"secondary\"\n type=\"button\"\n disabled={!allLoaded}\n >\n Next\n <ChevronRight />\n </Button>\n </div>\n <Button onClick={onClose} type=\"button\">\n Done\n </Button>\n </div>\n </div>\n )\n}\n"],"names":[],"mappings":"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"}
|
package/dist/provider.js
CHANGED
|
@@ -44,15 +44,10 @@ const createLedgerProvider = (createTransport, getNetworkInfo, opts) => {
|
|
|
44
44
|
const createLedgerSigner = (account) => {
|
|
45
45
|
const publicKey = AccountId().enc(account.address);
|
|
46
46
|
const operateWithSigner = async (cb) => {
|
|
47
|
-
const { ledgerSigner, close } = await initializeLedgerSigner(
|
|
48
|
-
createTransport
|
|
49
|
-
);
|
|
47
|
+
const { ledgerSigner, close } = await initializeLedgerSigner(createTransport);
|
|
50
48
|
try {
|
|
51
49
|
const info = await getNetworkInfo();
|
|
52
|
-
const signer = await ledgerSigner.getPolkadotSigner(
|
|
53
|
-
info,
|
|
54
|
-
account.index
|
|
55
|
-
);
|
|
50
|
+
const signer = await ledgerSigner.getPolkadotSigner(info, account.index);
|
|
56
51
|
if (!pkAreEq(publicKey, signer.publicKey)) {
|
|
57
52
|
throw new Error("Device mismatch");
|
|
58
53
|
}
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sources":["../src/provider.ts"],"sourcesContent":["import type Transport from \"@ledgerhq/hw-transport\";\nimport { LedgerSigner } from \"@polkadot-api/ledger-signer\";\nimport {\n Account,\n AccountAddress,\n localStorageProvider,\n persistedState,\n PersistenceProvider,\n Plugin,\n} from \"@polkahub/plugin\";\nimport { DefaultedStateObservable, withDefault } from \"@react-rxjs/core\";\nimport { AccountId, type PolkadotSigner } from \"polkadot-api\";\nimport {\n catchError,\n combineLatest,\n concatMap,\n finalize,\n from,\n map,\n Observable,\n switchMap,\n} from \"rxjs\";\n\nexport const ledgerProviderId = \"ledger\";\n\nexport interface LedgerAccountInfo {\n address: AccountAddress;\n deviceId: number;\n index: number;\n}\nexport interface LedgerAccount extends Account {\n provider: \"ledger\";\n deviceId: number;\n index: number;\n}\n\nexport interface LedgerProvider extends Plugin<LedgerAccount> {\n id: \"ledger\";\n accounts$: DefaultedStateObservable<LedgerAccount[]>;\n\n setAccounts: (payload: LedgerAccountInfo[]) => void;\n addAccount: (payload: LedgerAccountInfo) => LedgerAccount;\n removeAccount: (payload: LedgerAccountInfo) => void;\n\n getLedgerAccounts$: (idx: Array<number>) => Observable<LedgerAccountInfo>;\n}\n\nexport type NetworkInfo = {\n decimals: number;\n tokenSymbol: string;\n};\n\nexport const createLedgerProvider = (\n createTransport: () => Promise<Transport>,\n getNetworkInfo: () => Promise<NetworkInfo>,\n opts?: Partial<{\n persist: PersistenceProvider;\n }>\n): LedgerProvider => {\n const { persist } = {\n persist: localStorageProvider(\"ledger-acc\"),\n ...opts,\n };\n let ss58Format = 42;\n\n const [ledgerAccounts$, setLedgerAccounts] = persistedState(\n persist,\n [] as LedgerAccountInfo[]\n );\n\n const getLedgerAccounts$ = (\n idxs: Array<number>\n ): Observable<LedgerAccountInfo> =>\n from(initializeLedgerSigner(createTransport)).pipe(\n switchMap((ledger) =>\n combineLatest({\n ledger: [ledger],\n deviceId: ledger.ledgerSigner.deviceId(),\n }).pipe(\n catchError((ex) => {\n ledger.close();\n throw ex;\n })\n )\n ),\n switchMap(({ ledger, deviceId }) =>\n from(idxs).pipe(\n concatMap(async (idx) => {\n const pk = await ledger.ledgerSigner.getPubkey(idx);\n return {\n address: AccountId(ss58Format).dec(pk),\n deviceId,\n index: idx,\n };\n }),\n finalize(() => ledger.close())\n )\n )\n );\n\n const createLedgerSigner = (account: LedgerAccountInfo): PolkadotSigner => {\n const publicKey = AccountId().enc(account.address);\n\n const operateWithSigner = async <R>(\n cb: (signer: PolkadotSigner) => Promise<R>\n ) => {\n const { ledgerSigner, close } = await initializeLedgerSigner(\n createTransport\n );\n try {\n const info = await getNetworkInfo();\n\n const signer = await ledgerSigner.getPolkadotSigner(\n info,\n account.index\n );\n if (!pkAreEq(publicKey, signer.publicKey)) {\n throw new Error(\"Device mismatch\");\n }\n\n return await cb(signer);\n } finally {\n close();\n }\n };\n\n return {\n publicKey,\n signBytes: (...args) =>\n operateWithSigner((signer) => signer.signBytes(...args)),\n signTx: (...args) =>\n operateWithSigner((signer) => signer.signTx(...args)),\n };\n };\n\n const toAccount = (info: LedgerAccountInfo): LedgerAccount => ({\n provider: ledgerProviderId,\n ...info,\n signer: createLedgerSigner(info),\n });\n\n const accounts$ = ledgerAccounts$.pipeState(\n map((accounts) => accounts.map(toAccount)),\n withDefault([])\n );\n\n const accountEq = (a: LedgerAccountInfo, b: LedgerAccountInfo) =>\n a.deviceId === b.deviceId && a.index === b.index;\n return {\n id: ledgerProviderId,\n deserialize: (acc) =>\n toAccount({\n address: acc.address,\n deviceId: (acc.extra as LedgerAccountInfo).deviceId,\n index: (acc.extra as LedgerAccountInfo).index,\n }),\n serialize: ({ address, deviceId, index, provider }) => ({\n address,\n provider,\n extra: { deviceId, index },\n }),\n eq: accountEq,\n accounts$,\n setAccounts: setLedgerAccounts,\n addAccount: (account) => {\n setLedgerAccounts((v) => {\n const set = new Set(v);\n set.add(account);\n return [...set];\n });\n return toAccount(account);\n },\n removeAccount: (account) =>\n setLedgerAccounts((v) => v.filter((acc) => !accountEq(acc, account))),\n getLedgerAccounts$,\n receiveContext(context) {\n ss58Format = context.ss58Format;\n },\n };\n};\n\nconst pkAreEq = (a: Uint8Array, b: Uint8Array) => a.every((v, i) => b[i] === v);\n\nexport class AlreadyInUseError extends Error {\n constructor() {\n super(\"Device already in use\");\n }\n}\n\nlet usingLedger = false;\nasync function initializeLedgerSigner(\n createTransport: () => Promise<Transport>\n) {\n if (!globalThis.Buffer) {\n const bufferModule = await import(\"buffer\");\n globalThis.Buffer = bufferModule.default?.Buffer ?? bufferModule.Buffer;\n }\n\n if (usingLedger) throw new AlreadyInUseError();\n usingLedger = true;\n\n let transport: Transport;\n try {\n transport = await createTransport();\n } catch (ex) {\n usingLedger = false;\n throw ex;\n }\n\n const close = () => {\n usingLedger = false;\n transport.close();\n };\n\n try {\n const ledgerSigner = new LedgerSigner(transport);\n return { ledgerSigner, transport, close };\n } catch (ex) {\n close();\n throw ex;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"provider.js","sources":["../src/provider.ts"],"sourcesContent":["import type Transport from \"@ledgerhq/hw-transport\"\nimport { LedgerSigner } from \"@polkadot-api/ledger-signer\"\nimport {\n Account,\n AccountAddress,\n localStorageProvider,\n persistedState,\n PersistenceProvider,\n Plugin,\n} from \"@polkahub/plugin\"\nimport { DefaultedStateObservable, withDefault } from \"@react-rxjs/core\"\nimport { AccountId, type PolkadotSigner } from \"polkadot-api\"\nimport {\n catchError,\n combineLatest,\n concatMap,\n finalize,\n from,\n map,\n Observable,\n switchMap,\n} from \"rxjs\"\n\nexport const ledgerProviderId = \"ledger\"\n\nexport interface LedgerAccountInfo {\n address: AccountAddress\n deviceId: number\n index: number\n}\nexport interface LedgerAccount extends Account {\n provider: \"ledger\"\n deviceId: number\n index: number\n}\n\nexport interface LedgerProvider extends Plugin<LedgerAccount> {\n id: \"ledger\"\n accounts$: DefaultedStateObservable<LedgerAccount[]>\n\n setAccounts: (payload: LedgerAccountInfo[]) => void\n addAccount: (payload: LedgerAccountInfo) => LedgerAccount\n removeAccount: (payload: LedgerAccountInfo) => void\n\n getLedgerAccounts$: (idx: Array<number>) => Observable<LedgerAccountInfo>\n}\n\nexport type NetworkInfo = {\n decimals: number\n tokenSymbol: string\n}\n\nexport const createLedgerProvider = (\n createTransport: () => Promise<Transport>,\n getNetworkInfo: () => Promise<NetworkInfo>,\n opts?: Partial<{\n persist: PersistenceProvider\n }>,\n): LedgerProvider => {\n const { persist } = {\n persist: localStorageProvider(\"ledger-acc\"),\n ...opts,\n }\n let ss58Format = 42\n\n const [ledgerAccounts$, setLedgerAccounts] = persistedState(\n persist,\n [] as LedgerAccountInfo[],\n )\n\n const getLedgerAccounts$ = (\n idxs: Array<number>,\n ): Observable<LedgerAccountInfo> =>\n from(initializeLedgerSigner(createTransport)).pipe(\n switchMap((ledger) =>\n combineLatest({\n ledger: [ledger],\n deviceId: ledger.ledgerSigner.deviceId(),\n }).pipe(\n catchError((ex) => {\n ledger.close()\n throw ex\n }),\n ),\n ),\n switchMap(({ ledger, deviceId }) =>\n from(idxs).pipe(\n concatMap(async (idx) => {\n const pk = await ledger.ledgerSigner.getPubkey(idx)\n return {\n address: AccountId(ss58Format).dec(pk),\n deviceId,\n index: idx,\n }\n }),\n finalize(() => ledger.close()),\n ),\n ),\n )\n\n const createLedgerSigner = (account: LedgerAccountInfo): PolkadotSigner => {\n const publicKey = AccountId().enc(account.address)\n\n const operateWithSigner = async <R>(\n cb: (signer: PolkadotSigner) => Promise<R>,\n ) => {\n const { ledgerSigner, close } =\n await initializeLedgerSigner(createTransport)\n try {\n const info = await getNetworkInfo()\n\n const signer = await ledgerSigner.getPolkadotSigner(info, account.index)\n if (!pkAreEq(publicKey, signer.publicKey)) {\n throw new Error(\"Device mismatch\")\n }\n\n return await cb(signer)\n } finally {\n close()\n }\n }\n\n return {\n publicKey,\n signBytes: (...args) =>\n operateWithSigner((signer) => signer.signBytes(...args)),\n signTx: (...args) =>\n operateWithSigner((signer) => signer.signTx(...args)),\n }\n }\n\n const toAccount = (info: LedgerAccountInfo): LedgerAccount => ({\n provider: ledgerProviderId,\n ...info,\n signer: createLedgerSigner(info),\n })\n\n const accounts$ = ledgerAccounts$.pipeState(\n map((accounts) => accounts.map(toAccount)),\n withDefault([]),\n )\n\n const accountEq = (a: LedgerAccountInfo, b: LedgerAccountInfo) =>\n a.deviceId === b.deviceId && a.index === b.index\n return {\n id: ledgerProviderId,\n deserialize: (acc) =>\n toAccount({\n address: acc.address,\n deviceId: (acc.extra as LedgerAccountInfo).deviceId,\n index: (acc.extra as LedgerAccountInfo).index,\n }),\n serialize: ({ address, deviceId, index, provider }) => ({\n address,\n provider,\n extra: { deviceId, index },\n }),\n eq: accountEq,\n accounts$,\n setAccounts: setLedgerAccounts,\n addAccount: (account) => {\n setLedgerAccounts((v) => {\n const set = new Set(v)\n set.add(account)\n return [...set]\n })\n return toAccount(account)\n },\n removeAccount: (account) =>\n setLedgerAccounts((v) => v.filter((acc) => !accountEq(acc, account))),\n getLedgerAccounts$,\n receiveContext(context) {\n ss58Format = context.ss58Format\n },\n }\n}\n\nconst pkAreEq = (a: Uint8Array, b: Uint8Array) => a.every((v, i) => b[i] === v)\n\nexport class AlreadyInUseError extends Error {\n constructor() {\n super(\"Device already in use\")\n }\n}\n\nlet usingLedger = false\nasync function initializeLedgerSigner(\n createTransport: () => Promise<Transport>,\n) {\n if (!(globalThis as any).Buffer) {\n const bufferModule = await import(\"buffer\")\n ;(globalThis as any).Buffer =\n bufferModule.default?.Buffer ?? bufferModule.Buffer\n }\n\n if (usingLedger) throw new AlreadyInUseError()\n usingLedger = true\n\n let transport: Transport\n try {\n transport = await createTransport()\n } catch (ex) {\n usingLedger = false\n throw ex\n }\n\n const close = () => {\n usingLedger = false\n transport.close()\n }\n\n try {\n const ledgerSigner = new LedgerSigner(transport)\n return { ledgerSigner, transport, close }\n } catch (ex) {\n close()\n throw ex\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react from 'react';
|
|
2
2
|
import Transport from '@ledgerhq/hw-transport';
|
|
3
3
|
import { Account, AccountAddress, Plugin, PersistenceProvider } from '@polkahub/plugin';
|
|
4
4
|
import { DefaultedStateObservable } from '@react-rxjs/core';
|
|
5
5
|
import { Observable } from 'rxjs';
|
|
6
6
|
|
|
7
|
-
declare const ManageLedger: () =>
|
|
7
|
+
declare const ManageLedger: () => react.JSX.Element;
|
|
8
8
|
|
|
9
9
|
declare const ledgerProviderId = "ledger";
|
|
10
10
|
interface LedgerAccountInfo {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polkahub/ledger",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"author": "Victor Oliva (https://github.com/voliva)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -28,17 +28,17 @@
|
|
|
28
28
|
"index.css"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@polkadot-api/ledger-signer": "^0.
|
|
31
|
+
"@polkadot-api/ledger-signer": "^0.3.3",
|
|
32
|
+
"@polkahub/context": "^*",
|
|
33
|
+
"@polkahub/plugin": "^*",
|
|
34
|
+
"@polkahub/select-account": "^*",
|
|
35
|
+
"@polkahub/ui-components": "^*",
|
|
32
36
|
"@react-rxjs/core": "^0.10.8",
|
|
33
37
|
"@react-rxjs/utils": "^0.9.7",
|
|
34
38
|
"buffer": "^6.0.3",
|
|
35
|
-
"lucide-react": "^
|
|
36
|
-
"polkadot-api": "^2.
|
|
37
|
-
"rxjs": "^7.8.2"
|
|
38
|
-
"@polkahub/context": "0.5.1",
|
|
39
|
-
"@polkahub/plugin": "0.5.1",
|
|
40
|
-
"@polkahub/select-account": "0.5.1",
|
|
41
|
-
"@polkahub/ui-components": "0.5.1"
|
|
39
|
+
"lucide-react": "^1.23.0",
|
|
40
|
+
"polkadot-api": "^2.1.7",
|
|
41
|
+
"rxjs": "^7.8.2"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"@ledgerhq/hw-transport": "^6.33.0",
|
|
@@ -46,9 +46,9 @@
|
|
|
46
46
|
"react": "^19.2.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@ledgerhq/hw-transport": "^6.
|
|
50
|
-
"@types/react": "^19.2.
|
|
51
|
-
"react": "^19.2.
|
|
49
|
+
"@ledgerhq/hw-transport": "^6.35.5",
|
|
50
|
+
"@types/react": "^19.2.17",
|
|
51
|
+
"react": "^19.2.7"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"build": "tsc -b && rollup -c ../../rollup.config.js"
|