Transferir token ERC20 usando Web3 y angular

Estoy tratando de hacer una aplicación de transferencia de token simple usando Web3.js y Angular, todo lo que quiero es transferir algunos tokens de una dirección A a una dirección B. Entonces, hice dos funciones en un servicio angular, la primera obtiene el saldo de la cuenta real (funciona) y el segundo hace la transferencia pero no funciona y no sé cómo usarlo. Estoy usando Metamask en Chrome y Web3 0.20.3 (angular 6.0.3)

este es mi codigo

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

Mi código de archivo 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;
  };

}

No sé cómo usar la SendAFC()función en el componente.

Por favor, si mi código está demasiado desordenado, le agradecería que me dijera cómo hacer la transferencia entre dos cuentas usando Web3 y angular.

gracias de antemano

¿Qué error recibe cuando intenta llamar a sendAFC() ?
Ni siquiera lo llamé, no sé cómo hacerlo, supongo que mi código está en mal estado, así que solo estoy buscando una solución para transferir tokens entre dos cuentas.
Estoy usando trufa y tengo muchos abi, ¿cuál debo usar? este es el código que estoy usando para mi token. github.com/bokkypoobah/…

Respuestas (1)

¿Para qué estás usando la cuenta 2? Parece que está intentando transferir 500 tokens a la misma cuenta llamando a la transacción ( cuenta ).

la cuenta abierta en Metamask es una cuenta de administrador que contiene un par de tokens, la cuenta 2 es la otra cuenta que creé en metamask. getBalance funciona y devuelve la cantidad de tokens que tiene el administrador, pero no sé cómo transferir esos tokens del administrador a la cuenta 2, necesito un método o un código... ¡gracias!
Al llamar al método que está especificando desde: cuenta, y también está enviando los tokens a la cuenta. Básicamente, está enviando los tokens desde y hacia la misma cuenta, por eso es posible que no vea ninguna diferencia en el saldo de tokens.
Lo arreglé, hay un botón que ejecuta una función sendToken() cuando hago clic en él, este es el código sendToken() -------------- -------------------------------------------------- ---- sendToken(){ console.log("start") this.cs.sendAFC().then(resultado => this.result = resultado); consola.log(este.resultado); } ------------------------------------------------- ---------------------------- pero tengo un error
No puedo publicar el error completo en el comentario, pero comienza con core.js: 1598 ERROR Error: no detectado (en promesa): TypeError: no se puede leer la propiedad 'transferir' de undefined TypeError: no se puede leer la propiedad 'transfer' de undefined. en web3.service.ts:104 en el nuevo ZoneAwarePromise (zone.js:891) en Web3Service.<anónimo> (web3.service.ts:101) en el paso (app.module.ts:16) en Object.next (app .module.ts:16) en cumplimiento (app.module.ts:16) en ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:388) en Object. onInvocar (core.js:4062)