mirror of
				https://github.com/Instadapp/aave-protocol-v2.git
				synced 2024-07-29 21:47:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			238 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { TestEnv, SignerWithAddress } from './make-suite';
 | 
						|
import {
 | 
						|
  mint,
 | 
						|
  approve,
 | 
						|
  deposit,
 | 
						|
  borrow,
 | 
						|
  withdraw,
 | 
						|
  repay,
 | 
						|
  setUseAsCollateral,
 | 
						|
  swapBorrowRateMode,
 | 
						|
  rebalanceStableBorrowRate,
 | 
						|
  delegateBorrowAllowance,
 | 
						|
} from './actions';
 | 
						|
import { RateMode } from '../../../helpers/types';
 | 
						|
 | 
						|
export interface Action {
 | 
						|
  name: string;
 | 
						|
  args?: any;
 | 
						|
  expected: string;
 | 
						|
  revertMessage?: string;
 | 
						|
}
 | 
						|
 | 
						|
export interface Story {
 | 
						|
  description: string;
 | 
						|
  actions: Action[];
 | 
						|
}
 | 
						|
 | 
						|
export interface Scenario {
 | 
						|
  title: string;
 | 
						|
  description: string;
 | 
						|
  stories: Story[];
 | 
						|
}
 | 
						|
 | 
						|
export const executeStory = async (story: Story, testEnv: TestEnv) => {
 | 
						|
  for (const action of story.actions) {
 | 
						|
    const { users } = testEnv;
 | 
						|
    await executeAction(action, users, testEnv);
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
const executeAction = async (action: Action, users: SignerWithAddress[], testEnv: TestEnv) => {
 | 
						|
  const { reserve, user: userIndex, borrowRateMode } = action.args;
 | 
						|
  const { name, expected, revertMessage } = action;
 | 
						|
 | 
						|
  if (!name || name === '') {
 | 
						|
    throw 'Action name is missing';
 | 
						|
  }
 | 
						|
  if (!reserve || reserve === '') {
 | 
						|
    throw 'Invalid reserve selected for deposit';
 | 
						|
  }
 | 
						|
  if (!userIndex || userIndex === '') {
 | 
						|
    throw `Invalid user selected to deposit into the ${reserve} reserve`;
 | 
						|
  }
 | 
						|
 | 
						|
  if (!expected || expected === '') {
 | 
						|
    throw `An expected resut for action ${name} is required`;
 | 
						|
  }
 | 
						|
 | 
						|
  let rateMode: string = RateMode.None;
 | 
						|
 | 
						|
  if (borrowRateMode) {
 | 
						|
    if (borrowRateMode === 'none') {
 | 
						|
      rateMode = RateMode.None;
 | 
						|
    } else if (borrowRateMode === 'stable') {
 | 
						|
      rateMode = RateMode.Stable;
 | 
						|
    } else if (borrowRateMode === 'variable') {
 | 
						|
      rateMode = RateMode.Variable;
 | 
						|
    } else {
 | 
						|
      //random value, to test improper selection of the parameter
 | 
						|
      rateMode = '4';
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  const user = users[parseInt(userIndex)];
 | 
						|
 | 
						|
  switch (name) {
 | 
						|
    case 'mint':
 | 
						|
      const { amount } = action.args;
 | 
						|
 | 
						|
      if (!amount || amount === '') {
 | 
						|
        throw `Invalid amount of ${reserve} to mint`;
 | 
						|
      }
 | 
						|
 | 
						|
      await mint(reserve, amount, user);
 | 
						|
      break;
 | 
						|
 | 
						|
    case 'approve':
 | 
						|
      await approve(reserve, user, testEnv);
 | 
						|
      break;
 | 
						|
 | 
						|
    case 'deposit':
 | 
						|
      {
 | 
						|
        const { amount, sendValue, onBehalfOf: onBehalfOfIndex } = action.args;
 | 
						|
        const onBehalfOf = onBehalfOfIndex
 | 
						|
          ? users[parseInt(onBehalfOfIndex)].address
 | 
						|
          : user.address;
 | 
						|
 | 
						|
        if (!amount || amount === '') {
 | 
						|
          throw `Invalid amount to deposit into the ${reserve} reserve`;
 | 
						|
        }
 | 
						|
 | 
						|
        await deposit(
 | 
						|
          reserve,
 | 
						|
          amount,
 | 
						|
          user,
 | 
						|
          onBehalfOf,
 | 
						|
          sendValue,
 | 
						|
          expected,
 | 
						|
          testEnv,
 | 
						|
          revertMessage
 | 
						|
        );
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    case 'delegateBorrowAllowance':
 | 
						|
      {
 | 
						|
        const { amount, toUser: toUserIndex } = action.args;
 | 
						|
        const toUser = users[parseInt(toUserIndex, 10)].address;
 | 
						|
        if (!amount || amount === '') {
 | 
						|
          throw `Invalid amount to deposit into the ${reserve} reserve`;
 | 
						|
        }
 | 
						|
 | 
						|
        await delegateBorrowAllowance(
 | 
						|
          reserve,
 | 
						|
          amount,
 | 
						|
          rateMode,
 | 
						|
          user,
 | 
						|
          toUser,
 | 
						|
          expected,
 | 
						|
          testEnv,
 | 
						|
          revertMessage
 | 
						|
        );
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    case 'withdraw':
 | 
						|
      {
 | 
						|
        const { amount } = action.args;
 | 
						|
 | 
						|
        if (!amount || amount === '') {
 | 
						|
          throw `Invalid amount to withdraw from the ${reserve} reserve`;
 | 
						|
        }
 | 
						|
 | 
						|
        await withdraw(reserve, amount, user, expected, testEnv, revertMessage);
 | 
						|
      }
 | 
						|
      break;
 | 
						|
    case 'borrow':
 | 
						|
      {
 | 
						|
        const { amount, timeTravel, onBehalfOf: onBehalfOfIndex } = action.args;
 | 
						|
 | 
						|
        const onBehalfOf = onBehalfOfIndex
 | 
						|
          ? users[parseInt(onBehalfOfIndex)].address
 | 
						|
          : user.address;
 | 
						|
 | 
						|
        if (!amount || amount === '') {
 | 
						|
          throw `Invalid amount to borrow from the ${reserve} reserve`;
 | 
						|
        }
 | 
						|
 | 
						|
        await borrow(
 | 
						|
          reserve,
 | 
						|
          amount,
 | 
						|
          rateMode,
 | 
						|
          user,
 | 
						|
          onBehalfOf,
 | 
						|
          timeTravel,
 | 
						|
          expected,
 | 
						|
          testEnv,
 | 
						|
          revertMessage
 | 
						|
        );
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    case 'repay':
 | 
						|
      {
 | 
						|
        const { amount, borrowRateMode, sendValue } = action.args;
 | 
						|
        let { onBehalfOf: onBehalfOfIndex } = action.args;
 | 
						|
 | 
						|
        if (!amount || amount === '') {
 | 
						|
          throw `Invalid amount to repay into the ${reserve} reserve`;
 | 
						|
        }
 | 
						|
 | 
						|
        let userToRepayOnBehalf: SignerWithAddress;
 | 
						|
        if (!onBehalfOfIndex || onBehalfOfIndex === '') {
 | 
						|
          console.log(
 | 
						|
            'WARNING: No onBehalfOf specified for a repay action. Defaulting to the repayer address'
 | 
						|
          );
 | 
						|
          userToRepayOnBehalf = user;
 | 
						|
        } else {
 | 
						|
          userToRepayOnBehalf = users[parseInt(onBehalfOfIndex)];
 | 
						|
        }
 | 
						|
 | 
						|
        await repay(
 | 
						|
          reserve,
 | 
						|
          amount,
 | 
						|
          rateMode,
 | 
						|
          user,
 | 
						|
          userToRepayOnBehalf,
 | 
						|
          sendValue,
 | 
						|
          expected,
 | 
						|
          testEnv,
 | 
						|
          revertMessage
 | 
						|
        );
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    case 'setUseAsCollateral':
 | 
						|
      {
 | 
						|
        const { useAsCollateral } = action.args;
 | 
						|
 | 
						|
        if (!useAsCollateral || useAsCollateral === '') {
 | 
						|
          throw `A valid value for useAsCollateral needs to be set when calling setUseReserveAsCollateral on reserve ${reserve}`;
 | 
						|
        }
 | 
						|
        await setUseAsCollateral(reserve, user, useAsCollateral, expected, testEnv, revertMessage);
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    case 'swapBorrowRateMode':
 | 
						|
      await swapBorrowRateMode(reserve, user, rateMode, expected, testEnv, revertMessage);
 | 
						|
      break;
 | 
						|
 | 
						|
    case 'rebalanceStableBorrowRate':
 | 
						|
      {
 | 
						|
        const { target: targetIndex } = action.args;
 | 
						|
 | 
						|
        if (!targetIndex || targetIndex === '') {
 | 
						|
          throw `A target must be selected when trying to rebalance a stable rate`;
 | 
						|
        }
 | 
						|
        const target = users[parseInt(targetIndex)];
 | 
						|
 | 
						|
        await rebalanceStableBorrowRate(reserve, user, target, expected, testEnv, revertMessage);
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    default:
 | 
						|
      throw `Invalid action requested: ${name}`;
 | 
						|
  }
 | 
						|
};
 |