remove logic of feeDistributor

This commit is contained in:
owen05
2021-04-30 12:00:32 +08:00
parent 40db8faa5f
commit 0a5595ab55
5 changed files with 166 additions and 224 deletions

View File

@@ -10,15 +10,17 @@ pragma experimental ABIEncoderV2;
import {InitializableOwnable} from "../../lib/InitializableOwnable.sol"; import {InitializableOwnable} from "../../lib/InitializableOwnable.sol";
import {IDVM} from "../../DODOVendingMachine/intf/IDVM.sol"; import {IDVM} from "../../DODOVendingMachine/intf/IDVM.sol";
import {IFragment} from "../../GeneralizedFragment/intf/IFragment.sol";
interface IDODONFTRegistry { interface IDODONFTRegistry {
function addRegistry( function addRegistry(
address vault, address vault,
address fragment, address fragment,
address quoteToken, address quoteToken,
address feeDistributor,
address dvm address dvm
) external; ) external;
function removeRegistry(address fragment) external;
} }
/** /**
@@ -32,11 +34,6 @@ contract DODONFTRegistry is InitializableOwnable, IDODONFTRegistry {
mapping (address => bool) public isAdminListed; mapping (address => bool) public isAdminListed;
// ============ Registry ============ // ============ Registry ============
// Frag -> FeeDistributor
mapping(address => address) public _FRAG_FEE_REGISTRY_;
// DVM -> FeeDistributor
mapping(address => address) public _DVM_FEE_REGISTRY_;
// Vault -> Frag // Vault -> Frag
mapping(address => address) public _VAULT_FRAG_REGISTRY_; mapping(address => address) public _VAULT_FRAG_REGISTRY_;
@@ -48,7 +45,6 @@ contract DODONFTRegistry is InitializableOwnable, IDODONFTRegistry {
event NewRegistry( event NewRegistry(
address vault, address vault,
address fragment, address fragment,
address feeDistributor,
address dvm address dvm
); );
@@ -61,24 +57,19 @@ contract DODONFTRegistry is InitializableOwnable, IDODONFTRegistry {
address vault, address vault,
address fragment, address fragment,
address quoteToken, address quoteToken,
address feeDistributor,
address dvm address dvm
) override external { ) override external {
require(isAdminListed[msg.sender], "ACCESS_DENIED"); require(isAdminListed[msg.sender], "ACCESS_DENIED");
_FRAG_FEE_REGISTRY_[fragment] = feeDistributor;
_DVM_FEE_REGISTRY_[dvm] = feeDistributor;
_VAULT_FRAG_REGISTRY_[vault] = fragment; _VAULT_FRAG_REGISTRY_[vault] = fragment;
_REGISTRY_[fragment][quoteToken].push(dvm); _REGISTRY_[fragment][quoteToken].push(dvm);
emit NewRegistry(vault, fragment, feeDistributor, dvm); emit NewRegistry(vault, fragment, dvm);
} }
function removeRegistry( function removeRegistry(address fragment) override external {
address vault, require(isAdminListed[msg.sender], "ACCESS_DENIED");
address fragment, address vault = IFragment(fragment)._COLLATERAL_VAULT_();
address dvm address dvm = IFragment(fragment)._DVM_();
) external onlyOwner {
_FRAG_FEE_REGISTRY_[fragment] = address(0);
_DVM_FEE_REGISTRY_[dvm] = address(0);
_VAULT_FRAG_REGISTRY_[vault] = address(0); _VAULT_FRAG_REGISTRY_[vault] = address(0);
address quoteToken = IDVM(dvm)._QUOTE_TOKEN_(); address quoteToken = IDVM(dvm)._QUOTE_TOKEN_();

View File

@@ -27,6 +27,8 @@ interface IFragment {
function _QUOTE_() external view returns (address); function _QUOTE_() external view returns (address);
function _COLLATERAL_VAULT_() external view returns (address);
function _DVM_() external view returns (address); function _DVM_() external view returns (address);
function totalSupply() external view returns (uint256); function totalSupply() external view returns (uint256);

View File

@@ -14,9 +14,7 @@ import {IWETH} from "../../intf/IWETH.sol";
import {InitializableOwnable} from "../../lib/InitializableOwnable.sol"; import {InitializableOwnable} from "../../lib/InitializableOwnable.sol";
import {ICollateralVault} from "../../CollateralVault/intf/ICollateralVault.sol"; import {ICollateralVault} from "../../CollateralVault/intf/ICollateralVault.sol";
import {IDVM} from "../../DODOVendingMachine/intf/IDVM.sol"; import {IDVM} from "../../DODOVendingMachine/intf/IDVM.sol";
import {IConstFeeRateModel} from "../../lib/ConstFeeRateModel.sol";
import {IFragment} from "../../GeneralizedFragment/intf/IFragment.sol"; import {IFragment} from "../../GeneralizedFragment/intf/IFragment.sol";
import {IFeeDistributor} from "../../intf/IFeeDistributor.sol";
import {IDODONFTRegistry} from "../../Factory/Registries/DODONFTRegistry.sol"; import {IDODONFTRegistry} from "../../Factory/Registries/DODONFTRegistry.sol";
import {SafeMath} from "../../lib/SafeMath.sol"; import {SafeMath} from "../../lib/SafeMath.sol";
import {SafeERC20} from "../../lib/SafeERC20.sol"; import {SafeERC20} from "../../lib/SafeERC20.sol";
@@ -43,25 +41,22 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable {
address public immutable _NFT_REGISTY_; address public immutable _NFT_REGISTY_;
address public immutable _DEFAULT_MAINTAINER_; address public immutable _DEFAULT_MAINTAINER_;
address public _MT_FEE_RATE_MODEL_;
address public _VAULT_TEMPLATE_; address public _VAULT_TEMPLATE_;
address public _FRAG_TEMPLATE_; address public _FRAG_TEMPLATE_;
address public _FEE_TEMPLATE_;
address public _DVM_TEMPLATE_; address public _DVM_TEMPLATE_;
address public _MTFEE_TEMPLATE_;
uint256 public _DEFAULT_BUYOUT_FEE_; uint256 public _DEFAULT_BUYOUT_FEE_;
// ============ Events ============ // ============ Events ============
event ChangeVaultTemplate(address newVaultTemplate); event ChangeVaultTemplate(address newVaultTemplate);
event ChangeFragTemplate(address newFragTemplate); event ChangeFragTemplate(address newFragTemplate);
event ChangeFeeTemplate(address newFeeTemplate);
event ChangeMtFeeTemplate(address newMtFeeTemplate);
event ChangeDvmTemplate(address newDvmTemplate); event ChangeDvmTemplate(address newDvmTemplate);
event CreateNFTCollateralVault(address creator, address vault, string name, string baseURI); event ChangeMtFeeRateTemplate(address newMtFeeRateTemplate);
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 ChangeBuyoutFee(uint256 newBuyoutFee); 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 ============ // ============ Modifiers ============
@@ -79,22 +74,20 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable {
address payable weth, address payable weth,
address dodoApproveProxy, address dodoApproveProxy,
address defaultMaintainer, address defaultMaintainer,
address mtFeeRateModel,
address vaultTemplate, address vaultTemplate,
address fragTemplate, address fragTemplate,
address feeTemplate,
address dvmTemplate, address dvmTemplate,
address mtFeeTemplate,
address nftRegistry address nftRegistry
) public { ) public {
_CLONE_FACTORY_ = cloneFactory; _CLONE_FACTORY_ = cloneFactory;
_WETH_ = weth; _WETH_ = weth;
_DODO_APPROVE_PROXY_ = dodoApproveProxy; _DODO_APPROVE_PROXY_ = dodoApproveProxy;
_DEFAULT_MAINTAINER_ = defaultMaintainer; _DEFAULT_MAINTAINER_ = defaultMaintainer;
_MT_FEE_RATE_MODEL_ = mtFeeRateModel;
_VAULT_TEMPLATE_ = vaultTemplate; _VAULT_TEMPLATE_ = vaultTemplate;
_FRAG_TEMPLATE_ = fragTemplate; _FRAG_TEMPLATE_ = fragTemplate;
_FEE_TEMPLATE_ = feeTemplate;
_DVM_TEMPLATE_ = dvmTemplate; _DVM_TEMPLATE_ = dvmTemplate;
_MTFEE_TEMPLATE_ = mtFeeTemplate;
_NFT_REGISTY_ = nftRegistry; _NFT_REGISTY_ = nftRegistry;
} }
@@ -107,34 +100,26 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable {
function createFragment( function createFragment(
address quoteToken, address quoteToken,
address vaultPreOwner, address vaultPreOwner,
address stakeToken, //address(0) using frag token uint256[] calldata dvmParams, //0 - lpFeeRate, 1 - I, 2 - K
uint256[] calldata dvmParams, //0 - lpFeeRate, 1 - mtFeeRate 2 - I, 3 - K
uint256[] calldata fragParams, //0 - totalSupply, 1 - ownerRatio, 2 - buyoutTimestamp uint256[] calldata fragParams, //0 - totalSupply, 1 - ownerRatio, 2 - buyoutTimestamp
bool isOpenTwap bool isOpenTwap
) external returns (address newFragment, address newDvm, address newFeeDistributor) { ) external returns (address newFragment, address newDvm) {
newFragment = ICloneFactory(_CLONE_FACTORY_).clone(_FRAG_TEMPLATE_); newFragment = ICloneFactory(_CLONE_FACTORY_).clone(_FRAG_TEMPLATE_);
address _quoteToken = quoteToken == _ETH_ADDRESS_ ? _WETH_ : quoteToken; 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 _dvmParams = dvmParams;
uint256[] memory _fragParams = fragParams; uint256[] memory _fragParams = fragParams;
newDvm = ICloneFactory(_CLONE_FACTORY_).clone(_DVM_TEMPLATE_); newDvm = ICloneFactory(_CLONE_FACTORY_).clone(_DVM_TEMPLATE_);
IDVM(newDvm).init( IDVM(newDvm).init(
newFeeDistributor == address(0) ? _DEFAULT_MAINTAINER_ : newFeeDistributor, _DEFAULT_MAINTAINER_,
newFragment, newFragment,
_quoteToken, _quoteToken,
_dvmParams[0], _dvmParams[0],
_createConstantMtFeeRateModel(_dvmParams[1]), _MT_FEE_RATE_MODEL_,
_dvmParams[1],
_dvmParams[2], _dvmParams[2],
_dvmParams[3],
isOpenTwap isOpenTwap
); );
IFragment(newFragment).init( IFragment(newFragment).init(
@@ -151,9 +136,9 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable {
ICollateralVault(msg.sender).directTransferOwnership(newFragment); 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( function buyout(
@@ -176,29 +161,14 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable {
_deposit(msg.sender, fragment, IFragment(fragment)._QUOTE_(), curRequireQuote, flag == 1); _deposit(msg.sender, fragment, IFragment(fragment)._QUOTE_(), curRequireQuote, flag == 1);
IFragment(fragment).buyout(msg.sender); IFragment(fragment).buyout(msg.sender);
IDODONFTRegistry(_NFT_REGISTY_).removeRegistry(fragment);
// refund dust eth // refund dust eth
if (flag == 1 && msg.value > curRequireQuote) msg.sender.transfer(msg.value - curRequireQuote); if (flag == 1 && msg.value > curRequireQuote) msg.sender.transfer(msg.value - curRequireQuote);
emit Buyout(msg.sender, fragment, 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 =================== //============= Owner ===================
function updateVaultTemplate(address newVaultTemplate) external onlyOwner { function updateVaultTemplate(address newVaultTemplate) external onlyOwner {
_VAULT_TEMPLATE_ = newVaultTemplate; _VAULT_TEMPLATE_ = newVaultTemplate;
@@ -210,14 +180,9 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable {
emit ChangeFragTemplate(newFragTemplate); emit ChangeFragTemplate(newFragTemplate);
} }
function updateFeeTemplate(address newFeeTemplate) external onlyOwner { function updateMtFeeRateTemplate(address newMtFeeRateTemplate) external onlyOwner {
_FEE_TEMPLATE_ = newFeeTemplate; _MT_FEE_RATE_MODEL_ = newMtFeeRateTemplate;
emit ChangeFeeTemplate(newFeeTemplate); emit ChangeMtFeeRateTemplate(newMtFeeRateTemplate);
}
function updateMtFeeTemplate(address newMtFeeTemplate) external onlyOwner {
_MTFEE_TEMPLATE_ = newMtFeeTemplate;
emit ChangeMtFeeTemplate(newMtFeeTemplate);
} }
function updateDvmTemplate(address newDvmTemplate) external onlyOwner { function updateDvmTemplate(address newDvmTemplate) external onlyOwner {
@@ -233,12 +198,6 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable {
//============= Internal ================ //============= Internal ================
function _createConstantMtFeeRateModel(uint256 mtFee) internal returns (address mtFeeModel) {
mtFeeModel = ICloneFactory(_CLONE_FACTORY_).clone(_MTFEE_TEMPLATE_);
IConstFeeRateModel(mtFeeModel).init(mtFee);
}
function _deposit( function _deposit(
address from, address from,
address to, address to,

View File

@@ -31,53 +31,53 @@ async function init(ctx: NFTContext): Promise<void> {
await ctx.approveProxy(ctx.USDT, buyer); await ctx.approveProxy(ctx.USDT, buyer);
} }
async function getFeeGlobalState(ctx: NFTContext, feeAddress: string, baseToken, quoteToken, stakeToken) { // async function getFeeGlobalState(ctx: NFTContext, feeAddress: string, baseToken, quoteToken, stakeToken) {
let feeInstance = contracts.getContractWithAddress(contracts.NFT_FEE, feeAddress); // let feeInstance = contracts.getContractWithAddress(contracts.NFT_FEE, feeAddress);
let baseReserve = await feeInstance.methods._BASE_RESERVE_().call(); // let baseReserve = await feeInstance.methods._BASE_RESERVE_().call();
let quoteReserve = await feeInstance.methods._QUOTE_RESERVE_().call(); // let quoteReserve = await feeInstance.methods._QUOTE_RESERVE_().call();
let baseBalance = await baseToken.methods.balanceOf(feeAddress).call(); // let baseBalance = await baseToken.methods.balanceOf(feeAddress).call();
let quoteBalance = await quoteToken.methods.balanceOf(feeAddress).call(); // let quoteBalance = await quoteToken.methods.balanceOf(feeAddress).call();
let stakeVault = await feeInstance.methods._STAKE_VAULT_().call(); // let stakeVault = await feeInstance.methods._STAKE_VAULT_().call();
let stakeBalance = await stakeToken.methods.balanceOf(stakeVault).call(); // let stakeBalance = await stakeToken.methods.balanceOf(stakeVault).call();
let stakeReserve = await feeInstance.methods._STAKE_RESERVE_().call(); // let stakeReserve = await feeInstance.methods._STAKE_RESERVE_().call();
let baseRatio = await feeInstance.methods._BASE_REWARD_RATIO_().call(); // let baseRatio = await feeInstance.methods._BASE_REWARD_RATIO_().call();
let quoteRatio = await feeInstance.methods._QUOTE_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 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("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("baseRatio:" + fromWei(baseRatio, 'ether') + " quoteRatio:" + fromWei(quoteRatio, 'mwei'));
return { // return {
"baseReserve": baseReserve, // "baseReserve": baseReserve,
"quoteReserve": quoteReserve, // "quoteReserve": quoteReserve,
"stakeReserve": stakeReserve, // "stakeReserve": stakeReserve,
"baseBalance": baseBalance, // "baseBalance": baseBalance,
"quoteBalance": quoteBalance, // "quoteBalance": quoteBalance,
"stakeBalance": stakeBalance, // "stakeBalance": stakeBalance,
"baseRatio": baseRatio, // "baseRatio": baseRatio,
"quoteRatio": quoteRatio // "quoteRatio": quoteRatio
} // }
} // }
async function getFeeUserState(ctx: NFTContext, feeAddress: string, userAddress: string) { // async function getFeeUserState(ctx: NFTContext, feeAddress: string, userAddress: string) {
let feeInstance = contracts.getContractWithAddress(contracts.NFT_FEE, feeAddress); // let feeInstance = contracts.getContractWithAddress(contracts.NFT_FEE, feeAddress);
let userShares = await feeInstance.methods._SHARES_(userAddress).call(); // let userShares = await feeInstance.methods._SHARES_(userAddress).call();
let [baseRewards, quoteRewards] = await feeInstance.methods.getPendingReward(userAddress).call(); // let [baseRewards, quoteRewards] = await feeInstance.methods.getPendingReward(userAddress).call();
let userBasePerShares = await feeInstance.methods._USER_BASE_PER_SHARE_(userAddress).call(); // let userBasePerShares = await feeInstance.methods._USER_BASE_PER_SHARE_(userAddress).call();
let userQuotePerShares = await feeInstance.methods._USER_QUOTE_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 shares:" + fromWei(userShares, 'ether'));
console.log("user baseRewards:" + fromWei(baseRewards, 'ether') + " userQuoteRewards:" + fromWei(quoteRewards, 'mwei')); // 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 basePerShares:" + fromWei(userBasePerShares, 'ether') + " userQuotePerShares:" + fromWei(userQuotePerShares, 'mwei'));
return { // return {
"userShares": userShares, // "userShares": userShares,
"userBaseRewards": baseRewards, // "userBaseRewards": baseRewards,
"userQuoteRewards": quoteRewards, // "userQuoteRewards": quoteRewards,
"userBasePerShares": userBasePerShares, // "userBasePerShares": userBasePerShares,
"userQuotePerShares": userQuotePerShares // "userQuotePerShares": userQuotePerShares
} // }
} // }
async function mockTrade(ctx: NFTContext, dvmAddress: string, dvmInstance, fragInstance) { async function mockTrade(ctx: NFTContext, dvmAddress: string, dvmInstance, fragInstance) {
await ctx.transferQuoteToDVM(ctx.USDT, dvmAddress, user1, mweiStr("20")); await ctx.transferQuoteToDVM(ctx.USDT, dvmAddress, user1, mweiStr("20"));
@@ -150,16 +150,13 @@ describe("DODONFT", () => {
var erc721Instance = contracts.getContractWithAddress(contracts.ERC721, erc721Address); var erc721Instance = contracts.getContractWithAddress(contracts.ERC721, erc721Address);
await erc721Instance.methods.safeTransferFrom(author, vaultAddress, 0).send(ctx.sendParam(author)); await erc721Instance.methods.safeTransferFrom(author, vaultAddress, 0).send(ctx.sendParam(author));
var quoteToken = "0x156595bAF85D5C29E91d959889B022d952190A64"; // var quoteToken = "0x156595bAF85D5C29E91d959889B022d952190A64";
var vaultPreOwner = "0x7e83d9d94837eE82F0cc18a691da6f42F03F1d86"; // var vaultPreOwner = "0x7e83d9d94837eE82F0cc18a691da6f42F03F1d86";
// var quoteToken = ctx.USDT.options.address; var quoteToken = ctx.USDT.options.address;
// var vaultPreOwner = author; var vaultPreOwner = author;
var stakeToken = "0x0000000000000000000000000000000000000000";
var dvmParams = [ var dvmParams = [
"0", //lpFeeRate "0", //lpFeeRate
decimalStr("0.01"), //mtFeeRate
mweiStr("1"), // I mweiStr("1"), // I
decimalStr("1") // K decimalStr("1") // K
]; ];
@@ -173,106 +170,105 @@ describe("DODONFT", () => {
var callData = ctx.NFTProxy.methods.createFragment( var callData = ctx.NFTProxy.methods.createFragment(
quoteToken, quoteToken,
vaultPreOwner, vaultPreOwner,
stakeToken,
dvmParams, dvmParams,
fragParams, fragParams,
isOpenTwap isOpenTwap
).encodeABI(); ).encodeABI();
console.log("data:", callData); console.log("data:", callData);
// await logGas(await nftVaultInstance.methods.createFragment( await logGas(await nftVaultInstance.methods.createFragment(
// ctx.NFTProxy.options.address, ctx.NFTProxy.options.address,
// callData callData
// ), ctx.sendParam(author), "createFragment"); ), 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 dvmInstance = contracts.getContractWithAddress(contracts.DVM_NAME, dvmAddress);
var fragInstance = contracts.getContractWithAddress(contracts.NFT_FRAG, fragAddress); var midPrice = await dvmInstance.methods.getMidPrice().call();
await ctx.approveProxy(fragInstance, user1); assert(midPrice, mweiStr("1"));
await ctx.approveProxy(fragInstance, user2); let newVaultOwner = await nftVaultInstance.methods._OWNER_().call();
//mock trading assert(fragAddress, newVaultOwner);
//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("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 () => { it("buyout and redeem", async () => {
var fragParams = [ var fragParams = [
decimalStr("10000"), //totalSupply decimalStr("10000"), //totalSupply
decimalStr("0.2"), //ownerRatio decimalStr("0.2"), //ownerRatio
Math.floor(new Date().getTime() / 1000) //buyoutTimeStamp 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 dvmInstance = contracts.getContractWithAddress(contracts.DVM_NAME, dvmAddress);
var fragInstance = contracts.getContractWithAddress(contracts.NFT_FRAG, fragAddress); var fragInstance = contracts.getContractWithAddress(contracts.NFT_FRAG, fragAddress);
var vaultInstance = contracts.getContractWithAddress(contracts.NFT_VAULT, vaultAddress); var vaultInstance = contracts.getContractWithAddress(contracts.NFT_VAULT, vaultAddress);

View File

@@ -28,11 +28,11 @@ export class NFTContext {
NFTRegister: Contract; NFTRegister: Contract;
CollatteralVault: Contract; CollatteralVault: Contract;
Fragment: Contract; Fragment: Contract;
NFTFee: Contract;
NFTProxy: Contract; NFTProxy: Contract;
DODOApprove: Contract; DODOApprove: Contract;
DODOApproveProxy: Contract; DODOApproveProxy: Contract;
mtFeeRateModel: Contract;
//token //token
USDT: Contract; USDT: Contract;
@@ -69,7 +69,8 @@ export class NFTContext {
contracts.CLONE_FACTORY_CONTRACT_NAME contracts.CLONE_FACTORY_CONTRACT_NAME
); );
var dvmTemplate = await contracts.newContract(contracts.DVM_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 ERC721Template = await contracts.newContract(contracts.ERC721)
var ERC1155Template = await contracts.newContract(contracts.ERC1155) var ERC1155Template = await contracts.newContract(contracts.ERC1155)
@@ -103,19 +104,16 @@ export class NFTContext {
this.Fragment = await contracts.newContract(contracts.NFT_FRAG) this.Fragment = await contracts.newContract(contracts.NFT_FRAG)
this.NFTFee = await contracts.newContract(contracts.NFT_FEE)
this.NFTProxy = await contracts.newContract(contracts.NFT_PROXY, this.NFTProxy = await contracts.newContract(contracts.NFT_PROXY,
[ [
cloneFactory.options.address, cloneFactory.options.address,
this.WETH.options.address, this.WETH.options.address,
this.DODOApproveProxy.options.address, this.DODOApproveProxy.options.address,
this.Deployer, this.Deployer,
this.mtFeeRateModel.options.address,
this.CollatteralVault.options.address, this.CollatteralVault.options.address,
this.Fragment.options.address, this.Fragment.options.address,
this.NFTFee.options.address,
dvmTemplate.options.address, dvmTemplate.options.address,
constFeeTemplate.options.address,
this.NFTRegister.options.address this.NFTRegister.options.address
] ]
) )
@@ -152,10 +150,9 @@ export class NFTContext {
async getRegistry(ctx: NFTContext, vaultAddress: string) { async getRegistry(ctx: NFTContext, vaultAddress: string) {
let fragAddress = await ctx.NFTRegister.methods._VAULT_FRAG_REGISTRY_(vaultAddress).call(); 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 fragInstance = contracts.getContractWithAddress(contracts.NFT_FRAG, fragAddress);
let dvmAddress = await fragInstance.methods._DVM_().call(); let dvmAddress = await fragInstance.methods._DVM_().call();
return [fragAddress, feeDistrubitor, dvmAddress]; return [fragAddress, , dvmAddress];
} }
async createNFTVault(ctx: NFTContext, author: string) { async createNFTVault(ctx: NFTContext, author: string) {
@@ -191,7 +188,6 @@ export class NFTContext {
if (dvmParams == null) { if (dvmParams == null) {
dvmParams = [ dvmParams = [
"0", //lpFeeRate "0", //lpFeeRate
decimalStr("0.01"), //mtFeeRate
mweiStr("1"), // I mweiStr("1"), // I
decimalStr("1") // K decimalStr("1") // K
]; ];
@@ -207,13 +203,11 @@ export class NFTContext {
addrs = [] addrs = []
addrs.push(ctx.USDT.options.address);//quoteToken addrs.push(ctx.USDT.options.address);//quoteToken
addrs.push(author);//vaultPreOwner addrs.push(author);//vaultPreOwner
addrs.push("0x0000000000000000000000000000000000000000");//stakeToken
} }
var callData = ctx.NFTProxy.methods.createFragment( var callData = ctx.NFTProxy.methods.createFragment(
addrs[0], addrs[0],
addrs[1], addrs[1],
addrs[2],
dvmParams, dvmParams,
fragParams, fragParams,
false false
@@ -224,8 +218,8 @@ export class NFTContext {
callData callData
).send(ctx.sendParam(author)); ).send(ctx.sendParam(author));
let [fragAddress, feeAddress, dvmAddress] = await this.getRegistry(ctx, vaultAddress); let [fragAddress, , dvmAddress] = await this.getRegistry(ctx, vaultAddress);
return [vaultAddress, fragAddress, feeAddress, dvmAddress, callData] return [vaultAddress, fragAddress, , dvmAddress, callData]
} }