@aarc-dev/core
Version:
464 lines • 23.2 kB
JavaScript
;
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