88 "github.com/btcsuite/btcd/btcec/v2"
99 "github.com/btcsuite/btcd/btcec/v2/schnorr"
1010 "github.com/btcsuite/btcd/btcutil"
11+ "github.com/btcsuite/btcd/wire"
1112 "github.com/lightninglabs/loop/loopdb"
1213 "github.com/lightninglabs/loop/staticaddr/script"
1314 "github.com/lightninglabs/loop/swap"
@@ -93,8 +94,9 @@ func (m *mockStaticAddressClient) ServerNewAddress(ctx context.Context,
9394
9495 args := m .Called (ctx , in , opts )
9596
96- return args .Get (0 ).(* swapserverrpc.ServerNewAddressResponse ),
97- args .Error (1 )
97+ resp , _ := args .Get (0 ).(* swapserverrpc.ServerNewAddressResponse )
98+
99+ return resp , args .Error (1 )
98100}
99101
100102// TestManager tests the static address manager generates the corerct static
@@ -128,6 +130,90 @@ func TestManager(t *testing.T) {
128130 require .EqualValues (t , defaultExpiry , expiry )
129131}
130132
133+ // TestNewAddressValidatesServerResponse tests that the untrusted
134+ // ServerNewAddress response is validated before the address script is created.
135+ func TestNewAddressValidatesServerResponse (t * testing.T ) {
136+ tests := []struct {
137+ name string
138+ resp * swapserverrpc.ServerNewAddressResponse
139+ expected string
140+ }{
141+ {
142+ name : "nil response" ,
143+ expected : "missing server new address response" ,
144+ },
145+ {
146+ name : "nil params" ,
147+ resp : & swapserverrpc.ServerNewAddressResponse {},
148+ expected : "missing server address parameters" ,
149+ },
150+ {
151+ name : "missing server key" ,
152+ resp : & swapserverrpc.ServerNewAddressResponse {
153+ Params : & swapserverrpc.ServerAddressParameters {
154+ Expiry : defaultExpiry ,
155+ },
156+ },
157+ expected : "missing server public key" ,
158+ },
159+ {
160+ name : "zero expiry" ,
161+ resp : newServerNewAddressResponse (0 ),
162+ expected : "static address CSV expiry must be non-zero" ,
163+ },
164+ {
165+ name : "seconds flag" ,
166+ resp : newServerNewAddressResponse (
167+ wire .SequenceLockTimeIsSeconds | 1 ,
168+ ),
169+ expected : "invalid static address CSV flags" ,
170+ },
171+ {
172+ name : "disabled flag" ,
173+ resp : newServerNewAddressResponse (
174+ wire .SequenceLockTimeDisabled | 1 ,
175+ ),
176+ expected : "invalid static address CSV flags" ,
177+ },
178+ {
179+ name : "reserved flag" ,
180+ resp : newServerNewAddressResponse (
181+ wire .SequenceLockTimeMask + 1 ,
182+ ),
183+ expected : "invalid static address CSV flags" ,
184+ },
185+ {
186+ name : "too large" ,
187+ resp : newServerNewAddressResponse (
188+ maxStaticAddressCSVExpiry + 1 ,
189+ ),
190+ expected : "exceeds maximum" ,
191+ },
192+ }
193+
194+ for _ , test := range tests {
195+ t .Run (test .name , func (t * testing.T ) {
196+ testContext := NewAddressManagerTestContextWithResponse (
197+ t , test .resp ,
198+ )
199+
200+ _ , _ , err := testContext .manager .NewAddress (t .Context ())
201+ require .ErrorContains (t , err , test .expected )
202+ })
203+ }
204+ }
205+
206+ // TestNewAddressAcceptsMaxCSVExpiry tests the upper valid CSV boundary.
207+ func TestNewAddressAcceptsMaxCSVExpiry (t * testing.T ) {
208+ testContext := NewAddressManagerTestContextWithResponse (
209+ t , newServerNewAddressResponse (maxStaticAddressCSVExpiry ),
210+ )
211+
212+ _ , expiry , err := testContext .manager .NewAddress (t .Context ())
213+ require .NoError (t , err )
214+ require .EqualValues (t , maxStaticAddressCSVExpiry , expiry )
215+ }
216+
131217// GenerateExpectedTaprootAddress generates the expected taproot address that
132218// the predefined parameters are supposed to generate.
133219func GenerateExpectedTaprootAddress (t * ManagerTestContext ) (
@@ -170,6 +256,16 @@ type ManagerTestContext struct {
170256// NewAddressManagerTestContext creates a new test context for the static
171257// address manager.
172258func NewAddressManagerTestContext (t * testing.T ) * ManagerTestContext {
259+ return NewAddressManagerTestContextWithResponse (
260+ t , newServerNewAddressResponse (defaultExpiry ),
261+ )
262+ }
263+
264+ // NewAddressManagerTestContextWithResponse creates a new test context with a
265+ // custom ServerNewAddress response.
266+ func NewAddressManagerTestContextWithResponse (t * testing.T ,
267+ resp * swapserverrpc.ServerNewAddressResponse ) * ManagerTestContext {
268+
173269 ctxb , cancel := context .WithCancel (context .Background ())
174270 defer cancel ()
175271
@@ -184,14 +280,7 @@ func NewAddressManagerTestContext(t *testing.T) *ManagerTestContext {
184280
185281 mockStaticAddressClient .On (
186282 "ServerNewAddress" , mock .Anything , mock .Anything , mock .Anything ,
187- ).Return (
188- & swapserverrpc.ServerNewAddressResponse {
189- Params : & swapserverrpc.ServerAddressParameters {
190- ServerKey : defaultServerPubkeyBytes ,
191- Expiry : defaultExpiry ,
192- },
193- }, nil ,
194- )
283+ ).Return (resp , nil )
195284
196285 cfg := & ManagerConfig {
197286 Store : store ,
@@ -215,3 +304,12 @@ func NewAddressManagerTestContext(t *testing.T) *ManagerTestContext {
215304 mockStaticAddressClient : mockStaticAddressClient ,
216305 }
217306}
307+
308+ func newServerNewAddressResponse (expiry uint32 ) * swapserverrpc.ServerNewAddressResponse {
309+ return & swapserverrpc.ServerNewAddressResponse {
310+ Params : & swapserverrpc.ServerAddressParameters {
311+ ServerKey : defaultServerPubkeyBytes ,
312+ Expiry : expiry ,
313+ },
314+ }
315+ }
0 commit comments