remove logic of feeDistributor
This commit is contained in:
@@ -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_();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user