Skip to content

Commit

Permalink
Merge pull request #17 from nutsfinance/draft_V1.5
Browse files Browse the repository at this point in the history
v1.5
  • Loading branch information
ukby1234 authored Nov 27, 2023
2 parents d277e2e + 9858361 commit 6681e40
Show file tree
Hide file tree
Showing 83 changed files with 22,816 additions and 8,386 deletions.
1,074 changes: 403 additions & 671 deletions .openzeppelin/goerli.json

Large diffs are not rendered by default.

403 changes: 286 additions & 117 deletions README.md

Large diffs are not rendered by default.

Binary file added Tapio_1_5_Model.pdf
Binary file not shown.
2,418 changes: 1,211 additions & 1,207 deletions contracts/StableAsset.sol

Large diffs are not rendered by default.

98 changes: 77 additions & 21 deletions contracts/StableAssetApplication.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
pragma solidity ^0.8.18;

import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";
Expand All @@ -8,8 +8,13 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeab
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol";
import "./interfaces/IWETH.sol";
import "./interfaces/Ipool.sol";
import "./StableAsset.sol";

error NotAllowedPool(address pool);
error EthAmount(uint256 requiredAmount, uint256 sentAmount);
error FailedEtherTransfer();

/**
* @title StableAsset Application
* @author Nuts Finance Developer
Expand All @@ -36,6 +41,8 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
*/
mapping(address => bool) public allowedPoolAddress;

address[] public pools;

/**
* @dev Pending governance address,
*/
Expand Down Expand Up @@ -90,10 +97,14 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
uint256 _minMintAmount
) external payable nonReentrant {
address[] memory tokens = _swap.getTokens();
address poolToken = _swap.poolToken();
address poolToken = address(_swap.poolToken());
uint256 wETHIndex = findTokenIndex(tokens, address(wETH));
require(_amounts[wETHIndex] == msg.value, "msg.value equals amounts");
require(allowedPoolAddress[address(_swap)], "pool not allowed");
if (_amounts[wETHIndex] != msg.value) {
revert EthAmount(_amounts[wETHIndex], msg.value);
}
if (!allowedPoolAddress[address(_swap)]) {
revert NotAllowedPool(address(_swap));
}

if (_amounts[wETHIndex] > 0) {
wETH.deposit{value: _amounts[wETHIndex]}();
Expand Down Expand Up @@ -129,13 +140,20 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
) external payable nonReentrant {
address[] memory tokens = _swap.getTokens();
uint256 wETHIndex = findTokenIndex(tokens, address(wETH));
require(allowedPoolAddress[address(_swap)], "pool not allowed");
if (!allowedPoolAddress[address(_swap)]) {
revert NotAllowedPool(address(_swap));
}

if (_i == wETHIndex) {
require(_dx == msg.value, "msg.value equals amounts");
if (_dx != msg.value) {
revert EthAmount(_dx, msg.value);
}

wETH.deposit{value: _dx}();
} else {
require(0 == msg.value, "msg.value equals 0");
if (msg.value != 0) {
revert EthAmount(0, msg.value);
}
IERC20Upgradeable(tokens[_i]).safeTransferFrom(
msg.sender,
address(this),
Expand All @@ -148,7 +166,9 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
if (_j == wETHIndex) {
wETH.withdraw(swapAmount);
(bool success, ) = msg.sender.call{value: swapAmount}("");
require(success, "Transfer failed.");
if (!success) {
revert FailedEtherTransfer();
}
} else {
IERC20Upgradeable(tokens[_j]).safeTransfer(msg.sender, swapAmount);
}
Expand All @@ -166,10 +186,11 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
uint256[] calldata _minRedeemAmounts
) external nonReentrant {
address[] memory tokens = _swap.getTokens();
address poolToken = _swap.poolToken();
address poolToken = address(_swap.poolToken());
uint256 wETHIndex = findTokenIndex(tokens, address(wETH));
require(allowedPoolAddress[address(_swap)], "pool not allowed");

if (!allowedPoolAddress[address(_swap)]) {
revert NotAllowedPool(address(_swap));
}
IERC20Upgradeable(poolToken).safeApprove(address(_swap), _amount);
IERC20Upgradeable(poolToken).safeTransferFrom(
msg.sender,
Expand All @@ -186,7 +207,9 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
if (i == wETHIndex) {
wETH.withdraw(amounts[i]);
(bool success, ) = msg.sender.call{value: amounts[i]}("");
require(success, "Transfer failed.");
if (!success) {
revert FailedEtherTransfer();
}
} else {
IERC20Upgradeable(tokens[i]).safeTransfer(msg.sender, amounts[i]);
}
Expand All @@ -207,9 +230,11 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
uint256 _minRedeemAmount
) external nonReentrant {
address[] memory tokens = _swap.getTokens();
address poolToken = _swap.poolToken();
address poolToken = address(_swap.poolToken());
uint256 wETHIndex = findTokenIndex(tokens, address(wETH));
require(allowedPoolAddress[address(_swap)], "pool not allowed");
if (!allowedPoolAddress[address(_swap)]) {
revert NotAllowedPool(address(_swap));
}
IERC20Upgradeable(poolToken).safeApprove(address(_swap), _amount);
IERC20Upgradeable(poolToken).safeTransferFrom(
msg.sender,
Expand All @@ -222,7 +247,9 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
if (_i == wETHIndex) {
wETH.withdraw(redeemAmount);
(bool success, ) = msg.sender.call{value: redeemAmount}("");
require(success, "Transfer failed.");
if (!success) {
revert FailedEtherTransfer();
}
} else {
IERC20Upgradeable(tokens[_i]).safeTransfer(msg.sender, redeemAmount);
}
Expand All @@ -247,13 +274,19 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
) public view returns (uint256, uint256) {
address[] memory sourceTokens = _sourceSwap.getTokens();
address[] memory destTokens = _destSwap.getTokens();
require(allowedPoolAddress[address(_sourceSwap)], "pool not allowed");
require(allowedPoolAddress[address(_destSwap)], "pool not allowed");
if (!allowedPoolAddress[address(_sourceSwap)]) {
revert NotAllowedPool(address(_sourceSwap));
}
if (!allowedPoolAddress[address(_destSwap)]) {
revert NotAllowedPool(address(_destSwap));
}
uint256 sourceIndex = findTokenIndex(sourceTokens, _sourceToken);
uint256 destIndex = findTokenIndex(destTokens, _destToken);
uint256[] memory _mintAmounts = new uint256[](sourceTokens.length);
_mintAmounts[sourceIndex] = _amount;
(uint256 mintAmount, uint256 mintFee) = _sourceSwap.getMintAmount(_mintAmounts);
(uint256 mintAmount, uint256 mintFee) = _sourceSwap.getMintAmount(
_mintAmounts
);
(uint256 redeemAmount, uint256 redeemFee) = _destSwap.getRedeemSingleAmount(
mintAmount,
destIndex
Expand All @@ -280,8 +313,14 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
) external nonReentrant {
address[] memory sourceTokens = _sourceSwap.getTokens();
address[] memory destTokens = _destSwap.getTokens();
require(allowedPoolAddress[address(_sourceSwap)], "pool not allowed");
require(allowedPoolAddress[address(_destSwap)], "pool not allowed");
if (!allowedPoolAddress[address(_sourceSwap)]) {
revert NotAllowedPool(address(_sourceSwap));
}

if (!allowedPoolAddress[address(_destSwap)]) {
revert NotAllowedPool(address(_destSwap));
}

uint256 sourceIndex = findTokenIndex(sourceTokens, _sourceToken);
uint256 destIndex = findTokenIndex(destTokens, _destToken);

Expand All @@ -295,7 +334,7 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
uint256[] memory _mintAmounts = new uint256[](sourceTokens.length);
_mintAmounts[sourceIndex] = _amount;
uint256 mintAmount = _sourceSwap.mint(_mintAmounts, 0);
IERC20Upgradeable(_destSwap.poolToken()).safeApprove(
IERC20Upgradeable(address(_destSwap.poolToken())).safeApprove(
address(_destSwap),
mintAmount
);
Expand Down Expand Up @@ -353,7 +392,24 @@ contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable {
*/
function updatePool(address _swap, bool _enabled) external {
require(msg.sender == governance, "not governance");
if (_enabled && !allowedPoolAddress[_swap]) {
pools.push(_swap);
}
allowedPoolAddress[_swap] = _enabled;

emit PoolModified(_swap, _enabled);
}

/**
* @notice This function allows to rebase TapETH by increasing his total supply
* from all stableSwap pools by the staking rewards and the swap fee.
*/
function rebase() external returns (uint256 _amount) {
for (uint256 i = 0; i < pools.length; i++) {
address _pool = pools[i];
if (allowedPoolAddress[_pool]) {
_amount += Ipool(_pool).rebase();
}
}
}
}
122 changes: 0 additions & 122 deletions contracts/StableAssetToken.sol

This file was deleted.

Loading

0 comments on commit 6681e40

Please sign in to comment.