Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to connect with wallet MetaMask in angular uing web3?

I am implementing the code in angular to connect with crypto wallet on button click, I have also installed the web3 but I don't know how to remove the error and use the code init.

connectWallet(){

    let web3; 
    let ethereum = window.ethereum;

    if (typeof window.web3 !== 'undefined') {
         web3 = new Web3(window.web3.currentProvider);
      } else {
         web3 = new Web3.providers.HttpProvider(localprovide);
      }

     // ethereum = new Web3(window.ethereum);

     ethereum.enable().then(async (accounts) => {
       // console.log('transfer called.........', accounts[0]);
        localStorage.setItem('account', accounts[0]);
      });

      if (window.web3) {
        // Subscription register
        ethereum.on('accountsChanged', async (accounts) => {
            // Reload to avoid MetaMask bug: "MetaMask - RPC Error: Internal JSON-RPC"
            window.location.reload();
        });

        window.ethereum.on('networkChanged', async (network) => {
            window.location.reload();
        });
    }
}
like image 493
Daniyal Baig Avatar asked Nov 18 '25 21:11

Daniyal Baig


1 Answers

In app component OnInit:

declare const web3: any;
declare const Web3: any;

  public ngOnInit() {
    if (typeof web3 !== 'undefined') {
      // Use Mist/MetaMask's provider
      this.web3Service.web3Instance = new Web3(web3.currentProvider);
      this.web3Service.initContractInstance();

    } else {
      // Handle the case where the user doesn't have web3. Probably
      // show them a message telling them to install Metamask in
      // order to use our app.
    }
  }

Web3Services:

@Injectable()
export class Web3Service {
  private contractAddress = "your Contract Address";
  public contractInstance: any;
  public web3Instance: any;


  public initContractInstance() {
    this.contractInstance = new this.web3Instance.eth.Contract(ABI, this.contractAddress);
  }

  public getAccounts(): Promise<any> {
    return this.web3Instance.eth.getAccounts()
  }

  public signUp(account: string): Promise<any> {
    return this.contractInstance.methods.signUp()
      .send({ from: account, value: this.web3Instance.utils.toWei(PRICES.signUp, 'ether') })
  }
}

In component where you want to call some method that needs account:

export class WelcomeComponent implements OnInit {

  constructor(private web3Service: Web3Service) {
  }

  ngOnInit(): void {
  }

  public connectWallet() {
    if (!ethEnabled()) {
      console.log("Need to download Wallet")
    } else {
      from(this.web3Service.getAccounts())
        .subscribe(accounts => {
          this.web3Service.signUp(accounts[0])
            .then(result => {
              console.log(result)
            })
        })
    }
  }
}
like image 143
Vitalii Stalynskyi Avatar answered Nov 21 '25 09:11

Vitalii Stalynskyi



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!