Skip to content

Commit 0aa8ed6

Browse files
chore(payments): rename to counterparty (#20)
1 parent 104e9e9 commit 0aa8ed6

File tree

5 files changed

+42
-24
lines changed

5 files changed

+42
-24
lines changed

src/errors.cairo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub const INVALID_ZERO_TOKEN: felt252 = 'INVALID_ZERO_TOKEN';
1414
pub const ORDER_EXPIRED: felt252 = 'ORDER_EXPIRED';
1515
pub const TOKEN_ALREADY_REGISTERED: felt252 = 'TOKEN_ALREADY_REGISTERED';
1616
pub const TOKEN_NOT_REGISTERED: felt252 = 'TOKEN_NOT_REGISTERED';
17-
pub const UNALLOWED_ADDRESS: felt252 = 'UNALLOWED_ADDRESS';
17+
pub const UNAPPROVED_COUNTERPARTY: felt252 = 'UNAPPROVED_COUNTERPARTY';
1818

1919
pub fn transfer_failed_error(
2020
token: ContractAddress, sender: ContractAddress, amount: u128,

src/order.cairo

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,20 @@ pub struct Order {
1515
pub sell_amount: u128,
1616
pub buy_amount: u128,
1717
// Addresses the user is willing to trade with. Empty span means any address.
18-
pub allowed_addresses: Span<ContractAddress>,
18+
pub approved_counterparties: Span<ContractAddress>,
1919
}
2020

2121
pub impl HashOrderImpl<S, +HashStateTrait<S>, +Drop<S>> of Hash<Order, S> {
2222
fn update_state(mut state: S, value: Order) -> S {
2323
let Order {
24-
salt, expiry, user, sell_token, buy_token, sell_amount, buy_amount, allowed_addresses,
24+
salt,
25+
expiry,
26+
user,
27+
sell_token,
28+
buy_token,
29+
sell_amount,
30+
buy_amount,
31+
approved_counterparties,
2532
} = value;
2633
state = state
2734
.update_with(salt)
@@ -31,8 +38,8 @@ pub impl HashOrderImpl<S, +HashStateTrait<S>, +Drop<S>> of Hash<Order, S> {
3138
.update_with(buy_token)
3239
.update_with(sell_amount)
3340
.update_with(buy_amount)
34-
.update_with(allowed_addresses.len());
35-
for elem in allowed_addresses {
41+
.update_with(approved_counterparties.len());
42+
for elem in approved_counterparties {
3643
state = state.update_with(*elem);
3744
}
3845

@@ -50,14 +57,14 @@ pub impl HashOrderImpl<S, +HashStateTrait<S>, +Drop<S>> of Hash<Order, S> {
5057
/// \"buy_token\":\"ContractAddress\",
5158
/// \"sell_amount\":\"u128\",
5259
/// \"buy_amount\":\"u128\",
53-
/// \"allowed_addresses\":\"Span<ContractAddress>\"
60+
/// \"approved_counterparties\":\"Span<ContractAddress>\"
5461
/// )
5562
/// \"Timestamp\"(
5663
/// \"seconds\":\"u64\"
5764
/// )
5865
/// );
5966

60-
const ORDER_TYPE_HASH: HashType = 0x2d9dc4d67a6cc048d96cd39c037575fa17fc4f4ba67fa9307cd08d3aac3943b;
67+
const ORDER_TYPE_HASH: HashType = 0x211c45dbc2e66ee156228a18612613a79470506142cea568b05e981a74efbb;
6168

6269
impl StructHashImpl of StructHash<Order> {
6370
fn hash_struct(self: @Order) -> HashType {
@@ -74,7 +81,7 @@ mod tests {
7481
#[test]
7582
fn test_order_type_hash() {
7683
let expected = selector!(
77-
"\"Order\"(\"salt\":\"felt\",\"expiry\":\"Timestamp\",\"user\":\"ContractAddress\",\"sell_token\":\"ContractAddress\",\"buy_token\":\"ContractAddress\",\"sell_amount\":\"u128\",\"buy_amount\":\"u128\",\"allowed_addresses\":\"Span<ContractAddress>\")\"Timestamp\"(\"seconds\":\"u64\")",
84+
"\"Order\"(\"salt\":\"felt\",\"expiry\":\"Timestamp\",\"user\":\"ContractAddress\",\"sell_token\":\"ContractAddress\",\"buy_token\":\"ContractAddress\",\"sell_amount\":\"u128\",\"buy_amount\":\"u128\",\"approved_counterparties\":\"Span<ContractAddress>\")\"Timestamp\"(\"seconds\":\"u64\")",
7885
);
7986
assert_eq!(ORDER_TYPE_HASH.into_base_16_string(), expected.into_base_16_string());
8087
}

src/payments.cairo

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@ pub mod payments {
2424
INVALID_AMOUNT_RATIO, INVALID_AMOUNT_TOO_LARGE, INVALID_DOWNCAST_AFTER_DIVISION,
2525
INVALID_HIGH_FEE, INVALID_HIGH_FEE_LIMIT, INVALID_TOKEN_PAIR, INVALID_TRADE_SAME_USER,
2626
INVALID_ZERO_ADDRESS, INVALID_ZERO_AMOUNT, INVALID_ZERO_TOKEN, ORDER_EXPIRED,
27-
TOKEN_ALREADY_REGISTERED, TOKEN_NOT_REGISTERED, UNALLOWED_ADDRESS, transfer_failed_error,
27+
TOKEN_ALREADY_REGISTERED, TOKEN_NOT_REGISTERED, UNAPPROVED_COUNTERPARTY,
28+
transfer_failed_error,
2829
};
2930
use crate::events::{
3031
FeeRecipientSet, FeeSet, OrderCanceled, TokenRegistered, TokenRemoved, TradeExecuted,
3132
};
3233
use crate::interface::IPayments;
3334
use crate::order::Order;
34-
use crate::utils::{is_allowed_address, validate_signature};
35+
use crate::utils::{is_approved_counterparty, validate_signature};
3536

3637
component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);
3738
component!(path: PausableComponent, storage: pausable, event: PausableEvent);
@@ -435,9 +436,15 @@ pub mod payments {
435436
assert(order_a_actual_sell_amount.is_non_zero(), INVALID_ZERO_AMOUNT);
436437
assert(order_a_actual_buy_amount.is_non_zero(), INVALID_ZERO_AMOUNT);
437438

438-
// Validate allowed addresses.
439-
assert(is_allowed_address(order_b.user, order_a.allowed_addresses), UNALLOWED_ADDRESS);
440-
assert(is_allowed_address(order_a.user, order_b.allowed_addresses), UNALLOWED_ADDRESS);
439+
// Validate approved counterparties.
440+
assert(
441+
is_approved_counterparty(order_b.user, order_a.approved_counterparties),
442+
UNAPPROVED_COUNTERPARTY,
443+
);
444+
assert(
445+
is_approved_counterparty(order_a.user, order_b.approved_counterparties),
446+
UNAPPROVED_COUNTERPARTY,
447+
);
441448
}
442449

443450

src/tests/test_payments.cairo

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use core::num::traits::Zero;
2+
use openzeppelin::utils::snip12::OffchainMessageHash;
23
use snforge_std::cheatcodes::events::{EventSpyTrait, EventsFilterTrait};
34
use snforge_std::{map_entry_address, store};
45
use starknet::ContractAddress;
@@ -7,6 +8,7 @@ use starknet_payments::interface::{
78
IPaymentsDispatcher, IPaymentsDispatcherTrait, IPaymentsSafeDispatcher,
89
IPaymentsSafeDispatcherTrait,
910
};
11+
use starkware_utils::signature::stark::HashType;
1012
use starkware_utils::time::time::Timestamp;
1113
use starkware_utils_testing::constants as testing_constants;
1214
use starkware_utils_testing::test_utils::{
@@ -15,6 +17,7 @@ use starkware_utils_testing::test_utils::{
1517
};
1618
use crate::events;
1719
use crate::order::Order;
20+
use crate::payments::payments::SNIP12MetadataImpl;
1821
use crate::tests::test_utils::*;
1922

2023
fn default_order() -> Order {
@@ -26,7 +29,7 @@ fn default_order() -> Order {
2629
buy_token: testing_constants::DUMMY_ADDRESS,
2730
sell_amount: 100,
2831
buy_amount: 200,
29-
allowed_addresses: array![].span(),
32+
approved_counterparties: array![].span(),
3033
}
3134
}
3235

@@ -169,17 +172,18 @@ fn test_failed_set_fee() {
169172
fn test_successful_handle_order() {
170173
let contract_address = init_contract_with_roles();
171174
let dispatcher = IPaymentsDispatcher { contract_address };
175+
let user = testing_constants::DUMMY_ADDRESS;
172176
let mut spy = snforge_std::spy_events();
173177

174178
let order_1 = Order { sell_amount: 10, ..default_order() };
175179
let order_2 = Order { salt: 2, sell_amount: 20, ..default_order() };
176180
let order_3 = Order { salt: 3, sell_amount: 30, ..default_order() };
177181
let orders = array![order_1, order_2, order_3];
178-
let order_hashes = array![
179-
3250832918082879608022746380123673061315069847566627860201489924189339339467,
180-
3259641975931468454375849282716321416060344786234492516391729290818542841802,
181-
3472711217305392937857639177600091754979974757056915903236482173645832579133,
182-
];
182+
let mut order_hashes: Array<HashType> = array![];
183+
for order in orders.span() {
184+
let message_hash = order.get_message_hash(user);
185+
order_hashes.append(message_hash);
186+
}
183187

184188
for order_hash in order_hashes.span() {
185189
assert_eq!(dispatcher.get_order_fulfillment(*order_hash), 0);

src/utils.cairo

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ fn is_in_span(tested_address: ContractAddress, address_list: Span<ContractAddres
1313
false
1414
}
1515

16-
pub fn is_allowed_address(
17-
tested_address: ContractAddress, allowed_addresses: Span<ContractAddress>,
16+
pub fn is_approved_counterparty(
17+
tested_address: ContractAddress, approved_counterparties: Span<ContractAddress>,
1818
) -> bool {
19-
// Means all addresses are allowed.
20-
if allowed_addresses.len() == 0 {
19+
// Means all addresses are approved.
20+
if approved_counterparties.len() == 0 {
2121
return true;
2222
}
2323

24-
is_in_span(tested_address, allowed_addresses)
24+
is_in_span(tested_address, approved_counterparties)
2525
}
2626

2727
pub fn validate_signature(signer: ContractAddress, hash: felt252, signature: Span<felt252>) {

0 commit comments

Comments
 (0)