From 0a5595ab5509166991e5eb9ccd92de6bbef5a7e0 Mon Sep 17 00:00:00 2001 From: owen05 Date: Fri, 30 Apr 2021 12:00:32 +0800 Subject: [PATCH] remove logic of feeDistributor --- .../Factory/Registries/DODONFTRegistry.sol | 27 +- .../GeneralizedFragment/intf/IFragment.sol | 2 + contracts/SmartRoute/proxies/DODONFTProxy.sol | 81 ++---- test/DODONFT/nftMainFlow.test.ts | 260 +++++++++--------- test/utils/NFTContext.ts | 20 +- 5 files changed, 166 insertions(+), 224 deletions(-) diff --git a/contracts/Factory/Registries/DODONFTRegistry.sol b/contracts/Factory/Registries/DODONFTRegistry.sol index b9b36fb..6f24941 100644 --- a/contracts/Factory/Registries/DODONFTRegistry.sol +++ b/contracts/Factory/Registries/DODONFTRegistry.sol @@ -10,15 +10,17 @@ pragma experimental ABIEncoderV2; import {InitializableOwnable} from "../../lib/InitializableOwnable.sol"; import {IDVM} from "../../DODOVendingMachine/intf/IDVM.sol"; +import {IFragment} from "../../GeneralizedFragment/intf/IFragment.sol"; interface IDODONFTRegistry { function addRegistry( address vault, address fragment, address quoteToken, - address feeDistributor, address dvm ) external; + + function removeRegistry(address fragment) external; } /** @@ -32,11 +34,6 @@ contract DODONFTRegistry is InitializableOwnable, IDODONFTRegistry { mapping (address => bool) public isAdminListed; // ============ Registry ============ - - // Frag -> FeeDistributor - mapping(address => address) public _FRAG_FEE_REGISTRY_; - // DVM -> FeeDistributor - mapping(address => address) public _DVM_FEE_REGISTRY_; // Vault -> Frag mapping(address => address) public _VAULT_FRAG_REGISTRY_; @@ -48,7 +45,6 @@ contract DODONFTRegistry is InitializableOwnable, IDODONFTRegistry { event NewRegistry( address vault, address fragment, - address feeDistributor, address dvm ); @@ -61,24 +57,19 @@ contract DODONFTRegistry is InitializableOwnable, IDODONFTRegistry { address vault, address fragment, address quoteToken, - address feeDistributor, address dvm ) override external { require(isAdminListed[msg.sender], "ACCESS_DENIED"); - _FRAG_FEE_REGISTRY_[fragment] = feeDistributor; - _DVM_FEE_REGISTRY_[dvm] = feeDistributor; _VAULT_FRAG_REGISTRY_[vault] = fragment; _REGISTRY_[fragment][quoteToken].push(dvm); - emit NewRegistry(vault, fragment, feeDistributor, dvm); + emit NewRegistry(vault, fragment, dvm); } - function removeRegistry( - address vault, - address fragment, - address dvm - ) external onlyOwner { - _FRAG_FEE_REGISTRY_[fragment] = address(0); - _DVM_FEE_REGISTRY_[dvm] = address(0); + function removeRegistry(address fragment) override external { + require(isAdminListed[msg.sender], "ACCESS_DENIED"); + address vault = IFragment(fragment)._COLLATERAL_VAULT_(); + address dvm = IFragment(fragment)._DVM_(); + _VAULT_FRAG_REGISTRY_[vault] = address(0); address quoteToken = IDVM(dvm)._QUOTE_TOKEN_(); diff --git a/contracts/GeneralizedFragment/intf/IFragment.sol b/contracts/GeneralizedFragment/intf/IFragment.sol index ba7bc06..638d75d 100644 --- a/contracts/GeneralizedFragment/intf/IFragment.sol +++ b/contracts/GeneralizedFragment/intf/IFragment.sol @@ -27,6 +27,8 @@ interface IFragment { function _QUOTE_() external view returns (address); + function _COLLATERAL_VAULT_() external view returns (address); + function _DVM_() external view returns (address); function totalSupply() external view returns (uint256); diff --git a/contracts/SmartRoute/proxies/DODONFTProxy.sol b/contracts/SmartRoute/proxies/DODONFTProxy.sol index 1fb03e3..b2759f6 100644 --- a/contracts/SmartRoute/proxies/DODONFTProxy.sol +++ b/contracts/SmartRoute/proxies/DODONFTProxy.sol @@ -14,9 +14,7 @@ import {IWETH} from "../../intf/IWETH.sol"; import {InitializableOwnable} from "../../lib/InitializableOwnable.sol"; import {ICollateralVault} from "../../CollateralVault/intf/ICollateralVault.sol"; import {IDVM} from "../../DODOVendingMachine/intf/IDVM.sol"; -import {IConstFeeRateModel} from "../../lib/ConstFeeRateModel.sol"; import {IFragment} from "../../GeneralizedFragment/intf/IFragment.sol"; -import {IFeeDistributor} from "../../intf/IFeeDistributor.sol"; import {IDODONFTRegistry} from "../../Factory/Registries/DODONFTRegistry.sol"; import {SafeMath} from "../../lib/SafeMath.sol"; import {SafeERC20} from "../../lib/SafeERC20.sol"; @@ -42,26 +40,23 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable { address public immutable _CLONE_FACTORY_; address public immutable _NFT_REGISTY_; address public immutable _DEFAULT_MAINTAINER_; - + + address public _MT_FEE_RATE_MODEL_; address public _VAULT_TEMPLATE_; address public _FRAG_TEMPLATE_; - address public _FEE_TEMPLATE_; address public _DVM_TEMPLATE_; - address public _MTFEE_TEMPLATE_; uint256 public _DEFAULT_BUYOUT_FEE_; // ============ Events ============ event ChangeVaultTemplate(address newVaultTemplate); event ChangeFragTemplate(address newFragTemplate); - event ChangeFeeTemplate(address newFeeTemplate); - event ChangeMtFeeTemplate(address newMtFeeTemplate); event ChangeDvmTemplate(address newDvmTemplate); - event CreateNFTCollateralVault(address creator, address vault, string name, string baseURI); - event CreateFragment(address vault, address fragment, address dvm, address feeDistributor); - event Buyout(address from, address fragment, uint256 amount); - event Stake(address from, address feeDistributor, uint256 amount); + event ChangeMtFeeRateTemplate(address newMtFeeRateTemplate); event ChangeBuyoutFee(uint256 newBuyoutFee); + event CreateNFTCollateralVault(address creator, address vault, string name, string baseURI); + event CreateFragment(address vault, address fragment, address dvm); + event Buyout(address from, address fragment, uint256 amount); // ============ Modifiers ============ @@ -79,22 +74,20 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable { address payable weth, address dodoApproveProxy, address defaultMaintainer, + address mtFeeRateModel, address vaultTemplate, address fragTemplate, - address feeTemplate, address dvmTemplate, - address mtFeeTemplate, address nftRegistry ) public { _CLONE_FACTORY_ = cloneFactory; _WETH_ = weth; _DODO_APPROVE_PROXY_ = dodoApproveProxy; _DEFAULT_MAINTAINER_ = defaultMaintainer; + _MT_FEE_RATE_MODEL_ = mtFeeRateModel; _VAULT_TEMPLATE_ = vaultTemplate; _FRAG_TEMPLATE_ = fragTemplate; - _FEE_TEMPLATE_ = feeTemplate; _DVM_TEMPLATE_ = dvmTemplate; - _MTFEE_TEMPLATE_ = mtFeeTemplate; _NFT_REGISTY_ = nftRegistry; } @@ -107,34 +100,26 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable { function createFragment( address quoteToken, address vaultPreOwner, - address stakeToken, //address(0) using frag token - uint256[] calldata dvmParams, //0 - lpFeeRate, 1 - mtFeeRate 2 - I, 3 - K + uint256[] calldata dvmParams, //0 - lpFeeRate, 1 - I, 2 - K uint256[] calldata fragParams, //0 - totalSupply, 1 - ownerRatio, 2 - buyoutTimestamp bool isOpenTwap - ) external returns (address newFragment, address newDvm, address newFeeDistributor) { + ) external returns (address newFragment, address newDvm) { newFragment = ICloneFactory(_CLONE_FACTORY_).clone(_FRAG_TEMPLATE_); address _quoteToken = quoteToken == _ETH_ADDRESS_ ? _WETH_ : quoteToken; - if(stakeToken == address(0)) { - stakeToken = newFragment; - } - - newFeeDistributor = ICloneFactory(_CLONE_FACTORY_).clone(_FEE_TEMPLATE_); - IFeeDistributor(newFeeDistributor).init(newFragment, _quoteToken, stakeToken); - { uint256[] memory _dvmParams = dvmParams; uint256[] memory _fragParams = fragParams; newDvm = ICloneFactory(_CLONE_FACTORY_).clone(_DVM_TEMPLATE_); IDVM(newDvm).init( - newFeeDistributor == address(0) ? _DEFAULT_MAINTAINER_ : newFeeDistributor, + _DEFAULT_MAINTAINER_, newFragment, _quoteToken, _dvmParams[0], - _createConstantMtFeeRateModel(_dvmParams[1]), + _MT_FEE_RATE_MODEL_, + _dvmParams[1], _dvmParams[2], - _dvmParams[3], isOpenTwap ); IFragment(newFragment).init( @@ -151,9 +136,9 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable { ICollateralVault(msg.sender).directTransferOwnership(newFragment); - IDODONFTRegistry(_NFT_REGISTY_).addRegistry(msg.sender, newFragment, _quoteToken, newFeeDistributor, newDvm); + IDODONFTRegistry(_NFT_REGISTY_).addRegistry(msg.sender, newFragment, _quoteToken, newDvm); - emit CreateFragment(msg.sender, newFragment, newDvm, newFeeDistributor); + emit CreateFragment(msg.sender, newFragment, newDvm); } function buyout( @@ -176,29 +161,14 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable { _deposit(msg.sender, fragment, IFragment(fragment)._QUOTE_(), curRequireQuote, flag == 1); IFragment(fragment).buyout(msg.sender); + IDODONFTRegistry(_NFT_REGISTY_).removeRegistry(fragment); + // refund dust eth if (flag == 1 && msg.value > curRequireQuote) msg.sender.transfer(msg.value - curRequireQuote); emit Buyout(msg.sender, fragment, curRequireQuote); } - function stakeToFeeDistributor( - address feeDistributor, - uint256 stakeAmount, - uint8 flag // 0 - ERC20, 1 - ETH - ) external payable preventReentrant { - if(flag == 1) - require(msg.value == stakeAmount, "DODONFTProxy: VALUE_INVALID"); - else - require(msg.value == 0, "DODONFTProxy: WE_SAVED_YOUR_MONEY"); - - address stakeVault = IFeeDistributor(feeDistributor)._STAKE_VAULT_(); - require(stakeVault != address(0), "DODONFTProxy:STAKE_VAULT_EMPTY"); - _deposit(msg.sender, stakeVault, IFeeDistributor(feeDistributor)._STAKE_TOKEN_(), stakeAmount, flag == 1); - IFeeDistributor(feeDistributor).stake(msg.sender); - emit Stake(msg.sender, feeDistributor, stakeAmount); - } - //============= Owner =================== function updateVaultTemplate(address newVaultTemplate) external onlyOwner { _VAULT_TEMPLATE_ = newVaultTemplate; @@ -210,14 +180,9 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable { emit ChangeFragTemplate(newFragTemplate); } - function updateFeeTemplate(address newFeeTemplate) external onlyOwner { - _FEE_TEMPLATE_ = newFeeTemplate; - emit ChangeFeeTemplate(newFeeTemplate); - } - - function updateMtFeeTemplate(address newMtFeeTemplate) external onlyOwner { - _MTFEE_TEMPLATE_ = newMtFeeTemplate; - emit ChangeMtFeeTemplate(newMtFeeTemplate); + function updateMtFeeRateTemplate(address newMtFeeRateTemplate) external onlyOwner { + _MT_FEE_RATE_MODEL_ = newMtFeeRateTemplate; + emit ChangeMtFeeRateTemplate(newMtFeeRateTemplate); } function updateDvmTemplate(address newDvmTemplate) external onlyOwner { @@ -233,12 +198,6 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable { //============= Internal ================ - function _createConstantMtFeeRateModel(uint256 mtFee) internal returns (address mtFeeModel) { - mtFeeModel = ICloneFactory(_CLONE_FACTORY_).clone(_MTFEE_TEMPLATE_); - IConstFeeRateModel(mtFeeModel).init(mtFee); - } - - function _deposit( address from, address to, diff --git a/test/DODONFT/nftMainFlow.test.ts b/test/DODONFT/nftMainFlow.test.ts index 6c3c30e..a713db6 100644 --- a/test/DODONFT/nftMainFlow.test.ts +++ b/test/DODONFT/nftMainFlow.test.ts @@ -31,53 +31,53 @@ async function init(ctx: NFTContext): Promise { await ctx.approveProxy(ctx.USDT, buyer); } -async function getFeeGlobalState(ctx: NFTContext, feeAddress: string, baseToken, quoteToken, stakeToken) { - let feeInstance = contracts.getContractWithAddress(contracts.NFT_FEE, feeAddress); - let baseReserve = await feeInstance.methods._BASE_RESERVE_().call(); - let quoteReserve = await feeInstance.methods._QUOTE_RESERVE_().call(); - let baseBalance = await baseToken.methods.balanceOf(feeAddress).call(); - let quoteBalance = await quoteToken.methods.balanceOf(feeAddress).call(); - let stakeVault = await feeInstance.methods._STAKE_VAULT_().call(); - let stakeBalance = await stakeToken.methods.balanceOf(stakeVault).call(); - let stakeReserve = await feeInstance.methods._STAKE_RESERVE_().call(); - let baseRatio = await feeInstance.methods._BASE_REWARD_RATIO_().call(); - let quoteRatio = await feeInstance.methods._QUOTE_REWARD_RATIO_().call(); +// async function getFeeGlobalState(ctx: NFTContext, feeAddress: string, baseToken, quoteToken, stakeToken) { +// let feeInstance = contracts.getContractWithAddress(contracts.NFT_FEE, feeAddress); +// let baseReserve = await feeInstance.methods._BASE_RESERVE_().call(); +// let quoteReserve = await feeInstance.methods._QUOTE_RESERVE_().call(); +// let baseBalance = await baseToken.methods.balanceOf(feeAddress).call(); +// let quoteBalance = await quoteToken.methods.balanceOf(feeAddress).call(); +// let stakeVault = await feeInstance.methods._STAKE_VAULT_().call(); +// let stakeBalance = await stakeToken.methods.balanceOf(stakeVault).call(); +// let stakeReserve = await feeInstance.methods._STAKE_RESERVE_().call(); +// let baseRatio = await feeInstance.methods._BASE_REWARD_RATIO_().call(); +// let quoteRatio = await feeInstance.methods._QUOTE_REWARD_RATIO_().call(); - console.log("fee baseBalance:" + fromWei(baseBalance, 'ether') + " quoteBalance:" + fromWei(quoteBalance, 'mwei') + " vault stakeBalance:" + fromWei(stakeBalance, 'ether')); - console.log("fee baseReserve:" + fromWei(baseReserve, 'ether') + " quoteReserve:" + fromWei(quoteReserve, 'mwei') + " stakeReserve:" + fromWei(stakeReserve, 'ether')); - console.log("baseRatio:" + fromWei(baseRatio, 'ether') + " quoteRatio:" + fromWei(quoteRatio, 'mwei')); +// console.log("fee baseBalance:" + fromWei(baseBalance, 'ether') + " quoteBalance:" + fromWei(quoteBalance, 'mwei') + " vault stakeBalance:" + fromWei(stakeBalance, 'ether')); +// console.log("fee baseReserve:" + fromWei(baseReserve, 'ether') + " quoteReserve:" + fromWei(quoteReserve, 'mwei') + " stakeReserve:" + fromWei(stakeReserve, 'ether')); +// console.log("baseRatio:" + fromWei(baseRatio, 'ether') + " quoteRatio:" + fromWei(quoteRatio, 'mwei')); - return { - "baseReserve": baseReserve, - "quoteReserve": quoteReserve, - "stakeReserve": stakeReserve, - "baseBalance": baseBalance, - "quoteBalance": quoteBalance, - "stakeBalance": stakeBalance, - "baseRatio": baseRatio, - "quoteRatio": quoteRatio - } -} +// return { +// "baseReserve": baseReserve, +// "quoteReserve": quoteReserve, +// "stakeReserve": stakeReserve, +// "baseBalance": baseBalance, +// "quoteBalance": quoteBalance, +// "stakeBalance": stakeBalance, +// "baseRatio": baseRatio, +// "quoteRatio": quoteRatio +// } +// } -async function getFeeUserState(ctx: NFTContext, feeAddress: string, userAddress: string) { - let feeInstance = contracts.getContractWithAddress(contracts.NFT_FEE, feeAddress); - let userShares = await feeInstance.methods._SHARES_(userAddress).call(); - let [baseRewards, quoteRewards] = await feeInstance.methods.getPendingReward(userAddress).call(); - let userBasePerShares = await feeInstance.methods._USER_BASE_PER_SHARE_(userAddress).call(); - let userQuotePerShares = await feeInstance.methods._USER_QUOTE_PER_SHARE_(userAddress).call(); +// async function getFeeUserState(ctx: NFTContext, feeAddress: string, userAddress: string) { +// let feeInstance = contracts.getContractWithAddress(contracts.NFT_FEE, feeAddress); +// let userShares = await feeInstance.methods._SHARES_(userAddress).call(); +// let [baseRewards, quoteRewards] = await feeInstance.methods.getPendingReward(userAddress).call(); +// let userBasePerShares = await feeInstance.methods._USER_BASE_PER_SHARE_(userAddress).call(); +// let userQuotePerShares = await feeInstance.methods._USER_QUOTE_PER_SHARE_(userAddress).call(); - console.log("user shares:" + fromWei(userShares, 'ether')); - console.log("user baseRewards:" + fromWei(baseRewards, 'ether') + " userQuoteRewards:" + fromWei(quoteRewards, 'mwei')); - console.log("user basePerShares:" + fromWei(userBasePerShares, 'ether') + " userQuotePerShares:" + fromWei(userQuotePerShares, 'mwei')); +// console.log("user shares:" + fromWei(userShares, 'ether')); +// console.log("user baseRewards:" + fromWei(baseRewards, 'ether') + " userQuoteRewards:" + fromWei(quoteRewards, 'mwei')); +// console.log("user basePerShares:" + fromWei(userBasePerShares, 'ether') + " userQuotePerShares:" + fromWei(userQuotePerShares, 'mwei')); - return { - "userShares": userShares, - "userBaseRewards": baseRewards, - "userQuoteRewards": quoteRewards, - "userBasePerShares": userBasePerShares, - "userQuotePerShares": userQuotePerShares - } -} +// return { +// "userShares": userShares, +// "userBaseRewards": baseRewards, +// "userQuoteRewards": quoteRewards, +// "userBasePerShares": userBasePerShares, +// "userQuotePerShares": userQuotePerShares +// } +// } async function mockTrade(ctx: NFTContext, dvmAddress: string, dvmInstance, fragInstance) { await ctx.transferQuoteToDVM(ctx.USDT, dvmAddress, user1, mweiStr("20")); @@ -150,16 +150,13 @@ describe("DODONFT", () => { var erc721Instance = contracts.getContractWithAddress(contracts.ERC721, erc721Address); await erc721Instance.methods.safeTransferFrom(author, vaultAddress, 0).send(ctx.sendParam(author)); - var quoteToken = "0x156595bAF85D5C29E91d959889B022d952190A64"; - var vaultPreOwner = "0x7e83d9d94837eE82F0cc18a691da6f42F03F1d86"; - // var quoteToken = ctx.USDT.options.address; - // var vaultPreOwner = author; - - var stakeToken = "0x0000000000000000000000000000000000000000"; + // var quoteToken = "0x156595bAF85D5C29E91d959889B022d952190A64"; + // var vaultPreOwner = "0x7e83d9d94837eE82F0cc18a691da6f42F03F1d86"; + var quoteToken = ctx.USDT.options.address; + var vaultPreOwner = author; var dvmParams = [ "0", //lpFeeRate - decimalStr("0.01"), //mtFeeRate mweiStr("1"), // I decimalStr("1") // K ]; @@ -173,106 +170,105 @@ describe("DODONFT", () => { var callData = ctx.NFTProxy.methods.createFragment( quoteToken, vaultPreOwner, - stakeToken, dvmParams, fragParams, isOpenTwap ).encodeABI(); console.log("data:", callData); - // await logGas(await nftVaultInstance.methods.createFragment( - // ctx.NFTProxy.options.address, - // callData - // ), ctx.sendParam(author), "createFragment"); + await logGas(await nftVaultInstance.methods.createFragment( + ctx.NFTProxy.options.address, + callData + ), ctx.sendParam(author), "createFragment"); - // let [fragAddress, , dvmAddress] = await ctx.getRegistry(ctx, vaultAddress); + let [fragAddress, , dvmAddress] = await ctx.getRegistry(ctx, vaultAddress); - // var dvmInstance = contracts.getContractWithAddress(contracts.DVM_NAME, dvmAddress); - // var midPrice = await dvmInstance.methods.getMidPrice().call(); - // assert(midPrice, mweiStr("1")); - // let newVaultOwner = await nftVaultInstance.methods._OWNER_().call(); - // assert(fragAddress, newVaultOwner); - }); - - it("stakeToFeeDistributor", async () => { - let [vaultAddress, fragAddress, feeAddress, dvmAddress] = await ctx.createFragment(ctx, author, null, null, null); - - var nftFeeInstance = contracts.getContractWithAddress(contracts.NFT_FEE, feeAddress); var dvmInstance = contracts.getContractWithAddress(contracts.DVM_NAME, dvmAddress); - var fragInstance = contracts.getContractWithAddress(contracts.NFT_FRAG, fragAddress); - await ctx.approveProxy(fragInstance, user1); - await ctx.approveProxy(fragInstance, user2); - //mock trading - //stake - await mockTrade(ctx, dvmAddress, dvmInstance, fragInstance); - - await logGas(await ctx.NFTProxy.methods.stakeToFeeDistributor( - feeAddress, - decimalStr("5"), - 0 - ), ctx.sendParam(user1), "stakeToFeeDistributor"); - - await logGas(await ctx.NFTProxy.methods.stakeToFeeDistributor( - feeAddress, - decimalStr("10"), - 0 - ), ctx.sendParam(user2), "stakeToFeeDistributor"); - - await mockTrade(ctx, dvmAddress, dvmInstance, fragInstance); - - await logGas(await ctx.NFTProxy.methods.stakeToFeeDistributor( - feeAddress, - decimalStr("10"), - 0 - ), ctx.sendParam(user1), "stakeToFeeDistributor"); - - await logGas(await ctx.NFTProxy.methods.stakeToFeeDistributor( - feeAddress, - decimalStr("20"), - 0 - ), ctx.sendParam(user2), "stakeToFeeDistributor"); - - let globalObj = await getFeeGlobalState(ctx, feeAddress, fragInstance, ctx.USDT, fragInstance); - assert(globalObj['quoteBalance'], mweiStr("0.6")); - assert(globalObj['stakeReserve'], decimalStr("45")); - - let user1Obj = await getFeeUserState(ctx, feeAddress, user1); - assert(user1Obj['userQuoteRewards'], mweiStr("0.1")); - assert(user1Obj['userShares'], decimalStr("15")); - let user2Obj = await getFeeUserState(ctx, feeAddress, user2); - assert(user2Obj['userBaseRewards'], decimalStr("0.66666480000453957")); - assert(user2Obj['userShares'], decimalStr("30")); - - //claim - var user1BaseBalanceStart = await fragInstance.methods.balanceOf(user1).call() - await logGas(await nftFeeInstance.methods.claim(user1), ctx.sendParam(user1), "claim"); - var user1BaseBalanceEnd = await fragInstance.methods.balanceOf(user1).call() - user1Obj = await getFeeUserState(ctx, feeAddress, user1); - await getFeeGlobalState(ctx, feeAddress, fragInstance, ctx.USDT, fragInstance); - assert(user1Obj['userQuoteRewards'], "0"); - assert(globalObj['quoteBalance'], mweiStr("0.5")); - assert(user1BaseBalanceEnd - user1BaseBalanceStart, "333332400002269700"); - - //unstake - var user2BaseBalanceStart = await fragInstance.methods.balanceOf(user2).call() - await logGas(await nftFeeInstance.methods.unstake(decimalStr("30"), user2, true), ctx.sendParam(user2), "unstake"); - var user2BaseBalanceEnd = await fragInstance.methods.balanceOf(user2).call() - user2Obj = await getFeeUserState(ctx, feeAddress, user2); - await getFeeGlobalState(ctx, feeAddress, fragInstance, ctx.USDT, fragInstance); - assert(user2Obj['userQuoteRewards'], "0"); - assert(globalObj['quoteBalance'], mweiStr("0.3")); - assert(globalObj['stakeReserve'], mweiStr("15")); - assert(globalObj['stakeBalance'], mweiStr("15")); - assert(user2BaseBalanceEnd - user2BaseBalanceStart, "30666664800004540000"); + var midPrice = await dvmInstance.methods.getMidPrice().call(); + assert(midPrice, mweiStr("1")); + let newVaultOwner = await nftVaultInstance.methods._OWNER_().call(); + assert(fragAddress, newVaultOwner); }); + // it("stakeToFeeDistributor", async () => { + // let [vaultAddress, fragAddress, feeAddress, dvmAddress] = await ctx.createFragment(ctx, author, null, null, null); + + // var nftFeeInstance = contracts.getContractWithAddress(contracts.NFT_FEE, feeAddress); + // var dvmInstance = contracts.getContractWithAddress(contracts.DVM_NAME, dvmAddress); + // var fragInstance = contracts.getContractWithAddress(contracts.NFT_FRAG, fragAddress); + // await ctx.approveProxy(fragInstance, user1); + // await ctx.approveProxy(fragInstance, user2); + // //mock trading + // //stake + // await mockTrade(ctx, dvmAddress, dvmInstance, fragInstance); + + // await logGas(await ctx.NFTProxy.methods.stakeToFeeDistributor( + // feeAddress, + // decimalStr("5"), + // 0 + // ), ctx.sendParam(user1), "stakeToFeeDistributor"); + + // await logGas(await ctx.NFTProxy.methods.stakeToFeeDistributor( + // feeAddress, + // decimalStr("10"), + // 0 + // ), ctx.sendParam(user2), "stakeToFeeDistributor"); + + // await mockTrade(ctx, dvmAddress, dvmInstance, fragInstance); + + // await logGas(await ctx.NFTProxy.methods.stakeToFeeDistributor( + // feeAddress, + // decimalStr("10"), + // 0 + // ), ctx.sendParam(user1), "stakeToFeeDistributor"); + + // await logGas(await ctx.NFTProxy.methods.stakeToFeeDistributor( + // feeAddress, + // decimalStr("20"), + // 0 + // ), ctx.sendParam(user2), "stakeToFeeDistributor"); + + // let globalObj = await getFeeGlobalState(ctx, feeAddress, fragInstance, ctx.USDT, fragInstance); + // assert(globalObj['quoteBalance'], mweiStr("0.6")); + // assert(globalObj['stakeReserve'], decimalStr("45")); + + // let user1Obj = await getFeeUserState(ctx, feeAddress, user1); + // assert(user1Obj['userQuoteRewards'], mweiStr("0.1")); + // assert(user1Obj['userShares'], decimalStr("15")); + // let user2Obj = await getFeeUserState(ctx, feeAddress, user2); + // assert(user2Obj['userBaseRewards'], decimalStr("0.66666480000453957")); + // assert(user2Obj['userShares'], decimalStr("30")); + + // //claim + // var user1BaseBalanceStart = await fragInstance.methods.balanceOf(user1).call() + // await logGas(await nftFeeInstance.methods.claim(user1), ctx.sendParam(user1), "claim"); + // var user1BaseBalanceEnd = await fragInstance.methods.balanceOf(user1).call() + // user1Obj = await getFeeUserState(ctx, feeAddress, user1); + // await getFeeGlobalState(ctx, feeAddress, fragInstance, ctx.USDT, fragInstance); + // assert(user1Obj['userQuoteRewards'], "0"); + // assert(globalObj['quoteBalance'], mweiStr("0.5")); + // assert(user1BaseBalanceEnd - user1BaseBalanceStart, "333332400002269700"); + + // //unstake + // var user2BaseBalanceStart = await fragInstance.methods.balanceOf(user2).call() + // await logGas(await nftFeeInstance.methods.unstake(decimalStr("30"), user2, true), ctx.sendParam(user2), "unstake"); + // var user2BaseBalanceEnd = await fragInstance.methods.balanceOf(user2).call() + // user2Obj = await getFeeUserState(ctx, feeAddress, user2); + // await getFeeGlobalState(ctx, feeAddress, fragInstance, ctx.USDT, fragInstance); + // assert(user2Obj['userQuoteRewards'], "0"); + // assert(globalObj['quoteBalance'], mweiStr("0.3")); + // assert(globalObj['stakeReserve'], mweiStr("15")); + // assert(globalObj['stakeBalance'], mweiStr("15")); + // assert(user2BaseBalanceEnd - user2BaseBalanceStart, "30666664800004540000"); + // }); + it("buyout and redeem", async () => { var fragParams = [ decimalStr("10000"), //totalSupply decimalStr("0.2"), //ownerRatio Math.floor(new Date().getTime() / 1000) //buyoutTimeStamp ] - let [vaultAddress, fragAddress, feeAddress, dvmAddress] = await ctx.createFragment(ctx, author, null, fragParams, null); + let [vaultAddress, fragAddress, , dvmAddress] = await ctx.createFragment(ctx, author, null, fragParams, null); var dvmInstance = contracts.getContractWithAddress(contracts.DVM_NAME, dvmAddress); var fragInstance = contracts.getContractWithAddress(contracts.NFT_FRAG, fragAddress); var vaultInstance = contracts.getContractWithAddress(contracts.NFT_VAULT, vaultAddress); diff --git a/test/utils/NFTContext.ts b/test/utils/NFTContext.ts index a1b6170..f593057 100644 --- a/test/utils/NFTContext.ts +++ b/test/utils/NFTContext.ts @@ -28,11 +28,11 @@ export class NFTContext { NFTRegister: Contract; CollatteralVault: Contract; Fragment: Contract; - NFTFee: Contract; NFTProxy: Contract; DODOApprove: Contract; DODOApproveProxy: Contract; + mtFeeRateModel: Contract; //token USDT: Contract; @@ -69,7 +69,8 @@ export class NFTContext { contracts.CLONE_FACTORY_CONTRACT_NAME ); var dvmTemplate = await contracts.newContract(contracts.DVM_NAME) - var constFeeTemplate = await contracts.newContract(contracts.CONST_FEE_RATE_MODEL_NAME) + var mtFeeRateModelTemplate = await contracts.newContract(contracts.FEE_RATE_MODEL_NAME) + this.mtFeeRateModel = mtFeeRateModelTemplate; var ERC721Template = await contracts.newContract(contracts.ERC721) var ERC1155Template = await contracts.newContract(contracts.ERC1155) @@ -103,19 +104,16 @@ export class NFTContext { this.Fragment = await contracts.newContract(contracts.NFT_FRAG) - this.NFTFee = await contracts.newContract(contracts.NFT_FEE) - this.NFTProxy = await contracts.newContract(contracts.NFT_PROXY, [ cloneFactory.options.address, this.WETH.options.address, this.DODOApproveProxy.options.address, this.Deployer, + this.mtFeeRateModel.options.address, this.CollatteralVault.options.address, this.Fragment.options.address, - this.NFTFee.options.address, dvmTemplate.options.address, - constFeeTemplate.options.address, this.NFTRegister.options.address ] ) @@ -152,10 +150,9 @@ export class NFTContext { async getRegistry(ctx: NFTContext, vaultAddress: string) { let fragAddress = await ctx.NFTRegister.methods._VAULT_FRAG_REGISTRY_(vaultAddress).call(); - let feeDistrubitor = await ctx.NFTRegister.methods._FRAG_FEE_REGISTRY_(fragAddress).call(); let fragInstance = contracts.getContractWithAddress(contracts.NFT_FRAG, fragAddress); let dvmAddress = await fragInstance.methods._DVM_().call(); - return [fragAddress, feeDistrubitor, dvmAddress]; + return [fragAddress, , dvmAddress]; } async createNFTVault(ctx: NFTContext, author: string) { @@ -191,7 +188,6 @@ export class NFTContext { if (dvmParams == null) { dvmParams = [ "0", //lpFeeRate - decimalStr("0.01"), //mtFeeRate mweiStr("1"), // I decimalStr("1") // K ]; @@ -207,13 +203,11 @@ export class NFTContext { addrs = [] addrs.push(ctx.USDT.options.address);//quoteToken addrs.push(author);//vaultPreOwner - addrs.push("0x0000000000000000000000000000000000000000");//stakeToken } var callData = ctx.NFTProxy.methods.createFragment( addrs[0], addrs[1], - addrs[2], dvmParams, fragParams, false @@ -224,8 +218,8 @@ export class NFTContext { callData ).send(ctx.sendParam(author)); - let [fragAddress, feeAddress, dvmAddress] = await this.getRegistry(ctx, vaultAddress); - return [vaultAddress, fragAddress, feeAddress, dvmAddress, callData] + let [fragAddress, , dvmAddress] = await this.getRegistry(ctx, vaultAddress); + return [vaultAddress, fragAddress, , dvmAddress, callData] }