1
1
import { Trans , t } from '@lingui/macro'
2
2
import { NATIVE_TOKEN , NATIVE_TOKEN_DECIMALS } from 'juice-sdk-core'
3
3
import {
4
+ JBChainId ,
4
5
useJBContractContext ,
6
+ useReadJbDirectoryPrimaryTerminalOf ,
7
+ useSuckers ,
5
8
useWriteJbMultiTerminalSendPayoutsOf ,
6
9
} from 'juice-sdk-react'
7
10
import { V4CurrencyName , V4_CURRENCY_ETH } from 'packages/v4/utils/currency'
@@ -14,7 +17,9 @@ import { Callout } from 'components/Callout/Callout'
14
17
import FormattedNumberInput from 'components/inputs/FormattedNumberInput'
15
18
import TransactionModal from 'components/modals/TransactionModal'
16
19
import { FEES_EXPLANATION } from 'components/strings'
20
+ import { NETWORKS } from 'constants/networks'
17
21
import { TxHistoryContext } from 'contexts/Transaction/TxHistoryContext'
22
+ import { ChainSelect } from 'packages/v4/components/ChainSelect'
18
23
import { PayoutsTable } from 'packages/v4/components/PayoutsTable/PayoutsTable'
19
24
import { usePayoutLimit } from 'packages/v4/hooks/usePayoutLimit'
20
25
import { useV4CurrentPayoutSplits } from 'packages/v4/hooks/useV4CurrentPayoutSplits'
@@ -34,24 +39,39 @@ export default function V4DistributePayoutsModal({
34
39
} ) {
35
40
const { data : payoutSplits } = useV4CurrentPayoutSplits ( )
36
41
const { data : payoutLimit } = usePayoutLimit ( )
37
- const { distributableAmount : distributable } = useV4DistributableAmount ( )
38
- const { contracts, projectId } = useJBContractContext ( )
42
+ const { projectId } = useJBContractContext ( )
39
43
const { addTransaction } = useContext ( TxHistoryContext )
40
44
45
+ const { data : suckers } = useSuckers ( )
46
+
41
47
const payoutLimitAmountCurrency = payoutLimit ?. currency ?? V4_CURRENCY_ETH
42
48
43
49
const [ transactionPending , setTransactionPending ] = useState < boolean > ( )
44
50
const [ loading , setLoading ] = useState < boolean > ( )
45
51
const [ distributionAmount , setDistributionAmount ] = useState < string > ( )
52
+ const [ selectedChainId , setSelectedChainId ] = useState < JBChainId > ( )
46
53
47
54
const { writeContractAsync : writeSendPayouts } =
48
55
useWriteJbMultiTerminalSendPayoutsOf ( )
49
-
56
+
57
+ const { data : terminalAddress } = useReadJbDirectoryPrimaryTerminalOf ( {
58
+ chainId : selectedChainId ,
59
+ args : [ projectId , NATIVE_TOKEN ] ,
60
+ } )
61
+
62
+ const selectedChainProjectId = suckers ?. find ( ( sucker ) => sucker . peerChainId === selectedChainId ) ?. projectId
63
+
64
+ const { distributableAmount : distributable } = useV4DistributableAmount ( {
65
+ chainId : selectedChainId ,
66
+ projectId : selectedChainProjectId
67
+ } )
68
+
50
69
async function executeDistributePayoutsTx ( ) {
51
70
if (
52
71
! payoutLimitAmountCurrency ||
53
72
! distributionAmount ||
54
- ! contracts . primaryNativeTerminal . data ||
73
+ ! selectedChainId ||
74
+ ! terminalAddress ||
55
75
! projectId
56
76
)
57
77
return
@@ -63,17 +83,18 @@ export default function V4DistributePayoutsModal({
63
83
NATIVE_TOKEN ,
64
84
parseUnits ( distributionAmount , NATIVE_TOKEN_DECIMALS ) ,
65
85
BigInt ( payoutLimitAmountCurrency ) ,
66
- 0n , // TODO?
86
+ 0n , // minTokensPaidOut
67
87
] as const
68
88
69
89
try {
70
90
const hash = await writeSendPayouts ( {
71
- address : contracts . primaryNativeTerminal . data ,
91
+ address : terminalAddress , // TODOv4 Q: or should this just be contracts.primaryNativeTerminal.address?
92
+ chainId : selectedChainId ,
72
93
args,
73
94
} )
74
95
setTransactionPending ( true )
75
96
76
- addTransaction ?.( ' Send payouts' , { hash } )
97
+ addTransaction ?.( ` Send payouts on ${ NETWORKS [ selectedChainId ] ?. label } ` , { hash } )
77
98
await waitForTransactionReceipt ( wagmiConfig , {
78
99
hash,
79
100
} )
@@ -111,6 +132,19 @@ export default function V4DistributePayoutsModal({
111
132
>
112
133
< div className = "flex flex-col gap-6" >
113
134
< Form layout = "vertical" >
135
+ { suckers && suckers . length > 1 ?
136
+ < Form . Item
137
+ className = "mb-0"
138
+ label = { < Trans > Chain</ Trans > }
139
+ >
140
+ < ChainSelect
141
+ value = { selectedChainId }
142
+ onChange = { setSelectedChainId }
143
+ suckers = { suckers }
144
+ showSelectedName
145
+ />
146
+ </ Form . Item >
147
+ : null }
114
148
< Form . Item
115
149
className = "mb-0"
116
150
label = { < Trans > Amount to pay out</ Trans > }
0 commit comments