Skip to content
This repository was archived by the owner on Oct 28, 2025. It is now read-only.

Commit 5864c52

Browse files
committed
edition fees
1 parent 283c920 commit 5864c52

File tree

12 files changed

+176
-6
lines changed

12 files changed

+176
-6
lines changed

contracts/DCNT721A.sol

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ pragma solidity ^0.8.0;
1717

1818
import './erc721a/ERC721A.sol';
1919
import './interfaces/IMetadataRenderer.sol';
20+
import './interfaces/IFeeManager.sol';
2021
import '@openzeppelin/contracts/proxy/utils/Initializable.sol';
2122
import '@openzeppelin/contracts/access/Ownable.sol';
2223
import '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol';
@@ -64,6 +65,8 @@ contract DCNT721A is
6465

6566
address public parentIP;
6667

68+
address public feeManager;
69+
6770
/// ============ Events ============
6871

6972
/// @notice Emitted after a successful token claim
@@ -90,6 +93,8 @@ contract DCNT721A is
9093
_;
9194
}
9295

96+
error FeeTransferFailed();
97+
9398
/// ============ Constructor ============
9499

95100
function initialize(
@@ -105,6 +110,7 @@ contract DCNT721A is
105110
_symbol = _editionConfig.symbol;
106111
_currentIndex = _startTokenId();
107112

113+
feeManager = _editionConfig.feeManager;
108114
parentIP = _metadataConfig.parentIP;
109115
tokenGateConfig = _tokenGateConfig;
110116

@@ -137,6 +143,17 @@ contract DCNT721A is
137143
}
138144
}
139145

146+
/**
147+
* @dev Gets the current minting fee for the specified token.
148+
* @param quantity The quantity of tokens used to calculate the minting fee.
149+
* @return fee The current fee for minting the specified token.
150+
*/
151+
function mintFee(uint256 quantity) external view returns (uint256 fee) {
152+
if ( feeManager != address(0) ) {
153+
(fee, ) = IFeeManager(feeManager).calculateFees(edition.tokenPrice, quantity);
154+
}
155+
}
156+
140157
/// @notice purchase nft
141158
function mint(address to, uint256 numberOfTokens)
142159
external
@@ -151,7 +168,17 @@ contract DCNT721A is
151168
"Purchase would exceed max supply"
152169
);
153170
require(mintIndex <= edition.maxTokens, "SOLD OUT");
154-
require(msg.value >= (edition.tokenPrice * numberOfTokens), "Insufficient funds");
171+
172+
uint256 fee;
173+
uint256 commission;
174+
175+
if ( feeManager != address(0) ) {
176+
(fee, commission) = IFeeManager(feeManager).calculateFees(edition.tokenPrice, numberOfTokens);
177+
}
178+
179+
uint256 totalPrice = (edition.tokenPrice * numberOfTokens) + fee;
180+
require(msg.value >= totalPrice, "Insufficient funds");
181+
155182
if ( edition.maxTokenPurchase != 0 ) {
156183
require(numberOfTokens <= edition.maxTokenPurchase, "Exceeded max number per mint");
157184
}
@@ -162,6 +189,21 @@ contract DCNT721A is
162189
emit Minted(to, mintIndex++);
163190
}
164191
}
192+
193+
_transferFees(fee + commission);
194+
}
195+
196+
/**
197+
* @dev Internal function to transfer fees to the fee manager.
198+
* @param fees The amount of funds to transfer.
199+
*/
200+
function _transferFees(uint256 fees) internal {
201+
if ( fees > 0 ) {
202+
(bool success, ) = payable(IFeeManager(feeManager).recipient()).call{value: fees}("");
203+
if ( ! success ) {
204+
revert FeeTransferFailed();
205+
}
206+
}
165207
}
166208

167209
/// @notice allows the owner to "airdrop" users an NFT

contracts/DCNTSDK.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ contract DCNTSDK is Ownable {
9191
abi.encodeWithSignature(
9292
"initialize("
9393
"address,"
94-
"(string,string,bool,bool,uint32,uint32,uint32,uint32,uint32,uint32,uint16,uint96,address,bytes32),"
94+
"(string,string,bool,bool,uint32,uint32,uint32,uint32,uint32,uint32,uint16,uint96,address,address,bytes32),"
9595
"(string,string,bytes,address),"
9696
"(address,uint88,uint8),"
9797
"address"
@@ -120,7 +120,7 @@ contract DCNTSDK is Ownable {
120120
abi.encodeWithSignature(
121121
"initialize("
122122
"address,"
123-
"(string,string,bool,bool,uint32,uint32,uint32,uint32,uint32,uint32,uint16,uint96,address,bytes32),"
123+
"(string,string,bool,bool,uint32,uint32,uint32,uint32,uint32,uint32,uint16,uint96,address,address,bytes32),"
124124
"(string,string,bytes,address),"
125125
"(address,uint88,uint8),"
126126
"address,"
@@ -150,7 +150,7 @@ contract DCNTSDK is Ownable {
150150
abi.encodeWithSignature(
151151
"initialize("
152152
"address,"
153-
"(string,string,bool,bool,uint32,uint32,uint32,uint32,uint32,uint32,uint16,uint96,address,bytes32),"
153+
"(string,string,bool,bool,uint32,uint32,uint32,uint32,uint32,uint32,uint16,uint96,address,address,bytes32),"
154154
"(string,string,bytes,address),"
155155
"(address,uint88,uint8),"
156156
"address"

contracts/DCNTVaultNFT.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ contract DCNTVaultNFT is Ownable {
7373
(bool success1, bytes memory data1) = _DCNTSDK.delegatecall(
7474
abi.encodeWithSignature(
7575
"deployDCNT4907A("
76-
"(string,string,bool,bool,uint32,uint32,uint32,uint32,uint32,uint32,uint16,uint96,address,bytes32),"
76+
"(string,string,bool,bool,uint32,uint32,uint32,uint32,uint32,uint32,uint16,uint96,address,address,bytes32),"
7777
"(string,string,bytes,address),"
7878
"(address,uint88,uint8)"
7979
")",
@@ -89,7 +89,7 @@ contract DCNTVaultNFT is Ownable {
8989
(bool success2, bytes memory data2) = _DCNTSDK.delegatecall(
9090
abi.encodeWithSignature(
9191
"deployDCNT721A("
92-
"(string,string,bool,bool,uint32,uint32,uint32,uint32,uint32,uint32,uint16,uint96,address,bytes32),"
92+
"(string,string,bool,bool,uint32,uint32,uint32,uint32,uint32,uint32,uint16,uint96,address,address,bytes32),"
9393
"(string,string,bytes,address),"
9494
"(address,uint88,uint8)"
9595
")",

contracts/storage/EditionConfig.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ struct EditionConfig {
1414
uint32 saleEnd;
1515
uint16 royaltyBPS;
1616
uint96 tokenPrice;
17+
address feeManager;
1718
address payoutAddress;
1819
bytes32 presaleMerkleRoot;
1920
}

core/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ export const deployDCNT721A = async (
130130
saleStart: number,
131131
saleEnd: number | BigNumber,
132132
royaltyBPS: number,
133+
feeManager: string | null,
133134
payoutAddress: string | null,
134135
contractURI: string,
135136
metadataURI: string,
@@ -163,6 +164,7 @@ export const deployDCNT721A = async (
163164
saleStart,
164165
saleEnd,
165166
royaltyBPS,
167+
feeManager,
166168
payoutAddress,
167169
},
168170
{
@@ -198,6 +200,7 @@ export const deployDCNT4907A = async (
198200
saleStart: number,
199201
saleEnd: number | BigNumber,
200202
royaltyBPS: number,
203+
feeManager: string | null,
201204
payoutAddress: string | null,
202205
contractURI: string,
203206
metadataURI: string,
@@ -231,6 +234,7 @@ export const deployDCNT4907A = async (
231234
saleStart,
232235
saleEnd,
233236
royaltyBPS,
237+
feeManager,
234238
payoutAddress,
235239
},
236240
{
@@ -432,6 +436,7 @@ export const DCNTVaultNFTCreate = async (
432436
saleStart: number,
433437
saleEnd: number | BigNumber,
434438
royaltyBPS: number,
439+
feeManager: string | null,
435440
payoutAddress: string | null,
436441
contractURI: string,
437442
metadataURI: string,
@@ -469,6 +474,7 @@ export const DCNTVaultNFTCreate = async (
469474
saleStart,
470475
saleEnd,
471476
royaltyBPS,
477+
feeManager,
472478
payoutAddress,
473479
},
474480
{
@@ -513,6 +519,7 @@ export const deployZKEdition = async (
513519
saleStart: number,
514520
saleEnd: number | BigNumber,
515521
royaltyBPS: number,
522+
feeManager: string | null,
516523
payoutAddress: string | null,
517524
contractURI: string,
518525
metadataURI: string,
@@ -547,6 +554,7 @@ export const deployZKEdition = async (
547554
saleStart,
548555
saleEnd,
549556
royaltyBPS,
557+
feeManager,
550558
payoutAddress,
551559
},
552560
{

test/DCNT4907a.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const presaleEnd = theFuture.time();
1818
const saleStart = theFuture.time();
1919
const saleEnd = theFuture.time() + theFuture.oneYear;
2020
const royaltyBPS = 10_00;
21+
const feeManager = ethers.constants.AddressZero;
2122
const payoutAddress = ethers.constants.AddressZero;
2223
const contractURI = "http://localhost/contract/";
2324
const metadataURI = "http://localhost/metadata/";
@@ -55,6 +56,7 @@ describe("DCNT4907A", async () => {
5556
saleStart,
5657
saleEnd,
5758
royaltyBPS,
59+
feeManager,
5860
payoutAddress,
5961
contractURI,
6062
metadataURI,

0 commit comments

Comments
 (0)