Skip to content

Commit 53f5167

Browse files
Axel ValavaaraAxel Valavaara
authored andcommitted
add merchantNft
1 parent 259853f commit 53f5167

6 files changed

Lines changed: 84 additions & 5 deletions

File tree

makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
-include .env
22
.PHONY: all test deploy
33

4-
deploy :; forge script script/DeployOrderContract.s.sol:DeployOrderContract --rpc-url $(SEPOLIA_RPC) --broadcast --private-key $(PRIVATE_KEY) --verify -vvvv
4+
deploysepolia :; forge script script/DeployOrderContract.s.sol:DeployOrderContract --rpc-url $(SEPOLIA_RPC) --broadcast --private-key $(PRIVATE_KEY) --verify -vvvv
5+
deployanvil :; forge script script/DeployOrderContract.s.sol:DeployOrderContract --rpc-url $(ANVIL_RPC) --broadcast --private-key $(DEFAULT_ANVIL_KEY) -vvvv

script/DeployOrderContract.s.sol

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,18 @@ import {OrderContract} from "../src/OrderContract.sol";
77
import {Script} from "forge-std/Script.sol";
88
import {HelperConfig} from "./HelperConfig.s.sol";
99
import {A3AToken} from "../src/A3Atoken.sol";
10+
import {MerchantNft} from "../src/MerchantNft.sol";
1011
contract DeployOrderContract is Script {
1112

1213

13-
function run() public returns (OrderContract, HelperConfig, A3AToken) {
14+
function run() public returns (OrderContract, HelperConfig, A3AToken, MerchantNft) {
1415
HelperConfig helperConfig = new HelperConfig();
1516

1617
(address pyUSD, address agentController, uint256 deployerKey, address owner)= helperConfig.activeNetworkConfig();
1718

1819
vm.startBroadcast(deployerKey);
1920
A3AToken token = new A3AToken();
21+
MerchantNft merchantNft = new MerchantNft();
2022
OrderContract orderContract = new OrderContract(
2123
agentController, pyUSD, address(token), owner // Replace with actual pyUSD token address
2224
);
@@ -30,6 +32,6 @@ contract DeployOrderContract is Script {
3032

3133

3234
vm.stopBroadcast();
33-
return (orderContract, helperConfig, token);
35+
return (orderContract, helperConfig, token, merchantNft);
3436
}
3537
}

src/MerchantNft.sol

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// SPDX-License-Identifier: MIT
2+
3+
pragma solidity ^0.8.18;
4+
5+
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
6+
7+
contract MerchantNft is ERC721 {
8+
error MerchantNft__MerchantIdAlreadyMinted();
9+
10+
11+
constructor() ERC721("MerchantNft", "MNFT") {
12+
13+
}
14+
15+
function mintNft(uint256 merchantId) public {
16+
if (_ownerOf(merchantId) != address(0)) {
17+
revert MerchantNft__MerchantIdAlreadyMinted();
18+
}
19+
_safeMint(msg.sender, merchantId);
20+
21+
}
22+
23+
function isMerchant(address wallet, uint256 merchantId) external view returns (bool) {
24+
if (_ownerOf(merchantId) == wallet) {
25+
return true;
26+
} else {
27+
return false;
28+
}
29+
}
30+
}

src/OrderContract.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
2727
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
2828
import {A3AToken} from "./A3Atoken.sol";
2929

30+
3031
contract OrderContract is ReentrancyGuard{
3132

3233
/*//////////////////////////////////////////////////////////////

test/fuzz/InvariantsTest.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ contract InvariantsTest is StdInvariant, Test {
1515

1616
function setUp() public {
1717
DeployOrderContract deployer = new DeployOrderContract();
18-
(orderContract, helperConfig,) = deployer.run();
18+
(orderContract, helperConfig,,) = deployer.run();
1919
targetContract(address(orderContract));
2020
}
2121

test/unit/OrderContractTest.t.sol

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {HelperConfig} from "script/HelperConfig.s.sol";
88
import {DeployOrderContract} from "script/DeployOrderContract.s.sol";
99
import {ERC20Mock} from "@openzeppelin/contracts/mocks/token/ERC20Mock.sol";
1010
import {A3AToken} from "../../src/A3Atoken.sol";
11+
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
12+
import {MerchantNft} from "../../src/MerchantNft.sol";
1113

1214
contract OrderContractTest is Test {
1315
OrderContract orderContract;
@@ -16,6 +18,7 @@ contract OrderContractTest is Test {
1618
address addressController;
1719
A3AToken a3aToken;
1820
address owner;
21+
MerchantNft merchantNft;
1922

2023

2124
bytes32 constant PROMPT_HASH = keccak256(abi.encodePacked("Test Prompt"));
@@ -35,7 +38,7 @@ contract OrderContractTest is Test {
3538

3639
function setUp() public {
3740
DeployOrderContract deployer = new DeployOrderContract();
38-
(orderContract, helperConfig, a3aToken) = deployer.run();
41+
(orderContract, helperConfig, a3aToken, merchantNft) = deployer.run();
3942
(pyUSD, addressController,,owner) = helperConfig.activeNetworkConfig();
4043
ERC20Mock(pyUSD).mint(USER, DEFAULT_MINT_AMOUNT);
4144
ERC20Mock(pyUSD).mint(USER2, DEFAULT_MINT_AMOUNT);
@@ -350,6 +353,48 @@ contract OrderContractTest is Test {
350353
assertEq(uint8(offer.status), uint8(OrderContract.OrderStatus.Proposed));
351354
}
352355

356+
/*//////////////////////////////////////////////////////////////
357+
MERCHANT NFT TESTS
358+
//////////////////////////////////////////////////////////////*/
359+
function testMerchantNftMintingAndOwnership() public {
360+
// Arrange
361+
uint256 merchantId = 1;
362+
// Act
363+
vm.prank(SELLER);
364+
merchantNft.mintNft(merchantId);
365+
// Assert
366+
address ownerOfNft = merchantNft.ownerOf(merchantId);
367+
assertEq(ownerOfNft, SELLER);
368+
bool isMerchant = merchantNft.isMerchant(SELLER, merchantId);
369+
assertTrue(isMerchant);
370+
371+
}
372+
373+
374+
function testMerchantNftRevertsOnDuplicateMint() public {
375+
// Arrange
376+
uint256 merchantId = 1;
377+
vm.prank(SELLER);
378+
merchantNft.mintNft(merchantId);
379+
// Act / Assert
380+
vm.prank(USER);
381+
vm.expectRevert(MerchantNft.MerchantNft__MerchantIdAlreadyMinted.selector);
382+
merchantNft.mintNft(merchantId);
383+
384+
}
385+
386+
function testMerchantNftReturnsFalseIfNotOwner() public {
387+
// Arrange
388+
uint256 merchantId = 1;
389+
vm.prank(SELLER);
390+
merchantNft.mintNft(merchantId);
391+
// Act
392+
bool isMerchant = merchantNft.isMerchant(USER, merchantId);
393+
// Assert
394+
assertFalse(isMerchant);
395+
}
396+
397+
353398
/*//////////////////////////////////////////////////////////////
354399
USER ORDER MAPPINGS TESTS
355400
//////////////////////////////////////////////////////////////*/

0 commit comments

Comments
 (0)