@polkahub/multisig 0.5.1 → 0.6.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.
@@ -2,10 +2,11 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useModalContext, usePlugin, usePolkaHubContext, useAvailableAccounts, AddressIdentity } from '@polkahub/context';
3
3
  import { defaultSerialize, addrEq } from '@polkahub/plugin';
4
4
  import { proxyProviderId } from '@polkahub/proxy';
5
- import { InlineAddressInput, Input, Button, AlertBox, AccountPicker } from '@polkahub/ui-components';
5
+ import { InlineAddressInput, Input, Button, Alert, AlertDescription, AccountPicker } from '@polkahub/ui-components';
6
6
  import { useState, useMemo, useEffect } from 'react';
7
7
  import { from, filter, map, switchMap, EMPTY, merge, firstValueFrom } from 'rxjs';
8
8
  import { multisigProviderId } from './provider.js';
9
+ import { OctagonX, TriangleAlert } from 'lucide-react';
9
10
 
10
11
  const AddIndexedMultisig = ({ getMultisigDetails }) => {
11
12
  const { popContent } = useModalContext();
@@ -138,20 +139,27 @@ const IndexedMultisigInfo = ({ value, onChange, address, getMultisigDetails }) =
138
139
  );
139
140
  if (multisigDetails.type === "loading") return null;
140
141
  if (multisigDetails.value == null)
141
- return /* @__PURE__ */ jsx(AlertBox, { variant: "error", children: "Multisig details not found. Try manual input." });
142
+ return /* @__PURE__ */ jsxs(Alert, { variant: "destructive", children: [
143
+ /* @__PURE__ */ jsx(OctagonX, {}),
144
+ /* @__PURE__ */ jsx(AlertDescription, { children: "Multisig details not found. Try manual input." })
145
+ ] });
142
146
  const details = multisigDetails.value;
143
- const notice = details.proxy ? /* @__PURE__ */ jsxs(AlertBox, { children: [
144
- /* @__PURE__ */ jsxs("p", { children: [
145
- "The address you entered was detected as a ",
146
- /* @__PURE__ */ jsx("strong", { children: "proxy" }),
147
- ", not a multisig."
148
- ] }),
149
- /* @__PURE__ */ jsxs("p", { children: [
150
- "Both signers will be created, but your entered address will appear under the ",
151
- /* @__PURE__ */ jsx("strong", { children: "Proxies" }),
152
- " group instead of ",
153
- /* @__PURE__ */ jsx("strong", { children: "Multisigs" }),
154
- "."
147
+ const notice = details.proxy ? /* @__PURE__ */ jsxs(Alert, { children: [
148
+ /* @__PURE__ */ jsx(TriangleAlert, {}),
149
+ /* @__PURE__ */ jsxs(AlertDescription, { children: [
150
+ /* @__PURE__ */ jsxs("p", { children: [
151
+ "The address you entered was detected as a ",
152
+ /* @__PURE__ */ jsx("strong", { children: "proxy" }),
153
+ ", not a multisig."
154
+ ] }),
155
+ /* @__PURE__ */ jsxs("p", { children: [
156
+ "Both signers will be created, but your entered address will appear under the ",
157
+ /* @__PURE__ */ jsx("strong", { children: "Proxies" }),
158
+ " group instead of",
159
+ " ",
160
+ /* @__PURE__ */ jsx("strong", { children: "Multisigs" }),
161
+ "."
162
+ ] })
155
163
  ] })
156
164
  ] }) : null;
157
165
  const selectableSigners = availableSigners.map(({ name, accounts }) => ({
@@ -194,9 +202,12 @@ const IndexedMultisigInfo = ({ value, onChange, address, getMultisigDetails }) =
194
202
  }
195
203
  )
196
204
  }
197
- ) : /* @__PURE__ */ jsxs(AlertBox, { variant: "error", children: [
198
- /* @__PURE__ */ jsx("p", { children: "None of the signatories in this multisig match your configured signers." }),
199
- /* @__PURE__ */ jsx("p", { children: "Please configure a signer account first." })
205
+ ) : /* @__PURE__ */ jsxs(Alert, { variant: "destructive", children: [
206
+ /* @__PURE__ */ jsx(OctagonX, {}),
207
+ /* @__PURE__ */ jsxs(AlertDescription, { children: [
208
+ /* @__PURE__ */ jsx("p", { children: "None of the signatories in this multisig match your configured signers." }),
209
+ /* @__PURE__ */ jsx("p", { children: "Please configure a signer account first." })
210
+ ] })
200
211
  ] })
201
212
  ] })
202
213
  ] });
@@ -1 +1 @@
1
- {"version":3,"file":"AddIndexedMultisig.js","sources":["../src/AddIndexedMultisig.tsx"],"sourcesContent":["import {\n AddressIdentity,\n useAvailableAccounts,\n useModalContext,\n usePlugin,\n usePolkaHubContext,\n} from \"@polkahub/context\";\nimport {\n Account,\n AccountAddress,\n addrEq,\n defaultSerialize,\n} from \"@polkahub/plugin\";\nimport { ProxyProvider, proxyProviderId } from \"@polkahub/proxy\";\nimport {\n AccountPicker,\n AlertBox,\n Button,\n InlineAddressInput,\n Input,\n} from \"@polkahub/ui-components\";\nimport { useEffect, useMemo, useState, type FC } from \"react\";\nimport {\n EMPTY,\n filter,\n firstValueFrom,\n from,\n map,\n merge,\n switchMap,\n} from \"rxjs\";\nimport { MultisigProvider, multisigProviderId } from \"./provider\";\n\ntype AccountWithMultisig = Account & {\n multisig: {\n proxy?: AccountAddress;\n address: AccountAddress;\n result: {\n addresses: AccountAddress[];\n threshold: number;\n };\n };\n};\n\nexport type GetMultisigDetails = (\n address: AccountAddress\n) => Promise<{ addresses: AccountAddress[]; threshold: number } | null>;\n\nexport const AddIndexedMultisig: FC<{\n getMultisigDetails: GetMultisigDetails;\n}> = ({ getMultisigDetails }) => {\n const { popContent } = useModalContext();\n const multisigProvider = usePlugin<MultisigProvider>(multisigProviderId);\n const proxyProvider = usePlugin<ProxyProvider>(proxyProviderId);\n const { polkaHub } = usePolkaHubContext();\n const [multisigAddress, setMultisigAddress] = useState<AccountAddress | null>(\n null\n );\n const [name, setName] = useState(\"\");\n const [selectedAccount, setSelectedAccount] =\n useState<AccountWithMultisig | null>(null);\n\n return (\n <form\n className=\"space-y-2\"\n onSubmit={async (evt) => {\n evt.preventDefault();\n if (!multisigAddress || !selectedAccount) return null;\n\n const plugins = polkaHub.plugins$.getValue();\n const parentProvider = plugins.find(\n (p) => p.id === selectedAccount.provider\n );\n if (!parentProvider)\n throw new Error(\n `Parent provider ${selectedAccount.provider} not found`\n );\n\n const details = selectedAccount.multisig.result;\n const serializeFn = parentProvider.serialize ?? defaultSerialize;\n\n if (selectedAccount.multisig.proxy) {\n const multisigAccount = await multisigProvider!.addMultisig({\n signatories: details.addresses,\n threshold: details.threshold,\n parentSigner: serializeFn(selectedAccount),\n });\n\n await proxyProvider?.addProxy({\n real: multisigAddress,\n parentSigner: (multisigProvider!.serialize ?? defaultSerialize)(\n multisigAccount\n ),\n name: name.trim() ? name.trim() : undefined,\n });\n } else {\n multisigProvider?.addMultisig({\n signatories: details.addresses,\n threshold: details.threshold,\n parentSigner: serializeFn(selectedAccount),\n name: name.trim() ? name.trim() : undefined,\n });\n }\n\n popContent();\n }}\n >\n <div className=\"space-y-2\">\n <h3 className=\"font-medium text-muted-foreground\">\n Insert Multisig Address\n </h3>\n <div className=\"flex gap-2\">\n <InlineAddressInput\n value={multisigAddress}\n onChange={setMultisigAddress}\n className=\"max-w-auto shrink-[2]\"\n />\n <Input\n name=\"account-name\"\n value={name}\n onChange={(evt) => setName(evt.target.value)}\n placeholder=\"Name (optional)\"\n className=\"shrink-[3]\"\n />\n </div>\n </div>\n {multisigAddress ? (\n <IndexedMultisigInfo\n value={selectedAccount}\n onChange={setSelectedAccount}\n address={multisigAddress}\n getMultisigDetails={getMultisigDetails}\n />\n ) : null}\n <div className=\"flex justify-end\">\n <Button disabled={!multisigAddress || !selectedAccount}>\n Add Multisig\n </Button>\n </div>\n </form>\n );\n};\n\nconst IndexedMultisigInfo: FC<{\n value: AccountWithMultisig | null;\n onChange: (value: AccountWithMultisig | null) => void;\n address: AccountAddress;\n getMultisigDetails: GetMultisigDetails;\n}> = ({ value, onChange, address, getMultisigDetails }) => {\n const proxyProvider = usePlugin<ProxyProvider>(proxyProviderId);\n const multisigDetails = useAsync(() => {\n const directMultisig$ = from(getMultisigDetails(address)).pipe(\n filter((v) => !!v),\n map((result) => ({\n proxy: undefined,\n address,\n result,\n }))\n );\n const proxyMultisig$ = proxyProvider\n ? from(proxyProvider.getDelegates(address)).pipe(\n switchMap((res) => {\n if (!res) return EMPTY;\n const addresses = [...new Set(res.map((v) => v.delegate))];\n return merge(\n ...addresses.map((addr) =>\n from(getMultisigDetails(addr)).pipe(\n filter((v) => !!v),\n map((result) => ({\n proxy: address,\n address: addr,\n result,\n }))\n )\n )\n );\n })\n )\n : EMPTY;\n\n // This covers the most common scenario of a pure proxy, but TODO might fail for other scenarios: Multiple delegators, or a multisig that's also a proxy.\n return firstValueFrom(merge(directMultisig$, proxyMultisig$), {\n defaultValue: null,\n });\n }, [address]);\n const availableAccounts = useAvailableAccounts();\n const availableSigners = useMemo(\n () =>\n Object.entries(availableAccounts)\n .map(([name, accounts]) => ({\n name,\n accounts: accounts.filter((acc) => !!acc.signer),\n }))\n .filter(({ accounts }) => accounts.length > 0),\n [availableAccounts]\n );\n\n if (multisigDetails.type === \"loading\") return null;\n if (multisigDetails.value == null)\n return (\n <AlertBox variant=\"error\">\n Multisig details not found. Try manual input.\n </AlertBox>\n );\n\n const details = multisigDetails.value;\n const notice = details.proxy ? (\n <AlertBox>\n <p>\n The address you entered was detected as a <strong>proxy</strong>, not a\n multisig.\n </p>\n <p>\n Both signers will be created, but your entered address will appear under\n the <strong>Proxies</strong> group instead of <strong>Multisigs</strong>\n .\n </p>\n </AlertBox>\n ) : null;\n\n const selectableSigners = availableSigners\n .map(({ name, accounts }) => ({\n name,\n accounts: accounts.filter((acc) =>\n details.result.addresses.some((addr) => addrEq(acc.address, addr))\n ),\n }))\n .filter(({ accounts }) => accounts.length > 0);\n\n return (\n <div className=\"space-y-2\">\n {notice}\n <div>\n <h3 className=\"font-medium text-muted-foreground\">\n Multisig signatories (threshold {details.result.threshold})\n </h3>\n <ul>\n {details.result.addresses.map((addr) => (\n <li key={addr}>\n <AddressIdentity addr={addr} />\n </li>\n ))}\n </ul>\n </div>\n <div>\n <h3 className=\"font-medium text-muted-foreground\">\n Select your signer\n </h3>\n {selectableSigners.length ? (\n <AccountPicker\n value={value}\n onChange={(value) =>\n onChange(\n value\n ? {\n ...value,\n multisig: details,\n }\n : null\n )\n }\n groups={selectableSigners}\n className=\"max-w-auto\"\n disableClear\n renderAddress={(account) => (\n <AddressIdentity\n addr={account.address}\n name={account?.name}\n copyable={false}\n />\n )}\n />\n ) : (\n <AlertBox variant=\"error\">\n <p>\n None of the signatories in this multisig match your configured\n signers.\n </p>\n <p>Please configure a signer account first.</p>\n </AlertBox>\n )}\n </div>\n </div>\n );\n};\n\nconst useAsync = <T,>(fn: () => Promise<T>, deps: unknown[]) => {\n const [value, setValue] = useState<\n | {\n type: \"loading\" | \"error\";\n value?: never;\n }\n | {\n type: \"result\";\n value: T;\n }\n >({\n type: \"loading\",\n });\n\n useEffect(() => {\n let cancelled = false;\n\n setValue({ type: \"loading\" });\n fn().then(\n (value) => {\n if (cancelled) return;\n setValue({ type: \"result\", value });\n },\n (ex) => {\n if (cancelled) return;\n console.error(ex);\n setValue({ type: \"error\" });\n }\n );\n\n return () => {\n cancelled = true;\n };\n }, deps);\n\n return value;\n};\n"],"names":["value"],"mappings":"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"}
1
+ {"version":3,"file":"AddIndexedMultisig.js","sources":["../src/AddIndexedMultisig.tsx"],"sourcesContent":["import {\n AddressIdentity,\n useAvailableAccounts,\n useModalContext,\n usePlugin,\n usePolkaHubContext,\n} from \"@polkahub/context\";\nimport {\n Account,\n AccountAddress,\n addrEq,\n defaultSerialize,\n} from \"@polkahub/plugin\";\nimport { ProxyProvider, proxyProviderId } from \"@polkahub/proxy\";\nimport {\n AccountPicker,\n Alert,\n AlertDescription,\n Button,\n InlineAddressInput,\n Input,\n} from \"@polkahub/ui-components\";\nimport { useEffect, useMemo, useState, type FC } from \"react\";\nimport {\n EMPTY,\n filter,\n firstValueFrom,\n from,\n map,\n merge,\n switchMap,\n} from \"rxjs\";\nimport { MultisigProvider, multisigProviderId } from \"./provider\";\nimport { OctagonX, TriangleAlert } from \"lucide-react\";\n\ntype AccountWithMultisig = Account & {\n multisig: {\n proxy?: AccountAddress;\n address: AccountAddress;\n result: {\n addresses: AccountAddress[];\n threshold: number;\n };\n };\n};\n\nexport type GetMultisigDetails = (\n address: AccountAddress\n) => Promise<{ addresses: AccountAddress[]; threshold: number } | null>;\n\nexport const AddIndexedMultisig: FC<{\n getMultisigDetails: GetMultisigDetails;\n}> = ({ getMultisigDetails }) => {\n const { popContent } = useModalContext();\n const multisigProvider = usePlugin<MultisigProvider>(multisigProviderId);\n const proxyProvider = usePlugin<ProxyProvider>(proxyProviderId);\n const { polkaHub } = usePolkaHubContext();\n const [multisigAddress, setMultisigAddress] = useState<AccountAddress | null>(\n null\n );\n const [name, setName] = useState(\"\");\n const [selectedAccount, setSelectedAccount] =\n useState<AccountWithMultisig | null>(null);\n\n return (\n <form\n className=\"space-y-2\"\n onSubmit={async (evt) => {\n evt.preventDefault();\n if (!multisigAddress || !selectedAccount) return null;\n\n const plugins = polkaHub.plugins$.getValue();\n const parentProvider = plugins.find(\n (p) => p.id === selectedAccount.provider\n );\n if (!parentProvider)\n throw new Error(\n `Parent provider ${selectedAccount.provider} not found`\n );\n\n const details = selectedAccount.multisig.result;\n const serializeFn = parentProvider.serialize ?? defaultSerialize;\n\n if (selectedAccount.multisig.proxy) {\n const multisigAccount = await multisigProvider!.addMultisig({\n signatories: details.addresses,\n threshold: details.threshold,\n parentSigner: serializeFn(selectedAccount),\n });\n\n await proxyProvider?.addProxy({\n real: multisigAddress,\n parentSigner: (multisigProvider!.serialize ?? defaultSerialize)(\n multisigAccount\n ),\n name: name.trim() ? name.trim() : undefined,\n });\n } else {\n multisigProvider?.addMultisig({\n signatories: details.addresses,\n threshold: details.threshold,\n parentSigner: serializeFn(selectedAccount),\n name: name.trim() ? name.trim() : undefined,\n });\n }\n\n popContent();\n }}\n >\n <div className=\"space-y-2\">\n <h3 className=\"font-medium text-muted-foreground\">\n Insert Multisig Address\n </h3>\n <div className=\"flex gap-2\">\n <InlineAddressInput\n value={multisigAddress}\n onChange={setMultisigAddress}\n className=\"max-w-auto shrink-[2]\"\n />\n <Input\n name=\"account-name\"\n value={name}\n onChange={(evt) => setName(evt.target.value)}\n placeholder=\"Name (optional)\"\n className=\"shrink-[3]\"\n />\n </div>\n </div>\n {multisigAddress ? (\n <IndexedMultisigInfo\n value={selectedAccount}\n onChange={setSelectedAccount}\n address={multisigAddress}\n getMultisigDetails={getMultisigDetails}\n />\n ) : null}\n <div className=\"flex justify-end\">\n <Button disabled={!multisigAddress || !selectedAccount}>\n Add Multisig\n </Button>\n </div>\n </form>\n );\n};\n\nconst IndexedMultisigInfo: FC<{\n value: AccountWithMultisig | null;\n onChange: (value: AccountWithMultisig | null) => void;\n address: AccountAddress;\n getMultisigDetails: GetMultisigDetails;\n}> = ({ value, onChange, address, getMultisigDetails }) => {\n const proxyProvider = usePlugin<ProxyProvider>(proxyProviderId);\n const multisigDetails = useAsync(() => {\n const directMultisig$ = from(getMultisigDetails(address)).pipe(\n filter((v) => !!v),\n map((result) => ({\n proxy: undefined,\n address,\n result,\n }))\n );\n const proxyMultisig$ = proxyProvider\n ? from(proxyProvider.getDelegates(address)).pipe(\n switchMap((res) => {\n if (!res) return EMPTY;\n const addresses = [...new Set(res.map((v) => v.delegate))];\n return merge(\n ...addresses.map((addr) =>\n from(getMultisigDetails(addr)).pipe(\n filter((v) => !!v),\n map((result) => ({\n proxy: address,\n address: addr,\n result,\n }))\n )\n )\n );\n })\n )\n : EMPTY;\n\n // This covers the most common scenario of a pure proxy, but TODO might fail for other scenarios: Multiple delegators, or a multisig that's also a proxy.\n return firstValueFrom(merge(directMultisig$, proxyMultisig$), {\n defaultValue: null,\n });\n }, [address]);\n const availableAccounts = useAvailableAccounts();\n const availableSigners = useMemo(\n () =>\n Object.entries(availableAccounts)\n .map(([name, accounts]) => ({\n name,\n accounts: accounts.filter((acc) => !!acc.signer),\n }))\n .filter(({ accounts }) => accounts.length > 0),\n [availableAccounts]\n );\n\n if (multisigDetails.type === \"loading\") return null;\n if (multisigDetails.value == null)\n return (\n <Alert variant=\"destructive\">\n <OctagonX />\n <AlertDescription>\n Multisig details not found. Try manual input.\n </AlertDescription>\n </Alert>\n );\n\n const details = multisigDetails.value;\n const notice = details.proxy ? (\n <Alert>\n <TriangleAlert />\n <AlertDescription>\n <p>\n The address you entered was detected as a <strong>proxy</strong>, not\n a multisig.\n </p>\n <p>\n Both signers will be created, but your entered address will appear\n under the <strong>Proxies</strong> group instead of{\" \"}\n <strong>Multisigs</strong>.\n </p>\n </AlertDescription>\n </Alert>\n ) : null;\n\n const selectableSigners = availableSigners\n .map(({ name, accounts }) => ({\n name,\n accounts: accounts.filter((acc) =>\n details.result.addresses.some((addr) => addrEq(acc.address, addr))\n ),\n }))\n .filter(({ accounts }) => accounts.length > 0);\n\n return (\n <div className=\"space-y-2\">\n {notice}\n <div>\n <h3 className=\"font-medium text-muted-foreground\">\n Multisig signatories (threshold {details.result.threshold})\n </h3>\n <ul>\n {details.result.addresses.map((addr) => (\n <li key={addr}>\n <AddressIdentity addr={addr} />\n </li>\n ))}\n </ul>\n </div>\n <div>\n <h3 className=\"font-medium text-muted-foreground\">\n Select your signer\n </h3>\n {selectableSigners.length ? (\n <AccountPicker\n value={value}\n onChange={(value) =>\n onChange(\n value\n ? {\n ...value,\n multisig: details,\n }\n : null\n )\n }\n groups={selectableSigners}\n className=\"max-w-auto\"\n disableClear\n renderAddress={(account) => (\n <AddressIdentity\n addr={account.address}\n name={account?.name}\n copyable={false}\n />\n )}\n />\n ) : (\n <Alert variant=\"destructive\">\n <OctagonX />\n <AlertDescription>\n <p>\n None of the signatories in this multisig match your configured\n signers.\n </p>\n <p>Please configure a signer account first.</p>\n </AlertDescription>\n </Alert>\n )}\n </div>\n </div>\n );\n};\n\nconst useAsync = <T,>(fn: () => Promise<T>, deps: unknown[]) => {\n const [value, setValue] = useState<\n | {\n type: \"loading\" | \"error\";\n value?: never;\n }\n | {\n type: \"result\";\n value: T;\n }\n >({\n type: \"loading\",\n });\n\n useEffect(() => {\n let cancelled = false;\n\n setValue({ type: \"loading\" });\n fn().then(\n (value) => {\n if (cancelled) return;\n setValue({ type: \"result\", value });\n },\n (ex) => {\n if (cancelled) return;\n console.error(ex);\n setValue({ type: \"error\" });\n }\n );\n\n return () => {\n cancelled = true;\n };\n }, deps);\n\n return value;\n};\n"],"names":["value"],"mappings":"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"}
@@ -46,7 +46,7 @@ const ManageAddresses = ({
46
46
  children: /* @__PURE__ */ jsx(Trash2, {})
47
47
  }
48
48
  ),
49
- /* @__PURE__ */ jsx(AddressIdentity, { addr: account.address }),
49
+ /* @__PURE__ */ jsx(AddressIdentity, { addr: account.address, name: account.name }),
50
50
  /* @__PURE__ */ jsx("div", { className: "grow" }),
51
51
  /* @__PURE__ */ jsx(AddressBalance, { addr: account.address }),
52
52
  setAccount ? /* @__PURE__ */ jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"ManageMultisig.js","sources":["../src/ManageMultisig.tsx"],"sourcesContent":["import {\n AddressBalance,\n AddressIdentity,\n ModalContext,\n useModalContext,\n usePlugin,\n} from \"@polkahub/context\";\nimport { Button, SourceButton } from \"@polkahub/ui-components\";\nimport { useStateObservable } from \"@react-rxjs/core\";\nimport { CirclePlus, Trash2, Users } from \"lucide-react\";\nimport { useContext, type FC } from \"react\";\nimport { AddIndexedMultisig, GetMultisigDetails } from \"./AddIndexedMultisig\";\nimport { AddManualMultisig } from \"./AddManualMultisig\";\nimport { MultisigProvider, multisigProviderId } from \"./provider\";\nimport { useSetSelectedAccount } from \"@polkahub/select-account\";\n\nexport const ManageMultisig: FC<{\n getMultisigDetails?: GetMultisigDetails;\n}> = (props) => {\n const { pushContent } = useContext(ModalContext)!;\n const multisigProvider = usePlugin<MultisigProvider>(multisigProviderId);\n\n return (\n <SourceButton\n label=\"Multisig\"\n onClick={() =>\n pushContent({\n title: \"Multisig accounts\",\n element: <ManageAddresses {...props} />,\n })\n }\n disabled={!multisigProvider}\n >\n <div>\n <Users className=\"size-10\" />\n </div>\n </SourceButton>\n );\n};\n\nconst ManageAddresses: FC<{ getMultisigDetails?: GetMultisigDetails }> = ({\n getMultisigDetails,\n}) => {\n const { pushContent } = useModalContext();\n const multisigProvider = usePlugin<MultisigProvider>(multisigProviderId)!;\n const multisigAccounts = useStateObservable(multisigProvider.accounts$);\n const setAccount = useSetSelectedAccount();\n\n return (\n <div className=\"space-y-4\">\n {multisigAccounts.length ? (\n <div>\n <h3 className=\"font-medium text-muted-foreground\">Added addresses</h3>\n <ul className=\"space-y-2\">\n {multisigAccounts.map((account, i) => (\n <li key={i} className=\"flex gap-2 items-center\">\n <Button\n variant=\"outline\"\n className=\"text-destructive\"\n type=\"button\"\n onClick={() =>\n multisigProvider.removeMultisig(account.address)\n }\n >\n <Trash2 />\n </Button>\n <AddressIdentity addr={account.address} />\n <div className=\"grow\" />\n <AddressBalance addr={account.address} />\n {setAccount ? (\n <Button\n variant=\"secondary\"\n onClick={() => {\n setAccount(account);\n }}\n >\n Select\n </Button>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n <div className=\"flex justify-end gap-2\">\n {getMultisigDetails ? (\n <Button\n type=\"button\"\n onClick={() =>\n pushContent({\n title: \"Add Multisig\",\n element: (\n <AddIndexedMultisig getMultisigDetails={getMultisigDetails} />\n ),\n })\n }\n >\n <CirclePlus />\n Indexed\n </Button>\n ) : null}\n <Button\n type=\"button\"\n onClick={() =>\n pushContent({\n title: \"Add Multisig\",\n element: <AddManualMultisig />,\n })\n }\n >\n <CirclePlus />\n {getMultisigDetails ? \"Manual\" : \"Multisig\"}\n </Button>\n </div>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ManageMultisig.js","sources":["../src/ManageMultisig.tsx"],"sourcesContent":["import {\n AddressBalance,\n AddressIdentity,\n ModalContext,\n useModalContext,\n usePlugin,\n} from \"@polkahub/context\";\nimport { Button, SourceButton } from \"@polkahub/ui-components\";\nimport { useStateObservable } from \"@react-rxjs/core\";\nimport { CirclePlus, Trash2, Users } from \"lucide-react\";\nimport { useContext, type FC } from \"react\";\nimport { AddIndexedMultisig, GetMultisigDetails } from \"./AddIndexedMultisig\";\nimport { AddManualMultisig } from \"./AddManualMultisig\";\nimport { MultisigProvider, multisigProviderId } from \"./provider\";\nimport { useSetSelectedAccount } from \"@polkahub/select-account\";\n\nexport const ManageMultisig: FC<{\n getMultisigDetails?: GetMultisigDetails;\n}> = (props) => {\n const { pushContent } = useContext(ModalContext)!;\n const multisigProvider = usePlugin<MultisigProvider>(multisigProviderId);\n\n return (\n <SourceButton\n label=\"Multisig\"\n onClick={() =>\n pushContent({\n title: \"Multisig accounts\",\n element: <ManageAddresses {...props} />,\n })\n }\n disabled={!multisigProvider}\n >\n <div>\n <Users className=\"size-10\" />\n </div>\n </SourceButton>\n );\n};\n\nconst ManageAddresses: FC<{ getMultisigDetails?: GetMultisigDetails }> = ({\n getMultisigDetails,\n}) => {\n const { pushContent } = useModalContext();\n const multisigProvider = usePlugin<MultisigProvider>(multisigProviderId)!;\n const multisigAccounts = useStateObservable(multisigProvider.accounts$);\n const setAccount = useSetSelectedAccount();\n\n return (\n <div className=\"space-y-4\">\n {multisigAccounts.length ? (\n <div>\n <h3 className=\"font-medium text-muted-foreground\">Added addresses</h3>\n <ul className=\"space-y-2\">\n {multisigAccounts.map((account, i) => (\n <li key={i} className=\"flex gap-2 items-center\">\n <Button\n variant=\"outline\"\n className=\"text-destructive\"\n type=\"button\"\n onClick={() =>\n multisigProvider.removeMultisig(account.address)\n }\n >\n <Trash2 />\n </Button>\n <AddressIdentity addr={account.address} name={account.name} />\n <div className=\"grow\" />\n <AddressBalance addr={account.address} />\n {setAccount ? (\n <Button\n variant=\"secondary\"\n onClick={() => {\n setAccount(account);\n }}\n >\n Select\n </Button>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n <div className=\"flex justify-end gap-2\">\n {getMultisigDetails ? (\n <Button\n type=\"button\"\n onClick={() =>\n pushContent({\n title: \"Add Multisig\",\n element: (\n <AddIndexedMultisig getMultisigDetails={getMultisigDetails} />\n ),\n })\n }\n >\n <CirclePlus />\n Indexed\n </Button>\n ) : null}\n <Button\n type=\"button\"\n onClick={() =>\n pushContent({\n title: \"Add Multisig\",\n element: <AddManualMultisig />,\n })\n }\n >\n <CirclePlus />\n {getMultisigDetails ? \"Manual\" : \"Multisig\"}\n </Button>\n </div>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { createSignal } from '@react-rxjs/utils';
4
4
  import { state, useStateObservable } from '@react-rxjs/core';
5
5
  import { firstValueFrom, filter } from 'rxjs';
6
6
  import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogBody } from '@polkahub/ui-components';
7
+ import { Link } from 'lucide-react';
7
8
 
8
9
  const [urlChange$, setUrl] = createSignal();
9
10
  const url$ = state(urlChange$, null);
@@ -21,7 +22,7 @@ const multisigExternalSigner = (getMultisigUrl, thresholdOneFallback) => (info,
21
22
  throw new Error("Raw bytes can't be signed with a multisig");
22
23
  },
23
24
  async signTx(callData) {
24
- const url = getMultisigUrl(info, Binary.toHex(callData));
25
+ const url = await getMultisigUrl(info, Binary.toHex(callData));
25
26
  setUrl(url);
26
27
  try {
27
28
  await firstValueFrom(url$.pipe(filter((v) => !v)));
@@ -37,14 +38,17 @@ const MultisigExternalSignerModal = () => {
37
38
  return /* @__PURE__ */ jsx(Dialog, { open: !!activeTx, onOpenChange: () => setUrl(null), children: /* @__PURE__ */ jsxs(DialogContent, { children: [
38
39
  /* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, { children: "Multisig Transaction" }) }),
39
40
  /* @__PURE__ */ jsx(DialogBody, { children: /* @__PURE__ */ jsxs("div", { children: [
40
- /* @__PURE__ */ jsx("p", { children: "To sign this multisig transaction, please share the following URL with the signatories" }),
41
- /* @__PURE__ */ jsx(
41
+ "To sign this multisig transaction, please share the following URL with the signatories:",
42
+ /* @__PURE__ */ jsxs(
42
43
  "a",
43
44
  {
44
45
  href: activeTx ?? "",
45
46
  target: "_blank",
46
47
  className: "cursor-pointer underline",
47
- children: activeTx
48
+ children: [
49
+ /* @__PURE__ */ jsx(Link, { size: 16, className: "inline-block mx-0.5" }),
50
+ "Link"
51
+ ]
48
52
  }
49
53
  )
50
54
  ] }) })
@@ -1 +1 @@
1
- {"version":3,"file":"MultisigExternalSigner.js","sources":["../src/MultisigExternalSigner.tsx"],"sourcesContent":["import {\n AccountId,\n Binary,\n getMultisigAccountId,\n HexString,\n} from \"@polkadot-api/substrate-bindings\";\nimport { CreateMultisigSigner, MultisigInfo } from \"./provider\";\nimport { createSignal } from \"@react-rxjs/utils\";\nimport { state, useStateObservable } from \"@react-rxjs/core\";\nimport { filter, firstValueFrom } from \"rxjs\";\nimport { FC } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogBody,\n} from \"@polkahub/ui-components\";\n\nconst [urlChange$, setUrl] = createSignal<string | null>();\nconst url$ = state(urlChange$, null);\n\nconst [enc] = AccountId();\nexport const multisigExternalSigner =\n (\n getMultisigUrl: (info: MultisigInfo, callData: HexString) => string,\n thresholdOneFallback?: CreateMultisigSigner\n ): CreateMultisigSigner =>\n (info, signer) => {\n if (info.threshold === 1 && signer && thresholdOneFallback)\n return thresholdOneFallback(info, signer);\n\n const publicKey = getMultisigAccountId({\n threshold: info.threshold,\n signatories: info.signatories.map(enc),\n });\n\n return {\n publicKey,\n signBytes() {\n throw new Error(\"Raw bytes can't be signed with a multisig\");\n },\n async signTx(callData) {\n const url = getMultisigUrl(info, Binary.toHex(callData));\n setUrl(url);\n try {\n await firstValueFrom(url$.pipe(filter((v) => !v)));\n throw null;\n } catch (ex) {\n throw new Error(\"Dismissed\");\n }\n },\n };\n };\n\nexport const MultisigExternalSignerModal: FC = () => {\n const activeTx = useStateObservable(url$);\n\n return (\n <Dialog open={!!activeTx} onOpenChange={() => setUrl(null)}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Multisig Transaction</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <div>\n <p>\n To sign this multisig transaction, please share the following URL\n with the signatories\n </p>\n <a\n href={activeTx ?? \"\"}\n target=\"_blank\"\n className=\"cursor-pointer underline\"\n >\n {activeTx}\n </a>\n </div>\n </DialogBody>\n </DialogContent>\n </Dialog>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAmBA,MAAM,CAAC,UAAA,EAAY,MAAM,CAAA,GAAI,YAAA,EAA4B;AACzD,MAAM,IAAA,GAAO,KAAA,CAAM,UAAA,EAAY,IAAI,CAAA;AAEnC,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,EAAU;AACjB,MAAM,yBACX,CACE,cAAA,EACA,oBAAA,KAEF,CAAC,MAAM,MAAA,KAAW;AAChB,EAAA,IAAI,IAAA,CAAK,SAAA,KAAc,CAAA,IAAK,MAAA,IAAU,oBAAA;AACpC,IAAA,OAAO,oBAAA,CAAqB,MAAM,MAAM,CAAA;AAE1C,EAAA,MAAM,YAAY,oBAAA,CAAqB;AAAA,IACrC,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG;AAAA,GACtC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,SAAA,GAAY;AACV,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,MAAM,OAAO,QAAA,EAAU;AACrB,MAAA,MAAM,MAAM,cAAA,CAAe,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AACvD,MAAA,MAAA,CAAO,GAAG,CAAA;AACV,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,CAAe,KAAK,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACjD,QAAA,MAAM,IAAA;AAAA,MACR,SAAS,EAAA,EAAI;AACX,QAAA,MAAM,IAAI,MAAM,WAAW,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,GACF;AACF;AAEK,MAAM,8BAAkC,MAAM;AACnD,EAAA,MAAM,QAAA,GAAW,mBAAmB,IAAI,CAAA;AAExC,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAM,CAAC,CAAC,QAAA,EAAU,YAAA,EAAc,MAAM,MAAA,CAAO,IAAI,CAAA,EACvD,QAAA,kBAAA,IAAA,CAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAA,sBAAA,EAAoB,CAAA,EACnC,CAAA;AAAA,oBACA,GAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAE,QAAA,EAAA,wFAAA,EAGH,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,MAAM,QAAA,IAAY,EAAA;AAAA,UAClB,MAAA,EAAO,QAAA;AAAA,UACP,SAAA,EAAU,0BAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"MultisigExternalSigner.js","sources":["../src/MultisigExternalSigner.tsx"],"sourcesContent":["import {\n AccountId,\n Binary,\n getMultisigAccountId,\n HexString,\n} from \"@polkadot-api/substrate-bindings\";\nimport { CreateMultisigSigner, MultisigInfo } from \"./provider\";\nimport { createSignal } from \"@react-rxjs/utils\";\nimport { state, useStateObservable } from \"@react-rxjs/core\";\nimport { filter, firstValueFrom } from \"rxjs\";\nimport { FC } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogBody,\n} from \"@polkahub/ui-components\";\nimport { Link } from \"lucide-react\";\n\nconst [urlChange$, setUrl] = createSignal<string | null>();\nconst url$ = state(urlChange$, null);\n\nconst [enc] = AccountId();\nexport const multisigExternalSigner =\n (\n getMultisigUrl: (\n info: MultisigInfo,\n callData: HexString\n ) => string | Promise<string>,\n thresholdOneFallback?: CreateMultisigSigner\n ): CreateMultisigSigner =>\n (info, signer) => {\n if (info.threshold === 1 && signer && thresholdOneFallback)\n return thresholdOneFallback(info, signer);\n\n const publicKey = getMultisigAccountId({\n threshold: info.threshold,\n signatories: info.signatories.map(enc),\n });\n\n return {\n publicKey,\n signBytes() {\n throw new Error(\"Raw bytes can't be signed with a multisig\");\n },\n async signTx(callData) {\n const url = await getMultisigUrl(info, Binary.toHex(callData));\n setUrl(url);\n try {\n await firstValueFrom(url$.pipe(filter((v) => !v)));\n throw null;\n } catch (ex) {\n throw new Error(\"Dismissed\");\n }\n },\n };\n };\n\nexport const MultisigExternalSignerModal: FC = () => {\n const activeTx = useStateObservable(url$);\n\n return (\n <Dialog open={!!activeTx} onOpenChange={() => setUrl(null)}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Multisig Transaction</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <div>\n To sign this multisig transaction, please share the following URL\n with the signatories:\n <a\n href={activeTx ?? \"\"}\n target=\"_blank\"\n className=\"cursor-pointer underline\"\n >\n <Link size={16} className=\"inline-block mx-0.5\" />\n Link\n </a>\n </div>\n </DialogBody>\n </DialogContent>\n </Dialog>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAoBA,MAAM,CAAC,UAAA,EAAY,MAAM,CAAA,GAAI,YAAA,EAA4B;AACzD,MAAM,IAAA,GAAO,KAAA,CAAM,UAAA,EAAY,IAAI,CAAA;AAEnC,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,EAAU;AACjB,MAAM,yBACX,CACE,cAAA,EAIA,oBAAA,KAEF,CAAC,MAAM,MAAA,KAAW;AAChB,EAAA,IAAI,IAAA,CAAK,SAAA,KAAc,CAAA,IAAK,MAAA,IAAU,oBAAA;AACpC,IAAA,OAAO,oBAAA,CAAqB,MAAM,MAAM,CAAA;AAE1C,EAAA,MAAM,YAAY,oBAAA,CAAqB;AAAA,IACrC,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG;AAAA,GACtC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,SAAA,GAAY;AACV,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,MAAM,OAAO,QAAA,EAAU;AACrB,MAAA,MAAM,MAAM,MAAM,cAAA,CAAe,MAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AAC7D,MAAA,MAAA,CAAO,GAAG,CAAA;AACV,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,CAAe,KAAK,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACjD,QAAA,MAAM,IAAA;AAAA,MACR,SAAS,EAAA,EAAI;AACX,QAAA,MAAM,IAAI,MAAM,WAAW,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,GACF;AACF;AAEK,MAAM,8BAAkC,MAAM;AACnD,EAAA,MAAM,QAAA,GAAW,mBAAmB,IAAI,CAAA;AAExC,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAM,CAAC,CAAC,QAAA,EAAU,YAAA,EAAc,MAAM,MAAA,CAAO,IAAI,CAAA,EACvD,QAAA,kBAAA,IAAA,CAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAA,sBAAA,EAAoB,CAAA,EACnC,CAAA;AAAA,oBACA,GAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA;AAAA,MAAA,yFAAA;AAAA,sBAGH,IAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,MAAM,QAAA,IAAY,EAAA;AAAA,UAClB,MAAA,EAAO,QAAA;AAAA,UACP,SAAA,EAAU,0BAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA;AAEpD,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -49,7 +49,7 @@ declare const ManageMultisig: FC<{
49
49
  getMultisigDetails?: GetMultisigDetails;
50
50
  }>;
51
51
 
52
- declare const multisigExternalSigner: (getMultisigUrl: (info: MultisigInfo, callData: HexString) => string, thresholdOneFallback?: CreateMultisigSigner) => CreateMultisigSigner;
52
+ declare const multisigExternalSigner: (getMultisigUrl: (info: MultisigInfo, callData: HexString) => string | Promise<string>, thresholdOneFallback?: CreateMultisigSigner) => CreateMultisigSigner;
53
53
  declare const MultisigExternalSignerModal: FC;
54
54
 
55
55
  export { ManageMultisig, MultisigExternalSignerModal, createMultisigProvider, multisigDirectSigner, multisigExternalSigner, multisigProviderId };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polkahub/multisig",
3
- "version": "0.5.1",
3
+ "version": "0.6.0",
4
4
  "author": "Victor Oliva (https://github.com/voliva)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -29,18 +29,18 @@
29
29
  "index.css"
30
30
  ],
31
31
  "dependencies": {
32
- "@polkadot-api/meta-signers": "^0.1.21",
33
- "@polkadot-api/substrate-bindings": "^0.19.0",
32
+ "@polkadot-api/meta-signers": "^0.2.1",
33
+ "@polkadot-api/substrate-bindings": "^0.20.1",
34
34
  "@react-rxjs/core": "^0.10.8",
35
35
  "@react-rxjs/utils": "^0.9.7",
36
- "lucide-react": "^0.577.0",
37
- "polkadot-api": "^2.0.0-rc.5",
36
+ "lucide-react": "^1.14.0",
37
+ "polkadot-api": "^2.1.0",
38
38
  "rxjs": "^7.8.2",
39
- "@polkahub/context": "0.5.1",
40
- "@polkahub/proxy": "0.5.1",
41
- "@polkahub/plugin": "0.5.1",
42
- "@polkahub/select-account": "0.5.1",
43
- "@polkahub/ui-components": "0.5.1"
39
+ "@polkahub/context": "0.6.0",
40
+ "@polkahub/plugin": "0.6.0",
41
+ "@polkahub/proxy": "0.6.0",
42
+ "@polkahub/select-account": "0.6.0",
43
+ "@polkahub/ui-components": "0.6.0"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@types/react": "^19.2.2",
@@ -48,7 +48,7 @@
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/react": "^19.2.14",
51
- "react": "^19.2.4"
51
+ "react": "^19.2.5"
52
52
  },
53
53
  "scripts": {
54
54
  "build": "tsc -b && rollup -c ../../rollup.config.js"