descent-js
Version:
A Typescript library for interacting with the Descent Protocol
137 lines (104 loc) • 3.92 kB
text/typescript
/**
* @dev Fuction to set an error message
* @param message Error object
* @returns The error message
*/
import { Signer, ethers } from 'ethers';
import ContractManager from '../contracts';
import { Transaction } from './transactions';
import { Internal } from './internal';
import { getContractAddress } from '../contracts/getContractAddresses';
import { Currency__factory, USDC__factory } from '../generated';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const createError = (message?: any) => {
const defaultMsg =
message && typeof message === 'string'
? message
: 'Something went wrong. Please try again later.';
const contractErrorMessage =
message?.error?.body && JSON.parse(message?.error?.body)?.error?.message;
const systemMessage = message?.errorArgs?.[0];
const contractRevertErrorMessage =
message?.error?.error?.body && JSON.parse(message?.error?.error?.body)?.error?.message;
return new Error(
contractErrorMessage || contractRevertErrorMessage || systemMessage || defaultMsg,
);
};
const approveUSDC = async (
spender: string,
amount: string,
signer: Signer,
transaction: Transaction,
internal: Internal,
) => {
const chainId = (await signer?.provider?.getNetwork())?.chainId.toString();
const owner = await signer.getAddress();
// build transaction object
const to: any = getContractAddress('USDC')[chainId!];
let iface = internal.getInterface(USDC__factory.abi);
const data = iface.encodeFunctionData('approve', [spender, amount]);
const txConfig = await internal.getTransactionConfig({
from: owner,
to,
data: data,
});
await transaction.send(txConfig, {});
await waitTime(50);
};
const waitTime = (seconds: number) => new Promise((resolve) => setTimeout(resolve, seconds * 1000));
const updateTestPrice = async (signer: Signer) => {
const chainId = (await signer?.provider?.getNetwork())?.chainId.toString();
const collateralAddress: any = getContractAddress('USDC')[chainId!];
const feedContractAddress: any = getContractAddress('Feed')[chainId!];
const contract = new ContractManager(signer);
await (await contract.getVaultContract()).updateFeedContract(feedContractAddress);
await waitTime(50);
const price = BigInt(1100) * BigInt(1e6);
const priceUpdate = (await contract.getFeedContract()).mockUpdatePrice(collateralAddress, price);
(await priceUpdate).wait();
await waitTime(50);
};
const setMinterRole = async (signer: Signer, owner: string) => {
const chainId = (await signer?.provider?.getNetwork())?.chainId.toString();
const vaultContractAddress: any = getContractAddress('Vault')[chainId!];
const contract = new ContractManager(signer);
await (await contract.getCurrencyContract()).setMinterRole(vaultContractAddress);
await waitTime(50);
};
const getxNGNBalance = async (owner: any, signer?: Signer) => {
const contract = new ContractManager(signer!);
const balance = await (await contract.getCurrencyContract()).balanceOf(owner);
await waitTime(50);
return balance * BigInt(10e18);
};
const approvexNGN = async (
spender: string,
amount: string,
signer: Signer,
transaction: Transaction,
internal: Internal,
) => {
const chainId = (await signer?.provider?.getNetwork())?.chainId.toString();
const owner = await signer.getAddress();
const _amount = BigInt(amount) * BigInt(10e18);
// build transaction object
const to: any = getContractAddress('Currency')[chainId!];
let iface = internal.getInterface(Currency__factory.abi);
const data = iface.encodeFunctionData('approve', [spender, _amount]);
const txConfig = await internal.getTransactionConfig({
from: owner,
to,
data: data,
});
await transaction.send(txConfig, {});
await waitTime(50);
};
export {
createError,
approveUSDC,
waitTime,
updateTestPrice,
getxNGNBalance,
setMinterRole,
approvexNGN,
};