Skip to content

Commit 127a7b9

Browse files
committed
feat: adds dynamic protocol fee
1 parent b86ae27 commit 127a7b9

File tree

4 files changed

+148
-64
lines changed

4 files changed

+148
-64
lines changed

soljson-latest.js

Lines changed: 111 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/UniversalBridgeProxy.sol

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,7 @@ contract UniversalBridgeProxy {
1010
bytes32 private constant _ERC1967_IMPLEMENTATION_SLOT =
1111
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
1212

13-
constructor(
14-
address _implementation,
15-
address _owner,
16-
address _operator,
17-
address payable _protocolFeeRecipient,
18-
uint256 _protocolFeeBps
19-
) {
13+
constructor(address _implementation, address _owner, address _operator, address payable _protocolFeeRecipient) {
2014
if (_implementation == address(0)) {
2115
revert ImplementationZeroAddress();
2216
}
@@ -34,11 +28,10 @@ contract UniversalBridgeProxy {
3428
}
3529

3630
bytes memory data = abi.encodeWithSignature(
37-
"initialize(address,address,address,uint256)",
31+
"initialize(address,address,address)",
3832
_owner,
3933
_operator,
40-
_protocolFeeRecipient,
41-
_protocolFeeBps
34+
_protocolFeeRecipient
4235
);
4336
(bool success, ) = _implementation.delegatecall(data);
4437

src/UniversalBridgeV1.sol

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ library UniversalBridgeStorage {
2222
mapping(bytes32 => bool) processed;
2323
/// @dev Mapping from forward address or token address => whether restricted.
2424
mapping(address => bool) isRestricted;
25-
/// @dev protocol fee bps, capped at 300 bps (3%)
26-
uint256 protocolFeeBps;
2725
/// @dev protocol fee recipient address
2826
address protocolFeeRecipient;
2927
/// @dev whether the bridge is paused
@@ -55,7 +53,7 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
5553
uint256 tokenAmount;
5654
address payable forwardAddress;
5755
address payable spenderAddress;
58-
uint256 expirationTimestamp;
56+
uint256 protocolFeeBps;
5957
address payable developerFeeRecipient;
6058
uint256 developerFeeBps;
6159
bytes callData;
@@ -76,10 +74,10 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
7674
bytes32 indexed transactionId,
7775
address tokenAddress,
7876
uint256 tokenAmount,
77+
uint256 protocolFee,
7978
address developerFeeRecipient,
8079
uint256 developerFeeBps,
8180
uint256 developerFee,
82-
uint256 protocolFee,
8381
bytes extraData
8482
);
8583

@@ -96,22 +94,16 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
9694
error UniversalBridgePaused(); // 0x46ecd2c9
9795
error UniversalBridgeRestrictedAddress(); // 0xec7d39b3
9896
error UniversalBridgeVerificationFailed(); // 0x1573f645
99-
error UniversalBridgeRequestExpired(uint256 expirationTimestamp); // 0xb4ebecd8
10097
error UniversalBridgeTransactionAlreadyProcessed(); // 0x7d21ae4b
10198

10299
constructor() {
103100
_disableInitializers();
104101
}
105102

106-
function initialize(
107-
address _owner,
108-
address _operator,
109-
address payable _protocolFeeRecipient,
110-
uint256 _protocolFeeBps
111-
) external initializer {
103+
function initialize(address _owner, address _operator, address payable _protocolFeeRecipient) external initializer {
112104
_initializeOwner(_owner);
113105
_grantRoles(_operator, _OPERATOR_ROLE);
114-
_setProtocolFeeInfo(_protocolFeeRecipient, _protocolFeeBps);
106+
_setProtocolFeeInfo(_protocolFeeRecipient);
115107
}
116108

117109
/*///////////////////////////////////////////////////////////////
@@ -136,8 +128,8 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
136128
}
137129
}
138130

139-
function setProtocolFeeInfo(address payable feeRecipient, uint256 feeBps) external onlyOwner {
140-
_setProtocolFeeInfo(feeRecipient, feeBps);
131+
function setProtocolFeeInfo(address payable feeRecipient) external onlyOwner {
132+
_setProtocolFeeInfo(feeRecipient);
141133
}
142134

143135
function pause(bool _pause) external onlyOwner {
@@ -148,9 +140,8 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
148140
_universalBridgeStorage().isRestricted[_target] = _restrict;
149141
}
150142

151-
function getProtocolFeeInfo() external view returns (address feeRecipient, uint256 feeBps) {
143+
function getProtocolFeeInfo() external view returns (address feeRecipient) {
152144
feeRecipient = _universalBridgeStorage().protocolFeeRecipient;
153-
feeBps = _universalBridgeStorage().protocolFeeBps;
154145
}
155146

156147
function isPaused() external view returns (bool) {
@@ -188,6 +179,10 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
188179
revert UniversalBridgeRestrictedAddress();
189180
}
190181

182+
if (req.protocolFeeBps > MAX_PROTOCOL_FEE_BPS) {
183+
revert UniversalBridgeInvalidFeeBps();
184+
}
185+
191186
// verify amount
192187
if (req.tokenAmount == 0) {
193188
revert UniversalBridgeInvalidAmount(req.tokenAmount);
@@ -200,7 +195,8 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
200195
req.tokenAddress,
201196
req.tokenAmount,
202197
req.developerFeeRecipient,
203-
req.developerFeeBps
198+
req.developerFeeBps,
199+
req.protocolFeeBps
204200
);
205201

206202
if (_isNativeToken(req.tokenAddress)) {
@@ -251,10 +247,10 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
251247
req.transactionId,
252248
req.tokenAddress,
253249
req.tokenAmount,
250+
protocolFee,
254251
req.developerFeeRecipient,
255252
req.developerFeeBps,
256253
developerFee,
257-
protocolFee,
258254
req.extraData
259255
);
260256
}
@@ -282,10 +278,6 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
282278
TransactionRequest calldata req,
283279
bytes calldata signature
284280
) private view returns (bool) {
285-
if (req.expirationTimestamp < block.timestamp) {
286-
revert UniversalBridgeRequestExpired(req.expirationTimestamp);
287-
}
288-
289281
bool processed = _universalBridgeStorage().processed[req.transactionId];
290282

291283
if (processed) {
@@ -300,7 +292,7 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
300292
req.tokenAmount,
301293
req.forwardAddress,
302294
req.spenderAddress,
303-
req.expirationTimestamp,
295+
req.protocolFeeBps,
304296
req.developerFeeRecipient,
305297
req.developerFeeBps,
306298
keccak256(req.callData),
@@ -319,10 +311,10 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
319311
address tokenAddress,
320312
uint256 tokenAmount,
321313
address developerFeeRecipient,
322-
uint256 developerFeeBps
314+
uint256 developerFeeBps,
315+
uint256 protocolFeeBps
323316
) private returns (uint256, uint256) {
324317
address protocolFeeRecipient = _universalBridgeStorage().protocolFeeRecipient;
325-
uint256 protocolFeeBps = _universalBridgeStorage().protocolFeeBps;
326318

327319
uint256 protocolFee = (tokenAmount * protocolFeeBps) / 10_000;
328320
uint256 developerFee = (tokenAmount * developerFeeBps) / 10_000;
@@ -353,17 +345,12 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
353345
version = "1";
354346
}
355347

356-
function _setProtocolFeeInfo(address payable feeRecipient, uint256 feeBps) internal {
348+
function _setProtocolFeeInfo(address payable feeRecipient) internal {
357349
if (feeRecipient == address(0)) {
358350
revert UniversalBridgeZeroAddress();
359351
}
360352

361-
if (feeBps > MAX_PROTOCOL_FEE_BPS) {
362-
revert UniversalBridgeInvalidFeeBps();
363-
}
364-
365353
_universalBridgeStorage().protocolFeeRecipient = feeRecipient;
366-
_universalBridgeStorage().protocolFeeBps = feeBps;
367354
}
368355

369356
function _isNativeToken(address tokenAddress) private pure returns (bool) {
@@ -372,7 +359,7 @@ contract UniversalBridgeV1 is EIP712, Initializable, UUPSUpgradeable, OwnableRol
372359

373360
function _authorizeUpgrade(address) internal override onlyOwner {}
374361

375-
function _universalBridgeStorage() internal view returns (UniversalBridgeStorage.Data storage) {
362+
function _universalBridgeStorage() internal pure returns (UniversalBridgeStorage.Data storage) {
376363
return UniversalBridgeStorage.data();
377364
}
378365
}

0 commit comments

Comments
 (0)