Skip to content

Commit 43da4e0

Browse files
committed
Add unit and integration tests
1 parent 63141b2 commit 43da4e0

4 files changed

Lines changed: 583 additions & 0 deletions

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.29;
3+
4+
import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
5+
6+
import {BuilderCodesTest} from "../lib/BuilderCodesTest.sol";
7+
import {BuilderCodes} from "../../src/BuilderCodes.sol";
8+
import {MockTransferAgent} from "../lib/mocks/MockTransferAgent.sol";
9+
10+
/// @notice Integration tests for BuilderCodes transfers
11+
contract BuilderCodesTransfersTest is BuilderCodesTest {
12+
/// @notice Test that transferFrom succeeds when a token owner approves a transfer agent
13+
///
14+
/// @param from The from address
15+
/// @param to The to address
16+
/// @param codeSeed The seed for generating the code
17+
/// @param payoutAddress The payout address
18+
function test_approveTransferAgentToTransferToken(address from, address to, uint256 codeSeed, address payoutAddress)
19+
public
20+
{
21+
from = _boundNonZeroAddress(from);
22+
to = _boundNonZeroAddress(to);
23+
vm.assume(from != owner);
24+
vm.assume(from != to);
25+
payoutAddress = _boundNonZeroAddress(payoutAddress);
26+
MockTransferAgent transferAgent = new MockTransferAgent(address(builderCodes));
27+
28+
// Register the code
29+
string memory code = _generateValidCode(codeSeed);
30+
uint256 tokenId = builderCodes.toTokenId(code);
31+
vm.prank(owner);
32+
builderCodes.register(code, from, payoutAddress);
33+
34+
// Owner grants transfer role to transfer agent
35+
vm.prank(owner);
36+
builderCodes.grantRole(TRANSFER_ROLE, address(transferAgent));
37+
38+
// Owner approves specific transfer on agent
39+
vm.prank(owner);
40+
transferAgent.approveTransfer(from, to);
41+
42+
// User approves transfer agent to transfer the token
43+
vm.prank(from);
44+
builderCodes.approve(address(transferAgent), tokenId);
45+
46+
// Transfer the token from `from` to `to`
47+
vm.prank(from);
48+
transferAgent.transfer(to, tokenId);
49+
50+
// Verify the token was transferred
51+
assertEq(builderCodes.ownerOf(tokenId), to);
52+
assertEq(builderCodes.balanceOf(from), 0);
53+
assertEq(builderCodes.balanceOf(to), 1);
54+
}
55+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.29;
3+
4+
import {BuilderCodes} from "../../../src/BuilderCodes.sol";
5+
6+
contract MockTransferAgent {
7+
BuilderCodes public builderCodes;
8+
9+
mapping(address => mapping(address => bool)) public approvedTransfers;
10+
11+
constructor(address builderCodes_) {
12+
builderCodes = BuilderCodes(builderCodes_);
13+
}
14+
15+
function approveTransfer(address from, address to) public {
16+
if (!builderCodes.hasRole(builderCodes.TRANSFER_ROLE(), msg.sender)) revert();
17+
approvedTransfers[from][to] = true;
18+
}
19+
20+
function transfer(address to, uint256 amount) public {
21+
if (!approvedTransfers[msg.sender][to]) revert();
22+
builderCodes.transferFrom(msg.sender, to, amount);
23+
}
24+
}

0 commit comments

Comments
 (0)