@@ -3,7 +3,8 @@ use near_sdk::json_types::{ValidAccountId, U128, U64};
3
3
use near_sdk:: serde:: { Deserialize , Serialize } ;
4
4
use near_sdk:: serde_json:: json;
5
5
use near_sdk:: {
6
- env, log, near_bindgen, serde_json, AccountId , Balance , Gas , Promise , PromiseResult , Timestamp ,
6
+ bs58, env, log, near_bindgen, serde_json, AccountId , Balance , Gas , Promise , PromiseResult ,
7
+ Timestamp ,
7
8
} ;
8
9
9
10
near_sdk:: setup_alloc!( ) ;
@@ -19,7 +20,6 @@ const BASIC_GAS: Gas = 10_000_000_000_000;
19
20
* Switchboard oracle-related declarations
20
21
*/
21
22
22
-
23
23
#[ derive( BorshDeserialize , BorshSerialize , Serialize , Deserialize ) ]
24
24
pub struct SwitchboardDecimal {
25
25
pub mantissa : i128 ,
@@ -36,7 +36,7 @@ pub struct PriceEntry {
36
36
37
37
#[ derive( BorshDeserialize , BorshSerialize , Serialize , Deserialize ) ]
38
38
pub struct SwitchboarIx {
39
- pub address : Vec < u8 > , // This feed address reference a specific price feed, see https://app.switchboard.xyz
39
+ pub address : Vec < u8 > , // This feed address reference a specific price feed, see https://app.switchboard.xyz
40
40
pub payer : Vec < u8 > ,
41
41
}
42
42
@@ -46,7 +46,6 @@ trait Switchboard {
46
46
fn aggregator_read ( ix : SwitchboarIx ) -> Promise < PriceEntry > ;
47
47
}
48
48
49
-
50
49
///
51
50
/// This contract
52
51
/// - feed_parser: should be a valid Switchboard feed parser
@@ -58,7 +57,7 @@ trait Switchboard {
58
57
pub struct ConversionProxy {
59
58
pub feed_parser : AccountId ,
60
59
pub feed_address : Vec < u8 > ,
61
- pub feed_payer : Vec < u8 > ,
60
+ pub feed_payer : Vec < u8 > ,
62
61
pub owner_id : AccountId ,
63
62
}
64
63
@@ -123,16 +122,24 @@ impl ConversionProxy {
123
122
env:: prepaid_gas( ) ,
124
123
MIN_GAS
125
124
) ;
126
- assert_eq ! ( currency, "USD" , "Only payments denominated in USD are implemented for now" ) ;
125
+ assert_eq ! (
126
+ currency, "USD" ,
127
+ "Only payments denominated in USD are implemented for now"
128
+ ) ;
127
129
128
130
let reference_vec: Vec < u8 > = hex:: decode ( payment_reference. replace ( "0x" , "" ) )
129
131
. expect ( "Payment reference value error" ) ;
130
132
assert_eq ! ( reference_vec. len( ) , 8 , "Incorrect payment reference length" ) ;
131
133
132
- let get_rate = sb_contract:: aggregator_read ( SwitchboarIx { address : self . feed_address . clone ( ) , payer : self . feed_payer . clone ( ) } ,
134
+ let get_rate = sb_contract:: aggregator_read (
135
+ SwitchboarIx {
136
+ address : self . feed_address . clone ( ) ,
137
+ payer : self . feed_payer . clone ( ) ,
138
+ } ,
133
139
& self . feed_parser ,
134
140
NO_DEPOSIT ,
135
- BASIC_GAS , ) ;
141
+ BASIC_GAS ,
142
+ ) ;
136
143
let callback_gas = BASIC_GAS * 3 ;
137
144
let process_request_payment = ext_self:: rate_callback (
138
145
to,
@@ -178,20 +185,22 @@ impl ConversionProxy {
178
185
pub fn set_feed_address ( & mut self , feed_address : String ) {
179
186
let signer_id = env:: predecessor_account_id ( ) ;
180
187
if self . owner_id == signer_id {
181
- self . feed_address = bs58:: decode ( feed_address) . into_vec ( ) . expect ( "Wrong feed address format" ) ;
188
+ self . feed_address = bs58:: decode ( feed_address)
189
+ . into_vec ( )
190
+ . expect ( "Wrong feed address format" ) ;
182
191
} else {
183
192
panic ! ( "ERR_PERMISSION" ) ;
184
193
}
185
194
}
186
-
195
+
187
196
pub fn get_feed_address ( & self ) -> Vec < u8 > {
188
197
return self . feed_address . clone ( ) ;
189
198
}
190
199
191
200
pub fn get_encoded_feed_address ( & self ) -> String {
192
201
return bs58:: encode ( self . feed_address . clone ( ) ) . into_string ( ) ;
193
202
}
194
-
203
+
195
204
pub fn set_owner ( & mut self , owner : ValidAccountId ) {
196
205
let signer_id = env:: predecessor_account_id ( ) ;
197
206
if self . owner_id == signer_id {
@@ -206,23 +215,35 @@ impl ConversionProxy {
206
215
if self . owner_id == signer_id {
207
216
let feed_payer = env:: signer_account_pk ( ) ;
208
217
let vec_length = feed_payer. len ( ) ;
209
- println ! ( "feed_payer: {}, len: {}" , feed_payer. clone( ) . into_iter( ) . map( |c| c. to_string( ) ) . collect:: <Vec <String >>( ) . join( "," ) , vec_length) ;
218
+ println ! (
219
+ "feed_payer: {}, len: {}" ,
220
+ feed_payer
221
+ . clone( )
222
+ . into_iter( )
223
+ . map( |c| c. to_string( ) )
224
+ . collect:: <Vec <String >>( )
225
+ . join( "," ) ,
226
+ vec_length
227
+ ) ;
210
228
if vec_length == 32 {
211
229
self . feed_payer = env:: signer_account_pk ( ) ;
212
230
return ;
213
231
}
214
232
// For some reason the VM prepends a 0 in front of the 32-long vector
215
233
if vec_length > 32 {
216
- log ! ( "Trimming the feed_payer pk to fit length 32 from length {}" , vec_length) ;
217
- self . feed_payer = feed_payer[ vec_length-32 ..] . to_vec ( ) ;
218
- return
234
+ log ! (
235
+ "Trimming the feed_payer pk to fit length 32 from length {}" ,
236
+ vec_length
237
+ ) ;
238
+ self . feed_payer = feed_payer[ vec_length - 32 ..] . to_vec ( ) ;
239
+ return ;
219
240
}
220
241
panic ! ( "ERR_OWNER_PK_LENGTH" ) ;
221
- } else {
242
+ } else {
222
243
panic ! ( "ERR_PERMISSION" ) ;
223
244
}
224
245
}
225
-
246
+
226
247
pub fn get_feed_payer ( & self ) -> Vec < u8 > {
227
248
return self . feed_payer . clone ( ) ;
228
249
}
@@ -303,26 +324,34 @@ impl ConversionProxy {
303
324
PromiseResult :: Failed => panic ! ( "ERR_FAILED_ORACLE_FETCH" ) ,
304
325
} ;
305
326
// Check rate errors
306
- assert ! ( rate. num_error == 0 && rate. num_success == 1 , "Conversion errors: {}, successes: {}" , rate. num_error, rate. num_success) ;
327
+ assert ! (
328
+ rate. num_error == 0 && rate. num_success == 1 ,
329
+ "Conversion errors: {}, successes: {}" ,
330
+ rate. num_error,
331
+ rate. num_success
332
+ ) ;
307
333
// Check rate validity
308
334
assert ! (
309
335
u64 :: from( max_rate_timespan) == 0
310
- || rate. round_open_timestamp >= env:: block_timestamp( ) - u64 :: from( max_rate_timespan) ,
336
+ || rate. round_open_timestamp
337
+ >= env:: block_timestamp( ) - u64 :: from( max_rate_timespan) ,
311
338
"Conversion rate too old (Last updated: {})" ,
312
339
rate. round_open_timestamp,
313
340
) ;
314
- let conversion_rate = 0_u128 . checked_add_signed ( rate. result . mantissa ) . expect ( "Negative conversion rate" ) ;
341
+ let conversion_rate = 0_u128
342
+ . checked_add_signed ( rate. result . mantissa )
343
+ . expect ( "Negative conversion rate" ) ;
315
344
let decimals = u32:: from ( rate. result . scale ) ;
316
- let main_payment =
317
- ( Balance :: from ( amount) * ONE_NEAR * 10u128 . pow ( decimals) / conversion_rate / ONE_FIAT ) as u128 ;
345
+ let main_payment = ( Balance :: from ( amount) * ONE_NEAR * 10u128 . pow ( decimals)
346
+ / conversion_rate
347
+ / ONE_FIAT ) as u128 ;
318
348
let fee_payment = Balance :: from ( fee_amount) * ONE_NEAR * 10u128 . pow ( decimals)
319
349
/ conversion_rate
320
350
/ ONE_FIAT ;
321
351
322
352
let total_payment = main_payment + fee_payment;
323
353
// Check deposit
324
354
if total_payment > env:: attached_deposit ( ) {
325
-
326
355
Promise :: new ( payer. clone ( ) . to_string ( ) ) . transfer ( env:: attached_deposit ( ) ) ;
327
356
log ! (
328
357
"Deposit too small for payment (Supplied: {}. Demand (incl. fees): {})" ,
@@ -387,7 +416,10 @@ mod tests {
387
416
VMContext {
388
417
current_account_id : predecessor_account_id. clone ( ) ,
389
418
signer_account_id : predecessor_account_id. clone ( ) ,
390
- signer_account_pk : vec ! [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 ] ,
419
+ signer_account_pk : vec ! [
420
+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 ,
421
+ 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 ,
422
+ ] ,
391
423
predecessor_account_id,
392
424
input : vec ! [ ] ,
393
425
block_index : 1 ,
0 commit comments