UNPKG

@andrekorol/kollateral

Version:

Typescript library for Kollateral, the flash loan building block

269 lines 14.2 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; 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 }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Kollateral = void 0; var bignumber_js_1 = require("bignumber.js"); var utils_1 = require("./util/utils"); var web3_1 = __importDefault(require("web3")); var network_1 = require("./static/network"); var invoker_1 = require("./static/invoker"); var tokens_1 = require("./static/tokens"); var ktokens_1 = require("./static/ktokens"); var Kollateral = /** @class */ (function () { function Kollateral(provider, config) { var _this = this; this._provider = provider; this._config = config; this._web3 = new web3_1.default(provider); var invokerAbi = require('./abi/Invoker.json').abi; this._invoker = new this._web3.eth.Contract(invokerAbi, config.invokerAddress); var kEtherAbi = require('./abi/KEther.json').abi; this._kEther = new this._web3.eth.Contract(kEtherAbi, config.network.tokens.get(tokens_1.Token.ETH).kTokenAddress); var kErc20Abi = require('./abi/KErc20.json').abi; this._kErc20s = new Map(); var kTokenAbi = require('./abi/KToken.json').abi; this._kTokens = new Map(); this._erc20Abi = require('./abi/TestToken.json').abi; config.network.tokens.forEach(function (config, token) { if (token != tokens_1.Token.ETH) { _this._kErc20s.set(config.kTokenAddress, new _this._web3.eth.Contract(kErc20Abi, config.kTokenAddress)); } _this._kTokens.set(config.kTokenAddress, new _this._web3.eth.Contract(kTokenAbi, config.kTokenAddress)); }); } Kollateral.init = function (provider) { return __awaiter(this, void 0, void 0, function () { var networkId, network, config; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, new web3_1.default(provider).eth.net.getId()]; case 1: networkId = _a.sent(); network = network_1.NetworkUtils.fromId(networkId); /* Fail if not a complete static config available for network */ if (!Kollateral.isSupportedNetwork(network)) { throw ("Unsupported Network"); } config = { invokerAddress: invoker_1.InvokerUtils.getAddress(network), network: { network: network, tokens: new Map(tokens_1.TokenUtils.getSupportedTokens(network) .map(function (token) { return [token, { tokenAddress: tokens_1.TokenUtils.getAddress(network, token), kTokenAddress: ktokens_1.KTokenUtils.getAddress(network, token) }]; })) } }; return [2 /*return*/, new Kollateral(provider, config)]; } }); }); }; Kollateral.isSupportedNetwork = function (network) { return ([network_1.Network.Ropsten, network_1.Network.Rinkeby, network_1.Network.Mainnet].includes(network)); }; /* KToken Supplying */ Kollateral.prototype.unlock = function (sender, kTokenAddress) { return this.unlockAmount(sender, kTokenAddress, Kollateral.MAX_UINT256); }; Kollateral.prototype.unlockAmount = function (sender, kTokenAddress, amount) { return __awaiter(this, void 0, void 0, function () { var tokenAddress; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this._kTokens.get(kTokenAddress).methods.underlying().call()]; case 1: tokenAddress = _a.sent(); return [2 /*return*/, this.tokenOf(tokenAddress).methods.approve(kTokenAddress, amount.toFixed()).send({ from: sender })]; } }); }); }; Kollateral.prototype.allowance = function (owner, kTokenAddress) { return __awaiter(this, void 0, void 0, function () { var tokenAddress; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this._kTokens.get(kTokenAddress).methods.underlying().call()]; case 1: tokenAddress = _a.sent(); return [2 /*return*/, this.tokenOf(tokenAddress).methods.allowance(owner, kTokenAddress).call().then(function (bn) { return utils_1.Utils.bnToBigNumber(bn); })]; } }); }); }; Kollateral.prototype.isUnlocked = function (owner, kTokenAddress) { return __awaiter(this, void 0, void 0, function () { var allowance; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.allowance(owner, kTokenAddress)]; case 1: allowance = _a.sent(); return [2 /*return*/, allowance.eq(Kollateral.MAX_UINT256)]; } }); }); }; Kollateral.prototype.mint = function (sender, kTokenAddress, amount) { if (this.isKEtherAddress(kTokenAddress)) { return this._kEther.methods.mint().send({ from: sender, value: amount.toFixed() }); } else { return this._kErc20s.get(kTokenAddress).methods.mint(amount.toFixed()).send({ from: sender }); } }; Kollateral.prototype.redeem = function (sender, kTokenAddress, amount) { return this._kTokens.get(kTokenAddress).methods.redeem(amount.toFixed()).send({ from: sender }); }; Kollateral.prototype.redeemUnderlying = function (sender, kTokenAddress, amount) { return this._kTokens.get(kTokenAddress).methods.redeemUnderlying(amount.toFixed()).send({ from: sender }); }; Kollateral.prototype.isKEtherAddress = function (kTokenAddress) { return kTokenAddress == this._config.network.tokens.get(tokens_1.Token.ETH).kTokenAddress; }; Kollateral.prototype.balanceOf = function (owner, tokenAddress) { return this.tokenOf(tokenAddress).methods.balanceOf(owner).call() .then(function (bn) { return utils_1.Utils.bnToBigNumber(bn); }); }; Kollateral.prototype.balanceOfUnderlying = function (owner, kTokenAddress) { return this._kTokens.get(kTokenAddress).methods.balanceOfUnderlying(owner).call() .then(function (bn) { return utils_1.Utils.bnToBigNumber(bn); }); }; Kollateral.prototype.underlyingAmountToNativeAmount = function (kTokenAddress, tokenAmount, ceiling) { if (ceiling === void 0) { ceiling = false; } return this._kTokens.get(kTokenAddress).methods.underlyingAmountToNativeAmount(tokenAmount.toFixed(), ceiling).call() .then(function (bn) { return utils_1.Utils.bnToBigNumber(bn); }); }; Kollateral.prototype.nativeAmountToUnderlyingAmount = function (kTokenAddress, kTokenAmount) { return this._kTokens.get(kTokenAddress).methods.nativeAmountToUnderlyingAmount(kTokenAmount.toFixed()).call() .then(function (bn) { return utils_1.Utils.bnToBigNumber(bn); }); }; Kollateral.prototype.totalSupply = function (tokenAddress) { return this.tokenOf(tokenAddress).methods.totalSupply().call() .then(function (bn) { return utils_1.Utils.bnToBigNumber(bn); }); }; Kollateral.prototype.totalReserve = function (kTokenAddress) { return this._kTokens.get(kTokenAddress).methods.totalReserve().call() .then(function (bn) { return utils_1.Utils.bnToBigNumber(bn); }); }; Kollateral.prototype.tokenOf = function (tokenAddress) { return new this._web3.eth.Contract(this._erc20Abi, tokenAddress); }; /* Invocation */ Kollateral.prototype.invoke = function (execution, tokenAmount, txOpt) { if (txOpt === void 0) { txOpt = {}; } return __awaiter(this, void 0, void 0, function () { var _a, tokenAddress; return __generator(this, function (_b) { switch (_b.label) { case 0: if (!(txOpt.from == undefined)) return [3 /*break*/, 2]; _a = txOpt; return [4 /*yield*/, this._web3.eth.getAccounts()]; case 1: _a.from = (_b.sent())[0]; _b.label = 2; case 2: txOpt.value = this.valueOrDefault(execution.value).toFixed(); tokenAddress = this.getTokenAddressOrThrow(tokenAmount.token); return [2 /*return*/, this._invoker.methods.invoke(execution.contract, this.dataOrDefault(execution.data), tokenAddress, utils_1.Utils.normalizeNumber(tokenAmount.amount).toFixed()).send(txOpt)]; } }); }); }; Kollateral.prototype.totalLiquidity = function (token) { var tokenAddress = this.getTokenAddressOrThrow(token); return this._invoker.methods.totalLiquidity(tokenAddress).call() .then(function (bn) { return utils_1.Utils.bnToBigNumber(bn); }); }; /* Testnet */ Kollateral.prototype.faucet = function (sender, tokenAmount) { var tokenAddress = this.getTokenAddressOrThrow(tokenAmount.token); var token = new this._web3.eth.Contract(this._erc20Abi, tokenAddress); return token.methods.mint(utils_1.Utils.normalizeNumber(tokenAmount.amount).toFixed()).send({ from: sender }); }; /* Private */ Kollateral.prototype.getTokenAddressOrThrow = function (token) { if (!tokens_1.TokenUtils.isSupportedToken(this._config.network.network, token)) { throw ("Unsupported token"); } return tokens_1.TokenUtils.getAddress(this._config.network.network, token); }; Kollateral.prototype.valueOrDefault = function (value) { return utils_1.Utils.normalizeNumber(value == undefined ? 0 : value); }; Kollateral.prototype.dataOrDefault = function (data) { return data == undefined ? [] : data; }; Kollateral.MAX_UINT256 = new bignumber_js_1.BigNumber('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', 16); return Kollateral; }()); exports.Kollateral = Kollateral; __exportStar(require("./static/tokens"), exports); __exportStar(require("./static/ktokens"), exports); __exportStar(require("./static/network"), exports); __exportStar(require("./static/invoker"), exports); //# sourceMappingURL=kollateral.js.map