Skip to content

Commit 9066724

Browse files
committed
feat(transaction_execute): implement tests
1 parent b827fa9 commit 9066724

File tree

1 file changed

+126
-9
lines changed

1 file changed

+126
-9
lines changed

tests/multisig.ts

Lines changed: 126 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ describe("multisig", () => {
2222
executor: Keypair.generate(),
2323
};
2424

25-
console.log("members:");
25+
console.log("Members:");
2626
for (const [name, keypair] of Object.entries(members)) {
27-
console.log(name, ":", JSON.stringify(keypair.publicKey, null, 2));
27+
console.log(name, ":", keypair.publicKey.toBase58());
2828
}
2929

3030
// For the sake of the tests we'll create two multisigs,
@@ -263,7 +263,7 @@ describe("multisig", () => {
263263
mask: Permission.Execute,
264264
},
265265
},
266-
].sort((a, b) => a.key.toBuffer().compare(b.key.toBuffer()))
266+
].sort((a, b) => comparePubkeys(a.key, b.key))
267267
);
268268
assert.strictEqual(multisigAccount.authorityIndex, 1);
269269
assert.strictEqual(multisigAccount.transactionIndex.toString(), "0");
@@ -627,11 +627,13 @@ describe("multisig", () => {
627627
const testPayee = Keypair.generate();
628628
const testIx1 = await createTestTransferInstruction(
629629
vaultPda,
630-
testPayee.publicKey
630+
testPayee.publicKey,
631+
1 * LAMPORTS_PER_SOL
631632
);
632633
const testIx2 = await createTestTransferInstruction(
633634
vaultPda,
634-
testPayee.publicKey
635+
testPayee.publicKey,
636+
1 * LAMPORTS_PER_SOL
635637
);
636638
const testTransferMessage = new TransactionMessage({
637639
payerKey: vaultPda,
@@ -751,7 +753,7 @@ describe("multisig", () => {
751753
);
752754
});
753755

754-
it("approve a transaction", async () => {
756+
it("approve transaction", async () => {
755757
const [multisigPda] = multisig.getMultisigPda({
756758
createKey: autonomousMultisigCreateKey,
757759
});
@@ -818,11 +820,122 @@ describe("multisig", () => {
818820
);
819821
});
820822

821-
it("error: stale transaction")
823+
it("approve transaction and reach threshold", async () => {
824+
const [multisigPda] = multisig.getMultisigPda({
825+
createKey: autonomousMultisigCreateKey,
826+
});
827+
let multisigAccount = await Multisig.fromAccountAddress(
828+
connection,
829+
multisigPda
830+
);
831+
832+
// Approve the last transaction.
833+
const transactionIndex = multisig.utils.toBigInt(
834+
multisigAccount.transactionIndex
835+
);
836+
837+
const signature = await multisig.rpc.transactionApprove({
838+
connection,
839+
feePayer: members.almighty,
840+
multisigPda,
841+
transactionIndex,
842+
member: members.almighty.publicKey,
843+
memo: "LGTM",
844+
signers: [members.almighty],
845+
});
846+
await connection.confirmTransaction(signature);
847+
848+
// Verify the transaction account.
849+
const [transactionPda] = multisig.getTransactionPda({
850+
multisigPda,
851+
index: transactionIndex,
852+
});
853+
const transactionAccount = await MultisigTransaction.fromAccountAddress(
854+
connection,
855+
transactionPda
856+
);
857+
assert.deepEqual(
858+
transactionAccount.approved.map((key) => key.toBase58()),
859+
[members.voter.publicKey, members.almighty.publicKey]
860+
.sort(comparePubkeys)
861+
.map((key) => key.toBase58())
862+
);
863+
assert.deepEqual(transactionAccount.rejected, []);
864+
assert.deepEqual(transactionAccount.cancelled, []);
865+
// We reached the threshold, so the transaction is ExecutionReady now.
866+
assert.strictEqual(
867+
transactionAccount.status,
868+
TransactionStatus.ExecuteReady
869+
);
870+
});
871+
872+
it("error: stale transaction");
873+
874+
it("error: invalid transaction status");
875+
876+
it("error: transaction is not for multisig");
877+
});
878+
879+
describe("transaction_execute", () => {
880+
it("execute a transaction", async () => {
881+
const [multisigPda] = multisig.getMultisigPda({
882+
createKey: autonomousMultisigCreateKey,
883+
});
884+
let multisigAccount = await Multisig.fromAccountAddress(
885+
connection,
886+
multisigPda
887+
);
888+
889+
// Execute the last transaction.
890+
const transactionIndex = multisig.utils.toBigInt(
891+
multisigAccount.transactionIndex
892+
);
893+
894+
const [transactionPda] = multisig.getTransactionPda({
895+
multisigPda,
896+
index: transactionIndex,
897+
});
898+
let transactionAccount = await MultisigTransaction.fromAccountAddress(
899+
connection,
900+
transactionPda
901+
);
902+
903+
const [vaultPda] = multisig.getAuthorityPda({
904+
multisigPda,
905+
index: transactionAccount.authorityIndex,
906+
});
907+
const preVaultBalance = await connection.getBalance(vaultPda);
908+
assert.strictEqual(preVaultBalance, 2 * LAMPORTS_PER_SOL);
909+
910+
const signature = await multisig.rpc.transactionExecute({
911+
connection,
912+
feePayer: members.executor,
913+
multisigPda,
914+
transactionIndex,
915+
member: members.executor.publicKey,
916+
signers: [members.executor],
917+
});
918+
await connection.confirmTransaction(signature);
919+
920+
// Verify the transaction account.
921+
transactionAccount = await MultisigTransaction.fromAccountAddress(
922+
connection,
923+
transactionPda
924+
);
925+
assert.strictEqual(transactionAccount.status, TransactionStatus.Executed);
926+
927+
const postVaultBalance = await connection.getBalance(vaultPda);
928+
// Transferred 2 SOL to payee.
929+
assert.strictEqual(postVaultBalance, 0);
930+
});
931+
932+
it("error: not a member");
933+
934+
it("error: unauthorized");
822935

823-
it("error: invalid transaction status")
936+
it("error: invalid transaction status");
824937

825-
it("error: transaction is not for multisig")
938+
it("error: transaction is not for multisig");
826939
});
827940
});
828941

@@ -849,3 +962,7 @@ async function createTestTransferInstruction(
849962
toPubkey: recipient,
850963
});
851964
}
965+
966+
function comparePubkeys(a: PublicKey, b: PublicKey) {
967+
return a.toBuffer().compare(b.toBuffer());
968+
}

0 commit comments

Comments
 (0)