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

Feature/lender commitment groups #137

Open
wants to merge 147 commits into
base: feature/optimize-market-registry-terms
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
147 commits
Select commit Hold shift + click to select a range
f00a686
draft contract compiles
ethereumdegen Oct 20, 2023
f68881c
add
ethereumdegen Oct 20, 2023
e0bb718
compiles
ethereumdegen Oct 20, 2023
bfaf344
commment
ethereumdegen Oct 20, 2023
8a5df19
add
ethereumdegen Oct 24, 2023
d165dd1
drafting smart commitment forwarder
ethereumdegen Oct 26, 2023
e988712
compiles
ethereumdegen Oct 26, 2023
8e49cba
writing new group contract
ethereumdegen Oct 26, 2023
25738d6
simplified math
ethereumdegen Oct 26, 2023
9e85e5d
math is way simpler
ethereumdegen Oct 26, 2023
2f5fd5e
add fn
ethereumdegen Oct 26, 2023
3fe036f
adding to collector
ethereumdegen Oct 26, 2023
610ffb1
adding draft code
ethereumdegen Oct 31, 2023
9bd7171
addingn otes
ethereumdegen Oct 31, 2023
ef6e7cf
fixing build
ethereumdegen Oct 31, 2023
5153d5f
fixing
ethereumdegen Nov 1, 2023
547729c
fixing compilation
ethereumdegen Nov 1, 2023
865cbf4
compiles but need to add in observer
ethereumdegen Nov 1, 2023
4646f47
add repayment callback
ethereumdegen Nov 1, 2023
bdee545
adding documentation
ethereumdegen Nov 2, 2023
9bf918f
fixing
ethereumdegen Nov 2, 2023
1c75722
compiles
ethereumdegen Nov 2, 2023
05ff6c8
todo
ethereumdegen Nov 2, 2023
e21092a
add fn for twap
ethereumdegen Nov 3, 2023
c8d7b6d
improving factory
ethereumdegen Nov 3, 2023
053c11b
adding
ethereumdegen Nov 3, 2023
7a3d1be
add test
ethereumdegen Nov 6, 2023
0382f26
update
ethereumdegen Nov 6, 2023
d921981
exchange rate based on interest collectd
ethereumdegen Nov 6, 2023
d7ca0a2
fix ratio
ethereumdegen Nov 6, 2023
4f0ddec
make test more clear
ethereumdegen Nov 6, 2023
1fc3f9c
adding to tests
ethereumdegen Nov 6, 2023
e3636ed
test no longer reverts
ethereumdegen Nov 7, 2023
cf44fa0
adding logic
ethereumdegen Nov 7, 2023
3e304f9
merge
ethereumdegen Nov 8, 2023
aeff817
fixing
ethereumdegen Nov 8, 2023
3caeebf
add
ethereumdegen Nov 8, 2023
3cf7885
tests work better
ethereumdegen Nov 8, 2023
b5bec6b
tests pass
ethereumdegen Nov 8, 2023
b7f640a
test for lender accept and fixes bugs
ethereumdegen Nov 9, 2023
a345567
fixing tests
ethereumdegen Nov 9, 2023
19ef9c6
add
ethereumdegen Nov 9, 2023
8ee2bfb
compiles
ethereumdegen Nov 9, 2023
36f4169
compiles
ethereumdegen Nov 9, 2023
b02da5a
adding price oracle
ethereumdegen Nov 9, 2023
efe9e5f
adding test for price oracle
ethereumdegen Nov 9, 2023
65610f7
fix logic for ratio
ethereumdegen Nov 10, 2023
d3b8a73
add notes
ethereumdegen Nov 10, 2023
3b1c296
deployed smart commitment forwarder
ethereumdegen Nov 24, 2023
e012115
compiles
ethereumdegen Nov 24, 2023
84422bd
add to depoy script
ethereumdegen Nov 24, 2023
743bb79
deployed smart group
ethereumdegen Nov 28, 2023
d4608e0
tests dont pass
ethereumdegen Nov 30, 2023
1eea2e3
tests pass
ethereumdegen Nov 30, 2023
990a4ef
fixed price calc
ethereumdegen Nov 30, 2023
234430f
fixed amth overflow issue
ethereumdegen Nov 30, 2023
3421be1
getting weird error
ethereumdegen Nov 30, 2023
479daea
cant do upgrade
ethereumdegen Nov 30, 2023
6dfcaae
callable not owner
ethereumdegen Nov 30, 2023
6a35114
push upgrade
ethereumdegen Nov 30, 2023
7dc24a2
fix div by zero issue
ethereumdegen Dec 5, 2023
31fe7f3
fixing approval issue
ethereumdegen Dec 5, 2023
5cb527e
compiles but test fail
ethereumdegen Dec 6, 2023
ac855db
fixing tests
ethereumdegen Dec 6, 2023
6ab40c2
tests compile
ethereumdegen Dec 6, 2023
edc5f9c
trying to verify
ethereumdegen Dec 6, 2023
c47e6fc
verif
ethereumdegen Dec 6, 2023
0a4a1cc
logic change for approval
ethereumdegen Dec 6, 2023
5d86212
Merge branch 'feature/lender-commitment-groups' of github.com:teller-…
ethereumdegen Dec 6, 2023
7935c66
tried to upgrade
ethereumdegen Dec 7, 2023
5af039d
updated sep
ethereumdegen Dec 7, 2023
aeaaca8
updating SCF
ethereumdegen Dec 7, 2023
b2a3d23
fmt
ethereumdegen Dec 7, 2023
040c04e
works
ethereumdegen Dec 7, 2023
3deeb7a
comments
ethereumdegen Dec 12, 2023
cd9cbd9
add notes
ethereumdegen Dec 15, 2023
269c881
adding method to LCF
ethereumdegen Dec 21, 2023
7b6f9c9
add skip to deploy scripts
ethereumdegen Dec 21, 2023
b093580
improve call flow
ethereumdegen Jan 4, 2024
fa69568
main contracts compile
ethereumdegen Jan 4, 2024
41f05f4
improving tests
ethereumdegen Jan 4, 2024
db029fd
fixed test
ethereumdegen Jan 4, 2024
6b78891
change v
ethereumdegen Jan 4, 2024
d0e6a47
add twap code
ethereumdegen Jan 4, 2024
c432260
twap code compiles
ethereumdegen Jan 4, 2024
990a8c4
improving test for observe twap
ethereumdegen Jan 5, 2024
2d77431
tests pas s
ethereumdegen Jan 5, 2024
c541099
deploy upgrade of group to sepolia
ethereumdegen Jan 31, 2024
d47775c
fixes to contract
ethereumdegen Jan 31, 2024
346ca02
fixing mock
ethereumdegen Feb 2, 2024
01bb42a
tests pass
ethereumdegen Feb 2, 2024
9aee2f5
twap interval is input
ethereumdegen Feb 2, 2024
54b35b7
redeploy lender group smart
ethereumdegen Feb 2, 2024
96b2ed7
update smart forwarder on sep
ethereumdegen Feb 2, 2024
c6ef88c
update group contract on sepolia
ethereumdegen Feb 2, 2024
f203e72
fixing with expansion
ethereumdegen Feb 2, 2024
0d93943
adding code for swap proposal
ethereumdegen Feb 5, 2024
e05b6aa
adding to swap
ethereumdegen Feb 5, 2024
bd8d85e
adding to swap auction
ethereumdegen Feb 6, 2024
b21c2bb
add nots
ethereumdegen Feb 6, 2024
6ab4464
add notes
ethereumdegen Feb 6, 2024
b2567d3
change share ratio c
ethereumdegen Feb 6, 2024
24c86d1
change logic of shares exang rate
ethereumdegen Feb 6, 2024
fb41392
add comments
ethereumdegen Feb 6, 2024
ddf55bd
adding liquidation w incentive
ethereumdegen Feb 7, 2024
bf69f1e
building fn for liquidate assist
ethereumdegen Feb 7, 2024
59d278a
adding to claim interface
ethereumdegen Feb 8, 2024
cb67692
fixing math in samrt
ethereumdegen Feb 8, 2024
267f7f0
fixing oimpl
ethereumdegen Feb 9, 2024
f3f2a44
tests compile
ethereumdegen Feb 9, 2024
1dc29a7
adding to interface
ethereumdegen Feb 9, 2024
76d0fcb
fixing div by 0 rrors
ethereumdegen Feb 9, 2024
efa3f4f
fixing tests
ethereumdegen Feb 9, 2024
7cabd4e
fixed tests
ethereumdegen Feb 12, 2024
f64dd4d
fixing up tests
ethereumdegen Feb 12, 2024
1e402b5
tests for calculations
ethereumdegen Feb 12, 2024
0e569e5
adding to contract
ethereumdegen Feb 13, 2024
7049206
add
ethereumdegen Feb 13, 2024
42884a9
adding many mock fns
ethereumdegen Feb 14, 2024
42f1399
initial tests for liquidate pass now
ethereumdegen Feb 14, 2024
761a2d7
add
ethereumdegen Feb 15, 2024
ae877e1
add to test
ethereumdegen Feb 15, 2024
5aaa20f
another test pass
ethereumdegen Feb 15, 2024
32f6d37
new tests pass and chck for values
ethereumdegen Feb 15, 2024
73c349e
negative test
ethereumdegen Feb 16, 2024
5c49e3a
add note
ethereumdegen Feb 16, 2024
fd10fc2
improve test
ethereumdegen Feb 16, 2024
b6e6657
add to tests
ethereumdegen Feb 16, 2024
69a5e19
smaller size for contract
ethereumdegen Feb 19, 2024
37319c6
deploy sep
ethereumdegen Feb 20, 2024
608f9ee
fix test
ethereumdegen Feb 22, 2024
d20fac2
respond to udai feedback
ethereumdegen Feb 23, 2024
09facf9
fix compilation
ethereumdegen Feb 23, 2024
809cef7
tests pass
ethereumdegen Feb 23, 2024
d6c34c5
add notes
ethereumdegen Feb 23, 2024
5c87a6f
fixing shares amt math
ethereumdegen Feb 23, 2024
37f86e9
add test
ethereumdegen Feb 23, 2024
2d43b2a
notes
ethereumdegen Feb 23, 2024
66c4f23
fixing fn
ethereumdegen Feb 26, 2024
df89b61
add
ethereumdegen Feb 27, 2024
afbfc9d
Merge branch 'feature/lender-commitment-groups' of github.com:teller-…
ethereumdegen Feb 27, 2024
0cb1b04
restructure tests
ethereumdegen Feb 27, 2024
1a0f9e4
clean comments
ethereumdegen Feb 27, 2024
82aab30
adding pauseable
ethereumdegen Feb 27, 2024
171c2db
expanding by uni exp factor now
ethereumdegen Feb 27, 2024
56718bd
unit tests
ethereumdegen Feb 27, 2024
0dcca27
add comment
ethereumdegen Mar 5, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
pragma solidity ^0.8.0;

import "../interfaces/ILenderCommitmentForwarder.sol";
import "./LenderCommitmentForwarder_G3.sol";
import "./LenderCommitmentForwarder_G4.sol";

contract LenderCommitmentForwarderStaging is
ILenderCommitmentForwarder,
LenderCommitmentForwarder_G3
LenderCommitmentForwarder_G4
{
constructor(address _tellerV2, address _marketRegistry)
LenderCommitmentForwarder_G3(_tellerV2, _marketRegistry)
LenderCommitmentForwarder_G4(_tellerV2, _marketRegistry)
{
// we only want this on an proxy deployment so it only affects the impl
_disableInitializers();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
pragma solidity >=0.8.0 <0.9.0;
// SPDX-License-Identifier: MIT

// Contracts
import "./LenderCommitmentForwarder_G3.sol";
import "./extensions/ExtensionsContextUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

contract LenderCommitmentForwarder_G4 is
LenderCommitmentForwarder_G3
{
/// @custom:oz-upgrades-unsafe-allow constructor
constructor(address _tellerV2, address _marketRegistry)
LenderCommitmentForwarder_G3(_tellerV2, _marketRegistry)
{}




function updateCommitmentMaxPrincipal(
uint256 _commitmentId,
uint256 _maxPrincipal
) public commitmentLender(_commitmentId) {

Commitment storage _commitment = commitments[_commitmentId];

_commitment.maxPrincipal = _maxPrincipal;

validateCommitment(_commitment);

emit UpdatedCommitment(
_commitmentId,
_commitment.lender,
_commitment.marketId,
_commitment.principalTokenAddress,
_commitment.maxPrincipal
);

}

function updateCommitmentExpiration(
uint256 _commitmentId,
uint32 _expiration
) public commitmentLender(_commitmentId) {

Commitment storage _commitment = commitments[_commitmentId];

_commitment.expiration = _expiration;

validateCommitment(_commitment);

emit UpdatedCommitment(
_commitmentId,
_commitment.lender,
_commitment.marketId,
_commitment.principalTokenAddress,
_commitment.maxPrincipal
);
}

function updateCommitmentMaxLoanDuration(
uint256 _commitmentId,
uint32 _duration
) public commitmentLender(_commitmentId) {

Commitment storage _commitment = commitments[_commitmentId];

_commitment.maxDuration = _duration;

validateCommitment(_commitment);

emit UpdatedCommitment(
_commitmentId,
_commitment.lender,
_commitment.marketId,
_commitment.principalTokenAddress,
_commitment.maxPrincipal
);

}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;


import "../TellerV2MarketForwarder_G3.sol";

import "../interfaces/ILenderCommitmentForwarder.sol";
import "./LenderCommitmentForwarder_G1.sol";

import {CommitmentCollateralType, ISmartCommitment } from "../interfaces/ISmartCommitment.sol";
/*

Borrower approves this contract as being able to create loans on THEIR Behalf.

via
_submitBidWithCollateral
and _acceptBid


*/



contract SmartCommitmentForwarder is
TellerV2MarketForwarder_G3
{

event ExercisedSmartCommitment(
address indexed smartCommitmentAddress,
address borrower,
uint256 tokenAmount,
uint256 bidId
);

error InsufficientBorrowerCollateral(uint256 required, uint256 actual);


constructor(address _protocolAddress, address _marketRegistry)
TellerV2MarketForwarder_G3(_protocolAddress, _marketRegistry)
{

}


//register a smart contract (lender group) ? necessary ?
//maybe that contract just approves tokens to this contract ?
/*function registerSmartCommitment( ) external {

}*/

/**
* @notice Accept the commitment to submitBid and acceptBid using the funds
* @dev LoanDuration must be longer than the market payment cycle
* @param _smartCommitmentAddress The address of the smart commitment contract.
* @param _principalAmount The amount of currency to borrow for the loan.
* @param _collateralAmount The amount of collateral to use for the loan.
* @param _collateralTokenId The tokenId of collateral to use for the loan if ERC721 or ERC1155.
* @param _collateralTokenAddress The contract address to use for the loan collateral tokens.
* @param _recipient The address to receive the loan funds.
* @param _interestRate The interest rate APY to use for the loan in basis points.
* @param _loanDuration The overall duration for the loan. Must be longer than market payment cycle duration.
* @return bidId The ID of the loan that was created on TellerV2
*/
function acceptCommitmentWithRecipient(
address _smartCommitmentAddress,
uint256 _principalAmount,
uint256 _collateralAmount,
uint256 _collateralTokenId,
address _collateralTokenAddress,
address _recipient,
uint16 _interestRate,
uint32 _loanDuration
) public returns (uint256 bidId) {
require(
ISmartCommitment( _smartCommitmentAddress ).getCollateralTokenType() <=
CommitmentCollateralType.ERC1155_ANY_ID,
"Invalid commitment collateral type"
);



return
_acceptCommitment(
_smartCommitmentAddress,
_principalAmount,
_collateralAmount,
_collateralTokenId,
_collateralTokenAddress,
_recipient,
_interestRate,
_loanDuration
);
}

function _acceptCommitment(
address _smartCommitmentAddress,
uint256 _principalAmount,
uint256 _collateralAmount,
uint256 _collateralTokenId,
address _collateralTokenAddress,
address _recipient,
uint16 _interestRate,
uint32 _loanDuration
) internal returns (uint256 bidId) {
ISmartCommitment _commitment = ISmartCommitment(_smartCommitmentAddress);


_commitment.acceptFundsForAcceptBid(
_msgSender(), //borrower


_principalAmount,

_collateralAmount,
_collateralTokenAddress,
_collateralTokenId,
_loanDuration,
_interestRate

);


CreateLoanArgs memory createLoanArgs;


createLoanArgs.marketId = _commitment.getMarketId();
createLoanArgs.lendingToken = _commitment.getPrincipalTokenAddress();
createLoanArgs.principal = _principalAmount;
createLoanArgs.duration = _loanDuration;
createLoanArgs.interestRate = _interestRate;
createLoanArgs.recipient = _recipient;


CommitmentCollateralType commitmentCollateralTokenType = _commitment.getCollateralTokenType();


if (commitmentCollateralTokenType != CommitmentCollateralType.NONE) {
createLoanArgs.collateral = new Collateral[](1);
createLoanArgs.collateral[0] = Collateral({
_collateralType: _getEscrowCollateralType(
commitmentCollateralTokenType
),
_tokenId: _collateralTokenId,
_amount: _collateralAmount,
_collateralAddress: _collateralTokenAddress // commitment.collateralTokenAddress
});
}

bidId = _submitBidWithCollateral(createLoanArgs, _msgSender());

_acceptBidWithRepaymentListener(
bidId,
_smartCommitmentAddress, //the lender is the smart commitment contract
_smartCommitmentAddress
);

emit ExercisedSmartCommitment(
_smartCommitmentAddress,
_msgSender(),
_principalAmount,
bidId
);
}


/**
* @notice Return the collateral type based on the commitmentcollateral type. Collateral type is used in the base lending protocol.
* @param _type The type of collateral to be used for the loan.
*/
function _getEscrowCollateralType(CommitmentCollateralType _type)
internal
pure
returns (CollateralType)
{
if (_type == CommitmentCollateralType.ERC20) {
return CollateralType.ERC20;
}
if (
_type == CommitmentCollateralType.ERC721 ||
_type == CommitmentCollateralType.ERC721_ANY_ID ||
_type == CommitmentCollateralType.ERC721_MERKLE_PROOF
) {
return CollateralType.ERC721;
}
if (
_type == CommitmentCollateralType.ERC1155 ||
_type == CommitmentCollateralType.ERC1155_ANY_ID ||
_type == CommitmentCollateralType.ERC1155_MERKLE_PROOF
) {
return CollateralType.ERC1155;
}

revert("Unknown Collateral Type");
}

}
Loading