Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 9 additions & 18 deletions contracts/FuturesMarket.sol
Original file line number Diff line number Diff line change
Expand Up @@ -228,13 +228,6 @@ contract FuturesMarket is Owned, Proxyable, MixinFuturesMarketSettings, IFutures
return _marketSizes();
}

/*
* The max number of base units per market.
*/
function maxMarketSize() external view returns (uint) {
return uint(_maxMarketValue(baseAsset));
}

/*
* The remaining units on each side of the market left to be filled before hitting the cap.
*/
Expand Down Expand Up @@ -281,13 +274,17 @@ contract FuturesMarket is Owned, Proxyable, MixinFuturesMarketSettings, IFutures

/*
* The size of the skew relative to the size of the market OI cap. This value ranges between 0 and 1.
* Scaler used for skew is at least minSkewScale to prevent extreme funding rates for small markets.
*/
function _proportionalSkew() internal view returns (int) {
int signedSize = int(_maxMarketValue(baseAsset));
if (signedSize == 0) {
uint minScale = _minSkewScale(baseAsset);
// don't allow small market sizes to cause huge funding rates
uint skewScale = marketSize > minScale ? marketSize : minScale;
if (skewScale == 0) {
// parameters may not be set, don't divide by zero
return 0;
}
return marketSkew.divideDecimalRound(signedSize);
return marketSkew.divideDecimalRound(int(skewScale));
}

/*
Expand All @@ -303,7 +300,7 @@ contract FuturesMarket is Owned, Proxyable, MixinFuturesMarketSettings, IFutures
uint maxLeverage,
uint maxMarketValue,
uint maxFundingRate,
uint maxFundingRateSkew,
uint minSkewScale,
uint maxFundingRateDelta
)
{
Expand All @@ -312,14 +309,8 @@ contract FuturesMarket is Owned, Proxyable, MixinFuturesMarketSettings, IFutures

function _currentFundingRate() internal view returns (int) {
int maxFundingRate = int(_maxFundingRate(baseAsset));
int maxFundingRateSkew = int(_maxFundingRateSkew(baseAsset));
if (maxFundingRateSkew == 0) {
return maxFundingRate;
}

int functionFraction = _proportionalSkew().divideDecimalRound(maxFundingRateSkew);
// Note the minus sign: funding flows in the opposite direction to the skew.
return _min(_max(-_UNIT, -functionFraction), _UNIT).multiplyDecimalRound(maxFundingRate);
return _min(_max(-_UNIT, -_proportionalSkew()), _UNIT).multiplyDecimalRound(maxFundingRate);
}

/*
Expand Down
8 changes: 4 additions & 4 deletions contracts/FuturesMarketData.sol
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ contract FuturesMarketData {

struct FundingParameters {
uint maxFundingRate;
uint maxFundingRateSkew;
uint minSkewScale;
uint maxFundingRateDelta;
}

Expand Down Expand Up @@ -132,7 +132,7 @@ contract FuturesMarketData {
uint maxLeverage,
uint maxMarketValue,
uint maxFundingRate,
uint maxFundingRateSkew,
uint minSkewScale,
uint maxFundingRateDelta
) = _futuresMarketSettings().parameters(baseAsset);
return
Expand All @@ -143,7 +143,7 @@ contract FuturesMarketData {
maxLeverage,
maxMarketValue,
maxFundingRate,
maxFundingRateSkew,
minSkewScale,
maxFundingRateDelta
);
}
Expand Down Expand Up @@ -192,7 +192,7 @@ contract FuturesMarketData {
pure
returns (FundingParameters memory)
{
return FundingParameters(params.maxFundingRate, params.maxFundingRateSkew, params.maxFundingRateDelta);
return FundingParameters(params.maxFundingRate, params.minSkewScale, params.maxFundingRateDelta);
}

function _marketSizes(IFuturesMarket market) internal view returns (Sides memory) {
Expand Down
14 changes: 7 additions & 7 deletions contracts/FuturesMarketSettings.sol
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ contract FuturesMarketSettings is Owned, MixinFuturesMarketSettings, IFuturesMar
/*
* The skew level at which the max funding rate will be charged.
*/
function maxFundingRateSkew(bytes32 _baseAsset) public view returns (uint) {
return _maxFundingRateSkew(_baseAsset);
function minSkewScale(bytes32 _baseAsset) public view returns (uint) {
return _minSkewScale(_baseAsset);
}

/*
Expand All @@ -102,7 +102,7 @@ contract FuturesMarketSettings is Owned, MixinFuturesMarketSettings, IFuturesMar
uint _maxLeverage,
uint _maxMarketValue,
uint _maxFundingRate,
uint _maxFundingRateSkew,
uint _minSkewScale,
uint _maxFundingRateDelta
)
{
Expand Down Expand Up @@ -173,9 +173,9 @@ contract FuturesMarketSettings is Owned, MixinFuturesMarketSettings, IFuturesMar
_setParameter(_baseAsset, PARAMETER_MAX_FUNDING_RATE, _maxFundingRate);
}

function setMaxFundingRateSkew(bytes32 _baseAsset, uint _maxFundingRateSkew) public onlyOwner {
function setMinSkewScale(bytes32 _baseAsset, uint _minSkewScale) public onlyOwner {
_recomputeFunding(_baseAsset);
_setParameter(_baseAsset, PARAMETER_MAX_FUNDING_RATE_SKEW, _maxFundingRateSkew);
_setParameter(_baseAsset, PARAMETER_MIN_SKEW_SCALE, _minSkewScale);
}

function setMaxFundingRateDelta(bytes32 _baseAsset, uint _maxFundingRateDelta) public onlyOwner {
Expand All @@ -191,7 +191,7 @@ contract FuturesMarketSettings is Owned, MixinFuturesMarketSettings, IFuturesMar
uint _maxLeverage,
uint _maxMarketValue,
uint _maxFundingRate,
uint _maxFundingRateSkew,
uint _minSkewScale,
uint _maxFundingRateDelta
) external onlyOwner {
_recomputeFunding(_baseAsset);
Expand All @@ -201,7 +201,7 @@ contract FuturesMarketSettings is Owned, MixinFuturesMarketSettings, IFuturesMar
setMaxLeverage(_baseAsset, _maxLeverage);
setMaxMarketValue(_baseAsset, _maxMarketValue);
setMaxFundingRate(_baseAsset, _maxFundingRate);
setMaxFundingRateSkew(_baseAsset, _maxFundingRateSkew);
setMinSkewScale(_baseAsset, _minSkewScale);
setMaxFundingRateDelta(_baseAsset, _maxFundingRateDelta);
}

Expand Down
14 changes: 7 additions & 7 deletions contracts/MixinFuturesMarketSettings.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ contract MixinFuturesMarketSettings is MixinResolver {
bytes32 internal constant PARAMETER_MAX_LEVERAGE = "maxLeverage";
bytes32 internal constant PARAMETER_MAX_MARKET_VALUE = "maxMarketValue";
bytes32 internal constant PARAMETER_MAX_FUNDING_RATE = "maxFundingRate";
bytes32 internal constant PARAMETER_MAX_FUNDING_RATE_SKEW = "maxFundingRateSkew";
bytes32 internal constant PARAMETER_MIN_SKEW_SCALE = "minSkewScale";
bytes32 internal constant PARAMETER_MAX_FUNDING_RATE_DELTA = "maxFundingRateDelta";

// Global settings
Expand Down Expand Up @@ -72,12 +72,12 @@ contract MixinFuturesMarketSettings is MixinResolver {
return _parameter(_baseAsset, PARAMETER_MAX_MARKET_VALUE);
}

function _maxFundingRate(bytes32 _baseAsset) internal view returns (uint) {
return _parameter(_baseAsset, PARAMETER_MAX_FUNDING_RATE);
function _minSkewScale(bytes32 _baseAsset) internal view returns (uint) {
return _parameter(_baseAsset, PARAMETER_MIN_SKEW_SCALE);
}

function _maxFundingRateSkew(bytes32 _baseAsset) internal view returns (uint) {
return _parameter(_baseAsset, PARAMETER_MAX_FUNDING_RATE_SKEW);
function _maxFundingRate(bytes32 _baseAsset) internal view returns (uint) {
return _parameter(_baseAsset, PARAMETER_MAX_FUNDING_RATE);
}

function _maxFundingRateDelta(bytes32 _baseAsset) internal view returns (uint) {
Expand All @@ -94,7 +94,7 @@ contract MixinFuturesMarketSettings is MixinResolver {
uint maxLeverage,
uint maxMarketValue,
uint maxFundingRate,
uint maxFundingRateSkew,
uint minSkewScale,
uint maxFundingRateDelta
)
{
Expand All @@ -104,7 +104,7 @@ contract MixinFuturesMarketSettings is MixinResolver {
maxLeverage = _maxLeverage(_baseAsset);
maxMarketValue = _maxMarketValue(_baseAsset);
maxFundingRate = _maxFundingRate(_baseAsset);
maxFundingRateSkew = _maxFundingRateSkew(_baseAsset);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why removing maxFundingRateSkew ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess it's not really used and is always 1 so skew was always affecting funding rate

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was not used in practice (was set to 1). Additionally it was making calculations complex to reason about and test. Should be simple enough to reintroduce if we need it when we need a more complex model.

minSkewScale = _minSkewScale(_baseAsset);
maxFundingRateDelta = _maxFundingRateDelta(_baseAsset);
}

Expand Down
4 changes: 1 addition & 3 deletions contracts/interfaces/IFuturesMarket.sol
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,6 @@ interface IFuturesMarket {

function marketSizes() external view returns (uint long, uint short);

function maxMarketSize() external view returns (uint);

function maxOrderSizes()
external
view
Expand All @@ -78,7 +76,7 @@ interface IFuturesMarket {
uint maxLeverage,
uint maxMarketValue,
uint maxFundingRate,
uint maxFundingRateSkew,
uint minSkewScale,
uint maxFundingRateDelta
);

Expand Down
6 changes: 3 additions & 3 deletions contracts/interfaces/IFuturesMarketSettings.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ interface IFuturesMarketSettings {
uint maxLeverage;
uint maxMarketValue;
uint maxFundingRate;
uint maxFundingRateSkew;
uint minSkewScale;
uint maxFundingRateDelta;
}

Expand All @@ -24,7 +24,7 @@ interface IFuturesMarketSettings {

function maxFundingRate(bytes32 _baseAsset) external view returns (uint);

function maxFundingRateSkew(bytes32 _baseAsset) external view returns (uint);
function minSkewScale(bytes32 _baseAsset) external view returns (uint);

function maxFundingRateDelta(bytes32 _baseAsset) external view returns (uint);

Expand All @@ -38,7 +38,7 @@ interface IFuturesMarketSettings {
uint _maxLeverage,
uint _maxMarketValue,
uint _maxFundingRate,
uint _maxFundingRateSkew,
uint _minSkewScale,
uint _maxFundingRateDelta
);

Expand Down
18 changes: 9 additions & 9 deletions publish/deployed/kovan-ovm-futures/deployment.json
Original file line number Diff line number Diff line change
Expand Up @@ -24133,7 +24133,7 @@
},
{
"internalType": "uint256",
"name": "maxFundingRateSkew",
"name": "minSkewScale",
"type": "uint256"
},
{
Expand Down Expand Up @@ -24279,7 +24279,7 @@
},
{
"internalType": "uint256",
"name": "maxFundingRateSkew",
"name": "minSkewScale",
"type": "uint256"
},
{
Expand Down Expand Up @@ -24566,7 +24566,7 @@
},
{
"internalType": "uint256",
"name": "maxFundingRateSkew",
"name": "minSkewScale",
"type": "uint256"
},
{
Expand Down Expand Up @@ -25098,7 +25098,7 @@
"type": "bytes32"
}
],
"name": "maxFundingRateSkew",
"name": "minSkewScale",
"outputs": [
{
"internalType": "uint256",
Expand Down Expand Up @@ -25262,7 +25262,7 @@
},
{
"internalType": "uint256",
"name": "_maxFundingRateSkew",
"name": "_minSkewScale",
"type": "uint256"
},
{
Expand Down Expand Up @@ -25428,11 +25428,11 @@
},
{
"internalType": "uint256",
"name": "_maxFundingRateSkew",
"name": "_minSkewScale",
"type": "uint256"
}
],
"name": "setMaxFundingRateSkew",
"name": "setMinSkewScale",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
Expand Down Expand Up @@ -25537,7 +25537,7 @@
},
{
"internalType": "uint256",
"name": "_maxFundingRateSkew",
"name": "_minSkewScale",
"type": "uint256"
},
{
Expand Down Expand Up @@ -26531,7 +26531,7 @@
},
{
"internalType": "uint256",
"name": "maxFundingRateSkew",
"name": "minSkewScale",
"type": "uint256"
},
{
Expand Down
6 changes: 3 additions & 3 deletions publish/deployed/kovan-ovm-futures/futures-markets.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"maxLeverage": "10",
"maxMarketValue": "2000",
"maxFundingRate": "0.1",
"maxFundingRateSkew": "1",
"minSkewScale": "300",
"maxFundingRateDelta": "0.0125"
},
{
Expand All @@ -18,7 +18,7 @@
"maxLeverage": "10",
"maxMarketValue": "20000",
"maxFundingRate": "0.1",
"maxFundingRateSkew": "1",
"minSkewScale": "6000",
"maxFundingRateDelta": "0.0125"
},
{
Expand All @@ -29,7 +29,7 @@
"maxLeverage": "10",
"maxMarketValue": "1000000",
"maxFundingRate": "0.1",
"maxFundingRateSkew": "1",
"minSkewScale": "750000",
"maxFundingRateDelta": "0.0125"
}
]
6 changes: 3 additions & 3 deletions publish/deployed/local-ovm/futures-markets.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"maxLeverage": "10",
"maxMarketValue": "1000000000",
"maxFundingRate": "0.1",
"maxFundingRateSkew": "1",
"minSkewScale": "300",
"maxFundingRateDelta": "0.0125"
},
{
Expand All @@ -18,7 +18,7 @@
"maxLeverage": "10",
"maxMarketValue": "1000000000",
"maxFundingRate": "0.1",
"maxFundingRateSkew": "1",
"minSkewScale": "6000",
"maxFundingRateDelta": "0.0125"
},
{
Expand All @@ -29,7 +29,7 @@
"maxLeverage": "10",
"maxMarketValue": "1000000000",
"maxFundingRate": "0.1",
"maxFundingRateSkew": "1",
"minSkewScale": "750000",
"maxFundingRateDelta": "0.0125"
}
]
4 changes: 2 additions & 2 deletions publish/src/commands/deploy/configure-futures.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ module.exports = async ({
maxLeverage,
maxMarketValue,
maxFundingRate,
maxFundingRateSkew,
minSkewScale,
maxFundingRateDelta,
} = market;

Expand All @@ -100,7 +100,7 @@ module.exports = async ({
maxLeverage: w3utils.toWei(maxLeverage),
maxMarketValue: w3utils.toWei(maxMarketValue),
maxFundingRate: w3utils.toWei(maxFundingRate),
maxFundingRateSkew: w3utils.toWei(maxFundingRateSkew),
minSkewScale: w3utils.toWei(minSkewScale),
maxFundingRateDelta: w3utils.toWei(maxFundingRateDelta),
};

Expand Down
Loading