cómo conectar web3 inyectado por metamask en angular 2

Como se describe en metamask github, uno puede iniciar metamask de esta manera:

window.addEventListener('load', function() {

  // Checking if Web3 has been injected by the browser (Mist/MetaMask) if (typeof web3 !== 'undefined') {
    // Use Mist/MetaMask's provider
    window.web3 = new Web3(web3.currentProvider);   } else {
    console.log('No web3? You should consider trying MetaMask!')
    // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
    window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));   }

  // Now you can start your app & access web3 freely:   startApp()

})

¿Cómo implemento en angular 2 mecanografiado, y dónde conecto esta inyección de metamask web3 para que aparezca la billetera de metamask cada vez que activeweb3.eth.sendTransaction()

Respuestas (2)

La forma más sencilla de hacer esto es editar main.ts

y reemplazar

platformBrowserDynamic().bootstrapModule(AppModule);

por

window.addEventListener('load', function() {

  // Checking if Web3 has been injected by the browser (Mist/MetaMask)
  if (typeof window.web3 !== 'undefined') {
    // Use Mist/MetaMask's provider
    window.web3 = new Web3(window.web3.currentProvider);
  } else {
    console.log('No web3? You should consider trying MetaMask!')
    // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
    window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
  }

  platformBrowserDynamic().bootstrapModule(AppModule);

});

luego crea un servicio y haz

declare global {
  interface Window { web3: any; }
}

window.web3 = window.web3 || {};

@Injectable()
export class Web3Service {

  web3: any;

  constructor() {
    this.web3 = window.web3;
  }

  getWeb3() {
    return this.web3;
  }
Recibo este error: ERROR en src/main.ts(15,21): error TS2339: la propiedad 'web3' no existe en el tipo 'Ventana'.

La aplicación StackExchange Bounty ÐApp de Oracle podría ser buena para usar como ejemplo. Está implementado , pero no parece tener mucho uso. Utiliza un front-end Angular2. (Estoy seguro de que hay muchos otros, pero este es el único con el que he jugado).

Específicamente, observe cómo el web3.service.tsarchivo Typescript maneja las conexiones de MetaMask en su @Injectable( línea 161 ):

connectToNode(): void { // Don't unlock until you send a transaction
    if (typeof window['web3'] !== 'undefined' && (!localStorage['nodeIP'] || this.nodeIP === 'MetaMask')) {
        localStorage['nodeIP'] = this.nodeIP;
        console.log('Using injected web3');
        this.web3 = new this.Web3(window['web3'].currentProvider);
        this.nodeIP = 'MetaMask';
        this.nodeConnected = true;
        this.unlockedAccount = 'MetaMask';
        this.update.emit(null);
    } else {
        localStorage['nodeIP'] = this.nodeIP;
        console.log('Using HTTP node');
        this.unlockedAccount = undefined;
        this.web3 = new this.Web3(new this.Web3.providers.HttpProvider(this.nodeIP));
        this.handleConnection(this.web3.isConnected());
    }
}

Tendrá que ver cómo está configurado todo su proyecto para tener una idea de los servicios, etc., pero es un buen lugar para comenzar.

gracias por su sugerencia, SEBouty Dapp es demasiado antiguo y obsoleto con angular2 rc5, no puedo instalar correctamente el proyecto. Solo necesito un guid sobre cómo usar el objeto de ventana para conectar el MetaMask inyectado web3 que vi cuando se carga la página, solo necesito saber cómo reescribir el código anterior en mecanografiado