Передача токена ERC20 с использованием Web3 и angular

Я пытаюсь создать простое приложение для передачи токенов, используя Web3.js и Angular, все, что я хочу, это передать некоторые токены с адреса A на адрес B. Итак, я сделал две функции в службе angular, первая получает баланс фактического счета (он работает) и второй делает перевод, но он не работает, и я не знаю, как его использовать. Я использую Metamask в Chrome и Web3 0.20.3 (угловой 6.0.3)

это мой код

 import { Injectable } from '@angular/core';

import Web3 from 'web3';

const web3 = new Web3(window.web3.currentProvider);

declare let require: any;
declare let window: any;

let tokenAbi = [
  //long ABI JSON not included to make the code shorter
]

@Injectable({

})
export class Web3ServiceService {
  private _account: string = null;
  private _web3: any;

  private _tokenContract: any;
  private _tokenContractAddress: string = "0x0b0A241E6331358D1777cBeF0240b8C462f3F7a2";

  constructor() {
    if (typeof window.web3 !== 'undefined') {
      // Use Mist/MetaMask's provider
      this._web3 = web3;// new Web3(window.web3.currentProvider);
      this._web3.version.getNetwork((err, netId) => {
        switch (netId) {
          case "1":
            console.log('This is mainnet');
            alert('Please connect to the Rinkeby network ');
            break
          case "2":
            console.log('This is the deprecated Morden test network.');
            alert('Please connect to the Rinkeby network ');
            break
          case "3":
            console.log('This is the ropsten test network.');
            break
          default:
            console.log('This is an unknown network.');
            alert('Please connect to the Rinkeby network ');
        }
      });
      if (this._web3.version.getNetwork !== '3') {
        console.log(this._web3.version.getNetwork);        
      } 
      } else {
      console.warn(
        'Please use a dapp browser like mist or MetaMask plugin for chrome'
      );
     }

    this._tokenContract = this._web3.eth.contract(tokenAbi).at(this._tokenContractAddress);
  }


  private async getAccount(): Promise<string> {
    if (this._account == null) {
      this._account = await new Promise((resolve, reject) => {
        this._web3.eth.getAccounts((err, accs) => {
          if (err != null) {
            alert('There was an error fetching your accounts.');
            return;
          }

          if (accs.length === 0) {
            alert(
              'Couldn\'t get any accounts! Make sure your Ethereum client is configured correctly.'
            );
            return;
          }
          resolve(accs[0]);
        })
      }) as string;

      this._web3.eth.defaultAccount = this._account;
    }

    return Promise.resolve(this._account);
  }

  public async getUserBalance(): Promise<number> {
    let account = await this.getAccount();

    return new Promise((resolve, reject) => {
      let _web3 = this._web3;
      this._tokenContract.balanceOf.call(account, function (err, result) {
        if(err != null) {
          reject(err);
        }
        resolve(result);
      });
    }) as Promise<number>;
  }  

  public async sendAFC(): Promise<any> {
    let account = await this.getAccount();

    return new Promise((resolve, reject) => {
      let _web3 = this._web3;
      let account2 = "0x169f0C8D07ECcD28DC9AA9998D61584CC9054C96";
      this._tokenContract.methods.transfer(account, 500).send({from: account, gas:10000},function (err, result) {
        if(err != null) {
          reject(err);
        }
        resolve(result);
      });
    }) as Promise<any>;
  } 
}

Мой код файла app.component.ts

import { Component } from '@angular/core';
import {Web3ServiceService} from './service/web3-service.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  public balance: number;
  public result:any;
  status: string;

  constructor(private cs: Web3ServiceService) {
    cs.getUserBalance().then(balance => this.balance = balance);

  }

  setStatus = message => {
    this.status = message;
  };

}

Я не знаю, как использовать SendAFC()функцию в компоненте

Пожалуйста, если мой код слишком запутан, я буду благодарен, если вы просто скажете мне, как сделать перевод между двумя учетными записями, используя Web3 и angular.

заранее спасибо

Какую ошибку вы получаете, когда пытаетесь вызвать sendAFC()?
Я даже не звонил, я не знаю, как это сделать, я думаю, мой код испорчен, поэтому я просто ищу решение для передачи токенов между двумя учетными записями.
Я использую трюфель и получаю много аби, какой мне следует использовать? это код, который я использую для своего токена. github.com/bokkypoobah/…

Ответы (1)

Для чего вы используете аккаунт2? Похоже, вы пытаетесь перевести 500 токенов на ту же учетную запись, которая вызывает транзакцию ( account ).

учетная запись, открытая в Metamask, — это учетная запись администратора, которая содержит пару токенов, учетная запись2 — это еще одна учетная запись, которую я создал в метамаске. getBalance работает и возвращает количество токенов, хранящихся у администратора, но я не знаю, как передать эти токены от администратора на account2, мне нужен метод или код... спасибо!
При вызове метода вы указываете from:account, а также отправляете токены на аккаунт. Таким образом, в основном вы отправляете токены с одной и той же учетной записи, поэтому вы можете не видеть никакой разницы в балансе токенов.
я исправил это, есть кнопка, которая выполняет функцию sendToken(), когда я нажимаю на нее, это код sendToken() ----------------------- -------------------------------------------------- ---- sendToken(){ console.log("start") this.cs.sendAFC().then(result => this.result = result); console.log(этот.результат); } -------------------------------------------------- ---------------------------- Но у меня ошибка
Я не могу опубликовать всю ошибку в комментарии, но она начинается с core.js: 1598 ERROR Error: Uncaught (in promise): TypeError: невозможно прочитать «передача» свойства неопределенного TypeError: невозможно прочитать «передача свойства» неопределенного. в web3.service.ts:104 в новом ZoneAwarePromise (zone.js:891) в Web3Service.<anonymous> (web3.service.ts:101) в шаге (app.module.ts:16) в Object.next (приложение .module.ts:16) при выполнении (app.module.ts:16) в ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:388) в Object. onInvoke (core.js:4062)