Skip to content

Commit

Permalink
feat: add transfer currency button (#280)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeroen Offerijns authored Jul 28, 2021
1 parent 671c999 commit 529c4bd
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 4 deletions.
26 changes: 23 additions & 3 deletions tinlake-ui/components/Loan/Data/index.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
import { DisplayField } from '@centrifuge/axis-display-field'
import { baseToDisplay, feeToInterestRate, ITinlake, Loan } from '@centrifuge/tinlake-js'
import BN from 'bn.js'
import { Box, Table, TableBody, TableCell, TableRow } from 'grommet'
import { Box, Button, Table, TableBody, TableCell, TableRow } from 'grommet'
import { useRouter } from 'next/router'
import * as React from 'react'
import { connect } from 'react-redux'
import styled from 'styled-components'
import { Pool } from '../../../config'
import { AuthState } from '../../../ducks/auth'
import { createTransaction, TransactionProps } from '../../../ducks/transactions'
import { addThousandsSeparators } from '../../../utils/addThousandsSeparators'
import { dateToYMD } from '../../../utils/date'
import { getAddressLink } from '../../../utils/etherscanLinkGenerator'
import { toPrecision } from '../../../utils/toPrecision'
import { LoadingValue } from '../../LoadingValue'
import LoanLabel from '../Label'

interface Props {
interface Props extends TransactionProps {
loan: Loan
tinlake: ITinlake
auth?: AuthState
Expand All @@ -29,8 +32,19 @@ const DisplayFieldWrapper = styled.div`
`

const LoanData: React.FC<Props> = (props: Props) => {
const router = useRouter()
const availableForFinancing = props.loan?.debt.isZero() ? props.loan?.principal || new BN(0) : new BN(0)

const proxyTransfer = async () => {
if (!props.loan.borrower) throw new Error('Borrower field missing')

await props.createTransaction(`Transfer currency from proxy`, 'proxyTransferCurrency', [
props.tinlake,
props.loan.ownerOf,
props.loan.borrower,
])
}

return (
<Box gap="medium" pad="medium" elevation="small" round="xsmall" background="white" width="80%">
<Box direction="row">
Expand Down Expand Up @@ -128,10 +142,16 @@ const LoanData: React.FC<Props> = (props: Props) => {
</TableRow>
</TableBody>
</Table>

{props.loan?.ownerOf && props.loan?.borrower && 'transferCurrency' in router.query && (
<Box margin={{ left: 'auto' }}>
<Button label="Transfer currency from proxy" size="small" onClick={() => proxyTransfer()}></Button>
</Box>
)}
</Box>
</Box>
</Box>
)
}

export default LoanData
export default connect((state) => state, { createTransaction })(LoanData)
8 changes: 8 additions & 0 deletions tinlake-ui/services/tinlake/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,14 @@ export async function executeEpoch(tinlake: ITinlake): Promise<PendingTransactio
return tinlake.executeEpoch()
}

export async function proxyTransferCurrency(
tinlake: ITinlake,
proxy: string,
borrower: string
): Promise<PendingTransaction> {
return tinlake.proxyTransferCurrency(proxy, borrower)
}

export async function updateJuniorMemberList(
tinlake: ITinlake,
user: string,
Expand Down
2 changes: 1 addition & 1 deletion tinlake.js/src/abi/Actions.abi.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"guy","type":"address"},{"indexed":true,"internalType":"bytes32","name":"foo","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"bar","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"fax","type":"bytes"}],"name":"LogNote","type":"event"},{"constant":false,"inputs":[{"internalType":"contract ERC20Like","name":"erc20","type":"address"},{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract NFTLike","name":"registry","type":"address"},{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"}],"name":"approveNFT","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"usr","type":"address"}],"name":"borrowWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"close","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"contract NFTLike","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"}],"name":"issue","outputs":[{"internalType":"uint256","name":"loan","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"lock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"usr","type":"address"}],"name":"lockBorrowWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"contract ERC20Like","name":"erc20","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repay","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"contract PileLike","name":"pile","type":"address"},{"internalType":"contract ERC20Like","name":"erc20","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"repayFullDebt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"contract PileLike","name":"pile","type":"address"},{"internalType":"contract NFTLike","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"contract ERC20Like","name":"erc20","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"repayUnlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"contract PileLike","name":"pile","type":"address"},{"internalType":"contract NFTLike","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"contract ERC20Like","name":"erc20","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"repayUnlockClose","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract OperatorLike","name":"operator","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supply","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"contract NFTLike","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"}],"name":"transferIssue","outputs":[{"internalType":"uint256","name":"loan","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"contract NFTLike","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"usr","type":"address"}],"name":"transferIssueLockBorrowWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"contract NFTLike","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"unlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ShelfLike","name":"shelf","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"unlockClose","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"erc20","type":"address"},{"indexed":true,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ApproveERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registry","type":"address"},{"indexed":true,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"ApproveNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"shelf","type":"address"},{"indexed":true,"internalType":"uint256","name":"loan","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"BorrowWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"shelf","type":"address"},{"indexed":true,"internalType":"uint256","name":"loan","type":"uint256"}],"name":"Close","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"shelf","type":"address"},{"indexed":true,"internalType":"address","name":"registry","type":"address"},{"indexed":true,"internalType":"uint256","name":"token","type":"uint256"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"shelf","type":"address"},{"indexed":true,"internalType":"uint256","name":"loan","type":"uint256"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"shelf","type":"address"},{"indexed":true,"internalType":"address","name":"erc20","type":"address"},{"indexed":true,"internalType":"uint256","name":"loan","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Repay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registry","type":"address"},{"indexed":true,"internalType":"uint256","name":"token","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"erc20","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"shelf","type":"address"},{"indexed":true,"internalType":"address","name":"registry","type":"address"},{"indexed":false,"internalType":"uint256","name":"token","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"loan","type":"uint256"}],"name":"Unlock","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"registry","type":"address"},{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"approveNFT","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"shelf","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"usr","type":"address"}],"name":"borrowWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"shelf","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"close","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"shelf","type":"address"},{"internalType":"address","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"}],"name":"issue","outputs":[{"internalType":"uint256","name":"loan","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"shelf","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"lock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"shelf","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"usr","type":"address"}],"name":"lockBorrowWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"shelf","type":"address"},{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repay","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"shelf","type":"address"},{"internalType":"address","name":"pile","type":"address"},{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"repayFullDebt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"shelf","type":"address"},{"internalType":"address","name":"pile","type":"address"},{"internalType":"address","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"repayUnlockClose","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"shelf","type":"address"},{"internalType":"address","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"}],"name":"transferIssue","outputs":[{"internalType":"uint256","name":"loan","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"shelf","type":"address"},{"internalType":"address","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"usr","type":"address"}],"name":"transferIssueLockBorrowWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"shelf","type":"address"},{"internalType":"address","name":"registry","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"unlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
15 changes: 15 additions & 0 deletions tinlake.js/src/actions/proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,20 @@ export function ProxyActions<ActionsBase extends Constructor<TinlakeParams>>(Bas
proxy.execute(this.contract('ACTIONS').address, encoded, { ...this.overrides, gasLimit: 1500000 })
)
}

proxyTransferCurrency = async (proxyAddress: string, borrowerAddress: string) => {
const proxyBalance = await this.contract('TINLAKE_CURRENCY').balanceOf(proxyAddress)
console.log(proxyBalance)
const proxy = this.contract('PROXY', proxyAddress)
const encoded = this.contract('ACTIONS').interface.encodeFunctionData('transferERC20', [
this.contract('TINLAKE_CURRENCY').address,
borrowerAddress,
proxyBalance,
])

const newActionsContract = '0x80F33ED0A69935dd74310b9D0009D0BA647Cf223'
return this.pending(proxy.execute(newActionsContract, encoded, { ...this.overrides, gasLimit: 550000 }))
}
}
}

Expand All @@ -195,6 +209,7 @@ export type IProxyActions = {
): Promise<PendingTransaction>
proxyLock(proxyAddr: string, loanId: string): Promise<PendingTransaction>
proxyBorrowWithdraw(proxyAddr: string, loanId: string, amount: string, usr: string): Promise<PendingTransaction>
proxyTransferCurrency(proxyAddress: string, borrowerAddress: string): Promise<PendingTransaction>
}

export default ProxyActions

0 comments on commit 529c4bd

Please sign in to comment.