Skip to content

Commit ce68235

Browse files
feat: Use manual contract authorization modal on operations that require gas (#2381)
1 parent 775b33e commit ce68235

File tree

10 files changed

+47
-21
lines changed

10 files changed

+47
-21
lines changed

webapp/src/components/AssetPage/BidsTable/BidsTableContent/BidsTableContent.container.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import { getLoading } from 'decentraland-dapps/dist/modules/wallet/selectors'
55
import { ACCEPT_BID_REQUEST, acceptBidRequest } from '../../../../modules/bid/actions'
66
import { getIsBidsOffChainEnabled } from '../../../../modules/features/selectors'
77
import { RootState } from '../../../../modules/reducer'
8-
import { getAddress } from '../../../../modules/wallet/selectors'
8+
import { getAddress, getWallet } from '../../../../modules/wallet/selectors'
99
import BidsTableContent from './BidsTableContent'
1010
import { MapDispatchProps, MapStateProps } from './BidsTableContent.types'
1111

1212
const mapState = (state: RootState): MapStateProps => ({
1313
address: getAddress(state),
14+
connectedNetwork: getWallet(state)?.network,
1415
isAcceptingBid: isLoadingType(getLoading(state), ACCEPT_BID_REQUEST),
1516
isBidsOffchainEnabled: getIsBidsOffChainEnabled(state)
1617
})

webapp/src/components/AssetPage/BidsTable/BidsTableContent/BidsTableContent.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useEffect, useState } from 'react'
22
import { useHistory } from 'react-router-dom'
33
import { ethers } from 'ethers'
4-
import { Bid, ListingStatus } from '@dcl/schemas'
4+
import { Bid, ListingStatus, Network } from '@dcl/schemas'
55
import { withAuthorizedAction } from 'decentraland-dapps/dist/containers'
66
import { AuthorizedAction } from 'decentraland-dapps/dist/containers/withAuthorizedAction/AuthorizationModal'
77
import { T, t } from 'decentraland-dapps/dist/modules/translation'
@@ -32,6 +32,7 @@ export function BidsTableContent({
3232
asset,
3333
isBidsOffchainEnabled,
3434
address,
35+
connectedNetwork,
3536
sortBy,
3637
isAcceptingBid,
3738
onAccept,
@@ -119,9 +120,11 @@ export function BidsTableContent({
119120
}, [asset, setIsLoading, setBids, page, sortBy, address, isMobileOrTablet])
120121

121122
const handleConfirm = (bid: Bid) => {
123+
const isAuthorizationCostingGas =
124+
bid.network === Network.ETHEREUM || (bid.network as Network.ETHEREUM | Network.MATIC) === connectedNetwork
122125
const options = getAcceptBidAuthorizationOptions(bid, () => onAccept(bid), targetContractLabel)
123126
if (isBidsOffchainEnabled && options) {
124-
onAuthorizedAction(options)
127+
onAuthorizedAction({ ...options, manual: isAuthorizationCostingGas })
125128
return
126129
}
127130
onAccept(bid)
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
import { Bid, BidSortBy } from '@dcl/schemas'
1+
import { Bid, BidSortBy, Network } from '@dcl/schemas'
22
import { WithAuthorizedActionProps } from 'decentraland-dapps/dist/containers/withAuthorizedAction'
33
import { Asset } from '../../../../modules/asset/types'
44

55
export type Props = WithAuthorizedActionProps & {
66
address?: string
7+
connectedNetwork?: Network
78
asset: Asset
89
isBidsOffchainEnabled: boolean
910
onAccept: (bid: Bid) => void
1011
isAcceptingBid: boolean
1112
sortBy: BidSortBy
1213
}
1314

14-
export type MapStateProps = Pick<Props, 'isBidsOffchainEnabled' | 'address' | 'isAcceptingBid'>
15+
export type MapStateProps = Pick<Props, 'isBidsOffchainEnabled' | 'address' | 'isAcceptingBid' | 'connectedNetwork'>
1516
export type MapDispatchProps = Pick<Props, 'onAccept'>

webapp/src/components/Bid/Bid.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React, { useCallback, useState } from 'react'
22
import { Link, useHistory } from 'react-router-dom'
33
import { ethers } from 'ethers'
4+
import { Network } from '@dcl/schemas'
45
import { withAuthorizedAction } from 'decentraland-dapps/dist/containers'
56
import { AuthorizedAction } from 'decentraland-dapps/dist/containers/withAuthorizedAction/AuthorizationModal'
67
import { T, t } from 'decentraland-dapps/dist/modules/translation/utils'
@@ -51,11 +52,13 @@ const Bid = (props: Props) => {
5152
const isNftBid = 'tokenId' in bid
5253
const assetType = isNftBid ? AssetType.NFT : AssetType.ITEM
5354
const tokenId = isNftBid ? bid.tokenId : bid.itemId
55+
const isAuthorizationCostingGas =
56+
bid.network === Network.ETHEREUM || (bid.network as Network.ETHEREUM | Network.MATIC) === wallet?.network
5457

5558
const handleConfirm = useCallback(() => {
5659
const options = getAcceptBidAuthorizationOptions(bid, () => onAccept(bid), targetContractLabel)
5760
if (isBidsOffchainEnabled && options) {
58-
onAuthorizedAction(options)
61+
onAuthorizedAction({ ...options, manual: isAuthorizationCostingGas })
5962
} else {
6063
onAccept(bid)
6164
}

webapp/src/components/BidPage/BidModal/BidModal.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useState, useCallback, useMemo } from 'react'
22
import { ethers } from 'ethers'
3-
import { ChainId, Contract, NFTCategory } from '@dcl/schemas'
3+
import { ChainId, Contract, Network, NFTCategory } from '@dcl/schemas'
44
import { withAuthorizedAction, ChainButton } from 'decentraland-dapps/dist/containers'
55
import { AuthorizedAction } from 'decentraland-dapps/dist/containers/withAuthorizedAction/AuthorizationModal'
66
import { toFixedMANAValue } from 'decentraland-dapps/dist/lib/mana'
@@ -76,8 +76,11 @@ const BidModal = (props: Props) => {
7676

7777
const handleConfirmBid = () => {
7878
const { onAuthorizedAction, onClearBidError } = props
79+
const isAuthorizationCostingGas =
80+
asset.network === Network.ETHEREUM || (asset.network as Network.ETHEREUM | Network.MATIC) === wallet?.network
7981
onClearBidError()
8082
onAuthorizedAction({
83+
manual: isAuthorizationCostingGas,
8184
targetContractName: ContractName.MANAToken,
8285
authorizedAddress: isBidsOffchainEnabled && !!offchainBidsContract ? offchainBidsContract.address : bids.address,
8386
targetContract: mana as Contract,

webapp/src/components/Modals/ConfirmRentModal/ConfirmRentModal.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ const ConfirmRentModal = ({
6969
if (operatorAddress && mana && rentals) {
7070
onClearRentalErrors()
7171
onAuthorizedAction({
72+
manual: true,
7273
targetContractName: ContractName.MANAToken,
7374
authorizedAddress: rentals.address,
7475
targetContract: mana as Contract,

webapp/src/components/Modals/RentalListingModal/AuthorizationStep/AuthorizationStep.container.ts

+18-12
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,31 @@ import {
77
} from 'decentraland-dapps/dist/modules/authorization/actions'
88
import { getError, getLoading as getAuthorizationLoading } from 'decentraland-dapps/dist/modules/authorization/selectors'
99
import { isLoadingType } from 'decentraland-dapps/dist/modules/loading/selectors'
10+
import { isWeb2Wallet } from 'decentraland-dapps/dist/modules/wallet/utils'
1011
import { ContractName, getContract } from 'decentraland-transactions'
12+
import { getIsMagicAutoSignEnabled } from '../../../../modules/features/selectors'
1113
import { RootState } from '../../../../modules/reducer'
1214
import { getPendingAuthorizationTransactions } from '../../../../modules/transaction/selectors'
1315
import { hasTransactionPending } from '../../../../modules/transaction/utils'
14-
import { getAddress } from '../../../../modules/wallet/selectors'
16+
import { getAddress, getWallet } from '../../../../modules/wallet/selectors'
1517
import AuthorizationStep from './AuthorizationStep'
1618
import { MapStateProps, MapDispatchProps, MapDispatch, OwnProps } from './AuthorizationStep.types'
1719

18-
const mapState = (state: RootState, { nft }: OwnProps): MapStateProps => ({
19-
address: getAddress(state)!,
20-
isAuthorizing: hasTransactionPending(
21-
getPendingAuthorizationTransactions(state),
22-
getContract(ContractName.Rentals, nft.chainId).address,
23-
nft.contractAddress
24-
),
25-
isConfirmingAuthorization: isLoadingType(getAuthorizationLoading(state), GRANT_TOKEN_REQUEST),
26-
error: getError(state),
27-
isFetchingAuthorizations: isLoadingType(getAuthorizationLoading(state), FETCH_AUTHORIZATIONS_REQUEST)
28-
})
20+
const mapState = (state: RootState, { nft }: OwnProps): MapStateProps => {
21+
const wallet = getWallet(state)
22+
return {
23+
address: getAddress(state)!,
24+
isWeb2AutoSigning: getIsMagicAutoSignEnabled(state) && wallet !== null && isWeb2Wallet(wallet),
25+
isAuthorizing: hasTransactionPending(
26+
getPendingAuthorizationTransactions(state),
27+
getContract(ContractName.Rentals, nft.chainId).address,
28+
nft.contractAddress
29+
),
30+
isConfirmingAuthorization: isLoadingType(getAuthorizationLoading(state), GRANT_TOKEN_REQUEST),
31+
error: getError(state),
32+
isFetchingAuthorizations: isLoadingType(getAuthorizationLoading(state), FETCH_AUTHORIZATIONS_REQUEST)
33+
}
34+
}
2935

3036
const mapDispatch = (dispatch: MapDispatch): MapDispatchProps => ({
3137
onAuthorize: authorization => dispatch(grantTokenRequest(authorization)),

webapp/src/components/Modals/RentalListingModal/AuthorizationStep/AuthorizationStep.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const AuthorizationStep = (props: Props) => {
1414
onCancel,
1515
address,
1616
isAuthorizing,
17+
isWeb2AutoSigning,
1718
isConfirmingAuthorization,
1819
nft,
1920
error,
@@ -121,7 +122,7 @@ const AuthorizationStep = (props: Props) => {
121122
{isConfirmingAuthorization ? (
122123
<div className={styles.confirmTransaction}>
123124
<Loader active size="small" className={styles.confirmTransactionLoader} />
124-
<p>{t('rental_modal.authorization_step.confirm')}</p>
125+
<p>{!isWeb2AutoSigning ? t('rental_modal.authorization_step.confirm') : null}</p>
125126
</div>
126127
) : (
127128
<Button primary fluid loading={isLoading} onClick={handleSubmit} disabled={isLoading}>

webapp/src/components/Modals/RentalListingModal/AuthorizationStep/AuthorizationStep.types.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export type Props = {
1111
nft: NFT
1212
isAuthorizing: boolean
1313
isConfirmingAuthorization: boolean
14+
isWeb2AutoSigning: boolean
1415
address: string
1516
error: string | null
1617
isFetchingAuthorizations: boolean
@@ -19,7 +20,10 @@ export type Props = {
1920
onFetchAuthorizations: typeof fetchAuthorizationsRequest
2021
}
2122

22-
export type MapStateProps = Pick<Props, 'address' | 'isAuthorizing' | 'isConfirmingAuthorization' | 'error' | 'isFetchingAuthorizations'>
23+
export type MapStateProps = Pick<
24+
Props,
25+
'address' | 'isAuthorizing' | 'isConfirmingAuthorization' | 'error' | 'isFetchingAuthorizations' | 'isWeb2AutoSigning'
26+
>
2327
export type MapDispatchProps = Pick<Props, 'onAuthorize' | 'onFetchAuthorizations'>
2428
export type MapDispatch = Dispatch<GrantTokenRequestAction | FetchAuthorizationsRequestAction>
2529
export type OwnProps = Pick<Props, 'nft' | 'onCancel'>

webapp/src/components/SellPage/SellModal/SellModal.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,10 @@ const SellModal = (props: Props) => {
123123

124124
const handleSubmit = () => {
125125
onClearOrderErrors()
126+
const isAuthorizationCostingGas =
127+
nft.network === Network.ETHEREUM || (nft.network as Network.ETHEREUM | Network.MATIC) === wallet.network
126128
onAuthorizedAction({
129+
manual: isAuthorizationCostingGas,
127130
authorizationType: AuthorizationType.APPROVAL,
128131
authorizedAddress:
129132
!!offchainOrdersContract && isOffchainPublicNFTOrdersEnabled ? offchainOrdersContract.address : marketplace.address,

0 commit comments

Comments
 (0)