Skip to content

Commit 8117479

Browse files
feat(payments): implement trade inner methods (#9)
1 parent b8f2dc5 commit 8117479

File tree

7 files changed

+281
-150
lines changed

7 files changed

+281
-150
lines changed

src/errors.cairo

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
1+
pub const INVALID_AMOUNT_RATIO: felt252 = 'INVALID_AMOUNT_RATIO';
2+
pub const INVALID_AMOUNT_TOO_LARGE: felt252 = 'INVALID_AMOUNT_TOO_LARGE';
3+
pub const INVALID_DOWNCAST_AFTER_DIVISION: felt252 = 'INVALID_DOWNCAST_AFTER_DIVISION';
14
pub const INVALID_HIGH_FEE: felt252 = 'INVALID_HIGH_FEE';
25
pub const INVALID_HIGH_FEE_LIMIT: felt252 = 'INVALID_HIGH_FEE_LIMIT';
6+
pub const INVALID_STARK_SIGNATURE: felt252 = 'INVALID_STARK_SIGNATURE';
7+
pub const INVALID_TOKEN_PAIR: felt252 = 'INVALID_TOKEN_PAIR';
8+
pub const INVALID_TRADE_SAME_USER: felt252 = 'INVALID_TRADE_SAME_USER';
39
pub const INVALID_ZERO_ADDRESS: felt252 = 'INVALID_ZERO_ADDRESS';
4-
pub const ORDER_ALREADY_CANCELED: felt252 = 'ORDER_ALREADY_CANCELED';
5-
pub const ORDER_WAS_FULFILLED: felt252 = 'ORDER_WAS_FULFILLED';
10+
pub const INVALID_ZERO_AMOUNT_RATIO: felt252 = 'INVALID_ZERO_AMOUNT_RATIO';
11+
pub const INVALID_ZERO_TOKEN: felt252 = 'INVALID_ZERO_TOKEN';
12+
pub const ORDER_EXPIRED: felt252 = 'ORDER_EXPIRED';
613
pub const TOKEN_ALREADY_REGISTERED: felt252 = 'TOKEN_ALREADY_REGISTERED';
714
pub const TOKEN_NOT_REGISTERED: felt252 = 'TOKEN_NOT_REGISTERED';
815
pub const TRANSFER_FAILED: felt252 = 'TRANSFER_FAILED';
16+
pub const UNALLOWED_ADDRESS: felt252 = 'UNALLOWED_ADDRESS';

src/interface.cairo

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,23 @@ use starknet::ContractAddress;
22
use starkware_utils::signature::stark::{HashType, Signature};
33
use crate::order::Order;
44

5-
#[derive(Copy, Drop, Debug, Serde, PartialEq, starknet::Store)]
6-
pub enum FulfilledStatus {
7-
#[default]
8-
PartialFulfilled: u128,
9-
Fulfilled: u128,
10-
Canceled: u128,
11-
}
12-
135
#[starknet::interface]
146
pub trait IPayments<TContractState> {
157
fn trade(
168
ref self: TContractState,
17-
order_1: Order,
18-
order_2: Order,
19-
signature_1: Signature,
20-
signature_2: Signature,
21-
actual_sell_amount: u128,
22-
actual_buy_amount: u128,
9+
order_a: Order,
10+
order_b: Order,
11+
signature_a: Signature,
12+
signature_b: Signature,
13+
order_a_actual_sell_amount: u128,
14+
order_a_actual_buy_amount: u128,
2315
);
2416

2517
fn register_token(ref self: TContractState, token: ContractAddress);
2618
fn remove_token(ref self: TContractState, token: ContractAddress);
2719
fn is_token_registered(self: @TContractState, token: ContractAddress) -> bool;
2820

29-
fn cancel_orders(ref self: TContractState, order_hashes: Span<HashType>);
21+
fn cancel_orders(ref self: TContractState, orders: Span<Order>);
3022

3123
// Setters:
3224

@@ -40,5 +32,5 @@ pub trait IPayments<TContractState> {
4032
fn get_fee(self: @TContractState) -> u128;
4133
fn get_fee_recipient(self: @TContractState) -> ContractAddress;
4234

43-
fn get_order_fulfillment(self: @TContractState, order_hash: HashType) -> FulfilledStatus;
35+
fn get_order_fulfillment(self: @TContractState, order_hash: HashType) -> u128;
4436
}

src/lib.cairo

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ pub mod payments;
66

77
#[cfg(test)]
88
pub mod tests;
9+
pub(crate) mod utils;

src/order.cairo

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,31 @@ use core::hash::{Hash, HashStateExTrait, HashStateTrait};
22
use core::poseidon::PoseidonTrait;
33
use openzeppelin::utils::snip12::StructHash;
44
use starknet::ContractAddress;
5-
use starkware_utils::signature::stark::{HashType, PublicKey};
5+
use starkware_utils::signature::stark::HashType;
66
use starkware_utils::time::time::Timestamp;
77

88
#[derive(Drop, Serde, Copy)]
99
pub struct Order {
1010
pub salt: felt252,
1111
pub expiry: Timestamp,
12-
pub owner: ContractAddress,
13-
pub public_key: PublicKey,
12+
pub user: ContractAddress,
1413
pub sell_token: ContractAddress,
1514
pub buy_token: ContractAddress,
1615
pub sell_amount: u128,
1716
pub buy_amount: u128,
18-
// Addresses the user is willing to trade with. Empty means any address
17+
// Addresses the user is willing to trade with. Empty span means any address.
1918
pub allowed_addresses: Span<ContractAddress>,
2019
}
2120

2221
pub impl HashOrderImpl<S, +HashStateTrait<S>, +Drop<S>> of Hash<Order, S> {
2322
fn update_state(mut state: S, value: Order) -> S {
2423
let Order {
25-
salt,
26-
expiry,
27-
owner,
28-
public_key,
29-
sell_token,
30-
buy_token,
31-
sell_amount,
32-
buy_amount,
33-
allowed_addresses,
24+
salt, expiry, user, sell_token, buy_token, sell_amount, buy_amount, allowed_addresses,
3425
} = value;
3526
state = state
3627
.update_with(salt)
3728
.update_with(expiry)
38-
.update_with(owner)
39-
.update_with(public_key)
29+
.update_with(user)
4030
.update_with(sell_token)
4131
.update_with(buy_token)
4232
.update_with(sell_amount)
@@ -55,8 +45,7 @@ pub impl HashOrderImpl<S, +HashStateTrait<S>, +Drop<S>> of Hash<Order, S> {
5545
/// "\"Order\"(
5646
/// \"salt\":\"felt\",
5747
/// \"expiry\":\"Timestamp\",
58-
/// \"owner\":\"ContractAddress\",
59-
/// \"public_key\":\"PublicKey\",
48+
/// \"user\":\"ContractAddress\",
6049
/// \"sell_token\":\"ContractAddress\",
6150
/// \"buy_token\":\"ContractAddress\",
6251
/// \"sell_amount\":\"u128\",
@@ -68,7 +57,7 @@ pub impl HashOrderImpl<S, +HashStateTrait<S>, +Drop<S>> of Hash<Order, S> {
6857
/// )
6958
/// );
7059

71-
const ORDER_TYPE_HASH: HashType = 0x110a09f78c9cd3ca416d13d90e38007ba8bde2f44ae77b5fd037cb9bfb68117;
60+
const ORDER_TYPE_HASH: HashType = 0x2d9dc4d67a6cc048d96cd39c037575fa17fc4f4ba67fa9307cd08d3aac3943b;
7261

7362
impl StructHashImpl of StructHash<Order> {
7463
fn hash_struct(self: @Order) -> HashType {
@@ -85,7 +74,7 @@ mod tests {
8574
#[test]
8675
fn test_order_type_hash() {
8776
let expected = selector!(
88-
"\"Order\"(\"salt\":\"felt\",\"expiry\":\"Timestamp\",\"owner\":\"ContractAddress\",\"public_key\":\"PublicKey\",\"sell_token\":\"ContractAddress\",\"buy_token\":\"ContractAddress\",\"sell_amount\":\"u128\",\"buy_amount\":\"u128\",\"allowed_addresses\":\"Span<ContractAddress>\")\"Timestamp\"(\"seconds\":\"u64\")",
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\")",
8978
);
9079
assert_eq!(ORDER_TYPE_HASH.into_base_16_string(), expected.into_base_16_string());
9180
}

0 commit comments

Comments
 (0)