UNPKG

@firefly-exchange/firefly-client

Version:

The Firefly Client Library allows traders to sign, create, retrieve and listen to orders on Firefly Exchange.

190 lines 12.8 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.closePositionCall = exports.depositToMarginBankContractCall = exports.approvalFromUSDCContractCall = exports.withdrawFromMarginBankContractCall = exports.adjustMarginContractCall = exports.setSubAccount = exports.adjustLeverageContractCallRawTransaction = exports.adjustLeverageContractCall = void 0; const library_1 = require("@firefly-exchange/library"); const ethers_1 = require("ethers"); const constants_1 = require("../constants"); const contractErrorHandling_service_1 = require("./contractErrorHandling.service"); //@ts-ignore const interpolate_1 = __importDefault(require("interpolate")); const adjustLeverageContractCall = (perpContract, wallet, leverage, gasLimit, networkName, getPublicAddress) => __awaiter(void 0, void 0, void 0, function* () { const contract = (0, library_1.mapContract)(networkName, library_1.FactoryName.perpetual, perpContract).connect(wallet); //estimate gas in case of ARBITRUM network because it doesn't work on max block gas limit if (networkName == library_1.NETWORK_NAME.arbitrum) { gasLimit = (+(yield contract.estimateGas.adjustLeverage(getPublicAddress(), (0, library_1.toBigNumberStr)(leverage)))) + constants_1.EXTRA_FEES; } return (0, contractErrorHandling_service_1.TransformToResponseSchema)(() => __awaiter(void 0, void 0, void 0, function* () { const tx = yield contract.adjustLeverage(getPublicAddress(), (0, library_1.toBigNumberStr)(leverage), { gasLimit, }); if (wallet instanceof ethers_1.Wallet) { return tx.wait(); } return tx; }), (0, interpolate_1.default)(contractErrorHandling_service_1.SuccessMessages.adjustLeverage, { leverage })); }); exports.adjustLeverageContractCall = adjustLeverageContractCall; const adjustLeverageContractCallRawTransaction = (perpContract, wallet, //expecting only Wallet because raw transaction creation is not supported by Metamask leverage, gasLimit, networkName, getPublicAddress) => __awaiter(void 0, void 0, void 0, function* () { const contract = (0, library_1.mapContract)(networkName, library_1.FactoryName.perpetual, perpContract).connect(wallet); //estimate gas in case of ARBITRUM network because it doesn't work on max block gas limit if (networkName == library_1.NETWORK_NAME.arbitrum) { gasLimit = (+(yield contract.estimateGas.adjustLeverage(getPublicAddress(), (0, library_1.toBigNumberStr)(leverage)))) + constants_1.EXTRA_FEES; } const provider = new ethers_1.ethers.providers.JsonRpcProvider(constants_1.Networks.TESTNET_ARBITRUM.url); const to = contract.address; const data = contract.interface.encodeFunctionData('adjustLeverage', [getPublicAddress(), (0, library_1.toBigNumberStr)(leverage)]); const nonce = yield provider.getTransactionCount(yield wallet.getAddress(), 'latest'); //this address should be sub account address if he's making adjust leverage for parent address const gasPrice = yield provider.getGasPrice(); try { const rawTx = { to, data, nonce, gasLimit, gasPrice, chainId: constants_1.Networks.TESTNET_ARBITRUM.chainId }; const signedTransaction = yield wallet.signTransaction(rawTx); return signedTransaction; } catch (e) { throw e; } }); exports.adjustLeverageContractCallRawTransaction = adjustLeverageContractCallRawTransaction; const setSubAccount = (perpContract, publicAddress, status, wallet, gasLimit, networkName) => __awaiter(void 0, void 0, void 0, function* () { const contract = (0, library_1.mapContract)(networkName, library_1.FactoryName.perpetual, perpContract).connect(wallet); if (networkName == library_1.NETWORK_NAME.arbitrum) { gasLimit = (+(yield contract.estimateGas.setSubAccount(publicAddress, status))) + constants_1.EXTRA_FEES; } return (0, contractErrorHandling_service_1.TransformToResponseSchema)(() => __awaiter(void 0, void 0, void 0, function* () { const tx = yield contract.setSubAccount(publicAddress, status, { gasLimit, }); if (wallet instanceof ethers_1.Wallet) { return tx.wait(); } return tx; }), (0, interpolate_1.default)(contractErrorHandling_service_1.SuccessMessages.setSubAccounts, { address: publicAddress, status: status ? "added" : "removed" })); }); exports.setSubAccount = setSubAccount; const adjustMarginContractCall = (operationType, perpContract, wallet, amount, gasLimit, networkName, getPublicAddress) => __awaiter(void 0, void 0, void 0, function* () { const contract = (0, library_1.mapContract)(networkName, library_1.FactoryName.perpetual, perpContract).connect(wallet); //estimate gas in case of ARBITRUM network because it doesn't work on max block gas limit if (networkName == library_1.NETWORK_NAME.arbitrum) { if (operationType == library_1.ADJUST_MARGIN.Add) { gasLimit = (+(yield contract.estimateGas.addMargin(getPublicAddress(), (0, library_1.toBigNumberStr)(amount)))) + constants_1.EXTRA_FEES; } else { gasLimit = (+(yield contract.estimateGas.removeMargin(getPublicAddress(), (0, library_1.toBigNumberStr)(amount)))) + constants_1.EXTRA_FEES; } } const msg = operationType === library_1.ADJUST_MARGIN.Add ? contractErrorHandling_service_1.SuccessMessages.adjustMarginAdd : contractErrorHandling_service_1.SuccessMessages.adjustMarginRemove; return (0, contractErrorHandling_service_1.TransformToResponseSchema)(() => __awaiter(void 0, void 0, void 0, function* () { // ADD margin if (operationType === library_1.ADJUST_MARGIN.Add) { const tx = yield contract .addMargin(getPublicAddress(), (0, library_1.toBigNumberStr)(amount), { gasLimit: gasLimit, }); if (wallet instanceof ethers_1.Wallet) { return tx.wait(); } return tx; } // REMOVE margin else { const tx = yield contract .removeMargin(getPublicAddress(), (0, library_1.toBigNumberStr)(amount), { gasLimit: gasLimit, }); if (wallet instanceof ethers_1.Wallet) { return tx.wait(); } return tx; } }), (0, interpolate_1.default)(msg, { amount: amount.toFixed(constants_1.DEFAULT_PRECISION) })); }); exports.adjustMarginContractCall = adjustMarginContractCall; const withdrawFromMarginBankContractCall = (marginBankContract, MarginTokenPrecision, wallet, gasLimit, networkName, getMarginBankBalance, getPublicAddress, amount) => __awaiter(void 0, void 0, void 0, function* () { let amountNumber = amount; return (0, contractErrorHandling_service_1.TransformToResponseSchema)(() => __awaiter(void 0, void 0, void 0, function* () { const mbContract = (0, library_1.mapContract)(networkName, library_1.FactoryName.marginBank, marginBankContract); if (!amount) { // get all margin bank balance when amount not provided by user amountNumber = yield getMarginBankBalance((mbContract).address); } const amountString = (0, library_1.toBigNumberStr)(amountNumber, MarginTokenPrecision); const contract = mbContract.connect(wallet); //estimate gas in case of ARBITRUM network because it doesn't work on max block gas limit if (networkName == library_1.NETWORK_NAME.arbitrum) { gasLimit = (+(yield contract.estimateGas.withdrawFromBank(getPublicAddress(), amountString))) + constants_1.EXTRA_FEES; } return (yield contract.withdrawFromBank(getPublicAddress(), amountString, { gasLimit: gasLimit, })).wait(); }), (0, interpolate_1.default)(contractErrorHandling_service_1.SuccessMessages.withdrawMargin, { amount: amountNumber === null || amountNumber === void 0 ? void 0 : amountNumber.toFixed(constants_1.DEFAULT_PRECISION) })); }); exports.withdrawFromMarginBankContractCall = withdrawFromMarginBankContractCall; const approvalFromUSDCContractCall = (tokenContract, marginBankContract, amount, MarginTokenPrecision, wallet, gasLimit, networkName) => __awaiter(void 0, void 0, void 0, function* () { const amountString = (0, library_1.toBigNumberStr)(amount, MarginTokenPrecision); const contract = tokenContract.connect(wallet); const mbContract = (0, library_1.mapContract)(networkName, library_1.FactoryName.marginBank, marginBankContract); //estimate gas in case of ARBITRUM network because it doesn't work on max block gas limit if (networkName == library_1.NETWORK_NAME.arbitrum) { gasLimit = (+(yield contract.estimateGas.approve((mbContract).address, amountString))) + constants_1.EXTRA_FEES; } return (0, contractErrorHandling_service_1.TransformToResponseSchema)(() => __awaiter(void 0, void 0, void 0, function* () { return yield (yield contract .approve((mbContract).address, amountString, { gasLimit: gasLimit })).wait(); }), (0, interpolate_1.default)(contractErrorHandling_service_1.SuccessMessages.approveUSDC, { amount: amount.toFixed(constants_1.DEFAULT_PRECISION) })); }); exports.approvalFromUSDCContractCall = approvalFromUSDCContractCall; const depositToMarginBankContractCall = (tokenContract, marginBankContract, amount, MarginTokenPrecision, wallet, gasLimit, networkName, getPublicAddress) => __awaiter(void 0, void 0, void 0, function* () { const amountString = (0, library_1.toBigNumberStr)(amount, MarginTokenPrecision); return (0, contractErrorHandling_service_1.TransformToResponseSchema)(() => __awaiter(void 0, void 0, void 0, function* () { if (wallet instanceof ethers_1.Wallet) { yield (0, exports.approvalFromUSDCContractCall)(tokenContract, marginBankContract, amount, MarginTokenPrecision, wallet, gasLimit, networkName); } const contract = (0, library_1.mapContract)(networkName, library_1.FactoryName.marginBank, marginBankContract).connect(wallet); //estimate gas in case of ARBITRUM network because it doesn't work on max block gas limit if (networkName == library_1.NETWORK_NAME.arbitrum) { gasLimit = (+(yield contract.estimateGas.depositToBank(getPublicAddress(), amountString))) + constants_1.EXTRA_FEES; } // deposit `amount` usdc to margin bank return (yield contract .depositToBank(getPublicAddress(), amountString, { gasLimit: gasLimit, })).wait(); }), (0, interpolate_1.default)(contractErrorHandling_service_1.SuccessMessages.depositToBank, { amount: amount.toFixed(constants_1.DEFAULT_PRECISION) })); }); exports.depositToMarginBankContractCall = depositToMarginBankContractCall; const closePositionCall = (perpContract, wallet, gasLimit, networkName, getPublicAddress) => __awaiter(void 0, void 0, void 0, function* () { return (0, contractErrorHandling_service_1.TransformToResponseSchema)(() => __awaiter(void 0, void 0, void 0, function* () { const contract = (0, library_1.mapContract)(networkName, library_1.FactoryName.perpetual, perpContract).connect(wallet); //estimate gas in case of ARBITRUM network because it doesn't work on max block gas limit if (networkName == library_1.NETWORK_NAME.arbitrum) { gasLimit = ((+(yield contract.estimateGas.closePosition(getPublicAddress()))) * 2) + constants_1.EXTRA_FEES; } // close position of user return (yield contract .closePosition(getPublicAddress(), { gasLimit: gasLimit, })).wait(); }), (0, interpolate_1.default)(contractErrorHandling_service_1.SuccessMessages.positionClosed, { address: getPublicAddress() })); }); exports.closePositionCall = closePositionCall; //# sourceMappingURL=contractService.js.map