123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- const anchor = require("@project-serum/anchor");
- const assert = require("assert");
- describe("multisig", () => {
- // Configure the client to use the local cluster.
- anchor.setProvider(anchor.Provider.env());
- const program = anchor.workspace.Multisig;
- it("Tests the multisig program", async () => {
- const multisig = anchor.web3.Keypair.generate();
- const [
- multisigSigner,
- nonce,
- ] = await anchor.web3.PublicKey.findProgramAddress(
- [multisig.publicKey.toBuffer()],
- program.programId
- );
- const multisigSize = 200; // Big enough.
- const ownerA = anchor.web3.Keypair.generate();
- const ownerB = anchor.web3.Keypair.generate();
- const ownerC = anchor.web3.Keypair.generate();
- const ownerD = anchor.web3.Keypair.generate();
- const owners = [ownerA.publicKey, ownerB.publicKey, ownerC.publicKey];
- const threshold = new anchor.BN(2);
- await program.rpc.createMultisig(owners, threshold, nonce, {
- accounts: {
- multisig: multisig.publicKey,
- rent: anchor.web3.SYSVAR_RENT_PUBKEY,
- },
- instructions: [
- await program.account.multisig.createInstruction(
- multisig,
- multisigSize
- ),
- ],
- signers: [multisig],
- });
- let multisigAccount = await program.account.multisig.fetch(multisig.publicKey);
- assert.equal(multisigAccount.nonce, nonce);
- assert.ok(multisigAccount.threshold.eq(new anchor.BN(2)));
- assert.deepEqual(multisigAccount.owners, owners);
- const pid = program.programId;
- const accounts = [
- {
- pubkey: multisig.publicKey,
- isWritable: true,
- isSigner: false,
- },
- {
- pubkey: multisigSigner,
- isWritable: false,
- isSigner: true,
- },
- ];
- const newOwners = [ownerA.publicKey, ownerB.publicKey, ownerD.publicKey];
- const data = program.coder.instruction.encode('set_owners', {
- owners: newOwners,
- });
- const transaction = anchor.web3.Keypair.generate();
- const txSize = 1000; // Big enough, cuz I'm lazy.
- await program.rpc.createTransaction(pid, accounts, data, {
- accounts: {
- multisig: multisig.publicKey,
- transaction: transaction.publicKey,
- proposer: ownerA.publicKey,
- rent: anchor.web3.SYSVAR_RENT_PUBKEY,
- },
- instructions: [
- await program.account.transaction.createInstruction(
- transaction,
- txSize
- ),
- ],
- signers: [transaction, ownerA],
- });
- const txAccount = await program.account.transaction.fetch(transaction.publicKey);
- assert.ok(txAccount.programId.equals(pid));
- assert.deepEqual(txAccount.accounts, accounts);
- assert.deepEqual(txAccount.data, data);
- assert.ok(txAccount.multisig.equals(multisig.publicKey));
- assert.equal(txAccount.didExecute, false);
- // Other owner approves transaction.
- await program.rpc.approve({
- accounts: {
- multisig: multisig.publicKey,
- transaction: transaction.publicKey,
- owner: ownerB.publicKey,
- },
- signers: [ownerB],
- });
- // Now that we've reached the threshold, send the transaction.
- await program.rpc.executeTransaction({
- accounts: {
- multisig: multisig.publicKey,
- multisigSigner,
- transaction: transaction.publicKey,
- },
- remainingAccounts: program.instruction.setOwners
- .accounts({
- multisig: multisig.publicKey,
- multisigSigner,
- })
- // Change the signer status on the vendor signer since it's signed by the program, not the client.
- .map((meta) =>
- meta.pubkey.equals(multisigSigner)
- ? { ...meta, isSigner: false }
- : meta
- )
- .concat({
- pubkey: program.programId,
- isWritable: false,
- isSigner: false,
- }),
- });
- multisigAccount = await program.account.multisig.fetch(multisig.publicKey);
- assert.equal(multisigAccount.nonce, nonce);
- assert.ok(multisigAccount.threshold.eq(new anchor.BN(2)));
- assert.deepEqual(multisigAccount.owners, newOwners);
- });
- });
|