Skip to content

Commit

Permalink
feat: adding types for money market
Browse files Browse the repository at this point in the history
  • Loading branch information
SissonJ committed Aug 20, 2024
1 parent 2adcf09 commit 92f16a6
Show file tree
Hide file tree
Showing 7 changed files with 459 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/contracts/definitions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ export * from './derivativeScrt';
export * from './shadeStaking';
export * from './lend';
export * from './silkBasket';
export * from './moneyMarket';
191 changes: 191 additions & 0 deletions src/contracts/definitions/moneyMarket.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
import { AccountPermit } from '~/types/permit';
import { Pagination } from '~/types/contracts/moneyMarket/model';
import { generatePadding } from '~/index';
import { snip20 } from './snip20';

/**
* Query the contract status info
* NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY
*/
const msgQueryMoneyMarketConfig = () => ({ config: {} });

/**
* Query the collateral state and config info
* NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY
*/
const msgQueryMoneyMarketCollaterals = (
pagination?: Pagination,
) => ({
get_collateral: {
pagination,
},
});

/**
* Query the markets' state and config info
* NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY
*/
const msgQueryMoneyMarketMarkets = (
pagination?: Pagination,
) => ({
get_markets: {
pagination,
},
});

/**
* Query a user's collateral and debt positions
* NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY
*/
const msgQueryMoneyMarketUserPosition = (
address: string,
permit: AccountPermit,
) => ({
user_position: {
address,
authentication: {
permit: {
query_permit: permit,
},
},
},
});

/**
* message to borrow a debt token against deposited collateral
* NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY
*/
function msgMoneyMarketBorrow({
borrowAmount,
debtTokenAddress,
}: {
borrowAmount: string,
debtTokenAddress: string,
}) {
return {
borrow: {
token: debtTokenAddress,
amount: borrowAmount,
},
};
}

/**
* message to withdraw collateral against an existing user position
* NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY
*/
function msgMoneyMarketWithdrawCollateral({
withdrawAmount,
collateralTokenAddress,
}: {
withdrawAmount: string,
collateralTokenAddress: string,
}) {
return {
deposit_collateral: {
token: collateralTokenAddress,
amount: withdrawAmount,
},
};
}

/**
* message to deposit collateral to borrow against
* NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY
*/
function msgMoneyMarketDepositCollateral({
moneyMarketContractAddress,
moneyMarketCodeHash,
depositAmount,
}: {
moneyMarketContractAddress: string,
moneyMarketCodeHash?: string,
depositAmount: string,
}) {
return snip20.messages.send({
recipient: moneyMarketContractAddress,
recipientCodeHash: moneyMarketCodeHash,
amount: depositAmount,
handleMsg: { deposit_collateral: {} },
padding: generatePadding(),
}).msg;
}

/**
* message to supply tokens to be lent out
* NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY
*/
function msgMoneyMarketSupply({
moneyMarketContractAddress,
moneyMarketCodeHash,
supplyAmount,
}: {
moneyMarketContractAddress: string,
moneyMarketCodeHash?: string,
supplyAmount: string,
}) {
return snip20.messages.send({
recipient: moneyMarketContractAddress,
recipientCodeHash: moneyMarketCodeHash,
amount: supplyAmount,
handleMsg: { supply: {} },
padding: generatePadding(),
}).msg;
}

/**
* message to withdraw supply by sending an ltoken amount
* NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY
*/
function msgMoneyMarketWithdrawSupply({
moneyMarketContractAddress,
moneyMarketCodeHash,
withdrawAmount,
}: {
moneyMarketContractAddress: string,
moneyMarketCodeHash?: string,
withdrawAmount: string,
}) {
return snip20.messages.send({
recipient: moneyMarketContractAddress,
recipientCodeHash: moneyMarketCodeHash,
amount: withdrawAmount,
handleMsg: { withdraw_supply: {} },
padding: generatePadding(),
}).msg;
}

/**
* message to repay a loan that has been taken out
* NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY
*/
function msgMoneyMarketRepay({
moneyMarketContractAddress,
moneyMarketCodeHash,
repayAmount,
}: {
moneyMarketContractAddress: string,
moneyMarketCodeHash?: string,
repayAmount: string,
}) {
return snip20.messages.send({
recipient: moneyMarketContractAddress,
recipientCodeHash: moneyMarketCodeHash,
amount: repayAmount,
handleMsg: { repay: {} },
padding: generatePadding(),
}).msg;
}

export {
msgQueryMoneyMarketConfig,
msgQueryMoneyMarketCollaterals,
msgQueryMoneyMarketMarkets,
msgQueryMoneyMarketUserPosition,
msgMoneyMarketBorrow,
msgMoneyMarketWithdrawCollateral,
msgMoneyMarketDepositCollateral,
msgMoneyMarketSupply,
msgMoneyMarketWithdrawSupply,
msgMoneyMarketRepay,
};
41 changes: 41 additions & 0 deletions src/contracts/services/moneyMarket.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { getActiveQueryClient$ } from '~/client';
import {
switchMap,
first,
map,
lastValueFrom,
} from 'rxjs';
import { sendSecretClientContractQuery$ } from '~/client/services/clientServices';
import { msgQueryMoneyMarketConfig } from '../definitions/moneyMarket';

const parseMoneyMarketConfig = (
response: ConfigResponse
):ParsedConfigResponse

/**
* query the money market config
* NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY
*/
const queryMoneyMarketConfig$ = ({

Check failure on line 19 in src/contracts/services/moneyMarket.ts

View workflow job for this annotation

GitHub Actions / typecheck

'=>' expected.

Check failure on line 19 in src/contracts/services/moneyMarket.ts

View workflow job for this annotation

GitHub Actions / build

'=>' expected.
contractAddress,
codeHash,
lcdEndpoint,
chainId,
}: {
contractAddress: string,
codeHash?: string,
lcdEndpoint?: string,
chainId?: string,
}) => getActiveQueryClient$(lcdEndpoint, chainId).pipe(
switchMap(({ client }) => sendSecretClientContractQuery$({
queryMsg: msgQueryMoneyMarketConfig(),
client,
contractAddress,
codeHash,
})),
map((response) => parseDerivativeShdStakingInfo(response as StakingInfoResponse)),
first(),
);

export {
};
1 change: 1 addition & 0 deletions src/types/contracts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ export * from './derivativeShd';
export * from './shadeStaking';
export * from './lend';
export * from './silkBasket';
export * from './moneyMarket';
1 change: 1 addition & 0 deletions src/types/contracts/moneyMarket/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './model';
71 changes: 71 additions & 0 deletions src/types/contracts/moneyMarket/model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
type Pagination = {
page: number,
page_size: number,
}

type ParsedConfigResponse = {
adminAuth: {
contractAddress: string
codeHash: string,
},
queryAuth: {
contractAddress: string,
codeHash: string,
},
oracle: {
contractAddress: string,
codeHash: string,
},
feeCollector: string,
lTokenId: number,
lTokenCodeHash: string,
lTokenBlockchainAdmin: string,
supplyEnabled: boolean,
borrowEnabled: boolean,
repayEnabled: boolean,
liquidationEnabled: boolean,
interestAccrualEnabled: boolean,
collateralDepositEnabled: boolean,
}

type ParsedMarketResponse = {
marketToken: {
contractAddress: string,
codeHash: string,
},
lToken: {
contractAddress: string,
codeHash: string,
},
decimals: number,
oracleKey: string,
interest: {
linear?: {
base: string,
slope: string,
},
piecewise_linear?: {
base: string,
slope1: string,
slope2: string,
optimalUtilisation: string,
}
},
loanableAmount: string,
lentAmount: string,
lifetimeInterestPaid: string,
lifetimeInterestOwed: string,
interestPerUtoken: string,
lastInterestAccrued: Date,
maxSupplyAmount: string,
flashLoanInterest: string,
supplyEnabled: boolean,
borrowEnabled: boolean,
repayEnabled: boolean,
liquidationEnabled: boolean,
interestAccrualEnabled: boolean,
}

export type {
Pagination,
};
Loading

0 comments on commit 92f16a6

Please sign in to comment.