Skip to content

Commit 5e16313

Browse files
committed
feat: now we can claim with or without gas + add missing deposit event
1 parent 09397da commit 5e16313

File tree

1 file changed

+86
-43
lines changed

1 file changed

+86
-43
lines changed

onchain/cairo/afk/src/social/deposit.cairo

Lines changed: 86 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ impl ClaimEncodeImpl of Encode<Claim> {
2323
self.deposit_id,
2424
recipient_address,
2525
gas_token_address,
26-
*self.gas_amount
26+
*self.gas_amount,
2727
)
2828
}
2929
}
@@ -58,7 +58,7 @@ type NostrPublicKey = u256;
5858
#[derive(Copy, Debug, Drop, Serde)]
5959
pub enum DepositResult {
6060
Transfer: ContractAddress,
61-
Deposit: DepositId
61+
Deposit: DepositId,
6262
}
6363

6464
#[derive(Copy, Debug, Drop, PartialEq, starknet::Store, Serde)]
@@ -78,13 +78,14 @@ pub trait IDepositEscrow<TContractState> {
7878
amount: u256,
7979
token_address: ContractAddress,
8080
nostr_recipient: NostrPublicKey,
81-
timelock: u64
81+
timelock: u64,
8282
) -> DepositResult;
8383
fn cancel(ref self: TContractState, deposit_id: DepositId);
84-
fn claim(ref self: TContractState, request: SocialRequest<Claim>, gas_amount: u256);
84+
fn claim(ref self: TContractState, request: SocialRequest<Claim>);
85+
fn claim_with_gas(ref self: TContractState, request: SocialRequest<Claim>, gas_amount: u256);
8586
fn get_starknet_address(self: @TContractState, nostr_pubkey: NostrPublicKey) -> ContractAddress;
8687
fn get_nostr_address(
87-
self: @TContractState, starknet_address: ContractAddress
88+
self: @TContractState, starknet_address: ContractAddress,
8889
) -> NostrPublicKey;
8990
}
9091

@@ -96,10 +97,10 @@ pub mod DepositEscrow {
9697
use core::num::traits::Zero;
9798
use starknet::account::Call;
9899
use starknet::storage::{
99-
StoragePointerReadAccess, StoragePointerWriteAccess, StoragePathEntry, Map
100+
StoragePointerReadAccess, StoragePointerWriteAccess, StoragePathEntry, Map,
100101
};
101102
use starknet::{get_block_timestamp, get_caller_address, get_contract_address, ContractAddress};
102-
use super::super::request::{SocialRequest, SocialRequestImpl, SocialRequestTrait,};
103+
use super::super::request::{SocialRequest, SocialRequestImpl, SocialRequestTrait};
103104

104105
use super::{Deposit, DepositId, DepositResult, IDepositEscrow, NostrPublicKey, Claim};
105106

@@ -111,7 +112,7 @@ pub mod DepositEscrow {
111112
amount: 0.into(),
112113
token_address: 0.try_into().unwrap(),
113114
recipient: 0_u256,
114-
ttl: 0_u64
115+
ttl: 0_u64,
115116
}
116117
}
117118
}
@@ -125,7 +126,7 @@ pub mod DepositEscrow {
125126
}
126127

127128
#[derive(Drop, starknet::Event)]
128-
struct ClaimEvent {
129+
pub struct ClaimEvent {
129130
#[key]
130131
deposit_id: DepositId,
131132
#[key]
@@ -137,7 +138,7 @@ pub mod DepositEscrow {
137138
amount: u256,
138139
token_address: ContractAddress,
139140
gas_token_address: ContractAddress,
140-
gas_amount: u256
141+
gas_amount: u256,
141142
}
142143

143144
#[derive(Drop, starknet::Event)]
@@ -197,13 +198,13 @@ pub mod DepositEscrow {
197198
}
198199

199200
fn get_nostr_address(
200-
self: @ContractState, starknet_address: ContractAddress
201+
self: @ContractState, starknet_address: ContractAddress,
201202
) -> NostrPublicKey {
202203
self.sn_to_nostr.read(starknet_address)
203204
}
204205

205206
fn get_starknet_address(
206-
self: @ContractState, nostr_pubkey: NostrPublicKey
207+
self: @ContractState, nostr_pubkey: NostrPublicKey,
207208
) -> ContractAddress {
208209
self.nostr_to_sn.read(nostr_pubkey)
209210
}
@@ -213,7 +214,7 @@ pub mod DepositEscrow {
213214
amount: u256,
214215
token_address: ContractAddress,
215216
nostr_recipient: NostrPublicKey,
216-
timelock: u64
217+
timelock: u64,
217218
) -> DepositResult {
218219
let recipient = self.nostr_to_sn.read(nostr_recipient);
219220

@@ -227,8 +228,8 @@ pub mod DepositEscrow {
227228
nostr_recipient,
228229
starknet_recipient: recipient,
229230
amount: amount,
230-
token_address: token_address
231-
}
231+
token_address: token_address,
232+
},
232233
);
233234
return DepositResult::Transfer(recipient);
234235
}
@@ -248,8 +249,19 @@ pub mod DepositEscrow {
248249
amount,
249250
token_address,
250251
recipient: nostr_recipient,
251-
ttl: get_block_timestamp() + timelock
252-
}
252+
ttl: get_block_timestamp() + timelock,
253+
},
254+
);
255+
256+
self
257+
.emit(
258+
DepositEvent {
259+
deposit_id,
260+
sender: get_caller_address(),
261+
nostr_recipient,
262+
amount,
263+
token_address,
264+
},
253265
);
254266

255267
DepositResult::Deposit(deposit_id)
@@ -260,7 +272,7 @@ pub mod DepositEscrow {
260272
assert!(deposit != Default::default(), "can't find deposit");
261273
assert!(deposit.sender == get_caller_address(), "not authorized");
262274
assert!(
263-
deposit.ttl <= get_block_timestamp(), "can't cancel before timelock expiration"
275+
deposit.ttl <= get_block_timestamp(), "can't cancel before timelock expiration",
264276
);
265277

266278
let erc20 = IERC20Dispatcher { contract_address: deposit.token_address };
@@ -274,12 +286,43 @@ pub mod DepositEscrow {
274286
sender: get_caller_address(),
275287
nostr_recipient: deposit.recipient,
276288
amount: deposit.amount,
277-
token_address: deposit.token_address
278-
}
289+
token_address: deposit.token_address,
290+
},
279291
);
280292
}
281293

282-
fn claim(ref self: ContractState, request: SocialRequest<Claim>, gas_amount: u256) {
294+
fn claim(ref self: ContractState, request: SocialRequest<Claim>) {
295+
let claim = @request.content;
296+
let deposit = self.deposits.read(*claim.deposit_id);
297+
assert!(deposit != Default::default(), "can't find deposit");
298+
assert!(request.public_key == deposit.recipient, "invalid recipient");
299+
request.verify().expect('can\'t verify signature');
300+
301+
let erc20 = IERC20Dispatcher { contract_address: deposit.token_address };
302+
erc20.transfer(*claim.starknet_recipient, deposit.amount);
303+
304+
self.nostr_to_sn.entry(request.public_key).write(*claim.starknet_recipient);
305+
self.sn_to_nostr.entry(*claim.starknet_recipient).write(request.public_key);
306+
self.deposits.entry(*claim.deposit_id).write(Default::default());
307+
308+
self
309+
.emit(
310+
ClaimEvent {
311+
deposit_id: *claim.deposit_id,
312+
sender: get_caller_address(),
313+
nostr_recipient: request.public_key,
314+
amount: deposit.amount,
315+
starknet_recipient: *claim.starknet_recipient,
316+
token_address: deposit.token_address,
317+
gas_token_address: *claim.gas_token_address,
318+
gas_amount: *claim.gas_amount,
319+
},
320+
);
321+
}
322+
323+
fn claim_with_gas(
324+
ref self: ContractState, request: SocialRequest<Claim>, gas_amount: u256,
325+
) {
283326
let claim = @request.content;
284327
let deposit = self.deposits.read(*claim.deposit_id);
285328
assert!(deposit != Default::default(), "can't find deposit");
@@ -308,8 +351,8 @@ pub mod DepositEscrow {
308351
starknet_recipient: *claim.starknet_recipient,
309352
token_address: deposit.token_address,
310353
gas_token_address: *claim.gas_token_address,
311-
gas_amount: *claim.gas_amount
312-
}
354+
gas_amount: *claim.gas_amount,
355+
},
313356
);
314357
}
315358
}
@@ -322,13 +365,13 @@ mod tests {
322365
use snforge_std::{
323366
declare, ContractClass, ContractClassTrait, start_cheat_caller_address,
324367
start_cheat_caller_address_global, stop_cheat_caller_address_global,
325-
start_cheat_block_timestamp, DeclareResultTrait
368+
start_cheat_block_timestamp, DeclareResultTrait, spy_events, EventSpyAssertionsTrait,
326369
};
327-
use starknet::{ContractAddress, get_block_timestamp,};
370+
use starknet::{ContractAddress, get_block_timestamp};
328371

329372
use super::super::request::{SocialRequest, Signature};
330373
use super::{DepositResult, NostrPublicKey, Claim};
331-
use super::{IDepositEscrowDispatcher, IDepositEscrowDispatcherTrait};
374+
use super::{DepositEscrow, IDepositEscrowDispatcher, IDepositEscrowDispatcherTrait};
332375

333376
fn declare_escrow() -> @ContractClass {
334377
declare("DepositEscrow").unwrap().contract_class()
@@ -351,7 +394,7 @@ mod tests {
351394
name: felt252,
352395
symbol: felt252,
353396
initial_supply: u256,
354-
recipient: ContractAddress
397+
recipient: ContractAddress,
355398
) -> IERC20Dispatcher {
356399
let mut calldata = array![];
357400

@@ -367,7 +410,7 @@ mod tests {
367410
}
368411

369412
fn request_fixture_custom_classes(
370-
erc20_class: ContractClass, escrow_class: ContractClass
413+
erc20_class: ContractClass, escrow_class: ContractClass,
371414
) -> (
372415
SocialRequest<Claim>,
373416
NostrPublicKey,
@@ -394,7 +437,7 @@ mod tests {
394437
deposit_id: 1,
395438
starknet_recipient: recipient_address,
396439
gas_amount: 0,
397-
gas_token_address: erc20.contract_address
440+
gas_token_address: erc20.contract_address,
398441
};
399442

400443
let request = SocialRequest {
@@ -405,8 +448,8 @@ mod tests {
405448
content: claim,
406449
sig: Signature {
407450
r: 0xf1dac3f8d0d19767805ca85933bdf0e744594aeee04058eedaa29e26de087be9_u256,
408-
s: 0x144c4636083c7d0e3b8186c8c0bc6fa38bd9c6a629ec6e2ce5e437797a6e911c_u256
409-
}
451+
s: 0x144c4636083c7d0e3b8186c8c0bc6fa38bd9c6a629ec6e2ce5e437797a6e911c_u256,
452+
},
410453
};
411454

412455
(request, recipient_public_key, sender_address, erc20, escrow)
@@ -448,12 +491,12 @@ mod tests {
448491

449492
// Recipient user claim deposit
450493
let recipient_balance_before_claim = erc20.balance_of(recipient_address);
451-
escrow.claim(request, 0_u256);
494+
escrow.claim_with_gas(request, 0_u256);
452495

453496
// Sender check
454497
assert!(
455498
sender_balance_before_deposit - amount == sender_balance_after_deposit,
456-
"sender amount to deposit not send"
499+
"sender amount to deposit not send",
457500
);
458501

459502
// Recipient check
@@ -481,16 +524,16 @@ mod tests {
481524
deposit_id: 1,
482525
starknet_recipient: recipient_address,
483526
gas_amount: gas_amount,
484-
gas_token_address: erc20.contract_address
527+
gas_token_address: erc20.contract_address,
485528
};
486529

487530
let request_gas_amount = SocialRequest {
488531
content: claim_gas_amount,
489532
sig: Signature {
490533
r: 0x68e441c1f8756b5278c815cc110efb302c2a08bcf0349328ba7bd7683e8b0b29_u256,
491-
s: 0xd592a5a5e9fc85334ab6801d6dde984c85d67fcd726fce38b9fb06874c25832e_u256
534+
s: 0xd592a5a5e9fc85334ab6801d6dde984c85d67fcd726fce38b9fb06874c25832e_u256,
492535
},
493-
..request
536+
..request,
494537
};
495538

496539
start_cheat_caller_address_global(sender_address);
@@ -511,20 +554,20 @@ mod tests {
511554
// Sender check
512555
assert!(
513556
sender_balance_before_deposit - amount == sender_balance_after_deposit,
514-
"sender deposit amount not send"
557+
"sender deposit amount not send",
515558
);
516559

517560
// AFK account claim user for recipient with gas fees paid by the claim deposit
518561
let escrow_balance_before_claim = erc20.balance_of(escrow.contract_address);
519562
let recipient_balance_before_claim = erc20.balance_of(recipient_address);
520-
escrow.claim(request_gas_amount, gas_amount);
563+
escrow.claim_with_gas(request_gas_amount, gas_amount);
521564

522565
// Recipient check
523566
let recipient_balance_after_claim = erc20.balance_of(recipient_address);
524567
assert!(recipient_balance_before_claim == 0, "recipient balance before claim != 0");
525568
assert!(
526569
recipient_balance_after_claim == amount - gas_amount,
527-
"recipient after claim != (amount - gas)"
570+
"recipient after claim != (amount - gas)",
528571
);
529572

530573
// Check gas amount receive by AFK account
@@ -552,7 +595,7 @@ mod tests {
552595
start_cheat_caller_address(escrow.contract_address, sender_address);
553596
escrow.deposit(amount, erc20.contract_address, recipient_nostr_key, 10_u64);
554597

555-
escrow.claim(request, 1_u256);
598+
escrow.claim_with_gas(request, 1_u256);
556599
}
557600

558601
#[test]
@@ -579,7 +622,7 @@ mod tests {
579622
},
580623
..request,
581624
};
582-
escrow.claim(request, 0_u256);
625+
escrow.claim_with_gas(request, 0_u256);
583626
}
584627

585628

@@ -607,7 +650,7 @@ mod tests {
607650
},
608651
..request,
609652
};
610-
escrow.claim(request, 0_u256);
653+
escrow.claim_with_gas(request, 0_u256);
611654
}
612655

613656
#[test]
@@ -713,7 +756,7 @@ mod tests {
713756
}
714757

715758
start_cheat_caller_address(escrow.contract_address, recipient_address);
716-
escrow.claim(request, 0_u256);
759+
escrow.claim_with_gas(request, 0_u256);
717760

718761
start_cheat_caller_address(escrow.contract_address, sender_address);
719762
let result = escrow.deposit(amount, erc20.contract_address, recipient_nostr_key, 0_u64);

0 commit comments

Comments
 (0)