@huma-finance/widgets 0.0.12 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/API.md +6 -5
- package/dist/cjs/index.cjs +5058 -5968
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/index.d.ts +9 -6
- package/dist/index.js +5059 -5969
- package/dist/index.js.map +1 -1
- package/package.json +16 -16
- package/src/components/ApproveAllowanceModal.tsx +5 -2
- package/src/components/ChainNotSupportedModal.tsx +33 -0
- package/src/components/ChooseAmountModal.tsx +322 -322
- package/src/components/ConfirmTransferModal.tsx +153 -0
- package/src/components/CreditLine/borrow/1-Evaluation.tsx +1 -2
- package/src/components/CreditLine/borrow/index.tsx +4 -6
- package/src/components/Factoring/FactoredList.tsx +1 -1
- package/src/components/InvoiceFactoring/borrow/1-Evaluation.tsx +1 -4
- package/src/components/InvoiceFactoring/borrow/{3-ChooseAmount.tsx → 2-ChooseAmount.tsx} +5 -3
- package/src/components/InvoiceFactoring/borrow/3-ConfirmTransfer.tsx +37 -0
- package/src/components/InvoiceFactoring/borrow/index.tsx +5 -7
- package/src/components/StreamFactoring/borrow/1-Evaluation.tsx +12 -4
- package/src/components/StreamFactoring/borrow/2-ChooseAmount.tsx +4 -1
- package/src/components/StreamFactoring/borrow/3-ConfirmTransfer.tsx +18 -80
- package/src/components/StreamFactoring/borrow/4-ApproveAllowance.tsx +4 -36
- package/src/components/StreamFactoring/borrow/5-Permit.tsx +14 -14
- package/src/components/SuperfluidFactoring/SuperfluidFactoredList.tsx +10 -1
- package/src/components/SuperfluidFactoring/SuperfluidUpcomingList.tsx +4 -22
- package/src/cosmos/CreditLineBorrow.fixture.tsx +1 -0
- package/src/cosmos/CreditLinePayment.fixture.tsx +1 -0
- package/src/cosmos/SDKTesting.fixture.tsx +615 -615
- package/src/cosmos/SuperfluidFactoringBorrow.fixture.tsx +3 -0
- package/src/cosmos/utils/env.ts +6 -0
- package/src/hooks/useEA.ts +10 -29
- package/src/index.tsx +88 -7
- package/src/reportWebVitals.ts +9 -9
- package/src/store/widgets.store.ts +0 -1
- package/src/utilTypes.d.ts +2 -0
- package/webpack.cosmos.js +9 -9
- package/src/components/AllowListModal.tsx +0 -113
- package/src/components/CreditLine/borrow/2-AllowList.tsx +0 -34
- package/src/components/InvoiceFactoring/borrow/2-AllowList.tsx +0 -34
- package/src/components/InvoiceFactoring/borrow/4-ConfirmTransfer.tsx +0 -104
- /package/src/components/CreditLine/borrow/{3-ChooseAmount.tsx → 2-ChooseAmount.tsx} +0 -0
- /package/src/components/CreditLine/borrow/{4-Transfer.tsx → 3-Transfer.tsx} +0 -0
- /package/src/components/CreditLine/borrow/{5-ApproveAllowance.tsx → 4-ApproveAllowance.tsx} +0 -0
- /package/src/components/CreditLine/borrow/{6-Success.tsx → 5-Success.tsx} +0 -0
- /package/src/components/InvoiceFactoring/borrow/{5-ApproveNFT.tsx → 4-ApproveNFT.tsx} +0 -0
- /package/src/components/InvoiceFactoring/borrow/{6-Transfer.tsx → 5-Transfer.tsx} +0 -0
- /package/src/components/InvoiceFactoring/borrow/{7-Success.tsx → 6-Success.tsx} +0 -0
|
@@ -1,615 +1,615 @@
|
|
|
1
|
-
/* eslint-disable jsx-a11y/label-has-associated-control */
|
|
2
|
-
/* eslint-disable react/jsx-boolean-value */
|
|
3
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
|
-
import { useEffect, useState } from 'react'
|
|
5
|
-
import {
|
|
6
|
-
EAService,
|
|
7
|
-
useCreditRecordDetails,
|
|
8
|
-
usePoolContract,
|
|
9
|
-
ARWeaveService,
|
|
10
|
-
ReceivableService,
|
|
11
|
-
} from '@huma-finance/sdk'
|
|
12
|
-
import { POOL_NAME, POOL_TYPE } from '@huma-finance/shared'
|
|
13
|
-
import { useAccount } from 'wagmi'
|
|
14
|
-
import { ethers } from 'ethers'
|
|
15
|
-
import { JsonRpcProvider, Web3Provider } from '@ethersproject/providers'
|
|
16
|
-
|
|
17
|
-
import { WalletWrapper } from './WalletWrapper'
|
|
18
|
-
|
|
19
|
-
const TEST_PRIVATE_KEY = 'REPLACE_WITH_YOUR_PRIVATE_KEY'
|
|
20
|
-
const INFURA_PROVIDER_KEY = 'REPLACE_WITH_YOUR_INFURA_PROVIDER_KEY'
|
|
21
|
-
|
|
22
|
-
function Fixture() {
|
|
23
|
-
const { address, connector } = useAccount()
|
|
24
|
-
const [chainId, setChainId] = useState(0)
|
|
25
|
-
const [signer, setSigner] = useState<Web3Provider | null>(null)
|
|
26
|
-
|
|
27
|
-
// useCreditRecordDetails
|
|
28
|
-
const [userAddress, setUserAddress] = useState('')
|
|
29
|
-
const [poolName, setPoolName] = useState<POOL_NAME>(POOL_NAME.HumaCreditLine)
|
|
30
|
-
const [poolType, setPoolType] = useState<POOL_TYPE>(POOL_TYPE.CreditLine)
|
|
31
|
-
const provider = new JsonRpcProvider(
|
|
32
|
-
`https://goerli.infura.io/v3/${INFURA_PROVIDER_KEY}`,
|
|
33
|
-
{
|
|
34
|
-
name: 'goerli',
|
|
35
|
-
chainId: 5,
|
|
36
|
-
},
|
|
37
|
-
)
|
|
38
|
-
const [creditRecordDetails, refreshCreditRecordDetails] =
|
|
39
|
-
useCreditRecordDetails(userAddress, provider, chainId, poolName, poolType)
|
|
40
|
-
|
|
41
|
-
// mintReceivableWithMetadata
|
|
42
|
-
const [recipientAddress, setRecipientAddress] = useState(address)
|
|
43
|
-
const [receivableAmount, setReceivableAmount] = useState(100)
|
|
44
|
-
const [maturityDate, setMaturityDate] = useState(Date.now())
|
|
45
|
-
const [metadata, setMetadata] = useState(JSON.stringify({ exampleKey: 1 }))
|
|
46
|
-
// Used to set an example tag on the metadata uploaded to ARweave which we can use to query by later
|
|
47
|
-
const [referenceId, setReferenceId] = useState('3')
|
|
48
|
-
const [mintResult, setMintResult] = useState<any>('')
|
|
49
|
-
|
|
50
|
-
// usePoolContract
|
|
51
|
-
const poolContract = usePoolContract(
|
|
52
|
-
signer!,
|
|
53
|
-
chainId,
|
|
54
|
-
POOL_NAME.HumaCreditLine,
|
|
55
|
-
POOL_TYPE.CreditLine,
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
// EAService.approve
|
|
59
|
-
const [borrowerAddress, setBorrowerAddress] = useState('')
|
|
60
|
-
const [receivableAddress, setReceivableAddress] = useState(
|
|
61
|
-
'0xC2AC172a293d68f548ea343414584aA37eb29Dcd',
|
|
62
|
-
)
|
|
63
|
-
const [receivableParam, setReceivableParam] = useState('')
|
|
64
|
-
const [approveResult, setApproveResult] = useState<any>('')
|
|
65
|
-
|
|
66
|
-
const [queryResult, setQueryResult] = useState<any>('')
|
|
67
|
-
|
|
68
|
-
useEffect(() => {
|
|
69
|
-
;(async () => {
|
|
70
|
-
if (address && connector && window.ethereum) {
|
|
71
|
-
setChainId(await connector.getChainId())
|
|
72
|
-
setRecipientAddress(address)
|
|
73
|
-
// @ts-ignore
|
|
74
|
-
const tmp = new ethers.providers.Web3Provider(window.ethereum)
|
|
75
|
-
setSigner(tmp)
|
|
76
|
-
}
|
|
77
|
-
})()
|
|
78
|
-
}, [address, connector])
|
|
79
|
-
|
|
80
|
-
const handleRefreshCreditRecordDetailsSubmit = (event: any) => {
|
|
81
|
-
event.preventDefault()
|
|
82
|
-
refreshCreditRecordDetails()
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const handleEAApproveSubmit = async (event: any) => {
|
|
86
|
-
event.preventDefault()
|
|
87
|
-
try {
|
|
88
|
-
const data = await EAService.approve(
|
|
89
|
-
{
|
|
90
|
-
poolAddress: poolContract!.address,
|
|
91
|
-
borrowerWalletAddress: borrowerAddress,
|
|
92
|
-
receivableAddress,
|
|
93
|
-
receivableParam,
|
|
94
|
-
},
|
|
95
|
-
5,
|
|
96
|
-
)
|
|
97
|
-
setApproveResult('Success')
|
|
98
|
-
console.log(data)
|
|
99
|
-
} catch (error) {
|
|
100
|
-
setApproveResult('Failed')
|
|
101
|
-
console.log(error)
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const handleMintReceivableWithMetadataSubmit = async (event: any) => {
|
|
106
|
-
event.preventDefault()
|
|
107
|
-
|
|
108
|
-
if (signer === null) return
|
|
109
|
-
|
|
110
|
-
try {
|
|
111
|
-
const data = await ReceivableService.createReceivableWithMetadata(
|
|
112
|
-
signer,
|
|
113
|
-
TEST_PRIVATE_KEY!,
|
|
114
|
-
chainId,
|
|
115
|
-
poolName,
|
|
116
|
-
poolType,
|
|
117
|
-
840, // currency code for USD
|
|
118
|
-
receivableAmount,
|
|
119
|
-
maturityDate,
|
|
120
|
-
JSON.parse(metadata),
|
|
121
|
-
referenceId,
|
|
122
|
-
[],
|
|
123
|
-
)
|
|
124
|
-
const txResult = await data.wait()
|
|
125
|
-
setMintResult(`Success, Tx Hash: ${txResult.transactionHash}`)
|
|
126
|
-
console.log(data)
|
|
127
|
-
} catch (error) {
|
|
128
|
-
setMintResult(`Failed, check console for errors`)
|
|
129
|
-
console.log(error)
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const queryARWeaveSubmit = async (event: any) => {
|
|
134
|
-
event.preventDefault()
|
|
135
|
-
|
|
136
|
-
if (address == null) return
|
|
137
|
-
|
|
138
|
-
try {
|
|
139
|
-
const data = await ARWeaveService.queryForMetadata(
|
|
140
|
-
chainId,
|
|
141
|
-
address,
|
|
142
|
-
referenceId,
|
|
143
|
-
)
|
|
144
|
-
setQueryResult(data)
|
|
145
|
-
console.log(data)
|
|
146
|
-
} catch (error) {
|
|
147
|
-
setQueryResult(`Failed, check console for errors`)
|
|
148
|
-
console.log(error)
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
const [prefundAmt, setPrefundAmt] = useState<number>(0)
|
|
153
|
-
const [prefundResult, setPrefundResult] = useState<string>('')
|
|
154
|
-
const prefundARWeaveSubmit = async (event: any) => {
|
|
155
|
-
event.preventDefault()
|
|
156
|
-
|
|
157
|
-
try {
|
|
158
|
-
const data = await ARWeaveService.prefundBundlr(
|
|
159
|
-
ARWeaveService.getBundlrNetworkConfig(5),
|
|
160
|
-
signer,
|
|
161
|
-
prefundAmt,
|
|
162
|
-
)
|
|
163
|
-
setPrefundResult('Success')
|
|
164
|
-
console.log(data)
|
|
165
|
-
} catch (error) {
|
|
166
|
-
setPrefundResult(`Failed, check console for errors`)
|
|
167
|
-
console.log(error)
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const [paymentAmount, setPaymentAmount] = useState<number>(0)
|
|
172
|
-
const [paymentResult, setPaymentResult] = useState<string>('')
|
|
173
|
-
const declarePaymentSubmit = async (event: any) => {
|
|
174
|
-
event.preventDefault()
|
|
175
|
-
|
|
176
|
-
try {
|
|
177
|
-
const data =
|
|
178
|
-
await ReceivableService.declareReceivablePaymentByReferenceId(
|
|
179
|
-
signer?.getSigner()!,
|
|
180
|
-
referenceId,
|
|
181
|
-
paymentAmount,
|
|
182
|
-
)
|
|
183
|
-
const txResult = await data.wait()
|
|
184
|
-
setPaymentResult(`Success, Tx Hash: ${txResult.transactionHash}`)
|
|
185
|
-
console.log(data)
|
|
186
|
-
} catch (error) {
|
|
187
|
-
setPaymentResult(`Failed, check console for errors`)
|
|
188
|
-
console.log(error)
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
return (
|
|
193
|
-
<div
|
|
194
|
-
style={{
|
|
195
|
-
fontFamily: 'Helvetica',
|
|
196
|
-
display: 'flex',
|
|
197
|
-
flexDirection: 'column',
|
|
198
|
-
gap: '15px',
|
|
199
|
-
}}
|
|
200
|
-
>
|
|
201
|
-
<div
|
|
202
|
-
style={{
|
|
203
|
-
border: '1px solid gray',
|
|
204
|
-
padding: '0px 10px 20px 10px',
|
|
205
|
-
borderRadius: '10px',
|
|
206
|
-
}}
|
|
207
|
-
>
|
|
208
|
-
<h3>Example 1. React hooks to get credit loan details</h3>
|
|
209
|
-
<form
|
|
210
|
-
onSubmit={handleRefreshCreditRecordDetailsSubmit}
|
|
211
|
-
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
212
|
-
>
|
|
213
|
-
<label>
|
|
214
|
-
Network: <input disabled type='text' defaultValue='Goerli' />
|
|
215
|
-
</label>
|
|
216
|
-
<br />
|
|
217
|
-
<label>
|
|
218
|
-
User Address:
|
|
219
|
-
<input
|
|
220
|
-
type='text'
|
|
221
|
-
value={userAddress}
|
|
222
|
-
onChange={(event: any) => {
|
|
223
|
-
setUserAddress(event.target.value)
|
|
224
|
-
}}
|
|
225
|
-
/>
|
|
226
|
-
</label>
|
|
227
|
-
<br />
|
|
228
|
-
<label>
|
|
229
|
-
Pool Name:
|
|
230
|
-
<select
|
|
231
|
-
name='pool_name'
|
|
232
|
-
value={poolName}
|
|
233
|
-
onChange={(event: any) => {
|
|
234
|
-
setPoolName(event.target.value)
|
|
235
|
-
}}
|
|
236
|
-
>
|
|
237
|
-
<option value='RequestNetwork'>RequestNetwork</option>
|
|
238
|
-
<option value='HumaCreditLine'>HumaCreditLine</option>
|
|
239
|
-
<option value='Superfluid'>Superfluid</option>
|
|
240
|
-
<option value='Jia'>Jia</option>
|
|
241
|
-
</select>
|
|
242
|
-
</label>
|
|
243
|
-
<br />
|
|
244
|
-
<label>
|
|
245
|
-
Pool Type:
|
|
246
|
-
<select
|
|
247
|
-
name='pool_type'
|
|
248
|
-
value={poolType}
|
|
249
|
-
onChange={(event: any) => {
|
|
250
|
-
setPoolType(event.target.value)
|
|
251
|
-
}}
|
|
252
|
-
>
|
|
253
|
-
<option value='Invoice'>Invoice</option>
|
|
254
|
-
<option value='CreditLine'>CreditLine</option>
|
|
255
|
-
<option value='Stream'>Stream</option>
|
|
256
|
-
</select>
|
|
257
|
-
</label>
|
|
258
|
-
<br />
|
|
259
|
-
<button type='submit' style={{ width: 'fit-content' }}>
|
|
260
|
-
Get Credit Record Details
|
|
261
|
-
</button>
|
|
262
|
-
</form>
|
|
263
|
-
{creditRecordDetails && (
|
|
264
|
-
<div>
|
|
265
|
-
<h2>Credit Record Details:</h2>
|
|
266
|
-
<ul>aprInBps: {creditRecordDetails.aprInBps}</ul>
|
|
267
|
-
<ul>correction: {creditRecordDetails.correction.toString()}</ul>
|
|
268
|
-
<ul>creditLimit: {creditRecordDetails.creditLimit.toString()}</ul>
|
|
269
|
-
<ul>
|
|
270
|
-
defaultAmount: {creditRecordDetails.defaultAmount.toString()}
|
|
271
|
-
</ul>
|
|
272
|
-
<ul>dueDate: {creditRecordDetails.dueDate.toString()}</ul>
|
|
273
|
-
<ul>
|
|
274
|
-
feesAndInterestDue:{' '}
|
|
275
|
-
{creditRecordDetails.feesAndInterestDue.toString()}
|
|
276
|
-
</ul>
|
|
277
|
-
<ul>intervalInDays: {creditRecordDetails.intervalInDays}</ul>
|
|
278
|
-
<ul>missedPeriods: {creditRecordDetails.missedPeriods}</ul>
|
|
279
|
-
<ul>remainingPeriods: {creditRecordDetails.remainingPeriods}</ul>
|
|
280
|
-
<ul>state: {creditRecordDetails.state}</ul>
|
|
281
|
-
<ul>totalDue: {creditRecordDetails.totalDue.toString()}</ul>
|
|
282
|
-
<ul>
|
|
283
|
-
unbilledPrincipal:{' '}
|
|
284
|
-
{creditRecordDetails.unbilledPrincipal.toString()}
|
|
285
|
-
</ul>
|
|
286
|
-
</div>
|
|
287
|
-
)}
|
|
288
|
-
</div>
|
|
289
|
-
<div
|
|
290
|
-
style={{
|
|
291
|
-
border: '1px solid gray',
|
|
292
|
-
padding: '0px 10px 20px 10px',
|
|
293
|
-
borderRadius: '10px',
|
|
294
|
-
}}
|
|
295
|
-
>
|
|
296
|
-
<h3>Example 2. React hooks to get ethers.js contract instances</h3>
|
|
297
|
-
{poolContract?.address}
|
|
298
|
-
</div>
|
|
299
|
-
<div
|
|
300
|
-
style={{
|
|
301
|
-
border: '1px solid gray',
|
|
302
|
-
padding: '0px 10px 20px 10px',
|
|
303
|
-
borderRadius: '10px',
|
|
304
|
-
}}
|
|
305
|
-
>
|
|
306
|
-
<form
|
|
307
|
-
onSubmit={handleEAApproveSubmit}
|
|
308
|
-
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
309
|
-
>
|
|
310
|
-
<h3>Test EAService.approve</h3>
|
|
311
|
-
<label>
|
|
312
|
-
Borrower Address:
|
|
313
|
-
<input
|
|
314
|
-
type='text'
|
|
315
|
-
value={borrowerAddress}
|
|
316
|
-
onChange={(event: any) => {
|
|
317
|
-
setBorrowerAddress(event.target.value)
|
|
318
|
-
}}
|
|
319
|
-
/>
|
|
320
|
-
</label>
|
|
321
|
-
<br />
|
|
322
|
-
<label>
|
|
323
|
-
Receivable Address:
|
|
324
|
-
<input
|
|
325
|
-
type='text'
|
|
326
|
-
value={receivableAddress}
|
|
327
|
-
onChange={(event: any) => {
|
|
328
|
-
setReceivableAddress(event.target.value)
|
|
329
|
-
}}
|
|
330
|
-
/>
|
|
331
|
-
</label>
|
|
332
|
-
<br />
|
|
333
|
-
<label>
|
|
334
|
-
Receivable Parameter (Token ID):
|
|
335
|
-
<input
|
|
336
|
-
type='text'
|
|
337
|
-
value={receivableParam}
|
|
338
|
-
onChange={(event: any) => {
|
|
339
|
-
setReceivableParam(event.target.value)
|
|
340
|
-
}}
|
|
341
|
-
/>
|
|
342
|
-
</label>
|
|
343
|
-
<br />
|
|
344
|
-
<button type='submit' style={{ width: 'fit-content' }}>
|
|
345
|
-
Get Credit Record Details
|
|
346
|
-
</button>
|
|
347
|
-
</form>
|
|
348
|
-
{approveResult}
|
|
349
|
-
</div>
|
|
350
|
-
<div
|
|
351
|
-
style={{
|
|
352
|
-
border: '1px solid gray',
|
|
353
|
-
padding: '0px 10px 20px 10px',
|
|
354
|
-
borderRadius: '10px',
|
|
355
|
-
}}
|
|
356
|
-
>
|
|
357
|
-
<form
|
|
358
|
-
onSubmit={handleMintReceivableWithMetadataSubmit}
|
|
359
|
-
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
360
|
-
>
|
|
361
|
-
<h3>
|
|
362
|
-
Example 3. Create RealWorldReceivable token with metadata on ARWeave
|
|
363
|
-
</h3>
|
|
364
|
-
<label>
|
|
365
|
-
Recipient Address:
|
|
366
|
-
<input
|
|
367
|
-
type='text'
|
|
368
|
-
value={recipientAddress}
|
|
369
|
-
onChange={(event: any) => {
|
|
370
|
-
setRecipientAddress(event.target.value)
|
|
371
|
-
}}
|
|
372
|
-
/>
|
|
373
|
-
</label>
|
|
374
|
-
<br />
|
|
375
|
-
<label>
|
|
376
|
-
Pool Name:
|
|
377
|
-
<select
|
|
378
|
-
name='pool_name'
|
|
379
|
-
value={poolName}
|
|
380
|
-
onChange={(event: any) => {
|
|
381
|
-
setPoolName(event.target.value)
|
|
382
|
-
}}
|
|
383
|
-
>
|
|
384
|
-
<option value='RequestNetwork'>RequestNetwork</option>
|
|
385
|
-
<option value='HumaCreditLine'>HumaCreditLine</option>
|
|
386
|
-
<option value='Superfluid'>Superfluid</option>
|
|
387
|
-
<option value='Jia'>Jia</option>
|
|
388
|
-
</select>
|
|
389
|
-
</label>
|
|
390
|
-
<br />
|
|
391
|
-
<label>
|
|
392
|
-
Pool Type:
|
|
393
|
-
<select
|
|
394
|
-
name='pool_type'
|
|
395
|
-
value={poolType}
|
|
396
|
-
onChange={(event: any) => {
|
|
397
|
-
setPoolType(event.target.value)
|
|
398
|
-
}}
|
|
399
|
-
>
|
|
400
|
-
<option value='Invoice'>Invoice</option>
|
|
401
|
-
<option value='CreditLine'>CreditLine</option>
|
|
402
|
-
<option value='Stream'>Stream</option>
|
|
403
|
-
</select>
|
|
404
|
-
</label>
|
|
405
|
-
<br />
|
|
406
|
-
<label>
|
|
407
|
-
Receivable Amount:
|
|
408
|
-
<input
|
|
409
|
-
type='text'
|
|
410
|
-
value={receivableAmount}
|
|
411
|
-
onChange={(event: any) => {
|
|
412
|
-
setReceivableAmount(event.target.value)
|
|
413
|
-
}}
|
|
414
|
-
/>
|
|
415
|
-
</label>
|
|
416
|
-
<label>
|
|
417
|
-
Maturity Date:
|
|
418
|
-
<input
|
|
419
|
-
type='text'
|
|
420
|
-
value={maturityDate}
|
|
421
|
-
onChange={(event: any) => {
|
|
422
|
-
setMaturityDate(event.target.value)
|
|
423
|
-
}}
|
|
424
|
-
/>
|
|
425
|
-
</label>
|
|
426
|
-
<br />
|
|
427
|
-
<label>
|
|
428
|
-
Metadata:
|
|
429
|
-
<input
|
|
430
|
-
type='text'
|
|
431
|
-
value={metadata}
|
|
432
|
-
onChange={(event: any) => {
|
|
433
|
-
setMetadata(event.target.value)
|
|
434
|
-
}}
|
|
435
|
-
/>
|
|
436
|
-
</label>
|
|
437
|
-
<br />
|
|
438
|
-
<label>
|
|
439
|
-
Reference ID (For querying through ARWeave):
|
|
440
|
-
<input
|
|
441
|
-
type='text'
|
|
442
|
-
value={referenceId}
|
|
443
|
-
onChange={(event: any) => {
|
|
444
|
-
setReferenceId(event.target.value)
|
|
445
|
-
}}
|
|
446
|
-
/>
|
|
447
|
-
</label>
|
|
448
|
-
<button type='submit' style={{ width: 'fit-content' }}>
|
|
449
|
-
Create Receivable With Metadata
|
|
450
|
-
</button>
|
|
451
|
-
<br />
|
|
452
|
-
{mintResult}
|
|
453
|
-
</form>
|
|
454
|
-
{approveResult}
|
|
455
|
-
</div>
|
|
456
|
-
<div
|
|
457
|
-
style={{
|
|
458
|
-
border: '1px solid gray',
|
|
459
|
-
padding: '0px 10px 20px 10px',
|
|
460
|
-
borderRadius: '10px',
|
|
461
|
-
}}
|
|
462
|
-
>
|
|
463
|
-
<h3>Example 4. Query for metadata on ARWeave</h3>
|
|
464
|
-
<form
|
|
465
|
-
onSubmit={queryARWeaveSubmit}
|
|
466
|
-
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
467
|
-
>
|
|
468
|
-
<label>
|
|
469
|
-
Transaction sender:
|
|
470
|
-
<input type='text' value={address} disabled />
|
|
471
|
-
</label>
|
|
472
|
-
<br />
|
|
473
|
-
<label>
|
|
474
|
-
Pool Name:
|
|
475
|
-
<select
|
|
476
|
-
name='pool_name'
|
|
477
|
-
value={poolName}
|
|
478
|
-
onChange={(event: any) => {
|
|
479
|
-
setPoolName(event.target.value)
|
|
480
|
-
}}
|
|
481
|
-
>
|
|
482
|
-
<option value='RequestNetwork'>RequestNetwork</option>
|
|
483
|
-
<option value='HumaCreditLine'>HumaCreditLine</option>
|
|
484
|
-
<option value='Superfluid'>Superfluid</option>
|
|
485
|
-
<option value='Jia'>Jia</option>
|
|
486
|
-
</select>
|
|
487
|
-
</label>
|
|
488
|
-
<br />
|
|
489
|
-
<label>
|
|
490
|
-
Pool Type:
|
|
491
|
-
<select
|
|
492
|
-
name='pool_type'
|
|
493
|
-
value={poolType}
|
|
494
|
-
onChange={(event: any) => {
|
|
495
|
-
setPoolType(event.target.value)
|
|
496
|
-
}}
|
|
497
|
-
>
|
|
498
|
-
<option value='Invoice'>Invoice</option>
|
|
499
|
-
<option value='CreditLine'>CreditLine</option>
|
|
500
|
-
<option value='Stream'>Stream</option>
|
|
501
|
-
</select>
|
|
502
|
-
</label>
|
|
503
|
-
<label>
|
|
504
|
-
Reference ID (For querying through ARWeave):
|
|
505
|
-
<input
|
|
506
|
-
type='text'
|
|
507
|
-
value={referenceId}
|
|
508
|
-
onChange={(event: any) => {
|
|
509
|
-
setReferenceId(event.target.value)
|
|
510
|
-
}}
|
|
511
|
-
/>
|
|
512
|
-
</label>
|
|
513
|
-
<br />
|
|
514
|
-
<button type='submit' style={{ width: 'fit-content' }}>
|
|
515
|
-
Query Metadata
|
|
516
|
-
</button>
|
|
517
|
-
<br />
|
|
518
|
-
<a
|
|
519
|
-
href={`https://arweave.net/${queryResult}`}
|
|
520
|
-
target='_blank'
|
|
521
|
-
rel='noreferrer'
|
|
522
|
-
>
|
|
523
|
-
{queryResult}
|
|
524
|
-
</a>
|
|
525
|
-
</form>
|
|
526
|
-
</div>
|
|
527
|
-
<div
|
|
528
|
-
style={{
|
|
529
|
-
border: '1px solid gray',
|
|
530
|
-
padding: '0px 10px 20px 10px',
|
|
531
|
-
borderRadius: '10px',
|
|
532
|
-
}}
|
|
533
|
-
>
|
|
534
|
-
<h3>Example 5. Declare payment for Receivable by reference ID</h3>
|
|
535
|
-
<form
|
|
536
|
-
onSubmit={declarePaymentSubmit}
|
|
537
|
-
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
538
|
-
>
|
|
539
|
-
<label>
|
|
540
|
-
Transaction sender:
|
|
541
|
-
<input type='text' value={address} disabled />
|
|
542
|
-
</label>
|
|
543
|
-
<br />
|
|
544
|
-
<label>
|
|
545
|
-
Reference ID (For querying through ARWeave):
|
|
546
|
-
<input
|
|
547
|
-
type='text'
|
|
548
|
-
value={referenceId}
|
|
549
|
-
onChange={(event: any) => {
|
|
550
|
-
setReferenceId(event.target.value)
|
|
551
|
-
}}
|
|
552
|
-
/>
|
|
553
|
-
</label>
|
|
554
|
-
<br />
|
|
555
|
-
<label>
|
|
556
|
-
Payment Amount:
|
|
557
|
-
<input
|
|
558
|
-
type='text'
|
|
559
|
-
value={paymentAmount}
|
|
560
|
-
onChange={(event: any) => {
|
|
561
|
-
setPaymentAmount(event.target.value)
|
|
562
|
-
}}
|
|
563
|
-
/>
|
|
564
|
-
</label>
|
|
565
|
-
<br />
|
|
566
|
-
<button type='submit' style={{ width: 'fit-content' }}>
|
|
567
|
-
Declare Payment
|
|
568
|
-
</button>
|
|
569
|
-
<br />
|
|
570
|
-
{paymentResult}
|
|
571
|
-
</form>
|
|
572
|
-
</div>
|
|
573
|
-
<div
|
|
574
|
-
style={{
|
|
575
|
-
border: '1px solid gray',
|
|
576
|
-
padding: '0px 10px 20px 10px',
|
|
577
|
-
borderRadius: '10px',
|
|
578
|
-
}}
|
|
579
|
-
>
|
|
580
|
-
<h3>Example 6. Prefund ARWeave</h3>
|
|
581
|
-
<form
|
|
582
|
-
onSubmit={prefundARWeaveSubmit}
|
|
583
|
-
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
584
|
-
>
|
|
585
|
-
<label>
|
|
586
|
-
Transaction sender:
|
|
587
|
-
<input type='text' value={address} disabled />
|
|
588
|
-
</label>
|
|
589
|
-
<br />
|
|
590
|
-
<label>
|
|
591
|
-
Amount (Atomic Units):
|
|
592
|
-
<input
|
|
593
|
-
type='text'
|
|
594
|
-
value={prefundAmt}
|
|
595
|
-
onChange={(event: any) => {
|
|
596
|
-
setPrefundAmt(event.target.value)
|
|
597
|
-
}}
|
|
598
|
-
/>
|
|
599
|
-
</label>
|
|
600
|
-
<br />
|
|
601
|
-
<button type='submit' style={{ width: 'fit-content' }}>
|
|
602
|
-
Prefund ARWeave
|
|
603
|
-
</button>
|
|
604
|
-
{prefundResult}
|
|
605
|
-
</form>
|
|
606
|
-
</div>
|
|
607
|
-
</div>
|
|
608
|
-
)
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
export default (
|
|
612
|
-
<WalletWrapper>
|
|
613
|
-
<Fixture />
|
|
614
|
-
</WalletWrapper>
|
|
615
|
-
)
|
|
1
|
+
/* eslint-disable jsx-a11y/label-has-associated-control */
|
|
2
|
+
/* eslint-disable react/jsx-boolean-value */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
|
+
import { useEffect, useState } from 'react'
|
|
5
|
+
import {
|
|
6
|
+
EAService,
|
|
7
|
+
useCreditRecordDetails,
|
|
8
|
+
usePoolContract,
|
|
9
|
+
ARWeaveService,
|
|
10
|
+
ReceivableService,
|
|
11
|
+
} from '@huma-finance/sdk'
|
|
12
|
+
import { POOL_NAME, POOL_TYPE } from '@huma-finance/shared'
|
|
13
|
+
import { useAccount } from 'wagmi'
|
|
14
|
+
import { ethers } from 'ethers'
|
|
15
|
+
import { JsonRpcProvider, Web3Provider } from '@ethersproject/providers'
|
|
16
|
+
|
|
17
|
+
import { WalletWrapper } from './WalletWrapper'
|
|
18
|
+
|
|
19
|
+
const TEST_PRIVATE_KEY = 'REPLACE_WITH_YOUR_PRIVATE_KEY'
|
|
20
|
+
const INFURA_PROVIDER_KEY = 'REPLACE_WITH_YOUR_INFURA_PROVIDER_KEY'
|
|
21
|
+
|
|
22
|
+
function Fixture() {
|
|
23
|
+
const { address, connector } = useAccount()
|
|
24
|
+
const [chainId, setChainId] = useState(0)
|
|
25
|
+
const [signer, setSigner] = useState<Web3Provider | null>(null)
|
|
26
|
+
|
|
27
|
+
// useCreditRecordDetails
|
|
28
|
+
const [userAddress, setUserAddress] = useState('')
|
|
29
|
+
const [poolName, setPoolName] = useState<POOL_NAME>(POOL_NAME.HumaCreditLine)
|
|
30
|
+
const [poolType, setPoolType] = useState<POOL_TYPE>(POOL_TYPE.CreditLine)
|
|
31
|
+
const provider = new JsonRpcProvider(
|
|
32
|
+
`https://goerli.infura.io/v3/${INFURA_PROVIDER_KEY}`,
|
|
33
|
+
{
|
|
34
|
+
name: 'goerli',
|
|
35
|
+
chainId: 5,
|
|
36
|
+
},
|
|
37
|
+
)
|
|
38
|
+
const [creditRecordDetails, refreshCreditRecordDetails] =
|
|
39
|
+
useCreditRecordDetails(userAddress, provider, chainId, poolName, poolType)
|
|
40
|
+
|
|
41
|
+
// mintReceivableWithMetadata
|
|
42
|
+
const [recipientAddress, setRecipientAddress] = useState(address)
|
|
43
|
+
const [receivableAmount, setReceivableAmount] = useState(100)
|
|
44
|
+
const [maturityDate, setMaturityDate] = useState(Date.now())
|
|
45
|
+
const [metadata, setMetadata] = useState(JSON.stringify({ exampleKey: 1 }))
|
|
46
|
+
// Used to set an example tag on the metadata uploaded to ARweave which we can use to query by later
|
|
47
|
+
const [referenceId, setReferenceId] = useState('3')
|
|
48
|
+
const [mintResult, setMintResult] = useState<any>('')
|
|
49
|
+
|
|
50
|
+
// usePoolContract
|
|
51
|
+
const poolContract = usePoolContract(
|
|
52
|
+
signer!,
|
|
53
|
+
chainId,
|
|
54
|
+
POOL_NAME.HumaCreditLine,
|
|
55
|
+
POOL_TYPE.CreditLine,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
// EAService.approve
|
|
59
|
+
const [borrowerAddress, setBorrowerAddress] = useState('')
|
|
60
|
+
const [receivableAddress, setReceivableAddress] = useState(
|
|
61
|
+
'0xC2AC172a293d68f548ea343414584aA37eb29Dcd',
|
|
62
|
+
)
|
|
63
|
+
const [receivableParam, setReceivableParam] = useState('')
|
|
64
|
+
const [approveResult, setApproveResult] = useState<any>('')
|
|
65
|
+
|
|
66
|
+
const [queryResult, setQueryResult] = useState<any>('')
|
|
67
|
+
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
;(async () => {
|
|
70
|
+
if (address && connector && window.ethereum) {
|
|
71
|
+
setChainId(await connector.getChainId())
|
|
72
|
+
setRecipientAddress(address)
|
|
73
|
+
// @ts-ignore
|
|
74
|
+
const tmp = new ethers.providers.Web3Provider(window.ethereum)
|
|
75
|
+
setSigner(tmp)
|
|
76
|
+
}
|
|
77
|
+
})()
|
|
78
|
+
}, [address, connector])
|
|
79
|
+
|
|
80
|
+
const handleRefreshCreditRecordDetailsSubmit = (event: any) => {
|
|
81
|
+
event.preventDefault()
|
|
82
|
+
refreshCreditRecordDetails()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const handleEAApproveSubmit = async (event: any) => {
|
|
86
|
+
event.preventDefault()
|
|
87
|
+
try {
|
|
88
|
+
const data = await EAService.approve(
|
|
89
|
+
{
|
|
90
|
+
poolAddress: poolContract!.address,
|
|
91
|
+
borrowerWalletAddress: borrowerAddress,
|
|
92
|
+
receivableAddress,
|
|
93
|
+
receivableParam,
|
|
94
|
+
},
|
|
95
|
+
5,
|
|
96
|
+
)
|
|
97
|
+
setApproveResult('Success')
|
|
98
|
+
console.log(data)
|
|
99
|
+
} catch (error) {
|
|
100
|
+
setApproveResult('Failed')
|
|
101
|
+
console.log(error)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const handleMintReceivableWithMetadataSubmit = async (event: any) => {
|
|
106
|
+
event.preventDefault()
|
|
107
|
+
|
|
108
|
+
if (signer === null) return
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
const data = await ReceivableService.createReceivableWithMetadata(
|
|
112
|
+
signer,
|
|
113
|
+
TEST_PRIVATE_KEY!,
|
|
114
|
+
chainId,
|
|
115
|
+
poolName,
|
|
116
|
+
poolType,
|
|
117
|
+
840, // currency code for USD
|
|
118
|
+
receivableAmount,
|
|
119
|
+
maturityDate,
|
|
120
|
+
JSON.parse(metadata),
|
|
121
|
+
referenceId,
|
|
122
|
+
[],
|
|
123
|
+
)
|
|
124
|
+
const txResult = await data.wait()
|
|
125
|
+
setMintResult(`Success, Tx Hash: ${txResult.transactionHash}`)
|
|
126
|
+
console.log(data)
|
|
127
|
+
} catch (error) {
|
|
128
|
+
setMintResult(`Failed, check console for errors`)
|
|
129
|
+
console.log(error)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const queryARWeaveSubmit = async (event: any) => {
|
|
134
|
+
event.preventDefault()
|
|
135
|
+
|
|
136
|
+
if (address == null) return
|
|
137
|
+
|
|
138
|
+
try {
|
|
139
|
+
const data = await ARWeaveService.queryForMetadata(
|
|
140
|
+
chainId,
|
|
141
|
+
address,
|
|
142
|
+
referenceId,
|
|
143
|
+
)
|
|
144
|
+
setQueryResult(data)
|
|
145
|
+
console.log(data)
|
|
146
|
+
} catch (error) {
|
|
147
|
+
setQueryResult(`Failed, check console for errors`)
|
|
148
|
+
console.log(error)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const [prefundAmt, setPrefundAmt] = useState<number>(0)
|
|
153
|
+
const [prefundResult, setPrefundResult] = useState<string>('')
|
|
154
|
+
const prefundARWeaveSubmit = async (event: any) => {
|
|
155
|
+
event.preventDefault()
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
const data = await ARWeaveService.prefundBundlr(
|
|
159
|
+
ARWeaveService.getBundlrNetworkConfig(5),
|
|
160
|
+
signer,
|
|
161
|
+
prefundAmt,
|
|
162
|
+
)
|
|
163
|
+
setPrefundResult('Success')
|
|
164
|
+
console.log(data)
|
|
165
|
+
} catch (error) {
|
|
166
|
+
setPrefundResult(`Failed, check console for errors`)
|
|
167
|
+
console.log(error)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const [paymentAmount, setPaymentAmount] = useState<number>(0)
|
|
172
|
+
const [paymentResult, setPaymentResult] = useState<string>('')
|
|
173
|
+
const declarePaymentSubmit = async (event: any) => {
|
|
174
|
+
event.preventDefault()
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
const data =
|
|
178
|
+
await ReceivableService.declareReceivablePaymentByReferenceId(
|
|
179
|
+
signer?.getSigner()!,
|
|
180
|
+
referenceId,
|
|
181
|
+
paymentAmount,
|
|
182
|
+
)
|
|
183
|
+
const txResult = await data.wait()
|
|
184
|
+
setPaymentResult(`Success, Tx Hash: ${txResult.transactionHash}`)
|
|
185
|
+
console.log(data)
|
|
186
|
+
} catch (error) {
|
|
187
|
+
setPaymentResult(`Failed, check console for errors`)
|
|
188
|
+
console.log(error)
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return (
|
|
193
|
+
<div
|
|
194
|
+
style={{
|
|
195
|
+
fontFamily: 'Helvetica',
|
|
196
|
+
display: 'flex',
|
|
197
|
+
flexDirection: 'column',
|
|
198
|
+
gap: '15px',
|
|
199
|
+
}}
|
|
200
|
+
>
|
|
201
|
+
<div
|
|
202
|
+
style={{
|
|
203
|
+
border: '1px solid gray',
|
|
204
|
+
padding: '0px 10px 20px 10px',
|
|
205
|
+
borderRadius: '10px',
|
|
206
|
+
}}
|
|
207
|
+
>
|
|
208
|
+
<h3>Example 1. React hooks to get credit loan details</h3>
|
|
209
|
+
<form
|
|
210
|
+
onSubmit={handleRefreshCreditRecordDetailsSubmit}
|
|
211
|
+
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
212
|
+
>
|
|
213
|
+
<label>
|
|
214
|
+
Network: <input disabled type='text' defaultValue='Goerli' />
|
|
215
|
+
</label>
|
|
216
|
+
<br />
|
|
217
|
+
<label>
|
|
218
|
+
User Address:
|
|
219
|
+
<input
|
|
220
|
+
type='text'
|
|
221
|
+
value={userAddress}
|
|
222
|
+
onChange={(event: any) => {
|
|
223
|
+
setUserAddress(event.target.value)
|
|
224
|
+
}}
|
|
225
|
+
/>
|
|
226
|
+
</label>
|
|
227
|
+
<br />
|
|
228
|
+
<label>
|
|
229
|
+
Pool Name:
|
|
230
|
+
<select
|
|
231
|
+
name='pool_name'
|
|
232
|
+
value={poolName}
|
|
233
|
+
onChange={(event: any) => {
|
|
234
|
+
setPoolName(event.target.value)
|
|
235
|
+
}}
|
|
236
|
+
>
|
|
237
|
+
<option value='RequestNetwork'>RequestNetwork</option>
|
|
238
|
+
<option value='HumaCreditLine'>HumaCreditLine</option>
|
|
239
|
+
<option value='Superfluid'>Superfluid</option>
|
|
240
|
+
<option value='Jia'>Jia</option>
|
|
241
|
+
</select>
|
|
242
|
+
</label>
|
|
243
|
+
<br />
|
|
244
|
+
<label>
|
|
245
|
+
Pool Type:
|
|
246
|
+
<select
|
|
247
|
+
name='pool_type'
|
|
248
|
+
value={poolType}
|
|
249
|
+
onChange={(event: any) => {
|
|
250
|
+
setPoolType(event.target.value)
|
|
251
|
+
}}
|
|
252
|
+
>
|
|
253
|
+
<option value='Invoice'>Invoice</option>
|
|
254
|
+
<option value='CreditLine'>CreditLine</option>
|
|
255
|
+
<option value='Stream'>Stream</option>
|
|
256
|
+
</select>
|
|
257
|
+
</label>
|
|
258
|
+
<br />
|
|
259
|
+
<button type='submit' style={{ width: 'fit-content' }}>
|
|
260
|
+
Get Credit Record Details
|
|
261
|
+
</button>
|
|
262
|
+
</form>
|
|
263
|
+
{creditRecordDetails && (
|
|
264
|
+
<div>
|
|
265
|
+
<h2>Credit Record Details:</h2>
|
|
266
|
+
<ul>aprInBps: {creditRecordDetails.aprInBps}</ul>
|
|
267
|
+
<ul>correction: {creditRecordDetails.correction.toString()}</ul>
|
|
268
|
+
<ul>creditLimit: {creditRecordDetails.creditLimit.toString()}</ul>
|
|
269
|
+
<ul>
|
|
270
|
+
defaultAmount: {creditRecordDetails.defaultAmount.toString()}
|
|
271
|
+
</ul>
|
|
272
|
+
<ul>dueDate: {creditRecordDetails.dueDate.toString()}</ul>
|
|
273
|
+
<ul>
|
|
274
|
+
feesAndInterestDue:{' '}
|
|
275
|
+
{creditRecordDetails.feesAndInterestDue.toString()}
|
|
276
|
+
</ul>
|
|
277
|
+
<ul>intervalInDays: {creditRecordDetails.intervalInDays}</ul>
|
|
278
|
+
<ul>missedPeriods: {creditRecordDetails.missedPeriods}</ul>
|
|
279
|
+
<ul>remainingPeriods: {creditRecordDetails.remainingPeriods}</ul>
|
|
280
|
+
<ul>state: {creditRecordDetails.state}</ul>
|
|
281
|
+
<ul>totalDue: {creditRecordDetails.totalDue.toString()}</ul>
|
|
282
|
+
<ul>
|
|
283
|
+
unbilledPrincipal:{' '}
|
|
284
|
+
{creditRecordDetails.unbilledPrincipal.toString()}
|
|
285
|
+
</ul>
|
|
286
|
+
</div>
|
|
287
|
+
)}
|
|
288
|
+
</div>
|
|
289
|
+
<div
|
|
290
|
+
style={{
|
|
291
|
+
border: '1px solid gray',
|
|
292
|
+
padding: '0px 10px 20px 10px',
|
|
293
|
+
borderRadius: '10px',
|
|
294
|
+
}}
|
|
295
|
+
>
|
|
296
|
+
<h3>Example 2. React hooks to get ethers.js contract instances</h3>
|
|
297
|
+
{poolContract?.address}
|
|
298
|
+
</div>
|
|
299
|
+
<div
|
|
300
|
+
style={{
|
|
301
|
+
border: '1px solid gray',
|
|
302
|
+
padding: '0px 10px 20px 10px',
|
|
303
|
+
borderRadius: '10px',
|
|
304
|
+
}}
|
|
305
|
+
>
|
|
306
|
+
<form
|
|
307
|
+
onSubmit={handleEAApproveSubmit}
|
|
308
|
+
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
309
|
+
>
|
|
310
|
+
<h3>Test EAService.approve</h3>
|
|
311
|
+
<label>
|
|
312
|
+
Borrower Address:
|
|
313
|
+
<input
|
|
314
|
+
type='text'
|
|
315
|
+
value={borrowerAddress}
|
|
316
|
+
onChange={(event: any) => {
|
|
317
|
+
setBorrowerAddress(event.target.value)
|
|
318
|
+
}}
|
|
319
|
+
/>
|
|
320
|
+
</label>
|
|
321
|
+
<br />
|
|
322
|
+
<label>
|
|
323
|
+
Receivable Address:
|
|
324
|
+
<input
|
|
325
|
+
type='text'
|
|
326
|
+
value={receivableAddress}
|
|
327
|
+
onChange={(event: any) => {
|
|
328
|
+
setReceivableAddress(event.target.value)
|
|
329
|
+
}}
|
|
330
|
+
/>
|
|
331
|
+
</label>
|
|
332
|
+
<br />
|
|
333
|
+
<label>
|
|
334
|
+
Receivable Parameter (Token ID):
|
|
335
|
+
<input
|
|
336
|
+
type='text'
|
|
337
|
+
value={receivableParam}
|
|
338
|
+
onChange={(event: any) => {
|
|
339
|
+
setReceivableParam(event.target.value)
|
|
340
|
+
}}
|
|
341
|
+
/>
|
|
342
|
+
</label>
|
|
343
|
+
<br />
|
|
344
|
+
<button type='submit' style={{ width: 'fit-content' }}>
|
|
345
|
+
Get Credit Record Details
|
|
346
|
+
</button>
|
|
347
|
+
</form>
|
|
348
|
+
{approveResult}
|
|
349
|
+
</div>
|
|
350
|
+
<div
|
|
351
|
+
style={{
|
|
352
|
+
border: '1px solid gray',
|
|
353
|
+
padding: '0px 10px 20px 10px',
|
|
354
|
+
borderRadius: '10px',
|
|
355
|
+
}}
|
|
356
|
+
>
|
|
357
|
+
<form
|
|
358
|
+
onSubmit={handleMintReceivableWithMetadataSubmit}
|
|
359
|
+
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
360
|
+
>
|
|
361
|
+
<h3>
|
|
362
|
+
Example 3. Create RealWorldReceivable token with metadata on ARWeave
|
|
363
|
+
</h3>
|
|
364
|
+
<label>
|
|
365
|
+
Recipient Address:
|
|
366
|
+
<input
|
|
367
|
+
type='text'
|
|
368
|
+
value={recipientAddress}
|
|
369
|
+
onChange={(event: any) => {
|
|
370
|
+
setRecipientAddress(event.target.value)
|
|
371
|
+
}}
|
|
372
|
+
/>
|
|
373
|
+
</label>
|
|
374
|
+
<br />
|
|
375
|
+
<label>
|
|
376
|
+
Pool Name:
|
|
377
|
+
<select
|
|
378
|
+
name='pool_name'
|
|
379
|
+
value={poolName}
|
|
380
|
+
onChange={(event: any) => {
|
|
381
|
+
setPoolName(event.target.value)
|
|
382
|
+
}}
|
|
383
|
+
>
|
|
384
|
+
<option value='RequestNetwork'>RequestNetwork</option>
|
|
385
|
+
<option value='HumaCreditLine'>HumaCreditLine</option>
|
|
386
|
+
<option value='Superfluid'>Superfluid</option>
|
|
387
|
+
<option value='Jia'>Jia</option>
|
|
388
|
+
</select>
|
|
389
|
+
</label>
|
|
390
|
+
<br />
|
|
391
|
+
<label>
|
|
392
|
+
Pool Type:
|
|
393
|
+
<select
|
|
394
|
+
name='pool_type'
|
|
395
|
+
value={poolType}
|
|
396
|
+
onChange={(event: any) => {
|
|
397
|
+
setPoolType(event.target.value)
|
|
398
|
+
}}
|
|
399
|
+
>
|
|
400
|
+
<option value='Invoice'>Invoice</option>
|
|
401
|
+
<option value='CreditLine'>CreditLine</option>
|
|
402
|
+
<option value='Stream'>Stream</option>
|
|
403
|
+
</select>
|
|
404
|
+
</label>
|
|
405
|
+
<br />
|
|
406
|
+
<label>
|
|
407
|
+
Receivable Amount:
|
|
408
|
+
<input
|
|
409
|
+
type='text'
|
|
410
|
+
value={receivableAmount}
|
|
411
|
+
onChange={(event: any) => {
|
|
412
|
+
setReceivableAmount(event.target.value)
|
|
413
|
+
}}
|
|
414
|
+
/>
|
|
415
|
+
</label>
|
|
416
|
+
<label>
|
|
417
|
+
Maturity Date:
|
|
418
|
+
<input
|
|
419
|
+
type='text'
|
|
420
|
+
value={maturityDate}
|
|
421
|
+
onChange={(event: any) => {
|
|
422
|
+
setMaturityDate(event.target.value)
|
|
423
|
+
}}
|
|
424
|
+
/>
|
|
425
|
+
</label>
|
|
426
|
+
<br />
|
|
427
|
+
<label>
|
|
428
|
+
Metadata:
|
|
429
|
+
<input
|
|
430
|
+
type='text'
|
|
431
|
+
value={metadata}
|
|
432
|
+
onChange={(event: any) => {
|
|
433
|
+
setMetadata(event.target.value)
|
|
434
|
+
}}
|
|
435
|
+
/>
|
|
436
|
+
</label>
|
|
437
|
+
<br />
|
|
438
|
+
<label>
|
|
439
|
+
Reference ID (For querying through ARWeave):
|
|
440
|
+
<input
|
|
441
|
+
type='text'
|
|
442
|
+
value={referenceId}
|
|
443
|
+
onChange={(event: any) => {
|
|
444
|
+
setReferenceId(event.target.value)
|
|
445
|
+
}}
|
|
446
|
+
/>
|
|
447
|
+
</label>
|
|
448
|
+
<button type='submit' style={{ width: 'fit-content' }}>
|
|
449
|
+
Create Receivable With Metadata
|
|
450
|
+
</button>
|
|
451
|
+
<br />
|
|
452
|
+
{mintResult}
|
|
453
|
+
</form>
|
|
454
|
+
{approveResult}
|
|
455
|
+
</div>
|
|
456
|
+
<div
|
|
457
|
+
style={{
|
|
458
|
+
border: '1px solid gray',
|
|
459
|
+
padding: '0px 10px 20px 10px',
|
|
460
|
+
borderRadius: '10px',
|
|
461
|
+
}}
|
|
462
|
+
>
|
|
463
|
+
<h3>Example 4. Query for metadata on ARWeave</h3>
|
|
464
|
+
<form
|
|
465
|
+
onSubmit={queryARWeaveSubmit}
|
|
466
|
+
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
467
|
+
>
|
|
468
|
+
<label>
|
|
469
|
+
Transaction sender:
|
|
470
|
+
<input type='text' value={address} disabled />
|
|
471
|
+
</label>
|
|
472
|
+
<br />
|
|
473
|
+
<label>
|
|
474
|
+
Pool Name:
|
|
475
|
+
<select
|
|
476
|
+
name='pool_name'
|
|
477
|
+
value={poolName}
|
|
478
|
+
onChange={(event: any) => {
|
|
479
|
+
setPoolName(event.target.value)
|
|
480
|
+
}}
|
|
481
|
+
>
|
|
482
|
+
<option value='RequestNetwork'>RequestNetwork</option>
|
|
483
|
+
<option value='HumaCreditLine'>HumaCreditLine</option>
|
|
484
|
+
<option value='Superfluid'>Superfluid</option>
|
|
485
|
+
<option value='Jia'>Jia</option>
|
|
486
|
+
</select>
|
|
487
|
+
</label>
|
|
488
|
+
<br />
|
|
489
|
+
<label>
|
|
490
|
+
Pool Type:
|
|
491
|
+
<select
|
|
492
|
+
name='pool_type'
|
|
493
|
+
value={poolType}
|
|
494
|
+
onChange={(event: any) => {
|
|
495
|
+
setPoolType(event.target.value)
|
|
496
|
+
}}
|
|
497
|
+
>
|
|
498
|
+
<option value='Invoice'>Invoice</option>
|
|
499
|
+
<option value='CreditLine'>CreditLine</option>
|
|
500
|
+
<option value='Stream'>Stream</option>
|
|
501
|
+
</select>
|
|
502
|
+
</label>
|
|
503
|
+
<label>
|
|
504
|
+
Reference ID (For querying through ARWeave):
|
|
505
|
+
<input
|
|
506
|
+
type='text'
|
|
507
|
+
value={referenceId}
|
|
508
|
+
onChange={(event: any) => {
|
|
509
|
+
setReferenceId(event.target.value)
|
|
510
|
+
}}
|
|
511
|
+
/>
|
|
512
|
+
</label>
|
|
513
|
+
<br />
|
|
514
|
+
<button type='submit' style={{ width: 'fit-content' }}>
|
|
515
|
+
Query Metadata
|
|
516
|
+
</button>
|
|
517
|
+
<br />
|
|
518
|
+
<a
|
|
519
|
+
href={`https://arweave.net/${queryResult}`}
|
|
520
|
+
target='_blank'
|
|
521
|
+
rel='noreferrer'
|
|
522
|
+
>
|
|
523
|
+
{queryResult}
|
|
524
|
+
</a>
|
|
525
|
+
</form>
|
|
526
|
+
</div>
|
|
527
|
+
<div
|
|
528
|
+
style={{
|
|
529
|
+
border: '1px solid gray',
|
|
530
|
+
padding: '0px 10px 20px 10px',
|
|
531
|
+
borderRadius: '10px',
|
|
532
|
+
}}
|
|
533
|
+
>
|
|
534
|
+
<h3>Example 5. Declare payment for Receivable by reference ID</h3>
|
|
535
|
+
<form
|
|
536
|
+
onSubmit={declarePaymentSubmit}
|
|
537
|
+
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
538
|
+
>
|
|
539
|
+
<label>
|
|
540
|
+
Transaction sender:
|
|
541
|
+
<input type='text' value={address} disabled />
|
|
542
|
+
</label>
|
|
543
|
+
<br />
|
|
544
|
+
<label>
|
|
545
|
+
Reference ID (For querying through ARWeave):
|
|
546
|
+
<input
|
|
547
|
+
type='text'
|
|
548
|
+
value={referenceId}
|
|
549
|
+
onChange={(event: any) => {
|
|
550
|
+
setReferenceId(event.target.value)
|
|
551
|
+
}}
|
|
552
|
+
/>
|
|
553
|
+
</label>
|
|
554
|
+
<br />
|
|
555
|
+
<label>
|
|
556
|
+
Payment Amount:
|
|
557
|
+
<input
|
|
558
|
+
type='text'
|
|
559
|
+
value={paymentAmount}
|
|
560
|
+
onChange={(event: any) => {
|
|
561
|
+
setPaymentAmount(event.target.value)
|
|
562
|
+
}}
|
|
563
|
+
/>
|
|
564
|
+
</label>
|
|
565
|
+
<br />
|
|
566
|
+
<button type='submit' style={{ width: 'fit-content' }}>
|
|
567
|
+
Declare Payment
|
|
568
|
+
</button>
|
|
569
|
+
<br />
|
|
570
|
+
{paymentResult}
|
|
571
|
+
</form>
|
|
572
|
+
</div>
|
|
573
|
+
<div
|
|
574
|
+
style={{
|
|
575
|
+
border: '1px solid gray',
|
|
576
|
+
padding: '0px 10px 20px 10px',
|
|
577
|
+
borderRadius: '10px',
|
|
578
|
+
}}
|
|
579
|
+
>
|
|
580
|
+
<h3>Example 6. Prefund ARWeave</h3>
|
|
581
|
+
<form
|
|
582
|
+
onSubmit={prefundARWeaveSubmit}
|
|
583
|
+
style={{ display: 'flex', flexDirection: 'column', gap: '5px' }}
|
|
584
|
+
>
|
|
585
|
+
<label>
|
|
586
|
+
Transaction sender:
|
|
587
|
+
<input type='text' value={address} disabled />
|
|
588
|
+
</label>
|
|
589
|
+
<br />
|
|
590
|
+
<label>
|
|
591
|
+
Amount (Atomic Units):
|
|
592
|
+
<input
|
|
593
|
+
type='text'
|
|
594
|
+
value={prefundAmt}
|
|
595
|
+
onChange={(event: any) => {
|
|
596
|
+
setPrefundAmt(event.target.value)
|
|
597
|
+
}}
|
|
598
|
+
/>
|
|
599
|
+
</label>
|
|
600
|
+
<br />
|
|
601
|
+
<button type='submit' style={{ width: 'fit-content' }}>
|
|
602
|
+
Prefund ARWeave
|
|
603
|
+
</button>
|
|
604
|
+
{prefundResult}
|
|
605
|
+
</form>
|
|
606
|
+
</div>
|
|
607
|
+
</div>
|
|
608
|
+
)
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
export default (
|
|
612
|
+
<WalletWrapper>
|
|
613
|
+
<Fixture />
|
|
614
|
+
</WalletWrapper>
|
|
615
|
+
)
|