@@ -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