diff --git a/packages/blue-sdk-ethers/src/fetch/User.ts b/packages/blue-sdk-ethers/src/fetch/User.ts index 2681edba..f7d227e1 100644 --- a/packages/blue-sdk-ethers/src/fetch/User.ts +++ b/packages/blue-sdk-ethers/src/fetch/User.ts @@ -18,11 +18,14 @@ export async function fetchUser( chainId ?? (await runner.provider.getNetwork()).chainId, ); - const { morpho, bundler } = getChainAddresses(chainId); + const { + morpho, + bundler3: { generalAdapter1 }, + } = getChainAddresses(chainId); const blue = MorphoBlue__factory.connect(morpho, runner); const [isBundlerAuthorized, morphoNonce] = await Promise.all([ - blue.isAuthorized(address, bundler, overrides), + blue.isAuthorized(address, generalAdapter1, overrides), blue.nonce(address, overrides), ]); diff --git a/packages/blue-sdk-ethers/test/e2e/Holding.test.ts b/packages/blue-sdk-ethers/test/e2e/Holding.test.ts index 5964bf18..72514eee 100644 --- a/packages/blue-sdk-ethers/test/e2e/Holding.test.ts +++ b/packages/blue-sdk-ethers/test/e2e/Holding.test.ts @@ -11,8 +11,13 @@ import { maxUint256 } from "viem"; import { Holding } from "../../src/augment/Holding"; import { permit2Abi } from "./abis"; -const { morpho, bundler, permit2, wNative, wbC3M } = - addresses[ChainId.EthMainnet]; +const { + morpho, + bundler3: { generalAdapter1 }, + permit2, + wNative, + wbC3M, +} = addresses[ChainId.EthMainnet]; describe("augment/Holding", async () => { test("should fetch user WETH data ", async ({ client, wallet }) => { @@ -50,7 +55,7 @@ describe("augment/Holding", async () => { }); await client.approve({ address: wNative, - args: [bundler, expectedData.erc20Allowances.bundler], + args: [generalAdapter1, expectedData.erc20Allowances.bundler], }); await client.approve({ address: wNative, @@ -73,7 +78,7 @@ describe("augment/Holding", async () => { functionName: "approve", args: [ wNative, - bundler, + generalAdapter1, expectedData.permit2Allowances.bundler.amount, Number(expectedData.permit2Allowances.bundler.expiration), ], @@ -152,7 +157,7 @@ describe("augment/Holding", async () => { }); await client.approve({ address: wbC3M, - args: [bundler, expectedData.erc20Allowances.bundler], + args: [generalAdapter1, expectedData.erc20Allowances.bundler], }); await client.approve({ address: wbC3M, @@ -175,7 +180,7 @@ describe("augment/Holding", async () => { functionName: "approve", args: [ wbC3M, - bundler, + generalAdapter1, expectedData.permit2Allowances.bundler.amount, Number(expectedData.permit2Allowances.bundler.expiration), ], diff --git a/packages/blue-sdk-ethers/test/e2e/User.test.ts b/packages/blue-sdk-ethers/test/e2e/User.test.ts index 99a21f5f..7139e5e4 100644 --- a/packages/blue-sdk-ethers/test/e2e/User.test.ts +++ b/packages/blue-sdk-ethers/test/e2e/User.test.ts @@ -5,7 +5,10 @@ import { ChainId, addresses } from "@morpho-org/blue-sdk"; import { User } from "../../src/augment/User"; import { blueAbi } from "./abis"; -const { morpho, bundler } = addresses[ChainId.EthMainnet]; +const { + morpho, + bundler3: { generalAdapter1 }, +} = addresses[ChainId.EthMainnet]; describe("augment/User", () => { test("should fetch user data", async ({ client, wallet }) => { @@ -13,7 +16,7 @@ describe("augment/User", () => { address: morpho, abi: blueAbi, functionName: "setAuthorization", - args: [bundler, true], + args: [generalAdapter1, true], }); const expectedData = new User({ diff --git a/packages/blue-sdk-viem/src/fetch/Holding.ts b/packages/blue-sdk-viem/src/fetch/Holding.ts index d56b3d63..dec967bd 100644 --- a/packages/blue-sdk-viem/src/fetch/Holding.ts +++ b/packages/blue-sdk-viem/src/fetch/Holding.ts @@ -60,7 +60,11 @@ export async function fetchHolding( }); if (deployless) { - const { morpho, permit2, bundler } = addresses[parameters.chainId]; + const { + morpho, + permit2, + bundler3: { generalAdapter1 }, + } = addresses[parameters.chainId]; try { const { balance, @@ -79,7 +83,7 @@ export async function fetchHolding( user, morpho, permit2, - bundler, + generalAdapter1, permissionedBackedTokens[parameters.chainId].has(token), permissionedWrapperTokens[parameters.chainId].has(token), ], diff --git a/packages/blue-sdk-viem/src/fetch/User.ts b/packages/blue-sdk-viem/src/fetch/User.ts index 226594b7..909d97bc 100644 --- a/packages/blue-sdk-viem/src/fetch/User.ts +++ b/packages/blue-sdk-viem/src/fetch/User.ts @@ -14,7 +14,10 @@ export async function fetchUser( parameters.chainId ?? (await getChainId(client)), ); - const { morpho, bundler } = addresses[parameters.chainId]; + const { + morpho, + bundler3: { generalAdapter1 }, + } = addresses[parameters.chainId]; const [isBundlerAuthorized, morphoNonce] = await Promise.all([ readContract(client, { @@ -22,7 +25,7 @@ export async function fetchUser( address: morpho, abi: blueAbi, functionName: "isAuthorized", - args: [address, bundler], + args: [address, generalAdapter1], }), readContract(client, { ...parameters, diff --git a/packages/blue-sdk-viem/test/Holding.test.ts b/packages/blue-sdk-viem/test/Holding.test.ts index 75e6a96f..d08fdbe8 100644 --- a/packages/blue-sdk-viem/test/Holding.test.ts +++ b/packages/blue-sdk-viem/test/Holding.test.ts @@ -11,8 +11,13 @@ import { permit2Abi } from "../src"; import { Holding } from "../src/augment/Holding"; import { test } from "./setup"; -const { morpho, bundler, permit2, wNative, wbC3M } = - addresses[ChainId.EthMainnet]; +const { + morpho, + bundler3: { generalAdapter1 }, + permit2, + wNative, + wbC3M, +} = addresses[ChainId.EthMainnet]; describe("augment/Holding", () => { test("should fetch user WETH data with deployless", async ({ client }) => { @@ -50,7 +55,7 @@ describe("augment/Holding", () => { }); await client.approve({ address: wNative, - args: [bundler, expectedData.erc20Allowances.bundler], + args: [generalAdapter1, expectedData.erc20Allowances.bundler], }); await client.approve({ address: wNative, @@ -73,7 +78,7 @@ describe("augment/Holding", () => { functionName: "approve", args: [ wNative, - bundler, + generalAdapter1, expectedData.permit2Allowances.bundler.amount, Number(expectedData.permit2Allowances.bundler.expiration), ], @@ -119,7 +124,7 @@ describe("augment/Holding", () => { }); await client.approve({ address: wNative, - args: [bundler, expectedData.erc20Allowances.bundler], + args: [generalAdapter1, expectedData.erc20Allowances.bundler], }); await client.approve({ address: wNative, @@ -142,7 +147,7 @@ describe("augment/Holding", () => { functionName: "approve", args: [ wNative, - bundler, + generalAdapter1, expectedData.permit2Allowances.bundler.amount, Number(expectedData.permit2Allowances.bundler.expiration), ], @@ -225,7 +230,7 @@ describe("augment/Holding", () => { }); await client.approve({ address: wbC3M, - args: [bundler, expectedData.erc20Allowances.bundler], + args: [generalAdapter1, expectedData.erc20Allowances.bundler], }); await client.approve({ address: wbC3M, @@ -248,7 +253,7 @@ describe("augment/Holding", () => { functionName: "approve", args: [ wbC3M, - bundler, + generalAdapter1, expectedData.permit2Allowances.bundler.amount, Number(expectedData.permit2Allowances.bundler.expiration), ], @@ -297,7 +302,7 @@ describe("augment/Holding", () => { }); await client.approve({ address: wbC3M, - args: [bundler, expectedData.erc20Allowances.bundler], + args: [generalAdapter1, expectedData.erc20Allowances.bundler], }); await client.approve({ address: wbC3M, @@ -320,7 +325,7 @@ describe("augment/Holding", () => { functionName: "approve", args: [ wbC3M, - bundler, + generalAdapter1, expectedData.permit2Allowances.bundler.amount, Number(expectedData.permit2Allowances.bundler.expiration), ], diff --git a/packages/blue-sdk-viem/test/User.test.ts b/packages/blue-sdk-viem/test/User.test.ts index f00f50d3..8e56bd46 100644 --- a/packages/blue-sdk-viem/test/User.test.ts +++ b/packages/blue-sdk-viem/test/User.test.ts @@ -5,7 +5,10 @@ import { ChainId, addresses } from "@morpho-org/blue-sdk"; import { blueAbi } from "../src"; import { User } from "../src/augment/User"; -const { morpho, bundler } = addresses[ChainId.EthMainnet]; +const { + morpho, + bundler3: { generalAdapter1 }, +} = addresses[ChainId.EthMainnet]; describe("augment/User", () => { test("should fetch user data", async ({ client }) => { @@ -13,7 +16,7 @@ describe("augment/User", () => { address: morpho, abi: blueAbi, functionName: "setAuthorization", - args: [bundler, true], + args: [generalAdapter1, true], }); const expectedData = new User({ diff --git a/packages/bundler-sdk-viem/src/BundlerAction.ts b/packages/bundler-sdk-viem/src/BundlerAction.ts index fe318c2b..965f833a 100644 --- a/packages/bundler-sdk-viem/src/BundlerAction.ts +++ b/packages/bundler-sdk-viem/src/BundlerAction.ts @@ -2,21 +2,21 @@ import { aaveV2MigrationBundlerAbi, aaveV3MigrationBundlerAbi, aaveV3OptimizerMigrationBundlerAbi, + bundler3Abi, compoundV2MigrationBundlerAbi, compoundV3MigrationBundlerAbi, - erc20WrapperBundlerAbi, - erc4626BundlerAbi, - ethereumPermitBundlerAbi, - morphoBundlerAbi, - permit2BundlerAbi, - permitBundlerAbi, - stEthBundlerAbi, - transferBundlerAbi, - urdBundlerAbi, - wNativeBundlerAbi, + coreAdapterAbi, + daiPermitAbi, + generalAdapter1Abi, } from "./abis.js"; -import type { InputMarketParams } from "@morpho-org/blue-sdk"; +import { + ChainId, + type InputMarketParams, + addresses, + getChainAddresses, +} from "@morpho-org/blue-sdk"; +import { erc2612Abi, permit2Abi } from "@morpho-org/blue-sdk-viem"; import { type Address, type Hex, @@ -32,39 +32,80 @@ import type { Permit2PermitSingle, } from "./types/index.js"; -export type BundlerCall = Hex; +export interface BundlerCall { + to: Address; + data: Hex; + value: bigint; + skipRevert: boolean; + callbackHash: Hex; +} + +const { permit2, dai } = addresses[ChainId.EthMainnet]; /** * Namespace to easily encode calls to the Bundler contract, using ethers. */ export namespace BundlerAction { - export function encode({ type, args }: Action): BundlerCall { + export function encodeBundle( + chainId: ChainId, + actions: Action[], + value?: bigint, + ) { + const { + bundler3: { bundler3 }, + } = getChainAddresses(chainId); + + return { + to: bundler3, + value, + data: encodeFunctionData({ + abi: bundler3Abi, + functionName: "multicall", + args: [actions.map(BundlerAction.encode.bind(null, chainId))], + }), + }; + } + + export function encode( + chainId: ChainId, + { type, args }: Action, + ): BundlerCall { switch (type) { /* ERC20 */ case "nativeTransfer": { - return BundlerAction.nativeTransfer(...args); + return BundlerAction.nativeTransfer(chainId, ...args); } case "erc20Transfer": { - return BundlerAction.erc20Transfer(...args); + return BundlerAction.erc20Transfer(chainId, ...args); } case "erc20TransferFrom": { - return BundlerAction.erc20TransferFrom(...args); + return BundlerAction.erc20TransferFrom(chainId, ...args); } /* ERC20Wrapper */ case "erc20WrapperDepositFor": { - return BundlerAction.erc20WrapperDepositFor(...args); + return BundlerAction.erc20WrapperDepositFor(chainId, ...args); } case "erc20WrapperWithdrawTo": { - return BundlerAction.erc20WrapperWithdrawTo(...args); + return BundlerAction.erc20WrapperWithdrawTo(chainId, ...args); } /* Permit */ case "permit": { - const [asset, amount, deadline, signature, skipRevert = true] = args; + const [ + sender, + spender, + asset, + amount, + deadline, + signature, + skipRevert, + ] = args; if (signature == null) throw new BundlerErrors.MissingSignature(); return BundlerAction.permit( + sender, + spender, asset, amount, deadline, @@ -73,10 +114,13 @@ export namespace BundlerAction { ); } case "permitDai": { - const [nonce, expiry, allowed, signature, skipRevert = true] = args; + const [sender, spender, nonce, expiry, allowed, signature, skipRevert] = + args; if (signature == null) throw new BundlerErrors.MissingSignature(); return BundlerAction.permitDai( + sender, + spender, nonce, expiry, allowed, @@ -87,10 +131,15 @@ export namespace BundlerAction { /* Permit2 */ case "approve2": { - const [permitSingle, signature, skipRevert = true] = args; + const [sender, permitSingle, signature, skipRevert] = args; if (signature == null) throw new BundlerErrors.MissingSignature(); - return BundlerAction.approve2(permitSingle, signature, skipRevert); + return BundlerAction.approve2( + sender, + permitSingle, + signature, + skipRevert, + ); } case "transferFrom2": { return BundlerAction.transferFrom2(...args); @@ -342,14 +391,25 @@ export namespace BundlerAction { * @param amount The amount of native tokens to send (in wei). */ export function nativeTransfer( + chainId: ChainId, recipient: Address, amount: bigint, ): BundlerCall { - return encodeFunctionData({ - abi: transferBundlerAbi, - functionName: "nativeTransfer", - args: [recipient, amount], - }); + const { + bundler3: { generalAdapter1 }, + } = getChainAddresses(chainId); + + return { + to: generalAdapter1, + data: encodeFunctionData({ + abi: coreAdapterAbi, + functionName: "nativeTransfer", + args: [recipient, amount], + }), + value: amount, + skipRevert: false, + callbackHash: "0x", + }; } /** @@ -359,15 +419,26 @@ export namespace BundlerAction { * @param amount The amount of tokens to send. */ export function erc20Transfer( + chainId: ChainId, asset: Address, recipient: Address, amount: bigint, ): BundlerCall { - return encodeFunctionData({ - abi: transferBundlerAbi, - functionName: "erc20Transfer", - args: [asset, recipient, amount], - }); + const { + bundler3: { generalAdapter1 }, + } = getChainAddresses(chainId); + + return { + to: generalAdapter1, + data: encodeFunctionData({ + abi: coreAdapterAbi, + functionName: "erc20Transfer", + args: [asset, recipient, amount], + }), + value: 0n, + skipRevert: false, + callbackHash: "0x", + }; } /** @@ -376,14 +447,26 @@ export namespace BundlerAction { * @param amount The amount of tokens to send. */ export function erc20TransferFrom( + chainId: ChainId, asset: Address, + recipient: Address, amount: bigint, ): BundlerCall { - return encodeFunctionData({ - abi: transferBundlerAbi, - functionName: "erc20TransferFrom", - args: [asset, amount], - }); + const { + bundler3: { generalAdapter1 }, + } = getChainAddresses(chainId); + + return { + to: generalAdapter1, + data: encodeFunctionData({ + abi: generalAdapter1Abi, + functionName: "erc20TransferFrom", + args: [asset, recipient, amount], + }), + value: 0n, + skipRevert: false, + callbackHash: "0x", + }; } /* Permit */ @@ -397,19 +480,27 @@ export namespace BundlerAction { * @param skipRevert Whether to allow the permit to revert without making the whole multicall revert. */ export function permit( + owner: Address, + spender: Address, asset: Address, amount: bigint, deadline: bigint, signature: Hex, - skipRevert: boolean, + skipRevert = true, ): BundlerCall { const { r, s, yParity } = parseSignature(signature); - return encodeFunctionData({ - abi: permitBundlerAbi, - functionName: "permit", - args: [asset, amount, deadline, yParity + 27, r, s, skipRevert], - }); + return { + to: asset, + data: encodeFunctionData({ + abi: erc2612Abi, + functionName: "permit", + args: [owner, spender, amount, deadline, yParity + 27, r, s], + }), + value: 0n, + skipRevert, + callbackHash: "0x", + }; } /** @@ -421,19 +512,27 @@ export namespace BundlerAction { * @param skipRevert Whether to allow the permit to revert without making the whole multicall revert. */ export function permitDai( + owner: Address, + spender: Address, nonce: bigint, expiry: bigint, allowed: boolean, signature: Hex, - skipRevert: boolean, + skipRevert = true, ): BundlerCall { const { r, s, yParity } = parseSignature(signature); - return encodeFunctionData({ - abi: ethereumPermitBundlerAbi, - functionName: "permitDai", - args: [nonce, expiry, allowed, yParity + 27, r, s, skipRevert], - }); + return { + to: dai, + data: encodeFunctionData({ + abi: daiPermitAbi, + functionName: "permit", + args: [owner, spender, nonce, expiry, allowed, yParity + 27, r, s], + }), + value: 0n, + skipRevert, + callbackHash: "0x", + }; } /* Permit2 */ @@ -445,15 +544,22 @@ export namespace BundlerAction { * @param skipRevert Whether to allow the permit to revert without making the whole multicall revert. */ export function approve2( + owner: Address, permitSingle: Permit2PermitSingle, signature: Hex, - skipRevert: boolean, + skipRevert = true, ): BundlerCall { - return encodeFunctionData({ - abi: permit2BundlerAbi, - functionName: "approve2", - args: [permitSingle, signature, skipRevert], - }); + return { + to: permit2, + data: encodeFunctionData({ + abi: permit2Abi, + functionName: "permit", + args: [owner, permitSingle, signature], + }), + value: 0n, + skipRevert, + callbackHash: "0x", + }; } /** @@ -461,12 +567,22 @@ export namespace BundlerAction { * @param asset The address of the ERC20 token to transfer. * @param amount The amount of tokens to send. */ - export function transferFrom2(asset: Address, amount: bigint): BundlerCall { - return encodeFunctionData({ - abi: permit2BundlerAbi, - functionName: "transferFrom2", - args: [asset, amount], - }); + export function transferFrom2( + asset: Address, + recipient: Address, + amount: bigint, + ): BundlerCall { + return { + to: permit2, + data: encodeFunctionData({ + abi: generalAdapter1Abi, + functionName: "permit2TransferFrom", + args: [asset, recipient, amount], + }), + value: 0n, + skipRevert: false, + callbackHash: "0x", + }; } /* ERC20 Wrapper */ @@ -477,14 +593,26 @@ export namespace BundlerAction { * @param amount The amount of tokens to send. */ export function erc20WrapperDepositFor( + chainId: ChainId, wrapper: Address, + recipient: Address, amount: bigint, ): BundlerCall { - return encodeFunctionData({ - abi: erc20WrapperBundlerAbi, - functionName: "erc20WrapperDepositFor", - args: [wrapper, amount], - }); + const { + bundler3: { generalAdapter1 }, + } = getChainAddresses(chainId); + + return { + to: generalAdapter1, + data: encodeFunctionData({ + abi: generalAdapter1Abi, + functionName: "erc20WrapperDepositFor", + args: [wrapper, recipient, amount], + }), + value: 0n, + skipRevert: false, + callbackHash: "0x", + }; } /** @@ -494,15 +622,26 @@ export namespace BundlerAction { * @param amount The amount of tokens to send. */ export function erc20WrapperWithdrawTo( + chainId: ChainId, wrapper: Address, account: Address, amount: bigint, ): BundlerCall { - return encodeFunctionData({ - abi: erc20WrapperBundlerAbi, - functionName: "erc20WrapperWithdrawTo", - args: [wrapper, account, amount], - }); + const { + bundler3: { generalAdapter1 }, + } = getChainAddresses(chainId); + + return { + to: generalAdapter1, + data: encodeFunctionData({ + abi: generalAdapter1Abi, + functionName: "erc20WrapperDepositFor", + args: [wrapper, account, amount], + }), + value: 0n, + skipRevert: false, + callbackHash: "0x", + }; } /* ERC4626 */ @@ -519,7 +658,7 @@ export namespace BundlerAction { shares: bigint, maxAssets: bigint, receiver: Address, - ): BundlerCall { + ) { return encodeFunctionData({ abi: erc4626BundlerAbi, functionName: "erc4626Mint", @@ -539,7 +678,7 @@ export namespace BundlerAction { assets: bigint, minShares: bigint, receiver: Address, - ): BundlerCall { + ) { return encodeFunctionData({ abi: erc4626BundlerAbi, functionName: "erc4626Deposit", @@ -560,7 +699,7 @@ export namespace BundlerAction { maxShares: bigint, receiver: Address, owner: Address, - ): BundlerCall { + ) { return encodeFunctionData({ abi: erc4626BundlerAbi, functionName: "erc4626Withdraw", @@ -581,7 +720,7 @@ export namespace BundlerAction { minAssets: bigint, receiver: Address, owner: Address, - ): BundlerCall { + ) { return encodeFunctionData({ abi: erc4626BundlerAbi, functionName: "erc4626Redeem", @@ -601,7 +740,7 @@ export namespace BundlerAction { authorization: Authorization, signature: Hex, skipRevert: boolean, - ): BundlerCall { + ) { const { r, s, yParity } = parseSignature(signature); return encodeFunctionData({ @@ -627,7 +766,7 @@ export namespace BundlerAction { slippageAmount: bigint, onBehalf: Address, callbackCalls: BundlerCall[], - ): BundlerCall { + ) { return encodeFunctionData({ abi: morphoBundlerAbi, functionName: "morphoSupply", @@ -654,7 +793,7 @@ export namespace BundlerAction { assets: bigint, onBehalf: Address, callbackCalls: BundlerCall[], - ): BundlerCall { + ) { return encodeFunctionData({ abi: morphoBundlerAbi, functionName: "morphoSupplyCollateral", @@ -681,7 +820,7 @@ export namespace BundlerAction { shares: bigint, slippageAmount: bigint, receiver: Address, - ): BundlerCall { + ) { return encodeFunctionData({ abi: morphoBundlerAbi, functionName: "morphoBorrow", @@ -705,7 +844,7 @@ export namespace BundlerAction { slippageAmount: bigint, onBehalf: Address, callbackCalls: BundlerCall[], - ): BundlerCall { + ) { return encodeFunctionData({ abi: morphoBundlerAbi, functionName: "morphoRepay", @@ -734,7 +873,7 @@ export namespace BundlerAction { shares: bigint, slippageAmount: bigint, receiver: Address, - ): BundlerCall { + ) { return encodeFunctionData({ abi: morphoBundlerAbi, functionName: "morphoWithdraw", @@ -752,7 +891,7 @@ export namespace BundlerAction { market: InputMarketParams, assets: bigint, receiver: Address, - ): BundlerCall { + ) { return encodeFunctionData({ abi: morphoBundlerAbi, functionName: "morphoWithdrawCollateral", @@ -770,7 +909,7 @@ export namespace BundlerAction { asset: Address, amount: bigint, callbackCalls: BundlerCall[], - ): BundlerCall { + ) { return encodeFunctionData({ abi: morphoBundlerAbi, functionName: "morphoFlashLoan", @@ -796,7 +935,7 @@ export namespace BundlerAction { value: bigint, withdrawals: InputReallocation[], supplyMarketParams: InputMarketParams, - ): BundlerCall { + ) { return encodeFunctionData({ abi: morphoBundlerAbi, functionName: "reallocateTo", @@ -822,7 +961,7 @@ export namespace BundlerAction { amount: bigint, proof: Hex[], skipRevert: boolean, - ): BundlerCall { + ) { return encodeFunctionData({ abi: urdBundlerAbi, functionName: "urdClaim", @@ -836,7 +975,7 @@ export namespace BundlerAction { * Encodes a call to the Bundler to wrap native tokens (ETH to WETH on ethereum, MATIC to WMATIC on polygon, etc). * @param amount The amount of native tokens to wrap (in wei). */ - export function wrapNative(amount: bigint): BundlerCall { + export function wrapNative(amount: bigint) { return encodeFunctionData({ abi: wNativeBundlerAbi, functionName: "wrapNative", @@ -848,7 +987,7 @@ export namespace BundlerAction { * Encodes a call to the Bundler to unwrap native tokens (WETH to ETH on ethereum, WMATIC to MATIC on polygon, etc). * @param amount The amount of native tokens to unwrap (in wei). */ - export function unwrapNative(amount: bigint): BundlerCall { + export function unwrapNative(amount: bigint) { return encodeFunctionData({ abi: wNativeBundlerAbi, functionName: "unwrapNative", @@ -868,7 +1007,7 @@ export namespace BundlerAction { amount: bigint, minShares: bigint, referral: Address, - ): BundlerCall { + ) { return encodeFunctionData({ abi: stEthBundlerAbi, functionName: "stakeEth", @@ -882,7 +1021,7 @@ export namespace BundlerAction { * Encodes a call to the Bundler to wrap stETH (stETH to wstETH on ethereum). * @param amount The amount of stETH to wrap (in wei). */ - export function wrapStEth(amount: bigint): BundlerCall { + export function wrapStEth(amount: bigint) { return encodeFunctionData({ abi: stEthBundlerAbi, functionName: "wrapStEth", @@ -894,7 +1033,7 @@ export namespace BundlerAction { * Encodes a call to the Bundler to unwrap wstETH (wstETH to stETH on ethereum). * @param amount The amount of wstETH to unwrap (in wei). */ - export function unwrapStEth(amount: bigint): BundlerCall { + export function unwrapStEth(amount: bigint) { return encodeFunctionData({ abi: stEthBundlerAbi, functionName: "unwrapStEth", @@ -915,7 +1054,7 @@ export namespace BundlerAction { asset: Address, amount: bigint, rateMode: bigint, - ): BundlerCall { + ) { return encodeFunctionData({ abi: aaveV2MigrationBundlerAbi, functionName: "aaveV2Repay", @@ -929,7 +1068,7 @@ export namespace BundlerAction { * @param asset The asset to withdraw. * @param amount The amount of asset to withdraw. */ - export function aaveV2Withdraw(asset: Address, amount: bigint): BundlerCall { + export function aaveV2Withdraw(asset: Address, amount: bigint) { return encodeFunctionData({ abi: aaveV2MigrationBundlerAbi, functionName: "aaveV2Withdraw", @@ -950,7 +1089,7 @@ export namespace BundlerAction { asset: Address, amount: bigint, rateMode: bigint, - ): BundlerCall { + ) { return encodeFunctionData({ abi: aaveV3MigrationBundlerAbi, functionName: "aaveV3Repay", @@ -964,7 +1103,7 @@ export namespace BundlerAction { * @param asset The asset to withdraw. * @param amount The amount of asset to withdraw. */ - export function aaveV3Withdraw(asset: Address, amount: bigint): BundlerCall { + export function aaveV3Withdraw(asset: Address, amount: bigint) { return encodeFunctionData({ abi: aaveV3MigrationBundlerAbi, functionName: "aaveV3Withdraw", @@ -981,10 +1120,7 @@ export namespace BundlerAction { * @param amount The amount of debt to repay. * @param maxIterations The maximum amount of iterations to use for the repayment. */ - export function aaveV3OptimizerRepay( - underlying: Address, - amount: bigint, - ): BundlerCall { + export function aaveV3OptimizerRepay(underlying: Address, amount: bigint) { return encodeFunctionData({ abi: aaveV3OptimizerMigrationBundlerAbi, functionName: "aaveV3OptimizerRepay", @@ -1003,7 +1139,7 @@ export namespace BundlerAction { underlying: Address, amount: bigint, maxIterations: bigint, - ): BundlerCall { + ) { return encodeFunctionData({ abi: aaveV3OptimizerMigrationBundlerAbi, functionName: "aaveV3OptimizerWithdraw", @@ -1020,7 +1156,7 @@ export namespace BundlerAction { export function aaveV3OptimizerWithdrawCollateral( underlying: Address, amount: bigint, - ): BundlerCall { + ) { return encodeFunctionData({ abi: aaveV3OptimizerMigrationBundlerAbi, functionName: "aaveV3OptimizerWithdrawCollateral", @@ -1043,7 +1179,7 @@ export namespace BundlerAction { deadline: bigint, signature: Hex, skipRevert: boolean, - ): BundlerCall { + ) { const { r, s, yParity } = parseSignature(signature); return encodeFunctionData({ @@ -1067,10 +1203,7 @@ export namespace BundlerAction { * @param cToken The cToken on which to repay the debt. * @param amount The amount of debt to repay. */ - export function compoundV2Repay( - cToken: Address, - amount: bigint, - ): BundlerCall { + export function compoundV2Repay(cToken: Address, amount: bigint) { return encodeFunctionData({ abi: compoundV2MigrationBundlerAbi, functionName: "compoundV2Repay", @@ -1084,10 +1217,7 @@ export namespace BundlerAction { * @param cToken The cToken on which to withdraw. * @param amount The amount to withdraw. */ - export function compoundV2Redeem( - cToken: Address, - amount: bigint, - ): BundlerCall { + export function compoundV2Redeem(cToken: Address, amount: bigint) { return encodeFunctionData({ abi: compoundV2MigrationBundlerAbi, functionName: "compoundV2Redeem", @@ -1103,10 +1233,7 @@ export namespace BundlerAction { * @param instance The CompoundV3 instance on which to repay the debt. * @param amount The amount of debt to repay. */ - export function compoundV3Repay( - instance: Address, - amount: bigint, - ): BundlerCall { + export function compoundV3Repay(instance: Address, amount: bigint) { return encodeFunctionData({ abi: compoundV3MigrationBundlerAbi, functionName: "compoundV3Repay", @@ -1124,7 +1251,7 @@ export namespace BundlerAction { instance: Address, asset: Address, amount: bigint, - ): BundlerCall { + ) { return encodeFunctionData({ abi: compoundV3MigrationBundlerAbi, functionName: "compoundV3WithdrawFrom", @@ -1149,7 +1276,7 @@ export namespace BundlerAction { expiry: bigint, signature: Hex, skipRevert: boolean, - ): BundlerCall { + ) { const { r, s, yParity } = parseSignature(signature); return encodeFunctionData({ diff --git a/packages/bundler-sdk-viem/src/abis.ts b/packages/bundler-sdk-viem/src/abis.ts index a7dd83f5..a1189e40 100644 --- a/packages/bundler-sdk-viem/src/abis.ts +++ b/packages/bundler-sdk-viem/src/abis.ts @@ -1,3 +1,6 @@ +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const baseBundlerAbi = [ { type: "function", @@ -15,6 +18,9 @@ export const baseBundlerAbi = [ }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const transferBundlerAbi = [ ...baseBundlerAbi, { @@ -50,6 +56,9 @@ export const transferBundlerAbi = [ }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const permitBundlerAbi = [ ...baseBundlerAbi, { @@ -69,6 +78,9 @@ export const permitBundlerAbi = [ }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const ethereumPermitBundlerAbi = [ ...permitBundlerAbi, { @@ -88,6 +100,9 @@ export const ethereumPermitBundlerAbi = [ }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const permit2BundlerAbi = [ ...baseBundlerAbi, { @@ -133,6 +148,9 @@ export const permit2BundlerAbi = [ { type: "error", name: "UnsafeCast", inputs: [] }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const erc20WrapperBundlerAbi = [ ...baseBundlerAbi, { @@ -158,6 +176,9 @@ export const erc20WrapperBundlerAbi = [ }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const erc4626BundlerAbi = [ ...baseBundlerAbi, { @@ -212,6 +233,9 @@ export const erc4626BundlerAbi = [ }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const morphoBundlerAbi = [ ...baseBundlerAbi, { @@ -495,6 +519,9 @@ export const morphoBundlerAbi = [ }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const urdBundlerAbi = [ ...baseBundlerAbi, { @@ -513,6 +540,9 @@ export const urdBundlerAbi = [ }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const wNativeBundlerAbi = [ ...baseBundlerAbi, { type: "receive", stateMutability: "payable" }, @@ -539,6 +569,9 @@ export const wNativeBundlerAbi = [ }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const stEthBundlerAbi = [ ...baseBundlerAbi, { @@ -582,6 +615,9 @@ export const stEthBundlerAbi = [ }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const aaveV2MigrationBundlerAbi = [ ...transferBundlerAbi, ...permitBundlerAbi, @@ -629,6 +665,9 @@ export const aaveV2MigrationBundlerAbi = [ { type: "error", name: "UnsafeCast", inputs: [] }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const aaveV3MigrationBundlerAbi = [ ...transferBundlerAbi, ...permitBundlerAbi, @@ -675,6 +714,9 @@ export const aaveV3MigrationBundlerAbi = [ { type: "error", name: "UnsafeCast", inputs: [] }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const aaveV3OptimizerMigrationBundlerAbi = [ ...transferBundlerAbi, ...permitBundlerAbi, @@ -755,6 +797,9 @@ export const aaveV3OptimizerMigrationBundlerAbi = [ { type: "error", name: "UnsafeCast", inputs: [] }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const compoundV2MigrationBundlerAbi = [ ...transferBundlerAbi, ...permitBundlerAbi, @@ -802,6 +847,9 @@ export const compoundV2MigrationBundlerAbi = [ { type: "error", name: "UnsafeCast", inputs: [] }, ] as const; +/** + * @deprecated All bundles should be encoded using Bundler3 instead. + */ export const compoundV3MigrationBundlerAbi = [ ...transferBundlerAbi, ...permitBundlerAbi, @@ -2374,3 +2422,24 @@ export const paraswapAdapterAbi = [ inputs: [], }, ] as const; + +export const daiPermitAbi = [ + { + constant: false, + inputs: [ + { internalType: "address", name: "holder", type: "address" }, + { internalType: "address", name: "spender", type: "address" }, + { internalType: "uint256", name: "nonce", type: "uint256" }, + { internalType: "uint256", name: "expiry", type: "uint256" }, + { internalType: "bool", name: "allowed", type: "bool" }, + { internalType: "uint8", name: "v", type: "uint8" }, + { internalType: "bytes32", name: "r", type: "bytes32" }, + { internalType: "bytes32", name: "s", type: "bytes32" }, + ], + name: "permit", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, +] as const; diff --git a/packages/bundler-sdk-viem/src/actions.ts b/packages/bundler-sdk-viem/src/actions.ts index 39b26cc3..d01927b1 100644 --- a/packages/bundler-sdk-viem/src/actions.ts +++ b/packages/bundler-sdk-viem/src/actions.ts @@ -2,7 +2,6 @@ import { type Account, type Address, type Client, - type Hex, encodeFunctionData, erc20Abi, maxUint256, @@ -36,7 +35,6 @@ import { } from "@morpho-org/blue-sdk-viem"; import { signTypedData } from "viem/actions"; import BundlerAction from "./BundlerAction.js"; -import { baseBundlerAbi } from "./abis.js"; import type { Action, ActionBundle, @@ -65,7 +63,11 @@ const encodeErc20Approval = ( data: MaybeDraft, ) => { const { chainId } = data; - const { morpho, bundler, permit2 } = getChainAddresses(chainId); + const { + morpho, + bundler3: { generalAdapter1 }, + permit2, + } = getChainAddresses(chainId); amount = MathLib.min( amount, @@ -78,7 +80,7 @@ const encodeErc20Approval = ( const contract = spender === morpho ? "morpho" - : spender === bundler + : spender === generalAdapter1 ? "bundler" : spender === permit2 ? "permit2" @@ -132,7 +134,7 @@ export const encodeOperation = ( const deadline = Time.timestamp() + Time.s.from.h(24n); const { morpho, - bundler, + bundler3: { generalAdapter1 }, publicAllocator, permit2, wNative, @@ -189,7 +191,7 @@ export const encodeOperation = ( const authorization = { authorizer: owner, - authorized: bundler, + authorized: generalAdapter1, isAuthorized: true, deadline, nonce: ownerData.morphoNonce, @@ -205,10 +207,11 @@ export const encodeOperation = ( requirements.signatures.push({ action, async sign(client: Client, account: Account = client.account!) { - if (action.args[1] != null) return action.args[1]; + let signature = action.args[1]; + if (signature != null) return signature; const typedData = getAuthorizationTypedData(authorization, chainId); - const signature = await signTypedData(client, { + signature = await signTypedData(client, { ...typedData, account, }); @@ -230,13 +233,13 @@ export const encodeOperation = ( requirements.txs.push({ type: "morphoSetAuthorization", - args: [bundler, true], + args: [generalAdapter1, true], tx: { to: morpho, data: encodeFunctionData({ abi: blueAbi, functionName: "setAuthorization", - args: [bundler, true], + args: [generalAdapter1, true], }), }, }); @@ -269,11 +272,11 @@ export const encodeOperation = ( address === dai ? { type: "permitDai", - args: [nonce, deadline, true, null], + args: [sender, spender, nonce, deadline, true, null], } : { type: "permit", - args: [address, amount, deadline, null], + args: [sender, spender, address, amount, deadline, null], }; actions.push(action); @@ -283,9 +286,9 @@ export const encodeOperation = ( requirements.signatures.push({ action, async sign(client: Client, account: Account = client.account!) { - if (action.args[3] != null) return action.args[3]; // action is already signed + let signature = action.args[5]; + if (signature != null) return signature; // action is already signed - let signature: Hex; if (address === dai) { const typedData = getDaiPermitTypedData( { @@ -331,7 +334,7 @@ export const encodeOperation = ( }); } - return (action.args[3] = signature); + return (action.args[5] = signature); }, }); @@ -356,6 +359,7 @@ export const encodeOperation = ( const action: Action = { type: "approve2", args: [ + sender, { details: { token: address, @@ -375,9 +379,11 @@ export const encodeOperation = ( requirements.signatures.push({ action, async sign(client: Client, account: Account = client.account!) { - const { details, spender, sigDeadline } = action.args[0]; + const { details, spender, sigDeadline } = action.args[1]; + + let signature = action.args[2]; + if (signature != null) return signature; // action is already signed - if (action.args[1] != null) return action.args[1]; // action is already signed const typedData = getPermit2PermitTypedData( { spender, @@ -389,7 +395,7 @@ export const encodeOperation = ( }, chainId, ); - const signature = await signTypedData(client, { + signature = await signTypedData(client, { ...typedData, account, }); @@ -400,7 +406,7 @@ export const encodeOperation = ( signature, }); - return (action.args[1] = signature); + return (action.args[2] = signature); }, }); @@ -419,7 +425,7 @@ export const encodeOperation = ( const { amount, from, to } = operation.args; // Output transfer from the bundler. - if (from === bundler) { + if (from === generalAdapter1) { if (address === NATIVE_ADDRESS) { actions.push({ type: "nativeTransfer", @@ -438,7 +444,7 @@ export const encodeOperation = ( } // Input transfer to the bundler. - if (to === bundler) { + if (to === generalAdapter1) { // Native token transfer is added to the call value (thus batched at the start of the bundle). if (address === NATIVE_ADDRESS) { value += amount; @@ -448,7 +454,7 @@ export const encodeOperation = ( actions.push({ type: "erc20TransferFrom", - args: [address, amount], + args: [address, generalAdapter1, amount], }); break; @@ -462,7 +468,7 @@ export const encodeOperation = ( const { amount, from, to } = operation.args; // Output transfer2 from the bundler is treated like a standard output transfer. - if (from === bundler) { + if (from === generalAdapter1) { if (address === NATIVE_ADDRESS) { actions.push({ type: "nativeTransfer", @@ -481,7 +487,7 @@ export const encodeOperation = ( } // Input transfer2 to the bundler. - if (to === bundler) { + if (to === generalAdapter1) { // Native token transfer is added to the call value (thus batched at the start of the bundle). if (address === NATIVE_ADDRESS) { value += amount; @@ -492,7 +498,7 @@ export const encodeOperation = ( if (supportsSignature) { actions.push({ type: "transferFrom2", - args: [address, amount], + args: [address, generalAdapter1, amount], }); break; @@ -502,7 +508,7 @@ export const encodeOperation = ( actions.push({ type: "erc20TransferFrom", - args: [address, amount], + args: [address, generalAdapter1, amount], }); break; @@ -830,7 +836,6 @@ export function encodeBundle( supportsSignature = true, ): ActionBundle { const { chainId } = startData; - const { bundler } = getChainAddresses(chainId); let value = 0n; const actions: Action[] = []; @@ -861,14 +866,6 @@ export function encodeBundle( steps, actions, requirements, - tx: () => ({ - to: bundler, - value, - data: encodeFunctionData({ - abi: baseBundlerAbi, - functionName: "multicall", - args: [actions.map(BundlerAction.encode)], - }), - }), + tx: () => BundlerAction.encodeBundle(chainId, actions, value), }; } diff --git a/packages/bundler-sdk-viem/src/operations.ts b/packages/bundler-sdk-viem/src/operations.ts index afabca4c..a86d249f 100644 --- a/packages/bundler-sdk-viem/src/operations.ts +++ b/packages/bundler-sdk-viem/src/operations.ts @@ -33,7 +33,7 @@ import { simulateOperations, } from "@morpho-org/simulation-sdk"; -import { maxUint256 } from "viem"; +import { isAddressEqual, maxUint256 } from "viem"; import { BundlerErrors } from "./errors.js"; import type { BundlerOperation, @@ -73,7 +73,10 @@ export const populateInputTransfer = ( data: MaybeDraft, { hasSimplePermit = false }: { hasSimplePermit?: boolean } = {}, ): Exclude[] => { - const { bundler, permit2 } = getChainAddresses(data.chainId); + const { + bundler3: { generalAdapter1 }, + permit2, + } = getChainAddresses(data.chainId); // If native token, it is expected to be sent along as call value. if (address === NATIVE_ADDRESS) @@ -85,7 +88,7 @@ export const populateInputTransfer = ( args: { amount, from, - to: bundler, + to: generalAdapter1, }, }, ]; @@ -100,12 +103,12 @@ export const populateInputTransfer = ( return [ { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address, args: { amount, from, - to: bundler, + to: generalAdapter1, }, }, ]; @@ -128,7 +131,7 @@ export const populateInputTransfer = ( address, args: { amount, - spender: bundler, + spender: generalAdapter1, nonce: erc2612Nonce, }, }); @@ -140,19 +143,19 @@ export const populateInputTransfer = ( address, args: { amount, - spender: bundler, + spender: generalAdapter1, }, }); if (useSimplePermit || isPermissioned) operations.push({ type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address, args: { amount, from, - to: bundler, + to: generalAdapter1, }, }); // Simple permit is not supported and token is not permissioned: fallback to Permit2. @@ -178,7 +181,7 @@ export const populateInputTransfer = ( address, args: { amount, - spender: bundler, + spender: generalAdapter1, expiration: MathLib.MAX_UINT_48, // Always approve indefinitely. nonce: permit2Allowances.bundler.nonce, }, @@ -186,12 +189,12 @@ export const populateInputTransfer = ( operations.push({ type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address, args: { amount, from, - to: bundler, + to: generalAdapter1, }, }); } @@ -218,7 +221,10 @@ export const populateSubBundle = ( options: BundlingOptions = {}, ) => { const { sender } = inputOperation; - const { morpho, bundler } = getChainAddresses(data.chainId); + const { + morpho, + bundler3: { generalAdapter1 }, + } = getChainAddresses(data.chainId); const { withSimplePermit = new Set(), publicAllocatorOptions, @@ -238,7 +244,7 @@ export const populateSubBundle = ( // Transform input operation to act on behalf of the sender, via the bundler. const mainOperation = produceImmutable(inputOperation, (draft) => { - draft.sender = bundler; + draft.sender = generalAdapter1; // Redirect MetaMorpho operation owner. switch (draft.type) { @@ -252,7 +258,7 @@ export const populateSubBundle = ( case "MetaMorpho_Deposit": case "MetaMorpho_Withdraw": // Only if sender is owner otherwise the owner would be lost. - if (draft.args.owner === sender) draft.args.owner = bundler; + if (draft.args.owner === sender) draft.args.owner = generalAdapter1; } // Redirect operation targets. @@ -263,7 +269,8 @@ export const populateSubBundle = ( draft.args.onBehalf = sender; case "MetaMorpho_Withdraw": // Only if sender is receiver otherwise the receiver would be lost. - if (draft.args.receiver === sender) draft.args.receiver = bundler; + if (draft.args.receiver === sender) + draft.args.receiver = generalAdapter1; } }); @@ -274,7 +281,7 @@ export const populateSubBundle = ( if (needsBundlerAuthorization && !data.getUser(sender).isBundlerAuthorized) operations.push({ type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: sender, @@ -369,7 +376,7 @@ export const populateSubBundle = ( args: { amount: fees, from: sender, - to: bundler, + to: generalAdapter1, }, }); } @@ -380,7 +387,7 @@ export const populateSubBundle = ( ([vault, vaultWithdrawals]) => ({ type: "MetaMorpho_PublicReallocate", - sender: bundler, + sender: generalAdapter1, address: vault, args: { // Reallocation withdrawals must be sorted by market id in ascending alphabetical order. @@ -443,7 +450,7 @@ export const populateSubBundle = ( ("shares" in mainOperation.args && mainOperation.args.shares === maxUint256) ) { if (mainOperation.type === "MetaMorpho_Withdraw") - mainOperation.args.owner = bundler; + mainOperation.args.owner = generalAdapter1; return allOperations; } @@ -463,12 +470,12 @@ export const populateSubBundle = ( ...populateInputTransfer( { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: token, args: { amount: required, from: sender, - to: bundler, + to: generalAdapter1, }, }, data, @@ -502,9 +509,15 @@ export const finalizeBundle = ( const nbOperations = operations.length; if (nbOperations === 0) return operations; - const { bundler } = getChainAddresses(startData.chainId); + const { + bundler3: { bundler3, generalAdapter1 }, + } = getChainAddresses(startData.chainId); - if (receiver === bundler) throw Error(`receiver is bundler`); + if ( + isAddressEqual(receiver, bundler3) || + isAddressEqual(receiver, generalAdapter1) + ) + throw Error(`receiver is bundler`); const approvals = [] as Operations["Erc20_Approve"][]; const permits = [] as Operations["Erc20_Permit"][]; @@ -583,8 +596,8 @@ export const finalizeBundle = ( } = operation; if ( - from !== bundler && - to === bundler && + from !== generalAdapter1 && + to === generalAdapter1 && !erc20WrapperTokens[startData.chainId].has(address) ) { const duplicateTransfer = inputTransfers.find( @@ -617,7 +630,7 @@ export const finalizeBundle = ( args: { amount, from, to }, } = operation; - if (from !== bundler && to === bundler) { + if (from !== generalAdapter1 && to === generalAdapter1) { const duplicateTransfer2 = inputTransfer2s.find( (transfer) => transfer.address === address && @@ -662,7 +675,7 @@ export const finalizeBundle = ( operations.forEach((operation, index) => { if ( operation.type !== "MetaMorpho_Deposit" || - operation.args.owner !== bundler + operation.args.owner !== generalAdapter1 ) return; @@ -670,13 +683,15 @@ export const finalizeBundle = ( // shares are not defined when depositing assets, so we rely on simulation steps. const shares = - steps[index + 1]!.getHolding(bundler, token).balance - - steps[index]!.getHolding(bundler, token).balance; + steps[index + 1]!.getHolding(generalAdapter1, token).balance - + steps[index]!.getHolding(generalAdapter1, token).balance; if ( steps .slice(index + 2) - .some((step) => step.getHolding(bundler, token).balance < shares) + .some( + (step) => step.getHolding(generalAdapter1, token).balance < shares, + ) ) // If the bundler's balance is at least once lower than assets, the bundler does need these assets. return; @@ -702,17 +717,20 @@ export const finalizeBundle = ( return; } - if (operation.args.receiver !== bundler || unwrapTokens.has(token)) return; + if (operation.args.receiver !== generalAdapter1 || unwrapTokens.has(token)) + return; // assets are not defined when using shares, so we rely on simulation steps. const assets = - steps[index + 1]!.getHolding(bundler, token).balance - - steps[index]!.getHolding(bundler, token).balance; + steps[index + 1]!.getHolding(generalAdapter1, token).balance - + steps[index]!.getHolding(generalAdapter1, token).balance; if ( steps .slice(index + 2) - .some((step) => step.getHolding(bundler, token).balance < assets) + .some( + (step) => step.getHolding(generalAdapter1, token).balance < assets, + ) ) // If the bundler's balance is at least once lower than assets, the bundler does need these assets. return; @@ -724,21 +742,21 @@ export const finalizeBundle = ( operations.forEach((operation, index) => { if ( operation.type !== "MetaMorpho_Withdraw" || - operation.args.owner !== bundler + operation.args.owner !== generalAdapter1 ) return; // shares are not defined when using assets, so we rely on simulation steps. const shares = - steps[index]!.getHolding(bundler, operation.address).balance - - steps[index + 1]!.getHolding(bundler, operation.address).balance; + steps[index]!.getHolding(generalAdapter1, operation.address).balance - + steps[index + 1]!.getHolding(generalAdapter1, operation.address).balance; const inputTransferIndex = operations.findIndex( (candidate) => candidate.type === "Erc20_Transfer" && candidate.address === operation.address && - candidate.sender === bundler && - candidate.args.to === bundler && + candidate.sender === generalAdapter1 && + candidate.args.to === generalAdapter1 && candidate.args.amount >= shares, ); if (inputTransferIndex <= 0) return; @@ -758,14 +776,16 @@ export const finalizeBundle = ( const { amount, from, to } = operation.args; - if (from === bundler || to !== bundler) return true; + if (from === generalAdapter1 || to !== generalAdapter1) return true; const token = operation.address; if ( steps .slice(index + 2) - .some((step) => step.getHolding(bundler, token).balance < amount) + .some( + (step) => step.getHolding(generalAdapter1, token).balance < amount, + ) ) // If the bundler's balance is at least once less than amount, the bundler does need these assets. // Do not only keep the amount actually used in this case because some input transfers @@ -781,7 +801,7 @@ export const finalizeBundle = ( // Unwrap requested remaining wrapped tokens. const unwraps = [] as Erc20Operations["Erc20_Unwrap"][]; - const endBundlerTokenData = getLast(steps).holdings[bundler] ?? {}; + const endBundlerTokenData = getLast(steps).holdings[generalAdapter1] ?? {}; unwrapTokens.forEach((wrappedToken) => { const remaining = endBundlerTokenData[wrappedToken]?.balance ?? 0n; @@ -793,7 +813,7 @@ export const finalizeBundle = ( unwraps.push({ type: "Erc20_Unwrap", address: wrappedToken, - sender: bundler, + sender: generalAdapter1, args: { amount: maxUint256, receiver, @@ -810,8 +830,8 @@ export const finalizeBundle = ( // Skim any token expected to be left on the bundler. const skims = [] as Erc20Operations["Erc20_Transfer"][]; { - const startBundlerTokenData = steps[0].holdings[bundler] ?? {}; - const endBundlerTokenData = getLast(steps).holdings[bundler] ?? {}; + const startBundlerTokenData = steps[0].holdings[generalAdapter1] ?? {}; + const endBundlerTokenData = getLast(steps).holdings[generalAdapter1] ?? {}; skims.push( ...entries(endBundlerTokenData) @@ -824,10 +844,10 @@ export const finalizeBundle = ( ({ type: "Erc20_Transfer", address, - sender: bundler, + sender: generalAdapter1, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: receiver, }, }) as Erc20Operations["Erc20_Transfer"], @@ -873,40 +893,44 @@ export const simulateRequiredTokenAmounts = ( operations: Operation[], data: MaybeDraft, ) => { - const { bundler } = getChainAddresses(data.chainId); + const { + bundler3: { generalAdapter1 }, + } = getChainAddresses(data.chainId); const virtualBundlerData = produceImmutable(data, (draft) => { - Object.values(draft.holdings[bundler] ?? {}).forEach((bundlerTokenData) => { - // Virtual balance to calculate the amount required. - bundlerTokenData.balance += MathLib.MAX_UINT_160; - }); + Object.values(draft.holdings[generalAdapter1] ?? {}).forEach( + (bundlerTokenData) => { + // Virtual balance to calculate the amount required. + bundlerTokenData.balance += MathLib.MAX_UINT_160; + }, + ); }); const steps = simulateOperations(operations, virtualBundlerData); - const bundlerTokenDiffs = keys(virtualBundlerData.holdings[bundler]).map( - (token) => ({ - token, - required: steps - .map( - (step) => - // When recursively simulated, this will cause tokens to be required at the highest recursion level. - // For example: supplyCollateral(x, supplyCollateral(y, borrow(z))) [provided x, y, z < MAX_UINT_160] - // | | |=> MAX_UINT_160 - (3 * MAX_UINT_160 + z) < 0 - // | |=> MAX_UINT_160 - (2 * MAX_UINT_160 - y) < 0 - // |=> MAX_UINT_160 - (MAX_UINT_160 - y - x) > 0 - MathLib.MAX_UINT_160 - - (step.holdings[bundler]?.[token]?.balance ?? 0n), - ) - .sort( - bigIntComparator( - (required) => required, - // Take the highest required amount among all operations. - "desc", - ), - )[0]!, - }), - ); + const bundlerTokenDiffs = keys( + virtualBundlerData.holdings[generalAdapter1], + ).map((token) => ({ + token, + required: steps + .map( + (step) => + // When recursively simulated, this will cause tokens to be required at the highest recursion level. + // For example: supplyCollateral(x, supplyCollateral(y, borrow(z))) [provided x, y, z < MAX_UINT_160] + // | | |=> MAX_UINT_160 - (3 * MAX_UINT_160 + z) < 0 + // | |=> MAX_UINT_160 - (2 * MAX_UINT_160 - y) < 0 + // |=> MAX_UINT_160 - (MAX_UINT_160 - y - x) > 0 + MathLib.MAX_UINT_160 - + (step.holdings[generalAdapter1]?.[token]?.balance ?? 0n), + ) + .sort( + bigIntComparator( + (required) => required, + // Take the highest required amount among all operations. + "desc", + ), + )[0]!, + })); return bundlerTokenDiffs.filter(({ required }) => required > 0n); }; diff --git a/packages/bundler-sdk-viem/src/types/actions.ts b/packages/bundler-sdk-viem/src/types/actions.ts index 9833fca4..1e9038ab 100644 --- a/packages/bundler-sdk-viem/src/types/actions.ts +++ b/packages/bundler-sdk-viem/src/types/actions.ts @@ -40,14 +40,20 @@ export interface ActionArgs { /* ERC20 */ nativeTransfer: [recipient: Address, amount: bigint]; erc20Transfer: [asset: Address, recipient: Address, amount: bigint]; - erc20TransferFrom: [asset: Address, amount: bigint]; + erc20TransferFrom: [asset: Address, recipient: Address, amount: bigint]; /* ERC20Wrapper */ - erc20WrapperDepositFor: [wrapper: Address, amount: bigint]; + erc20WrapperDepositFor: [ + wrapper: Address, + recipient: Address, + amount: bigint, + ]; erc20WrapperWithdrawTo: [wrapper: Address, account: Address, amount: bigint]; /* Permit */ permit: [ + owner: Address, + spender: Address, asset: Address, amount: bigint, deadline: bigint, @@ -55,6 +61,8 @@ export interface ActionArgs { skipRevert?: boolean, ]; permitDai: [ + owner: Address, + spender: Address, nonce: bigint, expiry: bigint, allowed: boolean, @@ -64,11 +72,12 @@ export interface ActionArgs { /* Permit2 */ approve2: [ + owner: Address, permitSingle: Permit2PermitSingle, signature: Hex | null, skipRevert?: boolean, ]; - transferFrom2: [asset: Address, amount: bigint]; + transferFrom2: [asset: Address, recipient: Address, amount: bigint]; /* ERC4626 */ erc4626Mint: [ diff --git a/packages/bundler-sdk-viem/test/helpers.ts b/packages/bundler-sdk-viem/test/helpers.ts index af0e1ff8..810aec68 100644 --- a/packages/bundler-sdk-viem/test/helpers.ts +++ b/packages/bundler-sdk-viem/test/helpers.ts @@ -161,11 +161,16 @@ export const setupBundle = async ( ); } - const { bundler } = getChainAddresses(startData.chainId); + const { + bundler3: { generalAdapter1 }, + } = getChainAddresses(startData.chainId); await Promise.all( [...tokens].map(async (token) => { - const balance = await client.balanceOf({ erc20: token, owner: bundler }); + const balance = await client.balanceOf({ + erc20: token, + owner: generalAdapter1, + }); expect( format.number.of(balance, startData.getToken(token).decimals), diff --git a/packages/bundler-sdk-viem/test/populateBundle.test.ts b/packages/bundler-sdk-viem/test/populateBundle.test.ts index 840ff9dd..22048a86 100644 --- a/packages/bundler-sdk-viem/test/populateBundle.test.ts +++ b/packages/bundler-sdk-viem/test/populateBundle.test.ts @@ -38,7 +38,7 @@ describe("populateBundle", () => { const { morpho, permit2, - bundler, + bundler3: { generalAdapter1 }, publicAllocator, wNative, wstEth, @@ -90,7 +90,7 @@ describe("populateBundle", () => { const { result } = await renderHook(config, () => useSimulationState({ marketIds: [id], - users: [client.account.address, bundler], + users: [client.account.address, generalAdapter1], tokens: [wNative], vaults: [], block, @@ -139,7 +139,7 @@ describe("populateBundle", () => { const { result } = await renderHook(config, () => useSimulationState({ marketIds: [id], - users: [client.account.address, bundler], + users: [client.account.address, generalAdapter1], tokens: [NATIVE_ADDRESS, dai, dai_sUsde.collateralToken], vaults: [], block, @@ -175,23 +175,23 @@ describe("populateBundle", () => { address: dai, args: { amount: assets, - spender: bundler, + spender: generalAdapter1, nonce: 3n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: dai, args: { amount: assets, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Blue_Supply", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -218,9 +218,9 @@ describe("populateBundle", () => { expect(await client.allowance({ erc20: dai, spender: permit2 })).toBe( 0n, ); - expect(await client.allowance({ erc20: dai, spender: bundler })).toBe( - MathLib.MAX_UINT_256, - ); + expect( + await client.allowance({ erc20: dai, spender: generalAdapter1 }), + ).toBe(MathLib.MAX_UINT_256); expect(await client.allowance({ erc20: dai, spender: morpho })).toBe( 0n, ); @@ -248,7 +248,7 @@ describe("populateBundle", () => { const { result } = await renderHook(config, () => useSimulationState({ marketIds: [id], - users: [client.account.address, bundler], + users: [client.account.address, generalAdapter1], tokens: [NATIVE_ADDRESS, wNative, stEth, wstEth], vaults: [], block, @@ -260,7 +260,10 @@ describe("populateBundle", () => { const data = result.current.data!; const { balance } = data.getHolding(client.account.address, stEth); - const { balance: bundlerBalance } = data.getHolding(bundler, stEth); + const { balance: bundlerBalance } = data.getHolding( + generalAdapter1, + stEth, + ); const wstEthToken = data.getWrappedToken(wstEth); const assets = @@ -276,7 +279,7 @@ describe("populateBundle", () => { address: wstEth, args: { amount: balance, - owner: bundler, + owner: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, @@ -318,7 +321,7 @@ describe("populateBundle", () => { address: wstEth, args: { amount: wBalance, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, @@ -328,44 +331,44 @@ describe("populateBundle", () => { address: stEth, args: { amount: balance - bundlerBalance, - spender: bundler, + spender: generalAdapter1, expiration: MathLib.MAX_UINT_48, nonce: 0n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: wBalance, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: stEth, args: { amount: balance - bundlerBalance, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Erc20_Wrap", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: balance, - owner: bundler, + owner: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -375,11 +378,11 @@ describe("populateBundle", () => { }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, @@ -402,7 +405,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: stEth, spender: permit2 }), ).toBe(MathLib.MAX_UINT_160 - (balance - bundlerBalance)); expect( - await client.allowance({ erc20: stEth, spender: bundler }), + await client.allowance({ erc20: stEth, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ @@ -437,7 +440,7 @@ describe("populateBundle", () => { const { result } = await renderHook(config, () => useSimulationState({ marketIds: [id], - users: [client.account.address, bundler], + users: [client.account.address, generalAdapter1], tokens: [usdc, stEth, wstEth], vaults: [], block, @@ -470,7 +473,7 @@ describe("populateBundle", () => { expect(operations).toStrictEqual([ { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -479,7 +482,7 @@ describe("populateBundle", () => { }, { type: "Blue_Borrow", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -509,7 +512,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: wstEth, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: wstEth, spender: bundler }), + await client.allowance({ erc20: wstEth, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ @@ -539,7 +542,11 @@ describe("populateBundle", () => { usdc_wbtc.id, usdc_wbIB01.id, ], - users: [client.account.address, bundler, steakUsdc.address], + users: [ + client.account.address, + generalAdapter1, + steakUsdc.address, + ], tokens: [usdc, steakUsdc.address], vaults: [steakUsdc.address], block, @@ -574,23 +581,23 @@ describe("populateBundle", () => { address: usdc, args: { amount, - spender: bundler, + spender: generalAdapter1, nonce: 1n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: usdc, args: { amount, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: steakUsdc.address, args: { assets: amount, @@ -609,7 +616,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdc, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: usdc, spender: bundler }), + await client.allowance({ erc20: usdc, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdc, spender: steakUsdc.address }), @@ -635,7 +642,7 @@ describe("populateBundle", () => { usdt_weth_91_5.id, usdt_sDai.id, ], - users: [client.account.address, bundler, bbUsdt.address], + users: [client.account.address, generalAdapter1, bbUsdt.address], tokens: [usdt, stEth, wstEth, bbUsdt.address], vaults: [bbUsdt.address], block, @@ -684,24 +691,24 @@ describe("populateBundle", () => { address: usdt, args: { amount, - spender: bundler, + spender: generalAdapter1, expiration: MathLib.MAX_UINT_48, nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: usdt, args: { amount, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbUsdt.address, args: { assets: amount, @@ -720,7 +727,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdt, spender: permit2 }), ).toBe(MathLib.MAX_UINT_160 - amount); expect( - await client.allowance({ erc20: usdt, spender: bundler }), + await client.allowance({ erc20: usdt, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdt, spender: bbUsdt.address }), @@ -765,7 +772,7 @@ describe("populateBundle", () => { usdt_weth_91_5.id, usdt_sDai.id, ], - users: [client.account.address, bundler, bbUsdt.address], + users: [client.account.address, generalAdapter1, bbUsdt.address], tokens: [usdt, bbUsdt.address], vaults: [bbUsdt.address], block, @@ -825,34 +832,34 @@ describe("populateBundle", () => { address: usdt, args: { amount, - spender: bundler, + spender: generalAdapter1, expiration: MathLib.MAX_UINT_48, nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: usdt, args: { amount, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbUsdt.address, args: { assets: amount, - owner: bundler, + owner: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id: marketParams.id, @@ -879,7 +886,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdt, spender: permit2 }), ).toBe(MathLib.MAX_UINT_160 - amount); expect( - await client.allowance({ erc20: usdt, spender: bundler }), + await client.allowance({ erc20: usdt, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdt, spender: bbUsdt.address }), @@ -925,7 +932,7 @@ describe("populateBundle", () => { usdt_weth_91_5.id, usdt_sDai.id, ], - users: [client.account.address, bundler, bbUsdt.address], + users: [client.account.address, generalAdapter1, bbUsdt.address], tokens: [usdt, bbUsdt.address], vaults: [bbUsdt.address], block, @@ -985,34 +992,34 @@ describe("populateBundle", () => { address: usdt, args: { amount, - spender: bundler, + spender: generalAdapter1, expiration: MathLib.MAX_UINT_48, nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: usdt, args: { amount, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbUsdt.address, args: { assets: amount, - owner: bundler, + owner: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id: marketParams.id, @@ -1022,11 +1029,11 @@ describe("populateBundle", () => { }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: bbUsdt.address, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, @@ -1048,7 +1055,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdt, spender: permit2 }), ).toBe(MathLib.MAX_UINT_160 - amount); expect( - await client.allowance({ erc20: usdt, spender: bundler }), + await client.allowance({ erc20: usdt, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdt, spender: bbUsdt.address }), @@ -1081,7 +1088,7 @@ describe("populateBundle", () => { eth_wbtc.id, eth_wstEth_2.id, ], - users: [client.account.address, bundler, bbEth.address], + users: [client.account.address, generalAdapter1, bbEth.address], tokens: [NATIVE_ADDRESS, wNative, bbEth.address], vaults: [bbEth.address], block, @@ -1144,24 +1151,24 @@ describe("populateBundle", () => { address: wNative, args: { amount: expect.any(BigInt), - spender: bundler, + spender: generalAdapter1, expiration: expect.any(BigInt), nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: wNative, args: { amount: expect.any(BigInt), from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbEth.address, args: { shares, @@ -1172,17 +1179,17 @@ describe("populateBundle", () => { { type: "Erc20_Transfer", address: wNative, - sender: bundler, + sender: generalAdapter1, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, ]); expect( - await client.balanceOf({ erc20: wNative, owner: bundler }), + await client.balanceOf({ erc20: wNative, owner: generalAdapter1 }), ).toBe(0n); expect(await client.maxWithdraw({ erc4626: bbEth.address })).toBe(0n); expect( @@ -1193,7 +1200,10 @@ describe("populateBundle", () => { await client.allowance({ erc20: wNative, spender: permit2 }), ).not.toBe(0n); expect( - await client.allowance({ erc20: wNative, spender: bundler }), + await client.allowance({ + erc20: wNative, + spender: generalAdapter1, + }), ).toBe(0n); expect( await client.allowance({ erc20: wNative, spender: bbUsdt.address }), @@ -1226,7 +1236,7 @@ describe("populateBundle", () => { eth_wbtc.id, eth_wstEth_2.id, ], - users: [client.account.address, bundler, bbEth.address], + users: [client.account.address, generalAdapter1, bbEth.address], tokens: [NATIVE_ADDRESS, wNative, bbEth.address], vaults: [bbEth.address], block, @@ -1285,7 +1295,7 @@ describe("populateBundle", () => { marketIds: [id, usdc_idle.id, usdc_wbtc.id, usdc_wbIB01.id], users: [ client.account.address, - bundler, + generalAdapter1, steakUsdc.address, donator.address, ], @@ -1359,23 +1369,23 @@ describe("populateBundle", () => { address: wstEth, args: { amount: collateralAssets, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: collateralAssets, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -1385,7 +1395,7 @@ describe("populateBundle", () => { }, { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -1394,19 +1404,19 @@ describe("populateBundle", () => { }, { type: "Blue_Borrow", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, shares: loanShares, onBehalf: client.account.address, - receiver: bundler, + receiver: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: steakUsdc.address, args: { assets: loanAssets / 2n, @@ -1416,11 +1426,11 @@ describe("populateBundle", () => { }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: usdc, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, @@ -1436,7 +1446,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: wstEth, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: wstEth, spender: bundler }), + await client.allowance({ erc20: wstEth, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: wstEth, spender: bbEth.address }), @@ -1445,7 +1455,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdc, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: usdc, spender: bundler }), + await client.allowance({ erc20: usdc, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdc, spender: bbEth.address }), @@ -1490,7 +1500,7 @@ describe("populateBundle", () => { eth_wbtc.id, eth_wstEth_2.id, ], - users: [client.account.address, bundler, bbEth.address], + users: [client.account.address, generalAdapter1, bbEth.address], tokens: [NATIVE_ADDRESS, wNative, stEth, wstEth, bbEth.address], vaults: [bbEth.address], block, @@ -1572,7 +1582,7 @@ describe("populateBundle", () => { address: bbEth.address, args: { amount: shares, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, @@ -1582,34 +1592,34 @@ describe("populateBundle", () => { address: wstEth, args: { amount: collateralAssets, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: collateralAssets, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Withdraw", - sender: bundler, + sender: generalAdapter1, address: bbEth.address, args: { shares, owner: client.account.address, - receiver: bundler, + receiver: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -1619,7 +1629,7 @@ describe("populateBundle", () => { }, { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -1628,19 +1638,19 @@ describe("populateBundle", () => { }, { type: "Blue_Borrow", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, assets: loanAssets, onBehalf: client.account.address, - receiver: bundler, + receiver: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbEth.address, args: { assets: loanAssets, @@ -1650,7 +1660,7 @@ describe("populateBundle", () => { }, { type: "Erc20_Unwrap", - sender: bundler, + sender: generalAdapter1, address: wNative, args: { amount: maxUint256, @@ -1660,11 +1670,11 @@ describe("populateBundle", () => { }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: NATIVE_ADDRESS, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, @@ -1732,7 +1742,7 @@ describe("populateBundle", () => { ], users: [ client.account.address, - bundler, + generalAdapter1, bbEth.address, re7Weth.address, ], @@ -1858,7 +1868,7 @@ describe("populateBundle", () => { sender: client.account.address, address: bbEth.address, args: { - spender: bundler, + spender: generalAdapter1, nonce: 0n, amount: expect.any(BigInt), }, @@ -1869,24 +1879,24 @@ describe("populateBundle", () => { address: wNative, args: { amount: loanAssets / 2n, - spender: bundler, + spender: generalAdapter1, expiration: MathLib.MAX_UINT_48, nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: wNative, args: { amount: loanAssets / 2n, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Blue_Repay", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -1897,7 +1907,7 @@ describe("populateBundle", () => { }, { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -1906,7 +1916,7 @@ describe("populateBundle", () => { }, { type: "Blue_WithdrawCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -1917,18 +1927,18 @@ describe("populateBundle", () => { }, { type: "MetaMorpho_Withdraw", - sender: bundler, + sender: generalAdapter1, address: bbEth.address, args: { assets: loanAssets / 2n, owner: client.account.address, - receiver: bundler, + receiver: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "Blue_Repay", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -1939,7 +1949,7 @@ describe("populateBundle", () => { }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: re7Weth.address, args: { assets: loanAssets / 4n, @@ -2061,7 +2071,7 @@ describe("populateBundle", () => { users: [ client.account.address, donator.address, - bundler, + generalAdapter1, steakUsdc.address, bbEth.address, bbUsdc.address, @@ -2157,7 +2167,7 @@ describe("populateBundle", () => { address: wstEth, args: { amount: collateralAssets, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, @@ -2167,19 +2177,19 @@ describe("populateBundle", () => { address: wNative, args: { amount: depositAssets, - spender: bundler, + spender: generalAdapter1, expiration: expect.any(BigInt), nonce: 0n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: collateralAssets, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { @@ -2189,22 +2199,22 @@ describe("populateBundle", () => { args: { amount: bbUsdcFee, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: wNative, args: { amount: depositAssets, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbEth.address, args: { assets: depositAssets, @@ -2214,7 +2224,7 @@ describe("populateBundle", () => { }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -2224,7 +2234,7 @@ describe("populateBundle", () => { }, { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -2233,7 +2243,7 @@ describe("populateBundle", () => { }, { type: "MetaMorpho_PublicReallocate", - sender: bundler, + sender: generalAdapter1, address: bbUsdc.address, args: { withdrawals: [ @@ -2247,7 +2257,7 @@ describe("populateBundle", () => { }, { type: "MetaMorpho_PublicReallocate", - sender: bundler, + sender: generalAdapter1, address: steakUsdc.address, args: { withdrawals: [ @@ -2261,7 +2271,7 @@ describe("populateBundle", () => { }, { type: "Blue_Borrow", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -2280,7 +2290,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: wstEth, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: wstEth, spender: bundler }), + await client.allowance({ erc20: wstEth, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: wstEth, spender: bbEth.address }), @@ -2289,7 +2299,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdc, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: usdc, spender: bundler }), + await client.allowance({ erc20: usdc, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdc, spender: bbEth.address }), @@ -2338,7 +2348,7 @@ describe("populateBundle", () => { const { result } = await renderHook(config, () => useSimulationState({ marketIds: [eth_wstEth.id], - users: [client.account.address, bundler], + users: [client.account.address, generalAdapter1], tokens: [NATIVE_ADDRESS, wNative, stEth, wstEth], vaults: [], block, @@ -2415,24 +2425,24 @@ describe("populateBundle", () => { address: wNative, args: { amount: repayAmount, - spender: bundler, + spender: generalAdapter1, expiration: expect.any(BigInt), nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: wNative, args: { amount: repayAmount, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Blue_Repay", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id: eth_wstEth.id, @@ -2443,7 +2453,7 @@ describe("populateBundle", () => { }, { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -2452,19 +2462,19 @@ describe("populateBundle", () => { }, { type: "Blue_WithdrawCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id: eth_wstEth.id, assets: position.collateral, - receiver: bundler, + receiver: generalAdapter1, onBehalf: client.account.address, }, }, { type: "Erc20_Unwrap", address: wstEth, - sender: bundler, + sender: generalAdapter1, args: { amount: maxUint256, receiver: client.account.address, @@ -2474,20 +2484,20 @@ describe("populateBundle", () => { { type: "Erc20_Transfer", address: wNative, - sender: bundler, + sender: generalAdapter1, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, { type: "Erc20_Transfer", address: stEth, - sender: bundler, + sender: generalAdapter1, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, @@ -2512,13 +2522,13 @@ describe("populateBundle", () => { expect(chainPosition.borrowShares).toBe(0n); expect( - await client.balanceOf({ erc20: wstEth, owner: bundler }), + await client.balanceOf({ erc20: wstEth, owner: generalAdapter1 }), ).toBe(0n); - expect(await client.balanceOf({ erc20: stEth, owner: bundler })).toBe( - 1n, - ); // 1 stETH is always remaining in the bundler expect( - await client.balanceOf({ erc20: wNative, owner: bundler }), + await client.balanceOf({ erc20: stEth, owner: generalAdapter1 }), + ).toBe(1n); // 1 stETH is always remaining in the bundler + expect( + await client.balanceOf({ erc20: wNative, owner: generalAdapter1 }), ).toBe(0n); expect(await client.balanceOf({ erc20: stEth })).toBe( @@ -2538,7 +2548,7 @@ describe("populateBundle", () => { const { morpho, permit2, - bundler, + bundler3: { generalAdapter1 }, publicAllocator, wNative, wstEth, @@ -2588,7 +2598,7 @@ describe("populateBundle", () => { const { result } = await renderHook(config, () => useSimulationState({ marketIds: [id], - users: [client.account.address, bundler], + users: [client.account.address, generalAdapter1], tokens: [wNative], vaults: [], block, @@ -2647,7 +2657,7 @@ describe("populateBundle", () => { const { result } = await renderHook(config, () => useSimulationState({ marketIds: [id], - users: [client.account.address, bundler], + users: [client.account.address, generalAdapter1], tokens: [NATIVE_ADDRESS, wNative, stEth, wstEth], vaults: [], block, @@ -2659,7 +2669,10 @@ describe("populateBundle", () => { const data = result.current.data!; const { balance } = data.getHolding(client.account.address, stEth); - const { balance: bundlerBalance } = data.getHolding(bundler, stEth); + const { balance: bundlerBalance } = data.getHolding( + generalAdapter1, + stEth, + ); const wstEthToken = data.getWrappedToken(wstEth); const assets = @@ -2678,7 +2691,7 @@ describe("populateBundle", () => { address: wstEth, args: { amount: balance, - owner: bundler, + owner: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, @@ -2702,12 +2715,12 @@ describe("populateBundle", () => { { type: "erc20Approve", tx: { to: wstEth, data: expect.any(String) }, - args: [wstEth, bundler, wBalance], + args: [wstEth, generalAdapter1, wBalance], }, { type: "erc20Approve", tx: { to: stEth, data: expect.any(String) }, - args: [stEth, bundler, balance - bundlerBalance], + args: [stEth, generalAdapter1, balance - bundlerBalance], }, ]); @@ -2727,7 +2740,7 @@ describe("populateBundle", () => { address: wstEth, args: { amount: wBalance, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, @@ -2737,44 +2750,44 @@ describe("populateBundle", () => { address: stEth, args: { amount: balance - bundlerBalance, - spender: bundler, + spender: generalAdapter1, expiration: MathLib.MAX_UINT_48, nonce: 0n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: wBalance, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: stEth, args: { amount: balance - bundlerBalance, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Erc20_Wrap", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: balance, - owner: bundler, + owner: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -2784,11 +2797,11 @@ describe("populateBundle", () => { }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, @@ -2811,7 +2824,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: stEth, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: stEth, spender: bundler }), + await client.allowance({ erc20: stEth, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ @@ -2846,7 +2859,7 @@ describe("populateBundle", () => { const { result } = await renderHook(config, () => useSimulationState({ marketIds: [id], - users: [client.account.address, bundler], + users: [client.account.address, generalAdapter1], tokens: [usdc, stEth, wstEth], vaults: [], block, @@ -2881,7 +2894,7 @@ describe("populateBundle", () => { expect(bundle.requirements.txs).toStrictEqual([ { - args: [bundler, true], + args: [generalAdapter1, true], tx: { to: morpho, data: expect.any(String), @@ -2893,7 +2906,7 @@ describe("populateBundle", () => { expect(operations).toStrictEqual([ { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -2902,7 +2915,7 @@ describe("populateBundle", () => { }, { type: "Blue_Borrow", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -2932,7 +2945,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: wstEth, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: wstEth, spender: bundler }), + await client.allowance({ erc20: wstEth, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ @@ -2962,7 +2975,11 @@ describe("populateBundle", () => { usdc_wbtc.id, usdc_wbIB01.id, ], - users: [client.account.address, bundler, steakUsdc.address], + users: [ + client.account.address, + generalAdapter1, + steakUsdc.address, + ], tokens: [usdc, stEth, wstEth, steakUsdc.address], vaults: [steakUsdc.address], block, @@ -2997,7 +3014,7 @@ describe("populateBundle", () => { { type: "erc20Approve", tx: { to: usdc, data: expect.any(String) }, - args: [usdc, bundler, amount], + args: [usdc, generalAdapter1, amount], }, ]); @@ -3008,23 +3025,23 @@ describe("populateBundle", () => { address: usdc, args: { amount, - spender: bundler, + spender: generalAdapter1, nonce: 1n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: usdc, args: { amount, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: steakUsdc.address, args: { assets: amount, @@ -3043,7 +3060,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdc, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: usdc, spender: bundler }), + await client.allowance({ erc20: usdc, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdc, spender: steakUsdc.address }), @@ -3069,7 +3086,7 @@ describe("populateBundle", () => { usdt_weth_91_5.id, usdt_sDai.id, ], - users: [client.account.address, bundler, bbUsdt.address], + users: [client.account.address, generalAdapter1, bbUsdt.address], tokens: [usdt, stEth, wstEth, bbUsdt.address], vaults: [bbUsdt.address], block, @@ -3103,7 +3120,7 @@ describe("populateBundle", () => { { type: "erc20Approve", tx: { to: usdt, data: expect.any(String) }, - args: [usdt, bundler, amount], + args: [usdt, generalAdapter1, amount], }, ]); @@ -3123,24 +3140,24 @@ describe("populateBundle", () => { address: usdt, args: { amount, - spender: bundler, + spender: generalAdapter1, expiration: MathLib.MAX_UINT_48, nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: usdt, args: { amount, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbUsdt.address, args: { assets: amount, @@ -3159,7 +3176,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdt, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: usdt, spender: bundler }), + await client.allowance({ erc20: usdt, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdt, spender: bbUsdt.address }), @@ -3204,7 +3221,7 @@ describe("populateBundle", () => { usdt_weth_91_5.id, usdt_sDai.id, ], - users: [client.account.address, bundler, bbUsdt.address], + users: [client.account.address, generalAdapter1, bbUsdt.address], tokens: [usdt, stEth, wstEth, bbUsdt.address], vaults: [bbUsdt.address], block, @@ -3252,7 +3269,7 @@ describe("populateBundle", () => { to: usdt, data: expect.any(String), }, - args: [usdt, bundler, amount], + args: [usdt, generalAdapter1, amount], }, ]); @@ -3272,34 +3289,34 @@ describe("populateBundle", () => { address: usdt, args: { amount, - spender: bundler, + spender: generalAdapter1, expiration: MathLib.MAX_UINT_48, nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: usdt, args: { amount, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbUsdt.address, args: { assets: amount, - owner: bundler, + owner: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id: marketParams.id, @@ -3326,7 +3343,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdt, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: usdt, spender: bundler }), + await client.allowance({ erc20: usdt, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdt, spender: bbUsdt.address }), @@ -3372,7 +3389,7 @@ describe("populateBundle", () => { usdt_weth_91_5.id, usdt_sDai.id, ], - users: [client.account.address, bundler, bbUsdt.address], + users: [client.account.address, generalAdapter1, bbUsdt.address], tokens: [usdt, stEth, wstEth, bbUsdt.address], vaults: [bbUsdt.address], block, @@ -3417,7 +3434,7 @@ describe("populateBundle", () => { { type: "erc20Approve", tx: { to: usdt, data: expect.any(String) }, - args: [usdt, bundler, amount], + args: [usdt, generalAdapter1, amount], }, ]); @@ -3437,34 +3454,34 @@ describe("populateBundle", () => { address: usdt, args: { amount, - spender: bundler, + spender: generalAdapter1, expiration: MathLib.MAX_UINT_48, nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: usdt, args: { amount, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbUsdt.address, args: { assets: amount, - owner: bundler, + owner: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id: marketParams.id, @@ -3474,11 +3491,11 @@ describe("populateBundle", () => { }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: bbUsdt.address, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, @@ -3500,7 +3517,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdt, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: usdt, spender: bundler }), + await client.allowance({ erc20: usdt, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdt, spender: bbUsdt.address }), @@ -3533,7 +3550,7 @@ describe("populateBundle", () => { eth_wbtc.id, eth_wstEth_2.id, ], - users: [client.account.address, bundler, bbEth.address], + users: [client.account.address, generalAdapter1, bbEth.address], tokens: [NATIVE_ADDRESS, wNative, bbEth.address], vaults: [bbEth.address], block, @@ -3577,7 +3594,7 @@ describe("populateBundle", () => { { type: "erc20Approve", tx: { to: wNative, data: expect.any(String) }, - args: [wNative, bundler, expect.any(BigInt)], + args: [wNative, generalAdapter1, expect.any(BigInt)], }, ]); @@ -3597,24 +3614,24 @@ describe("populateBundle", () => { address: wNative, args: { amount: expect.any(BigInt), - spender: bundler, + spender: generalAdapter1, expiration: expect.any(BigInt), nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: wNative, args: { amount: expect.any(BigInt), from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbEth.address, args: { shares, @@ -3625,17 +3642,17 @@ describe("populateBundle", () => { { type: "Erc20_Transfer", address: wNative, - sender: bundler, + sender: generalAdapter1, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, ]); expect( - await client.balanceOf({ erc20: wNative, owner: bundler }), + await client.balanceOf({ erc20: wNative, owner: generalAdapter1 }), ).toBe(0n); expect(await client.maxWithdraw({ erc4626: bbEth.address })).toBe(0n); expect( @@ -3646,7 +3663,10 @@ describe("populateBundle", () => { await client.allowance({ erc20: wNative, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: wNative, spender: bundler }), + await client.allowance({ + erc20: wNative, + spender: generalAdapter1, + }), ).toBe(0n); expect( await client.allowance({ erc20: wNative, spender: bbUsdt.address }), @@ -3679,7 +3699,7 @@ describe("populateBundle", () => { eth_wbtc.id, eth_wstEth_2.id, ], - users: [client.account.address, bundler, bbEth.address], + users: [client.account.address, generalAdapter1, bbEth.address], tokens: [NATIVE_ADDRESS, wNative, bbEth.address], vaults: [bbEth.address], block, @@ -3739,7 +3759,7 @@ describe("populateBundle", () => { marketIds: [id, usdc_idle.id, usdc_wbtc.id, usdc_wbIB01.id], users: [ client.account.address, - bundler, + generalAdapter1, steakUsdc.address, donator.address, ], @@ -3809,12 +3829,12 @@ describe("populateBundle", () => { { type: "erc20Approve", tx: { to: wstEth, data: expect.any(String) }, - args: [wstEth, bundler, collateralAssets], + args: [wstEth, generalAdapter1, collateralAssets], }, { type: "morphoSetAuthorization", tx: { to: morpho, data: expect.any(String) }, - args: [bundler, true], + args: [generalAdapter1, true], }, ]); @@ -3825,23 +3845,23 @@ describe("populateBundle", () => { address: wstEth, args: { amount: collateralAssets, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: collateralAssets, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -3851,7 +3871,7 @@ describe("populateBundle", () => { }, { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -3860,19 +3880,19 @@ describe("populateBundle", () => { }, { type: "Blue_Borrow", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, shares: loanShares, onBehalf: client.account.address, - receiver: bundler, + receiver: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: steakUsdc.address, args: { assets: loanAssets / 2n, @@ -3882,11 +3902,11 @@ describe("populateBundle", () => { }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: usdc, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, @@ -3902,7 +3922,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: wstEth, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: wstEth, spender: bundler }), + await client.allowance({ erc20: wstEth, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: wstEth, spender: bbEth.address }), @@ -3911,7 +3931,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdc, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: usdc, spender: bundler }), + await client.allowance({ erc20: usdc, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdc, spender: bbEth.address }), @@ -3956,7 +3976,7 @@ describe("populateBundle", () => { eth_wbtc.id, eth_wstEth.id, ], - users: [client.account.address, bundler, bbEth.address], + users: [client.account.address, generalAdapter1, bbEth.address], tokens: [NATIVE_ADDRESS, wNative, stEth, wstEth, bbEth.address], vaults: [bbEth.address], block, @@ -4034,17 +4054,17 @@ describe("populateBundle", () => { { type: "erc20Approve", tx: { to: bbEth.address, data: expect.any(String) }, - args: [bbEth.address, bundler, shares], + args: [bbEth.address, generalAdapter1, shares], }, { type: "erc20Approve", tx: { to: wstEth, data: expect.any(String) }, - args: [wstEth, bundler, collateralAssets], + args: [wstEth, generalAdapter1, collateralAssets], }, { type: "morphoSetAuthorization", tx: { to: morpho, data: expect.any(String) }, - args: [bundler, true], + args: [generalAdapter1, true], }, ]); @@ -4055,7 +4075,7 @@ describe("populateBundle", () => { address: bbEth.address, args: { amount: shares, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, @@ -4065,34 +4085,34 @@ describe("populateBundle", () => { address: wstEth, args: { amount: collateralAssets, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: collateralAssets, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Withdraw", - sender: bundler, + sender: generalAdapter1, address: bbEth.address, args: { shares, owner: client.account.address, - receiver: bundler, + receiver: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -4102,7 +4122,7 @@ describe("populateBundle", () => { }, { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -4111,19 +4131,19 @@ describe("populateBundle", () => { }, { type: "Blue_Borrow", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, assets: loanAssets, onBehalf: client.account.address, - receiver: bundler, + receiver: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbEth.address, args: { assets: loanAssets, @@ -4133,7 +4153,7 @@ describe("populateBundle", () => { }, { type: "Erc20_Unwrap", - sender: bundler, + sender: generalAdapter1, address: wNative, args: { amount: maxUint256, @@ -4143,11 +4163,11 @@ describe("populateBundle", () => { }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: NATIVE_ADDRESS, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, @@ -4215,7 +4235,7 @@ describe("populateBundle", () => { ], users: [ client.account.address, - bundler, + generalAdapter1, bbEth.address, re7Weth.address, ], @@ -4323,17 +4343,17 @@ describe("populateBundle", () => { { type: "erc20Approve", tx: { to: bbEth.address, data: expect.any(String) }, - args: [bbEth.address, bundler, expect.any(BigInt)], + args: [bbEth.address, generalAdapter1, expect.any(BigInt)], }, { type: "erc20Approve", tx: { to: wNative, data: expect.any(String) }, - args: [wNative, bundler, loanAssets / 2n], + args: [wNative, generalAdapter1, loanAssets / 2n], }, { type: "morphoSetAuthorization", tx: { to: morpho, data: expect.any(String) }, - args: [bundler, true], + args: [generalAdapter1, true], }, ]); @@ -4352,7 +4372,7 @@ describe("populateBundle", () => { sender: client.account.address, address: bbEth.address, args: { - spender: bundler, + spender: generalAdapter1, nonce: 0n, amount: expect.any(BigInt), }, @@ -4363,24 +4383,24 @@ describe("populateBundle", () => { address: wNative, args: { amount: loanAssets / 2n, - spender: bundler, + spender: generalAdapter1, expiration: MathLib.MAX_UINT_48, nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: wNative, args: { amount: loanAssets / 2n, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Blue_Repay", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -4391,7 +4411,7 @@ describe("populateBundle", () => { }, { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -4400,7 +4420,7 @@ describe("populateBundle", () => { }, { type: "Blue_WithdrawCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -4411,18 +4431,18 @@ describe("populateBundle", () => { }, { type: "MetaMorpho_Withdraw", - sender: bundler, + sender: generalAdapter1, address: bbEth.address, args: { assets: loanAssets / 2n, owner: client.account.address, - receiver: bundler, + receiver: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, { type: "Blue_Repay", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -4433,7 +4453,7 @@ describe("populateBundle", () => { }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: re7Weth.address, args: { assets: loanAssets / 4n, @@ -4555,7 +4575,7 @@ describe("populateBundle", () => { users: [ client.account.address, donator.address, - bundler, + generalAdapter1, steakUsdc.address, bbEth.address, bbUsdc.address, @@ -4632,17 +4652,17 @@ describe("populateBundle", () => { { type: "erc20Approve", tx: { to: wstEth, data: expect.any(String) }, - args: [wstEth, bundler, collateralAssets], + args: [wstEth, generalAdapter1, collateralAssets], }, { type: "erc20Approve", tx: { to: wNative, data: expect.any(String) }, - args: [wNative, bundler, depositAssets], + args: [wNative, generalAdapter1, depositAssets], }, { type: "morphoSetAuthorization", tx: { to: morpho, data: expect.any(String) }, - args: [bundler, true], + args: [generalAdapter1, true], }, ]); @@ -4662,7 +4682,7 @@ describe("populateBundle", () => { address: wstEth, args: { amount: collateralAssets, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, @@ -4672,19 +4692,19 @@ describe("populateBundle", () => { address: wNative, args: { amount: depositAssets, - spender: bundler, + spender: generalAdapter1, expiration: expect.any(BigInt), nonce: 0n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: wstEth, args: { amount: collateralAssets, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { @@ -4694,22 +4714,22 @@ describe("populateBundle", () => { args: { amount: bbUsdcFee, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: wNative, args: { amount: depositAssets, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "MetaMorpho_Deposit", - sender: bundler, + sender: generalAdapter1, address: bbEth.address, args: { assets: depositAssets, @@ -4719,7 +4739,7 @@ describe("populateBundle", () => { }, { type: "Blue_SupplyCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -4729,7 +4749,7 @@ describe("populateBundle", () => { }, { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -4738,7 +4758,7 @@ describe("populateBundle", () => { }, { type: "MetaMorpho_PublicReallocate", - sender: bundler, + sender: generalAdapter1, address: bbUsdc.address, args: { withdrawals: [ @@ -4752,7 +4772,7 @@ describe("populateBundle", () => { }, { type: "MetaMorpho_PublicReallocate", - sender: bundler, + sender: generalAdapter1, address: steakUsdc.address, args: { withdrawals: [ @@ -4766,7 +4786,7 @@ describe("populateBundle", () => { }, { type: "Blue_Borrow", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id, @@ -4785,7 +4805,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: wstEth, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: wstEth, spender: bundler }), + await client.allowance({ erc20: wstEth, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: wstEth, spender: bbEth.address }), @@ -4794,7 +4814,7 @@ describe("populateBundle", () => { await client.allowance({ erc20: usdc, spender: permit2 }), ).toBe(0n); expect( - await client.allowance({ erc20: usdc, spender: bundler }), + await client.allowance({ erc20: usdc, spender: generalAdapter1 }), ).toBe(0n); expect( await client.allowance({ erc20: usdc, spender: bbEth.address }), @@ -4844,7 +4864,7 @@ describe("populateBundle", () => { const { result } = await renderHook(config, () => useSimulationState({ marketIds: [eth_wstEth.id], - users: [client.account.address, bundler], + users: [client.account.address, generalAdapter1], tokens: [NATIVE_ADDRESS, wNative, stEth, wstEth], vaults: [], block, @@ -4901,12 +4921,12 @@ describe("populateBundle", () => { { type: "erc20Approve", tx: { to: wNative, data: expect.any(String) }, - args: [wNative, bundler, expect.any(BigInt)], + args: [wNative, generalAdapter1, expect.any(BigInt)], }, { type: "morphoSetAuthorization", tx: { to: morpho, data: expect.any(String) }, - args: [bundler, true], + args: [generalAdapter1, true], }, ]); @@ -4926,24 +4946,24 @@ describe("populateBundle", () => { address: wNative, args: { amount: repayAmount, - spender: bundler, + spender: generalAdapter1, expiration: expect.any(BigInt), nonce: 0n, }, }, { type: "Erc20_Transfer2", - sender: bundler, + sender: generalAdapter1, address: wNative, args: { amount: repayAmount, from: client.account.address, - to: bundler, + to: generalAdapter1, }, }, { type: "Blue_Repay", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id: eth_wstEth.id, @@ -4954,7 +4974,7 @@ describe("populateBundle", () => { }, { type: "Blue_SetAuthorization", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { owner: client.account.address, @@ -4963,19 +4983,19 @@ describe("populateBundle", () => { }, { type: "Blue_WithdrawCollateral", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id: eth_wstEth.id, assets: position.collateral, - receiver: bundler, + receiver: generalAdapter1, onBehalf: client.account.address, }, }, { type: "Erc20_Unwrap", address: wstEth, - sender: bundler, + sender: generalAdapter1, args: { amount: maxUint256, receiver: client.account.address, @@ -4985,20 +5005,20 @@ describe("populateBundle", () => { { type: "Erc20_Transfer", address: wNative, - sender: bundler, + sender: generalAdapter1, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, { type: "Erc20_Transfer", address: stEth, - sender: bundler, + sender: generalAdapter1, args: { amount: maxUint256, - from: bundler, + from: generalAdapter1, to: client.account.address, }, }, @@ -5023,13 +5043,13 @@ describe("populateBundle", () => { expect(chainPosition.borrowShares).toBe(0n); expect( - await client.balanceOf({ erc20: wstEth, owner: bundler }), + await client.balanceOf({ erc20: wstEth, owner: generalAdapter1 }), ).toBe(0n); - expect(await client.balanceOf({ erc20: stEth, owner: bundler })).toBe( - 1n, - ); // 1 stETH is always remaining in the bundler expect( - await client.balanceOf({ erc20: wNative, owner: bundler }), + await client.balanceOf({ erc20: stEth, owner: generalAdapter1 }), + ).toBe(1n); // 1 stETH is always remaining in the bundler + expect( + await client.balanceOf({ erc20: wNative, owner: generalAdapter1 }), ).toBe(0n); expect(await client.balanceOf({ erc20: stEth })).toBe( @@ -5044,8 +5064,14 @@ describe("populateBundle", () => { }); describe("base", () => { - const { morpho, bundler, adaptiveCurveIrm, wNative, usdc, verUsdc } = - addresses[ChainId.BaseMainnet]; + const { + morpho, + bundler3: { generalAdapter1 }, + adaptiveCurveIrm, + wNative, + usdc, + verUsdc, + } = addresses[ChainId.BaseMainnet]; test[ChainId.BaseMainnet]( "should wrap then supply aUSDC", @@ -5079,7 +5105,7 @@ describe("populateBundle", () => { const { result } = await renderHook(config, () => useSimulationState({ marketIds: [marketParams.id], - users: [whitelisted, bundler], + users: [whitelisted, generalAdapter1], tokens: [usdc, verUsdc, wNative], vaults: [], block, @@ -5098,7 +5124,7 @@ describe("populateBundle", () => { address: verUsdc, args: { amount: assets, - owner: bundler, + owner: generalAdapter1, slippage: DEFAULT_SLIPPAGE_TOLERANCE, }, }, @@ -5126,7 +5152,7 @@ describe("populateBundle", () => { address: usdc, args: { amount: assets, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, @@ -5136,23 +5162,23 @@ describe("populateBundle", () => { address: verUsdc, args: { amount: assets, - spender: bundler, + spender: generalAdapter1, nonce: 0n, }, }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: usdc, args: { amount: assets, from: whitelisted, - to: bundler, + to: generalAdapter1, }, }, { type: "Erc20_Wrap", - sender: bundler, + sender: generalAdapter1, address: verUsdc, args: { amount: assets, @@ -5162,17 +5188,17 @@ describe("populateBundle", () => { }, { type: "Erc20_Transfer", - sender: bundler, + sender: generalAdapter1, address: verUsdc, args: { amount: assets, from: whitelisted, - to: bundler, + to: generalAdapter1, }, }, { type: "Blue_Supply", - sender: bundler, + sender: generalAdapter1, address: morpho, args: { id: marketParams.id, diff --git a/packages/bundler-sdk-viem/test/setup.ts b/packages/bundler-sdk-viem/test/setup.ts index 86f1a85c..44aff58c 100644 --- a/packages/bundler-sdk-viem/test/setup.ts +++ b/packages/bundler-sdk-viem/test/setup.ts @@ -5,10 +5,10 @@ import { base, mainnet } from "viem/chains"; export const test = { [ChainId.EthMainnet]: createWagmiTest(mainnet, { forkUrl: process.env.MAINNET_RPC_URL, - forkBlockNumber: 19_750_000, + forkBlockNumber: 21_666_000, }), [ChainId.BaseMainnet]: createWagmiTest(base, { forkUrl: process.env.BASE_RPC_URL, - forkBlockNumber: 16_260_000, + forkBlockNumber: 25_298_000, }), } as const;