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

Implement StableSwapPayoutHandler #17

Merged
merged 26 commits into from
Sep 25, 2024
Merged
Show file tree
Hide file tree
Changes from 23 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
115 changes: 88 additions & 27 deletions contracts/ERC4626CashFlowLender.sol
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ contract ERC4626CashFlowLender is AccessControlUpgradeable, UUPSUpgradeable, ERC
bytes32 public constant BORROWER_ROLE = keccak256("BORROWER_ROLE");
bytes32 public constant CUSTOMER_ROLE = keccak256("CUSTOMER_ROLE");
bytes32 public constant GUARDIAN_ROLE = keccak256("GUARDIAN_ROLE");
bytes32 public constant OWN_POLICY_CREATOR_ROLE = keccak256("OWN_POLICY_CREATOR_ROLE");
bytes32 public constant POLICY_CREATOR_ROLE = keccak256("POLICY_CREATOR_ROLE");
bytes32 public constant RESOLVER_ROLE = keccak256("RESOLVER_ROLE");

Expand Down Expand Up @@ -309,6 +310,38 @@ contract ERC4626CashFlowLender is AccessControlUpgradeable, UUPSUpgradeable, ERC
return policyId;
}

function newPolicyOnBehalfOf(
address riskModule_,
uint256 payout,
uint256 premium,
uint256 lossProb,
uint40 expiration,
address onBehalfOf,
uint256 bucketId,
bytes32 policyData,
bytes32 quoteSignatureR,
bytes32 quoteSignatureVS,
uint40 quoteValidUntil
) external onlyRole(OWN_POLICY_CREATOR_ROLE) returns (uint256 policyId) {
uint256 balanceBefore = _balance();
_newPolicy(
riskModule_,
payout,
premium,
lossProb,
expiration,
onBehalfOf,
bucketId,
policyData,
quoteSignatureR,
quoteSignatureVS,
quoteValidUntil
);
// Increases the debt
_increaseDebt(balanceBefore - _balance());
return policyId;
}

/**
* @dev Creates several policies paid by this contract and increases the debt.
*
Expand All @@ -333,39 +366,67 @@ contract ERC4626CashFlowLender is AccessControlUpgradeable, UUPSUpgradeable, ERC
uint40[] memory quoteValidUntil
) external onlyRole(POLICY_CREATOR_ROLE) {
uint256 balanceBefore = _balance();

for (uint256 i = 0; i < payout.length; i++) {
if (bucketId[i] == type(uint256).max) {
SignedQuoteRiskModule(riskModules[i]).newPolicy(
payout[i],
premium[i],
lossProb[i],
expiration[i],
address(this),
policyData[i],
quoteSignatureR[i],
quoteSignatureVS[i],
quoteValidUntil[i]
);
} else {
SignedBucketRiskModule(riskModules[i]).newPolicy(
payout[i],
premium[i],
lossProb[i],
expiration[i],
address(this),
policyData[i],
bucketId[i],
quoteSignatureR[i],
quoteSignatureVS[i],
quoteValidUntil[i]
);
}
_newPolicy(
riskModules[i],
payout[i],
premium[i],
lossProb[i],
expiration[i],
address(this),
bucketId[i],
policyData[i],
quoteSignatureR[i],
quoteSignatureVS[i],
quoteValidUntil[i]
);
}
// Increases the debt
_increaseDebt(balanceBefore - _balance());
}

function _newPolicy(
address riskModule_,
uint256 payout,
uint256 premium,
uint256 lossProb,
uint40 expiration,
address onBehalfOf,
uint256 bucketId,
bytes32 policyData,
bytes32 quoteSignatureR,
bytes32 quoteSignatureVS,
uint40 quoteValidUntil
) internal returns (uint256 policyId) {
if (bucketId == type(uint256).max) {
policyId = SignedQuoteRiskModule(riskModule_).newPolicy(
payout,
premium,
lossProb,
expiration,
onBehalfOf,
policyData,
quoteSignatureR,
quoteSignatureVS,
quoteValidUntil
);
} else {
policyId = SignedBucketRiskModule(riskModule_).newPolicy(
payout,
premium,
lossProb,
expiration,
onBehalfOf,
policyData,
bucketId,
quoteSignatureR,
quoteSignatureVS,
quoteValidUntil
);
}
return policyId;
}

/**
* @dev Creates a new policy paid by this contract and increases the debt. See {SignedQuoteRiskModule.newPolicy}
*
Expand Down
Loading
Loading