|
| 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 | +} |
0 commit comments