From 2ed7ce67f5c6bd469156a20f2c79d983480f2ca1 Mon Sep 17 00:00:00 2001
From: Patrice Tisserand
Date: Wed, 24 Jul 2024 16:42:59 +0200
Subject: [PATCH 1/3] contracts: snforge belongs to dev-dependencies
---
contracts/Scarb.lock | 1 -
contracts/ark_common/Scarb.toml | 2 ++
contracts/ark_orderbook/Scarb.toml | 2 ++
contracts/ark_oz/Scarb.toml | 2 ++
contracts/ark_starknet/Scarb.toml | 4 +++-
contracts/ark_tokens/Scarb.toml | 4 +++-
6 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/contracts/Scarb.lock b/contracts/Scarb.lock
index c8865abf6..4b6ca9bb9 100644
--- a/contracts/Scarb.lock
+++ b/contracts/Scarb.lock
@@ -21,7 +21,6 @@ name = "ark_oz"
version = "0.1.0"
dependencies = [
"openzeppelin",
- "snforge_std",
]
[[package]]
diff --git a/contracts/ark_common/Scarb.toml b/contracts/ark_common/Scarb.toml
index 3dca0b95c..37b19bb7c 100644
--- a/contracts/ark_common/Scarb.toml
+++ b/contracts/ark_common/Scarb.toml
@@ -6,6 +6,8 @@ version = "0.1.0"
[dependencies]
starknet = "2.5.4"
+
+[dev-dependencies]
snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
[lib]
diff --git a/contracts/ark_orderbook/Scarb.toml b/contracts/ark_orderbook/Scarb.toml
index c712c590a..925ee92f3 100644
--- a/contracts/ark_orderbook/Scarb.toml
+++ b/contracts/ark_orderbook/Scarb.toml
@@ -5,6 +5,8 @@ version = "0.1.0"
[dependencies]
ark_common = { path = "../ark_common" }
starknet = "2.5.4"
+
+[dev-dependencies]
snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
[[target.starknet-contract]]
diff --git a/contracts/ark_oz/Scarb.toml b/contracts/ark_oz/Scarb.toml
index ffa101978..c654dc1e0 100644
--- a/contracts/ark_oz/Scarb.toml
+++ b/contracts/ark_oz/Scarb.toml
@@ -7,6 +7,8 @@ version = "0.1.0"
[dependencies]
starknet = "2.5.4"
openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts.git", tag = "v0.10.0" }
+
+[dev-dependencies]
snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
[lib]
diff --git a/contracts/ark_starknet/Scarb.toml b/contracts/ark_starknet/Scarb.toml
index 2d28cb5dd..5459d67c2 100644
--- a/contracts/ark_starknet/Scarb.toml
+++ b/contracts/ark_starknet/Scarb.toml
@@ -5,11 +5,13 @@ version = "0.1.0"
[dependencies]
starknet = "2.5.4"
openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts.git", tag = "v0.10.0" }
-snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
ark_common = { path = "../ark_common" }
ark_tokens = { path = "../ark_tokens" }
ark_oz = { path = "../ark_oz" }
+[dev-dependencies]
+snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
+
[[target.starknet-contract]]
sierra = true
casm = true
diff --git a/contracts/ark_tokens/Scarb.toml b/contracts/ark_tokens/Scarb.toml
index 862324da4..80f67ab1a 100644
--- a/contracts/ark_tokens/Scarb.toml
+++ b/contracts/ark_tokens/Scarb.toml
@@ -5,10 +5,12 @@ version = "0.1.0"
[dependencies]
starknet = "2.5.4"
-snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts.git", tag = "v0.10.0" }
ark_oz = { path = "../ark_oz" }
+[dev-dependencies]
+snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
+
[lib]
[[target.starknet-contract]]
From 36da466c5f35ff6b5a6a3b0ac87089606c1c45ae Mon Sep 17 00:00:00 2001
From: Patrice Tisserand
Date: Wed, 24 Jul 2024 19:11:13 +0200
Subject: [PATCH 2/3] feat: add fufill status in starknet executor
---
contracts/ark_starknet/src/executor.cairo | 3 ++
.../tests/integration/fulfill_order.cairo | 40 +++++++++++++++++++
2 files changed, 43 insertions(+)
diff --git a/contracts/ark_starknet/src/executor.cairo b/contracts/ark_starknet/src/executor.cairo
index 54656b57c..8146b8ec9 100644
--- a/contracts/ark_starknet/src/executor.cairo
+++ b/contracts/ark_starknet/src/executor.cairo
@@ -100,6 +100,7 @@ mod executor {
ark_fees: FeesRatio,
// order hash -> OrderInfo
orders: LegacyMap,
+ fulfilled_orders: LegacyMap,
// fallback when collection doesn't implement ERC2981
default_receiver: ContractAddress,
default_fees: FeesRatio,
@@ -322,10 +323,12 @@ mod executor {
let messaging = IAppchainMessagingDispatcher {
contract_address: self.messaging_address.read()
};
+ assert!(!self.fulfilled_orders.read(fulfillInfo.order_hash), "Order already fulfilled");
let vinfo = FulfillOrderInfo { fulfillInfo: fulfillInfo.clone() };
_verify_fulfill_order(@self, @vinfo);
+ self.fulfilled_orders.write(fulfillInfo.order_hash, true);
let mut vinfo_buf = array![];
Serde::serialize(@vinfo, ref vinfo_buf);
diff --git a/contracts/ark_starknet/tests/integration/fulfill_order.cairo b/contracts/ark_starknet/tests/integration/fulfill_order.cairo
index 42e146dbb..02207089b 100644
--- a/contracts/ark_starknet/tests/integration/fulfill_order.cairo
+++ b/contracts/ark_starknet/tests/integration/fulfill_order.cairo
@@ -503,3 +503,43 @@ fn test_fulfill_auction_order_fulfiller_same_as_offerer() {
IExecutorDispatcher { contract_address: executor_address }.fulfill_order(fulfill_info);
snf::stop_prank(CheatTarget::One(executor_address));
}
+
+#[test]
+#[should_panic(expected: ("Order already fulfilled",))]
+fn test_fulfill_offer_order_already_fulfilled_order() {
+ let (executor_address, erc20_address, nft_address) = setup();
+ let fulfillerA = contract_address_const::<'fulfillerA'>();
+ let fulfillerB = contract_address_const::<'fulfillerB'>();
+ let start_amount = 10_000_000;
+
+ let (order_hash, offerer, token_id) = create_listing_order(
+ executor_address, erc20_address, nft_address, start_amount
+ );
+
+ IFreeMintDispatcher { contract_address: erc20_address }.mint(fulfillerA, start_amount);
+ IFreeMintDispatcher { contract_address: erc20_address }.mint(fulfillerB, start_amount);
+
+ snf::start_prank(CheatTarget::One(nft_address), offerer);
+ IERC721Dispatcher { contract_address: nft_address }
+ .set_approval_for_all(executor_address, true);
+ snf::stop_prank(CheatTarget::One(nft_address));
+
+ let fulfill_infoA = create_fulfill_info(order_hash, fulfillerA, nft_address, token_id);
+ let fulfill_infoB = create_fulfill_info(order_hash, fulfillerB, nft_address, token_id);
+
+ snf::start_prank(CheatTarget::One(erc20_address), fulfillerA);
+ IERC20Dispatcher { contract_address: erc20_address }.approve(executor_address, start_amount);
+ snf::stop_prank(CheatTarget::One(erc20_address));
+
+ snf::start_prank(CheatTarget::One(erc20_address), fulfillerB);
+ IERC20Dispatcher { contract_address: erc20_address }.approve(executor_address, start_amount);
+ snf::stop_prank(CheatTarget::One(erc20_address));
+
+ snf::start_prank(CheatTarget::One(executor_address), fulfillerA);
+ IExecutorDispatcher { contract_address: executor_address }.fulfill_order(fulfill_infoA);
+ snf::stop_prank(CheatTarget::One(executor_address));
+
+ snf::start_prank(CheatTarget::One(executor_address), fulfillerB);
+ IExecutorDispatcher { contract_address: executor_address }.fulfill_order(fulfill_infoB);
+ snf::stop_prank(CheatTarget::One(executor_address));
+}
From 848eaacedd8fdc06175071fb37f48508ba1a9b11 Mon Sep 17 00:00:00 2001
From: Patrice Tisserand
Date: Mon, 29 Jul 2024 22:32:35 +0200
Subject: [PATCH 3/3] contracts: use `[workspace.dependencies]` for
`snforge_std` to remove duplicated version in each packages.
---
contracts/Scarb.toml | 3 +++
contracts/ark_common/Scarb.toml | 2 +-
contracts/ark_orderbook/Scarb.toml | 2 +-
contracts/ark_starknet/Scarb.toml | 2 +-
contracts/ark_tokens/Scarb.toml | 2 +-
5 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/contracts/Scarb.toml b/contracts/Scarb.toml
index 132ebcb44..ef3a145b8 100644
--- a/contracts/Scarb.toml
+++ b/contracts/Scarb.toml
@@ -1,3 +1,6 @@
[workspace]
members = ["ark_common", "ark_orderbook", "ark_starknet", "ark_tokens", "solis"]
+
+[workspace.dependencies]
+snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
diff --git a/contracts/ark_common/Scarb.toml b/contracts/ark_common/Scarb.toml
index 37b19bb7c..3f3334b18 100644
--- a/contracts/ark_common/Scarb.toml
+++ b/contracts/ark_common/Scarb.toml
@@ -8,7 +8,7 @@ version = "0.1.0"
starknet = "2.5.4"
[dev-dependencies]
-snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
+snforge_std.workspace = true
[lib]
diff --git a/contracts/ark_orderbook/Scarb.toml b/contracts/ark_orderbook/Scarb.toml
index 925ee92f3..806b190ee 100644
--- a/contracts/ark_orderbook/Scarb.toml
+++ b/contracts/ark_orderbook/Scarb.toml
@@ -7,7 +7,7 @@ ark_common = { path = "../ark_common" }
starknet = "2.5.4"
[dev-dependencies]
-snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
+snforge_std.workspace = true
[[target.starknet-contract]]
sierra = true
diff --git a/contracts/ark_starknet/Scarb.toml b/contracts/ark_starknet/Scarb.toml
index 5459d67c2..969fd0ca0 100644
--- a/contracts/ark_starknet/Scarb.toml
+++ b/contracts/ark_starknet/Scarb.toml
@@ -10,7 +10,7 @@ ark_tokens = { path = "../ark_tokens" }
ark_oz = { path = "../ark_oz" }
[dev-dependencies]
-snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
+snforge_std.workspace = true
[[target.starknet-contract]]
sierra = true
diff --git a/contracts/ark_tokens/Scarb.toml b/contracts/ark_tokens/Scarb.toml
index 80f67ab1a..b8f2b5d48 100644
--- a/contracts/ark_tokens/Scarb.toml
+++ b/contracts/ark_tokens/Scarb.toml
@@ -9,7 +9,7 @@ openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts.git", ta
ark_oz = { path = "../ark_oz" }
[dev-dependencies]
-snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.18.0" }
+snforge_std.workspace = true
[lib]