UNPKG

airgap-coin-lib

Version:

The airgap-coin-lib is a protocol agnostic library to prepare, sign and broadcast cryptocurrency transactions.

302 lines 16.2 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; 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 __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); var bignumber_1 = require("../../../dependencies/src/bignumber.js-9.0.0/bignumber"); var hex_1 = require("../../../utils/hex"); var TezosProtocol_1 = require("../TezosProtocol"); var TezosUtils_1 = require("../TezosUtils"); var TezosOperationType_1 = require("../types/TezosOperationType"); var utils_1 = require("../types/utils"); var TezosFAProtocol_1 = require("./TezosFAProtocol"); var MichelsonAddress_1 = require("../types/michelson/primitives/MichelsonAddress"); var MichelsonPair_1 = require("../types/michelson/generics/MichelsonPair"); var MichelsonInt_1 = require("../types/michelson/primitives/MichelsonInt"); var TezosFA1ContractEntrypoint; (function (TezosFA1ContractEntrypoint) { TezosFA1ContractEntrypoint["BALANCE"] = "getBalance"; TezosFA1ContractEntrypoint["TRANSFER"] = "transfer"; TezosFA1ContractEntrypoint["TOTAL_SUPPLY"] = "getTotalSupply"; })(TezosFA1ContractEntrypoint || (TezosFA1ContractEntrypoint = {})); var TezosFA1Protocol = /** @class */ (function (_super) { __extends(TezosFA1Protocol, _super); function TezosFA1Protocol(options) { var _this = _super.call(this, options) || this; _this.defaultCallbackContractMap = new Map(); _this.defaultCallbackContractMap.set(TezosProtocol_1.TezosNetwork.MAINNET, 'KT19ptNzn4MVAN45KUUNpyL5AdLVhujk815u'); _this.defaultCallbackContractMap.set(TezosProtocol_1.TezosNetwork.DELPHINET, 'KT1FEfp83DLZkY6sc4x78n4BQp8hRszHwGBk'); return _this; } TezosFA1Protocol.prototype.getBalanceOfAddresses = function (addresses) { return __awaiter(this, void 0, void 0, function () { var promises, _i, addresses_1, address, results; return __generator(this, function (_a) { switch (_a.label) { case 0: promises = []; for (_i = 0, addresses_1 = addresses; _i < addresses_1.length; _i++) { address = addresses_1[_i]; promises.push(this.getBalance(address, this.defaultSourceAddress)); } return [4 /*yield*/, Promise.all(promises)]; case 1: results = _a.sent(); return [2 /*return*/, results.reduce(function (current, next) { return current.plus(new bignumber_1.default(next)); }, new bignumber_1.default(0)).toFixed()]; } }); }); }; TezosFA1Protocol.prototype.estimateFeeDefaultsFromPublicKey = function (publicKey, recipients, values, data) { return __awaiter(this, void 0, void 0, function () { var transferCalls, operations; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: // return this.feeDefaults if (recipients.length !== values.length) { throw new Error('length of recipients and values does not match!'); } return [4 /*yield*/, this.createTransferCalls(publicKey, recipients, values, this.feeDefaults.medium, data)]; case 1: transferCalls = _a.sent(); operations = transferCalls.map(function (transferCall) { return { kind: TezosOperationType_1.TezosOperationType.TRANSACTION, amount: '0', destination: _this.contractAddress, parameters: transferCall.toJSON(), fee: '0' }; }); return [2 /*return*/, this.estimateFeeDefaultsForOperations(publicKey, operations)]; } }); }); }; TezosFA1Protocol.prototype.prepareTransactionFromPublicKey = function (publicKey, recipients, values, fee, data) { return __awaiter(this, void 0, void 0, function () { var transferCalls; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.createTransferCalls(publicKey, recipients, values, fee, data)]; case 1: transferCalls = _a.sent(); return [2 /*return*/, this.prepareContractCall(transferCalls, fee, publicKey)]; } }); }); }; TezosFA1Protocol.prototype.transactionDetailsFromParameters = function (parameters) { var defaultDetails = { extra: { type: parameters.entrypoint } }; if (parameters.entrypoint !== TezosFA1ContractEntrypoint.TRANSFER) { console.warn('Only calls to the transfer entrypoint can be converted to IAirGapTransaction'); return [defaultDetails]; } try { var callArguments = MichelsonPair_1.MichelsonPair.from(parameters.value, function (fromJSON) { return MichelsonAddress_1.MichelsonAddress.from(fromJSON, 'from'); }, function (pairJSON) { return MichelsonPair_1.MichelsonPair.from(pairJSON, function (toJSON) { return MichelsonAddress_1.MichelsonAddress.from(toJSON, 'to'); }, function (valueJSON) { return MichelsonInt_1.MichelsonInt.from(valueJSON, 'value'); }); }).asRawValue(); if (!this.isTransferRequest(callArguments)) { return [defaultDetails]; } return [__assign(__assign({}, defaultDetails), { amount: callArguments.value.toFixed(), from: [hex_1.isHex(callArguments.from) ? TezosUtils_1.TezosUtils.parseAddress(callArguments.from) : callArguments.from], to: [hex_1.isHex(callArguments.to) ? TezosUtils_1.TezosUtils.parseAddress(callArguments.to) : callArguments.to] })]; } catch (_a) { return [defaultDetails]; } }; TezosFA1Protocol.prototype.getBalance = function (address, source, callbackContract) { if (callbackContract === void 0) { callbackContract = this.callbackContract(); } return __awaiter(this, void 0, void 0, function () { var getBalanceCall; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.contract.createContractCall(TezosFA1ContractEntrypoint.BALANCE, [{ owner: address }, callbackContract])]; case 1: getBalanceCall = _a.sent(); return [2 /*return*/, this.getContractCallIntResult(getBalanceCall, this.requireSource(source, address, 'kt'))]; } }); }); }; TezosFA1Protocol.prototype.getTotalSupply = function (source, callbackContract) { if (callbackContract === void 0) { callbackContract = this.callbackContract(); } return __awaiter(this, void 0, void 0, function () { var getTotalSupplyCall; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.contract.createContractCall(TezosFA1ContractEntrypoint.TOTAL_SUPPLY, [ [], callbackContract ])]; case 1: getTotalSupplyCall = _a.sent(); return [2 /*return*/, this.getContractCallIntResult(getTotalSupplyCall, this.requireSource(source))]; } }); }); }; TezosFA1Protocol.prototype.transfer = function (fromAddress, toAddress, amount, fee, publicKey) { return __awaiter(this, void 0, void 0, function () { var transferCall; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.contract.createContractCall(TezosFA1ContractEntrypoint.TRANSFER, { from: fromAddress, to: toAddress, value: new bignumber_1.default(amount).toNumber() })]; case 1: transferCall = _a.sent(); return [2 /*return*/, this.prepareContractCall([transferCall], fee, publicKey)]; } }); }); }; TezosFA1Protocol.prototype.fetchTokenHolders = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { // there is no standard way to fetch token holders for now, every subclass needs to implement its own logic return [2 /*return*/, []]; }); }); }; TezosFA1Protocol.prototype.getContractCallIntResult = function (transferCall, source) { return __awaiter(this, void 0, void 0, function () { var operationResult, _a; return __generator(this, function (_b) { switch (_b.label) { case 0: _b.trys.push([0, 2, , 3]); return [4 /*yield*/, this.runContractCall(transferCall, source)]; case 1: operationResult = _b.sent(); if (utils_1.isMichelinePrimitive('int', operationResult)) { return [2 /*return*/, operationResult.int]; } return [3 /*break*/, 3]; case 2: _a = _b.sent(); return [3 /*break*/, 3]; case 3: return [2 /*return*/, '0']; } }); }); }; TezosFA1Protocol.prototype.createTransferCalls = function (publicKey, recipients, values, fee, data) { return __awaiter(this, void 0, void 0, function () { var addressIndex, addresses, fromAddress, transferCalls, i, transferCall; return __generator(this, function (_a) { switch (_a.label) { case 0: if (recipients.length !== values.length) { throw new Error('length of recipients and values does not match!'); } addressIndex = data && data.addressIndex !== undefined ? data.addressIndex : 0; return [4 /*yield*/, this.getAddressesFromPublicKey(publicKey)]; case 1: addresses = _a.sent(); if (!addresses[addressIndex]) { throw new Error('no kt-address with this index exists'); } fromAddress = addresses[addressIndex]; transferCalls = []; i = 0; _a.label = 2; case 2: if (!(i < recipients.length)) return [3 /*break*/, 5]; return [4 /*yield*/, this.contract.createContractCall(TezosFA1ContractEntrypoint.TRANSFER, { from: fromAddress, to: recipients[i], value: new bignumber_1.default(values[i]).toNumber() })]; case 3: transferCall = _a.sent(); transferCalls.push(transferCall); _a.label = 4; case 4: i++; return [3 /*break*/, 2]; case 5: return [2 /*return*/, transferCalls]; } }); }); }; TezosFA1Protocol.prototype.callbackContract = function () { var _a; return _a = this.defaultCallbackContractMap.get(this.options.network.extras.network), (_a !== null && _a !== void 0 ? _a : ''); }; TezosFA1Protocol.prototype.isTransferRequest = function (obj) { var anyObj = obj; return (anyObj instanceof Object && typeof anyObj.from === 'string' && typeof anyObj.to === 'string' && bignumber_1.default.isBigNumber(anyObj.value)); }; return TezosFA1Protocol; }(TezosFAProtocol_1.TezosFAProtocol)); exports.TezosFA1Protocol = TezosFA1Protocol; //# sourceMappingURL=TezosFA1Protocol.js.map