Я пытаюсь создать простое приложение для передачи токенов, используя 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.
заранее спасибо
Для чего вы используете аккаунт2? Похоже, вы пытаетесь перевести 500 токенов на ту же учетную запись, которая вызывает транзакцию ( account ).
Зак МакГиннис
Мунир Ильяс
Шантану Чандра