@@ -23,7 +23,7 @@ describe(batchInsertData.name, () => {
23
23
it ( 'validates signature' , async ( ) => {
24
24
const invalidData = await createSignedData ( { signature : '0xInvalid' } ) ;
25
25
26
- const result = await batchInsertData ( undefined , [ invalidData ] ) ;
26
+ const result = await batchInsertData ( undefined , [ invalidData ] , invalidData . airnode ) ;
27
27
28
28
expect ( result ) . toStrictEqual ( {
29
29
body : JSON . stringify ( {
@@ -47,7 +47,7 @@ describe(batchInsertData.name, () => {
47
47
const data = await createSignedData ( ) ;
48
48
const invalidData = { ...data , beaconId : deriveBeaconId ( data . airnode , generateRandomBytes ( 32 ) ) } ;
49
49
50
- const result = await batchInsertData ( undefined , [ invalidData ] ) ;
50
+ const result = await batchInsertData ( undefined , [ invalidData ] , invalidData . airnode ) ;
51
51
52
52
expect ( result ) . toStrictEqual ( {
53
53
body : JSON . stringify ( {
@@ -74,7 +74,7 @@ describe(batchInsertData.name, () => {
74
74
) ;
75
75
const batchData = [ await createSignedData ( { airnodeWallet } ) ] ;
76
76
77
- const result = await batchInsertData ( undefined , batchData ) ;
77
+ const result = await batchInsertData ( undefined , batchData , airnodeWallet . address ) ;
78
78
79
79
expect ( result ) . toStrictEqual ( {
80
80
body : JSON . stringify ( {
@@ -109,7 +109,7 @@ describe(batchInsertData.name, () => {
109
109
] ;
110
110
jest . spyOn ( logger , 'debug' ) ;
111
111
112
- const result = await batchInsertData ( undefined , batchData ) ;
112
+ const result = await batchInsertData ( undefined , batchData , airnodeWallet . address ) ;
113
113
114
114
expect ( result ) . toStrictEqual ( {
115
115
body : JSON . stringify ( { count : 1 , skipped : 1 } ) ,
@@ -124,14 +124,14 @@ describe(batchInsertData.name, () => {
124
124
} ) ;
125
125
126
126
it ( 'rejects a batch if there is a beacon with timestamp too far in the future' , async ( ) => {
127
- const batchData = [ await createSignedData ( { timestamp : ( Math . floor ( Date . now ( ) / 1000 ) + 60 * 60 * 2 ) . toString ( ) } ) ] ;
127
+ const invalidData = await createSignedData ( { timestamp : ( Math . floor ( Date . now ( ) / 1000 ) + 60 * 60 * 2 ) . toString ( ) } ) ;
128
128
129
- const result = await batchInsertData ( undefined , batchData ) ;
129
+ const result = await batchInsertData ( undefined , [ invalidData ] , invalidData . airnode ) ;
130
130
131
131
expect ( result ) . toStrictEqual ( {
132
132
body : JSON . stringify ( {
133
133
message : 'Request timestamp is too far in the future' ,
134
- context : { signedData : batchData [ 0 ] } ,
134
+ context : { signedData : invalidData } ,
135
135
} ) ,
136
136
headers : {
137
137
'access-control-allow-methods' : '*' ,
@@ -154,7 +154,7 @@ describe(batchInsertData.name, () => {
154
154
await createSignedData ( { airnodeWallet : airnodeWallet2 } ) ,
155
155
] ;
156
156
157
- const result = await batchInsertData ( undefined , batchData ) ;
157
+ const result = await batchInsertData ( undefined , batchData , airnodeWallet1 . address ) ;
158
158
159
159
expect ( result ) . toStrictEqual ( {
160
160
body : JSON . stringify ( {
@@ -175,11 +175,42 @@ describe(batchInsertData.name, () => {
175
175
} ) ;
176
176
} ) ;
177
177
178
+ it ( 'rejects a batch when the path parameter conflicts with the Airnode address populated in the signed data' , async ( ) => {
179
+ const airnodeWallet1 = ethers . Wallet . fromMnemonic (
180
+ 'echo dose empower ensure purchase enjoy once hotel slender loop repair desk'
181
+ ) ;
182
+ const airnodeWallet2 = ethers . Wallet . fromMnemonic (
183
+ 'clay drift protect wise love frost tourist eyebrow glide cost comfort punch'
184
+ ) ;
185
+ const batchData = [
186
+ await createSignedData ( { airnodeWallet : airnodeWallet2 } ) ,
187
+ await createSignedData ( { airnodeWallet : airnodeWallet2 } ) ,
188
+ ] ;
189
+
190
+ const result = await batchInsertData ( undefined , batchData , airnodeWallet1 . address ) ;
191
+
192
+ expect ( result ) . toStrictEqual ( {
193
+ body : JSON . stringify ( {
194
+ message : 'Airnode address in the path parameter does not match one in the signed data' ,
195
+ context : {
196
+ airnodeAddress : airnodeWallet1 . address ,
197
+ signedData : batchData [ 0 ] ,
198
+ } ,
199
+ } ) ,
200
+ headers : {
201
+ 'access-control-allow-methods' : '*' ,
202
+ 'access-control-allow-origin' : '*' ,
203
+ 'content-type' : 'application/json' ,
204
+ } ,
205
+ statusCode : 400 ,
206
+ } ) ;
207
+ } ) ;
208
+
178
209
it ( 'inserts the batch if data is valid' , async ( ) => {
179
210
const airnodeWallet = generateRandomWallet ( ) ;
180
211
const batchData = [ await createSignedData ( { airnodeWallet } ) , await createSignedData ( { airnodeWallet } ) ] ;
181
212
182
- const result = await batchInsertData ( undefined , batchData ) ;
213
+ const result = await batchInsertData ( undefined , batchData , airnodeWallet . address ) ;
183
214
184
215
expect ( result ) . toStrictEqual ( {
185
216
body : JSON . stringify ( { count : 2 , skipped : 0 } ) ,
@@ -201,8 +232,9 @@ describe(batchInsertData.name, () => {
201
232
202
233
describe ( getData . name , ( ) => {
203
234
it ( 'drops the request if the airnode address is invalid' , async ( ) => {
204
- const batchData = [ await createSignedData ( ) , await createSignedData ( ) ] ;
205
- await batchInsertData ( undefined , batchData ) ;
235
+ const airnodeWallet = generateRandomWallet ( ) ;
236
+ const batchData = [ await createSignedData ( { airnodeWallet } ) , await createSignedData ( { airnodeWallet } ) ] ;
237
+ await batchInsertData ( undefined , batchData , airnodeWallet . address ) ;
206
238
207
239
const result = await getData ( { authTokens : null , delaySeconds : 0 , urlPath : 'path' } , undefined , '0xInvalid' ) ;
208
240
@@ -220,7 +252,7 @@ describe(getData.name, () => {
220
252
it ( 'returns the live data' , async ( ) => {
221
253
const airnodeWallet = generateRandomWallet ( ) ;
222
254
const batchData = [ await createSignedData ( { airnodeWallet } ) , await createSignedData ( { airnodeWallet } ) ] ;
223
- await batchInsertData ( undefined , batchData ) ;
255
+ await batchInsertData ( undefined , batchData , airnodeWallet . address ) ;
224
256
225
257
const result = await getData (
226
258
{ authTokens : null , delaySeconds : 0 , urlPath : 'path' } ,
@@ -252,7 +284,7 @@ describe(getData.name, () => {
252
284
await createSignedData ( { airnodeWallet, timestamp : delayTimestamp } ) ,
253
285
await createSignedData ( { airnodeWallet } ) ,
254
286
] ;
255
- await batchInsertData ( undefined , batchData ) ;
287
+ await batchInsertData ( undefined , batchData , airnodeWallet . address ) ;
256
288
257
289
const result = await getData (
258
290
{ authTokens : null , delaySeconds : 30 , urlPath : 'path' } ,
@@ -281,7 +313,7 @@ describe(listAirnodeAddresses.name, () => {
281
313
it ( 'returns the list of airnode addresses' , async ( ) => {
282
314
const airnodeWallet = generateRandomWallet ( ) ;
283
315
const batchData = [ await createSignedData ( { airnodeWallet } ) , await createSignedData ( { airnodeWallet } ) ] ;
284
- await batchInsertData ( undefined , batchData ) ;
316
+ await batchInsertData ( undefined , batchData , airnodeWallet . address ) ;
285
317
286
318
const result = await listAirnodeAddresses ( ) ;
287
319
0 commit comments