juice-shop
162 строки · 4.9 Кб
1import { Component, ChangeDetectorRef } from '@angular/core'2import { KeysService } from '../Services/keys.service'3import { SnackBarHelperService } from '../Services/snack-bar-helper.service'4import { web3WalletABI } from '../../assets/public/ContractABIs'5import { getDefaultProvider, ethers } from 'ethers'6import {7createClient,8connect,9disconnect,10getAccount,11InjectedConnector
12} from '@wagmi/core'13const { ethereum } = window14const BankAddress = '0x413744D59d31AFDC2889aeE602636177805Bd7b0'15// eslint-disable-next-line @typescript-eslint/no-unused-vars
16const client = createClient({17autoConnect: true,18provider: getDefaultProvider()19})20
21@Component({22selector: 'app-wallet-web3',23templateUrl: './wallet-web3.component.html',24styleUrls: ['./wallet-web3.component.scss']25})26export class WalletWeb3Component {27constructor (28private readonly keysService: KeysService,29private readonly snackBarHelperService: SnackBarHelperService,30private readonly changeDetectorRef: ChangeDetectorRef31) {}32
33userData: object34session = false35walletBalance = '0'36myBEEBalance = 037inputAmount: number = null38successResponse = false39mintButtonDisabled = true40challengeSolved = false41errorMessage = ''42metamaskAddress = ''43ngOnInit (): void {44this.handleAuth()45window.ethereum.on('chainChanged', this.handleChainChanged.bind(this))46}47
48async handleChainChanged (chainId: string) {49await this.handleAuth()50}51
52async depositETH () {53try {54const provider = new ethers.providers.Web3Provider(window.ethereum)55const signer = provider.getSigner()56
57const contract = new ethers.Contract(BankAddress, web3WalletABI, signer)58const depositAmount = this.inputAmount.toString()59const transaction = await contract.ethdeposit(this.metamaskAddress, {60value: ethers.utils.parseEther(depositAmount)61})62// eslint-disable-next-line @typescript-eslint/no-unused-vars63const txConfirmation = await transaction.wait()64this.getUserEthBalance()65} catch (error) {66this.errorMessage = error.message67}68}69
70async withdrawETH () {71try {72const provider = new ethers.providers.Web3Provider(window.ethereum)73const signer = provider.getSigner()74
75const contract = new ethers.Contract(BankAddress, web3WalletABI, signer)76const withdrawalAmount = this.inputAmount.toString()77const transaction = await contract.withdraw(78ethers.utils.parseEther(withdrawalAmount)79)80// eslint-disable-next-line @typescript-eslint/no-unused-vars81const txConfirmation = await transaction.wait()82this.getUserEthBalance()83} catch (error) {84this.errorMessage = error.message85}86}87
88async getUserEthBalance () {89try {90const provider = new ethers.providers.Web3Provider(window.ethereum)91const signer = provider.getSigner()92const contract = new ethers.Contract(BankAddress, web3WalletABI, signer)93const userBalance = await contract.balanceOf(this.metamaskAddress)94const formattedBalance = ethers.utils.formatEther(userBalance)95this.walletBalance = formattedBalance96} catch (error) {97this.errorMessage = error.message98}99}100
101async handleAuth () {102try {103const { isConnected } = getAccount()104
105if (isConnected) {106await disconnect()107}108if (!window.ethereum) {109this.snackBarHelperService.open('PLEASE_INSTALL_WEB3_WALLET', 'errorBar')110return111}112
113const provider = await connect({ connector: new InjectedConnector() })114this.metamaskAddress = provider.account115this.keysService.walletAddressSend(this.metamaskAddress).subscribe(116(response) => {117if (response.success) {118this.successResponse = response.status119this.mintButtonDisabled = true120}121},122(error) => {123console.error(error)124}125)126this.userData = {127address: provider.account,128chain: provider.chain.id,129network: 'evm'130}131await ethereum.request({132method: 'wallet_addEthereumChain',133params: [134{135chainId: '0xaa36a7',136chainName: 'Sepolia Test Network',137nativeCurrency: {138name: 'SepoliaETH',139symbol: 'ETH',140decimals: 18141},142rpcUrls: ['https://ethereum-sepolia.blockpi.network/v1/rpc/public'],143blockExplorerUrls: ['https://sepolia.etherscan.io/']144}145]146})147const targetChainId = '11155111'148const currentChainId = String(provider.chain?.id)149
150if (provider && currentChainId !== targetChainId) {151this.session = false152this.snackBarHelperService.open('PLEASE_CONNECT_TO_SEPOLIA_NETWORK', 'errorBar')153} else {154this.session = true155this.getUserEthBalance()156}157this.changeDetectorRef.detectChanges()158} catch (err) {159console.log(err)160}161}162}
163