Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sip 185 debt shares #1601

Merged
merged 65 commits into from
Feb 4, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
6522f12
add synthetixdebtshare
dbeal-eth Nov 11, 2021
510823f
lots of implementation
dbeal-eth Nov 13, 2021
8ed2fff
tests work
dbeal-eth Nov 15, 2021
834ec9d
add synthetix debt share tests
dbeal-eth Nov 16, 2021
bff2fb6
fix unit test failures
dbeal-eth Nov 16, 2021
9043de1
remove comments and np
dbeal-eth Nov 16, 2021
ae5c111
fix lints
dbeal-eth Nov 16, 2021
d532380
initial period is now 1
dbeal-eth Nov 16, 2021
3b53405
add a few tests for coverage
dbeal-eth Nov 16, 2021
5076ab1
use `hardhat-interact` instead of builtin
dbeal-eth Nov 28, 2021
e351a65
fix module resolution
dbeal-eth Nov 29, 2021
f1280ab
fix package lock again
dbeal-eth Nov 29, 2021
fea5c91
fix provider url issues and network id for kvoan
dbeal-eth Nov 29, 2021
10ea7bd
add synthetixdebtshare
dbeal-eth Nov 11, 2021
7cf745b
lots of implementation
dbeal-eth Nov 13, 2021
113ada3
tests work
dbeal-eth Nov 15, 2021
f267e6e
add synthetix debt share tests
dbeal-eth Nov 16, 2021
667fcc8
fix unit test failures
dbeal-eth Nov 16, 2021
2265bf6
remove comments and np
dbeal-eth Nov 16, 2021
fb1530a
fix lints
dbeal-eth Nov 16, 2021
bdf3e69
initial period is now 1
dbeal-eth Nov 16, 2021
87cd0da
add a few tests for coverage
dbeal-eth Nov 16, 2021
8171cb3
now its not necessary to work around load-contracts functionality wit…
dbeal-eth Dec 2, 2021
1deac59
Merge branch 'sip-185-debt-shares' of https://github.com/Synthetixio/…
dbeal-eth Dec 12, 2021
e961d51
oops
dbeal-eth Dec 12, 2021
09c501e
add migration script start
dbeal-eth Dec 12, 2021
54bc7b2
Merge branch 'develop' into sip-185-debt-shares
barrasso Jan 11, 2022
26bddc0
remove unnecessary migration contracts
barrasso Jan 11, 2022
093812a
Update package-lock.json
barrasso Jan 11, 2022
7b052d8
fix SynthetixDebtShare allowance tests and update interface
barrasso Jan 12, 2022
074f973
fix remaining unit tests
barrasso Jan 13, 2022
3c10f8d
Merge branch 'develop' into sip-185-debt-shares
barrasso Jan 13, 2022
f70d5e3
Merge branch 'develop' into sip-185-debt-shares
barrasso Jan 13, 2022
9005af7
Merge branch 'sip-185-debt-shares' of https://github.com/Synthetixio/…
barrasso Jan 13, 2022
a4e67b9
final fixes
dbeal-eth Jan 13, 2022
7d91e8a
Merge branch 'develop' into sip-185-debt-shares
dbeal-eth Jan 14, 2022
832fe23
Merge branch 'develop' into sip-185-debt-shares
dbeal-eth Jan 15, 2022
1b12e4c
add apparently missing tests for importAddresses
dbeal-eth Jan 15, 2022
3783e05
fixes for reccomendations from @artdgn
dbeal-eth Jan 19, 2022
6104a06
more small cleanups
dbeal-eth Jan 19, 2022
1c8d00c
better balance history scanning
dbeal-eth Jan 19, 2022
da67a27
update docs
dbeal-eth Jan 19, 2022
21e76b9
Merge branch 'develop' into sip-185-debt-shares
barrasso Jan 20, 2022
63dc62b
minor formatting fix
barrasso Jan 20, 2022
d8aeb25
remove unneeded migration contracts
barrasso Jan 20, 2022
9e35b2b
fix lint error
barrasso Jan 20, 2022
f3537b9
Merge branch 'develop' into sip-185-debt-shares
barrasso Jan 21, 2022
afdefac
Merge remote-tracking branch 'origin/develop' into sip-185-debt-shares
dbeal-eth Jan 24, 2022
49d8a69
fixes for comments from audit
dbeal-eth Jan 24, 2022
dc3c276
add requirements for v3
dbeal-eth Jan 27, 2022
804a96b
Merge remote-tracking branch 'origin/develop' into sip-185-debt-shares
dbeal-eth Jan 27, 2022
19eb553
final audit notes
dbeal-eth Feb 1, 2022
331cb88
Merge remote-tracking branch 'origin/develop' into sip-185-debt-shares
dbeal-eth Feb 1, 2022
82c0c70
add support for complete control of altering balance during initial p…
dbeal-eth Feb 3, 2022
43b6fe1
fix lint
dbeal-eth Feb 3, 2022
fe3e180
Merge remote-tracking branch 'origin/develop' into sip-185-debt-shares
dbeal-eth Feb 3, 2022
ebdb8b0
fix tests... again?
dbeal-eth Feb 3, 2022
86bde07
fix scripts and stuff
dbeal-eth Feb 3, 2022
1053059
remove legacy contracts
dbeal-eth Feb 3, 2022
d0c69d5
fix integration tests && remove unnecessarsy changes
dbeal-eth Feb 3, 2022
b9add27
fix integration caught bug for `importFeePeriod`
dbeal-eth Feb 4, 2022
15202c1
undo accidental changes to config.json
dbeal-eth Feb 4, 2022
b8e0e9a
fix deploy tests
dbeal-eth Feb 4, 2022
dd7961b
fix task node
dbeal-eth Feb 4, 2022
9b54331
remove unnecessary conditional
dbeal-eth Feb 4, 2022
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
22 changes: 7 additions & 15 deletions contracts/BaseSynthetix.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import "./interfaces/ISynthetix.sol";
// Internal references
import "./interfaces/ISynth.sol";
import "./TokenState.sol";
import "./interfaces/ISynthetixState.sol";
import "./interfaces/ISystemStatus.sol";
import "./interfaces/IExchanger.sol";
import "./interfaces/IIssuer.sol";
Expand All @@ -26,7 +25,6 @@ contract BaseSynthetix is IERC20, ExternStateToken, MixinResolver, ISynthetix {
bytes32 public constant sUSD = "sUSD";

// ========== ADDRESS RESOLVER CONFIGURATION ==========
bytes32 private constant CONTRACT_SYNTHETIXSTATE = "SynthetixState";
bytes32 private constant CONTRACT_SYSTEMSTATUS = "SystemStatus";
bytes32 private constant CONTRACT_EXCHANGER = "Exchanger";
bytes32 private constant CONTRACT_ISSUER = "Issuer";
Expand All @@ -50,16 +48,11 @@ contract BaseSynthetix is IERC20, ExternStateToken, MixinResolver, ISynthetix {

// Note: use public visibility so that it can be invoked in a subclass
function resolverAddressesRequired() public view returns (bytes32[] memory addresses) {
addresses = new bytes32[](5);
addresses[0] = CONTRACT_SYNTHETIXSTATE;
addresses[1] = CONTRACT_SYSTEMSTATUS;
addresses[2] = CONTRACT_EXCHANGER;
addresses[3] = CONTRACT_ISSUER;
addresses[4] = CONTRACT_REWARDSDISTRIBUTION;
}

function synthetixState() internal view returns (ISynthetixState) {
return ISynthetixState(requireAndGetAddress(CONTRACT_SYNTHETIXSTATE));
addresses = new bytes32[](4);
addresses[0] = CONTRACT_SYSTEMSTATUS;
addresses[1] = CONTRACT_EXCHANGER;
addresses[2] = CONTRACT_ISSUER;
addresses[3] = CONTRACT_REWARDSDISTRIBUTION;
}

function systemStatus() internal view returns (ISystemStatus) {
Expand Down Expand Up @@ -147,14 +140,13 @@ contract BaseSynthetix is IERC20, ExternStateToken, MixinResolver, ISynthetix {
}

function _canTransfer(address account, uint value) internal view returns (bool) {
(uint initialDebtOwnership, ) = synthetixState().issuanceData(account);

if (initialDebtOwnership > 0) {
if (issuer().debtBalanceOf(account, "sUSD") > 0) {
Copy link
Contributor

@jacko125 jacko125 Nov 21, 2021

Choose a reason for hiding this comment

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

Why not check whether the account has any debt shares balance (directly from the SDS contract) and if 0, you could save more gas and skip this check for transferring ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I think I just wanted to reuse the issuer dependency. You are right, checking the debt shares contract directly would make more sense.

(uint transferable, bool anyRateIsInvalid) =
issuer().transferableSynthetixAndAnyRateIsInvalid(account, tokenState.balanceOf(account));
require(value <= transferable, "Cannot transfer staked or escrowed SNX");
require(!anyRateIsInvalid, "A synth or SNX rate is invalid");
}

return true;
}

Expand Down
138 changes: 30 additions & 108 deletions contracts/FeePool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,10 @@ import "./interfaces/IERC20.sol";
import "./interfaces/ISynth.sol";
import "./interfaces/ISystemStatus.sol";
import "./interfaces/ISynthetix.sol";
import "./FeePoolState.sol";
import "./interfaces/ISynthetixDebtShare.sol";
import "./FeePoolEternalStorage.sol";
import "./interfaces/IExchanger.sol";
import "./interfaces/IIssuer.sol";
import "./interfaces/ISynthetixState.sol";
import "./interfaces/IRewardEscrowV2.sol";
import "./interfaces/IDelegateApprovals.sol";
import "./interfaces/IRewardsDistribution.sol";
Expand All @@ -44,7 +43,6 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
// This struct represents the issuance activity that's happened in a fee period.
struct FeePeriod {
uint64 feePeriodId;
uint64 startingDebtIndex;
uint64 startTime;
uint feesToDistribute;
uint feesClaimed;
Expand All @@ -66,11 +64,10 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo

bytes32 private constant CONTRACT_SYSTEMSTATUS = "SystemStatus";
bytes32 private constant CONTRACT_SYNTHETIX = "Synthetix";
bytes32 private constant CONTRACT_FEEPOOLSTATE = "FeePoolState";
bytes32 private constant CONTRACT_SYNTHETIXDEBTSHARE = "SynthetixDebtShare";
bytes32 private constant CONTRACT_FEEPOOLETERNALSTORAGE = "FeePoolEternalStorage";
bytes32 private constant CONTRACT_EXCHANGER = "Exchanger";
bytes32 private constant CONTRACT_ISSUER = "Issuer";
bytes32 private constant CONTRACT_SYNTHETIXSTATE = "SynthetixState";
bytes32 private constant CONTRACT_REWARDESCROW_V2 = "RewardEscrowV2";
bytes32 private constant CONTRACT_DELEGATEAPPROVALS = "DelegateApprovals";
bytes32 private constant CONTRACT_COLLATERALMANAGER = "CollateralManager";
Expand All @@ -95,20 +92,19 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
/* ========== VIEWS ========== */
function resolverAddressesRequired() public view returns (bytes32[] memory addresses) {
bytes32[] memory existingAddresses = MixinSystemSettings.resolverAddressesRequired();
bytes32[] memory newAddresses = new bytes32[](13);
bytes32[] memory newAddresses = new bytes32[](12);
newAddresses[0] = CONTRACT_SYSTEMSTATUS;
newAddresses[1] = CONTRACT_SYNTHETIX;
newAddresses[2] = CONTRACT_FEEPOOLSTATE;
newAddresses[2] = CONTRACT_SYNTHETIXDEBTSHARE;
newAddresses[3] = CONTRACT_FEEPOOLETERNALSTORAGE;
newAddresses[4] = CONTRACT_EXCHANGER;
newAddresses[5] = CONTRACT_ISSUER;
newAddresses[6] = CONTRACT_SYNTHETIXSTATE;
newAddresses[7] = CONTRACT_REWARDESCROW_V2;
newAddresses[8] = CONTRACT_DELEGATEAPPROVALS;
newAddresses[9] = CONTRACT_REWARDSDISTRIBUTION;
newAddresses[10] = CONTRACT_COLLATERALMANAGER;
newAddresses[11] = CONTRACT_WRAPPER_FACTORY;
newAddresses[12] = CONTRACT_ETHER_WRAPPER;
newAddresses[6] = CONTRACT_REWARDESCROW_V2;
newAddresses[7] = CONTRACT_DELEGATEAPPROVALS;
newAddresses[8] = CONTRACT_REWARDSDISTRIBUTION;
newAddresses[9] = CONTRACT_COLLATERALMANAGER;
newAddresses[10] = CONTRACT_WRAPPER_FACTORY;
newAddresses[11] = CONTRACT_ETHER_WRAPPER;
addresses = combineArrays(existingAddresses, newAddresses);
}

Expand All @@ -120,8 +116,8 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
return ISynthetix(requireAndGetAddress(CONTRACT_SYNTHETIX));
}

function feePoolState() internal view returns (FeePoolState) {
return FeePoolState(requireAndGetAddress(CONTRACT_FEEPOOLSTATE));
function synthetixDebtShare() internal view returns (ISynthetixDebtShare) {
return ISynthetixDebtShare(requireAndGetAddress(CONTRACT_SYNTHETIXDEBTSHARE));
}

function feePoolEternalStorage() internal view returns (FeePoolEternalStorage) {
Expand All @@ -140,10 +136,6 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
return IIssuer(requireAndGetAddress(CONTRACT_ISSUER));
}

function synthetixState() internal view returns (ISynthetixState) {
return ISynthetixState(requireAndGetAddress(CONTRACT_SYNTHETIXSTATE));
}

function rewardEscrowV2() internal view returns (IRewardEscrowV2) {
return IRewardEscrowV2(requireAndGetAddress(CONTRACT_REWARDESCROW_V2));
}
Expand Down Expand Up @@ -181,7 +173,6 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
view
returns (
uint64 feePeriodId,
uint64 startingDebtIndex,
uint64 startTime,
uint feesToDistribute,
uint feesClaimed,
Expand All @@ -192,7 +183,6 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
FeePeriod memory feePeriod = _recentFeePeriodsStorage(index);
return (
feePeriod.feePeriodId,
feePeriod.startingDebtIndex,
feePeriod.startTime,
feePeriod.feesToDistribute,
feePeriod.feesClaimed,
Expand All @@ -205,31 +195,6 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
return _recentFeePeriods[(_currentFeePeriod + index) % FEE_PERIOD_LENGTH];
}

/* ========== MUTATIVE FUNCTIONS ========== */

/**
* @notice Logs an accounts issuance data per fee period
* @param account Message.Senders account address
* @param debtRatio Debt percentage this account has locked after minting or burning their synth
* @param debtEntryIndex The index in the global debt ledger. synthetixState.issuanceData(account)
* @dev onlyIssuer to call me on synthetix.issue() & synthetix.burn() calls to store the locked SNX
* per fee period so we know to allocate the correct proportions of fees and rewards per period
*/
function appendAccountIssuanceRecord(
address account,
uint debtRatio,
uint debtEntryIndex
) external onlyIssuerAndSynthetixState {
feePoolState().appendAccountIssuanceRecord(
account,
debtRatio,
debtEntryIndex,
_recentFeePeriodsStorage(0).startingDebtIndex
);

emitIssuanceDebtRatioEntry(account, debtRatio, debtEntryIndex, _recentFeePeriodsStorage(0).startingDebtIndex);
}

/**
* @notice The Exchanger contract informs us when fees are paid.
* @param amount susd amount in fees being paid.
Expand Down Expand Up @@ -286,9 +251,11 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
// Open up the new fee period.
// Increment periodId from the recent closed period feePeriodId
_recentFeePeriodsStorage(0).feePeriodId = uint64(uint256(_recentFeePeriodsStorage(1).feePeriodId).add(1));
_recentFeePeriodsStorage(0).startingDebtIndex = uint64(synthetixState().debtLedgerLength());
_recentFeePeriodsStorage(0).startTime = uint64(now);

// Inform Issuer to start recording for the new fee period
issuer().setCurrentPeriodId(now);

emitFeePeriodClosed(_recentFeePeriodsStorage(1).feePeriodId);
}

Expand Down Expand Up @@ -363,18 +330,14 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
function importFeePeriod(
uint feePeriodIndex,
uint feePeriodId,
uint startingDebtIndex,
uint startTime,
uint feesToDistribute,
uint feesClaimed,
uint rewardsToDistribute,
uint rewardsClaimed
) public optionalProxy_onlyOwner onlyDuringSetup {
barrasso marked this conversation as resolved.
Show resolved Hide resolved
require(startingDebtIndex <= synthetixState().debtLedgerLength(), "Cannot import bad data");

_recentFeePeriods[_currentFeePeriod.add(feePeriodIndex).mod(FEE_PERIOD_LENGTH)] = FeePeriod({
feePeriodId: uint64(feePeriodId),
startingDebtIndex: uint64(startingDebtIndex),
startTime: uint64(startTime),
feesToDistribute: feesToDistribute,
feesClaimed: feesClaimed,
Expand Down Expand Up @@ -580,15 +543,14 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
function feesByPeriod(address account) public view returns (uint[2][FEE_PERIOD_LENGTH] memory results) {
// What's the user's debt entry index and the debt they owe to the system at current feePeriod
uint userOwnershipPercentage;
uint debtEntryIndex;
FeePoolState _feePoolState = feePoolState();
ISynthetixDebtShare _debtShare = synthetixDebtShare();

(userOwnershipPercentage, debtEntryIndex) = _feePoolState.getAccountsDebtEntry(account, 0);
userOwnershipPercentage = _debtShare.sharePercent(account);

// If they don't have any debt ownership and they never minted, they don't have any fees.
// User ownership can reduce to 0 if user burns all synths,
// however they could have fees applicable for periods they had minted in before so we check debtEntryIndex.
if (debtEntryIndex == 0 && userOwnershipPercentage == 0) {
if (userOwnershipPercentage == 0) {
Copy link
Contributor

Choose a reason for hiding this comment

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

@dbeal-eth Have to be careful here that they can still claim previous fee periods even if they now have burned all their debt / no current debt shares %.

This is why it checked that their debtEntryIndex == 0 as well which meant they never minted debt before.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

is there a unit test, or an easy way to write one?

Copy link
Contributor

Choose a reason for hiding this comment

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

I think best way to test is

  • Mint sUSD in period 1
  • Close period 1
  • Should have rewards / fees claimable in period 1
  • Burn all debt
  • Should still have rewards / fees claimable in period 1

uint[2][FEE_PERIOD_LENGTH] memory nullResults;
return nullResults;
}
Expand All @@ -597,7 +559,7 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
// fees owing for, so we need to report on it anyway.
uint feesFromPeriod;
uint rewardsFromPeriod;
(feesFromPeriod, rewardsFromPeriod) = _feesAndRewardsFromPeriod(0, userOwnershipPercentage, debtEntryIndex);
(feesFromPeriod, rewardsFromPeriod) = _feesAndRewardsFromPeriod(0, userOwnershipPercentage);

results[0][0] = feesFromPeriod;
results[0][1] = rewardsFromPeriod;
Expand All @@ -608,22 +570,16 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
// Go through our fee periods from the oldest feePeriod[FEE_PERIOD_LENGTH - 1] and figure out what we owe them.
// Condition checks for periods > 0
for (uint i = FEE_PERIOD_LENGTH - 1; i > 0; i--) {
uint next = i - 1;
uint nextPeriodStartingDebtIndex = _recentFeePeriodsStorage(next).startingDebtIndex;

// We can skip the period, as no debt minted during period (next period's startingDebtIndex is still 0)
dbeal-eth marked this conversation as resolved.
Show resolved Hide resolved
if (nextPeriodStartingDebtIndex > 0 && lastFeeWithdrawal < _recentFeePeriodsStorage(i).feePeriodId) {
// We calculate a feePeriod's closingDebtIndex by looking at the next feePeriod's startingDebtIndex
// we can use the most recent issuanceData[0] for the current feePeriod
// else find the applicableIssuanceData for the feePeriod based on the StartingDebtIndex of the period
uint closingDebtIndex = uint256(nextPeriodStartingDebtIndex).sub(1);
if (lastFeeWithdrawal < _recentFeePeriodsStorage(i).feePeriodId) {

// Gas optimisation - to reuse debtEntryIndex if found new applicable one
dbeal-eth marked this conversation as resolved.
Show resolved Hide resolved
// if applicable is 0,0 (none found) we keep most recent one from issuanceData[0]
// return if userOwnershipPercentage = 0)
(userOwnershipPercentage, debtEntryIndex) = _feePoolState.applicableIssuanceData(account, closingDebtIndex);
userOwnershipPercentage = _debtShare.sharePercentOnPeriod(account, uint(_recentFeePeriodsStorage(i).startTime));

(feesFromPeriod, rewardsFromPeriod) = _feesAndRewardsFromPeriod(i, userOwnershipPercentage, debtEntryIndex);
(feesFromPeriod, rewardsFromPeriod) = _feesAndRewardsFromPeriod(i, userOwnershipPercentage);

results[i][0] = feesFromPeriod;
results[i][1] = rewardsFromPeriod;
Expand All @@ -641,62 +597,29 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
*/
function _feesAndRewardsFromPeriod(
uint period,
uint ownershipPercentage,
uint debtEntryIndex
uint ownershipPercentage
) internal view returns (uint, uint) {
// If it's zero, they haven't issued, and they have no fees OR rewards.
if (ownershipPercentage == 0) return (0, 0);

uint debtOwnershipForPeriod = ownershipPercentage;

// If period has closed we want to calculate debtPercentage for the period
if (period > 0) {
uint closingDebtIndex = uint256(_recentFeePeriodsStorage(period - 1).startingDebtIndex).sub(1);
debtOwnershipForPeriod = _effectiveDebtRatioForPeriod(closingDebtIndex, ownershipPercentage, debtEntryIndex);
}

// Calculate their percentage of the fees / rewards in this period
// This is a high precision integer.
uint feesFromPeriod = _recentFeePeriodsStorage(period).feesToDistribute.multiplyDecimal(debtOwnershipForPeriod);
uint feesFromPeriod = _recentFeePeriodsStorage(period).feesToDistribute.multiplyDecimal(ownershipPercentage);

uint rewardsFromPeriod =
_recentFeePeriodsStorage(period).rewardsToDistribute.multiplyDecimal(debtOwnershipForPeriod);
_recentFeePeriodsStorage(period).rewardsToDistribute.multiplyDecimal(ownershipPercentage);

return (feesFromPeriod.preciseDecimalToDecimal(), rewardsFromPeriod.preciseDecimalToDecimal());
}

function _effectiveDebtRatioForPeriod(
uint closingDebtIndex,
uint ownershipPercentage,
uint debtEntryIndex
) internal view returns (uint) {
// Figure out their global debt percentage delta at end of fee Period.
// This is a high precision integer.
ISynthetixState _synthetixState = synthetixState();
uint feePeriodDebtOwnership =
_synthetixState
.debtLedger(closingDebtIndex)
.divideDecimalRoundPrecise(_synthetixState.debtLedger(debtEntryIndex))
.multiplyDecimalRoundPrecise(ownershipPercentage);

return feePeriodDebtOwnership;
return (feesFromPeriod, rewardsFromPeriod);
}

function effectiveDebtRatioForPeriod(address account, uint period) external view returns (uint) {
require(period != 0, "Current period is not closed yet");
require(period < FEE_PERIOD_LENGTH, "Exceeds the FEE_PERIOD_LENGTH");

// If the period being checked is uninitialised then return 0. This is only at the start of the system.
if (_recentFeePeriodsStorage(period - 1).startingDebtIndex == 0) return 0;

uint closingDebtIndex = uint256(_recentFeePeriodsStorage(period - 1).startingDebtIndex).sub(1);

uint ownershipPercentage;
uint debtEntryIndex;
(ownershipPercentage, debtEntryIndex) = feePoolState().applicableIssuanceData(account, closingDebtIndex);
if (_recentFeePeriodsStorage(period - 1).startTime == 0) return 0;

// internal function will check closingDebtIndex has corresponding debtLedger entry
return _effectiveDebtRatioForPeriod(closingDebtIndex, ownershipPercentage, debtEntryIndex);
return synthetixDebtShare().sharePercentOnPeriod(account, uint(_recentFeePeriods[period].startTime));
}

/**
Expand Down Expand Up @@ -739,10 +662,9 @@ contract FeePool is Owned, Proxyable, LimitedSetup, MixinSystemSettings, IFeePoo
_;
}

modifier onlyIssuerAndSynthetixState {
modifier onlyIssuer {
bool isIssuer = msg.sender == address(issuer());
bool isSynthetixState = msg.sender == address(synthetixState());
require(isIssuer || isSynthetixState, "Issuer and SynthetixState only");
require(isIssuer, "Issuer only");
_;
}

dbeal-eth marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
Loading