@@ -56,12 +56,13 @@ def run_test(self):
56
56
self .generate (self .wallet , 149 )
57
57
58
58
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 )
64
64
65
+ self .test_multisig_script_limit ()
65
66
self .test_mixing_uncompressed_and_compressed_keys (node0 , wallet_multi )
66
67
self .test_sortedmulti_descriptors_bip67 ()
67
68
@@ -83,6 +84,21 @@ def check_addmultisigaddress_errors(self):
83
84
pubs = [self .nodes [1 ].getaddressinfo (addr )["pubkey" ] for addr in addresses ]
84
85
assert_raises_rpc_error (- 5 , "Bech32m multisig addresses cannot be created with legacy wallets" , self .nodes [0 ].addmultisigaddress , 2 , pubs , "" , "bech32m" )
85
86
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
+
86
102
def do_multisig (self , nkeys , nsigs , output_type , wallet_multi ):
87
103
node0 , node1 , node2 = self .nodes
88
104
pub_keys = self .pub [0 : nkeys ]
@@ -117,13 +133,13 @@ def do_multisig(self, nkeys, nsigs, output_type, wallet_multi):
117
133
assert mredeemw == mredeem
118
134
119
135
spk = address_to_scriptpubkey (madd )
120
- value = decimal .Decimal ("0.00001300 " )
136
+ value = decimal .Decimal ("0.00004000 " )
121
137
tx = self .wallet .send_to (from_node = self .nodes [0 ], scriptPubKey = spk , amount = int (value * COIN ))
122
138
prevtxs = [{"txid" : tx ["txid" ], "vout" : tx ["sent_vout" ], "scriptPubKey" : spk .hex (), "redeemScript" : mredeem , "amount" : value }]
123
139
124
140
self .generate (node0 , 1 )
125
141
126
- outval = value - decimal .Decimal ("0.00001000" )
142
+ outval = value - decimal .Decimal ("0.00002000" ) # deduce fee (must be higher than the min relay fee )
127
143
# send coins to node2 when wallet is enabled
128
144
node2_balance = node2 .getbalances ()['mine' ]['trusted' ] if self .is_wallet_compiled () else 0
129
145
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):
157
173
158
174
rawtx2 = node2 .signrawtransactionwithkey (rawtx , priv_keys [0 :nsigs - 1 ], prevtxs )
159
175
rawtx3 = node2 .signrawtransactionwithkey (rawtx2 ["hex" ], [priv_keys [- 1 ]], prevtxs )
176
+ assert rawtx3 ['complete' ]
160
177
161
178
tx = node0 .sendrawtransaction (rawtx3 ["hex" ], 0 )
162
179
blk = self .generate (node0 , 1 )[0 ]
0 commit comments