From 0171f2e94627b20426bfde96fd7ca6284a86e097 Mon Sep 17 00:00:00 2001 From: armaniferrante Date: Tue, 4 May 2021 00:32:56 -0700 Subject: [PATCH] Add set authority transaction type --- src/components/Multisig.tsx | 170 +++++++++++++++++++++++++++++++++++- 1 file changed, 166 insertions(+), 4 deletions(-) diff --git a/src/components/Multisig.tsx b/src/components/Multisig.tsx index 987b61f..7d31944 100644 --- a/src/components/Multisig.tsx +++ b/src/components/Multisig.tsx @@ -41,6 +41,7 @@ import ListItemIcon from "@material-ui/core/ListItemIcon"; import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; import CheckCircleIcon from "@material-ui/icons/CheckCircle"; +import FaceIcon from "@material-ui/icons/Face"; import BN from "bn.js"; import { Account, @@ -314,7 +315,9 @@ export function NewMultisigDialog({ label="Max Number of Participants (cannot grow the owner set past this)" value={maxParticipantLength} type="number" - onChange={(e) => setMaxParticipantLength(parseInt(e.target.value) as number)} + onChange={(e) => + setMaxParticipantLength(parseInt(e.target.value) as number) + } /> {participants.map((p, idx) => ( ); + } else if (tx.account.data.equals(setAuthorityData())) { + return ( + + ); } } if (tx.account.programId.equals(multisigClient.programId)) { @@ -762,12 +772,152 @@ function AddTransactionDialog({ multisig={multisig} onClose={onClose} /> + ); } +function SetAuthorityListItem({ + multisig, + onClose, + didAddTransaction, +}: { + multisig: PublicKey; + onClose: Function; + didAddTransaction: (tx: PublicKey) => void; +}) { + const [open, setOpen] = useState(false); + return ( + <> + setOpen((open) => !open)}> + + + + + {open ? : } + + + + + + ); +} + +function SetAuthorityListItemDetails({ + multisig, + onClose, + didAddTransaction, +}: { + multisig: PublicKey; + onClose: Function; + didAddTransaction: (tx: PublicKey) => void; +}) { + // @ts-ignore + const [newAuthority, setNewAuthority] = useState(new PublicKey()); + // @ts-ignore + const [bufferAccount, setBufferAccount] = useState(new PublicKey()); + const { multisigClient } = useWallet(); + // @ts-ignore + const { enqueueSnackbar } = useSnackbar(); + const setAuthority = async () => { + enqueueSnackbar("Creating set authority transaction", { + variant: "info", + }); + const data = setAuthorityData(); + const [multisigSigner] = await PublicKey.findProgramAddress( + [multisig.toBuffer()], + multisigClient.programId + ); + const accounts = [ + { + pubkey: bufferAccount, + isWritable: true, + isSigner: false, + }, + { + pubkey: multisigSigner, + isWritable: false, + isSigner: true, + }, + { + pubkey: newAuthority, + isWritable: false, + isSigner: false, + }, + ]; + const transaction = new Account(); + const txSize = 1000; // todo + const tx = await multisigClient.rpc.createTransaction( + BPF_LOADER_UPGRADEABLE_PID, + accounts, + data, + { + accounts: { + multisig, + transaction: transaction.publicKey, + proposer: multisigClient.provider.wallet.publicKey, + rent: SYSVAR_RENT_PUBKEY, + }, + signers: [transaction], + instructions: [ + await multisigClient.account.transaction.createInstruction( + transaction, + // @ts-ignore + txSize + ), + ], + } + ); + enqueueSnackbar("Transaction created", { + variant: "success", + action: , + }); + didAddTransaction(transaction.publicKey); + onClose(); + }; + return ( +
+ { + setBufferAccount(new PublicKey(e.target.value as string)); + }} + /> + { + setNewAuthority(new PublicKey(e.target.value as string)); + }} + /> +
+ +
+
+ ); +} + function ChangeThresholdListItem({ multisig, onClose, @@ -1220,7 +1370,7 @@ function UpgradeProgramListItemDetails({ const programAddr = new PublicKey(programId as string); const bufferAddr = new PublicKey(buffer as string); // Hard code serialization. - const data = Buffer.from([3, 0, 0, 0]); + const data = upgradeData(); const programAccount = await (async () => { const programAccount = await multisigClient.provider.connection.getAccountInfo( @@ -1324,7 +1474,11 @@ function UpgradeProgramListItemDetails({ // @ts-ignore function icon(tx, multisigClient) { if (tx.account.programId.equals(BPF_LOADER_UPGRADEABLE_PID)) { - return ; + if (tx.account.data[0] === 3) { + return ; + } else if (tx.account.data[0] === 4) { + return ; + } } if (tx.account.programId.equals(multisigClient.programId)) { const setThresholdSighash = multisigClient.coder.sighash( @@ -1361,3 +1515,11 @@ function setOwnersData(multisigClient, owners) { owners, }); } + +function setAuthorityData(): Buffer { + return Buffer.from([4, 0, 0, 0]); +} + +function upgradeData(): Buffer { + return Buffer.from([3, 0, 0, 0]); +}