diff --git a/apps/portal/redirects.mjs b/apps/portal/redirects.mjs index 72e1e9841cd..78b98454c77 100644 --- a/apps/portal/redirects.mjs +++ b/apps/portal/redirects.mjs @@ -3,961 +3,1000 @@ import { unrealEngineRedirects } from "./src/app/unreal-engine/redirects.mjs"; const reactRedirects = { - "/react": "/react/v4", - "/react/connecting-wallets": "/react/v4/connecting-wallets", - // providers - "/react/react.thirdwebprovider": "/react/v4/ThirdwebProvider", - "/react/react.thirdwebsdkprovider": "/react/v4/ThirdwebSDKProvider", - // components - "/react/react.connectwallet": "/react/v4/components/ConnectWallet", - "/react/react.web3button": "/react/v4/components/Web3Button", - "/react/react.thirdwebnftmedia": "/react/v4/components/ThirdwebNftMedia", - "/react/react.mediarenderer": "/react/v4/components/MediaRenderer", - // wallets - "/react/react.metamaskwallet": "/references/react/v4/metamaskWallet", - "/react/react.coinbasewallet": "/references/react/v4/coinbaseWallet", - "/react/react.walletconnect": "/references/react/v4/walletconnect", - "/react/react.smartwallet": "/references/react/v4/smartWallet", - "/react/react.embeddedwallet": "/references/react/v4/embeddedWallet", - "/react/react.paperwallet": "/references/react/v4/embeddedWallet", - "/react/react.localwallet": "/references/react/v4/localWallet", - "/react/react.trustWallet": "/references/react/v4/trustWallet", - "/react/react.zerion": "/references/react/v4/zerionWallet", - "/react/react.magiclink": "/references/react/v4/magicLink", - "/react/react.safewallet": "/references/react/v4/safeWallet", - "/react/react.blocto": "/references/react/v4/bloctoWallet", - "/react/react.frame": "/references/react/v4/frameWallet", - "/react/react.phantom": "/references/react/v4/phantomWallet", - "/react/react.rainbowWallet": "/references/react/v4/rainbowWallet", - "/react/react.coin98": "/references/react/v4/coin98Wallet", - "/react/react.core": "/references/react/v4/coreWallet", - "/react/react.defiwallet": "/references/react/v4/cryptoDefiWallet", - "/react/react.okx": "/references/react/v4/okxWallet", - "/react/react.onekey": "/references/react/v4/oneKeyWallet", - "/react/react.rabby": "/references/react/v4/rabbyWallet", - // hooks - "/react/react.useaddress": "/references/react/v4/useAddress", - "/react/react.usecontract": "/references/react/v4/useContract", - "/react/react.usecontractread": "/references/react/v4/useContractRead", - "/react/react.usecontractwrite": "/references/react/v4/useContractWrite", - "/react/react.usecontractevents": "/references/react/v4/useContractEvents", - "/react/react.usesdk": "/references/react/v4/useSDK", - "/react/react.useactiveclaimcondition": - "/references/react/v4/useActiveClaimCondition", - "/react/react.useactiveclaimconditionforwallet": - "/references/react/v4/useActiveClaimConditionForWallet", - "/react/react.useclaimconditions": "/references/react/v4/useClaimConditions", - "/react/react.useclaimerproofs": "/references/react/v4/useClaimerProofs", - "/react/react.useclaimineligibilityreasons": - "/references/react/v4/useClaimIneligibilityReasons", - "/react/react.usesetclaimconditions": - "/references/react/v4/useSetClaimConditions", - "/react/react.usebatchestoreveal": "/references/react/v4/useBatchesToReveal", - "/react/react.usedelayedreveallazymint": - "/references/react/v4/useDelayedRevealLazyMint", - "/react/react.usereveallazymint": "/references/react/v4/useRevealLazyMint", - "/react/react.useacceptdirectlistingoffer": - "/references/react/v4/useAcceptDirectListingOffer", - "/react/react.useactivelistings": "/references/react/v4/useActiveListings", - "/react/react.useauctionwinner": "/references/react/v4/useAuctionWinner", - "/react/react.usebidbuffer": "/references/react/v4/useBidBuffer", - "/react/react.usebuydirectlisting": - "/references/react/v4/useBuyDirectListing", - "/react/react.usebuynow": "/references/react/v4/useBuyNow", - "/react/react.usecanceldirectlisting": - "/references/react/v4/useCancelDirectListing", - "/react/react.usecancelenglishauction": - "/references/react/v4/useCancelEnglishAuction", - "/react/react.usecancellisting": "/references/react/v4/useCancelListing", - "/react/react.usecreateauctionlisting": - "/references/react/v4/useCreateAuctionListing", - "/react/react.usecreatedirectlisting": - "/references/react/v4/useCreateDirectListing", - "/react/react.usedirectlisting": "/references/react/v4/useDirectListing", - "/react/react.usedirectlistings": "/references/react/v4/useDirectListings", - "/react/react.usedirectlistingscount": - "/references/react/v4/useDirectListingsCount", - "/react/react.useenglishauction": "/references/react/v4/useEnglishAuction", - "/react/react.useenglishauctions": "/references/react/v4/useEnglishAuctions", - "/react/react.useenglishauctionscount": - "/references/react/v4/useEnglishAuctionsCount", - "/react/react.useenglishauctionwinningbid": - "/references/react/v4/useEnglishAuctionWinningBid", - "/react/react.useexecuteauctionsale": - "/references/react/v4/useExecuteAuctionSale", - "/react/react.uselisting": "/references/react/v4/useListing", - "/react/react.uselistings": "/references/react/v4/useListings", - "/react/react.uselistingscount": "/references/react/v4/useListingsCount", - "/react/react.usemakebid": "/references/react/v4/useMakeBid", - "/react/react.usemakeoffer": "/references/react/v4/useMakeOffer", - "/react/react.useminimumnextbid": "/references/react/v4/useMinimumNextBid", - "/react/react.useoffers": "/references/react/v4/useOffers", - "/react/react.usevaliddirectlistings": - "/references/react/v4/useValidDirectListings", - "/react/react.usevalidenglishauctions": - "/references/react/v4/useValidEnglishAuctions", - "/react/react.usewinningbid": "/references/react/v4/useWinningBid", - "/react/react.usecompilermetadata": - "/references/react/v4/useCompilerMetadata", - "/react/react.usecontracttype": "/references/react/v4/useContractType", - "/react/react.usemetadata": "/references/react/v4/useMetadata", - "/react/react.useresolvedmediatype": - "/references/react/v4/useResolvedMediaType", - "/react/react.useupdatemetadata": "/references/react/v4/useUpdateMetadata", - "/react/react.usechain": "/references/react/v4/useChain", - "/react/react.useSwitchChain": "/references/react/v4/useSwitchChain", - "/react/react.usechainid": "/references/react/v4/useChainId", - "/react/react.usenft": "/references/react/v4/useNFT", - "/react/react.useairdropnft": "/references/react/v4/useAirdropNFT", - "/react/react.useburnnft": "/references/react/v4/useBurnNFT", - "/react/react.usemintnft": "/references/react/v4/useMintNFT", - "/react/react.usemintnftsupply": "/references/react/v4/useMintNFTSupply", - "/react/react.usenftbalance": "/references/react/v4/useNFTBalance", - "/react/react.usenfts": "/references/react/v4/useNFTs", - "/react/react.useownednfts": "/references/react/v4/useOwnedNFTs", - "/react/react.usetotalcirculatingsupply": - "/references/react/v4/useTotalCirculatingSupply", - "/react/react.usetotalcount": "/references/react/v4/useTotalCount", - "/react/react.usetransfernft": "/references/react/v4/useTransferNFT", - "/react/react.useclaimednfts": "/references/react/v4/useClaimedNFTs", - "/react/react.useclaimednftsupply": - "/references/react/v4/useClaimedNFTSupply", - "/react/react.useclaimnft": "/references/react/v4/useClaimNFT", - "/react/react.uselazymint": "/references/react/v4/useLazyMint", - "/react/react.useresetclaimconditions": - "/references/react/v4/useResetClaimConditions", - "/react/react.useunclaimednfts": "/references/react/v4/useUnclaimedNFTs", - "/react/react.useunclaimednftsupply": - "/references/react/v4/useUnclaimedNFTSupply", - "/react/react.useallrolemembers": "/references/react/v4/useAllRoleMembers", - "/react/react.usegrantrole": "/references/react/v4/useGrantRole", - "/react/react.useisaddressrole": "/references/react/v4/useIsAddressRole", - "/react/react.userevokerole": "/references/react/v4/useRevokeRole", - "/react/react.userolemembers": "/references/react/v4/useRoleMembers", - "/react/react.useplatformfees": "/references/react/v4/usePlatformFees", - "/react/react.useprimarysalerecipient": - "/references/react/v4/usePrimarySaleRecipient", - "/react/react.useroyaltysettings": "/references/react/v4/useRoyaltySettings", - "/react/react.useupdateplatformfees": - "/references/react/v4/useUpdatePlatformFees", - "/react/react.useupdateprimarysalerecipient": - "/references/react/v4/useUpdatePrimarySaleRecipient", - "/react/react.useupdateroyaltysettings": - "/references/react/v4/useUpdateRoyaltySettings", - "/react/react.usebalance": "/references/react/v4/useBalance", - "/react/react.usebalanceforaddress": - "/references/react/v4/useBalanceForAddress", - "/react/react.useburntoken": "/references/react/v4/useBurnToken", - "/react/react.useminttoken": "/references/react/v4/useMintToken", - "/react/react.usetokenbalance": "/references/react/v4/useTokenBalance", - "/react/react.usetokendecimals": "/references/react/v4/useTokenDecimals", - "/react/react.usetokensupply": "/references/react/v4/useTokenSupply", - "/react/react.usetransferbatchtoken": - "/references/react/v4/useTransferBatchToken", - "/react/react.usetransfertoken": "/references/react/v4/useTransferToken", - "/react/react.useclaimtoken": "/references/react/v4/useClaimToken", - "/react/react.useconnect": "/references/react/v4/useConnect", - "/react/react.usedisconnect": "/references/react/v4/useDisconnect", - "/react/react.usewallet": "/references/react/v4/useWallet", - "/react/react.useconnectionstatus": - "/references/react/v4/useConnectionStatus", - "/react/react.usesigner": "/references/react/v4/useSigner", - "/react/react.usemetamask": "/references/react/v4/useMetamask", - "/react/react.usecoinbasewallet": "/references/react/v4/useCoinbaseWallet", - "/react/react.usewalletconnect": "/references/react/v4/useWalletConnect", - "/react/react.usesmartwallet": "/references/react/v4/useSmartWallet", - "/react/react.useembeeddedwallet": "/references/react/v4/useEmbeddedWallet", - "/react/react.usesafe": "/references/react/v4/useSafe", - "/react/react.usemagic": "/references/react/v4/useMagic", - "/react/react.userainbowwallet": "/references/react/v4/useRainbowWallet", - "/react/react.usetrustwallet": "/references/react/v4/useTrustWallet", - "/react/react.usebloctowallet": "/references/react/v4/useBloctoWallet", - "/react/react.useframewallet": "/references/react/v4/useFrameWallet", - "/react/react.usesetconnectedwallet": - "/references/react/v4/useSetConnectedWallet", - "/react/react.usesetconnectionstatus": - "/references/react/v4/useSetConnectionStatus", - "/react/react.usecreatewalletinstance": - "/references/react/v4/useCreateWalletInstance", - "/react/react.usewalletconfig": "/references/react/v4/useWalletConfig", - "/react/react.useaccountadmins": "/references/react/v4/useAccountAdmins", - "/react/react.useaccountadminsandsigners": - "/references/react/v4/useAccountAdminsAndSigners", - "/react/react.useaccountsigners": "/references/react/v4/useAccountSigners", - "/react/react.useaddadmin": "/references/react/v4/useAddAdmin", - "/react/react.usecreatesessionkey": - "/references/react/v4/useCreateSessionKey", - "/react/react.useremoveadmin": "/references/react/v4/useRemoveAdmin", - "/react/react.userevokesessionkey": - "/references/react/v4/useRevokeSessionKey", - "/react/react.uselogin": "/references/react/v4/useLogin", - "/react/react.uselogout": "/references/react/v4/useLogout", - "/react/react.useuser": "/references/react/v4/useUser", - "/react/react.usestorage": "/references/react/v4/useStorage", - "/react/react.usestorageupload": "/references/react/v4/useStorageUpload", - "/ui-components/web3button": "/react/v4/components/Web3Button", - "/react/v5/in-app-wallet/how-to/get-in-app-wallet-details-on-server": - "/react/v5/in-app-wallet/how-to/get-user-details", + "/react": "/react/v4", + "/react/connecting-wallets": "/react/v4/connecting-wallets", + // providers + "/react/react.thirdwebprovider": "/react/v4/ThirdwebProvider", + "/react/react.thirdwebsdkprovider": "/react/v4/ThirdwebSDKProvider", + // components + "/react/react.connectwallet": "/react/v4/components/ConnectWallet", + "/react/react.web3button": "/react/v4/components/Web3Button", + "/react/react.thirdwebnftmedia": "/react/v4/components/ThirdwebNftMedia", + "/react/react.mediarenderer": "/react/v4/components/MediaRenderer", + // wallets + "/react/react.metamaskwallet": "/references/react/v4/metamaskWallet", + "/react/react.coinbasewallet": "/references/react/v4/coinbaseWallet", + "/react/react.walletconnect": "/references/react/v4/walletconnect", + "/react/react.smartwallet": "/references/react/v4/smartWallet", + "/react/react.embeddedwallet": "/references/react/v4/embeddedWallet", + "/react/react.paperwallet": "/references/react/v4/embeddedWallet", + "/react/react.localwallet": "/references/react/v4/localWallet", + "/react/react.trustWallet": "/references/react/v4/trustWallet", + "/react/react.zerion": "/references/react/v4/zerionWallet", + "/react/react.magiclink": "/references/react/v4/magicLink", + "/react/react.safewallet": "/references/react/v4/safeWallet", + "/react/react.blocto": "/references/react/v4/bloctoWallet", + "/react/react.frame": "/references/react/v4/frameWallet", + "/react/react.phantom": "/references/react/v4/phantomWallet", + "/react/react.rainbowWallet": "/references/react/v4/rainbowWallet", + "/react/react.coin98": "/references/react/v4/coin98Wallet", + "/react/react.core": "/references/react/v4/coreWallet", + "/react/react.defiwallet": "/references/react/v4/cryptoDefiWallet", + "/react/react.okx": "/references/react/v4/okxWallet", + "/react/react.onekey": "/references/react/v4/oneKeyWallet", + "/react/react.rabby": "/references/react/v4/rabbyWallet", + // hooks + "/react/react.useaddress": "/references/react/v4/useAddress", + "/react/react.usecontract": "/references/react/v4/useContract", + "/react/react.usecontractread": "/references/react/v4/useContractRead", + "/react/react.usecontractwrite": "/references/react/v4/useContractWrite", + "/react/react.usecontractevents": "/references/react/v4/useContractEvents", + "/react/react.usesdk": "/references/react/v4/useSDK", + "/react/react.useactiveclaimcondition": + "/references/react/v4/useActiveClaimCondition", + "/react/react.useactiveclaimconditionforwallet": + "/references/react/v4/useActiveClaimConditionForWallet", + "/react/react.useclaimconditions": "/references/react/v4/useClaimConditions", + "/react/react.useclaimerproofs": "/references/react/v4/useClaimerProofs", + "/react/react.useclaimineligibilityreasons": + "/references/react/v4/useClaimIneligibilityReasons", + "/react/react.usesetclaimconditions": + "/references/react/v4/useSetClaimConditions", + "/react/react.usebatchestoreveal": "/references/react/v4/useBatchesToReveal", + "/react/react.usedelayedreveallazymint": + "/references/react/v4/useDelayedRevealLazyMint", + "/react/react.usereveallazymint": "/references/react/v4/useRevealLazyMint", + "/react/react.useacceptdirectlistingoffer": + "/references/react/v4/useAcceptDirectListingOffer", + "/react/react.useactivelistings": "/references/react/v4/useActiveListings", + "/react/react.useauctionwinner": "/references/react/v4/useAuctionWinner", + "/react/react.usebidbuffer": "/references/react/v4/useBidBuffer", + "/react/react.usebuydirectlisting": + "/references/react/v4/useBuyDirectListing", + "/react/react.usebuynow": "/references/react/v4/useBuyNow", + "/react/react.usecanceldirectlisting": + "/references/react/v4/useCancelDirectListing", + "/react/react.usecancelenglishauction": + "/references/react/v4/useCancelEnglishAuction", + "/react/react.usecancellisting": "/references/react/v4/useCancelListing", + "/react/react.usecreateauctionlisting": + "/references/react/v4/useCreateAuctionListing", + "/react/react.usecreatedirectlisting": + "/references/react/v4/useCreateDirectListing", + "/react/react.usedirectlisting": "/references/react/v4/useDirectListing", + "/react/react.usedirectlistings": "/references/react/v4/useDirectListings", + "/react/react.usedirectlistingscount": + "/references/react/v4/useDirectListingsCount", + "/react/react.useenglishauction": "/references/react/v4/useEnglishAuction", + "/react/react.useenglishauctions": "/references/react/v4/useEnglishAuctions", + "/react/react.useenglishauctionscount": + "/references/react/v4/useEnglishAuctionsCount", + "/react/react.useenglishauctionwinningbid": + "/references/react/v4/useEnglishAuctionWinningBid", + "/react/react.useexecuteauctionsale": + "/references/react/v4/useExecuteAuctionSale", + "/react/react.uselisting": "/references/react/v4/useListing", + "/react/react.uselistings": "/references/react/v4/useListings", + "/react/react.uselistingscount": "/references/react/v4/useListingsCount", + "/react/react.usemakebid": "/references/react/v4/useMakeBid", + "/react/react.usemakeoffer": "/references/react/v4/useMakeOffer", + "/react/react.useminimumnextbid": "/references/react/v4/useMinimumNextBid", + "/react/react.useoffers": "/references/react/v4/useOffers", + "/react/react.usevaliddirectlistings": + "/references/react/v4/useValidDirectListings", + "/react/react.usevalidenglishauctions": + "/references/react/v4/useValidEnglishAuctions", + "/react/react.usewinningbid": "/references/react/v4/useWinningBid", + "/react/react.usecompilermetadata": + "/references/react/v4/useCompilerMetadata", + "/react/react.usecontracttype": "/references/react/v4/useContractType", + "/react/react.usemetadata": "/references/react/v4/useMetadata", + "/react/react.useresolvedmediatype": + "/references/react/v4/useResolvedMediaType", + "/react/react.useupdatemetadata": "/references/react/v4/useUpdateMetadata", + "/react/react.usechain": "/references/react/v4/useChain", + "/react/react.useSwitchChain": "/references/react/v4/useSwitchChain", + "/react/react.usechainid": "/references/react/v4/useChainId", + "/react/react.usenft": "/references/react/v4/useNFT", + "/react/react.useairdropnft": "/references/react/v4/useAirdropNFT", + "/react/react.useburnnft": "/references/react/v4/useBurnNFT", + "/react/react.usemintnft": "/references/react/v4/useMintNFT", + "/react/react.usemintnftsupply": "/references/react/v4/useMintNFTSupply", + "/react/react.usenftbalance": "/references/react/v4/useNFTBalance", + "/react/react.usenfts": "/references/react/v4/useNFTs", + "/react/react.useownednfts": "/references/react/v4/useOwnedNFTs", + "/react/react.usetotalcirculatingsupply": + "/references/react/v4/useTotalCirculatingSupply", + "/react/react.usetotalcount": "/references/react/v4/useTotalCount", + "/react/react.usetransfernft": "/references/react/v4/useTransferNFT", + "/react/react.useclaimednfts": "/references/react/v4/useClaimedNFTs", + "/react/react.useclaimednftsupply": + "/references/react/v4/useClaimedNFTSupply", + "/react/react.useclaimnft": "/references/react/v4/useClaimNFT", + "/react/react.uselazymint": "/references/react/v4/useLazyMint", + "/react/react.useresetclaimconditions": + "/references/react/v4/useResetClaimConditions", + "/react/react.useunclaimednfts": "/references/react/v4/useUnclaimedNFTs", + "/react/react.useunclaimednftsupply": + "/references/react/v4/useUnclaimedNFTSupply", + "/react/react.useallrolemembers": "/references/react/v4/useAllRoleMembers", + "/react/react.usegrantrole": "/references/react/v4/useGrantRole", + "/react/react.useisaddressrole": "/references/react/v4/useIsAddressRole", + "/react/react.userevokerole": "/references/react/v4/useRevokeRole", + "/react/react.userolemembers": "/references/react/v4/useRoleMembers", + "/react/react.useplatformfees": "/references/react/v4/usePlatformFees", + "/react/react.useprimarysalerecipient": + "/references/react/v4/usePrimarySaleRecipient", + "/react/react.useroyaltysettings": "/references/react/v4/useRoyaltySettings", + "/react/react.useupdateplatformfees": + "/references/react/v4/useUpdatePlatformFees", + "/react/react.useupdateprimarysalerecipient": + "/references/react/v4/useUpdatePrimarySaleRecipient", + "/react/react.useupdateroyaltysettings": + "/references/react/v4/useUpdateRoyaltySettings", + "/react/react.usebalance": "/references/react/v4/useBalance", + "/react/react.usebalanceforaddress": + "/references/react/v4/useBalanceForAddress", + "/react/react.useburntoken": "/references/react/v4/useBurnToken", + "/react/react.useminttoken": "/references/react/v4/useMintToken", + "/react/react.usetokenbalance": "/references/react/v4/useTokenBalance", + "/react/react.usetokendecimals": "/references/react/v4/useTokenDecimals", + "/react/react.usetokensupply": "/references/react/v4/useTokenSupply", + "/react/react.usetransferbatchtoken": + "/references/react/v4/useTransferBatchToken", + "/react/react.usetransfertoken": "/references/react/v4/useTransferToken", + "/react/react.useclaimtoken": "/references/react/v4/useClaimToken", + "/react/react.useconnect": "/references/react/v4/useConnect", + "/react/react.usedisconnect": "/references/react/v4/useDisconnect", + "/react/react.usewallet": "/references/react/v4/useWallet", + "/react/react.useconnectionstatus": + "/references/react/v4/useConnectionStatus", + "/react/react.usesigner": "/references/react/v4/useSigner", + "/react/react.usemetamask": "/references/react/v4/useMetamask", + "/react/react.usecoinbasewallet": "/references/react/v4/useCoinbaseWallet", + "/react/react.usewalletconnect": "/references/react/v4/useWalletConnect", + "/react/react.usesmartwallet": "/references/react/v4/useSmartWallet", + "/react/react.useembeeddedwallet": "/references/react/v4/useEmbeddedWallet", + "/react/react.usesafe": "/references/react/v4/useSafe", + "/react/react.usemagic": "/references/react/v4/useMagic", + "/react/react.userainbowwallet": "/references/react/v4/useRainbowWallet", + "/react/react.usetrustwallet": "/references/react/v4/useTrustWallet", + "/react/react.usebloctowallet": "/references/react/v4/useBloctoWallet", + "/react/react.useframewallet": "/references/react/v4/useFrameWallet", + "/react/react.usesetconnectedwallet": + "/references/react/v4/useSetConnectedWallet", + "/react/react.usesetconnectionstatus": + "/references/react/v4/useSetConnectionStatus", + "/react/react.usecreatewalletinstance": + "/references/react/v4/useCreateWalletInstance", + "/react/react.usewalletconfig": "/references/react/v4/useWalletConfig", + "/react/react.useaccountadmins": "/references/react/v4/useAccountAdmins", + "/react/react.useaccountadminsandsigners": + "/references/react/v4/useAccountAdminsAndSigners", + "/react/react.useaccountsigners": "/references/react/v4/useAccountSigners", + "/react/react.useaddadmin": "/references/react/v4/useAddAdmin", + "/react/react.usecreatesessionkey": + "/references/react/v4/useCreateSessionKey", + "/react/react.useremoveadmin": "/references/react/v4/useRemoveAdmin", + "/react/react.userevokesessionkey": + "/references/react/v4/useRevokeSessionKey", + "/react/react.uselogin": "/references/react/v4/useLogin", + "/react/react.uselogout": "/references/react/v4/useLogout", + "/react/react.useuser": "/references/react/v4/useUser", + "/react/react.usestorage": "/references/react/v4/useStorage", + "/react/react.usestorageupload": "/references/react/v4/useStorageUpload", + "/ui-components/web3button": "/react/v4/components/Web3Button", + "/react/v5/in-app-wallet/how-to/get-in-app-wallet-details-on-server": + "/react/v5/in-app-wallet/how-to/get-user-details", }; const solidityRedirects = { - "/solidity": "/contracts/build", - "/solidity/extensions": "/contracts/build/extensions", - "/solidity/extensions/erc721": "/contracts/build/extensions/erc-721/ERC721", - "/solidity/extensions/erc1155": - "/contracts/build/extensions/erc-1155/ERC1155", - "/solidity/extensions/erc20mintable": - "/contracts/build/extensions/erc-20/ERC20BatchMintable", - "/solidity/base-contracts/erc721base": - "/contracts/build/base-contracts/erc-721/base", - "/solidity/base-contracts/erc20drop": - "/contracts/build/base-contracts/erc-20/drop", - "/solidity/base-contracts/erc721delayedreveal": - "/contracts/build/base-contracts/erc-721/delayed-reveal", - "/solidity/base-contracts/erc721drop": - "/contracts/build/base-contracts/erc-721/drop", - "/solidity/base-contracts/erc721lazymint": - "/contracts/build/base-contracts/erc-721/lazy-mint", - "/solidity/base-contracts/erc721signaturemint": - "/contracts/build/base-contracts/erc-721/signature-mint", - "/solidity/extensions/erc20claimconditions": - "/contracts/build/extensions/erc-20/ERC20ClaimConditions", - "/solidity/extensions/erc721mintable": - "/contracts/build/extensions/erc-721/ERC721Mintable", - "/solidity/extensions/erc721burnable": - "/contracts/build/extensions/erc-721/ERC721Burnable", - "/solidity/extensions/erc721batchmintable": - "/contracts/build/extensions/erc-721/ERC721BatchMintable", - "/solidity/extensions/erc721supply": - "/contracts/build/extensions/erc-721/ERC721Supply", - "/solidity/extensions/royalty": "/contracts/build/extensions/general/Royalty", - "/solidity/extensions/erc721claimphases": - "/contracts/build/extensions/erc-721/ERC721ClaimPhases", - "/solidity/extensions/contractmetadata": - "/contracts/build/extensions/general/ContractMetadata", - "/solidity/extensions/ownable": "/contracts/build/extensions/general/Ownable", - "/solidity/extensions/multicall": - "/contracts/build/extensions/general/Multicall", - "/solidity/extensions/dropsinglephase": - "/contracts/build/extensions/general/DropSinglePhase", - "/solidity/extensions/erc1155batchmintable": - "/contracts/build/extensions/erc-1155/ERC1155BatchMintable", - "/solidity/extensions/erc1155burnable": - "/contracts/build/extensions/erc-1155/ERC1155Burnable", - "/solidity/extensions/erc1155enumerable": - "/contracts/build/extensions/erc-1155/ERC1155Enumerable", - "/solidity/extensions/erc1155mintable": - "/contracts/build/extensions/erc-1155/ERC1155Mintable", - "/solidity/base-contracts/erc1155lazymint": - "/contracts/build/base-contracts/erc-1155/lazy-mint", - "/solidity/extensions/lazymint": - "/contracts/build/extensions/general/LazyMint", - "/solidity/extensions/erc1155claimcustom": - "/contracts/build/extensions/erc-1155/ERC1155ClaimCustom", - "/solidity/extensions/delayedreveal": - "/contracts/build/extensions/general/DelayedReveal", - "/solidity/extensions/erc1155dropsinglephase": - "/contracts/build/extensions/erc-1155/ERC1155DropSinglePhase", - "/solidity/extensions/erc1155claimconditions": - "/contracts/build/extensions/erc-1155/ERC1155ClaimConditions", - "/solidity/extensions/primarysale": - "/contracts/build/extensions/general/PrimarySale", - "/solidity/extensions/erc1155signaturemint": - "/contracts/build/extensions/erc-1155/ERC1155SignatureMint", - "/solidity/base-contracts/erc1155base": - "/contracts/build/base-contracts/erc-1155/base", - "/solidity/extensions/erc721revealable": - "/contracts/build/extensions/erc-721/ERC721Revealable", - "/solidity/extensions/erc1155revealable": - "/contracts/build/extensions/erc-1155/ERC1155Revealable", - "/solidity/extensions/erc20Permit": - "/contracts/build/extensions/erc-20/ERC20Permit", - "/solidity/extensions/erc20batchmintable": - "/contracts/build/extensions/erc-20/ERC20BatchMintable", - "/solidity/base-contracts/erc20base": - "/contracts/build/base-contracts/erc-20/base", - "/solidity/extensions/erc20": "/contracts/build/extensions/erc-20/ERC20", - "/solidity/base-contracts/erc20vote": - "/contracts/build/base-contracts/erc-20/vote", - "/solidity/extensions/base-account": - "/contracts/build/extensions/erc-4337/SmartWallet", - "/solidity/extensions/base-account-factory": - "/contracts/build/extensions/erc-4337/SmartWalletFactory", - "/solidity/base-contracts": "/contracts/build/base-contracts", - "/solidity/base-contracts/account-factory": - "/contracts/build/base-contracts/erc-4337/account-factory", - "/solidity/base-contracts/account": - "/contracts/build/base-contracts/erc-4337/account", - "/solidity/base-contracts/managed-account-factory": - "/contracts/build/base-contracts/erc-4337/managed-account-factory", - "/solidity/base-contracts/managed-account": - "/contracts/build/base-contracts/erc-4337/managed-account", - "/solidity/extensions/erc721claimcustom": - "/contracts/build/extensions/erc-721/ERC721ClaimCustom", - "/solidity/extensions/permissions": - "/contracts/build/extensions/general/Permissions", - "/solidity/base-contracts/erc1155drop": - "/contracts/build/base-contracts/erc-1155/drop", - "/solidity/base-contracts/erc1155signaturemint": - "/contracts/build/base-contracts/erc-1155/signature-mint", - "/solidity/base-contracts/erc20signaturemint": - "/contracts/build/base-contracts/erc-20/signature-mint", - "/solidity/extensions/erc1155supply": - "/contracts/build/extensions/erc-1155/ERC1155Supply", - "/solidity/extensions/erc1155claimable": - "/contracts/build/extensions/erc-1155/ERC1155Claimable", - "/solidity/extensions/platformfee": - "/contracts/build/extensions/general/PlatformFee", - "/solidity/base-contracts/erc1155delayedreveal": - "/contracts/build/base-contracts/erc-1155/delayed-reveal", - "/solidity/extensions/drop": "/contracts/build/extensions/general/Drop", - "/solidity/extensions/erc721claimable": - "/contracts/build/extensions/erc-721/ERC721Claimable", - "/solidity/base-contract/erc1155delayedreveal": - "/contracts/build/extensions/erc-1155/ERC1155Revealable", - "/solidity/extensions/erc721claimconditions": - "/contracts/build/extensions/erc-721/ERC721ClaimConditions", - "/solidity/extensions/erc721signaturemint": - "/contracts/build/extensions/erc-721/ERC721SignatureMint", - "/solidity/extensions/contract-metadata": - "/contracts/build/extensions/general/ContractMetadata", - "/solidity/extensions/erc1155claimphases": - "/contracts/build/extensions/erc-1155/ERC1155ClaimPhases", - "/solidity/base-contracts/staking/staking1155base": - "/contracts/build/base-contracts/erc-1155/staking", - "/solidity/base-contracts/staking/staking20base": - "/contracts/build/base-contracts/erc-20/staking", - "/solidity/base-contracts/staking/staking721base": - "/contracts/build/base-contracts/erc-721/staking", - "/solidity/base-contract/erc721delayedreveal": - "/contracts/build/base-contracts/erc-721/delayed-reveal", - "/solidity/base-contracts/smart-accounts": - "/contracts/build/base-contracts/erc-4337", - "/interact/overview":"/connect/blockchain-api" + "/solidity": "/contracts/build", + "/solidity/extensions": "/contracts/build/extensions", + "/solidity/extensions/erc721": "/contracts/build/extensions/erc-721/ERC721", + "/solidity/extensions/erc1155": + "/contracts/build/extensions/erc-1155/ERC1155", + "/solidity/extensions/erc20mintable": + "/contracts/build/extensions/erc-20/ERC20BatchMintable", + "/solidity/base-contracts/erc721base": + "/contracts/build/base-contracts/erc-721/base", + "/solidity/base-contracts/erc20drop": + "/contracts/build/base-contracts/erc-20/drop", + "/solidity/base-contracts/erc721delayedreveal": + "/contracts/build/base-contracts/erc-721/delayed-reveal", + "/solidity/base-contracts/erc721drop": + "/contracts/build/base-contracts/erc-721/drop", + "/solidity/base-contracts/erc721lazymint": + "/contracts/build/base-contracts/erc-721/lazy-mint", + "/solidity/base-contracts/erc721signaturemint": + "/contracts/build/base-contracts/erc-721/signature-mint", + "/solidity/extensions/erc20claimconditions": + "/contracts/build/extensions/erc-20/ERC20ClaimConditions", + "/solidity/extensions/erc721mintable": + "/contracts/build/extensions/erc-721/ERC721Mintable", + "/solidity/extensions/erc721burnable": + "/contracts/build/extensions/erc-721/ERC721Burnable", + "/solidity/extensions/erc721batchmintable": + "/contracts/build/extensions/erc-721/ERC721BatchMintable", + "/solidity/extensions/erc721supply": + "/contracts/build/extensions/erc-721/ERC721Supply", + "/solidity/extensions/royalty": "/contracts/build/extensions/general/Royalty", + "/solidity/extensions/erc721claimphases": + "/contracts/build/extensions/erc-721/ERC721ClaimPhases", + "/solidity/extensions/contractmetadata": + "/contracts/build/extensions/general/ContractMetadata", + "/solidity/extensions/ownable": "/contracts/build/extensions/general/Ownable", + "/solidity/extensions/multicall": + "/contracts/build/extensions/general/Multicall", + "/solidity/extensions/dropsinglephase": + "/contracts/build/extensions/general/DropSinglePhase", + "/solidity/extensions/erc1155batchmintable": + "/contracts/build/extensions/erc-1155/ERC1155BatchMintable", + "/solidity/extensions/erc1155burnable": + "/contracts/build/extensions/erc-1155/ERC1155Burnable", + "/solidity/extensions/erc1155enumerable": + "/contracts/build/extensions/erc-1155/ERC1155Enumerable", + "/solidity/extensions/erc1155mintable": + "/contracts/build/extensions/erc-1155/ERC1155Mintable", + "/solidity/base-contracts/erc1155lazymint": + "/contracts/build/base-contracts/erc-1155/lazy-mint", + "/solidity/extensions/lazymint": + "/contracts/build/extensions/general/LazyMint", + "/solidity/extensions/erc1155claimcustom": + "/contracts/build/extensions/erc-1155/ERC1155ClaimCustom", + "/solidity/extensions/delayedreveal": + "/contracts/build/extensions/general/DelayedReveal", + "/solidity/extensions/erc1155dropsinglephase": + "/contracts/build/extensions/erc-1155/ERC1155DropSinglePhase", + "/solidity/extensions/erc1155claimconditions": + "/contracts/build/extensions/erc-1155/ERC1155ClaimConditions", + "/solidity/extensions/primarysale": + "/contracts/build/extensions/general/PrimarySale", + "/solidity/extensions/erc1155signaturemint": + "/contracts/build/extensions/erc-1155/ERC1155SignatureMint", + "/solidity/base-contracts/erc1155base": + "/contracts/build/base-contracts/erc-1155/base", + "/solidity/extensions/erc721revealable": + "/contracts/build/extensions/erc-721/ERC721Revealable", + "/solidity/extensions/erc1155revealable": + "/contracts/build/extensions/erc-1155/ERC1155Revealable", + "/solidity/extensions/erc20Permit": + "/contracts/build/extensions/erc-20/ERC20Permit", + "/solidity/extensions/erc20batchmintable": + "/contracts/build/extensions/erc-20/ERC20BatchMintable", + "/solidity/base-contracts/erc20base": + "/contracts/build/base-contracts/erc-20/base", + "/solidity/extensions/erc20": "/contracts/build/extensions/erc-20/ERC20", + "/solidity/base-contracts/erc20vote": + "/contracts/build/base-contracts/erc-20/vote", + "/solidity/extensions/base-account": + "/contracts/build/extensions/erc-4337/SmartWallet", + "/solidity/extensions/base-account-factory": + "/contracts/build/extensions/erc-4337/SmartWalletFactory", + "/solidity/base-contracts": "/contracts/build/base-contracts", + "/solidity/base-contracts/account-factory": + "/contracts/build/base-contracts/erc-4337/account-factory", + "/solidity/base-contracts/account": + "/contracts/build/base-contracts/erc-4337/account", + "/solidity/base-contracts/managed-account-factory": + "/contracts/build/base-contracts/erc-4337/managed-account-factory", + "/solidity/base-contracts/managed-account": + "/contracts/build/base-contracts/erc-4337/managed-account", + "/solidity/extensions/erc721claimcustom": + "/contracts/build/extensions/erc-721/ERC721ClaimCustom", + "/solidity/extensions/permissions": + "/contracts/build/extensions/general/Permissions", + "/solidity/base-contracts/erc1155drop": + "/contracts/build/base-contracts/erc-1155/drop", + "/solidity/base-contracts/erc1155signaturemint": + "/contracts/build/base-contracts/erc-1155/signature-mint", + "/solidity/base-contracts/erc20signaturemint": + "/contracts/build/base-contracts/erc-20/signature-mint", + "/solidity/extensions/erc1155supply": + "/contracts/build/extensions/erc-1155/ERC1155Supply", + "/solidity/extensions/erc1155claimable": + "/contracts/build/extensions/erc-1155/ERC1155Claimable", + "/solidity/extensions/platformfee": + "/contracts/build/extensions/general/PlatformFee", + "/solidity/base-contracts/erc1155delayedreveal": + "/contracts/build/base-contracts/erc-1155/delayed-reveal", + "/solidity/extensions/drop": "/contracts/build/extensions/general/Drop", + "/solidity/extensions/erc721claimable": + "/contracts/build/extensions/erc-721/ERC721Claimable", + "/solidity/base-contract/erc1155delayedreveal": + "/contracts/build/extensions/erc-1155/ERC1155Revealable", + "/solidity/extensions/erc721claimconditions": + "/contracts/build/extensions/erc-721/ERC721ClaimConditions", + "/solidity/extensions/erc721signaturemint": + "/contracts/build/extensions/erc-721/ERC721SignatureMint", + "/solidity/extensions/contract-metadata": + "/contracts/build/extensions/general/ContractMetadata", + "/solidity/extensions/erc1155claimphases": + "/contracts/build/extensions/erc-1155/ERC1155ClaimPhases", + "/solidity/base-contracts/staking/staking1155base": + "/contracts/build/base-contracts/erc-1155/staking", + "/solidity/base-contracts/staking/staking20base": + "/contracts/build/base-contracts/erc-20/staking", + "/solidity/base-contracts/staking/staking721base": + "/contracts/build/base-contracts/erc-721/staking", + "/solidity/base-contract/erc721delayedreveal": + "/contracts/build/base-contracts/erc-721/delayed-reveal", + "/solidity/base-contracts/smart-accounts": + "/contracts/build/base-contracts/erc-4337", + "/interact/overview": "/connect/blockchain-api", }; const extensionsTable = "/typescript/v4/extensions#all-available-extensions"; const typescriptRedirects = { - "/typescript": "/typescript/v4", - "/typescript/getting-started": "/typescript/v4/getting-started", - "/typescript/sdk.thirdwebsdk": "/typescript/v4/getting-started", - "/typescript/sdk.thirdwebsdk.fromprivatekey": - "/references/typescript/v4/ThirdwebSDK#fromPrivateKey", - "/typescript/sdk.thirdwebsdk.fromwallet": - "/references/typescript/v4/ThirdwebSDK#fromWallet", - "/typescript/sdk.thirdwebsdk.fromsigner": - "/references/typescript/v4/ThirdwebSDK#fromSigner", - "/typescript/sdk.contractdeployer": "/typescript/v4/deploy", - "/typescript/sdk.contractverifier": - "/typescript/v4/utilities#contract-verification", - "/typescript/extensions": "/typescript/v4/extensions", - "/typescript/sdk.thirdwebsdk.smartcontract": "/typescript/v4/extensions", - "/typescript/sdk.smartcontract.call": "/typescript/v4/extensions", - "/typescript/sdk.smartcontract.prepare": - "/typescript/v4/extensions#preparing-transactions", - "/typescript/sdk.thirdwebsdk.detectextensions": - "/v4/extensions#detecting-avilable-extensions", - // extensions - "/typescript/sdk.erc721": "/references/typescript/v4/Erc721", - "/typescript/sdk.erc1155": "/references/typescript/v4/Erc1155", - "/typescript/sdk.erc20": "/references/typescript/v4/Erc20", - // extensions path* - "/typescript/sdk:path*": extensionsTable, + "/typescript": "/typescript/v4", + "/typescript/getting-started": "/typescript/v4/getting-started", + "/typescript/sdk.thirdwebsdk": "/typescript/v4/getting-started", + "/typescript/sdk.thirdwebsdk.fromprivatekey": + "/references/typescript/v4/ThirdwebSDK#fromPrivateKey", + "/typescript/sdk.thirdwebsdk.fromwallet": + "/references/typescript/v4/ThirdwebSDK#fromWallet", + "/typescript/sdk.thirdwebsdk.fromsigner": + "/references/typescript/v4/ThirdwebSDK#fromSigner", + "/typescript/sdk.contractdeployer": "/typescript/v4/deploy", + "/typescript/sdk.contractverifier": + "/typescript/v4/utilities#contract-verification", + "/typescript/extensions": "/typescript/v4/extensions", + "/typescript/sdk.thirdwebsdk.smartcontract": "/typescript/v4/extensions", + "/typescript/sdk.smartcontract.call": "/typescript/v4/extensions", + "/typescript/sdk.smartcontract.prepare": + "/typescript/v4/extensions#preparing-transactions", + "/typescript/sdk.thirdwebsdk.detectextensions": + "/v4/extensions#detecting-avilable-extensions", + // extensions + "/typescript/sdk.erc721": "/references/typescript/v4/Erc721", + "/typescript/sdk.erc1155": "/references/typescript/v4/Erc1155", + "/typescript/sdk.erc20": "/references/typescript/v4/Erc20", + // extensions path* + "/typescript/sdk:path*": extensionsTable, }; const reactNativeRedirects = { - "/react-native": "/typescript/v5/react-native", - "/react-native/getting-started": "/typescript/v5/react-native", - // wallets - "/react-native/react-native.embeddedwallet": - "/react-native/v0/wallets/embedded-wallet", - "/react-native/react-native.smartwallet": - "/react-native/v0/wallets/smartwallet", - "/react-native/react-native.walletconnect": - "/react-native/v0/wallets/walletconnect", - "/react-native/react-native.metamask": "/react-native/v0/wallets/metamask", - "/react-native/react-native.magic": "/react-native/v0/wallets/magiclink", - "/react-native/react-native.rainbow": "/react-native/v0/wallets/rainbow", - "/react-native/react-native.trust": "/react-native/v0/wallets/trust", - "/react-native/react-native.coinbase": "/react-native/v0/wallets/coinbase", - "/react-native/react-native.localwallet": - "/react-native/v0/wallets/local-wallet", - // components - "/react-native/react-native.connectwallet": - "/react-native/v0/components/ConnectWallet", - "/react-native/react-native.web3button": - "/react-native/v0/components/Web3Button", - // others - "/react-native/available-hooks": "/references/react-native/v0/hooks", - "/react-native/react-native.uselogin": "/references/react-native/v0/useLogin", - "/react-native/react-native.uselogout": - "/references/react-native/v0/useLogout", - "/react-native/react-native.useuser": "/references/react-native/v0/useUser", - "/react-native/storage": "/references/react-native/v0/hooks#storage", - "/react-native/faq/deeplinks": "/react-native/v0/faq", - "/typescript/v5/react-native/installation": - "/typescript/v5/react-native/getting-started", + "/react-native": "/typescript/v5/react-native", + "/react-native/getting-started": "/typescript/v5/react-native", + // wallets + "/react-native/react-native.embeddedwallet": + "/react-native/v0/wallets/embedded-wallet", + "/react-native/react-native.smartwallet": + "/react-native/v0/wallets/smartwallet", + "/react-native/react-native.walletconnect": + "/react-native/v0/wallets/walletconnect", + "/react-native/react-native.metamask": "/react-native/v0/wallets/metamask", + "/react-native/react-native.magic": "/react-native/v0/wallets/magiclink", + "/react-native/react-native.rainbow": "/react-native/v0/wallets/rainbow", + "/react-native/react-native.trust": "/react-native/v0/wallets/trust", + "/react-native/react-native.coinbase": "/react-native/v0/wallets/coinbase", + "/react-native/react-native.localwallet": + "/react-native/v0/wallets/local-wallet", + // components + "/react-native/react-native.connectwallet": + "/react-native/v0/components/ConnectWallet", + "/react-native/react-native.web3button": + "/react-native/v0/components/Web3Button", + // others + "/react-native/available-hooks": "/references/react-native/v0/hooks", + "/react-native/react-native.uselogin": "/references/react-native/v0/useLogin", + "/react-native/react-native.uselogout": + "/references/react-native/v0/useLogout", + "/react-native/react-native.useuser": "/references/react-native/v0/useUser", + "/react-native/storage": "/references/react-native/v0/hooks#storage", + "/react-native/faq/deeplinks": "/react-native/v0/faq", + "/typescript/v5/react-native/installation": + "/typescript/v5/react-native/getting-started", }; const unityRedirects = { - // top level - "/unity": "/unity/v5", - "/unity/getting-started": "/unity/v4/getting-started", - // core - "/unity/thirdwebmanager": "/unity/v4/thirdwebmanager", - "/unity/storage": "/unity/v4/storage", - // wallets - "/unity/wallets/prefab": "/unity/v4/wallets/prefab", - // wallet providers - "/unity/wallets/providers/in-app-wallet": - "/unity/v4/wallets/providers/in-app-wallet", - "/unity/wallets/providers/account-abstraction": - "/unity/v4/wallets/providers/account-abstraction", - "/unity/wallets/providers/local-wallet": - "/unity/v4/wallets/providers/local-wallet", - "/unity/wallets/providers/metamask": "/unity/v4/wallets/providers/metamask", - "/unity/wallets/providers/coinbase": "/unity/v4/wallets/providers/coinbase", - "/unity/wallets/providers/walletconnect": - "/unity/v4/wallets/providers/walletconnect", - "/unity/wallets/providers/hyperplay": "/unity/v4/wallets/providers/hyperplay", - "/unity/wallets/providers/rabby": "/unity/v4/wallets/providers/rabby", - // wallet actions - "/unity/wallets/actions/connect": "/unity/v4/wallets/actions/connect", - "/unity/wallets/actions/disconnect": "/unity/v4/wallets/actions/disconnect", - "/unity/wallets/actions/authenticate": - "/unity/v4/wallets/actions/authenticate", - "/unity/wallets/actions/getaddress": "/unity/v4/wallets/actions/getaddress", - "/unity/wallets/actions/getbalance": "/unity/v4/wallets/actions/getbalance", - "/unity/wallets/actions/getchainid": "/unity/v4/wallets/actions/getchainid", - "/unity/wallets/actions/isconnected": "/unity/v4/wallets/actions/isconnected", - "/unity/wallets/actions/recoveraddress": - "/unity/v4/wallets/actions/recoveraddress", - "/unity/wallets/actions/sendrawtransaction": - "/unity/v4/wallets/actions/sendrawtransaction", - "/unity/wallets/actions/executerawtransaction": - "/unity/v4/wallets/actions/executerawtransaction", - "/unity/wallets/actions/sign": "/unity/v4/wallets/actions/sign", - "/unity/wallets/actions/switchnetwork": - "/unity/v4/wallets/actions/switchnetwork", - "/unity/wallets/actions/transfer": "/unity/v4/wallets/actions/transfer", - "/unity/wallets/actions/addadmin": "/unity/v4/wallets/actions/addadmin", - "/unity/wallets/actions/removeadmin": "/unity/v4/wallets/actions/removeadmin", - "/unity/wallets/actions/createsessionkey": - "/unity/v4/wallets/actions/createsessionkey", - "/unity/wallets/actions/revokesessionkey": - "/unity/v4/wallets/actions/revokesessionkey", - "/unity/wallets/actions/getallactivesigners": - "/unity/v4/wallets/actions/getallactivesigners", - "/unity/wallets/actions/getemail": "/unity/v4/wallets/actions/getemail", - "/unity/wallets/actions/getnonce": "/unity/v4/wallets/actions/getnonce", - "/unity/wallets/actions/getsigneraddress": - "/unity/v4/wallets/actions/getsigneraddress", - "/unity/wallets/actions/signtypeddatav4": - "/unity/v4/wallets/actions/signtypeddatav4", - // submission - "/unity/wallets/submission": "/unity/v4/wallets/submission", - // pay - "/unity/pay/getbuyhistory": "/unity/v4/pay/getbuyhistory", - // buy with fiat - "/unity/pay/getbuywithfiatquote": "/unity/v4/pay/getbuywithfiatquote", - "/unity/pay/buywithfiat": "/unity/v4/pay/buywithfiat", - "/unity/pay/getbuywithfiatstatus": "/unity/v4/pay/getbuywithfiatstatus", - "/unity/pay/getbuywithfiatcurrencies": - "/unity/v4/pay/getbuywithfiatcurrencies", - // buy with crypto - "/unity/pay/getbuywithcryptoquote": "/unity/v4/pay/getbuywithcryptoquote", - "/unity/pay/buywithcrypto": "/unity/v4/pay/buywithcrypto", - "/unity/pay/getbuywithcryptostatus": "/unity/v4/pay/getbuywithcryptostatus", - // blockchain api - "/unity/contracts": "/unity/v4/contracts", - "/unity/contracts/get": "/unity/v4/contracts/get", - "/unity/contracts/read": "/unity/v4/contracts/read", - "/unity/contracts/write": "/unity/v4/contracts/write", - "/unity/contracts/prepare": "/unity/v4/contracts/prepare", - // erc20 - "/unity/contracts/erc20/erc20": "/unity/v4/contracts/erc20/erc20", - "/unity/contracts/erc20/erc20burnable": - "/unity/v4/contracts/erc20/erc20burnable", - "/unity/contracts/erc20/erc20claimconditions": - "/unity/v4/contracts/erc20/erc20claimconditions", - "/unity/contracts/erc20/erc20mintable": - "/unity/v4/contracts/erc20/erc20mintable", - "/unity/contracts/erc20/erc20signaturemintable": - "/unity/v4/contracts/erc20/erc20signaturemintable", - // erc721 - "/unity/contracts/erc721/erc721": "/unity/v4/contracts/erc721/erc721", - "/unity/contracts/erc721/erc721burnable": - "/unity/v4/contracts/erc721/erc721burnable", - "/unity/contracts/erc721/erc721claimconditions": - "/unity/v4/contracts/erc721/erc721claimconditions", - "/unity/contracts/erc721/erc721enumerable": - "/unity/v4/contracts/erc721/erc721enumerable", - "/unity/contracts/erc721/erc721mintable": - "/unity/v4/contracts/erc721/erc721mintable", - "/unity/contracts/erc721/erc721signaturemintable": - "/unity/v4/contracts/erc721/erc721signaturemintable", - "/unity/contracts/erc721/erc721supply": - "/unity/v4/contracts/erc721/erc721supply", - // erc1155 - "/unity/contracts/erc1155/erc1155": "/unity/v4/contracts/erc1155/erc1155", - "/unity/contracts/erc1155/erc1155burnable": - "/unity/v4/contracts/erc1155/erc1155burnable", - "/unity/contracts/erc1155/erc1155claimconditions": - "/unity/v4/contracts/erc1155/erc1155claimconditions", - "/unity/contracts/erc1155/erc1155enumerable": - "/unity/v4/contracts/erc1155/erc1155enumerable", - "/unity/contracts/erc1155/erc1155mintable": - "/unity/v4/contracts/erc1155/erc1155mintable", - "/unity/contracts/erc1155/erc1155signaturemintable": - "/unity/v4/contracts/erc1155/erc1155signaturemintable", - // marketplace - "/unity/contracts/marketplace": "/unity/v4/contracts/marketplace", - // pack - "/unity/contracts/pack": "/unity/v4/contracts/pack", - // events - "/unity/contracts/events/get": "/unity/v4/contracts/events/get", - "/unity/contracts/events/getall": "/unity/v4/contracts/events/getall", - "/unity/contracts/events/listentoall": - "/unity/v4/contracts/events/listentoall", - "/unity/contracts/events/removealllisteners": - "/unity/v4/contracts/events/removealllisteners", - // blocks - "/unity/blocks/getblock": "/unity/v4/blocks/getblock", - "/unity/blocks/getblockwithtransactions": - "/unity/v4/blocks/getblockwithtransactions", - "/unity/blocks/getlatestblocknumber": "/unity/v4/blocks/getlatestblocknumber", - "/unity/blocks/getlatestblocktimestamp": - "/unity/v4/blocks/getlatestblocktimestamp", + // top level + "/unity": "/unity/v5", + "/unity/getting-started": "/unity/v4/getting-started", + // core + "/unity/thirdwebmanager": "/unity/v4/thirdwebmanager", + "/unity/storage": "/unity/v4/storage", + // wallets + "/unity/wallets/prefab": "/unity/v4/wallets/prefab", + // wallet providers + "/unity/wallets/providers/in-app-wallet": + "/unity/v4/wallets/providers/in-app-wallet", + "/unity/wallets/providers/account-abstraction": + "/unity/v4/wallets/providers/account-abstraction", + "/unity/wallets/providers/local-wallet": + "/unity/v4/wallets/providers/local-wallet", + "/unity/wallets/providers/metamask": "/unity/v4/wallets/providers/metamask", + "/unity/wallets/providers/coinbase": "/unity/v4/wallets/providers/coinbase", + "/unity/wallets/providers/walletconnect": + "/unity/v4/wallets/providers/walletconnect", + "/unity/wallets/providers/hyperplay": "/unity/v4/wallets/providers/hyperplay", + "/unity/wallets/providers/rabby": "/unity/v4/wallets/providers/rabby", + // wallet actions + "/unity/wallets/actions/connect": "/unity/v4/wallets/actions/connect", + "/unity/wallets/actions/disconnect": "/unity/v4/wallets/actions/disconnect", + "/unity/wallets/actions/authenticate": + "/unity/v4/wallets/actions/authenticate", + "/unity/wallets/actions/getaddress": "/unity/v4/wallets/actions/getaddress", + "/unity/wallets/actions/getbalance": "/unity/v4/wallets/actions/getbalance", + "/unity/wallets/actions/getchainid": "/unity/v4/wallets/actions/getchainid", + "/unity/wallets/actions/isconnected": "/unity/v4/wallets/actions/isconnected", + "/unity/wallets/actions/recoveraddress": + "/unity/v4/wallets/actions/recoveraddress", + "/unity/wallets/actions/sendrawtransaction": + "/unity/v4/wallets/actions/sendrawtransaction", + "/unity/wallets/actions/executerawtransaction": + "/unity/v4/wallets/actions/executerawtransaction", + "/unity/wallets/actions/sign": "/unity/v4/wallets/actions/sign", + "/unity/wallets/actions/switchnetwork": + "/unity/v4/wallets/actions/switchnetwork", + "/unity/wallets/actions/transfer": "/unity/v4/wallets/actions/transfer", + "/unity/wallets/actions/addadmin": "/unity/v4/wallets/actions/addadmin", + "/unity/wallets/actions/removeadmin": "/unity/v4/wallets/actions/removeadmin", + "/unity/wallets/actions/createsessionkey": + "/unity/v4/wallets/actions/createsessionkey", + "/unity/wallets/actions/revokesessionkey": + "/unity/v4/wallets/actions/revokesessionkey", + "/unity/wallets/actions/getallactivesigners": + "/unity/v4/wallets/actions/getallactivesigners", + "/unity/wallets/actions/getemail": "/unity/v4/wallets/actions/getemail", + "/unity/wallets/actions/getnonce": "/unity/v4/wallets/actions/getnonce", + "/unity/wallets/actions/getsigneraddress": + "/unity/v4/wallets/actions/getsigneraddress", + "/unity/wallets/actions/signtypeddatav4": + "/unity/v4/wallets/actions/signtypeddatav4", + // submission + "/unity/wallets/submission": "/unity/v4/wallets/submission", + // pay + "/unity/pay/getbuyhistory": "/unity/v4/pay/getbuyhistory", + // buy with fiat + "/unity/pay/getbuywithfiatquote": "/unity/v4/pay/getbuywithfiatquote", + "/unity/pay/buywithfiat": "/unity/v4/pay/buywithfiat", + "/unity/pay/getbuywithfiatstatus": "/unity/v4/pay/getbuywithfiatstatus", + "/unity/pay/getbuywithfiatcurrencies": + "/unity/v4/pay/getbuywithfiatcurrencies", + // buy with crypto + "/unity/pay/getbuywithcryptoquote": "/unity/v4/pay/getbuywithcryptoquote", + "/unity/pay/buywithcrypto": "/unity/v4/pay/buywithcrypto", + "/unity/pay/getbuywithcryptostatus": "/unity/v4/pay/getbuywithcryptostatus", + // blockchain api + "/unity/contracts": "/unity/v4/contracts", + "/unity/contracts/get": "/unity/v4/contracts/get", + "/unity/contracts/read": "/unity/v4/contracts/read", + "/unity/contracts/write": "/unity/v4/contracts/write", + "/unity/contracts/prepare": "/unity/v4/contracts/prepare", + // erc20 + "/unity/contracts/erc20/erc20": "/unity/v4/contracts/erc20/erc20", + "/unity/contracts/erc20/erc20burnable": + "/unity/v4/contracts/erc20/erc20burnable", + "/unity/contracts/erc20/erc20claimconditions": + "/unity/v4/contracts/erc20/erc20claimconditions", + "/unity/contracts/erc20/erc20mintable": + "/unity/v4/contracts/erc20/erc20mintable", + "/unity/contracts/erc20/erc20signaturemintable": + "/unity/v4/contracts/erc20/erc20signaturemintable", + // erc721 + "/unity/contracts/erc721/erc721": "/unity/v4/contracts/erc721/erc721", + "/unity/contracts/erc721/erc721burnable": + "/unity/v4/contracts/erc721/erc721burnable", + "/unity/contracts/erc721/erc721claimconditions": + "/unity/v4/contracts/erc721/erc721claimconditions", + "/unity/contracts/erc721/erc721enumerable": + "/unity/v4/contracts/erc721/erc721enumerable", + "/unity/contracts/erc721/erc721mintable": + "/unity/v4/contracts/erc721/erc721mintable", + "/unity/contracts/erc721/erc721signaturemintable": + "/unity/v4/contracts/erc721/erc721signaturemintable", + "/unity/contracts/erc721/erc721supply": + "/unity/v4/contracts/erc721/erc721supply", + // erc1155 + "/unity/contracts/erc1155/erc1155": "/unity/v4/contracts/erc1155/erc1155", + "/unity/contracts/erc1155/erc1155burnable": + "/unity/v4/contracts/erc1155/erc1155burnable", + "/unity/contracts/erc1155/erc1155claimconditions": + "/unity/v4/contracts/erc1155/erc1155claimconditions", + "/unity/contracts/erc1155/erc1155enumerable": + "/unity/v4/contracts/erc1155/erc1155enumerable", + "/unity/contracts/erc1155/erc1155mintable": + "/unity/v4/contracts/erc1155/erc1155mintable", + "/unity/contracts/erc1155/erc1155signaturemintable": + "/unity/v4/contracts/erc1155/erc1155signaturemintable", + // marketplace + "/unity/contracts/marketplace": "/unity/v4/contracts/marketplace", + // pack + "/unity/contracts/pack": "/unity/v4/contracts/pack", + // events + "/unity/contracts/events/get": "/unity/v4/contracts/events/get", + "/unity/contracts/events/getall": "/unity/v4/contracts/events/getall", + "/unity/contracts/events/listentoall": + "/unity/v4/contracts/events/listentoall", + "/unity/contracts/events/removealllisteners": + "/unity/v4/contracts/events/removealllisteners", + // blocks + "/unity/blocks/getblock": "/unity/v4/blocks/getblock", + "/unity/blocks/getblockwithtransactions": + "/unity/v4/blocks/getblockwithtransactions", + "/unity/blocks/getlatestblocknumber": "/unity/v4/blocks/getlatestblocknumber", + "/unity/blocks/getlatestblocktimestamp": + "/unity/v4/blocks/getlatestblocktimestamp", }; const walletRedirects = { - //connect - "/connect/architecture": "/connect", - "/connect/sign-in": "/connect/sign-in/overview", - "/connect/usage-with-react-sdk": "/connect/sign-in", - "/connect/usage-with-react-native-sdk": "/connect/sign-in", - "/connect/usage-with-typescript-sdk": "/connect/sign-in", - "/connect/usage-with-unity-sdk": "/connect/sign-in", - "/connect/connect-wallet": "/connect/connect", - "/connect/supported-wallets": "/connect/connect", - "/connect/connect-wallet/wallet-providers": "/connect/connect", - "/connect/connect-wallet/theme": "/connect/sign-in", - "/connect/connect-wallet/button-title": "/connect/sign-in", - "/connect/connect-wallet/modal-title": "/connect/sign-in", - "/connect/connect-wallet/modal-size": "/connect/sign-in", - "/connect/connect-wallet/welcome-screen": "/connect/sign-in", - "/connect/connect-wallet/custom-button": "/connect/sign-in", - "/connect/connect-wallet/class-name": "/connect/sign-in", - "/connect/connect-wallet/drop-down-positions": "/connect/sign-in", - "/connect/connect-wallet/hide-testnet-faucet": "/connect/sign-in", - "/connect/connect-wallet/auth": "/connect/sign-in", - "/connect/connect-wallet/switch-chain": "/connect/sign-in", - "/connect/connect-wallet/privacy-policy": "/connect/sign-in", - "/connect/connect-wallet/terms-of-service": "/connect/sign-in", - "/connect/connect-wallet/custom-ui": "/connect/sign-in/custom-ui", - "/connect/faqs": "/connect/sign-in", - //embedded wallet - "/embedded-wallet": "/wallets/embedded-wallet/overview", - "/embedded-wallet/how-it-works": "/wallets/embedded-wallet/how-it-works", - "/embedded-wallet/getting-started": "/wallets/embedded-wallet/get-started", - "/embedded-wallet/connect": "/wallets/embedded-wallet/how-to/connect-users", - "/embedded-wallet/custom": - "/wallets/embedded-wallet/how-to/build-your-own-ui", - "/embedded-wallet/use": - "/wallets/embedded-wallet/how-to/interact-with-wallets", - "/embedded-wallet/interact": - "/wallets/embedded-wallet/how-to/interact-blockchain", - "/embedded-wallet/smart-wallet-and-embedded-wallet": - "/wallets/embedded-wallet/how-to/enable-gasless", - "/embedded-wallet/export-private-key": - "/wallets/embedded-wallet/how-to/export-private-key", - "/embedded-wallet/custom-auth": - "/wallets/embedded-wallet/custom-auth/configuration", - "/embedded-wallet/custom-auth-server": - "/wallets/embedded-wallet/custom-auth/custom-auth-server", - "/embedded-wallet/integrate-firebase": - "/wallets/embedded-wallet/custom-auth/firebase-auth", - "/embedded-wallet/custom-jwt-auth-server": - "/wallets/embedded-wallet/custom-auth/custom-jwt-auth-server", - "/embedded-wallet/faqs": "/wallets/embedded-wallet/faqs", - //smart wallet - "/smart-wallet": "/wallets/smart-wallet", - "/smart-wallet/how-it-works": "/wallets/smart-wallet/how-it-works", - "/smart-wallet/getting-started": "/wallets/smart-wallet/get-started", - "/smart-wallet/infrastructure": "wallets/smart-wallet/infrastructure", - "/smart-wallet/permissions": "/wallets/smart-wallet/permissions", - "/smart-wallet/guides/react": "/wallets/smart-wallet/guides/react", - "/smart-wallet/guides/typescript": "/wallets/smart-wallet/guides/typescript", - "/smart-wallet/faqs": "/wallets/smart-wallet/faq", - //auth - "/auth": "/connect/auth", - "/auth/how-auth-works": "/connect/auth/how-it-works", - "/auth/how-auth-works/sign-in-with-wallet": "/connect/auth/how-it-works/siwe", - "/auth/how-auth-works/json-web-tokens": "/connect/auth/how-it-works/jwt", - "/auth/how-auth-works/auth-api": "/connect/auth/how-it-works/api", - "/auth/getting-started": "/connect/auth/get-started", - "/auth/client-frameworks/react": "/connect/auth/client-frameworks/react", - "/auth/client-frameworks/react-native": - "/connect/auth/client-frameworks/react-native", - "/auth/server-frameworks/next": "/connect/auth/server-frameworks/next", - "/auth/server-frameworks/express": "/connect/auth/server-frameworks/express", - "/auth/integrations/next-auth": "/connect/auth/integrations/next-auth", - "/auth/integrations/supabase": "/connect/auth/integrations/supabase", - "/auth/integrations/firebase": "/connect/auth/integrations/firebase", - "/auth/wallet-configuration": "/connect/auth/wallet-configuration", - "/auth/faqs": "/connect/auth/faq", - "/connect/auth/how-it-works": "/connect/auth", - "/connect/auth/how-it-works/siwe": "/connect/auth", - "/connect/auth/how-it-works/jwt": "/connect/auth", - "/connect/auth/how-it-works/api": "/connect/auth", - "/connect/auth/get-started": "/connect/auth", - "/connect/auth/client-frameworks/react": "/connect/auth", - "/connect/auth/client-frameworks/react-native": "/connect/auth", - "/connect/auth/server-frameworks/next": "/connect/auth", - "/connect/auth/server-frameworks/express": "/connect/auth", - "/connect/auth/integrations/next-auth": "/connect/auth", - "/connect/auth/integrations/supabase": "/connect/auth", - "/connect/auth/integrations/firebase": "/connect/auth", - "/connect/auth/wallet-configuration": "/connect/auth", - "/connect/auth/faqs": "/connect/auth", - // Wallet SDK - "/wallet": "/wallet-sdk/v2", - "/wallet/architecture": "/wallet-sdk/v2", - "/wallet/getting-started": "/wallet-sdk/v2/usage", - "/wallet/usage-with-typescript-sdk": "/wallet-sdk/v2/usage", - "/wallet/usage-with-react-sdk": "/wallet-sdk/v2/usage", - "/wallet/usage-with-react-native-sdk": "/wallet-sdk/v2/usage", - "/wallet/usage-with-unity-sdk": "/wallet-sdk/v2/usage", - // build a wallet - "/wallet/build-a-wallet": "/wallet-sdk/v2/build", - "/wallet/interfaces/abstract-client-wallet": - "/references/wallets/v2/AbstractClientWallet", - "/wallet/interfaces/abstract-wallet": "/references/wallets/v2/AbstractWallet", - "/wallet/interfaces/connector": "/references/wallets/v2/Connector", - // wallets - "/wallet/metamask": "/references/wallets/v2/MetaMaskWallet", - "/wallet/coinbase-wallet": "/references/wallets/v2/CoinbaseWallet", - "/wallet/wallet-connect-v2": "/references/wallets/v2/WalletConnect", - "/wallet/smart-wallet": "/references/wallets/v2/SmartWallet", - "/wallet/embedded-wallet": "/references/wallets/v2/EmbeddedWallet", - "/wallet/paper": "/references/wallets/v2/EmbeddedWallet", - "/wallet/local-wallet": "/references/wallets/v2/LocalWallet", - "/wallet/local-wallet-node": "/references/wallets/v2/LocalWalletNode", - "/wallet/trust-wallet": "/references/wallets/v2/TrustWallet", - "/wallet/zerion-wallet": "/references/wallets/v2/ZerionWallet", - "/wallet/magic": "/references/wallets/v2/MagicLink", - "/wallet/rainbow": "/references/wallets/v2/RainbowWallet", - "/wallet/safe": "/references/wallets/v2/SafeWallet", - "/wallet/blocto": "/references/wallets/v2/BloctoWallet", - "/wallet/frame": "/references/wallets/v2/FrameWallet", - "/wallet/phantom": "/references/wallets/v2/PhantomWallet", - "/wallet/aws-kms": "/references/wallets/v2/AwsKmsWallet", - "/wallet/aws-secrets-manager": - "/references/wallets/v2/AwsSecretsManagerWallet", - "/wallet/coin98-wallet": "/references/wallets/v2/Coin98Wallet", - "/wallet/core-wallet": "/references/wallets/v2/CoreWallet", - "/wallet/defi-wallet": "/references/wallets/v2/CryptoDefiWallet", - "/wallet/ethers": "/references/wallets/v2/EthersWallet", - "/wallet/okx-wallet": "/references/wallets/v2/OKXWallet", - "/wallet/onekey-wallet": "/references/wallets/v2/OneKeyWallet", - "/wallet/private-key": "/references/wallets/v2/PrivateKeyWallet", - "/wallet/rabby-wallet": "/references/wallets/v2/RabbyWallet", + //connect + "/connect/architecture": "/connect", + "/connect/sign-in": "/connect/sign-in/overview", + "/connect/usage-with-react-sdk": "/connect/sign-in", + "/connect/usage-with-react-native-sdk": "/connect/sign-in", + "/connect/usage-with-typescript-sdk": "/connect/sign-in", + "/connect/usage-with-unity-sdk": "/connect/sign-in", + "/connect/connect-wallet": "/connect/connect", + "/connect/supported-wallets": "/connect/connect", + "/connect/connect-wallet/wallet-providers": "/connect/connect", + "/connect/connect-wallet/theme": "/connect/sign-in", + "/connect/connect-wallet/button-title": "/connect/sign-in", + "/connect/connect-wallet/modal-title": "/connect/sign-in", + "/connect/connect-wallet/modal-size": "/connect/sign-in", + "/connect/connect-wallet/welcome-screen": "/connect/sign-in", + "/connect/connect-wallet/custom-button": "/connect/sign-in", + "/connect/connect-wallet/class-name": "/connect/sign-in", + "/connect/connect-wallet/drop-down-positions": "/connect/sign-in", + "/connect/connect-wallet/hide-testnet-faucet": "/connect/sign-in", + "/connect/connect-wallet/auth": "/connect/sign-in", + "/connect/connect-wallet/switch-chain": "/connect/sign-in", + "/connect/connect-wallet/privacy-policy": "/connect/sign-in", + "/connect/connect-wallet/terms-of-service": "/connect/sign-in", + "/connect/connect-wallet/custom-ui": "/connect/sign-in/custom-ui", + "/connect/faqs": "/connect/sign-in", + + "/connect/ecosystem/faq": "/connect/wallet/faq", + "/connect/ecosystem/get-started": "/connect/wallet/get-started", + "/connect/ecosystem/overview": "/connect/wallet/overview", + "/connect/ecosystem/pregenerate-wallets": + "/connect/wallet/pregenerate-wallets", + "/connect/ecosystem/security": "/connect/wallet/security", + "/connect/ecosystem/wallet-explorer": "/connect/wallet/ecosystem/portal", + "/connect/ecosystem/ecosystem-premissions": + "/connect/wallet/ecosystem/permissions", + "/connect/ecosystem/integrating-partners": + "/connect/wallet/ecosystem/integrating-partners", + + "/connect/in-app-wallet/overview": "/connect/wallet/overview", + "/connect/in-app-wallet/security": "/connect/wallet/security", + "/connect/in-app-wallet/get-started": "/connect/wallet/get-started", + "/connect/in-app-wallet/faqs": "/connect/wallet/faq", + "/connect/in-app-wallet/guides/link-multiple-profiles": + "/connect/wallet/user-management/link-multiple-identity", + "/connect/in-app-wallet/guides/retrieve-linked-profiles": + "/connect/wallet/user-management/get-user-profiles", + "/connect/in-app-wallet/guides/get-user-details": + "/connect/wallet/user-management/get-user-profiles", + "/connect/in-app-wallet/guides/export-private-key": + "/connect/wallet/user-management/export-private-key", + + "/connect/sign-in/overview": "/connect/wallet/overview", + "/connect/sign-in/ConnectButton": "/connect/wallet/get-started", + "/connect/sign-in/ConnectEmbed": "/connect/wallet/get-started", + "/connect/sign-in/Custom-UI": "/connect/wallet/get-started", + "/connect/sign-in/methods/email-and-phone": + "/connect/wallet/sign-in-methods/configure", + "/connect/sign-in/methods/social-logins": + "/connect/wallet/sign-in-methods/configure", + "/connect/sign-in/methods/guest-mode": + "/connect/wallet/sign-in-methods/guest", + "/connect/sign-in/methods/external-wallets": + "/connect/wallet/sign-in-methods/external-wallets", + + //embedded wallet + "/embedded-wallet": "/wallets/embedded-wallet/overview", + "/embedded-wallet/how-it-works": "/wallets/embedded-wallet/how-it-works", + "/embedded-wallet/getting-started": "/wallets/embedded-wallet/get-started", + "/embedded-wallet/connect": "/wallets/embedded-wallet/how-to/connect-users", + "/embedded-wallet/custom": + "/wallets/embedded-wallet/how-to/build-your-own-ui", + "/embedded-wallet/use": + "/wallets/embedded-wallet/how-to/interact-with-wallets", + "/embedded-wallet/interact": + "/wallets/embedded-wallet/how-to/interact-blockchain", + "/embedded-wallet/smart-wallet-and-embedded-wallet": + "/wallets/embedded-wallet/how-to/enable-gasless", + "/embedded-wallet/export-private-key": + "/wallets/embedded-wallet/how-to/export-private-key", + "/embedded-wallet/custom-auth": + "/wallets/embedded-wallet/custom-auth/configuration", + "/embedded-wallet/custom-auth-server": + "/wallets/embedded-wallet/custom-auth/custom-auth-server", + "/embedded-wallet/integrate-firebase": + "/wallets/embedded-wallet/custom-auth/firebase-auth", + "/embedded-wallet/custom-jwt-auth-server": + "/wallets/embedded-wallet/custom-auth/custom-jwt-auth-server", + "/embedded-wallet/faqs": "/wallets/embedded-wallet/faqs", + //smart wallet + "/smart-wallet": "/wallets/smart-wallet", + "/smart-wallet/how-it-works": "/wallets/smart-wallet/how-it-works", + "/smart-wallet/getting-started": "/wallets/smart-wallet/get-started", + "/smart-wallet/infrastructure": "wallets/smart-wallet/infrastructure", + "/smart-wallet/permissions": "/wallets/smart-wallet/permissions", + "/smart-wallet/guides/react": "/wallets/smart-wallet/guides/react", + "/smart-wallet/guides/typescript": "/wallets/smart-wallet/guides/typescript", + "/smart-wallet/faqs": "/wallets/smart-wallet/faq", + //auth + "/auth": "/connect/auth", + "/auth/how-auth-works": "/connect/auth/how-it-works", + "/auth/how-auth-works/sign-in-with-wallet": "/connect/auth/how-it-works/siwe", + "/auth/how-auth-works/json-web-tokens": "/connect/auth/how-it-works/jwt", + "/auth/how-auth-works/auth-api": "/connect/auth/how-it-works/api", + "/auth/getting-started": "/connect/auth/get-started", + "/auth/client-frameworks/react": "/connect/auth/client-frameworks/react", + "/auth/client-frameworks/react-native": + "/connect/auth/client-frameworks/react-native", + "/auth/server-frameworks/next": "/connect/auth/server-frameworks/next", + "/auth/server-frameworks/express": "/connect/auth/server-frameworks/express", + "/auth/integrations/next-auth": "/connect/auth/integrations/next-auth", + "/auth/integrations/supabase": "/connect/auth/integrations/supabase", + "/auth/integrations/firebase": "/connect/auth/integrations/firebase", + "/auth/wallet-configuration": "/connect/auth/wallet-configuration", + "/auth/faqs": "/connect/auth/faq", + "/connect/auth/how-it-works": "/connect/auth", + "/connect/auth/how-it-works/siwe": "/connect/auth", + "/connect/auth/how-it-works/jwt": "/connect/auth", + "/connect/auth/how-it-works/api": "/connect/auth", + "/connect/auth/get-started": "/connect/auth", + "/connect/auth/client-frameworks/react": "/connect/auth", + "/connect/auth/client-frameworks/react-native": "/connect/auth", + "/connect/auth/server-frameworks/next": "/connect/auth", + "/connect/auth/server-frameworks/express": "/connect/auth", + "/connect/auth/integrations/next-auth": "/connect/auth", + "/connect/auth/integrations/supabase": "/connect/auth", + "/connect/auth/integrations/firebase": "/connect/auth", + "/connect/auth/wallet-configuration": "/connect/auth", + "/connect/auth/faqs": "/connect/auth", + // Wallet SDK + "/wallet": "/wallet-sdk/v2", + "/wallet/architecture": "/wallet-sdk/v2", + "/wallet/getting-started": "/wallet-sdk/v2/usage", + "/wallet/usage-with-typescript-sdk": "/wallet-sdk/v2/usage", + "/wallet/usage-with-react-sdk": "/wallet-sdk/v2/usage", + "/wallet/usage-with-react-native-sdk": "/wallet-sdk/v2/usage", + "/wallet/usage-with-unity-sdk": "/wallet-sdk/v2/usage", + // build a wallet + "/wallet/build-a-wallet": "/wallet-sdk/v2/build", + "/wallet/interfaces/abstract-client-wallet": + "/references/wallets/v2/AbstractClientWallet", + "/wallet/interfaces/abstract-wallet": "/references/wallets/v2/AbstractWallet", + "/wallet/interfaces/connector": "/references/wallets/v2/Connector", + // wallets + "/wallet/metamask": "/references/wallets/v2/MetaMaskWallet", + "/wallet/coinbase-wallet": "/references/wallets/v2/CoinbaseWallet", + "/wallet/wallet-connect-v2": "/references/wallets/v2/WalletConnect", + "/wallet/smart-wallet": "/references/wallets/v2/SmartWallet", + "/wallet/embedded-wallet": "/references/wallets/v2/EmbeddedWallet", + "/wallet/paper": "/references/wallets/v2/EmbeddedWallet", + "/wallet/local-wallet": "/references/wallets/v2/LocalWallet", + "/wallet/local-wallet-node": "/references/wallets/v2/LocalWalletNode", + "/wallet/trust-wallet": "/references/wallets/v2/TrustWallet", + "/wallet/zerion-wallet": "/references/wallets/v2/ZerionWallet", + "/wallet/magic": "/references/wallets/v2/MagicLink", + "/wallet/rainbow": "/references/wallets/v2/RainbowWallet", + "/wallet/safe": "/references/wallets/v2/SafeWallet", + "/wallet/blocto": "/references/wallets/v2/BloctoWallet", + "/wallet/frame": "/references/wallets/v2/FrameWallet", + "/wallet/phantom": "/references/wallets/v2/PhantomWallet", + "/wallet/aws-kms": "/references/wallets/v2/AwsKmsWallet", + "/wallet/aws-secrets-manager": + "/references/wallets/v2/AwsSecretsManagerWallet", + "/wallet/coin98-wallet": "/references/wallets/v2/Coin98Wallet", + "/wallet/core-wallet": "/references/wallets/v2/CoreWallet", + "/wallet/defi-wallet": "/references/wallets/v2/CryptoDefiWallet", + "/wallet/ethers": "/references/wallets/v2/EthersWallet", + "/wallet/okx-wallet": "/references/wallets/v2/OKXWallet", + "/wallet/onekey-wallet": "/references/wallets/v2/OneKeyWallet", + "/wallet/private-key": "/references/wallets/v2/PrivateKeyWallet", + "/wallet/rabby-wallet": "/references/wallets/v2/RabbyWallet", }; const paymentRedirects = { - "/checkouts": "/payments", - "/checkouts/getting-started": "/payments/nft-checkout/getting-started", - "/checkouts/enable-contract": "/payments/nft-checkout/enable-contract", - "/checkouts/checkout-link": "/payments/nft-checkout/checkout-link", - "/checkouts/go-live-checklist": "/payments/nft-checkout/go-live-checklist", - "/checkouts/elements": "/payments/nft-checkout/elements", - "/checkouts/checkout-with-card": "/payments/nft-checkout/checkout-with-card", - "/checkouts/checkout-with-eth": "/payments/nft-checkout/checkout-with-eth", - "/checkouts/webhooks": "/payments/nft-checkout/webhooks", - "/checkouts/translations": "/payments/nft-checkout/translations", - "/checkouts/marketplaces": "/payments/nft-checkout/marketplaces", - "/checkouts/one-time-checkout-link": - "/payments/nft-checkout/one-time-checkout-link", - "/checkouts/custom-contracts": "/payments/nft-checkout/custom-contracts", - "/checkouts/pre-built-contracts": - "/payments/nft-checkout/pre-built-contracts", - "/checkouts/erc20-pricing": "/payments/nft-checkout/erc20-pricing", - "/checkouts/api-reference": "/payments/nft-checkout/api-reference", - "/checkouts/faq": "/payments/nft-checkout/faq", - "/payments/:match*": "/connect/pay/overview", - "/connect/pay/buy-with-fiat": "/connect/pay/overview", - "/connect/pay/buy-with-crypto": "/connect/pay/overview", - "/connect/pay/buy-with-crypto/overview": "/connect/pay/overview", - "/connect/pay/buy-with-crypto/fee-sharing": "/connect/pay/fee-sharing", - "/connect/pay/build-a-custom-experience": - "/connect/pay/guides/build-a-custom-experience", - "/connect/pay/enable-test-mode": "/connect/pay/guides/enable-test-mode", - "/connect/pay/guides/enable-test-mode": "/connect/pay/testing-pay", - "/connect/in-app-wallet/how-it-works": "/connect/in-app-wallet/security", - "/connect/in-app-wallet/guides/get-in-app-wallet-details-on-server": - "/connect/in-app-wallet/guides/get-user-details", + "/checkouts": "/payments", + "/checkouts/getting-started": "/payments/nft-checkout/getting-started", + "/checkouts/enable-contract": "/payments/nft-checkout/enable-contract", + "/checkouts/checkout-link": "/payments/nft-checkout/checkout-link", + "/checkouts/go-live-checklist": "/payments/nft-checkout/go-live-checklist", + "/checkouts/elements": "/payments/nft-checkout/elements", + "/checkouts/checkout-with-card": "/payments/nft-checkout/checkout-with-card", + "/checkouts/checkout-with-eth": "/payments/nft-checkout/checkout-with-eth", + "/checkouts/webhooks": "/payments/nft-checkout/webhooks", + "/checkouts/translations": "/payments/nft-checkout/translations", + "/checkouts/marketplaces": "/payments/nft-checkout/marketplaces", + "/checkouts/one-time-checkout-link": + "/payments/nft-checkout/one-time-checkout-link", + "/checkouts/custom-contracts": "/payments/nft-checkout/custom-contracts", + "/checkouts/pre-built-contracts": + "/payments/nft-checkout/pre-built-contracts", + "/checkouts/erc20-pricing": "/payments/nft-checkout/erc20-pricing", + "/checkouts/api-reference": "/payments/nft-checkout/api-reference", + "/checkouts/faq": "/payments/nft-checkout/faq", + "/payments/:match*": "/connect/pay/overview", + "/connect/pay/buy-with-fiat": "/connect/pay/overview", + "/connect/pay/buy-with-crypto": "/connect/pay/overview", + "/connect/pay/buy-with-crypto/overview": "/connect/pay/overview", + "/connect/pay/buy-with-crypto/fee-sharing": "/connect/pay/fee-sharing", + "/connect/pay/build-a-custom-experience": + "/connect/pay/guides/build-a-custom-experience", + "/connect/pay/enable-test-mode": "/connect/pay/guides/enable-test-mode", + "/connect/pay/guides/enable-test-mode": "/connect/pay/testing-pay", + "/connect/in-app-wallet/how-it-works": "/connect/in-app-wallet/security", + "/connect/in-app-wallet/guides/get-in-app-wallet-details-on-server": + "/connect/in-app-wallet/guides/get-user-details", }; const contractRedirects = { - //pre-built contracts - "/pre-built-contracts": "/contracts", - "/pre-built-contracts/how-it-works": "/contracts", - "/explore/faqs": "/contracts", - "/pre-built-contracts/account-factory": - "/contracts/explore/pre-built-contracts/account-factory", - "/pre-built-contracts/airdrop-erc1155-claimable": - "/explore/pre-built-contracts/airdrop-erc1155-claimable", - "/pre-built-contracts/airdrop-erc1155": - "/contracts/explore/pre-built-contracts/airdrop-erc1155", - "/pre-built-contracts/airdrop-erc20-claimable": - "/contracts/explore/pre-built-contracts/airdrop-erc20-claimable", - "/pre-built-contracts/airdrop-erc20": - "/contracts/explore/pre-built-contracts/airdrop-erc20", - "/pre-built-contracts/airdrop-erc721-claimable": - "/contracts/explore/pre-built-contracts/airdrop-erc721-claimable", - "/pre-built-contracts/airdrop-erc721": - "/contracts/explore/pre-built-contracts/airdrop-erc721", - "/pre-built-contracts/edition-drop": - "/contracts/explore/pre-built-contracts/edition-drop", - "/pre-built-contracts/edition": - "/contracts/explore/pre-built-contracts/edition", - "/pre-built-contracts/loyalty-card": - "/contracts/explore/pre-built-contracts/loyalty-card", - "/pre-built-contracts/managed-account-factory": - "/contracts/explore/pre-built-contracts/managed-account-factory", - "/pre-built-contracts/marketplace": - "/contracts/explore/pre-built-contracts/marketplace", - "/pre-built-contracts/multiwrap": - "/contracts/explore/pre-built-contracts/multiwrap", - "/pre-built-contracts/nft-collection": - "/contracts/explore/pre-built-contracts/nft-collection", - "/pre-built-contracts/nft-drop": - "/contracts/explore/pre-built-contracts/nft-drop", - "/pre-built-contracts/open-edition-erc721": - "/contracts/explore/pre-built-contracts/open-edition", - "/pre-built-contracts/pack": "/contracts/explore/pre-built-contracts/pack", - "/pre-built-contracts/signature-drop": "/contracts", - "/pre-built-contracts/split": "/contracts/explore/pre-built-contracts/split", - "/pre-built-contracts/stake-erc1155": - "/contracts/explore/pre-built-contracts/stake-erc1155", - "/pre-built-contracts/stake-erc20": - "/contracts/explore/pre-built-contracts/stake-erc20", - "/pre-built-contracts/stake-erc721": - "/contracts/explore/pre-built-contracts/stake-erc721", - "/pre-built-contracts/token-drop": - "/contracts/explore/pre-built-contracts/token-drop", - "/pre-built-contracts/token": "/contracts/explore/pre-built-contracts/token", - "/pre-built-contracts/vote": "/contracts/explore/pre-built-contracts/vote", - //deploy - "/deploy": "contracts/deploy/overview", - "/deploy/how-it-works": "/contracts/deploy/overview", - "/deploy/getting-started": "/contracts/deploy/deploy-contract", - "/deploy/faqs": "/contracts/deploy/overview", - //publish - "/publish": "/contracts/publish/overview", - "/publish/getting-started": "/contracts/publish/publish-contract", - "/publish/deployment-options": "/contracts/publish/publish-options", - "/publish/get-featured-on-explore": "/contracts/publish/overview", - "/sdk": "/contracts/interact/overview", - "/sdk/how-it-works": "/contracts/interact/overview", - "/sdk/getting-started": "/contracts/interact/overview", - //design documentation - "/contracts/design/Drop": "/contracts/design-docs/drop", - "/contracts/design/Marketplace": "/contracts/design-docs/marketplace", - "/contracts/design/SignatureMint": "/contracts/design-docs/signature-mint", - "/contracts/design/Multiwrap": "/contracts/design-docs/multiwrap", - "/contracts/design/Pack": "/contracts/design-docs/pack", - "/contracts/design/SignatureDrop": "/contracts", + //pre-built contracts + "/pre-built-contracts": "/contracts", + "/pre-built-contracts/how-it-works": "/contracts", + "/explore/faqs": "/contracts", + "/pre-built-contracts/account-factory": + "/contracts/explore/pre-built-contracts/account-factory", + "/pre-built-contracts/airdrop-erc1155-claimable": + "/explore/pre-built-contracts/airdrop-erc1155-claimable", + "/pre-built-contracts/airdrop-erc1155": + "/contracts/explore/pre-built-contracts/airdrop-erc1155", + "/pre-built-contracts/airdrop-erc20-claimable": + "/contracts/explore/pre-built-contracts/airdrop-erc20-claimable", + "/pre-built-contracts/airdrop-erc20": + "/contracts/explore/pre-built-contracts/airdrop-erc20", + "/pre-built-contracts/airdrop-erc721-claimable": + "/contracts/explore/pre-built-contracts/airdrop-erc721-claimable", + "/pre-built-contracts/airdrop-erc721": + "/contracts/explore/pre-built-contracts/airdrop-erc721", + "/pre-built-contracts/edition-drop": + "/contracts/explore/pre-built-contracts/edition-drop", + "/pre-built-contracts/edition": + "/contracts/explore/pre-built-contracts/edition", + "/pre-built-contracts/loyalty-card": + "/contracts/explore/pre-built-contracts/loyalty-card", + "/pre-built-contracts/managed-account-factory": + "/contracts/explore/pre-built-contracts/managed-account-factory", + "/pre-built-contracts/marketplace": + "/contracts/explore/pre-built-contracts/marketplace", + "/pre-built-contracts/multiwrap": + "/contracts/explore/pre-built-contracts/multiwrap", + "/pre-built-contracts/nft-collection": + "/contracts/explore/pre-built-contracts/nft-collection", + "/pre-built-contracts/nft-drop": + "/contracts/explore/pre-built-contracts/nft-drop", + "/pre-built-contracts/open-edition-erc721": + "/contracts/explore/pre-built-contracts/open-edition", + "/pre-built-contracts/pack": "/contracts/explore/pre-built-contracts/pack", + "/pre-built-contracts/signature-drop": "/contracts", + "/pre-built-contracts/split": "/contracts/explore/pre-built-contracts/split", + "/pre-built-contracts/stake-erc1155": + "/contracts/explore/pre-built-contracts/stake-erc1155", + "/pre-built-contracts/stake-erc20": + "/contracts/explore/pre-built-contracts/stake-erc20", + "/pre-built-contracts/stake-erc721": + "/contracts/explore/pre-built-contracts/stake-erc721", + "/pre-built-contracts/token-drop": + "/contracts/explore/pre-built-contracts/token-drop", + "/pre-built-contracts/token": "/contracts/explore/pre-built-contracts/token", + "/pre-built-contracts/vote": "/contracts/explore/pre-built-contracts/vote", + //deploy + "/deploy": "contracts/deploy/overview", + "/deploy/how-it-works": "/contracts/deploy/overview", + "/deploy/getting-started": "/contracts/deploy/deploy-contract", + "/deploy/faqs": "/contracts/deploy/overview", + //publish + "/publish": "/contracts/publish/overview", + "/publish/getting-started": "/contracts/publish/publish-contract", + "/publish/deployment-options": "/contracts/publish/publish-options", + "/publish/get-featured-on-explore": "/contracts/publish/overview", + "/sdk": "/contracts/interact/overview", + "/sdk/how-it-works": "/contracts/interact/overview", + "/sdk/getting-started": "/contracts/interact/overview", + //design documentation + "/contracts/design/Drop": "/contracts/design-docs/drop", + "/contracts/design/Marketplace": "/contracts/design-docs/marketplace", + "/contracts/design/SignatureMint": "/contracts/design-docs/signature-mint", + "/contracts/design/Multiwrap": "/contracts/design-docs/multiwrap", + "/contracts/design/Pack": "/contracts/design-docs/pack", + "/contracts/design/SignatureDrop": "/contracts", }; const infrastructureRedirects = { - //engine top-level - "/infrastructure/engine": "/engine", - "/infrastructure/engine/get-started": "/engine/get-started", - "/infrastructure/engine/production-checklist": "/engine/production-checklist", - "/infrastructure/engine/self-host": "/engine/self-host", - "/infrastructure/engine/features/backend-wallets": - "/engine/features/backend-wallets", - "/infrastructure/engine/features/contracts": "/engine/features/contracts", - "/infrastructure/engine/features/permissions": "/engine/features/permissions", - "/infrastructure/engine/features/webhooks": "/engine/features/webhooks", - "/infrastructure/engine/features/smart-wallets": - "/engine/features/smart-wallets", - "/infrastructure/engine/features/relayers": "/engine/features/relayers", - "/infrastructure/engine/features/gasless-transactions": - "/engine/features/gasless-transactions", - "/infrastructure/engine/guides/airdrop-nfts": "/engine/guides/airdrop-nfts", - "/infrastructure/engine/guides/nft-checkout": "/engine/guides/nft-checkout", - "/infrastructure/engine/guides/smart-wallets": "/engine/guides/smart-wallets", - "/infrastructure/engine/references/api-reference": - "/engine/references/api-reference", - "/infrastructure/engine/references/typescript": - "/engine/references/typescript", - "/infrastucture/engine/security": "/engine/security", - "/infrastructure/engine/faq": "/engine/faq", - "/guides/engine/relayer": "/engine/features/relayer", - "/infrastructure/engine/overview": "/engine", - "/engine/features/permissions": "/engine/features/admins", + //engine top-level + "/infrastructure/engine": "/engine", + "/infrastructure/engine/get-started": "/engine/get-started", + "/infrastructure/engine/production-checklist": "/engine/production-checklist", + "/infrastructure/engine/self-host": "/engine/self-host", + "/infrastructure/engine/features/backend-wallets": + "/engine/features/backend-wallets", + "/infrastructure/engine/features/contracts": "/engine/features/contracts", + "/infrastructure/engine/features/permissions": "/engine/features/permissions", + "/infrastructure/engine/features/webhooks": "/engine/features/webhooks", + "/infrastructure/engine/features/smart-wallets": + "/engine/features/smart-wallets", + "/infrastructure/engine/features/relayers": "/engine/features/relayers", + "/infrastructure/engine/features/gasless-transactions": + "/engine/features/gasless-transactions", + "/infrastructure/engine/guides/airdrop-nfts": "/engine/guides/airdrop-nfts", + "/infrastructure/engine/guides/nft-checkout": "/engine/guides/nft-checkout", + "/infrastructure/engine/guides/smart-wallets": "/engine/guides/smart-wallets", + "/infrastructure/engine/references/api-reference": + "/engine/references/api-reference", + "/infrastructure/engine/references/typescript": + "/engine/references/typescript", + "/infrastucture/engine/security": "/engine/security", + "/infrastructure/engine/faq": "/engine/faq", + "/guides/engine/relayer": "/engine/features/relayer", + "/infrastructure/engine/overview": "/engine", + "/engine/features/permissions": "/engine/features/admins", - //storage - "/storage": "/infrastructure/storage/overview", - "/storage/how-storage-works": "/infrastructure/storage/how-storage-works", - "/storage/upload-to-ipfs": - "/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs", - "/storage/host-web-app": - "/infrastructure/storage/how-to-use-storage/host-web-app", - //rpc-edge - "/rpc-edge": "/infrastructure/rpc-edge/overview", - "/rpc-edge/get-started": "/infrastructure/rpc-edge/get-started", - "/rpc-edge/faqs": "/infrastructure/rpc-edge/overview", + //storage + "/storage": "/infrastructure/storage/overview", + "/storage/how-storage-works": "/infrastructure/storage/how-storage-works", + "/storage/upload-to-ipfs": + "/infrastructure/storage/how-to-use-storage/upload-files-to-ipfs", + "/storage/host-web-app": + "/infrastructure/storage/how-to-use-storage/host-web-app", + //rpc-edge + "/rpc-edge": "/infrastructure/rpc-edge/overview", + "/rpc-edge/get-started": "/infrastructure/rpc-edge/get-started", + "/rpc-edge/faqs": "/infrastructure/rpc-edge/overview", }; const otherRedirects = { - // wallets > connect redirects - "/wallets": "/connect", - "/wallets/connect/:path*": "/connect/connect/:path*", - "/wallets/embedded-wallet/:path*": "/connect/embedded-wallet/:path*", - "/wallets/auth/:path*": "/connect/auth/:path*", - // guides - "/solana/:match*": "https://blog.thirdweb.com/discontinuing-solana-support/", - "/pre-built-contracts/solana/:match*": - "https://blog.thirdweb.com/discontinuing-solana-support/", - "/learn/recipes/:match*": "https://blog.thirdweb.com/", - "/guides/tag/bundle-collection": "https://blog.thirdweb.com/tag/edition", - "/guides/tag/bundle-drop": "https://blog.thirdweb.com/tag/bundle-drop", - "/guides/bundle-drop": "https://blog.thirdweb.com/tag/edition-drop", - "/guides/splits": "https://blog.thirdweb.com/tag/split", - "/guides/bundle-collection": "https://blog.thirdweb.com/tag/edition", - "/guides/connect-wallet": - "https://blog.thirdweb.com/guides/add-connectwallet-to-your-website/", - "/guides/create-a-drop-with-thirdweb-dashboard": - "https://blog.thirdweb.com/guides/release-an-nft-drop-with-no-code", - "/guides/minting-with-signature": - "https://blog.thirdweb.com/guides/on-demand-minting", - "/guides/nft-drop": "https://blog.thirdweb.com/tag/nft-drop", - "/guides/nft-collection": "https://blog.thirdweb.com/tag/nft-collection", - "/guides/edition-drop": "https://blog.thirdweb.com/tag/edition-drop", - "/guides/edition": "https://blog.thirdweb.com/tag/edition", - "/guides/token": "https://blog.thirdweb.com/tag/token", - "/guides/vote": "https://blog.thirdweb.com/tag/vote", - "/guides/split": "https://blog.thirdweb.com/tag/split", - "/guides/marketplace": "https://blog.thirdweb.com/tag/marketplace", - "/guides/pack": "https://blog.thirdweb.com/tag/pack", - "/guides": "https://blog.thirdweb.com/guides", - "/tag/:match*": "https://blog.thirdweb.com/tag/:match*", - "/guides/on-demand-minting": - "https://blog.thirdweb.com/guides/mint-nft-unique-code", - "/guides/create-your-own-marketplace-with-thirdweb-typescript-sdk": - "https://blog.thirdweb.com/guides/nft-marketplace-with-typescript-next", - "/guides/create-a-pack-with-typescript-and-nextjs": - "https://blog.thirdweb.com/guides/create-an-nft-lootbox", - "/guides/randomized-nft-drop": - "https://blog.thirdweb.com/guides/shuffle-nft-drop", - // solidity sdk - "/contracts/nft-drop": "/contracts/explore/pre-built-contracts/nft-drop", - "/contracts/nft-collection": - "contracts/explore/pre-built-contracts/nft-collection", - "/contracts/edition-drop": - "/contracts/explore/pre-built-contracts/edition-drop", - "/contracts/edition": "/contracts/explore/pre-built-contracts/edition", - "/contracts/token-drop": "/contracts/explore/pre-built-contracts/token-drop", - "/contracts/token": "/contracts/explore/pre-built-contracts/token", - "/contracts/vote": "/contracts/explore/pre-built-contracts/vote", - "/contracts/split": "/contracts/explore/pre-built-contracts/split", - "/contracts/marketplace": - "/contracts/explore/pre-built-contracts/marketplace", - "/contracts/pack": "/contracts/explore/pre-built-contracts/pack", - "/contracts/nfts-and-tokens": "/contracts", - "/contracts/drops": "/contracts", - "/contracts/governance": "/contracts", - // account abstraction rename - "/wallets/smart-wallet/:path*": "/connect/account-abstraction/:path*", - "/connect/smart-wallet/:path*": "/connect/account-abstraction/:path*", - "/connect/account-abstraction": "/connect/account-abstraction/overview", - "/unity/wallets/providers/smart-wallet": - "/unity/wallets/providers/account-abstraction", - "/engine/features/smart-wallets": "/engine/features/account-abstraction", - // others - "/pre-built-contracts/:path*": "/contracts", - "/thirdweb-deploy/:path*": "/contracts/deploy/overview", - "/thirdweb-cli": "/cli", - "/smart-contracts": "/contracts", - "/contracts-sdk/:path*": "/contracts/build", - "/unity/connectwalletnative": "/unity/wallets/prefab", - "/unity/prefabs/thirdwebmanager": "/unity/thirdwebmanager", - "/gamingkit/:path*": "/unity", - "/gaming-kit/:path*": "/unity", - "/contractkit/:path*": "/contracts", - "/extensions/:path*": "/contracts/build/extensions", - "/release/:match*": "/contracts/publish/overview", - "/sdk/:path*": "/typescript/v4", - "/web3-api/:path*": "/infrastructure/engine/overview", - "/api-keys": "/account/api-keys", - "/python": "/engine/overview", - "/go": "/engine/overview", - "/ui-components/connectwalletbutton": "/react/v4/components/ConnectWallet", - "/ui-components/nft-renderer": "/react/v4/components/ThirdwebNftMedia", - "/ui-components/ipfs-media-renderer": "/react/v4/components/MediaRenderer", - "/templates": "https://thirdweb.com/templates", - "/gaming": "/", - "/solutions": "/", - "/solutions/gaming": "/", - "/signature-minting": "/contracts/design-docs/signature-mint", - // in-app wallet - "/references/typescript/v5/embeddedWallet": - "/references/typescript/v5/inAppWallet", - "/connect/embedded-wallet/:path*": "/connect/in-app-wallet/:path*", - "/connect/embedded-wallet/how-to/get-embedded-wallet-details-on-server": - "/connect/in-app-wallet/how-to/get-in-app-wallet-details-on-server", - "/react-native/v0/wallets/embedded-wallet": - "/react-native/v0/wallets/in-app-wallet", - "/unity/wallets/providers/embedded-wallet": - "/unity/wallets/providers/in-app-wallet", - // connect - "/connect/connect": "/connect/sign-in", - "/connect/in-app-wallet/how-to/get-in-app-wallet-details-on-server": - "/connect/in-app-wallet/guides/get-in-app-wallet-details-on-server", + // wallets > connect redirects + "/wallets": "/connect", + "/wallets/connect/:path*": "/connect/connect/:path*", + "/wallets/embedded-wallet/:path*": "/connect/embedded-wallet/:path*", + "/wallets/auth/:path*": "/connect/auth/:path*", + // guides + "/solana/:match*": "https://blog.thirdweb.com/discontinuing-solana-support/", + "/pre-built-contracts/solana/:match*": + "https://blog.thirdweb.com/discontinuing-solana-support/", + "/learn/recipes/:match*": "https://blog.thirdweb.com/", + "/guides/tag/bundle-collection": "https://blog.thirdweb.com/tag/edition", + "/guides/tag/bundle-drop": "https://blog.thirdweb.com/tag/bundle-drop", + "/guides/bundle-drop": "https://blog.thirdweb.com/tag/edition-drop", + "/guides/splits": "https://blog.thirdweb.com/tag/split", + "/guides/bundle-collection": "https://blog.thirdweb.com/tag/edition", + "/guides/connect-wallet": + "https://blog.thirdweb.com/guides/add-connectwallet-to-your-website/", + "/guides/create-a-drop-with-thirdweb-dashboard": + "https://blog.thirdweb.com/guides/release-an-nft-drop-with-no-code", + "/guides/minting-with-signature": + "https://blog.thirdweb.com/guides/on-demand-minting", + "/guides/nft-drop": "https://blog.thirdweb.com/tag/nft-drop", + "/guides/nft-collection": "https://blog.thirdweb.com/tag/nft-collection", + "/guides/edition-drop": "https://blog.thirdweb.com/tag/edition-drop", + "/guides/edition": "https://blog.thirdweb.com/tag/edition", + "/guides/token": "https://blog.thirdweb.com/tag/token", + "/guides/vote": "https://blog.thirdweb.com/tag/vote", + "/guides/split": "https://blog.thirdweb.com/tag/split", + "/guides/marketplace": "https://blog.thirdweb.com/tag/marketplace", + "/guides/pack": "https://blog.thirdweb.com/tag/pack", + "/guides": "https://blog.thirdweb.com/guides", + "/tag/:match*": "https://blog.thirdweb.com/tag/:match*", + "/guides/on-demand-minting": + "https://blog.thirdweb.com/guides/mint-nft-unique-code", + "/guides/create-your-own-marketplace-with-thirdweb-typescript-sdk": + "https://blog.thirdweb.com/guides/nft-marketplace-with-typescript-next", + "/guides/create-a-pack-with-typescript-and-nextjs": + "https://blog.thirdweb.com/guides/create-an-nft-lootbox", + "/guides/randomized-nft-drop": + "https://blog.thirdweb.com/guides/shuffle-nft-drop", + // solidity sdk + "/contracts/nft-drop": "/contracts/explore/pre-built-contracts/nft-drop", + "/contracts/nft-collection": + "contracts/explore/pre-built-contracts/nft-collection", + "/contracts/edition-drop": + "/contracts/explore/pre-built-contracts/edition-drop", + "/contracts/edition": "/contracts/explore/pre-built-contracts/edition", + "/contracts/token-drop": "/contracts/explore/pre-built-contracts/token-drop", + "/contracts/token": "/contracts/explore/pre-built-contracts/token", + "/contracts/vote": "/contracts/explore/pre-built-contracts/vote", + "/contracts/split": "/contracts/explore/pre-built-contracts/split", + "/contracts/marketplace": + "/contracts/explore/pre-built-contracts/marketplace", + "/contracts/pack": "/contracts/explore/pre-built-contracts/pack", + "/contracts/nfts-and-tokens": "/contracts", + "/contracts/drops": "/contracts", + "/contracts/governance": "/contracts", + // account abstraction rename + "/wallets/smart-wallet/:path*": "/connect/account-abstraction/:path*", + "/connect/smart-wallet/:path*": "/connect/account-abstraction/:path*", + "/connect/account-abstraction": "/connect/account-abstraction/overview", + "/unity/wallets/providers/smart-wallet": + "/unity/wallets/providers/account-abstraction", + "/engine/features/smart-wallets": "/engine/features/account-abstraction", + // others + "/pre-built-contracts/:path*": "/contracts", + "/thirdweb-deploy/:path*": "/contracts/deploy/overview", + "/thirdweb-cli": "/cli", + "/smart-contracts": "/contracts", + "/contracts-sdk/:path*": "/contracts/build", + "/unity/connectwalletnative": "/unity/wallets/prefab", + "/unity/prefabs/thirdwebmanager": "/unity/thirdwebmanager", + "/gamingkit/:path*": "/unity", + "/gaming-kit/:path*": "/unity", + "/contractkit/:path*": "/contracts", + "/extensions/:path*": "/contracts/build/extensions", + "/release/:match*": "/contracts/publish/overview", + "/sdk/:path*": "/typescript/v4", + "/web3-api/:path*": "/infrastructure/engine/overview", + "/api-keys": "/account/api-keys", + "/python": "/engine/overview", + "/go": "/engine/overview", + "/ui-components/connectwalletbutton": "/react/v4/components/ConnectWallet", + "/ui-components/nft-renderer": "/react/v4/components/ThirdwebNftMedia", + "/ui-components/ipfs-media-renderer": "/react/v4/components/MediaRenderer", + "/templates": "https://thirdweb.com/templates", + "/gaming": "/", + "/solutions": "/", + "/solutions/gaming": "/", + "/signature-minting": "/contracts/design-docs/signature-mint", + // in-app wallet + "/references/typescript/v5/embeddedWallet": + "/references/typescript/v5/inAppWallet", + "/connect/embedded-wallet/:path*": "/connect/in-app-wallet/:path*", + "/connect/embedded-wallet/how-to/get-embedded-wallet-details-on-server": + "/connect/in-app-wallet/how-to/get-in-app-wallet-details-on-server", + "/react-native/v0/wallets/embedded-wallet": + "/react-native/v0/wallets/in-app-wallet", + "/unity/wallets/providers/embedded-wallet": + "/unity/wallets/providers/in-app-wallet", + // connect + "/connect/connect": "/connect/sign-in", + "/connect/in-app-wallet/how-to/get-in-app-wallet-details-on-server": + "/connect/in-app-wallet/guides/get-in-app-wallet-details-on-server", }; const v5RestructuredRedirects = { - "/typescript/v5/react": "/react/v5", - "/typescript/v5/react/:path*": "/react/v5/:path*", - "/typescript/v5/react-native": "/react-native/v5", - "/typescript/v5/react-native/:path*": "/react-native/v5/:path*", + "/typescript/v5/react": "/react/v5", + "/typescript/v5/react/:path*": "/react/v5/:path*", + "/typescript/v5/react-native": "/react-native/v5", + "/typescript/v5/react-native/:path*": "/react-native/v5/:path*", }; /** * @type {import('next').NextConfig['redirects']} */ export const redirects = async () => { - return [ - // old portal redirects - ...createRedirects(reactRedirects), - ...createRedirects(solidityRedirects), - ...createRedirects(typescriptRedirects), - ...createRedirects(reactNativeRedirects), - ...createRedirects(unityRedirects), - ...createRedirects(walletRedirects), - ...createRedirects(paymentRedirects), - ...createRedirects(infrastructureRedirects), - ...createRedirects(contractRedirects), - ...createRedirects(otherRedirects), - ...createRedirects(v5RestructuredRedirects), - ...createRedirects(unrealEngineRedirects), - // references docs - latestReference("react", "v4"), - latestReference("react-native", "v0"), - latestReference("typescript", "v5"), - latestReference("wallets", "v2"), - latestReference("storage", "v2"), - // sdk docs - latestSDK("react", "v4"), - latestSDK("react-native", "v0"), - latestSDK("typescript", "v5"), - latestSDK("wallet-sdk", "v2"), - latestSDK("storage-sdk", "v2"), - ]; + return [ + // old portal redirects + ...createRedirects(reactRedirects), + ...createRedirects(solidityRedirects), + ...createRedirects(typescriptRedirects), + ...createRedirects(reactNativeRedirects), + ...createRedirects(unityRedirects), + ...createRedirects(walletRedirects), + ...createRedirects(paymentRedirects), + ...createRedirects(infrastructureRedirects), + ...createRedirects(contractRedirects), + ...createRedirects(otherRedirects), + ...createRedirects(v5RestructuredRedirects), + ...createRedirects(unrealEngineRedirects), + // references docs + latestReference("react", "v4"), + latestReference("react-native", "v0"), + latestReference("typescript", "v5"), + latestReference("wallets", "v2"), + latestReference("storage", "v2"), + // sdk docs + latestSDK("react", "v4"), + latestSDK("react-native", "v0"), + latestSDK("typescript", "v5"), + latestSDK("wallet-sdk", "v2"), + latestSDK("storage-sdk", "v2"), + ]; }; /** @@ -966,11 +1005,11 @@ export const redirects = async () => { * @returns */ function createRedirects(linkMap, permanent = true) { - const redirects = []; - for (const key in linkMap) { - redirects.push({ source: key, destination: linkMap[key], permanent }); - } - return redirects; + const redirects = []; + for (const key in linkMap) { + redirects.push({ source: key, destination: linkMap[key], permanent }); + } + return redirects; } /** @@ -980,11 +1019,11 @@ function createRedirects(linkMap, permanent = true) { * @returns */ function latestReference(pkg, latestVersion) { - return { - source: `/references/${pkg}/latest/:path*`, - destination: `/references/${pkg}/${latestVersion}/:path*`, - permanent: false, - }; + return { + source: `/references/${pkg}/latest/:path*`, + destination: `/references/${pkg}/${latestVersion}/:path*`, + permanent: false, + }; } /** @@ -994,9 +1033,9 @@ function latestReference(pkg, latestVersion) { * @returns */ function latestSDK(pkg, latestVersion) { - return { - source: `/${pkg}/latest/:path*`, - destination: `/${pkg}/${latestVersion}/:path*`, - permanent: false, - }; + return { + source: `/${pkg}/latest/:path*`, + destination: `/${pkg}/${latestVersion}/:path*`, + permanent: false, + }; } diff --git a/apps/portal/src/app/connect/ecosystems/faq/page.mdx b/apps/portal/src/app/connect/ecosystems/faq/page.mdx deleted file mode 100644 index 9f41153708d..00000000000 --- a/apps/portal/src/app/connect/ecosystems/faq/page.mdx +++ /dev/null @@ -1,64 +0,0 @@ -import { createMetadata } from "@doc"; - -export const metadata = createMetadata({ - image: { - title: "thirdweb Ecosystem Wallet", - icon: "wallets", - }, - title: "FAQ - Ecosystem Wallet | thirdweb", - description: "Ecosystem Wallet - Own your web3 identity stack", -}); - -# Frequently Asked Questions - -### What is an Ecosystem Wallet? - -An ecosystem wallet is a managed in-app wallet service that allows you to create a branded wallet and login system, manage your partners, and allow any number of partners to spin up in-app wallets. End users that create in-app wallets through your partner applications (either with email, phone number, passkey, or socials) will receive **one account and wallet address** that they can access across the entire ecosystem. - -### How do Ecosystem Wallets work? - -Ecosystem Wallets are a fully managed and containerized in-app wallet backend service that is white labeled to your application. You can learn more about how we’ve built our in-app wallet services in our [How It Works guide](https://portal.thirdweb.com/connect/in-app-wallet/how-it-works). By giving you access to this backend service, you can power any application with in-app wallets just like thirdweb does for over 70,000 developers. - -### What is the difference between default and prompted wallet signing? - -Default: Wallet signing settings default to signless interactions, meaning developers can sign on behalf of their end users. This enables signless sessions, similar to thirdweb's in-app wallet functionality. - -Prompted: Users will be prompted to sign any messages sent by the developer, including approvals and transactions. This is similar with any externally owned account like Metamask. - -### What is an Ecosystem Partner? - -Ecosystem partners are games or applications that you have permissioned to spin up in-app wallets underneath your brand. They will have access to the same account (funds, assets, etc.) for any end users that 1) use your branded login system or 2) log in with your wallet. - -You can manage ecosystem partners in the Permissions tab of your Ecosystem Wallet dashboard. - -### Which login providers can display my Ecosystem Wallet? - -thirdweb Connect, with WalletConnect and any wagmi- or viem-based login providers coming soon. - -### How can Partners integrate my Ecosystem Wallet? - -Partners can integrate your Ecosystem Wallet in three different ways: - -**Login System** - -Partners can install thirdweb SDK and use the Partner ID you created for them to display your branded sign in flow. All login options in this sign in flow will create an in-app wallet. - -**Branded Wallet Connector** - -Partners can add your wallet as a wallet connector option in their existing sign in flow on any domains they've whitelisted by calling the follow endpoint from their application. - -**WalletConnect (Coming Soon)** - -Partners using WalletConnect will automatically display your wallet as a WalletConnect option on any domains they've whitelisted. - -### What is the difference between Anyone and Allowlist scopes for Ecosystem Wallet? - -The **Anyone** scope allows any developer to integrate your ecosystem wallet, even if you have not given them permission. Any developer with thirdweb Connect, for example, would now display your wallet as a login option. - -The **Allowlist** scope allows developers that you have explicitly added to your list of Partners to display your wallet as a login option. - -You can manage scope in the Permissions tab of your Ecosystem Wallet dashboard. - -### How does billing work for Ecosystem Wallets? - -As the ecosystem admin, you will be billed $250 monthly for your Ecosystem Wallet. This allows any application or game in your ecosystem generate in-app wallets. Each month, we allow you and your ecosystem partners to generate 30,000 wallets for free. Once you’ve generated 30,000 wallets, you will be charged $0.02 per in-app wallet. At the end of each month, we will provide you with an invoice with a usage breakdown across all partners. diff --git a/apps/portal/src/app/connect/ecosystems/overview/page.mdx b/apps/portal/src/app/connect/ecosystems/overview/page.mdx deleted file mode 100644 index cab573e2b2f..00000000000 --- a/apps/portal/src/app/connect/ecosystems/overview/page.mdx +++ /dev/null @@ -1,63 +0,0 @@ -import { Callout, DocImage, createMetadata, FeatureCard } from "@doc"; -import EcosystemWalletOverview from "../assets/ecosystem-wallet.png"; - -export const metadata = createMetadata({ - image: { - title: "thirdweb Ecosystem Wallet", - icon: "wallets", - }, - title: "Ecosystem Wallet | thirdweb", - description: "Ecosystem Wallet - Own your own web3 identity stack", -}); - -# Ecosystem Wallet - -An ecosystem wallet is your own managed in-app wallet service that allows you to create a branded wallet and login system, and allow any number of partners to spin up in-app wallets. End users that create in-app wallets in your partner applications (either with email, phone number, passkey, or socials) will receive one account and wallet address that they can access across all apps and games in your ecosystem. - - - -## Features - -
- - - - - - - -
- -## Use cases - -- **Gaming Studios** - Build cross-game accounts for your players -- **Loyalty Programs** - Attribute user wallet activity across applications -- **Chains** - Create one account for all applications on your chain - -## Pricing - -Ecosystem Wallets start at $250/mo per instance. Instances allow for up to 30,000 monthly active in-app wallets and $0.02 per additional monthly active in-app wallet. - -For pricing on unlimited wallets, contact our sales team. diff --git a/apps/portal/src/app/connect/ecosystems/pregenerate-wallets/page.mdx b/apps/portal/src/app/connect/ecosystems/pregenerate-wallets/page.mdx deleted file mode 100644 index 0eacbb3f881..00000000000 --- a/apps/portal/src/app/connect/ecosystems/pregenerate-wallets/page.mdx +++ /dev/null @@ -1,81 +0,0 @@ -# Pregenerate User Wallets - -To pregenerate an embedded wallet, you can make a `POST` request to the following endpoint: - -``` -https://embedded-wallet.thirdweb.com/api/v1/pregenerate -``` -This allows you to safely create wallet addresses for your users before they login to your app. - -## Request Body - -The request body should be a JSON object with the following parameters: - -- `strategy`: The strategy for wallet generation -- `email` or `phone` or `userId`: The user identifier associated with the wallet to be generated - -### Email based wallets - -``` -{ strategy: "email", email: "user@example.com" } -``` - -When the user logs in with any method associated with that email (including google, facebook, discord auth), they will get access to the same pregenerated wallet. - -### Phone based wallets - -``` -{ strategy: "phone", phone: "+1321123321" } -``` - -### Custom user id based wallets - -``` -{ strategy: "custom_auth_endpoint", userId: "some_user_id" } -``` - -Use this when [bringing your own authentication method](/connect/in-app-wallet/custom-auth/configuration). When the user logs in, if the user ids you provide from the auth endpoint match, they will get access to the same pregenerated wallet. - -## Headers - -You need to include the following headers: - -- `x-ecosystem-id`: Your ecosystem ID -- `x-ecosystem-partner-id`: Your ecosystem partner ID -- `x-secret-key`: Your secret key for authentication -- `Content-Type`: Must be set to `application/json` - -## Example curl Command - -Here's an example curl command to pregenerate an embedded wallet: - -```bash -curl -X POST 'https://embedded-wallet.thirdweb.com/api/v1/pregenerate' \ - -H 'x-ecosystem-id: ecosystem.example-eco-123' \ - -H 'x-ecosystem-partner-id: 1415d24e-c7b0-4fce-846e-740841ef2c32' \ - -H 'x-secret-key: 9f8e7d6c5b4a3f2e1d0c9b8a7ffge434b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7' \ - -H 'Content-Type: application/json' \ - -d '{ - "strategy": "email", - "email": "user@example.com" - }' -``` - -Replace the header values with your actual client ID, ecosystem ID, and secret key. - -## Response Format - -The API returns a JSON object. The exact structure may vary based on the implementation, but it typically includes information about the pregenerated wallet. Here's a possible structure: - -```json -{ - "wallet": { - "address": "string", - "createdAt": "string", - } -} -``` - -Note: The actual response may include additional fields or have a different structure. Please refer to the most up-to-date documentation for the exact response format. - -Remember to handle the response appropriately in your chosen programming language, including error cases and parsing the JSON response. diff --git a/apps/portal/src/app/connect/ecosystems/security/page.mdx b/apps/portal/src/app/connect/ecosystems/security/page.mdx deleted file mode 100644 index 82c717f1117..00000000000 --- a/apps/portal/src/app/connect/ecosystems/security/page.mdx +++ /dev/null @@ -1,52 +0,0 @@ -import { DocImage, Callout, createMetadata } from "@doc"; - -export const metadata = createMetadata({ - image: { - title: "Ecosystem Wallet Security", - icon: "wallets", - }, - title: "Ecosystem Wallet Security", - description: - "Learn how thirdweb protects your user's private keys across an ecosystem using nitro Enclaves", -}); - -# Ecosystem Wallet Security - -## Wallet Creation - -When a user signs into an application using their email or social logins for the first time, a wallet is generated within a secure enclave on the server after verifying the user's legitimacy. The enclave provides a trusted execution environment, ensuring the wallet creation process is isolated and protected from external interference. - -- The wallet and its corresponding private key are generated entirely within the enclave, never leaving its secure confines. -- User authentication data is verified within the enclave, ensuring that only legitimate, authenticated users can initiate wallet creation. - -## Security Measures - -- The enclave's cryptographic properties ensure that even the server operators cannot access the contents or operations within the enclave. -- The enclave provides a verifiable hash of the image of the code that is being run on the device, allowing anyone to verify the contents of the code. -- The wallet's private key never exists in an unencrypted form outside of the enclave. -- All sensitive operations, such as transaction signing, occur within the enclave, ensuring the wallet's security. - -## Wallet Usage - -### General Usage - -- When users interact with their wallet via the the enclave, all communications are encrypted and only the legitimate user can access their wallet. -- All traffic is encrypted with TLS and HSTS. Services are run in private VPCs on AWS and accessible only from a single entry point via our Cloudflare DNS. -- Applications can [link multiple authentication methods](/connect/in-app-wallet/guides/link-multiple-profiles) to the same enclave. Any of these methods can be used to authenticate into the users wallet. - -### Ecosystem Usage - -- Ecosystem wallets are controlled by the ecosystem owner. - - We moved away from the shamir secret sharing model and replaced it with Encalves. This ensures no-one can extract the private key from the client, including other developers in the ecosystem. - - With enclave and partner policies, ecosystem owners are able to place restrictions on what individual partners are able to do. Since the private key is never re-constructed on the client, the ecosystem partner must submit the request to the enclave which would be able to verify the request and block requests that are out of scope or denied by the ecosystem owner. - -## Recoverability - -- Users can export their private key at any time. -- Thirdweb wallets support three categories of authentication: socials, custom authentication, and email / phone authentication. If a user ever loses access to their authentication method: - - 1. **For socials and email / phone authentication,** users can utilize the recovery flow of their providers to regain access to their account. - 2. **In the case of custom authentication,** the developer managing their authentication flow will be able to re-instate the users account upon successful verification. - 3. Application providers **do not have direct access** to user accounts or private keys, as these remain secured within the enclave. The enclave's design ensures that only verified user requests can trigger wallet operations. - -- Users are able to link their authentication methods which will provide them multiple ways to access their account if they ever lose access to any one of their authentication method. diff --git a/apps/portal/src/app/connect/in-app-wallet/faqs/page.mdx b/apps/portal/src/app/connect/in-app-wallet/faqs/page.mdx deleted file mode 100644 index 5b9c5b951c8..00000000000 --- a/apps/portal/src/app/connect/in-app-wallet/faqs/page.mdx +++ /dev/null @@ -1,94 +0,0 @@ -import { createMetadata } from "@doc"; - -export const metadata = createMetadata({ - title: "FAQs for In-App Wallet", - description: "Frequently asked questions about thirdweb's In-App Wallet", - image: { - title: "FAQs for In-App Wallet", - icon: "wallets", - }, -}); - -# General FAQs - -### Which blockchains are supported? - -Our thirdweb In-App Wallet is fully EVM compatible and supports all EVM chains. - -### Do I need to build separate flows for in-app wallets and external wallets (e.g. MetaMask)? - -No! Since our SDK provides the wallet `signer`, you can build a unified experience with the same code to handle how all your users' wallets interact with signatures and smart contracts. - -However, you will need to provide a separate flow to create in-app wallets as you would with any wallet provider (WalletConnect, Coinbase Wallet, etc.). - -### How do I troubleshoot unexpected console error messages? - -Make sure that you are developing on a [secure origin](https://www.chromium.org/Home/chromium-security/prefer-secure-origins-for-powerful-new-features/), which includes `localhost` and any site on `https://`. thirdweb uses cryptography libraries that are unsupported on `http://`. - -If you continue to run into a console error, please contact us with more details. - -### What is thirdweb's ability to scale? - -thirdweb can create up to 100 wallets/second by default and can support higher limits (up to 3,000 wallets/second) upon request. - -### Where can users see assets in their in-app wallet? - -Users can login to their in-app wallet at https://ews.thirdweb.com/wallet and see the assets held in it. - -### How do users connect to their in-app wallet in a third-party app? - -Users can access it by choosing the thirdweb option in WalletConnect. They will have to choose which "app wallet" they want to connect to the app - -### What login options does thirdweb support? - -We support Google, Apple, Facebook and email out of the box, and in-app wallets can be configured to work with any Open ID Compatible authentication service. We will be adding out of the box support for more social login options soon. - -### How is pricing calculated for in-app wallets? - -In-app wallets are billed based on "monthly active wallets". An active wallet is defined as a wallet where a user logs in during the billing period. In-app wallets are completely free up to 1,000 monthly active wallets, and $0.02 per wallet after that. - -### Do you support gasless transactions? - -Yes, you can easily use account abstraction with in-app wallets to enable sponsored (gasless) transactions. - -### Is there a way to display the logged-in email address in the Connect component, similar to the wallet address? - -Yes, we show the email by default in the details modal after you connect. To display the email anywhere else using React or React Native, [check out the code snippets for all platforms](/connect/in-app-wallet/how-to/interact-with-wallets#get-the-user-email). - -### Does the In-App Wallet product use smart contract wallets? - -The in-app wallet can be used as a signer to a smart contract account (account abstraction), but it can also be used as a standalone EOA. - -### What happens if thirdweb ceases to exist? Will my users be able to access their wallets? - -In the event that thirdweb ceases to exist, we have committed to keeping our in-app wallet service running for a period of at least 12 months after the shutdown announcement. During this time users will be able to access their wallet and transfer their assets out, or export their private key which they can then import into a different client. - -# Custom JWT Auth FAQs - -### Can I use my own Auth service with In-App Wallets? - -Yes, you have the option to use your own Auth provider with the thirdweb In-App Wallet. For instructions on how to log in using your custom authentication, refer to our [Bring your own authentication with Custom JWT](https://docs.withpaper.com/reference/authenticate-a-user#bring-your-own-authentication-with-custom-jwt-advanced) guide. - -### For a user who creates a wallet via the JWT method, can they recover their account via thirdweb? - -The user can still recover by authenticating via your application and then using the password that was sent to them to gain access to the wallet on a new device. thirdweb doesn't have access to the authentication mechanism and would only be able to provide the user access to their wallet if they are already on a device that has the wallet share saved. - -### Who retains custody over wallets created with custom JWT? - -The user has custody of the wallet because (a) thirdweb does not have enough shares to access the wallet. After all, we do not know the password sent to the user to decrypt one of the shares, (b) your app has the auth mechanism, but auth by itself is not enough to access the underlying wallet. - -### How will my users recover their accounts in case they lose access to their auth? - -Currently, users will rely on the built-in recovery of their auth method. Refer to the [How to recover your Google Account or Gmail](https://support.google.com/accounts/answer/7682439?hl=en) article as an example. - -Soon, developers will be able to toggle on the option for users to add a backup auth method in case the user loses access to their primary auth method & its recovery. - -# Security FAQs - -### How is the private key managed? - -You can learn more about the architecture of how in-app wallets are created and stored [here](/connect/in-app-wallet/how-it-works) - -### What happens if thirdweb or my database gets breached? - -Using Shamir Secret Sharing technology, your customers' assets are safe even if thirdweb or you are compromised. This is because the attacker will only be able to access 1 of the 3 shards, and that is not enough to reconstruct the private key. diff --git a/apps/portal/src/app/connect/in-app-wallet/get-started/page.mdx b/apps/portal/src/app/connect/in-app-wallet/get-started/page.mdx deleted file mode 100644 index f8b28d0e69c..00000000000 --- a/apps/portal/src/app/connect/in-app-wallet/get-started/page.mdx +++ /dev/null @@ -1,131 +0,0 @@ -import { Callout, OpenSourceCard, createMetadata, InstallTabs } from "@doc"; -import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; - -export const metadata = createMetadata({ - image: { - title: "Get started with In-App Wallet", - icon: "wallets", - }, - title: "Get started with In-App Wallet", - description: "Get started with In-App Wallet", -}); - -# QuickStart - -Once set up, your app will be able to connect and create in-app wallets for users. - -## Try the demo - -See In-App Wallets in action with our demo app: - - - -## Starting from a template - -Quickly get started with one of our templates: - - - -## Starting from existing project - -Install the required package: - - - -## Get your client ID - -To use in-app wallets in your applications, you will need a client ID. You can get one for free on [your thirdweb dashboard](https://thirdweb.com/create-api-key). - -## Connecting & Creating In-App Wallets - -Quickest ways to get started with in-app wallets on each platform. - - - - - React - TypeScript - Unity - - - -```tsx -import { ThirdwebProvider, ConnectButton } from "thirdweb/react"; -import { createThirdwebClient } from "thirdweb"; -import { inAppWallet } from "thirdweb/wallets"; - -const client = createThirdwebClient({ clientId }); -const wallets = [inAppWallet()]; - -export default function App() { - return ( - - - - ); -} -``` - - - - - -```tsx -import { inAppWallet } from "thirdweb/wallets"; - -const client = createThirdwebClient({ clientId }); -const wallet = inAppWallet(); -const account = await wallet.connect({ - client, - strategy: "google", // The authentication strategy to use, can be any of the supported strategies (google, facebook, apple, passkey, email, jwt) -}); -``` - - - - - -```c# -using Thirdweb; - -public async void ConnectWallet() -{ - // Reference to your Thirdweb SDK - var sdk = ThirdwebManager.Instance.SDK; - - // Configure the connection - var connection = new WalletConnection( - provider: WalletProvider.InAppWallet, // The wallet provider you want to connect to (Required) - chainId: 1, // The chain you want to connect to (Required) - email: "email@email.com" // The email you want to authenticate with (Required) - ); - - // Connect the wallet - string address = await sdk.wallet.Connect(connection); -} -``` - - - - -For more details and advanced usage, see the reference documentation for each platform. - - - -If you're using the Typescript SDK, the code has to be running in the browser environment due to security reasons. - - diff --git a/apps/portal/src/app/connect/in-app-wallet/guides/get-user-details/page.mdx b/apps/portal/src/app/connect/in-app-wallet/guides/get-user-details/page.mdx deleted file mode 100644 index e259a4b719f..00000000000 --- a/apps/portal/src/app/connect/in-app-wallet/guides/get-user-details/page.mdx +++ /dev/null @@ -1,167 +0,0 @@ -import { Tabs, TabsList, TabsContent, TabsTrigger, DocImage } from "@doc"; - -# Fetching User Details from the Server - -## Using the thirdweb TypeScript SDK - -You can query user details through the thirdweb SDK using a wallet address, email, phone number, or user ID. **This function requires a secret key to be present on the thirdweb client and should only be used on the server.** - - - - Wallet - External Wallet - Email - Phone - User ID - - - -```ts -import { getUser } from "thirdweb"; - -// this is the wallet address that thirdweb has generated for the user -const user = await getUser({ - client, - walletAddress: "0x123...", -}); -``` - - - -```ts -import { getUser } from "thirdweb"; - -// this is the wallet address that the user used to connect via SIWE to their in app wallet -const user = await getUser({ - client, - externalWalletAddress: "0x123...", -}); -``` - - - -```ts -import { getUser } from "thirdweb"; - -const user = await getUser({ - client, - email: "user@example.com", -}); -``` - - - -```ts -import { getUser } from "thirdweb"; - -const user = await getUser({ - client, - phone: "+11234567890", -}); -``` - - - -```ts -import { getUser } from "thirdweb"; - -const user = await getUser({ - client, - id: "1234567890", -}); -``` - - - - -## Fetching User Details via API - -To get the user details, you can make a `GET` request to the following endpoint: - -``` -https://embedded-wallet.thirdweb.com/api/2023-11-30/embedded-wallet/user-details -``` - -### Query Parameters - -You can specify the query parameter `queryBy` to query by different user identifiers: - -- `queryBy`: The parameter to query by. Can be one of `walletAddress`, `email`, `phone`, `externalWalletAddress`, or `id`. - -You can then specify the value to query by, matching the queryBy parameter: - -- `walletAddress`: The user's wallet address that thirdweb has generated for them -- `email`: The user's email address -- `phone`: The user's phone number -- `externalWalletAddress`: The user's wallet address that used to login via SIWE -- `id`: The user's ID (for custom auth) - -### Authentication - -You need to include your ThirdWeb Client Secret in the Authorization header. - -If you are an ecosystem owner, you have to include the `x-ecosystem-id` header and optionally the `x-ecosystem-partner-id` header if the ecosystem is set to partners only. - -### Example curl Command - -Here's an example curl command to fetch user details by email: - -```bash -curl -X GET 'https://embedded-wallet.thirdweb.com/api/2023-11-30/embedded-wallet/user-details?queryBy=email&email=user@example.com' \ - -H 'x-secret-key: YOUR_THIRD_WEB_CLIENT_SECRET' -``` - -Here's an example curl command to fetch user details by address: - -```bash -curl -X GET 'https://embedded-wallet.thirdweb.com/api/2023-11-30/embedded-wallet/user-details?queryBy=walletAddress&walletAddress=0x123456789abcdef' \ - -H 'x-secret-key: YOUR_THIRD_WEB_CLIENT_SECRET' -``` - -Here's an example curl command to fetch the user details for an ecosystem owner: - -```bash -curl -X GET 'https://embedded-wallet.thirdweb.com/api/2023-11-30/embedded-wallet/user-details?queryBy=walletAddress&walletAddress=0x123456789abcdef' \ - -H 'x-secret-key: YOUR_THIRD_WEB_CLIENT_SECRET' \ - -H 'x-ecosystem-id: ecosystem.YOUR_ECOSYSTEM_ID' \ - -H 'x-ecosystem-partner-id: YOUR_PARTNER_ID' -``` - -In both examples, replace `YOUR_THIRD_WEB_CLIENT_SECRET` with your actual ThirdWeb Client Secret. - -Replace `YOUR_ECOSYSTEM_ID` and `YOUR_PARTNER_ID` with your actual ecosystem ID and partner ID respectively. The partner ID can be one you set up for yourself as the ecosystem owner. - -### Response Format - -The API returns a JSON array with the following structure for each user: - -```json -[ - { - "userId": "string", - "walletAddress": "string", - "email": "string (optional)", - "phone": "string (optional)", - "createdAt": "string", - "linkedAccounts": [ - { - "type": "string", - "details": { - "phone": "string", - // or - "email": "string", - // or - "address": "string", - // or - "id": "string", - // Additional key-value pairs may be present - } - } - ] - } -] -``` - -Note: The `details` object in `linkedAccounts` will contain different fields based on the account type. - -Remember to handle the response appropriately in your chosen programming language, including error cases and parsing the JSON response. diff --git a/apps/portal/src/app/connect/in-app-wallet/guides/link-multiple-profiles/page.mdx b/apps/portal/src/app/connect/in-app-wallet/guides/link-multiple-profiles/page.mdx deleted file mode 100644 index d7638408a8c..00000000000 --- a/apps/portal/src/app/connect/in-app-wallet/guides/link-multiple-profiles/page.mdx +++ /dev/null @@ -1,100 +0,0 @@ -import { createMetadata } from "@doc"; - -export const metadata = createMetadata({ - image: { - title: "Linking Mulitple Profiles", - icon: "wallets", - }, - title: "Linking Mulitple Profiles", - description: - "Learn how to associate multiple social profiles with a single wallet address.", -}); - -# Linking Multiple Profiles - -In-App Wallets allow users to tie the same wallet address to multiple social profiles. Developers can programmatically link additional profiles at any point in their user journey. - -## Link a Profile - -```ts -import { inAppWallet, linkProfile } from "thirdweb/wallets"; - -const wallet = inAppWallet(); - -await wallet.connect({ strategy: "google" }); -await linkProfile(wallet, { strategy: "discord" }); -``` - -Both the Google and Discord accounts will now be linked to the same wallet. - -If the Discord account is already linked to this or another wallet, this will throw an error. - -You can retrieve all profiles linked to a wallet using the `getProfiles` method: - -```ts -import { inAppWallet, getProfiles } from "thirdweb/wallets"; - -const wallet = inAppWallet(); -wallet.connect({ strategy: "google" }); - -const profiles = getProfiles(wallet); -``` - -This will return an array of profiles: - -```ts -[ - { - type: "google", - details: { - email: "user@gmail.com", - }, - }, - { - type: "discord", - details: { - email: "user@gmail.com", - }, - }, - { - type: "wallet", - details: { - address: "0xeC...c4", - }, - }, -]; -``` - -## Retrieve Linked Profiles - -You can use the `useProfiles` hook to fetch linked profiles for the current wallet. - -```jsx -import { useProfiles } from "thirdweb/react"; - -const { data: profiles } = useProfiles(); - -console.log("Type:", profiles[0].type); // "discord" -console.log("Email:", profiles[0].details.email); // "john.doe@example.com" -``` - -Note that the `email` field above will differ based on the profile type. We list the expected field below in our list of strategies. - -## List of Strategies - -| Strategy | Type | `details` Field | -| ------------- | ----------------- | --------------- | -| Guest | `"guest"` | `id` | -| Email | `"email"` | `email` | -| Phone | `"phone"` | `phone` | -| Passkey | `"passkey"` | `id` | -| Google | `"google"` | `email` | -| Discord | `"discord"` | `email` | -| Telegram | `"telegram"` | `id` | -| Farcaster | `"farcaster"` | `id` | -| Line | `"line"` | `id` | -| Apple | `"apple"` | `email` | -| Facebook | `"facebook"` | `email` | -| Wallet | `"wallet"` | `address` | -| JWT | `"jwt"` | `id` | -| Auth Endpoint | `"auth_endpoint"` | `id` | diff --git a/apps/portal/src/app/connect/in-app-wallet/guides/retrieve-linked-profiles/page.mdx b/apps/portal/src/app/connect/in-app-wallet/guides/retrieve-linked-profiles/page.mdx deleted file mode 100644 index 686ca740cbc..00000000000 --- a/apps/portal/src/app/connect/in-app-wallet/guides/retrieve-linked-profiles/page.mdx +++ /dev/null @@ -1,45 +0,0 @@ -import { createMetadata } from "@doc"; - -export const metadata = createMetadata({ - image: { - title: "Retrieve Linked Profiles", - icon: "wallets", - }, - title: "Linking Mulitple Profiles", - description: - "Learn how to associate multiple social profiles with a single wallet address.", -}); - -# Retrieving Linked Profiles - -You can use the `useProfiles` hook to fetch linked profiles for the current wallet. - -```jsx -import { useProfiles } from "thirdweb/react"; - -const { data: profiles } = useProfiles(); - -console.log("Type:", profiles[0].type); // "discord" -console.log("Email:", profiles[0].details.email); // "john.doe@example.com" -``` - -Note that the `email` field above will differ based on the profile type. We list the expected field below in our list of strategies. - -## List of Strategies - -| Strategy | Type | `details` Field | -| ------------- | ----------------- | --------------- | -| Guest | `"guest"` | `id` | -| Email | `"email"` | `email` | -| Phone | `"phone"` | `phone` | -| Passkey | `"passkey"` | `id` | -| Google | `"google"` | `email` | -| Discord | `"discord"` | `email` | -| Telegram | `"telegram"` | `id` | -| Farcaster | `"farcaster"` | `id` | -| Line | `"line"` | `id` | -| Apple | `"apple"` | `email` | -| Facebook | `"facebook"` | `email` | -| Wallet | `"wallet"` | `address` | -| JWT | `"jwt"` | `id` | -| Auth Endpoint | `"auth_endpoint"` | `id` | diff --git a/apps/portal/src/app/connect/in-app-wallet/overview/embed-overview.svg b/apps/portal/src/app/connect/in-app-wallet/overview/embed-overview.svg deleted file mode 100644 index 800def88fb0..00000000000 --- a/apps/portal/src/app/connect/in-app-wallet/overview/embed-overview.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/portal/src/app/connect/in-app-wallet/overview/page.mdx b/apps/portal/src/app/connect/in-app-wallet/overview/page.mdx deleted file mode 100644 index 575ea066a7c..00000000000 --- a/apps/portal/src/app/connect/in-app-wallet/overview/page.mdx +++ /dev/null @@ -1,84 +0,0 @@ -import { CatIcon } from "lucide-react"; -import EmbedOverview from "./embed-overview.svg"; -import { Callout, DocImage, createMetadata, FeatureCard, ArticleIconCard } from "@doc"; - -export const metadata = createMetadata({ - image: { - title: "thirdweb In-App Wallet", - icon: "wallets", - }, - title: "In-App Wallet | thirdweb", - description: - "In-app wallets are wallets that get spun up for users when they first come into your app. They are designed to help app developers building web3 apps for mainstream audiences build seamless login experiences", -}); - -# In-App Wallet - -In-app wallets are wallets that get spun up for users when they first come into your app. They are designed to help app developers building web3 apps for mainstream audiences build seamless login experiences. - -Users can login using their email address, social logins (twitter, apple, discord, etc), or any Open ID Compatible authentication service. Once they authenticate they are provisioned a wallet, which they can then use to perform onchain actions like minting NFTs and sending transactions. - - - -## Try the demo - -See In-App Wallets in action with our demo app: - - - -## Features - -
- - - - - - - - - - -
- -## Use cases - -- Creating user wallets without requiring web3/crypto knowledge or downloading an external app. -- Combining in-app wallets with account abstraction allowing users to send transactions e.g. trade and sell NFTs or ERC-20 tokens, gaslessly. -- Allowing users to access their wallets on different devices without additional passwords. -- Enabling users to connect to WalletConnect-compatible web3 apps. _OpenSea, CollabLand, etc._ - -## Pricing - -In-app wallet is free up to 1,000 Monthly Active Wallet and $0.02 per incremental Monthly Active Wallet beyond that. Find more information on the different billing tiers by visiting [thirdweb's pricing page](https://thirdweb.com/pricing). diff --git a/apps/portal/src/app/connect/sidebar.tsx b/apps/portal/src/app/connect/sidebar.tsx index d22bfd4b715..9a21caaab45 100644 --- a/apps/portal/src/app/connect/sidebar.tsx +++ b/apps/portal/src/app/connect/sidebar.tsx @@ -1,23 +1,23 @@ import type { SideBar } from "@/components/Layouts/DocLayout"; import { DotNetIcon, - EcosystemWalletsIcon, PayIcon, ReactIcon, TypeScriptIcon, UnityIcon, WalletsAuthIcon, - WalletsConnectIcon, WalletsInAppIcon, WalletsSmartIcon, } from "@/icons"; import { CodeIcon, ExternalLink, ZapIcon } from "lucide-react"; import { UnrealEngineIcon } from "../../icons/sdks/UnrealEngineIcon"; +// TODO: move the following two slugs to walletSlug with updated docs const connectSlug = "/connect/sign-in"; const inAppSlug = "/connect/in-app-wallet"; + +const walletSlug = "/connect/wallet"; const aAslug = "/connect/account-abstraction"; -const ecosystemSlug = "/connect/ecosystems"; const authSlug = "/connect/auth"; const paySlug = "/connect/pay"; @@ -49,260 +49,139 @@ export const sidebar: SideBar = { icon: , }, { separator: true }, - { - name: "Get Started", - isCollapsible: false, - links: [ - { - name: "TypeScript", - href: "/typescript/v5", - icon: , - }, - { - name: "React", - href: "/react/v5", - icon: , - }, - { - name: "React Native", - href: "/react-native/v5", - icon: , - }, - { - name: "Dotnet", - href: "/dotnet", - icon: , - }, - { - name: "Unity", - href: "/unity", - icon: , - }, - { - name: "Unreal Engine", - href: "/unreal-engine", - icon: , - }, - ], - }, - { separator: true }, { name: "Learn", isCollapsible: false, links: [ - // Connect + // Connect\ { - name: "Sign-In", - icon: , + name: "Wallets", + icon: , links: [ { name: "Overview", - href: `${connectSlug}/overview`, + href: `${walletSlug}/overview`, + }, + { + name: "Security", + href: `${walletSlug}/security`, }, { name: "Get Started", - // expanded: true, - links: [ - { - name: "Connect Button", - href: `${connectSlug}/ConnectButton`, - }, - { - name: "Connect Embed", - href: `${connectSlug}/ConnectEmbed`, - }, - { - name: "Custom UI", - href: `${connectSlug}/Custom-UI`, - }, - ], + href: `${walletSlug}/get-started`, + }, + + { + name: "Pregenerate Wallets", + href: `${walletSlug}/pregenerate-wallets`, }, { name: "Sign-In Methods", links: [ { - name: "Email & Phone", - href: `${connectSlug}/methods/email-and-phone`, + name: "Configure", + href: `${walletSlug}/sign-in-methods/configure`, }, { - name: "Social Login", - href: `${connectSlug}/methods/social-logins`, + name: "Guest Mode", + href: `${walletSlug}/sign-in-methods/guest`, }, { name: "External Wallets", - href: `${connectSlug}/methods/external-wallets`, + href: `${walletSlug}/sign-in-methods/external-wallets`, }, { - name: "Guest Mode", - href: `${connectSlug}/methods/guest-mode`, + name: "Custom Authentication", + links: [ + { + name: "Overview", + href: `${inAppSlug}/custom-auth/overview`, + }, + { + name: "Configuration", + href: `${inAppSlug}/custom-auth/configuration`, + }, + { + name: "Integration guides", + links: [ + { + name: "Custom auth server (OIDC Auth)", + href: `${inAppSlug}/custom-auth/custom-jwt-auth-server`, + }, + { + name: "Custom auth server (Generic Auth)", + href: `${inAppSlug}/custom-auth/custom-auth-server`, + }, + { + name: "Firebase Auth", + href: `${inAppSlug}/custom-auth/firebase-auth`, + }, + ], + }, + ], }, ], }, + { - name: "Customization", + name: "User Management", links: [ { - name: "Logo", - href: `${connectSlug}/customization#logo`, - }, - { - name: "Compact Modal", - href: `${connectSlug}/customization#compact-modal`, + name: "Get User Profiles", + href: `${walletSlug}/user-management/get-user-profiles`, }, { - name: "Theme", - href: `${connectSlug}/customization#theming`, + name: "Export Private Keys", + href: `${walletSlug}/user-management/export-private-key`, }, { - name: "Localization", - href: `${connectSlug}/customization#localization`, + name: "Link Multiple Identity", + href: `${walletSlug}/user-management/link-multiple-identity`, }, + // TODO: + // { + // name: "Deleting User Details", + // href: `${walletSlug}/user-management/deleting-user-details`, + // }, ], }, { - name: "Playground", - href: "https://playground.thirdweb.com/connect/sign-in/button", - }, - ], - }, - - //In-App Wallets - { - name: "In-App Wallet", - icon: , - links: [ - { - name: "Overview", - href: `${inAppSlug}/overview`, - }, - { - name: "Security", - href: `${inAppSlug}/security`, - }, - { - name: "Get Started", + name: "Customization", links: [ { - name: "TypeScript", - href: "/typescript/v5/inAppWallet", - icon: , - }, - { - name: "React", - href: "/react/v5/in-app-wallet/get-started", - icon: , - }, - { - name: "React Native", - // TODO - add react-native dedicated page - href: "/react/v5/in-app-wallet/get-started", - icon: , - }, - { - name: "Dotnet", - href: "/dotnet/wallets/providers/in-app-wallet", - icon: , - }, - { - name: "Unity", - href: "/unity/wallets/providers/in-app-wallet", - icon: , + name: "Prebuilt UI", + href: `${connectSlug}/customization`, }, + // { + // name: "Emails and SMS", + // href: `${connectSlug}/customization#compact-modal`, + // }, ], }, { - name: "Guides", + name: "Ecosystem", links: [ { - name: "Export Private Keys", - href: `${inAppSlug}/guides/export-private-key`, + name: "Set-up", + href: `${walletSlug}/ecosystem/set-up`, }, { - name: "Link Multiple Profiles", - href: `${inAppSlug}/guides/link-multiple-profiles`, + name: "Ecosystem Portal", + href: `${walletSlug}/ecosystem/portal`, }, { - name: "Retrieving Linked Profiles", - href: `${inAppSlug}/guides/retrieve-linked-profiles`, + name: "Managing Ecosystem Permissions", + href: `${walletSlug}/ecosystem/permissions`, }, - ], - }, - { - name: "Custom Authentication", - links: [ { - name: "Overview", - href: `${inAppSlug}/custom-auth/overview`, - }, - { - name: "Configuration", - href: `${inAppSlug}/custom-auth/configuration`, - }, - { - name: "Integration guides", - links: [ - { - name: "Custom auth server (OIDC Auth)", - href: `${inAppSlug}/custom-auth/custom-jwt-auth-server`, - }, - { - name: "Custom auth server (Generic Auth)", - href: `${inAppSlug}/custom-auth/custom-auth-server`, - }, - { - name: "Firebase Auth", - href: `${inAppSlug}/custom-auth/firebase-auth`, - }, - ], + name: "Integrating with Partners", + href: `${walletSlug}/ecosystem/integrating-partners`, }, ], }, - { - name: "Backend APIs", - href: `${inAppSlug}/guides/get-user-details`, - }, - { - name: "FAQs", - href: `${inAppSlug}/faqs`, - }, - ], - }, - // Ecosystem Wallet - { - name: "Ecosystem Wallets", - icon: , - links: [ - { - name: "Overview", - href: `${ecosystemSlug}/overview`, - }, - { - name: "Security", - href: `${ecosystemSlug}/security`, - }, - { - name: "Get Started", - href: `${ecosystemSlug}/get-started`, - }, - { - name: "Managing Ecosystem Permissions", - href: `${ecosystemSlug}/ecosystem-permissions`, - }, - { - name: "Integrating with Partners", - href: `${ecosystemSlug}/integrating-partners`, - }, - { - name: "Pregenerate Wallets", - href: `${ecosystemSlug}/pregenerate-wallets`, - }, - { - name: "Ecosystem Wallet Explorer Page", - href: `${ecosystemSlug}/wallet-explorer`, - }, { name: "FAQ", - href: `${ecosystemSlug}/faq`, + href: `${walletSlug}/faq`, }, ], }, @@ -566,5 +445,42 @@ export const sidebar: SideBar = { }, ], }, + { separator: true }, + { + name: "Platform API References", + isCollapsible: false, + links: [ + { + name: "TypeScript", + href: "/typescript/v5", + icon: , + }, + { + name: "React", + href: "/react/v5", + icon: , + }, + { + name: "React Native", + href: "/react-native/v5", + icon: , + }, + { + name: "Dotnet", + href: "/dotnet", + icon: , + }, + { + name: "Unity", + href: "/unity", + icon: , + }, + { + name: "Unreal Engine", + href: "/unreal-engine", + icon: , + }, + ], + }, ], }; diff --git a/apps/portal/src/app/connect/sign-in/ConnectButton/page.mdx b/apps/portal/src/app/connect/sign-in/ConnectButton/page.mdx deleted file mode 100644 index 6801961d0de..00000000000 --- a/apps/portal/src/app/connect/sign-in/ConnectButton/page.mdx +++ /dev/null @@ -1,136 +0,0 @@ -import { SDKCard, Grid, DocImage, createMetadata, Step, Steps, InstallTabs, OpenSourceCard } from "@doc"; -import connectModal from "../assets/connect-image-new.svg"; -import { UnityIcon, ReactIcon } from "@/icons"; - -export const metadata = createMetadata({ - image: { - title: "ConnectButton", - icon: "react", - }, - title: "thirdweb ConnectButton", - description: - "ConnectButton is available in React, React Native as a component and in Unity as a prefab", -}); - -# ConnectButton - -The `ConnectButton` component unlocks all of thirdweb’s login, onboarding, and blockchain interaction capabilities via a customizable and secure interface. - - - -When logged out, the `ConnectButton` offers users secure login methods with email, phone, socials, and external wallets. When logged in, the ConnectButton enables users to send and receive funds to their account, purchase crypto with onramps, and execute transactions within your application. - - - -## Get started - -### Automatic Setup - -Starter templates are pre-configured with `ConnectButton` to help you get started quickly. - -In your CLI, run: - -```bash -npx thirdweb create --app -``` - -Select a framework: Next, Vite, or Expo. The command will create a new directory with starter code and the necessary dependencies installed. - -### Manual Setup - - - -Install the Connect SDK - - - - - -On the thirdweb dashboard, Create a new Project to obtain a Client Id. - - - -In your application, initialize and add the `ConnectButton` component by passing in your Client Id. - -```ts -import { createThirdwebClient } from "thirdweb"; - -import { ThirdwebProvider, ConnectButton } from "thirdweb/react"; - -const client = createThirdwebClient({ clientId: your_client_id }); - -export default function App() { - return ( - - - - ); -} -``` - - - - -Configure the `wallets` property to enable various login options such as email & phone number, socials, and EOAs such as MetaMask or Phantom. - -```ts -import { ConnectButton } from "thirdweb/react"; -import { createWallet, inAppWallet } from "thirdweb/wallets"; - -const wallets = [ - inAppWallet(), - createWallet("io.metamask"), - createWallet("com.coinbase.wallet"), - createWallet("me.rainbow"), -]; - -export default function App() { - return ( - - - - ); -} - -``` - -[View full list of support wallets.]() - - - -Use the default light and dark theme or override the default theme to customize the appearance of the modal. - -```ts -import { ConnectButton } from "thirdweb/react"; -import { lightTheme } from "thirdweb/react"; - -const customTheme = lightTheme({ - colors: { - modalBg: "red", - }, -}); - -export default function App() { - return ( - - - - ); -} -``` - -[View full theme properties.](https://portal.thirdweb.com/references/typescript/v5/Theme) - - - -To fully customize and learn more about the `ConnectButton` properties, [view the full reference](https://portal.thirdweb.com/references/typescript/v5/ConnectButtonProps). - diff --git a/apps/portal/src/app/connect/sign-in/ConnectEmbed/page.mdx b/apps/portal/src/app/connect/sign-in/ConnectEmbed/page.mdx deleted file mode 100644 index 07298811e58..00000000000 --- a/apps/portal/src/app/connect/sign-in/ConnectEmbed/page.mdx +++ /dev/null @@ -1,119 +0,0 @@ -import { SDKCard, Grid, DocImage, createMetadata, Step, Steps, InstallTabs, OpenSourceCard } from "@doc"; -import connectHeroImage from "../assets/ConnectEmbed-embedded.png"; -import connectModal from "../assets/connect-image-new.svg"; - -export const metadata = createMetadata({ - image: { - title: "ConnectEmbed", - icon: "react", - }, - title: "thirdweb ConnectEmbed", - description: - "ConnectEmbed component renders a UI to connect to various wallets", -}); - - -# ConnectEmbed - -The `ConnectEmbed` component renders the same modal interface as `ConnectEmbed`, enabling a sign-in flow without an overlay. This method is more helpful in implementing full-page sign-in flows. - - - - -## Get started - - - -Install the Connect SDK - - - - - -On the thirdweb dashboard, [create a project](https://thirdweb.com/team/~/~/projects) to obtain a Client Id. - - - -In your application, initialize and add the `ConnectEmbed` component by passing in your Client Id. - -```ts -import { ThirdwebProvider, ConnectEmbed } from "thirdweb/react"; - -const client = createThirdwebClient({ clientId: your_client_id }); - -export default function App() { - return ( - - - - ); -} -``` - - - - -Configure the `wallets` property to enable various login options such as email & phone number, socials, and EOAs such as MetaMask or Phantom. - -```ts -import { ConnectEmbed } from "thirdweb/react"; -import { createWallet, inAppWallet } from "thirdweb/wallets"; - -const wallets = [ - inAppWallet(), - createWallet("io.metamask"), - createWallet("com.coinbase.wallet"), - createWallet("me.rainbow"), -]; - -export default function App() { - return ( - - - - ); -} - -``` - -[View full list of support wallets.]() - - - -Use the default light and dark theme or override the default theme to customize the appearance of the modal. - -```ts -import { ConnectEmbed } from "thirdweb/react"; -import { lightTheme } from "thirdweb/react"; - -const customTheme = lightTheme({ - colors: { - modalBg: "red", - }, -}); - -export default function App() { - return ( - - - - ); -} -``` - -[View full theme properties.](https://portal.thirdweb.com/references/typescript/v5/Theme) - - - - -To fully customize and learn more about the `ConnectEmbed` properties, [view the full reference](https://portal.thirdweb.com/references/typescript/v5/ConnectEmbedProps). - \ No newline at end of file diff --git a/apps/portal/src/app/connect/sign-in/Custom-UI/page.mdx b/apps/portal/src/app/connect/sign-in/Custom-UI/page.mdx deleted file mode 100644 index fc67f42f03b..00000000000 --- a/apps/portal/src/app/connect/sign-in/Custom-UI/page.mdx +++ /dev/null @@ -1,108 +0,0 @@ -import { SDKCard, Grid, DocImage, createMetadata, Step, Steps, InstallTabs, OpenSourceCard } from "@doc"; -import connectHeroImage from "../assets/ConnectEmbed-embedded.png"; -import connectModal from "../assets/connect-image-new.svg"; - -export const metadata = createMetadata({ - image: { - title: "ConnectEmbed", - icon: "react", - }, - title: "thirdweb ConnectEmbed", - description: - "ConnectEmbed component renders a UI to connect to various wallets", -}); - - -# Custom UI - -For custom sign-in pages or interfaces, we recommend creating a UI using the `useConnect` hook. - - -## Get started - - - -Install the Connect SDK - - - - - -On the [thirdweb dashboard](https://thirdweb.com/team/~/~/projects), navigate to Team > Projects > Create New > Project to obtain a Client Id. - - - - -```ts -import { createThirdwebClient } from "thirdweb"; -import { useConnect } from "thirdweb/react"; -import { createWallet, injectedProvider } from "thirdweb/wallets"; - -const client = createThirdwebClient({ clientId }); - -function Example() { - return ( - - ); -} -``` - - - - -Create an asynchronous function which prompts users to connect with installed MetaMask. If MetaMask is not installed, prompt the user with the Wallet Connect modal to allow users to scan and connect via QR code. - -```ts -import { createThirdwebClient } from "thirdweb"; -import { useConnect } from "thirdweb/react"; -import { createWallet, injectedProvider } from "thirdweb/wallets"; - -const client = createThirdwebClient({ clientId }); - -function Example() { - const { connect, isConnecting, error } = useConnect(); - return ( - - ); -} -``` - - - -To fully customize and learn more about the `useConnect` properties, [view the full reference](https://portal.thirdweb.com/references/typescript/v5/useConnect). - \ No newline at end of file diff --git a/apps/portal/src/app/connect/sign-in/methods/email-and-phone/page.mdx b/apps/portal/src/app/connect/sign-in/methods/email-and-phone/page.mdx deleted file mode 100644 index 33c930a038f..00000000000 --- a/apps/portal/src/app/connect/sign-in/methods/email-and-phone/page.mdx +++ /dev/null @@ -1,51 +0,0 @@ -import { - SDKCard, - Grid, - DocImage, - createMetadata, - Step, - Steps, - InstallTabs, - OpenSourceCard, - Callout, -} from "@doc"; - -# Email & Phone Number Sign-In - -Users can sign in through Connect via a one-time password sent to their email or SMS. - -For both OTP login methods, thirdweb generates a non-custodial in-app wallet within your application. In-app wallets enable your users to interact with your application, as well as store tokens and assets they receive while interacting with your application. - -## Add in-app wallet - -To add phone and email sign-in options, pass `inAppWallet` to the `wallets` array. - -```tsx -import { ThirdwebProvider, ConnectButton } from "thirdweb/react"; -import { inAppWallet } from "thirdweb/wallets"; - -const client = createThirdwebClient({ clientId: your_client_id }); - -const wallets = [ - inAppWallet({ - providers: ["email", "phone"], - }), -]; - -export default function App() { - return ( - - - - ); -} -``` - - - By default, email login is displayed before phone number login. To display - phone number first, add "phone" before "email" in the providers array - - -## Interacting with your App - -Once a user is signed in and their wallet is generated, use the **[Wallet Connection hooks](/references/typescript/v5/hooks#wallet-connection)** to get information about the connected wallet such as the wallet address, account, and more. diff --git a/apps/portal/src/app/connect/sign-in/methods/external-wallets/page.mdx b/apps/portal/src/app/connect/sign-in/methods/external-wallets/page.mdx deleted file mode 100644 index 482b36a4cad..00000000000 --- a/apps/portal/src/app/connect/sign-in/methods/external-wallets/page.mdx +++ /dev/null @@ -1,26 +0,0 @@ -# External wallets - -thirdweb supports a number of first-party web3 wallets such as Metamask and Phantom. - -## Add externally owned wallets - -```tsx -import { ConnectButton } from "thirdweb/react"; -import { createWallet } from "thirdweb/wallets"; - -const wallets = [ - createWallet("io.metamask"), - createWallet("com.coinbase.wallet"), - createWallet("me.rainbow"), -]; - -function Example() { - return ( -
- -
- ); -} -``` - -[View full list of supported wallets.](/typescript/v5/supported-wallets) \ No newline at end of file diff --git a/apps/portal/src/app/connect/sign-in/methods/guest-mode/page.mdx b/apps/portal/src/app/connect/sign-in/methods/guest-mode/page.mdx deleted file mode 100644 index 8beaf4d819a..00000000000 --- a/apps/portal/src/app/connect/sign-in/methods/guest-mode/page.mdx +++ /dev/null @@ -1,58 +0,0 @@ -import { createMetadata } from "@doc"; - -export const metadata = createMetadata({ - image: { - title: "Guest Mode", - icon: "wallets", - }, - title: "Guest Mode", - description: - "Learn how to get users started in your app without requiring sign-in.", -}); - -# Guest Mode - -Sometimes users want to get started using your app without signing in. You can now give users an in-memory "guest account" that can then be converted into a standard account by linking another auth method. - -## With `inAppWallet` - -```tsx -import { inAppWallet } from "thirdweb/wallets"; - -const wallet = inAppWallet(); - -// Create the temporary guest account -const account = await wallet.connect({ - client, - strategy: "guest", -}); -``` - -When your user is ready, [link any other auth method](/connect/in-app-wallet/guides/link-multiple-profiles) so they can access their account in the future. - -```tsx -import { linkProfile } from "thirdweb/wallets"; - -await linkProfile(wallet, { strategy: "google" }); -``` - -Your user can now access this same wallet with their Google account. Until the user links another profile to the wallet, it will be stored in memory and last until they clear their browser cookies or connect a different wallet. - -## With `ConnectButton` - -```tsx -import { ConnectButton } from "thirdweb/react"; -import { inAppWallet } from "thirdweb/wallets"; - -; -``` - -You can try out Guest Mode [on our playground.](https://playground.thirdweb.com/connect/sign-in/button) diff --git a/apps/portal/src/app/connect/sign-in/methods/social-logins/page.mdx b/apps/portal/src/app/connect/sign-in/methods/social-logins/page.mdx deleted file mode 100644 index 8b6613a9873..00000000000 --- a/apps/portal/src/app/connect/sign-in/methods/social-logins/page.mdx +++ /dev/null @@ -1,32 +0,0 @@ -# Social Logins - -thirdweb uses the [OAuth 2.0 Protocol](https://oauth.net/2/) to enable social login. By default, the connect UI supports Google, Apple, Facebook. - -For all social login methods, thirdweb generates a non-custodial [in-app wallet](https://www.notion.so/Overview-1f9cf61712be4c1788c25bc3457f6523?pvs=21) behind the scenes within your application. In-app wallets enable your users to interact with your application, as well as store tokens and assets they receive while interacting with your application. - -## Add Social Login options - -```tsx -import { ThirdwebProvider, ConnectButton } from "thirdweb/react"; -import { inAppWallet } from "thirdweb/wallets"; - -const client = createThirdwebClient({ clientId: your_client_id }); - -const wallets = [ - inAppWallet({ - providers: ["facebook", "apple", "google"], - }), -]; - -export default function App() { - return ( - - - - ); -} -``` - -## Interacting with your App - -Once a user signed in and their wallet is generated, you can use the **[Wallet Connection hooks](https://portal.thirdweb.com/references/typescript/v5/hooks#wallet-connection)** to get information about the connected wallet like getting the address, account, and more. diff --git a/apps/portal/src/app/connect/sign-in/overview/page.mdx b/apps/portal/src/app/connect/sign-in/overview/page.mdx deleted file mode 100644 index 618c5c6ce20..00000000000 --- a/apps/portal/src/app/connect/sign-in/overview/page.mdx +++ /dev/null @@ -1,72 +0,0 @@ -import { Callout, DocImage, createMetadata, FeatureCard } from "@doc"; -import connectModal from "../assets/connect-image-new.svg"; -import customModal from "../assets/custom-modals.png"; -import connectPlayground from "../assets/connect-playground.png"; - -export const metadata = createMetadata({ - image: { - title: "thirdweb Connect", - icon: "wallets", - }, - title: "thirdweb Sign-In", - description: - "thirdweb Connect is a comprehensive toolkit for connecting end-user wallets to applications and games.", -}); - -# Overview - -A flexible sign-up flow that accommodates different preferences is critical when onboarding users. - -Whether users prefer to sign up with their email, phone number, social media accounts or directly with a wallet, providing the options that fit their needs ensures a smoother, more user-friendly onboarding process that increases conversion. - - - -### Features - -
- - - - - - - - - -
- - - -### Integration Options - -| OPTION | BEST FOR | -| ---------------------------------------------------- | ---------------------------------------------------------------------- | -| [ConnectButton](/connect/sign-in/ConnectButton) | Developers who want an easy-to-integrate button with modal. | -| [ConnectEmbed](/connect/sign-in/ConnectEmbed) | Developers who want an easy-to-integrate full sign-in page experience. | -| [Custom UI (useConnect)](/connect/sign-in/Custom-UI) | Developers who want complete customization over the modal branding. | diff --git a/apps/portal/src/app/connect/wallet/ecosystem/assets/add-partner.png b/apps/portal/src/app/connect/wallet/ecosystem/assets/add-partner.png new file mode 100644 index 00000000000..c80914bd64f Binary files /dev/null and b/apps/portal/src/app/connect/wallet/ecosystem/assets/add-partner.png differ diff --git a/apps/portal/src/app/connect/ecosystems/assets/create-ecosystem-wallet.png b/apps/portal/src/app/connect/wallet/ecosystem/assets/create-ecosystem-wallet.png similarity index 100% rename from apps/portal/src/app/connect/ecosystems/assets/create-ecosystem-wallet.png rename to apps/portal/src/app/connect/wallet/ecosystem/assets/create-ecosystem-wallet.png diff --git a/apps/portal/src/app/connect/ecosystems/assets/ecosystem-info.png b/apps/portal/src/app/connect/wallet/ecosystem/assets/ecosystem-info.png similarity index 100% rename from apps/portal/src/app/connect/ecosystems/assets/ecosystem-info.png rename to apps/portal/src/app/connect/wallet/ecosystem/assets/ecosystem-info.png diff --git a/apps/portal/src/app/connect/ecosystems/assets/ecosystem-wallet-permissions.png b/apps/portal/src/app/connect/wallet/ecosystem/assets/ecosystem-wallet-permissions.png similarity index 100% rename from apps/portal/src/app/connect/ecosystems/assets/ecosystem-wallet-permissions.png rename to apps/portal/src/app/connect/wallet/ecosystem/assets/ecosystem-wallet-permissions.png diff --git a/apps/portal/src/app/connect/ecosystems/assets/ecosystem-wallet.png b/apps/portal/src/app/connect/wallet/ecosystem/assets/ecosystem-wallet.png similarity index 100% rename from apps/portal/src/app/connect/ecosystems/assets/ecosystem-wallet.png rename to apps/portal/src/app/connect/wallet/ecosystem/assets/ecosystem-wallet.png diff --git a/apps/portal/src/app/connect/ecosystems/assets/full-login-system.png b/apps/portal/src/app/connect/wallet/ecosystem/assets/full-login-system.png similarity index 100% rename from apps/portal/src/app/connect/ecosystems/assets/full-login-system.png rename to apps/portal/src/app/connect/wallet/ecosystem/assets/full-login-system.png diff --git a/apps/portal/src/app/connect/ecosystems/assets/single-login-option.png b/apps/portal/src/app/connect/wallet/ecosystem/assets/single-login-option.png similarity index 100% rename from apps/portal/src/app/connect/ecosystems/assets/single-login-option.png rename to apps/portal/src/app/connect/wallet/ecosystem/assets/single-login-option.png diff --git a/apps/portal/src/app/connect/ecosystems/assets/wallet-explorer.png b/apps/portal/src/app/connect/wallet/ecosystem/assets/wallet-explorer.png similarity index 100% rename from apps/portal/src/app/connect/ecosystems/assets/wallet-explorer.png rename to apps/portal/src/app/connect/wallet/ecosystem/assets/wallet-explorer.png diff --git a/apps/portal/src/app/connect/ecosystems/assets/xai-connect-wallet-explorer.png b/apps/portal/src/app/connect/wallet/ecosystem/assets/xai-connect-wallet-explorer.png similarity index 100% rename from apps/portal/src/app/connect/ecosystems/assets/xai-connect-wallet-explorer.png rename to apps/portal/src/app/connect/wallet/ecosystem/assets/xai-connect-wallet-explorer.png diff --git a/apps/portal/src/app/connect/ecosystems/integrating-partners/page.mdx b/apps/portal/src/app/connect/wallet/ecosystem/integrating-partners/page.mdx similarity index 100% rename from apps/portal/src/app/connect/ecosystems/integrating-partners/page.mdx rename to apps/portal/src/app/connect/wallet/ecosystem/integrating-partners/page.mdx diff --git a/apps/portal/src/app/connect/ecosystems/ecosystem-permissions/page.mdx b/apps/portal/src/app/connect/wallet/ecosystem/permissions/page.mdx similarity index 70% rename from apps/portal/src/app/connect/ecosystems/ecosystem-permissions/page.mdx rename to apps/portal/src/app/connect/wallet/ecosystem/permissions/page.mdx index 474fe854a7f..1b3ecf8b737 100644 --- a/apps/portal/src/app/connect/ecosystems/ecosystem-permissions/page.mdx +++ b/apps/portal/src/app/connect/wallet/ecosystem/permissions/page.mdx @@ -36,13 +36,3 @@ For each application on your allowlist, you'll need to specify a name, a list of - -**Wallet Signing** - -You will also be able to set wallet signing options for each application in an allowlist. Wallet signing determines how end users interact with an application once logged in. There are two options for wallet signing: - -**Default:** -Wallet signing settings default to signless interactions, meaning developers can sign on behalf of their end users. This is similar to thirdweb's in-app wallet functionality. - -**Prompted:** -Users will be prompted to sign any messages sent by the developer, including approvals and transactions. This is similar with any externally owned account like Metamask. Prompted wallet signatures are useful for safeguarding your ecosystem's end users against unwanted mailicious actors in your ecosystem. diff --git a/apps/portal/src/app/connect/ecosystems/wallet-explorer/page.mdx b/apps/portal/src/app/connect/wallet/ecosystem/portal/page.mdx similarity index 100% rename from apps/portal/src/app/connect/ecosystems/wallet-explorer/page.mdx rename to apps/portal/src/app/connect/wallet/ecosystem/portal/page.mdx diff --git a/apps/portal/src/app/connect/ecosystems/assets/add-partner.png b/apps/portal/src/app/connect/wallet/ecosystem/set-up/assets/add-partner.png similarity index 100% rename from apps/portal/src/app/connect/ecosystems/assets/add-partner.png rename to apps/portal/src/app/connect/wallet/ecosystem/set-up/assets/add-partner.png diff --git a/apps/portal/src/app/connect/wallet/ecosystem/set-up/assets/ecosystem-info.png b/apps/portal/src/app/connect/wallet/ecosystem/set-up/assets/ecosystem-info.png new file mode 100644 index 00000000000..56130fa202c Binary files /dev/null and b/apps/portal/src/app/connect/wallet/ecosystem/set-up/assets/ecosystem-info.png differ diff --git a/apps/portal/src/app/connect/wallet/ecosystem/set-up/assets/ecosystem-wallet-permissions.png b/apps/portal/src/app/connect/wallet/ecosystem/set-up/assets/ecosystem-wallet-permissions.png new file mode 100644 index 00000000000..d116af1d1a3 Binary files /dev/null and b/apps/portal/src/app/connect/wallet/ecosystem/set-up/assets/ecosystem-wallet-permissions.png differ diff --git a/apps/portal/src/app/connect/ecosystems/get-started/page.mdx b/apps/portal/src/app/connect/wallet/ecosystem/set-up/page.mdx similarity index 94% rename from apps/portal/src/app/connect/ecosystems/get-started/page.mdx rename to apps/portal/src/app/connect/wallet/ecosystem/set-up/page.mdx index cce9d6f228f..a32fe36b271 100644 --- a/apps/portal/src/app/connect/ecosystems/get-started/page.mdx +++ b/apps/portal/src/app/connect/wallet/ecosystem/set-up/page.mdx @@ -1,7 +1,7 @@ import { Callout, DocImage, createMetadata, Steps, Step } from "@doc"; -import CreateEcosystemWallet from "../assets/ecosystem-info.png"; -import EcosystemWalletPermissions from "../assets/ecosystem-wallet-permissions.png"; -import AddAPartner from "../assets/add-partner.png"; +import CreateEcosystemWallet from "./assets/ecosystem-info.png"; +import EcosystemWalletPermissions from "./assets/ecosystem-wallet-permissions.png"; +import AddAPartner from "./assets/add-partner.png"; export const metadata = createMetadata({ image: { diff --git a/apps/portal/src/app/connect/wallet/faq/page.mdx b/apps/portal/src/app/connect/wallet/faq/page.mdx new file mode 100644 index 00000000000..7a8b865c34b --- /dev/null +++ b/apps/portal/src/app/connect/wallet/faq/page.mdx @@ -0,0 +1,127 @@ +import { createMetadata } from "@doc"; + +export const metadata = createMetadata({ + title: "FAQ for thirdweb Wallet", + description: "Frequently asked questions about thirdweb's Wallet", + image: { + title: "FAQs for thirdweb Wallet", + icon: "wallets", + }, +}); + +# General FAQs + +### Which blockchains are supported? + +Our thirdweb In-App Wallet is fully EVM compatible and supports all EVM chains. + +### Do I need to build separate flows for in-app wallets and external wallets (e.g. MetaMask)? + +No! Since our SDK provides the wallet `signer`, you can build a unified experience with the same code to handle how all your users' wallets interact with signatures and smart contracts. + +However, you will need to provide a separate flow to create in-app wallets as you would with any wallet provider (WalletConnect, Coinbase Wallet, etc.). + +### How do I troubleshoot unexpected console error messages? + +Make sure that you are developing on a [secure origin](https://www.chromium.org/Home/chromium-security/prefer-secure-origins-for-powerful-new-features/), which includes `localhost` and any site on `https://`. thirdweb uses cryptography libraries that are unsupported on `http://`. + +If you continue to run into a console error, please contact us with more details. + +### What is thirdweb's ability to scale? + +thirdweb can create up to 300 wallets/second by default and can support higher limits (up to 3,000 wallets/second) upon request. + +### What login options does thirdweb support? + +We support a lot of authentication options out of the box. For a full list, check out the [playground](https://playground.thirdweb.com/connect/sign-in/button). We also support custom authentication if you want to integrate thirdweb into your own auth system. + +### Do you support gasless transactions? + +Yes, you can easily use account abstraction with in-app wallets to enable sponsored (gasless) transactions. + +### Does thirdweb Wallets product use smart contract wallets? + +Thirdweb wallets can be used as a signer to a smart contract account (account abstraction), but it can also be used as a standalone EOA. + +### Is there a way to display the logged-in email address in the Connect component, similar to the wallet address? + +Yes, we show the email by default in the details modal after you connect. To display the email anywhere else using React or React Native, [check out the code snippets for all platforms](/connect/in-app-wallet/how-to/interact-with-wallets#get-the-user-email). + +### What happens if thirdweb ceases to exist? Will my users be able to access their wallets? + +In the event that thirdweb ceases to exist, we have committed to keeping our in-app wallet service running for a period of at least 12 months after the shutdown announcement. During this time users will be able to access their wallet and transfer their assets out, or export their private key which they can then import into a different client. + +### How will my users recover their accounts in case they lose access to their auth? + +Currently, users will rely on the built-in recovery of their auth method. Refer to the [How to recover your Google Account or Gmail](https://support.google.com/accounts/answer/7682439?hl=en) article as an example for social and email auths. + +Users can also link their account to a different auth method (e.g. email, phone, or social). All linked methods will be able to be used to access their accounts, providing an alternate recovery method in the case where one is lost. + +# In App Wallet FAQs + +### How do users connect to their in-app wallet in a third-party app? + +Users can access it by doing a manual connection via wallet connect. They will then have to use the connect button or embed and select manage wallet -> connect an App. + +### How is pricing calculated for in-app wallets? + +In-app wallets are billed based on "monthly active wallets". An active wallet is defined as a wallet where a user logs in during the billing period. In-app wallets are completely free up to 1,000 monthly active wallets, and $0.02 per wallet after that. + +# Ecosystem Wallet FAQs + +### What is an Ecosystem Wallet? + +An ecosystem wallet is a managed in-app wallet service that allows you to create a branded wallet and login system, manage your partners, and allow any number of partners to spin up in-app wallets. End users that create in-app wallets through your partner applications (either with email, phone number, passkey, or socials) will receive **one account and wallet address** that they can access across the entire ecosystem. + +### How do Ecosystem Wallets work? + +Ecosystem Wallets are a fully managed and containerized in-app wallet backend service that is white labeled to your application. By giving you access to this backend service, you can power any application with in-app wallets just like thirdweb does for over 70,000 developers. + +### What is an Ecosystem Partner? + +Ecosystem partners are games or applications that you have permissioned to spin up in-app wallets underneath your brand. They will have access to the same account (funds, assets, etc.) for any end users that 1) use your branded login system or 2) log in with your wallet. + +You can manage ecosystem partners in the Permissions tab of your Ecosystem Wallet dashboard. + +### Which login providers can display my Ecosystem Wallet? + +thirdweb Connect, with WalletConnect and any wagmi- or viem-based login providers coming soon. + +### How can Partners integrate my Ecosystem Wallet? + +Partners can integrate your Ecosystem Wallet in three different ways: + +**Login System** + +Partners can install thirdweb SDK and use the Partner ID you created for them to display your branded sign in flow. All login options in this sign in flow will create an in-app wallet. + +**Branded Wallet Connector** + +Partners can add your wallet as a wallet connector option in their existing sign in flow on any domains they've whitelisted by calling the follow endpoint from their application. + +**WalletConnect (Coming Soon)** + +Partners using WalletConnect will automatically display your wallet as a WalletConnect option on any domains they've whitelisted. + +### What is the difference between Anyone and Allowlist scopes for Ecosystem Wallet? + +The **Anyone** scope allows any developer to integrate your ecosystem wallet, even if you have not given them permission. Any developer with thirdweb Connect, for example, would now display your wallet as a login option. + +The **Allowlist** scope allows developers that you have explicitly added to your list of Partners to display your wallet as a login option. + +You can manage scope in the Permissions tab of your Ecosystem Wallet dashboard. + +### How does billing work for Ecosystem Wallets? + +As the ecosystem admin, you will be billed $250 monthly for your Ecosystem Wallet. This allows any application or game in your ecosystem generate in-app wallets. Each month, we allow you and your ecosystem partners to generate 30,000 wallets for free. Once you’ve generated 30,000 wallets, you will be charged $0.02 per in-app wallet. At the end of each month, we will provide you with an invoice with a usage breakdown across all partners. + +# Security FAQs + +### How is the private key managed? + +You can learn more about the architecture of how thirdweb wallets are created and stored [here](/connect/wallet/security) + +### What happens if thirdweb or my database gets breached? + +Using enclave, your customers' assets are safe even if thirdweb or you are compromised. This is because the attacker will only be able to access the encrypted keys, and that is not enough to reconstruct the private key. + diff --git a/apps/portal/src/app/connect/wallet/get-started/page.mdx b/apps/portal/src/app/connect/wallet/get-started/page.mdx new file mode 100644 index 00000000000..cc4231b1f0b --- /dev/null +++ b/apps/portal/src/app/connect/wallet/get-started/page.mdx @@ -0,0 +1,172 @@ +import { Callout, OpenSourceCard, createMetadata, InstallTabs, ArticleIconCard } from "@doc"; +import { + ReactIcon, + TypeScriptIcon, + UnityIcon, + DotNetIcon, + ExternalLinkIcon, + UnrealEngineIcon +} from "@/icons" + +export const metadata = createMetadata({ + image: { + title: "Get started with thirdweb Wallets", + icon: "wallets", + }, + title: "Get started with thirdweb Wallet", + description: "Get started with thirdweb Wallet", +}); + +# Get Started + +thirdweb offers multiple ways to add wallets to your application. Choose the method that best suits your needs: + +1. **External Wallets** - Connect to existing wallets like MetaMask, Coinbase Wallet, etc. +2. **In-App Wallets** - Create wallets with social/email login. +3. **Ecosystem Wallets** - Create wallets with social/email login that is shareable across various aplications. + +These methods can be used independently or together in the same application to provide the best experience for your users. + +## Try the demo + +We have a playground that lets you see all the various options via our prebuilt UI: + + + +## Integrate into existing project + +Install the required package: + + + +## Get your client ID + +To use in-app wallets in your applications, you will need a client ID. You can get one for free on [your thirdweb dashboard](https://thirdweb.com/create-api-key). + +## Connecting & Creating In-App Wallets + +## External Wallets + +Connect to popular external wallets: + +
+ + + + +
+ +## In-App Wallets + +Create in-app wallets with social/email/sms/passkey login via the following guides: + +
+ + + {/* TODO: Link to react native getting started for in appw allet */} + + + + +
+ +## Ecosystem Wallets + +If you're looking to set up an ecosystem from scratch, refer to the [set-up guide](/connect/wallet/ecosystem/set-up) + +If you're looking to integrate ecosystem wallets in your aplication, refer to the following guides: + +
+ + + {/* TODO: Add react native specific getting started for ecosystem wallets */} + + + +
+ diff --git a/apps/portal/src/app/connect/wallet/overview/assets/custom-modals.png b/apps/portal/src/app/connect/wallet/overview/assets/custom-modals.png new file mode 100644 index 00000000000..2966d9e318d Binary files /dev/null and b/apps/portal/src/app/connect/wallet/overview/assets/custom-modals.png differ diff --git a/apps/portal/src/app/connect/wallet/overview/assets/ecosystem-wallet.png b/apps/portal/src/app/connect/wallet/overview/assets/ecosystem-wallet.png new file mode 100644 index 00000000000..c23b246a71a Binary files /dev/null and b/apps/portal/src/app/connect/wallet/overview/assets/ecosystem-wallet.png differ diff --git a/apps/portal/src/app/connect/wallet/overview/page.mdx b/apps/portal/src/app/connect/wallet/overview/page.mdx new file mode 100644 index 00000000000..3474e154e28 --- /dev/null +++ b/apps/portal/src/app/connect/wallet/overview/page.mdx @@ -0,0 +1,97 @@ +import { ArticleIconCard, Callout, DocImage, createMetadata, FeatureCard } from "@doc"; +import { WalletsConnectIcon } from "@/icons" +import customModal from "./assets/custom-modals.png"; +import EcosystemWalletOverview from "./assets/ecosystem-wallet.png"; + +export const metadata = createMetadata({ + image: { + title: "thirdweb Wallets", + icon: "wallets", + }, + title: "thirdweb Wallets | thirdweb", + description: + "thirdweb wallets provide a comprehensive toolkit for connecting users to applications and games. We offer a way to let users sign in however you want. Be it, connecting an external wallet, or creating a seamless login experiences for brand new users, or enabling you to own your web3 identity stack, we have a solution for you.", +}); + +# Overview + +A flexible sign-up flow that accommodates different preferences is critical when onboarding users. thirdweb offers multiple wallet solutions to meet various integration needs: + +1. **External Wallets** - Traditional wallet connection with 350+ providers +2. **In-App Wallet** - Seamless onboarding with email, social, and passkey options +3. **Ecosystem Wallet** - Branded wallet service for cross-application authentication + + + +### Features + +
+ + + + + + + + + + +
+ +### Solutions + +| SOLUTION | BEST FOR | PRICING | +|----------|----------|----------| +| External Wallets | Applications needing traditional EOA wallet integration | Free | +| In-App Wallet | Mainstream applications requiring seamless onboarding | [Free up to 1,000 MAW, then $0.02/MAW](https://thirdweb.com/pricing) | +| Ecosystem Wallet | Organizations building branded wallet networks | [$250/mo](https://thirdweb.com/pricing) | + +### Use Cases + +- **Gaming & Entertainment** - Cross-game accounts and gasless transactions +- **Enterprise & Loyalty** - Custom authentication and user attribution +- **DeFi & NFT** - Traditional wallet connection and fiat on-ramps +- **Chain Ecosystems** - Unified accounts across chain applications + + + + diff --git a/apps/portal/src/app/connect/wallet/pregenerate-wallets/page.mdx b/apps/portal/src/app/connect/wallet/pregenerate-wallets/page.mdx new file mode 100644 index 00000000000..a43b6d6fd23 --- /dev/null +++ b/apps/portal/src/app/connect/wallet/pregenerate-wallets/page.mdx @@ -0,0 +1,125 @@ +import { Callout } from "@doc"; +import { createMetadata, ArticleIconCard } from "@doc"; + +export const metadata = createMetadata({ + image: { + title: "Pregenerate Wallets", + icon: "wallets", + }, + title: "Pregenerate Wallets | thirdweb", + description: "Learn how to pregenerate wallets for improved user onboarding", +}); + +# Pregenerate Wallets + +## What is Wallet Pregeneration? + +Wallet pregeneration is a technique where you create wallets for users before they actually sign up or authenticate. This allows you to: + +1. Pre assign wallets to users before they sign up +2. Reduce the time users spend waiting during the onboarding process +3. Pre-fund wallets with tokens or NFTs before users claim them +4. Create smoother user experiences for gaming and other applications + +## Why Use Wallet Pregeneration? + +### Pre-funding Capability +You can distribute assets to wallets before users claim them, enabling: +- Pre-loaded game assets +- Welcome bonus tokens +- Promotional NFTs +- Airdrops + +### Better User Experience +- Users don't have to wait for wallet to be created during signup +- Reduced failed wallet creation due to network issues + +To pregenerate an in-app or ecosystem wallet wallet, you can make a `POST` request to the following endpoint: + +``` +https://in-app-wallet.thirdweb.com/api/v1/pregenerate +``` + +## Request Body + +The request body should be a JSON object with the following parameters: + +- `strategy`: The strategy for wallet generation +- `email` or `phone` or `userId`: The user identifier associated with the wallet to be generated + +### Email based wallets + +``` +{ strategy: "email", email: "user@example.com" } +``` + +When the user logs in with any method associated with that email (including google, facebook, discord auth), they will get access to the same pregenerated wallet. + +### Phone based wallets + +``` +{ strategy: "phone", phone: "+1321123321" } +``` + +### Custom user id based wallets + +``` +{ strategy: "custom_auth_endpoint", userId: "some_user_id" } +``` + +{/* TODO: update link when custom auth documentation has been updated */} +Use this when [bringing your own authentication method](/connect/in-app-wallet/custom-auth/configuration). When the user logs in, if the user ids you provide from the auth endpoint match, they will get access to the same pregenerated wallet. + +## Headers + +You need to include the following headers: + +- `Content-Type`: Must be set to `application/json` +- `x-secret-key`: Your secret key for authentication +- `x-ecosystem-id` (optional): Your ecosystem ID +- `x-ecosystem-partner-id` (optional): Your ecosystem partner ID + +## Example curl Command + +Here's an example curl command to pregenerate a thirdweb wallet for the user `user@example.com`: + +```bash +curl -X POST 'https://embedded-wallet.thirdweb.com/api/v1/pregenerate' \ + -H 'x-ecosystem-id: ecosystem.example-eco-123' \ + -H 'x-ecosystem-partner-id: 1415d24e-c7b0-4fce-846e-740841ef2c32' \ + -H 'x-secret-key: 9f8e7d6c5b4a3f2e1d0c9b8a7ffge434b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7' \ + -H 'Content-Type: application/json' \ + -d '{ + "strategy": "email", + "email": "user@example.com" + }' +``` + +Replace the header values with your actual client ID, ecosystem ID, and secret key. + + +For ecosystem wallets, the secret key have to be from the same account as the ecosystem owner. If this is an issue, please reach out to us. + + + +## Response Format + +A successful API call returns a JSON object in the following format: + +```json +{ + "wallet": { + "address": "string", + "createdAt": "string", + } +} +``` + + +## What's Next + +Pre-generating is independent and doesn't change the user's experience. + +Your users can continue to login as per usual. When they do, they will be assigned the pregenerated wallet. + +For more information on signing in, see [Sign In](/connect/wallet/sign-in-methods/overview). \ No newline at end of file diff --git a/apps/portal/src/app/connect/in-app-wallet/security/assets/app-scoped.svg b/apps/portal/src/app/connect/wallet/security/assets/app-scoped.svg similarity index 100% rename from apps/portal/src/app/connect/in-app-wallet/security/assets/app-scoped.svg rename to apps/portal/src/app/connect/wallet/security/assets/app-scoped.svg diff --git a/apps/portal/src/app/connect/wallet/security/assets/ecosystem-scoped.svg b/apps/portal/src/app/connect/wallet/security/assets/ecosystem-scoped.svg new file mode 100644 index 00000000000..a82673d9c5d --- /dev/null +++ b/apps/portal/src/app/connect/wallet/security/assets/ecosystem-scoped.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/portal/src/app/connect/in-app-wallet/security/assets/embed-creation.svg b/apps/portal/src/app/connect/wallet/security/assets/embed-creation.svg similarity index 100% rename from apps/portal/src/app/connect/in-app-wallet/security/assets/embed-creation.svg rename to apps/portal/src/app/connect/wallet/security/assets/embed-creation.svg diff --git a/apps/portal/src/app/connect/wallet/security/assets/enclave-wallet-creation.png b/apps/portal/src/app/connect/wallet/security/assets/enclave-wallet-creation.png new file mode 100644 index 00000000000..18e8ae9c5ef Binary files /dev/null and b/apps/portal/src/app/connect/wallet/security/assets/enclave-wallet-creation.png differ diff --git a/apps/portal/src/app/connect/in-app-wallet/security/page.mdx b/apps/portal/src/app/connect/wallet/security/legacy/page.mdx similarity index 97% rename from apps/portal/src/app/connect/in-app-wallet/security/page.mdx rename to apps/portal/src/app/connect/wallet/security/legacy/page.mdx index 291c7f831c7..725e65b4950 100644 --- a/apps/portal/src/app/connect/in-app-wallet/security/page.mdx +++ b/apps/portal/src/app/connect/wallet/security/legacy/page.mdx @@ -1,5 +1,5 @@ -import AppScoped from "./assets/app-scoped.svg"; -import EmbedCreation from "./assets/embed-creation.svg"; +import AppScoped from "../assets/app-scoped.svg"; +import EmbedCreation from "../assets/embed-creation.svg"; import { DocImage, Callout, createMetadata } from "@doc"; export const metadata = createMetadata({ diff --git a/apps/portal/src/app/connect/wallet/security/page.mdx b/apps/portal/src/app/connect/wallet/security/page.mdx new file mode 100644 index 00000000000..b55acb3d5d3 --- /dev/null +++ b/apps/portal/src/app/connect/wallet/security/page.mdx @@ -0,0 +1,104 @@ +import { DocImage, Callout, createMetadata } from "@doc"; +import EnclaveWalletCreation from "./assets/enclave-wallet-creation.png"; +import AppScoped from "./assets/app-scoped.svg"; +import EcosystemScoped from "./assets/ecosystem-scoped.svg"; + +export const metadata = createMetadata({ + image: { + title: "In App wallet and Ecosystem Security", + icon: "wallets", + }, + title: "thirdweb Wallet Security", + description: + "Learn how thirdweb protects your user's private keys across applications using nitro Enclaves", +}); + +# thirdweb Wallet Security + +If you are looking for the previous security documentation around the shamir secret sharing model, please refer to the [In-App Wallet Security](/connect/wallet/security/legacy) page. + +## Wallet Creation + +When a user signs into an application using their email or social logins for the first time, a wallet is generated within a secure enclave on the server after verifying the user's legitimacy. The enclave provides a trusted execution environment, ensuring the wallet creation process is isolated and protected from external interference. + +- The wallet and its corresponding private key are generated entirely within the enclave, never leaving its secure confines. +- User authentication data is verified within the enclave, ensuring that only legitimate, authenticated users can initiate wallet creation. + + + + +## Security Measures + +- The enclave's cryptographic properties ensure that even the server operators cannot access the contents or operations within the enclave. +- The enclave provides a verifiable hash of the image of the code that is being run on the device, allowing anyone to verify the contents of the code. +- The wallet's private key never exists in an unencrypted form outside of the enclave. +- All sensitive operations, such as transaction signing, occur within the enclave, ensuring the wallet's security. + +## Wallet Usage + +### General Usage + +- When users interact with their wallet via the the enclave, all communications are encrypted and only the legitimate user can access their wallet. +- All traffic is encrypted with TLS and HSTS. Services are run in private VPCs on AWS and accessible only from a single entry point via our Cloudflare DNS. +- Applications can [link multiple authentication methods](/connect/in-app-wallet/guides/link-multiple-profiles) to the same wallet. Any of these methods can be used to authenticate into the users wallet. + +### Ecosystem Usage + +Ecosystem wallets are controlled by the ecosystem owner. Ecosystem owners are able to specify usage policies for their partners and developers which restricts what they can do with the wallet. Unlike the shamir secret sharing model, the enclave wallet model ensures that the private key is never reconstructed on the client. This ensures no-one can extract the private key from the client, including other developers in the ecosystem. Moreover, it also means that partners and developers must submit the request to the enclave which would be able to verify the request and block requests that are out of scope or denied by the ecosystem owner. + +## Scopes + + +### In App Wallets + +In-App Wallets are scoped to applications per Client ID. If users use the same email to sign in to a different application using In-App Wallets, the application will manage an entirely different wallet. + +#### Benefits of single application scoped wallets + +- Each application has limited access only to wallets created through their application. It cannot manage wallets from other applications. +- Users may only view tokens sent or purchased from your application. +- To improve user experience, saved payment methods and KYC verification are only provided to thirdweb; applications cannot view this information. + + + +### Ecosystem Wallets + +Ecosystem Wallets are scoped to the ecosystem. If users use the same email to sign in to a different application using the same ecosystem, they will get the same wallet. + +#### Benefits of ecosystem scoped wallets + +- Applications can now share assets across various applications. This is useful if you're a brand powering multiple application and want your partners to take advantage of network effects. +- Application owner has full control over what happens within each application. This is useful if you're a brand that wants to ensure that all applications in your ecosystem are following the same rules. + + + + +## Recoverability + +- Users can export their private key at any time. +- Users may recover their wallet from any device by authenticating or signing into an application to receive access to their wallet. +- Thirdweb wallets support four categories of authentication: socials, custom authentication, external wallets, and email / phone authentication. If a user ever loses access to their authentication method: + + 1. **For socials and email / phone authentication,** users can utilize the recovery flow of their providers to regain access to their account. + 2. **In the case of custom authentication,** the developer managing their authentication flow will be able to re-instate the users account upon successful verification. + 3. Application providers **do not have direct access** to user accounts or private keys, as these remain secured within the enclave. The enclave's design ensures that only verified user requests can trigger wallet operations. + +- Users are able to link their authentication methods which will provide them multiple ways to access their account if they ever lose access to any one of their authentication method. + +## Security & privacy + +### TLS Encryption + +To increase security and privacy, private keys or wallet "seed phrases" are never stored or sent over a network. TLS encryption is used in transit for internal and external communications with thirdweb's back-end and databases. TLS encryption is also required for third-party vendors. + +### AES-256 + +Data backups and storage are encrypted with AES-256. + +### GDPR & CCPA + +thirdweb complies to GDPR and CCPA compliance frameworks and deletes customer data per request within the required timeframe of each standard (30 days for GDPR and 45 for CCPA). + +### Audit and Bounty Program + +Halborn has audited our enclave wallet security architecture which we'll be releasing shortly, and there is an ongoing bounty program to ensure vulnerabilities are caught. [View the Letter of Attestation.](/pdfs/thirdweb_code_security_audit.pdf) diff --git a/apps/portal/src/app/connect/wallet/sign-in-methods/assets/social-config.png b/apps/portal/src/app/connect/wallet/sign-in-methods/assets/social-config.png new file mode 100644 index 00000000000..5a41a449a3b Binary files /dev/null and b/apps/portal/src/app/connect/wallet/sign-in-methods/assets/social-config.png differ diff --git a/apps/portal/src/app/connect/wallet/sign-in-methods/configure/page.mdx b/apps/portal/src/app/connect/wallet/sign-in-methods/configure/page.mdx new file mode 100644 index 00000000000..f47e8e044b6 --- /dev/null +++ b/apps/portal/src/app/connect/wallet/sign-in-methods/configure/page.mdx @@ -0,0 +1,149 @@ +import { ArticleIconCard, AuthList, Callout, DocImage } from "@doc"; +import {UserIcon} from 'lucide-react' +import { + ReactIcon, + TypeScriptIcon, + UnityIcon, + DotNetIcon, + ExternalLinkIcon, + UnrealEngineIcon, + EcosystemWalletsIcon, + WalletsConnectIcon +} from "@/icons" +import EcosystemSocialConfig from '../assets/social-config.png' +import { getSocialIcon } from "thirdweb/wallets/in-app"; + +# Sign-In Methods + +thirdweb supports a bunch of various traditional authentication methods. + +From social logins via the [OAuth 2.0 Protocol](https://oauth.net/2/), to email and SMS, to passkeys. + +For all login methods, thirdweb generates a non-custodial [wallet](/connect/wallet/security) behind the scenes. Thirdweb wallets enable your users to interact with your application, as well as store tokens and assets they receive while interacting with your application. + +## Supported Methods + + + +## Enable Sign-In options + +### In-App Wallets + +To enable a given sign-in method for the thirdweb wallet, refer to the following guides: + +
+ + + {/* TODO: Link to react native getting started for in app wallet */} + + + + +
+ +### Ecosystem Wallets + +In order to configure sign-in options within your ecosystem, first configure the allowed sign-in methods on [your dashboard](https://thirdweb.com/team/~/~/ecosystem). + + + +Once configured, refer to the following guides to use the various login options within your ecosystem: + +
+ + + {/* TODO: Add react native specific getting started for ecosystem wallets */} + + + +
+ + + Note that while you're allowed to pass any auth strategy today, we recommend only passing the strategies that are enabled on your dashboard. We might enforce this in the future. + + + +## Other Sign-In options + +Most authentication option are that straight forward. However, some options require additional setup or nuances. See below for more information on these options: + +
+ + + +
+ +## Interacting with your App + +Once a user signed in and their wallet is generated, you can use the **[Wallet Connection functions](/typescript/v5/functions#wallets)** to get information about the connected wallet like getting the address, account, and more. + diff --git a/apps/portal/src/app/connect/wallet/sign-in-methods/external-wallets/page.mdx b/apps/portal/src/app/connect/wallet/sign-in-methods/external-wallets/page.mdx new file mode 100644 index 00000000000..45c8c5cd60e --- /dev/null +++ b/apps/portal/src/app/connect/wallet/sign-in-methods/external-wallets/page.mdx @@ -0,0 +1,159 @@ +import { createMetadata, ArticleIconCard, Callout } from "@doc"; +import { + WalletsAuthIcon, + WalletsConnectIcon, + ReactIcon, + TypeScriptIcon, + UnityIcon, + DotNetIcon, + ExternalLinkIcon, + UnrealEngineIcon +} from "@/icons" + +export const metadata = createMetadata({ + image: { + title: "External Wallets", + icon: "wallets", + }, + title: "External Wallets | thirdweb", + description: + "Learn how to connect and authenticate with external wallets using thirdweb.", +}); + + +# External wallets + +thirdweb natively supports 350+ first-party wallets and all wallets that implement EIP-6963 (Multi-injected Provider Discovery). For the full list, please consult [this list](/typescript/v5/supported-wallets). + +You can use an external wallet in many ways. We've outlined these different use cases below: + +| USAGE | BEST FOR | +|----------|---------- | +| Connect to site | Applications simply needing web3 wallet connectivity | +| Authenticate into your site | Applications requiring authentication with existing web3 users | +| Authenticate into a thirdweb wallet (either in-app or ecosystem) | Applications looking to provide a seamless web3 application with minimal disruptions and prompts | + +The good news is that thirdweb cover each and every one of this use case! + +Read on to find out how it's done: + +## Connecting External Wallets + +External wallets are perfect for applications that want to integrate with existing web3 users. These users typically already have wallets like MetaMask, Coinbase Wallet, or Rainbow installed and are familiar with web3 concepts. + + + Your backend will not know about the user's wallet. + This is fine if the user's wallet is used to sign transactions and interact with the blockchain directly. + + If you need your backend to be aware of the user's wallet, see [SIWE](#authenticating-with-external-wallets). + + +### Implementation + +We have code snippets and guide for various wallet connecting options below: + + + +## Authenticating with External Wallets + +Authentication with external wallets using Sign-In with Ethereum (SIWE) enables your backend to securely verify user wallet ownership. This is essential for applications requiring user-specific data or authenticated actions. + + + Unlike simple wallet connections, SIWE authentication creates a session between your backend and the user's wallet, enabling secure, authenticated API calls. + + However, users will still require to sign prompts when interacting with the blockchain via their wallets. If you want an invisible web3 experience, consider using [thirdweb wallets](#authenticating-with-external-wallets-into-thirdweb-wallets). + + +### Implementation + + + +## Authenticating with External Wallets into thirdweb Wallets + +thirdweb wallets provide a seamless web3 experience with minimal prompts and disruptions. This will provide you, the developer with full control of how the user interacts with your application. + +Note, however, that the wallet interacting with your application will be a thirdweb wallet, not the user's external wallet. While we provide methods to export keys and see how the external wallet and thirdweb wallet are linked, if your app requires the user's external wallet, you should use [SIWE](#authenticating-with-external-wallets) instead. + +### Implementation + +#### In App Wallet + +
+ + + {/* TODO: Add react native specific getting started for ecosystem wallets */} + + + +
+ +#### Ecosystem Wallet + +
+ + + {/* TODO: Add react native specific getting started for ecosystem wallets */} + + + +
\ No newline at end of file diff --git a/apps/portal/src/app/connect/wallet/sign-in-methods/guest/page.mdx b/apps/portal/src/app/connect/wallet/sign-in-methods/guest/page.mdx new file mode 100644 index 00000000000..bff5167f805 --- /dev/null +++ b/apps/portal/src/app/connect/wallet/sign-in-methods/guest/page.mdx @@ -0,0 +1,186 @@ +import { createMetadata, ArticleIconCard, Callout } from "@doc"; +import { + ReactIcon, + TypeScriptIcon, + UnityIcon, + DotNetIcon, + ExternalLinkIcon, + UnrealEngineIcon +} from "@/icons" + +export const metadata = createMetadata({ + image: { + title: "Guest Mode", + icon: "wallets", + }, + title: "Guest Mode", + description: + "Learn how to get users started in thirdweb wallets without requiring sign-in.", +}); + +# Guest Mode + +Sometimes users want to get started using your app without signing in. You can now give users an in-memory "guest account" that can then be converted into a standard account by linking another auth method. + +## Logging in with Guest Mode + +In general, logging in with guest mode is the same as configuring any other login method in the platform of your choice. See the [login methods overview](/connect/wallet/sign-in-methods/overview) for more information on configuring your login options. + +### In App Wallet +
+ + + {/* TODO: Link to react native getting started for in app wallet */} + + + + +
+ +### Ecosystem Wallet +
+ + + {/* TODO: Add react native specific getting started for ecosystem wallets */} + + + +
+ +## Making the Guest Wallet Permanent + +When your user is ready, link any other auth method so they can access their account in the future. + +### In App Wallet + +Below are the guides for linking a new identity for in-app wallet on the various platforms: + +
+ + + {/* TODO: Link to react native getting started for in app wallet */} + + + +
+ +### Ecosystem Wallet + +Below are the guides for linking a new identity for ecosystem wallet on the various platforms: + +
+ + + {/* TODO: Add react native specific getting started for ecosystem wallets */} + + + +
+ +## Wrapping Up + +Your user can now access this same wallet with their Google account. + +While it is not linked to any other identity, the lifetime of the guest wallet for any given user will last until they clear their browser storage. + +You can try out Guest Mode [on our playground.](https://playground.thirdweb.com/connect/sign-in/button) diff --git a/apps/portal/src/app/connect/in-app-wallet/guides/export-private-key/confirm-reveal.png b/apps/portal/src/app/connect/wallet/user-management/export-private-key/confirm-reveal.png similarity index 100% rename from apps/portal/src/app/connect/in-app-wallet/guides/export-private-key/confirm-reveal.png rename to apps/portal/src/app/connect/wallet/user-management/export-private-key/confirm-reveal.png diff --git a/apps/portal/src/app/connect/in-app-wallet/guides/export-private-key/export-key.png b/apps/portal/src/app/connect/wallet/user-management/export-private-key/export-key.png similarity index 100% rename from apps/portal/src/app/connect/in-app-wallet/guides/export-private-key/export-key.png rename to apps/portal/src/app/connect/wallet/user-management/export-private-key/export-key.png diff --git a/apps/portal/src/app/connect/in-app-wallet/guides/export-private-key/exported-key.png b/apps/portal/src/app/connect/wallet/user-management/export-private-key/exported-key.png similarity index 100% rename from apps/portal/src/app/connect/in-app-wallet/guides/export-private-key/exported-key.png rename to apps/portal/src/app/connect/wallet/user-management/export-private-key/exported-key.png diff --git a/apps/portal/src/app/connect/in-app-wallet/guides/export-private-key/manage-wallet.png b/apps/portal/src/app/connect/wallet/user-management/export-private-key/manage-wallet.png similarity index 100% rename from apps/portal/src/app/connect/in-app-wallet/guides/export-private-key/manage-wallet.png rename to apps/portal/src/app/connect/wallet/user-management/export-private-key/manage-wallet.png diff --git a/apps/portal/src/app/connect/in-app-wallet/guides/export-private-key/page.mdx b/apps/portal/src/app/connect/wallet/user-management/export-private-key/page.mdx similarity index 64% rename from apps/portal/src/app/connect/in-app-wallet/guides/export-private-key/page.mdx rename to apps/portal/src/app/connect/wallet/user-management/export-private-key/page.mdx index f2f4af73f3f..1cfa600bd47 100644 --- a/apps/portal/src/app/connect/in-app-wallet/guides/export-private-key/page.mdx +++ b/apps/portal/src/app/connect/wallet/user-management/export-private-key/page.mdx @@ -6,22 +6,26 @@ import ExportedKey from './exported-key.png' export const metadata = createMetadata({ image: { - title: "Export private key of In-App Wallet", + title: "Export private key of thirdweb Wallet", icon: "wallets", }, - title: "Export private key | thirdweb In-App Wallet", + title: "Export private key | thirdweb", description: - "Learn how to export private keys for thirdweb in-app wallets", + "Learn how to export private keys for thirdweb wallets", }); # Export Private Key -Learn how to export the private key for a thirdweb in-app wallet using the Connect modal. +Learn how to export the private key for a thirdweb wallet using the Connect modal. + + + Note that we don't allow exporting private key headlessly today. This is to ensure the security of the users assets. + - Login to your in-app wallet on the application. + Login to your wallet on the application. @@ -51,5 +55,5 @@ Learn how to export the private key for a thirdweb in-app wallet using the Conne -As an advanced option, to hide the export private key option from the modal, set the `hidePrivateKeyOption` to `true` + As an advanced option, to hide the export private key option from the modal, set the `hidePrivateKeyOption` to `true` when initializing the typescript or react SDK. \ No newline at end of file diff --git a/apps/portal/src/app/connect/wallet/user-management/get-user-profiles/page.mdx b/apps/portal/src/app/connect/wallet/user-management/get-user-profiles/page.mdx new file mode 100644 index 00000000000..d562dc5c950 --- /dev/null +++ b/apps/portal/src/app/connect/wallet/user-management/get-user-profiles/page.mdx @@ -0,0 +1,244 @@ +import { createMetadata, ArticleIconCard } from "@doc"; +import { + ReactIcon, + TypeScriptIcon, + UnityIcon, + DotNetIcon, + ExternalLinkIcon, + UnrealEngineIcon +} from "@/icons" + +export const metadata = createMetadata({ + image: { + title: "Getting User Profiles", + icon: "wallets", + }, + title: "Getting User Profiles | thirdweb", + description: + "Learn how to retrieve the user profiles linked to a wallet.", +}); + +# Getting User Profiles + +Once authenticated, you can retrieve the user profiles linked to a wallet. This allows you to access additional information about the user, such as their email address or phone number. + +## List of Strategies + +Regardless of platform, the response will have a json object in the following shape as some level: + +```json +{ + "strategy": "email", + "details": { + "email": "user@example.com" + }, +} +``` + +Note that the `email` field above will differ based on the profile type. We list the expected field below in our list of strategies. + + +| Strategy | Type | `details` Field | +| ------------- | ----------------- | --------------- | +| Email | `"email"` | `email` | +| Google | `"google"` | `email` | +| Discord | `"discord"` | `email` | `id` | +| Apple | `"apple"` | `email` | `id` | +| Facebook | `"facebook"` | `email` | `id` | +| Phone | `"phone"` | `phone` | +| Guest | `"guest"` | `id` | +| Passkey | `"passkey"` | `id` | +| Telegram | `"telegram"` | `id` | +| Farcaster | `"farcaster"` | `id` | +| Line | `"line"` | `id` | +| JWT | `"jwt"` | `id` | +| Auth Endpoint | `"auth_endpoint"` | `id` | +| Wallet | `"wallet"` | `address` | + + + +## Frontend + +For frontend, we provide methods to get information around the currently logged in user. + + +### In App Wallet + +
+ + + + + +
+ +### Ecosystem Wallet + +
+ + + + + +
+ + +## Backend + + +From the backend, you are able to get the details of any user within your in app or ecosystem wallet. + +To get the user details, you can make a `GET` request to the following endpoint: + +``` +https://in-app-wallet.thirdweb.com/api/2023-11-30/embedded-wallet/user-details +``` + +### Query Parameters + +You can specify the query parameter `queryBy` to query by different user identifiers: + +- `queryBy`: The parameter to query by. Can be one of `walletAddress`, `email`, `phone`, `externalWalletAddress`, or `id`. + +You can then specify the value to query by, matching the queryBy parameter: + +- `walletAddress`: The user's wallet address that thirdweb has generated for them +- `email`: The user's email address +- `phone`: The user's phone number +- `externalWalletAddress`: The user's wallet address that used to login via SIWE +- `id`: The user's ID (for custom auth) + +### Authentication + +You need to include your ThirdWeb Client Secret in the Authorization header. + +If you are an ecosystem owner, you have to include the `x-ecosystem-id` header and optionally the `x-ecosystem-partner-id` header if the ecosystem is set to partners only. + +### Example curl Command + +Here's an example curl command to fetch user details by email: + +```bash +curl -X GET 'https://in-app-wallet.thirdweb.com/api/2023-11-30/embedded-wallet/user-details?queryBy=email&email=user@example.com' \ + -H 'x-secret-key: YOUR_THIRD_WEB_CLIENT_SECRET' +``` + +Here's an example curl command to fetch user details by address: + +```bash +curl -X GET 'https://in-app-wallet.thirdweb.com/api/2023-11-30/embedded-wallet/user-details?queryBy=walletAddress&walletAddress=0x123456789abcdef' \ + -H 'x-secret-key: YOUR_THIRD_WEB_CLIENT_SECRET' +``` + +Here's an example curl command to fetch the user details for an ecosystem owner: + +```bash +curl -X GET 'https://in-app-wallet.thirdweb.com/api/2023-11-30/embedded-wallet/user-details?queryBy=walletAddress&walletAddress=0x123456789abcdef' \ + -H 'x-secret-key: YOUR_THIRD_WEB_CLIENT_SECRET' \ + -H 'x-ecosystem-id: ecosystem.YOUR_ECOSYSTEM_ID' \ + -H 'x-ecosystem-partner-id: YOUR_PARTNER_ID' +``` + +In both examples, replace `YOUR_THIRD_WEB_CLIENT_SECRET` with your actual ThirdWeb Client Secret. + +Replace `YOUR_ECOSYSTEM_ID` and `YOUR_PARTNER_ID` with your actual ecosystem ID and partner ID respectively. The partner ID can be one you set up for yourself as the ecosystem owner. + +### Response Format + +The API returns a JSON array with the following structure for each user: + +```json +[ + { + "userId": "string", + "walletAddress": "string", + "email": "string (optional)", + "phone": "string (optional)", + "createdAt": "string", + "linkedAccounts": [ + { + "type": "string", + "details": { + "phone": "string", + // or + "email": "string", + // or + "address": "string", + // or + "id": "string", + // Additional key-value pairs may be present + } + } + ] + } +] +``` + +Note: The `details` object in `linkedAccounts` will contain different fields based on the account type. See the [list of Strategies](#list-of-strategies) above for more information. + +Remember to handle the response appropriately in your chosen programming language, including error cases and parsing the JSON response. + +### Convenience Methods + +If you are using the thirdweb SDK, you can use the `getUser` method to retrieve user details. + + + +## Linking Additional Identities + +If you want to link additional identities to a wallet, see [Linking Multiple Identities](/connect/wallet/user-management/link-multiple-identity). \ No newline at end of file diff --git a/apps/portal/src/app/connect/wallet/user-management/link-multiple-identity/page.mdx b/apps/portal/src/app/connect/wallet/user-management/link-multiple-identity/page.mdx new file mode 100644 index 00000000000..ee9841cb762 --- /dev/null +++ b/apps/portal/src/app/connect/wallet/user-management/link-multiple-identity/page.mdx @@ -0,0 +1,109 @@ +import { createMetadata, ArticleIconCard, Callout } from "@doc"; +import { + ReactIcon, + TypeScriptIcon, + UnityIcon, + DotNetIcon, + ExternalLinkIcon, + UnrealEngineIcon +} from "@/icons" + +export const metadata = createMetadata({ + image: { + title: "Linking Multiple Identities", + icon: "wallets", + }, + title: "Linking Multiple Identities", + description: + "Learn how to associate multiple social profiles with a single wallet address.", +}); + +# Linking Multiple Identities + +thirdweb Wallets allow users to tie the same wallet address to multiple social identities. Developers can programmatically link additional identities at any point in their user journey. + +## Link a new identity + +When linking two identities, both identities will now be linked to the same wallet. + + + If the account that is is already linked to this or another wallet, this will throw an error. + + + +### In App Wallet + +
+ + + + + +
+ +### Ecosystem Wallet + +
+ + + + + +
+ + +## Retrieve Linked Profiles + +Once linked, you can retrieve the user profiles via either identity. + +For more information, see [Getting User Profiles](/connect/wallet/user-management/get-user-profiles). diff --git a/apps/portal/src/app/page.tsx b/apps/portal/src/app/page.tsx index 35881551c31..711f17a4d39 100644 --- a/apps/portal/src/app/page.tsx +++ b/apps/portal/src/app/page.tsx @@ -12,7 +12,6 @@ import { ContractModularContractIcon, ContractPublishIcon, DotNetIcon, - EcosystemWalletsIcon, InfraEngineIcon, InfraInsightIcon, PayIcon, @@ -20,7 +19,6 @@ import { TypeScriptIcon, UnityIcon, WalletsAuthIcon, - WalletsConnectIcon, WalletsInAppIcon, WalletsSmartIcon, } from "@/icons"; @@ -227,27 +225,7 @@ function WalletsSection() {
- - - - - - - - - + @@ -258,10 +236,10 @@ function WalletsSection() { icon={ConnectOverviewIcon} /> - - + + + + + + + + + +
); } diff --git a/apps/portal/src/app/react/v5/ecosystem-wallet/get-started/page.mdx b/apps/portal/src/app/react/v5/ecosystem-wallet/get-started/page.mdx index be5de5180f8..6ef28ea4284 100644 --- a/apps/portal/src/app/react/v5/ecosystem-wallet/get-started/page.mdx +++ b/apps/portal/src/app/react/v5/ecosystem-wallet/get-started/page.mdx @@ -3,9 +3,11 @@ import { TabsList, TabsTrigger, TabsContent, + Callout, DocImage, createMetadata, } from "@doc"; +import EcosystemSocialConfig from './social-config.png' export const metadata = createMetadata({ title: "Connect users with Ecosystem Wallets", @@ -61,6 +63,22 @@ const LoginComponent = () => { }; ``` +## Configuring auth strategies + +You can configure the allowed auth strategies on [your dashboard](https://thirdweb.com/team/~/~/ecosystem). + + + +For prebuilt UIs, the enabled auth strategies are automatically read from your dashbaord configurations. + +For custom UIs, you can configure the auth options when connecting the wallet. See [using your own UI](#using-your-own-ui) for an example. + + + Note that while you're allowed to pass any auth strategy today, we recommend only passing the strategies that are enabled on your dashboard. We might enforce this in the future. + + + + ## Passing a partner ID For closed ecosystems, you can pass a valid `partnerId` to the `ecosystemWallet` provided by the ecosystem owner. diff --git a/apps/portal/src/app/react/v5/ecosystem-wallet/get-started/social-config.png b/apps/portal/src/app/react/v5/ecosystem-wallet/get-started/social-config.png new file mode 100644 index 00000000000..5a41a449a3b Binary files /dev/null and b/apps/portal/src/app/react/v5/ecosystem-wallet/get-started/social-config.png differ diff --git a/apps/portal/src/app/react/v5/in-app-wallet/get-started/page.mdx b/apps/portal/src/app/react/v5/in-app-wallet/get-started/page.mdx index 76eb812eddf..ac80da76e4b 100644 --- a/apps/portal/src/app/react/v5/in-app-wallet/get-started/page.mdx +++ b/apps/portal/src/app/react/v5/in-app-wallet/get-started/page.mdx @@ -3,6 +3,7 @@ import { TabsList, TabsTrigger, TabsContent, + Callout, DocImage, createMetadata, } from "@doc"; @@ -46,6 +47,11 @@ export default function App() { By default, the connect UI supports multiple social logins as well as email, phone and passkey authentication. You can customize which authentication methods to support which will be reflected in the UI. + + By default, email login is displayed before phone number login. To display phone number first, add "phone" before "email" in the providers array + + + ```tsx import { ThirdwebProvider, ConnectButton } from "thirdweb/react"; import { inAppWallet } from "thirdweb/wallets"; diff --git a/apps/portal/src/app/references/components/TDoc/Summary.tsx b/apps/portal/src/app/references/components/TDoc/Summary.tsx index 7aeb097b25c..f2912fec59c 100644 --- a/apps/portal/src/app/references/components/TDoc/Summary.tsx +++ b/apps/portal/src/app/references/components/TDoc/Summary.tsx @@ -1,3 +1,5 @@ +import { sluggerContext } from "@/contexts/slugger"; +import invariant from "tiny-invariant"; import type { FunctionSignature } from "typedoc-better-json"; import { CodeBlock, InlineCode } from "../../../../components/Document/Code"; import { DocLink } from "../../../../components/Document/DocLink"; @@ -12,6 +14,9 @@ export function TypedocSummary(props: { summary: NonNullable; className?: string; }) { + const slugger = sluggerContext.get(); + invariant(slugger, "slugger context not set"); + return ( <> {props.summary.map((s) => { @@ -74,7 +79,10 @@ export function TypedocSummary(props: { case "heading": { return ( - + ); diff --git a/apps/portal/src/app/typescript/v5/supported-wallets/[walletId]/page.tsx b/apps/portal/src/app/typescript/v5/supported-wallets/[walletId]/page.tsx index c9373dc1786..682c235fbf1 100644 --- a/apps/portal/src/app/typescript/v5/supported-wallets/[walletId]/page.tsx +++ b/apps/portal/src/app/typescript/v5/supported-wallets/[walletId]/page.tsx @@ -150,14 +150,14 @@ export default async function Page(props: PageProps) { - You can add this wallet in the + You can add this wallet in the{" "} ConnectButton - - or + {" "} + or{" "} ConnectEmbed - + {" "} component to get a pre-built UI for connecting the wallet. Example diff --git a/apps/portal/src/app/typescript/v5/supported-wallets/page.mdx b/apps/portal/src/app/typescript/v5/supported-wallets/page.mdx index 2c04d640173..beed65954d5 100644 --- a/apps/portal/src/app/typescript/v5/supported-wallets/page.mdx +++ b/apps/portal/src/app/typescript/v5/supported-wallets/page.mdx @@ -28,6 +28,11 @@ export const metadata = createMetadata({ href="/references/typescript/v5/inAppWallet" icon={EmbeddedWalletIcon} /> +
diff --git a/apps/portal/src/components/Document/AuthList.tsx b/apps/portal/src/components/Document/AuthList.tsx new file mode 100644 index 00000000000..5b45752b0a6 --- /dev/null +++ b/apps/portal/src/components/Document/AuthList.tsx @@ -0,0 +1,41 @@ +/* eslint-disable @next/next/no-img-element */ +import { cn } from "@/lib/utils"; +import type { InAppWalletAuth } from "thirdweb/wallets"; +import { getSocialIcon } from "thirdweb/wallets/in-app"; + +const authOptions: InAppWalletAuth[] = [ + "email", + "phone", + "passkey", + "guest", + "wallet", + "google", + "apple", + "facebook", + "x", + "discord", + "telegram", + "twitch", + "farcaster", + "github", + "line", + "coinbase", + "steam", +]; + +export function AuthList() { + return ( +
+
    + {authOptions?.map((auth) => ( +
  • +
    + {auth} + {auth.charAt(0).toUpperCase() + auth.slice(1)} +
    +
  • + ))} +
+
+ ); +} diff --git a/apps/portal/src/components/Document/index.ts b/apps/portal/src/components/Document/index.ts index 240e927eda0..be36d17a854 100644 --- a/apps/portal/src/components/Document/index.ts +++ b/apps/portal/src/components/Document/index.ts @@ -26,3 +26,4 @@ export { createMetadata } from "./metadata"; export { ConnectCard } from "./Cards/ConnectCard"; export { FeatureCard } from "./FeatureCard"; export { AAChainList } from "./AAChainList"; +export { AuthList } from "./AuthList"; diff --git a/packages/thirdweb/src/wallets/in-app/web/ecosystem.ts b/packages/thirdweb/src/wallets/in-app/web/ecosystem.ts index 12cb4e7552f..e33932d5c08 100644 --- a/packages/thirdweb/src/wallets/in-app/web/ecosystem.ts +++ b/packages/thirdweb/src/wallets/in-app/web/ecosystem.ts @@ -7,30 +7,21 @@ import type { import { createInAppWallet } from "../core/wallet/in-app-core.js"; /** - * Creates an [Ecosystem Wallet](https://portal.thirdweb.com/connect/ecosystems/overview) based on various authentication methods. - * - * Available authentication methods: - * - Email - * - Phone - * - Passkey - * - Google - * - Apple - * - Facebook - * - Discord - * - LINE - * - X - * - Farcaster + * Creates an [Ecosystem Wallet](https://portal.thirdweb.com/connect/ecosystems/overview) based on various authentication methods. Full list of available authentication methods [here](/connect/wallet/sign-in-methods/overview). * * Can also be configured to use Account Abstraction to directly connect to a ERC4337 smart account based on those authentication methods. * - * Refer to [inAppWallet](https://portal.thirdweb.com/references/typescript/v5/inAppWallet) for detailed usage examples. + * Refer to [inAppWallet](/typescript/v5/inAppWallet) for detailed usage examples. * * @param createOptions - configuration options * Refer to [EcosystemWalletCreationOptions](https://portal.thirdweb.com/references/typescript/v5/EcosystemWalletCreationOptions) for more details. * @returns The created ecosystem wallet. + * + * * @example + * ### Logging into an ecosystem wallet * - * ### Connect to an ecosystem wallet + * Below is the general code snippet needed to connect via a given auth strategy to an ecosystem wallet. For more variants on the various auth strategies, refer to [inAppWallet](/typescript/v5/inAppWallet). * * ```ts * import { ecosystemWallet } from "thirdweb/wallets"; @@ -44,7 +35,7 @@ import { createInAppWallet } from "../core/wallet/in-app-core.js"; * }); * ``` * - * [View all connection options](https://portal.thirdweb.com/references/typescript/v5/EcosystemWalletConnectionOptions) + * [View all connection options](https://portal.thirdweb.com/references/typescript/v5/EcosystemWalletConnectionOptions). * * ### Connect to a restricted ecosystem wallet with your designated partner ID * @@ -57,7 +48,6 @@ import { createInAppWallet } from "../core/wallet/in-app-core.js"; * }); * ``` * - * Refer to [inAppWallet](https://portal.thirdweb.com/references/typescript/v5/inAppWallet) for more usage examples. * * @wallet */ diff --git a/packages/thirdweb/src/wallets/in-app/web/in-app.ts b/packages/thirdweb/src/wallets/in-app/web/in-app.ts index d0507ff5cd7..21b3814a23d 100644 --- a/packages/thirdweb/src/wallets/in-app/web/in-app.ts +++ b/packages/thirdweb/src/wallets/in-app/web/in-app.ts @@ -4,22 +4,7 @@ import type { CreateWalletArgs } from "../../wallet-types.js"; import { createInAppWallet } from "../core/wallet/in-app-core.js"; /** - * Creates an app scoped wallet for users based on various authentication methods. - * - * Available authentication methods: - * - Email - * - Phone - * - Passkey - * - Guest - * - Google - * - Apple - * - Facebook - * - Discord - * - Coinbase - * - Telegram - * - LINE - * - X - * - Farcaster + * Creates an app scoped wallet for users based on various authentication methods. Full list of available authentication methods [here](https://portal.thirdweb.com/connect/wallet/sign-in-methods/overview). * * Can also be configured to use Account Abstraction to directly connect to a ERC4337 smart account based on those authentication methods. * @@ -42,7 +27,7 @@ import { createInAppWallet } from "../core/wallet/in-app-core.js"; * }); * ``` * - * [View all available social auth methods](https://portal.thirdweb.com/references/typescript/v5/InAppWalletSocialAuth) + * [View all available social auth methods](https://portal.thirdweb.com/connect/wallet/sign-in-methods/overview) * * ### Login with email * diff --git a/packages/thirdweb/src/wallets/in-app/web/lib/auth/index.ts b/packages/thirdweb/src/wallets/in-app/web/lib/auth/index.ts index d451a80fed2..84886844cbf 100644 --- a/packages/thirdweb/src/wallets/in-app/web/lib/auth/index.ts +++ b/packages/thirdweb/src/wallets/in-app/web/lib/auth/index.ts @@ -194,6 +194,7 @@ export async function authenticateWithRedirect( * ```ts * import { linkProfile } from "thirdweb/wallets"; * + * // optionally specify the ecosystem if you're linking an ecosystem wallet * await linkProfile({ client, strategy: "discord" }); * ``` * @wallet