Skip to content

Commit

Permalink
feat(fungible-proposal): change credit amount computing function visi…
Browse files Browse the repository at this point in the history
…bility to public
  • Loading branch information
ashhanai committed Mar 25, 2024
1 parent 3091405 commit aa27f9a
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 11 deletions.
16 changes: 11 additions & 5 deletions src/loan/terms/simple/proposal/PWNSimpleLoanFungibleProposal.sol
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,16 @@ contract PWNSimpleLoanFungibleProposal is PWNSimpleLoanProposal {
emit ProposalMade(proposalHash, proposal.proposer, proposal);
}

/**
* @notice Compute credit amount from collateral amount and credit per collateral unit.
* @param collateralAmount Amount of collateral.
* @param creditPerCollateralUnit Amount of credit per collateral unit with 38 decimals.
* @return Amount of credit.
*/
function getCreditAmount(uint256 collateralAmount, uint256 creditPerCollateralUnit) public pure returns (uint256) {
return Math.mulDiv(collateralAmount, creditPerCollateralUnit, CREDIT_PER_COLLATERAL_UNIT_DENOMINATOR);
}

/**
* @notice Accept a proposal.
* @param proposal Proposal struct containing all proposal data.
Expand Down Expand Up @@ -287,7 +297,7 @@ contract PWNSimpleLoanFungibleProposal is PWNSimpleLoanProposal {
}

// Calculate credit amount
uint256 creditAmount = _creditAmount(proposalValues.collateralAmount, proposal.creditPerCollateralUnit);
uint256 creditAmount = getCreditAmount(proposalValues.collateralAmount, proposal.creditPerCollateralUnit);

// Try to accept proposal
proposalHash = _tryAcceptProposal(proposal, creditAmount, signature);
Expand All @@ -296,10 +306,6 @@ contract PWNSimpleLoanFungibleProposal is PWNSimpleLoanProposal {
loanTerms = _createLoanTerms(proposal, proposalValues.collateralAmount, creditAmount);
}

function _creditAmount(uint256 collateralAmount, uint256 creditPerCollateralUnit) private pure returns (uint256) {
return Math.mulDiv(collateralAmount, creditPerCollateralUnit, CREDIT_PER_COLLATERAL_UNIT_DENOMINATOR);
}

function _tryAcceptProposal(
Proposal calldata proposal,
uint256 creditAmount,
Expand Down
29 changes: 23 additions & 6 deletions test/unit/PWNSimpleLoanFungibleProposal.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,6 @@ abstract contract PWNSimpleLoanFungibleProposalTest is PWNSimpleLoanProposalTest
));
}

function _creditAmount(uint256 collateralAmount, uint256 creditPerCollateralUnit) internal view returns (uint256) {
return Math.mulDiv(collateralAmount, creditPerCollateralUnit, proposalContract.CREDIT_PER_COLLATERAL_UNIT_DENOMINATOR());
}

function _updateProposal(Params memory _params) internal {
proposalValues.collateralAmount = _params.creditAmount;

Expand Down Expand Up @@ -224,6 +220,27 @@ contract PWNSimpleLoanFungibleProposal_MakeProposal_Test is PWNSimpleLoanFungibl
}


/*----------------------------------------------------------*|
|* # GET CREDIT AMOUNT *|
|*----------------------------------------------------------*/

contract PWNSimpleLoanFungibleProposal_GetCreditAmount_Test is PWNSimpleLoanFungibleProposalTest {

function testFuzz_shouldReturnCreditAmount(uint256 collateralAmount, uint256 creditPerCollateralUnit) external {
collateralAmount = bound(collateralAmount, 0, 1e70);
creditPerCollateralUnit = bound(
creditPerCollateralUnit, 1, collateralAmount == 0 ? type(uint256).max : type(uint256).max / collateralAmount
);

assertEq(
proposalContract.getCreditAmount(collateralAmount, creditPerCollateralUnit),
Math.mulDiv(collateralAmount, creditPerCollateralUnit, proposalContract.CREDIT_PER_COLLATERAL_UNIT_DENOMINATOR())
);
}

}


/*----------------------------------------------------------*|
|* # ACCEPT PROPOSAL *|
|*----------------------------------------------------------*/
Expand Down Expand Up @@ -300,7 +317,7 @@ contract PWNSimpleLoanFungibleProposal_AcceptProposal_Test is PWNSimpleLoanFungi
category: MultiToken.Category.ERC20,
assetAddress: proposal.creditAddress,
id: 0,
amount: _creditAmount(proposalValues.collateralAmount, proposal.creditPerCollateralUnit)
amount: proposalContract.getCreditAmount(proposalValues.collateralAmount, proposal.creditPerCollateralUnit)
}),
fixedInterestAmount: proposal.fixedInterestAmount,
accruingInterestAPR: proposal.accruingInterestAPR
Expand Down Expand Up @@ -443,7 +460,7 @@ contract PWNSimpleLoanFungibleProposal_AcceptRefinanceProposal_Test is PWNSimple
category: MultiToken.Category.ERC20,
assetAddress: proposal.creditAddress,
id: 0,
amount: _creditAmount(proposalValues.collateralAmount, proposal.creditPerCollateralUnit)
amount: proposalContract.getCreditAmount(proposalValues.collateralAmount, proposal.creditPerCollateralUnit)
}),
fixedInterestAmount: proposal.fixedInterestAmount,
accruingInterestAPR: proposal.accruingInterestAPR
Expand Down

0 comments on commit aa27f9a

Please sign in to comment.