-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAllV4.ts
122 lines (111 loc) · 3.54 KB
/
AllV4.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import { Address, encodeAbiParameters } from 'viem';
import { LoanV4 } from '@/blockchain';
import { Wallet } from '@/contracts';
import { getContracts } from '@/deploys';
import { auctionLoanLiquidatorABI as auctionLoanLiquidatorABIV4 } from '@/generated/blockchain/v4';
import { AllV6 } from './AllV6';
import { BaseContract } from './BaseContract';
export class AllV4 extends BaseContract<typeof auctionLoanLiquidatorABIV4> {
static LOAN_SETTLEMENT_ENCODE_TYPES = [
{
name: '',
type: 'tuple',
components: [
{ name: 'borrower', type: 'address' },
{ name: 'nftCollateralTokenId', type: 'uint256' },
{ name: 'nftCollateralAddress', type: 'address' },
{ name: 'principalAddress', type: 'address' },
{ name: 'principalAmount', type: 'uint256' },
{ name: 'startTime', type: 'uint256' },
{ name: 'duration', type: 'uint256' },
{
name: 'source',
type: 'tuple[]',
components: [
{ name: 'loanId', internalType: 'uint256', type: 'uint256' },
{ name: 'lender', internalType: 'address', type: 'address' },
{
name: 'principalAmount',
internalType: 'uint256',
type: 'uint256',
},
{
name: 'accruedInterest',
internalType: 'uint256',
type: 'uint256',
},
{ name: 'startTime', internalType: 'uint256', type: 'uint256' },
{ name: 'aprBps', internalType: 'uint256', type: 'uint256' },
],
},
],
},
];
constructor({ walletClient }: { walletClient: Wallet }) {
const {
AuctionLoanLiquidator: { v4 },
} = getContracts(walletClient.chain);
super({
walletClient,
address: v4,
abi: auctionLoanLiquidatorABIV4,
});
}
async placeBid({
collectionContractAddress,
tokenId,
bid,
}: {
collectionContractAddress: Address;
tokenId: bigint;
bid: bigint;
}) {
const txHash = await this.safeContractWrite.placeBid([collectionContractAddress, tokenId, bid]);
return {
txHash,
waitTxInBlock: async () => {
const receipt = await this.bcClient.waitForTransactionReceipt({
hash: txHash,
});
const events = this.parseEventLogs('BidPlaced', receipt.logs);
if (events.length === 0) throw new Error('Bid not placed');
return { ...events[0].args, ...receipt };
},
};
}
getRemainingLockupSeconds() {
return 0;
}
async settleAuctionWithBuyout(): ReturnType<AllV6['settleAuctionWithBuyout']> {
throw new Error('Not implemented for V1');
}
async settleAuction({ loan }: { loan: LoanV4 }) {
const loanStruct = {
...loan,
source: loan.source.map((source) => [
Number(source.loanId),
source.lender,
source.principalAmount,
source.accruedInterest,
source.startTime,
source.aprBps,
]),
};
const txHash = await this.safeContractWrite.settleAuction([
loan.nftCollateralAddress,
loan.nftCollateralTokenId,
encodeAbiParameters(AllV4.LOAN_SETTLEMENT_ENCODE_TYPES, [loanStruct]),
]);
return {
txHash,
waitTxInBlock: async () => {
const receipt = await this.bcClient.waitForTransactionReceipt({
hash: txHash,
});
const events = this.parseEventLogs('AuctionSettled', receipt.logs);
if (events.length === 0) throw new Error('Auction not settled');
return { ...events[0].args, ...receipt };
},
};
}
}