Comment on page
🛠
Modifications (개선점)
Summaries of the changes implemented in the fork.
We don't have a korean translation for this page yet. Sorry!
이 페이지에 대한 한국어 번역이 아직 준비되지 않았습니다.
In the interest of transparency, we would like to outline the modifications made in the fork:
The
IKIP7Receiver
interface introduces the onKIP7Received
function, which handles the receipt of KIP-7 tokens. KIP-7 smart contracts call this function on the recipient after a safeTransfer
. Returning any value other than the magic value(0x9d188c22
) will result in the transaction being reverted.interface IKIP7Receiver {
function onKIP7Received(
address _operator,
address _from,
uint256 _amount,
bytes memory _data
) external returns (bytes4);
}
Tonic Instances(
ETHTonic
and ERC20Tonic
), implements the onKIP7Received
function as follows:function onKIP7Received(
address _operator,
address _from,
uint256 _amount,
bytes memory _data
) external pure returns (bytes4) {
return 0x9d188c22;
}
The fork incorporates the
Ownable
functionality, allowing the owner
of the contract to withdraw unrelated tokens, such as tokens received through airdrops (this is why we implemented IKIP7Receiver
for ETHTonic
as well).This feature provides more control and flexibility for the contract owner in managing unexpected token transfers to the contract.
// ETHTonic (Tonic Instance for Native Tokens)
...
// Only contract-based tokens, just in case for airdrops!
receive() external payable {}
function transfer(address _recipient, address _token, uint256 _amount) external onlyOwner {
IToken token = IToken(_token);
token.transfer(_recipient, _amount);
}
// ERC20Tonic (Tonic instance of ERC20/KIP7)
...
// Only 1) native token and 2) contract-based tokens that is not deposit token, just in case for airdrops!
receive() external payable {}
function transfer(address _recipient, uint256 _amount) external onlyOwner {
payable(_recipient).transfer(_amount);
}
function transfer(address _recipient, address _tokenAddr, uint256 _amount) external onlyOwner {
require(_tokenAddr != address(token), "token address should not be the same as deposit token");
IToken transferableToken = IToken(_tokenAddr);
transferableToken.transfer(_recipient, _amount);
}
The fork introduces two new state variables,
numberOfDeposits
and numberOfWithdrawals
, to maintain statistics on the number of deposits and withdrawals. This allows users to access these statistics through the frontend app using multicall.// values to keep track of stats
uint256 public numberOfDeposits;
uint256 public numberOfWithdrawals;
Tonic employs the newly-added
TonicFeePolicyManager
contract to manage withdrawal fee policies. You can view the code here. Our contracts have the feePolicyManager
state (which is set by the initial constructor
and cannot be changed afterward) and include three internal view functions: _feeNumerator()
, _feeDenominator()
, and _treasury()
. These functions return the fee numerator, fee denominator, and treasury address, respectively, querying the TonicFeePolicyManager
with each call.In the
_processWithdraw
function within the Tonic instances, the treasuryFee
is calculated, and the recipientAmount
is determined by subtracting the treasuryFee
and _relayerFee
from the denomination.// Tonic instances
uint256 treasuryFee = (denomination * _feeNumerator()) / _feeDenominator();
uint256 recipientAmount = denomination - treasuryFee - _relayerFee;
For
ETHTonic
(Tonic Instance for Native Tokens), the treasuryFee
is transferred to the treasury address.// ETHTonic (Tonic Instance for Native Tokens)
if (treasuryFee > 0) {
(bool feeSuccess, ) = _treasury().call{ value: treasuryFee }("");
require(feeSuccess, "payment to treasury did not go thru");
}
For
ERC20Tonic
(Tonic instance of ERC20/KIP7), the treasuryFee
is safely transferred to the treasury address using the safeTransfer
function.// ERC20Tonic (Tonic instance of ERC20/KIP7)
if (treasuryFee > 0) {
token.safeTransfer(_treasury(), treasuryFee);
}
Last modified 7mo ago