Press n or j to go to the next uncovered block, b, p or k for the previous block.
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 | 7x 6x 6x 58x 20x 20x 20x 9x 9x 9x 7x 7x 6x 6x 6x 9x 15x 124x 124x 124x 9x 9x 9x 9x | /** * @file contract * @author atom-yang */ // eslint-disable-next-line max-classes-per-file import * as protobuf from '@aelfqueen/protobufjs'; import ContractMethod from './contractMethod'; import { noop } from '../util/utils'; import { deserializeLog } from '../util/proto'; const getServicesFromFileDescriptors = descriptors => { const root = protobuf.Root.fromDescriptor(descriptors, 'proto3').resolveAll(); return descriptors.file .filter(f => f.service.length > 0) .map(f => { const sn = f.service[0].name; const fullName = f.package ? `${f.package}.${sn}` : sn; return root.lookupService(fullName); }); }; class Contract { constructor(chain, services, address) { this._chain = chain; this.address = address; this.services = services; } deserializeLog(logs = [], logName) { const logInThisAddress = logs.filter(v => v.Address === this.address && v.Name === logName); return deserializeLog(logInThisAddress, this.services); } } export default class ContractFactory { constructor(chain, fileDescriptorSet, wallet) { this.chain = chain; this.services = getServicesFromFileDescriptors(fileDescriptorSet); this.wallet = wallet; } static bindMethodsToContract(contract, wallet) { contract.services.forEach(service => { Object.keys(service.methods).forEach(key => { const method = service.methods[key].resolve(); const contractMethod = new ContractMethod(contract._chain, method, contract.address, wallet); contractMethod.bindMethodToContract(contract); }); }); } at(address, callback = noop) { const contractInstance = new Contract(this.chain, this.services, address); ContractFactory.bindMethodsToContract(contractInstance, this.wallet); callback(null, contractInstance); return contractInstance; } } |