@@ -27,21 +27,35 @@ import XCTest
2727
2828class MockHelperTests : XCTestCase {
2929 // MARK: - 1 of 3 Multi-Sig [ABC]
30- // Standard Multi-Sig
31- func testStandard( ) {
32- func verify( with key: MockKey ) throws -> Bool {
33- // lock script
34- let standardLockScript = Script ( publicKeys: [ MockKey . keyA. pubkey, MockKey . keyB. pubkey, MockKey . keyC. pubkey] , signaturesRequired: 1 ) !
35-
36- // unlock script builder
37- let standardUnlockScript = { ( sig: Data , key: MockKey ) -> Script in
30+ // MARK: Standard Multi-Sig
31+ struct Standard1of3 {
32+ static let lockScript : Script = Script ( publicKeys: [ MockKey . keyA. pubkey,
33+ MockKey . keyB. pubkey,
34+ MockKey . keyC. pubkey] ,
35+ signaturesRequired: 1 ) !
36+
37+ struct UnlockScriptBuilder : MockUnlockScriptBuilder {
38+ func build( pairs: [ SigKeyPair ] ) -> Script {
39+ guard let signature = pairs. first? . signature else {
40+ return Script ( )
41+ }
42+
3843 let script = try ! Script ( )
3944 . append ( . OP_0)
40- . appendData ( sig )
45+ . appendData ( signature )
4146 return script
4247 }
43-
44- return try MockHelper . verifySingleKey ( lockScript: standardLockScript, unlockScriptBuilder: standardUnlockScript, key: key, verbose: false )
48+ }
49+ }
50+
51+
52+ func testStandard( ) {
53+ func verify( with key: MockKey ) throws -> Bool {
54+ return try MockHelper . verifySingleKey (
55+ lockScript: Standard1of3 . lockScript,
56+ unlockScriptBuilder: Standard1of3 . UnlockScriptBuilder ( ) ,
57+ key: key,
58+ verbose: false )
4559 }
4660
4761 func succeed( with key: MockKey ) {
@@ -72,22 +86,32 @@ class MockHelperTests: XCTestCase {
7286 }
7387
7488 // P2SH Multi-Sig
75- func testP2SH( ) {
76- func verify( with key: MockKey ) throws -> Bool {
77- // P2SH multisig[ABC]
78- let redeemScript : Script = Script ( publicKeys: [ MockKey . keyA. pubkey, MockKey . keyB. pubkey, MockKey . keyC. pubkey] , signaturesRequired: 1 ) !
79-
80- let p2shLockScript : Script = redeemScript. toP2SH ( )
81-
82- // p2sh multisig[ABC] unlock
83- let p2shUnlockScriptBuilder = { ( sigWithHashType: Data , key: MockKey ) -> Script in
89+ struct P2SH1of3 {
90+ static let redeemScript : Script = Script ( publicKeys: [ MockKey . keyA. pubkey, MockKey . keyB. pubkey, MockKey . keyC. pubkey] , signaturesRequired: 1 ) !
91+
92+ static let lockScript : Script = redeemScript. toP2SH ( )
93+
94+ struct UnlockScriptBuilder : MockUnlockScriptBuilder {
95+ func build( pairs: [ SigKeyPair ] ) -> Script {
96+ guard let signature = pairs. first? . signature else {
97+ return Script ( )
98+ }
99+
84100 return try ! Script ( )
85101 . append ( . OP_0)
86- . appendData ( sigWithHashType )
102+ . appendData ( signature )
87103 . appendData ( redeemScript. data)
88104 }
105+ }
106+ }
89107
90- return try MockHelper . verifySingleKey ( lockScript: p2shLockScript, unlockScriptBuilder: p2shUnlockScriptBuilder, key: key, verbose: false )
108+ func testP2SH( ) {
109+ func verify( with key: MockKey ) throws -> Bool {
110+ return try MockHelper . verifySingleKey (
111+ lockScript: P2SH1of3 . lockScript,
112+ unlockScriptBuilder: P2SH1of3 . UnlockScriptBuilder ( ) ,
113+ key: key,
114+ verbose: false )
91115 }
92116
93117 func succeed( with key: MockKey ) {
@@ -118,61 +142,72 @@ class MockHelperTests: XCTestCase {
118142 }
119143
120144 // Custom Multi-Sig
121- func testCustom( ) {
122- func verify( with key: MockKey ) throws -> Bool {
123- let customLockScript = try ! Script ( )
124- // stack: sig pub bool2 bool1
125- . append ( . OP_IF)
126- . append ( . OP_IF)
127- . append ( . OP_DUP)
128- . append ( . OP_HASH160)
129- . appendData ( MockKey . keyA. pubkeyHash)
130- . append ( . OP_ELSE)
131- . append ( . OP_DUP)
132- . append ( . OP_HASH160)
133- . appendData ( MockKey . keyB. pubkeyHash)
134- . append ( . OP_ENDIF)
135- . append ( . OP_ELSE)
136- . append ( . OP_DUP)
137- . append ( . OP_HASH160)
138- . appendData ( MockKey . keyC. pubkeyHash)
139- . append ( . OP_ENDIF)
140- // stack: sig pub pubkeyhash pubkeyhash
141- . append ( . OP_EQUALVERIFY)
142- // stack: sig pub
143- . append ( . OP_CHECKSIG)
144-
145- // custom multisig unlock
146- let customUnlockScript = { ( sigWithHashType: Data , key: MockKey ) -> Script in
145+ struct Custom1of3 {
146+ static let lockScript = try ! Script ( )
147+ // stack: sig pub bool2 bool1
148+ . append ( . OP_IF)
149+ . append ( . OP_IF)
150+ . append ( . OP_DUP)
151+ . append ( . OP_HASH160)
152+ . appendData ( MockKey . keyA. pubkeyHash)
153+ . append ( . OP_ELSE)
154+ . append ( . OP_DUP)
155+ . append ( . OP_HASH160)
156+ . appendData ( MockKey . keyB. pubkeyHash)
157+ . append ( . OP_ENDIF)
158+ . append ( . OP_ELSE)
159+ . append ( . OP_DUP)
160+ . append ( . OP_HASH160)
161+ . appendData ( MockKey . keyC. pubkeyHash)
162+ . append ( . OP_ENDIF)
163+ // stack: sig pub pubkeyhash pubkeyhash
164+ . append ( . OP_EQUALVERIFY)
165+ // stack: sig pub
166+ . append ( . OP_CHECKSIG)
167+
168+ struct UnlockScriptBuilder : MockUnlockScriptBuilder {
169+ func build( pairs: [ SigKeyPair ] ) -> Script {
170+ guard let key = pairs. first? . key, let signature = pairs. first? . signature else {
171+ return Script ( )
172+ }
173+
147174 switch key {
148- case . keyA:
175+ case MockKey . keyA. privkey . publicKey ( ) :
149176 return try ! Script ( )
150- . appendData ( sigWithHashType )
151- . appendData ( key. pubkey . data)
177+ . appendData ( signature )
178+ . appendData ( key. data)
152179 . append ( . OP_TRUE)
153180 . append ( . OP_TRUE)
154- case . keyB:
181+ case MockKey . keyB. privkey . publicKey ( ) :
155182 return try ! Script ( )
156- . appendData ( sigWithHashType )
157- . appendData ( key. pubkey . data)
183+ . appendData ( signature )
184+ . appendData ( key. data)
158185 . append ( . OP_FALSE)
159186 . append ( . OP_TRUE)
160- case . keyC:
187+ case MockKey . keyC. privkey . publicKey ( ) :
161188 return try ! Script ( )
162- . appendData ( sigWithHashType )
163- . appendData ( key. pubkey . data)
189+ . appendData ( signature )
190+ . appendData ( key. data)
164191 . append ( . OP_FALSE)
165192 default :
166193 // unlock script for keyA
167194 return try ! Script ( )
168- . appendData ( sigWithHashType )
169- . appendData ( key. pubkey . data)
195+ . appendData ( signature )
196+ . appendData ( key. data)
170197 . append ( . OP_TRUE)
171198 . append ( . OP_TRUE)
172199 }
173200 }
201+ }
174202
175- return try MockHelper . verifySingleKey ( lockScript: customLockScript, unlockScriptBuilder: customUnlockScript, key: key, verbose: false )
203+ }
204+ func testCustom( ) {
205+ func verify( with key: MockKey ) throws -> Bool {
206+ return try MockHelper . verifySingleKey (
207+ lockScript: Custom1of3 . lockScript,
208+ unlockScriptBuilder: Custom1of3 . UnlockScriptBuilder ( ) ,
209+ key: key,
210+ verbose: false )
176211 }
177212
178213 func succeed( with key: MockKey ) {
@@ -204,22 +239,27 @@ class MockHelperTests: XCTestCase {
204239
205240 // MARK: - 2 of 3 Multi-Sig [ABC]
206241 // Standard Multi-Sig
207- func testStandard2of3( ) {
208- func verify( with keys: [ MockKey ] ) throws -> Bool {
209- // lock script
210- let standardLockScript = Script ( publicKeys: [ MockKey . keyA. pubkey, MockKey . keyB. pubkey, MockKey . keyC. pubkey] , signaturesRequired: 2 ) !
211-
212- // unlock script builder
213- let standardUnlockScript = { ( pairs: [ SigKeyPair ] ) -> Script in
214- let script = try ! Script ( )
215- . append ( . OP_0)
216- for pair in pairs {
217- try ! script. appendData ( pair. sig)
218- }
242+ struct Standard2of3 {
243+ static let lockScript = Script ( publicKeys: [ MockKey . keyA. pubkey,
244+ MockKey . keyB. pubkey,
245+ MockKey . keyC. pubkey] ,
246+ signaturesRequired: 2 ) !
247+ struct UnlockScriptBuilder : MockUnlockScriptBuilder {
248+ func build( pairs: [ SigKeyPair ] ) -> Script {
249+ let script = try ! Script ( ) . append ( . OP_0)
250+ pairs. forEach { try ! script. appendData ( $0. signature) }
219251 return script
252+
220253 }
221-
222- return try MockHelper . verifyMultiKey ( lockScript: standardLockScript, unlockScriptBuilder: standardUnlockScript, keys: keys, verbose: false )
254+ }
255+ }
256+ func testStandard2of3( ) {
257+ func verify( with keys: [ MockKey ] ) throws -> Bool {
258+ return try MockHelper . verifyMultiKey (
259+ lockScript: Standard2of3 . lockScript,
260+ unlockScriptBuilder: Standard2of3 . UnlockScriptBuilder ( ) ,
261+ keys: keys,
262+ verbose: false )
223263 }
224264
225265 func succeed( with keys: [ MockKey ] ) {
0 commit comments