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

Lender Manager NFT Art #109

Open
wants to merge 37 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
896a040
adding nft art code
ethereumdegen Jun 28, 2023
cbe2eda
fixing
ethereumdegen Jun 28, 2023
6900a1f
Merge branch 'contracts/feature/gnosis-deployment' into contracts/fea…
ethereumdegen Jun 28, 2023
1823496
fixing
ethereumdegen Jun 28, 2023
af58b9c
merging
ethereumdegen Jun 28, 2023
92b1772
fixing imports
ethereumdegen Jun 28, 2023
d0ce266
adding duration format
ethereumdegen Jun 28, 2023
f8d5e95
improving format
ethereumdegen Jun 29, 2023
46dc8fe
rendering collateral data now
ethereumdegen Jun 29, 2023
d3af4e7
update art
ethereumdegen Jun 29, 2023
02a4345
comment
ethereumdegen Jun 29, 2023
ef52f97
adding tests
ethereumdegen Jun 29, 2023
ac87d9d
adding tests
ethereumdegen Jun 29, 2023
b0a5a29
Merge remote-tracking branch 'origin/contracts/feature/gnosis-deploym…
ethereumdegen Jul 5, 2023
34052c6
adding deploy script
ethereumdegen Jul 6, 2023
1b267ac
added library to script
ethereumdegen Jul 6, 2023
6d41b4d
Update 02_lender_manager_art.ts
ethereumdegen Jul 6, 2023
4ba8701
Update .migrations.json
ethereumdegen Jul 6, 2023
43b38f8
Update goerli.json
ethereumdegen Jul 6, 2023
08bc50f
fix get loan information
ethereumdegen Jul 6, 2023
fab0021
format
ethereumdegen Jul 10, 2023
f654602
Update packages/contracts/contracts/LenderManager.sol
ethereumdegen Jul 10, 2023
e2d7cbe
Update packages/contracts/contracts/LenderManager.sol
ethereumdegen Jul 10, 2023
b64c045
Update packages/contracts/contracts/libraries/LenderManagerArt.sol
ethereumdegen Jul 10, 2023
136198b
Update packages/contracts/contracts/libraries/LenderManagerArt.sol
ethereumdegen Jul 10, 2023
6aa61f1
Update packages/contracts/contracts/libraries/LenderManagerArt.sol
ethereumdegen Jul 10, 2023
cd3e871
Update packages/contracts/contracts/libraries/LenderManagerArt.sol
ethereumdegen Jul 10, 2023
8e8d98d
merge
ethereumdegen Jul 10, 2023
2572f40
merge
ethereumdegen Jul 10, 2023
d499fac
update deploy script
ethereumdegen Jul 10, 2023
e8c8cf4
Update packages/contracts/deployments/goerli/.migrations.json
ethereumdegen Jul 10, 2023
5553971
Merge branch 'feature/lender-commitment-merkle-proof' into contracts/…
passabilities Jul 10, 2023
2db6f32
format
passabilities Jul 10, 2023
847072e
remove uri
ethereumdegen Jul 10, 2023
c30904a
fully remove uri
passabilities Jul 11, 2023
197453d
Merge branch 'develop' into contracts/feature/lender-manager-art
ethereumdegen Aug 15, 2023
de070b5
merge
ethereumdegen Aug 15, 2023
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
408 changes: 408 additions & 0 deletions packages/contracts/.openzeppelin/goerli.json

Large diffs are not rendered by default.

113 changes: 112 additions & 1 deletion packages/contracts/contracts/LenderManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,26 @@ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";

import "@openzeppelin/contracts/utils/Base64.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

// Interfaces
import "./interfaces/ILenderManager.sol";
import "./interfaces/ITellerV2.sol";
import "./interfaces/ITellerV2Storage.sol";
import "./interfaces/ICollateralManager.sol";
import "./interfaces/IMarketRegistry.sol";

import { LenderManagerArt } from "./libraries/LenderManagerArt.sol";
import { CollateralType, Collateral } from "./interfaces/escrow/ICollateralEscrowV1.sol";

contract LenderManager is
Initializable,
OwnableUpgradeable,
ERC721Upgradeable,
ILenderManager
{
// using Strings for uint256;
IMarketRegistry public immutable marketRegistry;

constructor(IMarketRegistry _marketRegistry) {
Expand Down Expand Up @@ -79,6 +88,108 @@ contract LenderManager is
}

function _baseURI() internal view override returns (string memory) {
return "";
return "data:image/svg+xml;charset=utf-8,";
}

struct LoanInformation {
address principalTokenAddress;
uint256 principalAmount;
uint16 interestRate;
uint32 loanDuration;
}

function _getLoanInformation(uint256 tokenId)
internal
view
returns (LoanInformation memory loanInformation_)
{
Bid memory bid = ITellerV2Storage(owner()).bids(tokenId);

loanInformation_ = LoanInformation({
principalTokenAddress: address(bid.loanDetails.lendingToken),
principalAmount: bid.loanDetails.principal,
interestRate: bid.terms.APR,
loanDuration: bid.loanDetails.loanDuration
});
}

function _getCollateralInformation(uint256 tokenId)
internal
view
returns (Collateral memory collateral_)
{
address collateralManager = ITellerV2Storage(owner())
.collateralManager();

Collateral[] memory collateralArray = ICollateralManager(
collateralManager
).getCollateralInfo(tokenId);

if (collateralArray.length == 0) {
return
Collateral({
_amount: 0,
_collateralAddress: address(0),
_collateralType: CollateralType.ERC20,
_tokenId: 0
});
}

return collateralArray[0];
}

function tokenURI(uint256 tokenId)
public
view
override
returns (string memory)
{
require(
_exists(tokenId),
"ERC721Metadata: URI query for nonexistent token"
);

LoanInformation memory loanInformation = _getLoanInformation(tokenId);

Collateral memory collateral = _getCollateralInformation(tokenId);

string memory image_svg_encoded = Base64.encode(
bytes(
LenderManagerArt.generateSVG(
tokenId, //tokenId == bidId
loanInformation.principalAmount,
loanInformation.principalTokenAddress,
collateral,
loanInformation.interestRate,
loanInformation.loanDuration
)
)
);

string memory name = "Teller Loan NFT";
string
memory description = "This token represents ownership of a loan. Repayments of principal and interest will be sent to the owner of this token. If the loan defaults, the owner of this token will be able to claim the underlying collateral. Please externally verify the parameter of the loan as this rendering is only a summary.";

string memory encoded_svg = string(
abi.encodePacked(
"data:application/json;base64,",
Base64.encode(
bytes(
abi.encodePacked(
'{"name":"',
name,
'", "description":"',
description,
'", "image": "',
"data:image/svg+xml;base64,",
image_svg_encoded,
'"}'
)
)
)
)
);

return encoded_svg;
}
}
7 changes: 7 additions & 0 deletions packages/contracts/contracts/interfaces/ITellerV2Storage.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { Bid } from "../TellerV2Storage.sol";

interface ITellerV2Storage {
function bids(uint256 _bidId) external view returns (Bid memory);

function collateralManager() external view returns (address);
}
Loading