UNPKG

@celo/contractkit

Version:

Celo's ContractKit to interact with Celo network

209 lines 9.7 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.proxySend = exports.proxyCall = exports.tupleParser = exports.stringIdentity = exports.identity = exports.solidityBytesToString = exports.bufferToSolidityBytes = exports.stringToSolidityBytes = exports.unixSecondsTimestampToDateString = exports.blocksToDurationString = exports.secondsToDurationString = exports.valueToFrac = exports.valueToInt = exports.valueToFixidityString = exports.valueToString = exports.fixidityValueToBigNumber = exports.valueToBigNumber = exports.BaseWrapper = void 0; const address_1 = require("@celo/base/lib/address"); const collections_1 = require("@celo/base/lib/collections"); const connect_1 = require("@celo/connect"); const fixidity_1 = require("@celo/utils/lib/fixidity"); const bignumber_js_1 = __importDefault(require("bignumber.js")); const versions_1 = require("../versions"); /** * @internal -- use its children */ class BaseWrapper { constructor(connection, contract) { this.connection = connection; this.contract = contract; this.events = this.contract.events; this.eventTypes = Object.keys(this.events).reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: key })), {}); this.methodIds = Object.keys(this.contract.methods).reduce((acc, method) => { const methodABI = this.contract.options.jsonInterface.find((item) => item.name === method); acc[method] = methodABI === undefined ? '0x' : this.connection.getAbiCoder().encodeFunctionSignature(methodABI); return acc; }, {}); } /** Contract address */ get address() { return this.contract.options.address; } version() { return __awaiter(this, void 0, void 0, function* () { if (!this._version) { const raw = yield this.contract.methods.getVersionNumber().call(); // @ts-ignore conditional type this._version = versions_1.ContractVersion.fromRaw(raw); } return this._version; }); } onlyVersionOrGreater(version) { return __awaiter(this, void 0, void 0, function* () { if (!(yield this.version()).isAtLeast(version)) { throw new Error(`Bytecode version ${this._version} is not compatible with ${version} yet`); } }); } /** Contract getPastEvents */ getPastEvents(event, options) { return this.contract.getPastEvents(event, options); } } exports.BaseWrapper = BaseWrapper; const valueToBigNumber = (input) => new bignumber_js_1.default(input); exports.valueToBigNumber = valueToBigNumber; const fixidityValueToBigNumber = (input) => (0, fixidity_1.fromFixed)(new bignumber_js_1.default(input)); exports.fixidityValueToBigNumber = fixidityValueToBigNumber; const valueToString = (input) => (0, exports.valueToBigNumber)(input).toFixed(); exports.valueToString = valueToString; const valueToFixidityString = (input) => (0, fixidity_1.toFixed)((0, exports.valueToBigNumber)(input)).toFixed(); exports.valueToFixidityString = valueToFixidityString; const valueToInt = (input) => (0, exports.valueToBigNumber)(input).integerValue().toNumber(); exports.valueToInt = valueToInt; const valueToFrac = (numerator, denominator) => (0, exports.valueToBigNumber)(numerator).div((0, exports.valueToBigNumber)(denominator)); exports.valueToFrac = valueToFrac; var TimeDurations; (function (TimeDurations) { TimeDurations[TimeDurations["millennium"] = 31536000000000] = "millennium"; TimeDurations[TimeDurations["century"] = 3153600000000] = "century"; TimeDurations[TimeDurations["decade"] = 315360000000] = "decade"; TimeDurations[TimeDurations["year"] = 31536000000] = "year"; TimeDurations[TimeDurations["quarter"] = 7776000000] = "quarter"; TimeDurations[TimeDurations["month"] = 2592000000] = "month"; TimeDurations[TimeDurations["week"] = 604800000] = "week"; TimeDurations[TimeDurations["day"] = 86400000] = "day"; TimeDurations[TimeDurations["hour"] = 3600000] = "hour"; TimeDurations[TimeDurations["minute"] = 60000] = "minute"; TimeDurations[TimeDurations["second"] = 1000] = "second"; TimeDurations[TimeDurations["millisecond"] = 1] = "millisecond"; })(TimeDurations || (TimeDurations = {})); // taken mostly from https://gist.github.com/RienNeVaPlus/024de3431ae95546d60f2acce128a7e2 function secondsToDurationString(durationSeconds, outputUnits = ['year', 'month', 'week', 'day', 'hour', 'minute', 'second']) { let durationMilliseconds = (0, exports.valueToBigNumber)(durationSeconds) .times(TimeDurations.second) .toNumber(); if (durationMilliseconds <= 0) { return 'past'; } const durations = outputUnits.reduce((res, key) => { const unitDuration = TimeDurations[key]; const value = Math.floor(durationMilliseconds / unitDuration); durationMilliseconds -= value * unitDuration; return res.set(key, value); }, new Map()); let s = ''; durations.forEach((value, unit) => { if (value > 0) { s += s !== '' ? ', ' : ''; s += `${value} ${unit}${value > 1 ? 's' : ''}`; } }); return s; } exports.secondsToDurationString = secondsToDurationString; const blocksToDurationString = (input) => secondsToDurationString((0, exports.valueToBigNumber)(input).times(5)); // TODO: fetch blocktime exports.blocksToDurationString = blocksToDurationString; const DATE_TIME_OPTIONS = { year: 'numeric', month: 'short', weekday: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', timeZoneName: 'short', }; const unixSecondsTimestampToDateString = (input) => { const date = new Date((0, exports.valueToInt)(input) * TimeDurations.second); return Intl.DateTimeFormat('default', DATE_TIME_OPTIONS).format(date); }; exports.unixSecondsTimestampToDateString = unixSecondsTimestampToDateString; const stringToSolidityBytes = (input) => (0, address_1.ensureLeading0x)(input); exports.stringToSolidityBytes = stringToSolidityBytes; const bufferToSolidityBytes = (input) => (0, exports.stringToSolidityBytes)((0, address_1.bufferToHex)(input)); exports.bufferToSolidityBytes = bufferToSolidityBytes; const solidityBytesToString = (input) => { if (input === null || input === undefined || typeof input === 'string') { return input; } else if (Array.isArray(input)) { const hexString = input.reduce((acc, num) => acc + num.toString(16).padStart(2, '0'), ''); return (0, address_1.ensureLeading0x)(hexString); } else { throw new Error('Unexpected input type for solidity bytes'); } }; exports.solidityBytesToString = solidityBytesToString; /** Identity Parser */ const identity = (a) => a; exports.identity = identity; const stringIdentity = (x) => x; exports.stringIdentity = stringIdentity; function tupleParser(...parsers) { return (...args) => (0, collections_1.zip)((parser, input) => parser(input), parsers, args); } exports.tupleParser = tupleParser; function proxyCall(...callArgs) { if (callArgs.length === 3 && callArgs[1] != null) { const methodFn = callArgs[0]; const parseInputArgs = callArgs[1]; const parseOutput = callArgs[2]; return (...args) => methodFn(...parseInputArgs(...args)) .call() .then(parseOutput); } else if (callArgs.length === 3) { const methodFn = callArgs[0]; const parseOutput = callArgs[2]; return (...args) => methodFn(...args) .call() .then(parseOutput); } else if (callArgs.length === 2) { const methodFn = callArgs[0]; const parseInputArgs = callArgs[1]; return (...args) => methodFn(...parseInputArgs(...args)).call(); } else { const methodFn = callArgs[0]; return (...args) => methodFn(...args).call(); } } exports.proxyCall = proxyCall; /** * Creates a proxy to send a tx on a web3 native contract method. * * There are 2 cases: * - call methodFn (no pre or post parsing) * - preParse arguments & call methodFn * * @param methodFn Web3 methods function * @param preParse [optional] preParse function, tranforms arguments into `methodFn` expected inputs */ function proxySend(connection, ...sendArgs) { if (sendArgs.length === 2) { const methodFn = sendArgs[0]; const preParse = sendArgs[1]; return (...args) => (0, connect_1.toTransactionObject)(connection, methodFn(...preParse(...args))); } else { const methodFn = sendArgs[0]; return (...args) => (0, connect_1.toTransactionObject)(connection, methodFn(...args)); } } exports.proxySend = proxySend; //# sourceMappingURL=BaseWrapper.js.map