@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.
- package/dist/AddIndexedMultisig.js +28 -17
- package/dist/AddIndexedMultisig.js.map +1 -1
- package/dist/ManageMultisig.js +1 -1
- package/dist/ManageMultisig.js.map +1 -1
- package/dist/MultisigExternalSigner.js +8 -4
- package/dist/MultisigExternalSigner.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/package.json +11 -11
|
@@ -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,
|
|
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__ */
|
|
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(
|
|
144
|
-
/* @__PURE__ */
|
|
145
|
-
|
|
146
|
-
/* @__PURE__ */
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
/* @__PURE__ */
|
|
152
|
-
|
|
153
|
-
|
|
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(
|
|
198
|
-
/* @__PURE__ */ jsx(
|
|
199
|
-
/* @__PURE__ */
|
|
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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"}
|
package/dist/ManageMultisig.js
CHANGED
|
@@ -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":";;;;;;;;;;;AAgBO,MAAM,cAAA,GAER,CAAC,KAAA,KAAU;AACd,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,UAAA,CAAW,YAAY,CAAA;AAC/C,EAAA,MAAM,gBAAA,GAAmB,UAA4B,kBAAkB,CAAA;AAEvE,EAAA,uBACE,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,MACP,WAAA,CAAY;AAAA,QACV,KAAA,EAAO,mBAAA;AAAA,QACP,OAAA,kBAAS,GAAA,CAAC,eAAA,EAAA,EAAiB,GAAG,KAAA,EAAO;AAAA,OACtC,CAAA;AAAA,MAEH,UAAU,CAAC,gBAAA;AAAA,MAEX,8BAAC,KAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,WAAU,CAAA,EAC7B;AAAA;AAAA,GACF;AAEJ;AAEA,MAAM,kBAAmE,CAAC;AAAA,EACxE;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,eAAA,EAAgB;AACxC,EAAA,MAAM,gBAAA,GAAmB,UAA4B,kBAAkB,CAAA;AACvE,EAAA,MAAM,gBAAA,GAAmB,kBAAA,CAAmB,gBAAA,CAAiB,SAAS,CAAA;AACtE,EAAA,MAAM,aAAa,qBAAA,EAAsB;AAEzC,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,IAAA,gBAAA,CAAiB,MAAA,wBACf,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,sBACjE,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EACX,QAAA,EAAA,gBAAA,CAAiB,GAAA,CAAI,CAAC,OAAA,EAAS,CAAA,qBAC9B,IAAA,CAAC,IAAA,EAAA,EAAW,SAAA,EAAU,yBAAA,EACpB,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,SAAA,EAAU,kBAAA;AAAA,YACV,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MACP,gBAAA,CAAiB,cAAA,CAAe,QAAQ,OAAO,CAAA;AAAA,YAGjD,8BAAC,MAAA,EAAA,EAAO;AAAA;AAAA,SACV;AAAA,
|
|
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
|
-
|
|
41
|
-
/* @__PURE__ */
|
|
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:
|
|
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
|
|
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;;;;"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
|
33
|
-
"@polkadot-api/substrate-bindings": "^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": "^
|
|
37
|
-
"polkadot-api": "^2.
|
|
36
|
+
"lucide-react": "^1.14.0",
|
|
37
|
+
"polkadot-api": "^2.1.0",
|
|
38
38
|
"rxjs": "^7.8.2",
|
|
39
|
-
"@polkahub/context": "0.
|
|
40
|
-
"@polkahub/
|
|
41
|
-
"@polkahub/
|
|
42
|
-
"@polkahub/select-account": "0.
|
|
43
|
-
"@polkahub/ui-components": "0.
|
|
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.
|
|
51
|
+
"react": "^19.2.5"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"build": "tsc -b && rollup -c ../../rollup.config.js"
|