@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
JavaScript
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
;