web3.service.ts 2.87 KB
Newer Older
XFT-dev's avatar
XFT-dev committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
import Web3 from 'web3';
import SlpAbi from '../../../../assets/json/contracts/SLP.json';
import StakingAbi from '../../../../assets/json/contracts/STAKING.json';
import OnsenAbi from '../../../../assets/json/contracts/ONSEN.json';
import {
    ETHEREUM,
    METAMASK_ERRORS,
    METAMASK_LINK,
    WEB3,
    STAKING_CONTRACT_ADDRESS_MAIN_NET, ONSEN_CONTRACT_ADDRESS_MAIN_NET, SLP_TOKEN_ADDRESS_MAIN_NET, INFURA_PROVIDER_ADDRESS
} from '../../dictionaries/meta-mask.dictionary';
import {from, Observable, throwError} from 'rxjs';
import {catchError, map} from 'rxjs/operators';
import {Contract} from 'web3-eth-contract';

export class Web3Service {

    private messageResult: string;

    constructor() {}

    public isMetaMaskInstalled(): boolean {
        return !!window[ETHEREUM];
    }

    public connectToMetaMask(): Observable<string> {
        if (!this.isMetaMaskInstalled()) {
            window.open(METAMASK_LINK, '_blank');
            return throwError(METAMASK_ERRORS.notInstalled);
        }
        window[WEB3] = new Web3(window[ETHEREUM]);
        return from(this.setMetamaskProvider())
            .pipe(
                map((accounts) => accounts[0]),
                catchError(() => {
                    return throwError(METAMASK_ERRORS.noAccount);
                }));
    }

    public setMetamaskProvider(): Promise<any> {
        window[WEB3] = new Web3(window[ETHEREUM]);
        return window[ETHEREUM].enable();
    }

    public setInfuraProvider(): Promise<void> {
        return new Promise((resolve) => {
            window[WEB3] = new Web3(new Web3.providers.HttpProvider(INFURA_PROVIDER_ADDRESS));
            resolve();
        });
    }

    public loadBlockChainData(): Promise<string> {
        return new Promise((resolve, reject) => {
            const web3 = window[WEB3];
            const account = web3.eth.getAccounts();
            if (account !== undefined) {
                resolve(account);
            } else {
                this.messageResult = METAMASK_ERRORS.noAccount;
                reject(this.messageResult);
            }
        });
    }

    public getStakingContract(): Promise<Contract> {
        return new Promise((resolve) => {
            const web3 = window[WEB3];
            const contract = new web3.eth.Contract(StakingAbi, STAKING_CONTRACT_ADDRESS_MAIN_NET);
            resolve(contract);
        });
    }

    public getOnsenContract(): Promise<Contract> {
        return new Promise((resolve) => {
            const web3 = window[WEB3];
            const contract = new web3.eth.Contract(OnsenAbi, ONSEN_CONTRACT_ADDRESS_MAIN_NET);
            resolve(contract);
        });
    }

    public getSlpContract(): Promise<Contract> {
        return new Promise((resolve) => {
            const web3 = window[WEB3];
            const contract = new web3.eth.Contract(SlpAbi, SLP_TOKEN_ADDRESS_MAIN_NET);
            resolve(contract);
        });
    }
}