diff --git a/hardhat-fork-polygon.config.ts b/hardhat-fork-polygon.config.ts index 61424b31..f27ad31e 100644 --- a/hardhat-fork-polygon.config.ts +++ b/hardhat-fork-polygon.config.ts @@ -9,8 +9,7 @@ export default { blockGasLimit: 20000000, // 20 million gasPrice: 5000000000, // 5 Gwei forking: { - url: "https://matic-mainnet-archive-rpc.bwarelabs.com", - blockNumber: 15510323, + url: process.env.NODE_URL || "https://matic-mainnet-archive-rpc.bwarelabs.com", }, }, }, diff --git a/hardhat.config.ts b/hardhat.config.ts index 844f9502..a5a7c991 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -37,13 +37,13 @@ export const hardhatConfig = { gasLimit: 8000000, }, polygon_testnet: { - url: "https://rpc-mumbai.maticvigil.com", + url: process.env.NODE_URL || "https://rpc-mumbai.maticvigil.com", }, polygon_mainnet: { - url: "https://rpc-mainnet.matic.quiknode.pro", + url: process.env.NODE_URL || "https://rpc-mainnet.matic.quiknode.pro", }, mainnet: { - url: process.env.NODE_URL || "", + url: process.env.NODE_URL || "https://main-light.eth.linkpool.io", }, }, solidity: { diff --git a/tasks/feeder.ts b/tasks/feeder.ts index 34e4008f..2ccb0e58 100644 --- a/tasks/feeder.ts +++ b/tasks/feeder.ts @@ -3,8 +3,8 @@ import "tsconfig-paths/register" import { task, types } from "hardhat/config" import { Signer } from "ethers" -import { FeederPool, FeederPool__factory, Masset } from "types/generated" -import { BN } from "@utils/math" +import { ERC20__factory, FeederPool, FeederPool__factory, IERC20__factory, Masset } from "types/generated" +import { BN, simpleToExactAmount } from "@utils/math" import { dumpConfigStorage, dumpFassetStorage, dumpTokenStorage } from "./utils/storage-utils" import { getMultiRedemptions, @@ -21,10 +21,11 @@ import { getSavingsManager, getCollectedInterest, } from "./utils/snap-utils" -import { Token, tokens } from "./utils/tokens" +import { PFRAX, PmUSD, Token, tokens } from "./utils/tokens" import { btcFormatter, QuantityFormatter, usdFormatter } from "./utils/quantity-formatters" import { getSwapRates } from "./utils/rates-utils" import { getSigner } from "./utils/defender-utils" +import { logTxDetails } from "./utils" const getBalances = async (mAsset: Masset | FeederPool, toBlock: number, asset: Token): Promise => { const mAssetBalance = await mAsset.totalSupply({ @@ -195,4 +196,24 @@ task("feeder-rates", "Feeder rate comparison to Curve") await snapConfig(feederPool, block.blockNumber) }) +task("frax-post-deploy", "Mint FRAX Feeder Pool").setAction(async (_, { ethers, network }) => { + const signer = await getSigner(network.name, ethers) + + const frax = ERC20__factory.connect(PFRAX.address, signer) + const fraxFp = FeederPool__factory.connect(PFRAX.feederPool, signer) + const musd = await IERC20__factory.connect(PmUSD.address, signer) + + const approveAmount = simpleToExactAmount(100) + const bAssetAmount = simpleToExactAmount(10) + const minAmount = simpleToExactAmount(9) + + let tx = await frax.approve(PFRAX.feederPool, approveAmount) + await logTxDetails(tx, "approve FRAX") + + tx = await musd.approve(PFRAX.feederPool, approveAmount) + await logTxDetails(tx, "approve mUSD") + + tx = await fraxFp.mintMulti([PFRAX.address, PmUSD.address], [bAssetAmount, bAssetAmount], minAmount, await signer.getAddress()) + await logTxDetails(tx, "mint FRAX FP") +}) module.exports = {} diff --git a/test-fork/feeders/feeders-frax.spec.ts b/test-fork/feeders/feeders-frax.spec.ts new file mode 100644 index 00000000..c9333f3d --- /dev/null +++ b/test-fork/feeders/feeders-frax.spec.ts @@ -0,0 +1,66 @@ +import { impersonateAccount } from "@utils/fork" +import { simpleToExactAmount } from "@utils/math" +import { expect } from "chai" +import { ethers, network } from "hardhat" +import { PFRAX, PmUSD } from "tasks/utils" +import { Account } from "types" +import { ERC20, ERC20__factory, FeederPool, FeederPool__factory, IERC20, IERC20__factory } from "types/generated" + +const accountAddress = "0xdccb7a6567603af223c090be4b9c83eced210f18" + +context("FRAX Feeder Pool on Polygon", () => { + let account: Account + let frax: ERC20 + let fraxFp: FeederPool + let musd: IERC20 + + before("reset block number", async () => { + await network.provider.request({ + method: "hardhat_reset", + params: [ + { + forking: { + jsonRpcUrl: process.env.NODE_URL, + blockNumber: 16440763, + }, + }, + ], + }) + account = await impersonateAccount(accountAddress) + + frax = ERC20__factory.connect(PFRAX.address, account.signer) + fraxFp = FeederPool__factory.connect(PFRAX.feederPool, account.signer) + musd = await IERC20__factory.connect(PmUSD.address, account.signer) + }) + it("Test connectivity", async () => { + const currentBlock = await ethers.provider.getBlockNumber() + console.log(`Current block ${currentBlock}`) + const startEther = await account.signer.getBalance() + console.log(`Deployer ${account} has ${startEther} Ether`) + }) + it("Approve spend of FRAX", async () => { + expect(await frax.allowance(account.address, PFRAX.feederPool), "Allowance before").to.eq(0) + const approveAmount = simpleToExactAmount(20) + await frax.approve(PFRAX.feederPool, approveAmount) + expect(await frax.allowance(account.address, PFRAX.feederPool), "Allowance after").to.eq(approveAmount) + }) + it("Approve spend of mUSD", async () => { + expect(await musd.allowance(account.address, PFRAX.feederPool), "Allowance before").to.eq(0) + const approveAmount = simpleToExactAmount(21) + await musd.approve(PFRAX.feederPool, approveAmount) + expect(await musd.allowance(account.address, PFRAX.feederPool), "Allowance after").to.eq(approveAmount) + }) + it("Mint fraxFp", async () => { + const bAssetAmount = simpleToExactAmount(10) + const minAmount = simpleToExactAmount(9) + expect(await frax.balanceOf(account.address), "FRAX balance before").to.gt(bAssetAmount) + expect(await musd.balanceOf(account.address), "mUSD balance before").to.gt(bAssetAmount) + expect(await fraxFp.balanceOf(account.address), "fraxFp balance before").to.eq(0) + expect(await fraxFp.totalSupply(), "totalSupply before").to.eq(0) + + await fraxFp.mintMulti([PFRAX.address, PmUSD.address], [bAssetAmount, bAssetAmount], minAmount, account.address) + + expect(await fraxFp.balanceOf(account.address), "fraxFp balance after").to.gt(minAmount) + expect(await fraxFp.totalSupply(), "totalSupply after").to.gt(minAmount) + }) +})