@@ -208,7 +208,8 @@ export class Paymaster {
208208 return paymasterAndData ;
209209 }
210210
211- async getQuotesMultiToken ( userOp : any , entryPoint : string , chainId : number , multiTokenPaymasters : any , tokens_list : string [ ] , oracles : any , bundlerRpc : string , oracleName : string , log ?: FastifyBaseLogger ) {
211+ async getQuotesMultiToken ( userOp : any , entryPoint : string , chainId : number , multiTokenPaymasters : any , tokens_list : string [ ] , oracles : any ,
212+ bundlerRpc : string , oracleName : string , nativeOracleAddress : string , log ?: FastifyBaseLogger ) {
212213 try {
213214 const provider = new providers . JsonRpcProvider ( bundlerRpc ) ;
214215 const quotes = [ ] , unsupportedTokens = [ ] ;
@@ -240,6 +241,14 @@ export class Paymaster {
240241 const paymasterContract = new ethers . Contract ( result . paymasterAddress , MultiTokenPaymasterAbi , provider ) ;
241242 result . postOpGas = await paymasterContract . UNACCOUNTED_COST ;
242243
244+ let ETHUSDPrice : any , ETHUSDPriceDecimal ;
245+ if ( oracleName === "chainlink" ) {
246+ const nativeOracleContract = new ethers . Contract ( nativeOracleAddress , ChainlinkOracleAbi , provider ) ;
247+ const ETHprice = await nativeOracleContract . latestRoundData ( ) ;
248+ ETHUSDPrice = ETHprice . answer ;
249+ ETHUSDPriceDecimal = await nativeOracleContract . decimals ( ) ;
250+ result . etherUSDExchangeRate = ETHprice . answer ;
251+ }
243252 for ( let i = 0 ; i < tokens_list . length ; i ++ ) {
244253 const gasToken = tokens_list [ i ] ;
245254 if ( ! ( multiTokenPaymasters [ chainId ] && multiTokenPaymasters [ chainId ] [ gasToken ] ) &&
@@ -258,20 +267,28 @@ export class Paymaster {
258267 ethPrice = Number ( ethers . utils . formatUnits ( ETHprice , 18 - decimals ) ) . toFixed ( 0 ) ;
259268 } else if ( oracleName === "chainlink" ) {
260269 const chainlinkContract = new ethers . Contract ( oracleAddress , ChainlinkOracleAbi , provider ) ;
261- const ETHprice = await chainlinkContract . latestRoundData ( ) ;
262- ethPrice = ETHprice . answer ;
270+ const ETHpriceDecimal = await chainlinkContract . decimals ( ) ;
271+ let ETHprice = await chainlinkContract . latestAnswer ( ) ;
272+ ETHUSDPrice = ethers . utils . formatUnits ( ETHUSDPrice , ETHUSDPriceDecimal ) ;
273+ ETHprice = ethers . utils . formatUnits ( ETHprice , ETHpriceDecimal ) ;
274+ ETHUSDPrice = ethers . utils . parseEther ( ETHUSDPrice ) ;
275+ ETHprice = ethers . utils . parseEther ( ETHprice ) ;
276+ const tokenContract = new ethers . Contract ( gasToken , ERC20Abi , provider ) ;
277+ const decimals = Number ( await tokenContract . decimals ( ) ) ;
278+ ethPrice = ethers . utils . parseUnits ( ( ETHUSDPrice / ETHprice ) . toFixed ( decimals ) , decimals ) . toString ( )
263279 } else {
264280 const ecContract = new ethers . Contract ( oracleAddress , EtherspotChainlinkOracleAbi , provider ) ;
265281 const ETHprice = await ecContract . cachedPrice ( ) ;
266282 ethPrice = ETHprice
267283 }
268- result . etherUSDExchangeRate = BigNumber . from ( ethPrice ) . toHexString ( ) ;
284+ if ( result . etherUSDExchangeRate === "0x" )
285+ result . etherUSDExchangeRate = BigNumber . from ( ethPrice ) . toHexString ( ) ;
269286 const symbol = await tokenContract . symbol ( ) ;
270287 quotes . push ( {
271288 token : gasToken ,
272289 symbol : symbol ,
273290 decimals : decimals ,
274- etherTokenExchangeRate : ethPrice ,
291+ etherTokenExchangeRate : BigNumber . from ( ethPrice ) . toHexString ( ) ,
275292 serviceFeePercent : ( this . multiTokenMarkUp / 10000 - 100 )
276293 } )
277294 }
@@ -288,11 +305,12 @@ export class Paymaster {
288305 }
289306
290307 async signMultiTokenPaymaster ( userOp : any , validUntil : string , validAfter : string , entryPoint : string , paymasterAddress : string ,
291- feeToken : string , oracleAggregator : string , bundlerRpc : string , signer : Wallet , oracleName : string , log ?: FastifyBaseLogger ) {
308+ feeToken : string , oracleAggregator : string , bundlerRpc : string , signer : Wallet , oracleName : string , nativeOracleAddress : string , log ?: FastifyBaseLogger ) {
292309 try {
293310 const provider = new providers . JsonRpcProvider ( bundlerRpc ) ;
294311 const paymasterContract = new ethers . Contract ( paymasterAddress , MultiTokenPaymasterAbi , provider ) ;
295312 let ethPrice = "" ;
313+
296314 if ( oracleName === "orochi" ) {
297315 const oracleContract = new ethers . Contract ( oracleAggregator , OrochiOracleAbi , provider ) ;
298316 const ETHprice = await oracleContract . getLatestData ( 1 , ethers . utils . hexlify ( ethers . utils . toUtf8Bytes ( 'ETH' ) ) . padEnd ( 42 , '0' ) )
@@ -302,9 +320,19 @@ export class Paymaster {
302320 if ( decimals < 18 )
303321 ethPrice = Number ( ethers . utils . formatUnits ( ETHprice , 18 - decimals ) ) . toFixed ( 0 ) ;
304322 } else if ( oracleName === "chainlink" ) {
323+ const nativeOracleContract = new ethers . Contract ( nativeOracleAddress , ChainlinkOracleAbi , provider ) ;
324+ let ETHUSDPrice = await nativeOracleContract . latestAnswer ( ) ;
305325 const chainlinkContract = new ethers . Contract ( oracleAggregator , ChainlinkOracleAbi , provider ) ;
306- const ETHprice = await chainlinkContract . latestRoundData ( ) ;
307- ethPrice = ETHprice . answer ;
326+ const ETHUSDPriceDecimal = await nativeOracleContract . decimals ( ) ;
327+ const ETHpriceDecimal = await chainlinkContract . decimals ( ) ;
328+ let ETHprice = await chainlinkContract . latestAnswer ( ) ;
329+ ETHUSDPrice = ethers . utils . formatUnits ( ETHUSDPrice , ETHUSDPriceDecimal ) ;
330+ ETHprice = ethers . utils . formatUnits ( ETHprice , ETHpriceDecimal ) ;
331+ ETHUSDPrice = ethers . utils . parseEther ( ETHUSDPrice ) ;
332+ ETHprice = ethers . utils . parseEther ( ETHprice ) ;
333+ const tokenContract = new ethers . Contract ( feeToken , ERC20Abi , provider ) ;
334+ const decimals = Number ( await tokenContract . decimals ( ) ) ;
335+ ethPrice = ethers . utils . parseUnits ( ( ETHUSDPrice / ETHprice ) . toFixed ( decimals ) , decimals ) . toString ( )
308336 } else {
309337 const ecContract = new ethers . Contract ( oracleAggregator , EtherspotChainlinkOracleAbi , provider ) ;
310338 const ETHprice = await ecContract . cachedPrice ( ) ;
0 commit comments