Solidity / On-Chain Queries
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface ILocalcreditOracle {
function requestScore(
bytes calldata userProof,
address callbackContract,
bytes4 callbackSelector
) external returns (uint256 requestId);
}
contract LendingPool {
ILocalcreditOracle public immutable localcreditOracle;
uint256 public constant QUERY_FEE = 10 * 1e18; // example $CREDIT fee
mapping(uint256 => address) public pendingRequests;
mapping(address => uint256) public userMaxBorrow;
constructor(address _oracle) {
localcreditOracle = ILocalcreditOracle(_oracle);
}
function applyForLoan(bytes calldata userProof) external {
// Transfer query fee from user or pool (example: user pays)
// IERC20(CREDIT).transferFrom(msg.sender, address(this), QUERY_FEE);
uint256 requestId = localcreditOracle.requestScore(
userProof,
address(this),
this.fulfillScore.selector
);
pendingRequests[requestId] = msg.sender;
}
function fulfillScore(
uint256 requestId,
uint256 score,
string memory riskTier
) external {
require(msg.sender == address(localcreditOracle), "Unauthorized");
address borrower = pendingRequests[requestId];
require(borrower != address(0), "Invalid request");
delete pendingRequests[requestId];
// Example logic based on score
if (score >= 850) {
userMaxBorrow[borrower] = 10000 * 1e6; // $10k USDC
} else if (score >= 700) {
userMaxBorrow[borrower] = 5000 * 1e6; // $5k
} else if (score >= 500) {
userMaxBorrow[borrower] = 1000 * 1e6; // $1k with collateral
} else {
userMaxBorrow[borrower] = 0; // require full collateral
}
// Emit event or proceed with loan issuance
}
}Last updated