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

feat: add transfer currency button behind feature flag #280

Merged
merged 2 commits into from
Jul 28, 2021
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
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