add change-threshold, add-member, and remove-member (#358)
This commit is contained in:
parent
bdc492f919
commit
b784abd144
|
@ -180,6 +180,117 @@ program
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
program
|
||||||
|
.command("change-threshold")
|
||||||
|
.description("Change threshold of multisig")
|
||||||
|
.option("-c, --cluster <network>", "solana cluster to use", "devnet")
|
||||||
|
.requiredOption("-v, --vault-address <address>", "multisig vault address")
|
||||||
|
.option("-l, --ledger", "use ledger")
|
||||||
|
.option(
|
||||||
|
"-lda, --ledger-derivation-account <number>",
|
||||||
|
"ledger derivation account to use"
|
||||||
|
)
|
||||||
|
.option(
|
||||||
|
"-ldc, --ledger-derivation-change <number>",
|
||||||
|
"ledger derivation change to use"
|
||||||
|
)
|
||||||
|
.option(
|
||||||
|
"-w, --wallet <filepath>",
|
||||||
|
"multisig wallet secret key filepath",
|
||||||
|
"keys/key.json"
|
||||||
|
)
|
||||||
|
.option("-t, --threshold <number>", "new threshold")
|
||||||
|
.action(async (options) => {
|
||||||
|
const squad = await getSquadsClient(
|
||||||
|
options.cluster,
|
||||||
|
options.ledger,
|
||||||
|
options.ledgerDerivationAccount,
|
||||||
|
options.ledgerDerivationChange,
|
||||||
|
options.wallet
|
||||||
|
);
|
||||||
|
await changeThreshold(
|
||||||
|
options.cluster,
|
||||||
|
squad,
|
||||||
|
options.ledger,
|
||||||
|
new PublicKey(options.vaultAddress),
|
||||||
|
options.threshold
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
program
|
||||||
|
.command("add-member")
|
||||||
|
.description("Add member to multisig")
|
||||||
|
.option("-c, --cluster <network>", "solana cluster to use", "devnet")
|
||||||
|
.requiredOption("-v, --vault-address <address>", "multisig vault address")
|
||||||
|
.option("-l, --ledger", "use ledger")
|
||||||
|
.option(
|
||||||
|
"-lda, --ledger-derivation-account <number>",
|
||||||
|
"ledger derivation account to use"
|
||||||
|
)
|
||||||
|
.option(
|
||||||
|
"-ldc, --ledger-derivation-change <number>",
|
||||||
|
"ledger derivation change to use"
|
||||||
|
)
|
||||||
|
.option(
|
||||||
|
"-w, --wallet <filepath>",
|
||||||
|
"multisig wallet secret key filepath",
|
||||||
|
"keys/key.json"
|
||||||
|
)
|
||||||
|
.option("-m, --member <address>", "new member address")
|
||||||
|
.action(async (options) => {
|
||||||
|
const squad = await getSquadsClient(
|
||||||
|
options.cluster,
|
||||||
|
options.ledger,
|
||||||
|
options.ledgerDerivationAccount,
|
||||||
|
options.ledgerDerivationChange,
|
||||||
|
options.wallet
|
||||||
|
);
|
||||||
|
await addMember(
|
||||||
|
options.cluster,
|
||||||
|
squad,
|
||||||
|
options.ledger,
|
||||||
|
new PublicKey(options.vaultAddress),
|
||||||
|
new PublicKey(options.member)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
program
|
||||||
|
.command("remove-member")
|
||||||
|
.description("Remove member from multisig")
|
||||||
|
.option("-c, --cluster <network>", "solana cluster to use", "devnet")
|
||||||
|
.requiredOption("-v, --vault-address <address>", "multisig vault address")
|
||||||
|
.option("-l, --ledger", "use ledger")
|
||||||
|
.option(
|
||||||
|
"-lda, --ledger-derivation-account <number>",
|
||||||
|
"ledger derivation account to use"
|
||||||
|
)
|
||||||
|
.option(
|
||||||
|
"-ldc, --ledger-derivation-change <number>",
|
||||||
|
"ledger derivation change to use"
|
||||||
|
)
|
||||||
|
.option(
|
||||||
|
"-w, --wallet <filepath>",
|
||||||
|
"multisig wallet secret key filepath",
|
||||||
|
"keys/key.json"
|
||||||
|
)
|
||||||
|
.option("-m, --member <address>", "old member address")
|
||||||
|
.action(async (options) => {
|
||||||
|
const squad = await getSquadsClient(
|
||||||
|
options.cluster,
|
||||||
|
options.ledger,
|
||||||
|
options.ledgerDerivationAccount,
|
||||||
|
options.ledgerDerivationChange,
|
||||||
|
options.wallet
|
||||||
|
);
|
||||||
|
await removeMember(
|
||||||
|
options.cluster,
|
||||||
|
squad,
|
||||||
|
options.ledger,
|
||||||
|
new PublicKey(options.vaultAddress),
|
||||||
|
new PublicKey(options.member)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
// TODO: add subcommand for creating governance messages in the right format
|
// TODO: add subcommand for creating governance messages in the right format
|
||||||
|
|
||||||
program.parse();
|
program.parse();
|
||||||
|
@ -548,6 +659,84 @@ async function executeMultisigTx(
|
||||||
console.log(`Payload: ${Buffer.from(parsedVaa.payload).toString("hex")}`);
|
console.log(`Payload: ${Buffer.from(parsedVaa.payload).toString("hex")}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function changeThreshold(
|
||||||
|
cluster: Cluster,
|
||||||
|
squad: Squads,
|
||||||
|
ledger: boolean,
|
||||||
|
vault: PublicKey,
|
||||||
|
threshold: number
|
||||||
|
) {
|
||||||
|
const msAccount = await squad.getMultisig(vault);
|
||||||
|
const txKey = await createTx(squad, ledger, vault);
|
||||||
|
const ix = await squad.buildChangeThresholdMember(
|
||||||
|
msAccount.publicKey,
|
||||||
|
msAccount.externalAuthority,
|
||||||
|
threshold
|
||||||
|
);
|
||||||
|
|
||||||
|
const squadIxs: SquadInstruction[] = [{ instruction: ix }];
|
||||||
|
await addInstructionsToTx(
|
||||||
|
cluster,
|
||||||
|
squad,
|
||||||
|
ledger,
|
||||||
|
msAccount.publicKey,
|
||||||
|
txKey,
|
||||||
|
squadIxs
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function addMember(
|
||||||
|
cluster: Cluster,
|
||||||
|
squad: Squads,
|
||||||
|
ledger: boolean,
|
||||||
|
vault: PublicKey,
|
||||||
|
member: PublicKey
|
||||||
|
) {
|
||||||
|
const msAccount = await squad.getMultisig(vault);
|
||||||
|
const txKey = await createTx(squad, ledger, vault);
|
||||||
|
const ix = await squad.buildAddMember(
|
||||||
|
msAccount.publicKey,
|
||||||
|
msAccount.externalAuthority,
|
||||||
|
member
|
||||||
|
);
|
||||||
|
|
||||||
|
const squadIxs: SquadInstruction[] = [{ instruction: ix }];
|
||||||
|
await addInstructionsToTx(
|
||||||
|
cluster,
|
||||||
|
squad,
|
||||||
|
ledger,
|
||||||
|
msAccount.publicKey,
|
||||||
|
txKey,
|
||||||
|
squadIxs
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function removeMember(
|
||||||
|
cluster: Cluster,
|
||||||
|
squad: Squads,
|
||||||
|
ledger: boolean,
|
||||||
|
vault: PublicKey,
|
||||||
|
member: PublicKey
|
||||||
|
) {
|
||||||
|
const msAccount = await squad.getMultisig(vault);
|
||||||
|
const txKey = await createTx(squad, ledger, vault);
|
||||||
|
const ix = await squad.buildRemoveMember(
|
||||||
|
msAccount.publicKey,
|
||||||
|
msAccount.externalAuthority,
|
||||||
|
member
|
||||||
|
);
|
||||||
|
|
||||||
|
const squadIxs: SquadInstruction[] = [{ instruction: ix }];
|
||||||
|
await addInstructionsToTx(
|
||||||
|
cluster,
|
||||||
|
squad,
|
||||||
|
ledger,
|
||||||
|
msAccount.publicKey,
|
||||||
|
txKey,
|
||||||
|
squadIxs
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
async function parse(data: string) {
|
async function parse(data: string) {
|
||||||
const { parse_vaa } = await importCoreWasm();
|
const { parse_vaa } = await importCoreWasm();
|
||||||
return parse_vaa(Uint8Array.from(Buffer.from(data, "base64")));
|
return parse_vaa(Uint8Array.from(Buffer.from(data, "base64")));
|
||||||
|
|
Loading…
Reference in New Issue