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
¿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 ).
Zack McGinnis
Monir Ilyass
shantanu chandra