11import { encodeFunctionData , parseUnits } from "viem" ;
22import { morphoBlueAbi , type MorphoMarketParams } from "../../abis/morpho-blue.js" ;
3- import { erc20Abi } from "../../abis/erc20.js" ;
43import { getClient } from "../../data/rpc.js" ;
54import { CONTRACTS } from "../../config/contracts.js" ;
6- import { buildApprovalTx , resolveApprovalCap } from "../shared/approval.js" ;
5+ import { buildApprovalTx , chainApproval , resolveApprovalCap } from "../shared/approval.js" ;
6+ import { resolveTokenMeta } from "../shared/token-meta.js" ;
77import type {
88 PrepareMorphoSupplyArgs ,
99 PrepareMorphoWithdrawArgs ,
@@ -47,21 +47,6 @@ async function resolveMarketParams(
4747 return { loanToken, collateralToken, oracle, irm, lltv } ;
4848}
4949
50- async function tokenMeta (
51- chain : SupportedChain ,
52- asset : `0x${string } `
53- ) : Promise < { decimals : number ; symbol : string } > {
54- const client = getClient ( chain ) ;
55- const [ decimals , symbol ] = await client . multicall ( {
56- contracts : [
57- { address : asset , abi : erc20Abi , functionName : "decimals" } ,
58- { address : asset , abi : erc20Abi , functionName : "symbol" } ,
59- ] ,
60- allowFailure : false ,
61- } ) ;
62- return { decimals : Number ( decimals ) , symbol : symbol as string } ;
63- }
64-
6550function paramsTuple ( p : MorphoMarketParams ) {
6651 return {
6752 loanToken : p . loanToken ,
@@ -77,7 +62,7 @@ export async function buildMorphoSupply(p: PrepareMorphoSupplyArgs): Promise<Uns
7762 const wallet = p . wallet as `0x${string } `;
7863 const morpho = morphoAddress ( chain ) ;
7964 const params = await resolveMarketParams ( chain , p . marketId as `0x${string } `) ;
80- const meta = await tokenMeta ( chain , params . loanToken ) ;
65+ const meta = await resolveTokenMeta ( chain , params . loanToken ) ;
8166 const amountWei = parseUnits ( p . amount , meta . decimals ) ;
8267 const { approvalAmount, display } = resolveApprovalCap (
8368 p . approvalCap ,
@@ -111,21 +96,15 @@ export async function buildMorphoSupply(p: PrepareMorphoSupplyArgs): Promise<Uns
11196 args : { marketId : p . marketId , amount : p . amount , onBehalf : wallet } ,
11297 } ,
11398 } ;
114- if ( approval ) {
115- let tail = approval ;
116- while ( tail . next ) tail = tail . next ;
117- tail . next = supplyTx ;
118- return approval ;
119- }
120- return supplyTx ;
99+ return chainApproval ( approval , supplyTx ) ;
121100}
122101
123102export async function buildMorphoWithdraw ( p : PrepareMorphoWithdrawArgs ) : Promise < UnsignedTx > {
124103 const chain = p . chain as SupportedChain ;
125104 const wallet = p . wallet as `0x${string } `;
126105 const morpho = morphoAddress ( chain ) ;
127106 const params = await resolveMarketParams ( chain , p . marketId as `0x${string } `) ;
128- const meta = await tokenMeta ( chain , params . loanToken ) ;
107+ const meta = await resolveTokenMeta ( chain , params . loanToken ) ;
129108 // "max" withdraw is encoded as shares=MaxUint256/2 would exceed position; safer to ask by assets with
130109 // a very large number. Morpho reverts on overdraw, so callers should read their position first.
131110 // Here we only support explicit amounts for withdraw.
@@ -158,7 +137,7 @@ export async function buildMorphoBorrow(p: PrepareMorphoBorrowArgs): Promise<Uns
158137 const wallet = p . wallet as `0x${string } `;
159138 const morpho = morphoAddress ( chain ) ;
160139 const params = await resolveMarketParams ( chain , p . marketId as `0x${string } `) ;
161- const meta = await tokenMeta ( chain , params . loanToken ) ;
140+ const meta = await resolveTokenMeta ( chain , params . loanToken ) ;
162141 const amountWei = parseUnits ( p . amount , meta . decimals ) ;
163142 return {
164143 chain,
@@ -183,7 +162,7 @@ export async function buildMorphoRepay(p: PrepareMorphoRepayArgs): Promise<Unsig
183162 const wallet = p . wallet as `0x${string } `;
184163 const morpho = morphoAddress ( chain ) ;
185164 const params = await resolveMarketParams ( chain , p . marketId as `0x${string } `) ;
186- const meta = await tokenMeta ( chain , params . loanToken ) ;
165+ const meta = await resolveTokenMeta ( chain , params . loanToken ) ;
187166 if ( p . amount === "max" ) {
188167 throw new Error (
189168 `"max" is not supported for Morpho repay — read borrowShares and pass an explicit amount.`
@@ -222,13 +201,7 @@ export async function buildMorphoRepay(p: PrepareMorphoRepayArgs): Promise<Unsig
222201 args : { marketId : p . marketId , amount : p . amount , onBehalf : wallet } ,
223202 } ,
224203 } ;
225- if ( approval ) {
226- let tail = approval ;
227- while ( tail . next ) tail = tail . next ;
228- tail . next = repayTx ;
229- return approval ;
230- }
231- return repayTx ;
204+ return chainApproval ( approval , repayTx ) ;
232205}
233206
234207export async function buildMorphoSupplyCollateral (
@@ -238,7 +211,7 @@ export async function buildMorphoSupplyCollateral(
238211 const wallet = p . wallet as `0x${string } `;
239212 const morpho = morphoAddress ( chain ) ;
240213 const params = await resolveMarketParams ( chain , p . marketId as `0x${string } `) ;
241- const meta = await tokenMeta ( chain , params . collateralToken ) ;
214+ const meta = await resolveTokenMeta ( chain , params . collateralToken ) ;
242215 const amountWei = parseUnits ( p . amount , meta . decimals ) ;
243216 const { approvalAmount, display } = resolveApprovalCap (
244217 p . approvalCap ,
@@ -272,13 +245,7 @@ export async function buildMorphoSupplyCollateral(
272245 args : { marketId : p . marketId , amount : p . amount , onBehalf : wallet } ,
273246 } ,
274247 } ;
275- if ( approval ) {
276- let tail = approval ;
277- while ( tail . next ) tail = tail . next ;
278- tail . next = tx ;
279- return approval ;
280- }
281- return tx ;
248+ return chainApproval ( approval , tx ) ;
282249}
283250
284251export async function buildMorphoWithdrawCollateral (
@@ -288,7 +255,7 @@ export async function buildMorphoWithdrawCollateral(
288255 const wallet = p . wallet as `0x${string } `;
289256 const morpho = morphoAddress ( chain ) ;
290257 const params = await resolveMarketParams ( chain , p . marketId as `0x${string } `) ;
291- const meta = await tokenMeta ( chain , params . collateralToken ) ;
258+ const meta = await resolveTokenMeta ( chain , params . collateralToken ) ;
292259 if ( p . amount === "max" ) {
293260 throw new Error (
294261 `"max" is not supported for Morpho withdrawCollateral — read position.collateral and pass an explicit amount.`
0 commit comments