как подключить web3, введенный метамаской в ​​angular 2

Как описано в метамаске github, метамаску можно загрузить следующим образом:

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()

})

Как мне реализовать в машинописном тексте angular 2 и где мне подключить эту метамаску web3, чтобы она открывала кошелек метамаски всякий раз, когда я запускаюweb3.eth.sendTransaction()

Ответы (2)

Самый простой способ сделать это — отредактировать файл main.ts.

и заменить

platformBrowserDynamic().bootstrapModule(AppModule);

по

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);

});

затем создайте службу и сделайте

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;
  }
Я получаю эту ошибку: ОШИБКА в src/main.ts(15,21): ошибка TS2339: свойство «web3» не существует для типа «Window».

В качестве примера можно использовать приложение StackExchange Bounty от Oraclize . Он развернут , но, похоже, не очень полезен. Он использует интерфейс Angular2. (Я уверен, что есть много других, но это единственный, с которым я играл.)

В частности, взгляните на то, как web3.service.tsфайл Typescript обрабатывает соединения MetaMask в его @Injectable( строка 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());
    }
}

Вам нужно будет посмотреть, как устроен весь их проект, чтобы получить представление об услугах и т. д., но это хорошее место для начала.

спасибо за подсказку, приложение SEBouty Dapp слишком старое и устарело с angular2 rc5, я не могу успешно установить проект. Мне просто нужно какое-то руководство, как использовать объект окна для подключения введенного MetaMask web3, который я видел при загрузке страницы, мне просто нужно знать, как переписать приведенный выше фрагмент кода в машинописном тексте.