Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
101 changes: 101 additions & 0 deletions contracts/src/connectors/zklend.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
use starknet::ContractAddress;

#[starknet::interface]
trait IZKLend<TContractState> {
fn deposit(ref self: TContractState, token: ContractAddress, amount: felt252);
fn withdraw(ref self: TContractState, token: ContractAddress, amount: felt252);
fn get_lending_accumulator(self: @TContractState, token: ContractAddress) -> felt252;
fn get_reserve_data(self: @TContractState, token: ContractAddress) -> MarketReserveData;
}
#[derive(Drop, Serde)]
struct MarketReserveData {
enabled: bool,
decimals: felt252,
z_token_address: ContractAddress,
interest_rate_model: ContractAddress,
collateral_factor: felt252,
borrow_factor: felt252,
reserve_factor: felt252,
last_update_timestamp: felt252,
lending_accumulator: felt252,
debt_accumulator: felt252,
current_lending_rate: felt252,
current_borrowing_rate: felt252,
raw_total_debt: felt252,
flash_loan_fee: felt252,
liquidation_bonus: felt252,
debt_limit: felt252,
deposit_limit: felt252,
}

#[starknet::contract]
pub mod ZKLendConnector {
use starknet::{ContractAddress, ClassHash};
use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
use starknet::syscalls::library_call_syscall;
use starknet::SyscallResult;
use win_saved::interfaces::iyieldsource::{IYieldSource, YieldSourceData};
use super::{IZKLendDispatcher, IZKLendDispatcherTrait};

#[storage]
struct Storage {
contract_address: ContractAddress,
contract_class_hash: ClassHash
}

#[constructor]
fn constructor(
ref self: ContractState, contract_address: ContractAddress, class_hash: ClassHash
) {
self.contract_address.write(contract_address);
self.contract_class_hash.write(class_hash);
}

#[abi(embed_v0)]
impl ZKLendConnectorImpl of IYieldSource<ContractState> {
fn get_source_class_hash(self: @ContractState) -> ClassHash {
self.contract_class_hash.read()
}
fn get_source_contract_address(self: @ContractState) -> ContractAddress {
self.contract_address.read()
}
fn deposit(ref self: ContractState, token: ContractAddress, amount: felt252) {
let lib_address = self.contract_class_hash.read();
// Make the library call
library_call_syscall(
lib_address,
selector!("deposit"), // Function selector
array![token.into(), amount].span()
)
.unwrap();
}
fn withdraw(ref self: ContractState, token: ContractAddress, amount: felt252) {
let lib_address = self.contract_class_hash.read();
library_call_syscall(
lib_address,
selector!("withdraw"), // Function selector
array![token.into(), amount].span()
)
.unwrap();
}
fn withdraw_yield(ref self: ContractState, token: ContractAddress) {}
fn get_supply_pool_data(self: @ContractState, token: ContractAddress) -> YieldSourceData {
let izklend_dispatcher = IZKLendDispatcher {
contract_address: self.contract_address.read()
};
let accumulator = izklend_dispatcher.get_lending_accumulator(token);
let data = izklend_dispatcher.get_reserve_data(token);
YieldSourceData { APY: accumulator, deposit_limit: data.deposit_limit }
}
fn get_yield_generated(self: @ContractState, token: ContractAddress) -> u128 {
1000000
}
fn get_total_value_locked(self: @ContractState, token: ContractAddress) -> u128 {
100000
}
fn get_supported_assets(self: @ContractState) -> Array<ContractAddress> {
let asset_array: Array<ContractAddress> = array![];
asset_array
}
}
}
20 changes: 20 additions & 0 deletions contracts/src/interfaces/iyieldsource.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
use starknet::{ContractAddress, ClassHash};

#[derive(Copy, Drop, Serde)]
pub struct YieldSourceData {
pub APY: felt252,
pub deposit_limit: felt252,
}

#[starknet::interface]
pub trait IYieldSource<TContractState> {
fn deposit(ref self: TContractState, token: ContractAddress, amount: felt252);
fn withdraw(ref self: TContractState, token: ContractAddress, amount: felt252);
fn withdraw_yield(ref self: TContractState, token: ContractAddress);
fn get_supply_pool_data(self: @TContractState, token: ContractAddress) -> YieldSourceData;
fn get_yield_generated(self: @TContractState, token: ContractAddress) -> u128;
fn get_total_value_locked(self: @TContractState, token: ContractAddress) -> u128;
fn get_supported_assets(self: @TContractState) -> Array<ContractAddress>;
fn get_source_class_hash(self: @TContractState) -> ClassHash;
fn get_source_contract_address(self: @TContractState) -> ContractAddress;
}
26 changes: 4 additions & 22 deletions contracts/src/lib.cairo
Original file line number Diff line number Diff line change
@@ -1,25 +1,7 @@
fn main() -> u32 {
fib(16)
pub mod connectors {
pub mod zklend;
}

fn fib(mut n: u32) -> u32 {
let mut a: u32 = 0;
let mut b: u32 = 1;
while n != 0 {
n = n - 1;
let temp = b;
b = a + b;
a = temp;
};
a
}

#[cfg(test)]
mod tests {
use super::fib;

#[test]
fn it_works() {
assert(fib(16) == 987, 'it works!');
}
pub mod interfaces {
pub mod iyieldsource;
}
Loading