@polkahub/ledger 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.
@@ -9,6 +9,7 @@ import { useContext } from 'react';
9
9
  import { debounceTime, map, concatMap, filter, take, switchMap, startWith, catchError } from 'rxjs';
10
10
  import ledgerImg from './assets/ledger.webp.js';
11
11
  import { ledgerProviderId } from './provider.js';
12
+ import { addrEq } from '@polkahub/plugin';
12
13
 
13
14
  const ManageLedger = () => {
14
15
  const { pushContent } = useContext(ModalContext);
@@ -151,7 +152,7 @@ const ImportAccounts = ({ onClose }) => {
151
152
  Checkbox,
152
153
  {
153
154
  checked: ledgerAccounts.some(
154
- (v) => v.deviceId === acc.deviceId && v.index === acc.index && v.address === acc.address
155
+ (v) => v.deviceId === acc.deviceId && v.index === acc.index && addrEq(v.address, acc.address)
155
156
  ),
156
157
  onCheckedChange: (chk) => {
157
158
  if (chk) {
@@ -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\";\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 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 {\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":";;;;;;;;;;;;;AA2CO,MAAM,eAAe,MAAM;AAChC,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,UAAA,CAAW,YAAY,CAAA;AAC/C,EAAA,MAAM,cAAA,GAAiB,UAA0B,gBAAgB,CAAA;AAEjE,EAAA,uBACE,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,MACP,WAAA,CAAY,EAAE,KAAA,EAAO,mBAAmB,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,CAAA,EAAI,CAAA;AAAA,MAEvE,UAAU,CAAC,cAAA;AAAA,MAEX,8BAAC,KAAA,EAAA,EAAI,GAAA,EAAK,WAAW,GAAA,EAAI,QAAA,EAAS,WAAU,cAAA,EAAe;AAAA;AAAA,GAC7D;AAEJ;AAEA,MAAM,iBAAqB,MAAM;AAC/B,EAAA,MAAM,EAAE,WAAA,EAAa,UAAA,EAAW,GAAI,WAAW,YAAY,CAAA;AAC3D,EAAA,MAAM,cAAA,GAAiB,UAA0B,gBAAgB,CAAA;AACjE,EAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,cAAA,CAAe,SAAS,CAAA;AAClE,EAAA,MAAM,aAAa,qBAAA,EAAsB;AAEzC,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,IAAA,cAAA,CAAe,MAAA,wBACb,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,0BAChE,IAAA,EAAA,EAAG,SAAA,EAAU,aACX,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,qBACnB,IAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,yBAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,SAAA;AAAA,gBACR,SAAA,EAAU,kBAAA;AAAA,gBACV,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,cAAA,CAAe,aAAA,CAAc,GAAG,CAAA;AAAA,gBAE/C,8BAAC,MAAA,EAAA,EAAO;AAAA;AAAA,aACV;AAAA,4BACA,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,GAAA,CAAI,OAAA,EAAS,CAAA;AAAA,4BACpC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAO,CAAA;AAAA,4BACtB,GAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,GAAA,CAAI,OAAA,EAAS,CAAA;AAAA,YAClC,UAAA,oBACC,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,WAAA;AAAA,gBACR,SAAS,MAAM;AACb,kBAAA,UAAA,CAAW,GAAG,CAAA;AAAA,gBAChB,CAAA;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,SAAA;AAAA,QAtBG,CAAA,EAAG,IAAI,OAAO,CAAA,CAAA,EAAI,IAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,KAAK,CAAA;AAAA,OAyBnD,CAAA,EACH;AAAA,KAAA,EACF,CAAA,mBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAA4C,QAAA,EAAA,sBAAA,EAE3D,CAAA;AAAA,oBAEF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,kBAAA,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MACP,WAAA,CAAY;AAAA,UACV,KAAA,EAAO,wBAAA;AAAA,UACP,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAS,UAAA,EAAY;AAAA,SAC/C,CAAA;AAAA,QAGH,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,GAAA,EAAA,EAAI,CAAA;AAAA,UAAE;AAAA;AAAA;AAAA,KAET,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AAEA,MAAM,SAAA,GAAY,CAAA;AAElB,MAAM,CAAC,WAAA,EAAa,OAAO,CAAA,GAAI,YAAA,EAAqB;AACpD,MAAM,KAAA,GAAQ,KAAA,CAAM,WAAA,EAAa,CAAC,CAAA;AAMlC,MAAM,CAAC,OAAA,EAAS,iBAAiB,CAAA,GAC/B,kBAAkC,gBAAgB,CAAA;AAEpD,MAAM,aAAA,GAAgB,KAAA;AAAA,EACpB,CAAC,UACC,KAAA,CAAM,IAAA;AAAA;AAAA,IAEJ,aAAa,GAAG,CAAA;AAAA,IAChB,GAAA;AAAA,MAAI,CAAC,IAAA,KACH,IAAI,KAAA,CAAM,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,GAAO,YAAY,CAAC;AAAA,KACjE;AAAA,IACA,SAAA,CAAU,CAAC,IAAA,KAAmC;AAC5C,MAAA,MAAM,KAAA,GAAsB;AAAA,QAC1B,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,QAC7B,KAAA,EAAO;AAAA,OACT;AAEA,MAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,IAAA;AAAA,QACpB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,IAAI,CAAA;AAAA,QACvB,KAAK,CAAC,CAAA;AAAA,QACN,SAAA;AAAA,UAAU,CAAC,cAAA,KACT,cAAA,CAAe,kBAAA,CAAmB,IAAI;AAAA,SACxC;AAAA,QACA,GAAA,CAAI,CAAC,OAAA,EAAS,CAAA,KAAM;AAClB,UAAA,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,GAAI,OAAA;AAEpB,UAAA,OAAO,EAAE,GAAG,KAAA,EAAM;AAAA,QACpB,CAAC,CAAA;AAAA,QACD,SAAA,CAAU,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,QACtB,UAAA,CAAW,CAAC,EAAA,KAAO;AACjB,UAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAChB,UAAA,OAAO;AAAA,YACL;AAAA,cACE,GAAG,KAAA;AAAA,cACH,OAAO,EAAA,CAAG;AAAA;AACZ,WACF;AAAA,QACF,CAAC;AAAA,OACH;AAAA,IACF,CAAC;AAAA,GACH;AAAA,EACF;AAAA,IACE,UAAU,IAAI,KAAA,CAAM,SAAS,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IACxC,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,MAAM,cAAA,GAA8C,CAAC,EAAE,OAAA,EAAQ,KAAM;AACnE,EAAA,MAAM,CAAC,EAAA,EAAI,cAAc,CAAA,GAAI,iBAAA,EAAkB;AAC/C,EAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,cAAA,CAAgB,SAAS,CAAA;AACnE,EAAA,MAAM,IAAA,GAAO,mBAAmB,KAAK,CAAA;AACrC,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,KAAU,kBAAA,CAAmB,aAAA,CAAc,EAAE,CAAC,CAAA;AAEhE,EAAA,MAAM,aAAa,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,KAAM,KAAK,IAAI,CAAA;AAClD,EAAA,MAAM,YAAY,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,KAAM,KAAK,IAAI,CAAA;AAEjD,EAAA,MAAM,kBAAA,GAAqB,GAAA;AAE3B,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,mBACC,IAAA,CAAC,SAAI,SAAA,EAAU,WAAA,EAAY,OAAO,EAAE,MAAA,EAAQ,oBAAmB,EAC7D,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,WAAU,kBAAA,EAAmB,CAAA;AAAA,6BAC3C,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UAAQ;AAAA,SAAA,EAAM;AAAA,OAAA,EACnB,CAAA;AAAA,sBACA,GAAA,CAAC,UAAO,IAAA,EAAK,QAAA,EAAS,SAAS,MAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,QAAA,EAAA,OAAA,EAEpD;AAAA,KAAA,EACF,CAAA,GACE,6BACF,GAAA,CAAC,eAAA,EAAA,EAAgB,QAAQ,kBAAA,EAAoB,CAAA,uBAE5C,IAAA,EAAA,EAAG,SAAA,EAAU,aACX,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,yBACjB,IAAA,EAAA,EAAW,SAAA,EAAU,yBAAA,EACnB,QAAA,EAAA,GAAA,mBACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4CAAA,EACZ,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,KAAA;AAAA,QAAM;AAAA,OAAA,EACb,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAS,cAAA,CAAe,IAAA;AAAA,YACtB,CAAC,CAAA,KACC,CAAA,CAAE,QAAA,KAAa,IAAI,QAAA,IACnB,CAAA,CAAE,KAAA,KAAU,GAAA,CAAI,KAAA,IAChB,MAAA,CAAO,CAAA,CAAE,OAAA,EAAS,IAAI,OAAO;AAAA,WACjC;AAAA,UACA,eAAA,EAAiB,CAAC,GAAA,KAAQ;AACxB,YAAA,IAAI,GAAA,EAAK;AACP,cAAA,cAAA,CAAgB,WAAW,GAAG,CAAA;AAAA,YAChC,CAAA,MAAO;AACL,cAAA,cAAA,CAAgB,cAAc,GAAG,CAAA;AAAA,YACnC;AAAA,UACF;AAAA;AAAA,OACF;AAAA,sBACA,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,GAAA,CAAI,OAAA,EAAS,CAAA;AAAA,sBACpC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAO,CAAA;AAAA,sBACtB,GAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,GAAA,CAAI,OAAA,EAAS;AAAA,KAAA,EACrC,CAAA,uBAEC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAoD,CAAA,EAAA,EA1B9D,CA4BT,CACD,CAAA,EACH,CAAA;AAAA,oBAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAA,GAAO,CAAC,CAAA;AAAA,YAC/B,OAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,CAAC,SAAA,IAAa,IAAA,IAAQ,CAAA;AAAA,YAEhC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,WAAA,EAAA,EAAY,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SAEjB;AAAA,wBACA,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAA,GAAO,CAAC,CAAA;AAAA,YAC/B,OAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAK,QAAA;AAAA,YACL,UAAU,CAAC,SAAA;AAAA,YACZ,QAAA,EAAA;AAAA,cAAA,MAAA;AAAA,kCAEE,YAAA,EAAA,EAAa;AAAA;AAAA;AAAA;AAChB,OAAA,EACF,CAAA;AAAA,0BACC,MAAA,EAAA,EAAO,OAAA,EAAS,OAAA,EAAS,IAAA,EAAK,UAAS,QAAA,EAAA,MAAA,EAExC;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;;;;"}
package/dist/provider.js CHANGED
@@ -10,6 +10,7 @@ const createLedgerProvider = (createTransport, getNetworkInfo, opts) => {
10
10
  persist: localStorageProvider("ledger-acc"),
11
11
  ...opts
12
12
  };
13
+ let ss58Format = 42;
13
14
  const [ledgerAccounts$, setLedgerAccounts] = persistedState(
14
15
  persist,
15
16
  []
@@ -18,8 +19,7 @@ const createLedgerProvider = (createTransport, getNetworkInfo, opts) => {
18
19
  switchMap(
19
20
  (ledger) => combineLatest({
20
21
  ledger: [ledger],
21
- deviceId: ledger.ledgerSigner.deviceId(),
22
- ss58Format: getNetworkInfo().then((r) => r.ss58Format)
22
+ deviceId: ledger.ledgerSigner.deviceId()
23
23
  }).pipe(
24
24
  catchError((ex) => {
25
25
  ledger.close();
@@ -28,7 +28,7 @@ const createLedgerProvider = (createTransport, getNetworkInfo, opts) => {
28
28
  )
29
29
  ),
30
30
  switchMap(
31
- ({ ledger, deviceId, ss58Format }) => from(idxs).pipe(
31
+ ({ ledger, deviceId }) => from(idxs).pipe(
32
32
  concatMap(async (idx) => {
33
33
  const pk = await ledger.ledgerSigner.getPubkey(idx);
34
34
  return {
@@ -101,7 +101,10 @@ const createLedgerProvider = (createTransport, getNetworkInfo, opts) => {
101
101
  return toAccount(account);
102
102
  },
103
103
  removeAccount: (account) => setLedgerAccounts((v) => v.filter((acc) => !accountEq(acc, account))),
104
- getLedgerAccounts$
104
+ getLedgerAccounts$,
105
+ receiveContext(context) {
106
+ ss58Format = context.ss58Format;
107
+ }
105
108
  };
106
109
  };
107
110
  const pkAreEq = (a, b) => a.every((v, i) => b[i] === v);
@@ -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 ss58Format: number;\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\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 ss58Format: getNetworkInfo().then((r) => r.ss58Format),\n }).pipe(\n catchError((ex) => {\n ledger.close();\n throw ex;\n })\n )\n ),\n switchMap(({ ledger, deviceId, ss58Format }) =>\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 };\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.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 } = 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.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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"}
@@ -26,7 +26,6 @@ interface LedgerProvider extends Plugin<LedgerAccount> {
26
26
  getLedgerAccounts$: (idx: Array<number>) => Observable<LedgerAccountInfo>;
27
27
  }
28
28
  type NetworkInfo = {
29
- ss58Format: number;
30
29
  decimals: number;
31
30
  tokenSymbol: string;
32
31
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polkahub/ledger",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "license": "MIT",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -31,10 +31,10 @@
31
31
  "lucide-react": "^0.552.0",
32
32
  "polkadot-api": "^1.20.1",
33
33
  "rxjs": "^7.8.2",
34
- "@polkahub/context": "0.1.0",
35
- "@polkahub/plugin": "0.1.0",
36
- "@polkahub/ui-components": "0.1.0",
37
- "@polkahub/select-account": "0.1.0"
34
+ "@polkahub/context": "0.2.0",
35
+ "@polkahub/plugin": "0.2.0",
36
+ "@polkahub/ui-components": "0.2.0",
37
+ "@polkahub/select-account": "0.2.0"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@types/react": "^19.2.2",