@@ -56,12 +56,13 @@ def run_test(self):
5656 self .generate (self .wallet , 149 )
5757
5858 wallet_multi = self .create_wallet (node1 , 'wmulti' ) if self ._requires_wallet else None
59- self .create_keys (5 )
60- for nkeys in [ 3 , 5 ]:
61- for nsigs in [ 2 , 3 ] :
62- for output_type in ["bech32" , "p2sh-segwit" , "legacy" ]:
63- self .do_multisig (nkeys , nsigs , output_type , wallet_multi )
59+ self .create_keys (21 ) # max number of allowed keys + 1
60+ m_of_n = [( 2 , 3 ), ( 3 , 3 ), ( 2 , 5 ), ( 3 , 5 ), ( 10 , 15 ), ( 15 , 15 )]
61+ for ( sigs , keys ) in m_of_n :
62+ for output_type in ["bech32" , "p2sh-segwit" , "legacy" ]:
63+ self .do_multisig (keys , sigs , output_type , wallet_multi )
6464
65+ self .test_multisig_script_limit ()
6566 self .test_mixing_uncompressed_and_compressed_keys (node0 , wallet_multi )
6667 self .test_sortedmulti_descriptors_bip67 ()
6768
@@ -83,6 +84,21 @@ def check_addmultisigaddress_errors(self):
8384 pubs = [self .nodes [1 ].getaddressinfo (addr )["pubkey" ] for addr in addresses ]
8485 assert_raises_rpc_error (- 5 , "Bech32m multisig addresses cannot be created with legacy wallets" , self .nodes [0 ].addmultisigaddress , 2 , pubs , "" , "bech32m" )
8586
87+ def test_multisig_script_limit (self ):
88+ node1 = self .nodes [1 ]
89+ pubkeys = self .pub [0 :20 ]
90+
91+ self .log .info ('Test legacy redeem script max size limit' )
92+ assert_raises_rpc_error (- 8 , "redeemScript exceeds size limit: 684 > 520" , node1 .createmultisig , 16 , pubkeys , 'legacy' )
93+
94+ self .log .info ('Test valid 16-20 multisig p2sh-legacy and bech32 (no wallet)' )
95+ self .do_multisig (nkeys = 20 , nsigs = 16 , output_type = "p2sh-segwit" , wallet_multi = None )
96+ self .do_multisig (nkeys = 20 , nsigs = 16 , output_type = "bech32" , wallet_multi = None )
97+
98+ self .log .info ('Test invalid 16-21 multisig p2sh-legacy and bech32 (no wallet)' )
99+ assert_raises_rpc_error (- 8 , "Number of keys involved in the multisignature address creation > 20" , node1 .createmultisig , 16 , self .pub , 'p2sh-segwit' )
100+ assert_raises_rpc_error (- 8 , "Number of keys involved in the multisignature address creation > 20" , node1 .createmultisig , 16 , self .pub , 'bech32' )
101+
86102 def do_multisig (self , nkeys , nsigs , output_type , wallet_multi ):
87103 node0 , node1 , node2 = self .nodes
88104 pub_keys = self .pub [0 : nkeys ]
@@ -117,13 +133,13 @@ def do_multisig(self, nkeys, nsigs, output_type, wallet_multi):
117133 assert mredeemw == mredeem
118134
119135 spk = address_to_scriptpubkey (madd )
120- value = decimal .Decimal ("0.00001300 " )
136+ value = decimal .Decimal ("0.00004000 " )
121137 tx = self .wallet .send_to (from_node = self .nodes [0 ], scriptPubKey = spk , amount = int (value * COIN ))
122138 prevtxs = [{"txid" : tx ["txid" ], "vout" : tx ["sent_vout" ], "scriptPubKey" : spk .hex (), "redeemScript" : mredeem , "amount" : value }]
123139
124140 self .generate (node0 , 1 )
125141
126- outval = value - decimal .Decimal ("0.00001000" )
142+ outval = value - decimal .Decimal ("0.00002000" ) # deduce fee (must be higher than the min relay fee )
127143 # send coins to node2 when wallet is enabled
128144 node2_balance = node2 .getbalances ()['mine' ]['trusted' ] if self .is_wallet_compiled () else 0
129145 out_addr = node2 .getnewaddress () if self .is_wallet_compiled () else getnewdestination ('bech32' )[2 ]
@@ -157,6 +173,7 @@ def do_multisig(self, nkeys, nsigs, output_type, wallet_multi):
157173
158174 rawtx2 = node2 .signrawtransactionwithkey (rawtx , priv_keys [0 :nsigs - 1 ], prevtxs )
159175 rawtx3 = node2 .signrawtransactionwithkey (rawtx2 ["hex" ], [priv_keys [- 1 ]], prevtxs )
176+ assert rawtx3 ['complete' ]
160177
161178 tx = node0 .sendrawtransaction (rawtx3 ["hex" ], 0 )
162179 blk = self .generate (node0 , 1 )[0 ]
0 commit comments