UNPKG

debitisimpedit

Version:

adapte eos and eth, and adapte pluin - MateMask and Scatter

225 lines (191 loc) 6.4 kB
// import { Web3 } from 'web3' namespace eth { export class EthApi extends base.CustomApi { protected _web3: Web3 | undefined protected _web3_browser: Web3 | undefined protected _netId: string protected _config: EthSetting protected _account: string | undefined protected _contractMap: { [name: string]: Web3.Contract<any> } protected _contractBMap: { [name: string]: Web3.Contract<any> } // protected net_changed_cbk: Function | undefined // public onNetChanged(cbk: Function) { // this.net_changed_cbk = cbk // } public constructor(core: any, config: EthSetting, mode: string) { super(core, mode) this._config = config this._netId = '' this._contractMap = {} this._contractBMap = {} const win: any = window const ethereum = win['ethereum'] const _Web3 = core if (ethereum) { this._web3 = new _Web3(ethereum) this.requireIdentity() } this._web3_browser = new _Web3(new _Web3.providers.HttpProvider(this._config.contractURL)) const contracts = this._config.contracts instanceof Array ? this._config.contracts : [this._config.contracts] for (let contract of contracts) { this._web3 && (this._contractMap[contract.name] = this._web3.eth.contract(contract.data).at(contract.address)) this._web3_browser && (this._contractMap[contract.name] = this._web3_browser.eth.contract(contract.data).at(contract.address)) } } public async requireIdentity() { const win: any = window const ethereum = win['ethereum'] if (!ethereum) return try { await ethereum.enable() } catch (e) { this.onError(base.ErrorCode.MissIdentity, e) } } protected updateStatus() { super.updateStatus() if (!this.isInitPlugin()) { const win: any = window const ethereum = win['ethereum'] const _Web3 = this.core if (ethereum) { this._web3 = new _Web3(ethereum) this._web3_browser = new _Web3(new _Web3.providers.HttpProvider(this._config.contractURL)) this.requireIdentity() } } let web3 = this._web3 if (!web3) return // 检查网络状态 web3.version.getNetwork((err: Error, netId: string) => { if (netId !== this._netId) { // this.net_changed_cbk && this.net_changed_cbk(netId, this._netId) this.invorkEvent(EthEvent.NET_CHANGED, { netId: netId, oldNetId: this._netId }) this._netId = netId } err && this.onError(base.ErrorCode.NetError, err) }) // 检查账号是否切换 web3.eth.getAccounts((err, res) => { // 检查是否切换账户 if (res.length === 0) { return } const account = res[0] if (account !== this._account) { // this.account_changed_cbk && this.account_changed_cbk(account, this._account) this.invorkEvent(base.BaseEvent.ACCOUNT_CHANGED, { account: account, oldAccount: this._account }) this._account = account } err && this.onError(base.ErrorCode.AccountError, err) }) } public getSymbol(): string { return base.SymbolType.eth } // eos或者eth public plugin(): string { return 'MateMask' } // 插件名称 public usePlugin(): boolean { return true } // 是否使用插件 public isInitPlugin(): boolean { return this._web3 !== undefined } // 插件是否初始化了 public hasAccount(): boolean { return this._account !== undefined } // 是否有账号 public defaultAccount(): string { return this._web3 ? this._web3.eth.defaultAccount : '' } // 获取默认账号 public check(): boolean { if (this.isInitPlugin()) { this.onError(base.ErrorCode.PluginNotInit) return false } else if (this.hasAccount()) { this.onError(base.ErrorCode.AccountNotFound) return false } else if (!this._netId) { this.onError(base.ErrorCode.NetNotReady) return false } return true } public getBalance() { const self = this return new Promise<number>((resolve, reject) => { if (!self._web3) { resolve(0) return } self._web3.eth.getBalance(this.defaultAccount(), (err: Error, result: BigNumber) => { resolve(err ? 0 : result.toNumber()) }) }) } protected getGasPrice(): Promise<number> { const self = this return new Promise((resolve, reject) => { if (!self._web3) { resolve(1) return } self._web3.eth.getGasPrice((err: Error, res: BigNumber) => { resolve(err ? 1 : res.toNumber()) }) }) } public hexCharCodeToStr(hexCharCodeStr: string): string { if (!hexCharCodeStr) return '' let trimedStr = hexCharCodeStr.trim() let rawStr = trimedStr.substr(0, 2).toLowerCase() === '0x' ? trimedStr.substr(2) : trimedStr let len = rawStr.length if (len % 2 !== 0) { console.warn('Illegal Format ASCII Code!') return '' } let curCharCode const resultStr = new Array<string>() for (let i = 0; i < len; i = i + 2) { curCharCode = parseInt(rawStr.substr(i, 2), 16) // ASCII Code Value let char: string = String.fromCharCode(curCharCode) if (char !== '\u0000') resultStr.push(char) } return resultStr.join('') } public format2Eth(wei: BigNumber) { let num: number = wei ? wei.toNumber() : 0 return num / Math.pow(10, 18) } public getTransactionReceiptByHash(hash: string) { const self = this return new Promise<Web3.TransactionReceipt>((resolve, reject) => { if (!hash) { reject() return } if (!self._web3) { reject() return } self._web3.eth.getTransactionReceipt(hash, (err: Error, receipt: Web3.TransactionReceipt) => { if (err) { reject(err) } else { resolve(receipt) } }) }) } public addEvent(name: string, cbk: Function): void { // todo } } }