UNPKG

@aarc-dev/core

Version:

464 lines 23.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AarcCore = void 0; const Logger_1 = require("./utils/Logger"); const CoreTypes_1 = require("./utils/CoreTypes"); const Helper_1 = require("./utils/Helper"); const ethers_1 = require("ethers"); const Constants_1 = require("./utils/Constants"); const Permit2BatchTransfer_abi_1 = require("./utils/abis/Permit2BatchTransfer.abi"); const utils_1 = require("./utils"); class AarcCore { constructor(apiKey, isDebug = false) { this.apiKey = apiKey; Logger_1.Logger.isDebug = isDebug; } /** * @description this function will return balances of ERC-20, ERC-721 and native tokens * @param balancesDto * @returns */ async fetchBalances(eoaAddress, chainId, fetchBalancesOnly = true, tokenAddresses) { return (0, Helper_1.fetchBalances)(this.apiKey, chainId, eoaAddress, fetchBalancesOnly, tokenAddresses); } async fetchMultiChainBalances(eoaAddress, extendedBalances = false) { return await (0, Helper_1.getMultiChainBalances)(this.apiKey, eoaAddress, extendedBalances); } async isTokenSupported(chainId, tokenAddress) { return await (0, Helper_1.IsTokenSupported)(this.apiKey, chainId, tokenAddress); } async getSupportedTokens(chainId) { return await (0, Helper_1.GetSupportedTokens)(this.apiKey, chainId); } async getSupportedChains() { return await (0, Helper_1.GetSupportedChains)(this.apiKey); } async executeMigration(executeMigrationNonGaslessDto) { var _a; const { senderSigner, receiverAddress, chainId } = executeMigrationNonGaslessDto; let { transferTokenDetails } = executeMigrationNonGaslessDto; let executionResultSet = []; let owner = await senderSigner.getAddress(); const requestBody = { chainId: chainId.toString(), owner, receiverAddress, tokensList: transferTokenDetails !== null && transferTokenDetails !== void 0 ? transferTokenDetails : [], }; const gaslessResponse = await (0, Helper_1.generateNonGaslessCallData)(requestBody, this.apiKey); const trxList = gaslessResponse.data; if (trxList) { for (let index = 0; index < trxList.length; index++) { const element = trxList[index]; if (element.code === 400) { executionResultSet.push({ tokenInfo: [ { tokenAddress: element.tokenAddress[0], amount: element.amount, }, ], type: element.txType, taskId: "", status: element.message, txHash: "", }); } if (element.txType === CoreTypes_1.PERMIT_TX_TYPES.PERMIT2_BATCH) { const eip712Struct = element.eip712Struct; const { domain, types, value } = eip712Struct; const dataSet = JSON.parse(element.data); const signature = await senderSigner.signTypedData(domain, types, value); let tokenInfo = []; dataSet.permitBatchTransferFrom.permitted.map((token) => tokenInfo.push({ tokenAddress: token.token, amount: token.amount, })); try { // Create a contract instance with the ABI and contract address. const permit2BatchContract = new ethers_1.ethers.Contract(Constants_1.PERMIT2_CONTRACT_ADDRESS, Permit2BatchTransfer_abi_1.PERMIT2_BATCH_TRANSFER_ABI, senderSigner); const trx = await permit2BatchContract.permitTransferFrom(dataSet.permitBatchTransferFrom, dataSet.tokenPermissions, dataSet.owner, signature); executionResultSet.push({ tokenInfo, type: element.txType, taskId: "", status: "transaction sent", txHash: trx ? (typeof trx.hash === "string" ? trx.hash : "") : "", }); } catch (error) { executionResultSet.push({ tokenInfo, type: element.txType, taskId: "", status: error.toString(), txHash: "", }); } } else { let trx = undefined; if (element.code === 200) { try { trx = await senderSigner.sendTransaction({ to: element.target, value: element.txType === CoreTypes_1.PERMIT_TX_TYPES.NATIVE ? (BigInt(element.amount) / BigInt(100)) * BigInt(80) : "0x0", data: element.data, }); executionResultSet.push({ tokenInfo: [ { tokenAddress: element.tokenAddress[0], amount: element.amount, }, ], type: element.txType, taskId: "", status: element.message.includes("Insufficient") ? element.message : "transfer success", txHash: trx ? typeof trx.hash === "string" ? trx.hash : "" : "", }); } catch (error) { executionResultSet.push({ tokenInfo: [ { tokenAddress: element.tokenAddress[0], amount: element.amount, }, ], type: element.txType, taskId: "", status: (_a = error.toString()) !== null && _a !== void 0 ? _a : "transfer failed", txHash: "", }); } } } } } return executionResultSet; } async performDeposit(depositDto) { var _a, _b, _c; let callDataResultSet = []; const { senderSigner, ...depositCallDataDto } = depositDto; let networkId = null; if (senderSigner.provider) { const network = await senderSigner.provider.getNetwork(); if (network) { networkId = Number(network.chainId); } } if (networkId && networkId !== depositDto.fromChainId) { throw new Error('Invalid signer, conflicting chainId'); } const depositResonse = await (0, Helper_1.generateDepositCallData)(depositCallDataDto, this.apiKey); const approvalTxs = depositResonse.data.approvalTxs; const executionTxs = depositResonse.data.executionTxs; for (let index = 0; index < approvalTxs.length; index++) { const element = approvalTxs[index]; let trx = undefined; try { trx = await senderSigner.sendTransaction({ to: element.approvalTokenAddress, data: element.callData, value: "0x00", gasLimit: (_a = element.gasLimit) !== null && _a !== void 0 ? _a : undefined, }); callDataResultSet.push({ tokenInfo: [ { tokenAddress: element.approvalTokenAddress, amount: element.minimumApprovalAmount, }, ], type: CoreTypes_1.PERMIT_TX_TYPES.ERC20_APPROVAL, taskId: "", status: "Tx Sent", txHash: trx.hash, }); } catch (error) { throw new Error(error); } } for (let index = 0; index < executionTxs.length; index++) { const element = executionTxs[index]; let trx = undefined; try { trx = await senderSigner.sendTransaction({ to: element.txTarget, data: (_b = element.txData) !== null && _b !== void 0 ? _b : "0x", value: element.value, gasLimit: (_c = element.gasLimit) !== null && _c !== void 0 ? _c : undefined, }); callDataResultSet.push({ tokenInfo: [ { tokenAddress: depositDto.fromTokenAddress, amount: depositDto.fromAmount, }, ], type: CoreTypes_1.PERMIT_TX_TYPES.DEPOSIT, taskId: "", status: "Tx Sent", txHash: trx ? (typeof trx.hash === "string" ? trx.hash : "") : "", }); } catch (error) { Logger_1.Logger.error("Error:", error); callDataResultSet.push({ tokenInfo: [ { tokenAddress: depositDto.fromTokenAddress, amount: depositDto.fromAmount, }, ], type: CoreTypes_1.PERMIT_TX_TYPES.DEPOSIT, taskId: "", status: error.toString(), txHash: "", }); } } return callDataResultSet; } async executeMigrationForward(executeMigrationForwardDto) { const response = []; let resultSet = []; let callDataResultSet = []; try { const { senderSigner, receiverAddress, chainId } = executeMigrationForwardDto; let { transferTokenDetails } = executeMigrationForwardDto; const requestBody = { chainId: chainId.toString(), owner: await senderSigner.getAddress(), receiverAddress, tokensList: transferTokenDetails, }; const forwardCallResponse = await (0, Helper_1.generateForwardCallData)(requestBody, this.apiKey); Logger_1.Logger.log(JSON.stringify(forwardCallResponse)); const forwardTrxList = forwardCallResponse.forwardCallDataResponse; if (forwardTrxList) { for (let index = 0; index < forwardTrxList.length; index++) { const element = forwardTrxList[index]; if (element.txType === CoreTypes_1.PERMIT_TX_TYPES.PERMIT) { // Sign the EIP-712 message const eip712Struct = element.eip712Struct; const { domain, types, value } = eip712Struct; const signature = await senderSigner.signTypedData(domain, types, value); const dataSet = JSON.parse(element.data); dataSet.signature = signature; element.data = JSON.stringify(dataSet); } else if (element.txType === CoreTypes_1.PERMIT_TX_TYPES.PERMIT2_BATCH) { const eip712Struct = element.eip712Struct; const { domain, types, value } = eip712Struct; const signature = await senderSigner.signTypedData(domain, types, value); const dataSet = JSON.parse(element.data); dataSet.signature = signature; element.data = JSON.stringify(dataSet); } } try { const finalForwardTrxList = forwardTrxList.filter((list) => list.code === 200); const errorResultSet = forwardTrxList.filter((list) => list.code === 400); for (let index = 0; index < errorResultSet.length; index++) { const element = errorResultSet[index]; callDataResultSet.push({ tokenInfo: [ { tokenAddress: element.tokenAddress[0], amount: element.amount, }, ], type: element.txType, taskId: "", status: element.message, txHash: "", }); } resultSet = await (0, Helper_1.executeForwardCallData)(chainId.toString(), { forwardCallDataResponse: finalForwardTrxList, txIndexes: forwardCallResponse.txIndexes, }, this.apiKey); } catch (error) { Logger_1.Logger.error("Error:", error); } } Logger_1.Logger.log(JSON.stringify(response)); return callDataResultSet.concat(resultSet); } catch (error) { // Handle any errors that occur during the migration process Logger_1.Logger.error("Migration Error:", error); throw error; } } async executeMigrationGasless(executeMigrationGaslessDto) { // const response: MigrationResponse[] = []; let exResultSet, executionResultSet = []; try { const { senderSigner, receiverAddress, chainId } = executeMigrationGaslessDto; let { transferTokenDetails } = executeMigrationGaslessDto; let owner = await senderSigner.getAddress(); const requestBody = { chainId: chainId.toString(), owner, receiverAddress, tokensList: transferTokenDetails !== null && transferTokenDetails !== void 0 ? transferTokenDetails : [], }; const gaslessResponse = await (0, Helper_1.generateGaslessCallData)(requestBody, this.apiKey); Logger_1.Logger.log(JSON.stringify(gaslessResponse)); const resultSet = gaslessResponse.data; for (let index = 0; index < resultSet.length; index++) { const element = resultSet[index]; if (element.code === 200) { if (element.txType === CoreTypes_1.PERMIT_TX_TYPES.PERMIT) { // Sign the EIP-712 message const eip712Struct = element.eip712Struct; const { domain, types, value } = eip712Struct; const signature = await senderSigner.signTypedData(domain, types, value); const dataSet = JSON.parse(element.data); dataSet.signature = signature; element.data = JSON.stringify(dataSet); } else if (element.txType === CoreTypes_1.PERMIT_TX_TYPES.PERMIT2_SINGLE) { const eip712Struct = element.eip712Struct; const { domain, types, value } = eip712Struct; const signature = await senderSigner.signTypedData(domain, types, value); const dataSet = JSON.parse(element.data); dataSet.signature = signature; element.data = JSON.stringify(dataSet); } else if (element.txType === CoreTypes_1.PERMIT_TX_TYPES.PERMIT2_BATCH) { const eip712Struct = element.eip712Struct; const { domain, types, value } = eip712Struct; const signature = await senderSigner.signTypedData(domain, types, value); const dataSet = JSON.parse(element.data); dataSet.signature = signature; element.data = JSON.stringify(dataSet); } else { let trx = undefined; if (!element.message.includes("Insufficient")) { trx = await senderSigner.sendTransaction({ to: element.target, value: element.txType === CoreTypes_1.PERMIT_TX_TYPES.NATIVE ? (BigInt(element.amount) / BigInt(100)) * BigInt(80) : "0x0", data: element.data, }); } executionResultSet.push({ tokenInfo: [ { tokenAddress: element.tokenAddress[0], amount: element.amount, }, ], type: element.txType, taskId: "", status: element.message.includes("Insufficient") ? element.message : "transfer success", txHash: trx ? (typeof trx.hash === "string" ? trx.hash : "") : "", }); } } } const finalResultSet = resultSet.filter((list) => list.code === 200); const errorResultSet = resultSet.filter((list) => list.code === 400); for (let index = 0; index < errorResultSet.length; index++) { const element = errorResultSet[index]; executionResultSet.push({ tokenInfo: [ { tokenAddress: element.tokenAddress[0], amount: element.amount, }, ], type: element.txType, taskId: "", status: element.message, txHash: "", }); } exResultSet = await (0, Helper_1.executeGaslessCallData)(chainId.toString(), finalResultSet, this.apiKey); } catch (error) { // Handle any errors that occur during the migration process Logger_1.Logger.error("Migration Error:", error); throw error; } Logger_1.Logger.log(JSON.stringify(executionResultSet)); return executionResultSet.concat(exResultSet); } async getTransactionStatus(taskId) { return (0, Helper_1.GetTransactionStatus)(taskId); } async generateDepositOnrampUrl(onrampData) { var _a; try { onrampData.exchangeScreenTitle = (_a = onrampData.exchangeScreenTitle) === null || _a === void 0 ? void 0 : _a.replace(/ /g, "%20"); if (onrampData.chainId in utils_1.OnrampDepositChains) { const url = `${Constants_1.ONRAMP_BASE_URL}?env=${CoreTypes_1.OnRampEnv.PRODUCTION}&mode=${CoreTypes_1.OnRampMode.DEPOSIT}&network=${utils_1.OnrampDepositChains[onrampData.chainId]}&walletAddress=${onrampData.walletAddress}&exchangeScreenTitle=${onrampData.exchangeScreenTitle}&aarcApiKey=${this.apiKey}&customerId=${onrampData.customerId}&cryptoCurrencyList=${onrampData.cryptoCurrencyList}&networks=${onrampData.networks}&defaultNetwork=${onrampData.defaultNetwork}&cryptoTokenData=${JSON.stringify(onrampData.cryptoTokenData)}&fiatAmount=${onrampData.fiatAmount}&fiatCurrencyCode=${onrampData.fiatCurrencyCode}&countryCode=${onrampData.countryCode}`; return url; } else { throw new Error("Unsupported chainId"); } } catch (error) { Logger_1.Logger.error("Generate onramp url error: ", error); throw error; } } async generateCheckoutOnrampUrl(onrampData) { var _a; try { onrampData.exchangeScreenTitle = (_a = onrampData.exchangeScreenTitle) === null || _a === void 0 ? void 0 : _a.replace(/ /g, "%20"); var env; var network; if (onrampData.chainId in utils_1.OnrampMainnetCheckoutChains) { env = CoreTypes_1.OnRampEnv.PRODUCTION; network = utils_1.OnrampMainnetCheckoutChains[onrampData.chainId]; } else if (onrampData.chainId in utils_1.OnrampTestnetCheckoutChains) { env = CoreTypes_1.OnRampEnv.STAGING; network = utils_1.OnrampTestnetCheckoutChains[onrampData.chainId]; } else { throw new Error("Unsupported chainId"); } const url = `${Constants_1.ONRAMP_BASE_URL}?env=${env}&mode=${CoreTypes_1.OnRampMode.CHECKOUT}&network=${network}&walletAddress=${onrampData.walletAddress}&estimatedGasLimit=${onrampData.estimatedGasLimit}&smartContractAddress=${onrampData.smartContractAddress}&sourceTokenData=${JSON.stringify(onrampData.sourceTokenData)}&calldata=${onrampData.callData}&cryptoCurrencyData=${JSON.stringify(onrampData.cryptoCurrencyData)}&aarcApiKey=${this.apiKey}&customerId=${onrampData.customerId}`; return url; } catch (error) { Logger_1.Logger.error("Generate onramp url error: ", error); throw error; } } async generateMoonpayOnrampUrl(onrampData) { try { const url = `${Constants_1.ONRAMP_BASE_URL}?aarcApiKey=${this.apiKey}&walletAddress=${onrampData.walletAddress}&fiatCurrencyCode=${onrampData.fiatCurrencyCode}&fiatAmount=${onrampData.fiatAmount}&defaultCryptoCurrencyCode=${onrampData.defaultCryptoCurrencyCode}&cryptoTokenData=${JSON.stringify(onrampData.cryptoTokenData || {})}&platform=moonpay`; return url; } catch (error) { Logger_1.Logger.error("Generate onramp url error: ", error); throw error; } } } exports.AarcCore = AarcCore; exports.default = AarcCore; //# sourceMappingURL=AarcCore.js.map