1- import { formatEther , maxUint256 , parseEther , toHex } from 'viem' ;
1+ import { formatUnits , maxUint256 , parseUnits , toHex } from 'viem' ;
22
33import type { AccountController } from '../../accountController' ;
44import { TimePeriod } from '../../core/types' ;
5+ import type { TokenMetadataService } from '../../services/tokenMetadataService' ;
56import type { TokenPricesService } from '../../services/tokenPricesService' ;
67import { formatUnitsFromString } from '../../utils/balance' ;
78import {
@@ -36,18 +37,21 @@ export async function applyContext({
3637 context : Erc20TokenStreamContext ;
3738 originalRequest : Erc20TokenStreamPermissionRequest ;
3839} ) : Promise < Erc20TokenStreamPermissionRequest > {
39- const { permissionDetails } = context ;
40+ const {
41+ permissionDetails,
42+ accountDetails : { decimals } ,
43+ } = context ;
4044 const expiry = convertReadableDateToTimestamp ( context . expiry ) ;
4145
4246 const permissionData = {
4347 maxAmount : permissionDetails . maxAmount
44- ? toHex ( parseEther ( permissionDetails . maxAmount ) )
48+ ? toHex ( parseUnits ( permissionDetails . maxAmount , decimals ) )
4549 : undefined ,
4650 initialAmount : permissionDetails . initialAmount
47- ? toHex ( parseEther ( permissionDetails . initialAmount ) )
51+ ? toHex ( parseUnits ( permissionDetails . initialAmount , decimals ) )
4852 : undefined ,
4953 amountPerSecond : toHex (
50- parseEther ( permissionDetails . amountPerPeriod ) /
54+ parseUnits ( permissionDetails . amountPerPeriod , decimals ) /
5155 TIME_PERIOD_TO_SECONDS [ permissionDetails . timePeriod ] ,
5256 ) ,
5357 startTime : convertReadableDateToTimestamp ( permissionDetails . startTime ) ,
@@ -95,16 +99,19 @@ export async function populatePermission({
9599 * @param options0.permissionRequest - The Erc20 token stream permission request to convert.
96100 * @param options0.tokenPricesService - Service for fetching token price information.
97101 * @param options0.accountController - Controller for managing account operations.
102+ * @param options0.tokenMetadataService - Service for fetching token metadata.
98103 * @returns A context object containing the formatted permission details and account information.
99104 */
100105export async function buildContext ( {
101106 permissionRequest,
102107 tokenPricesService,
103108 accountController,
109+ tokenMetadataService,
104110} : {
105111 permissionRequest : Erc20TokenStreamPermissionRequest ;
106112 tokenPricesService : TokenPricesService ;
107113 accountController : AccountController ;
114+ tokenMetadataService : TokenMetadataService ;
108115} ) : Promise < Erc20TokenStreamContext > {
109116 const chainId = Number ( permissionRequest . chainId ) ;
110117 const { tokenAddress } = permissionRequest . permission . data ;
@@ -117,8 +124,9 @@ export async function buildContext({
117124 balance : rawBalance ,
118125 decimals,
119126 symbol,
120- } = await accountController . getTokenBalanceAndMetadata ( {
127+ } = await tokenMetadataService . getTokenBalanceAndMetadata ( {
121128 chainId,
129+ account : address ,
122130 assetAddress : tokenAddress ,
123131 } ) ;
124132
@@ -153,8 +161,9 @@ export async function buildContext({
153161
154162 // It may seem strange to convert the amount per second to amount per period, format, and then convert back to amount per second.
155163 // The user is inputting amount per period, and we derive amount per second, so it makes sense for the context to contain the amount per period.
156- const amountPerPeriod = formatEther (
164+ const amountPerPeriod = formatUnits (
157165 amountPerSecond * TIME_PERIOD_TO_SECONDS [ timePeriod ] ,
166+ decimals ,
158167 ) ;
159168
160169 const startTime = convertTimestampToReadableDate (
@@ -194,7 +203,11 @@ export async function deriveMetadata({
194203} : {
195204 context : Erc20TokenStreamContext ;
196205} ) : Promise < Erc20TokenStreamMetadata > {
197- const { permissionDetails, expiry } = context ;
206+ const {
207+ permissionDetails,
208+ expiry,
209+ accountDetails : { decimals } ,
210+ } = context ;
198211
199212 const validationErrors : Erc20TokenStreamMetadata [ 'validationErrors' ] = { } ;
200213
@@ -204,7 +217,7 @@ export async function deriveMetadata({
204217 let amountPerSecond = 'Unknown' ;
205218 if ( permissionDetails . maxAmount ) {
206219 try {
207- maxAmountBigInt = parseEther ( permissionDetails . maxAmount ) ;
220+ maxAmountBigInt = parseUnits ( permissionDetails . maxAmount , decimals ) ;
208221 if ( maxAmountBigInt < 0n ) {
209222 validationErrors . maxAmountError = 'Max amount must be greater than 0' ;
210223 maxAmountBigInt = undefined ;
@@ -216,7 +229,10 @@ export async function deriveMetadata({
216229
217230 if ( permissionDetails . initialAmount ) {
218231 try {
219- initialAmountBigInt = parseEther ( permissionDetails . initialAmount ) ;
232+ initialAmountBigInt = parseUnits (
233+ permissionDetails . initialAmount ,
234+ decimals ,
235+ ) ;
220236 if ( initialAmountBigInt < 0n ) {
221237 validationErrors . initialAmountError =
222238 'Initial amount must be greater than 0' ;
@@ -228,15 +244,19 @@ export async function deriveMetadata({
228244 }
229245
230246 try {
231- amountPerSecondBigInt = parseEther ( permissionDetails . amountPerPeriod ) ;
247+ amountPerSecondBigInt = parseUnits (
248+ permissionDetails . amountPerPeriod ,
249+ decimals ,
250+ ) ;
232251 if ( amountPerSecondBigInt <= 0n ) {
233252 validationErrors . amountPerPeriodError =
234253 'Amount per period must be greater than 0' ;
235254 amountPerSecondBigInt = undefined ;
236255 } else {
237- amountPerSecond = formatEther (
256+ amountPerSecond = formatUnits (
238257 amountPerSecondBigInt /
239258 TIME_PERIOD_TO_SECONDS [ permissionDetails . timePeriod ] ,
259+ decimals ,
240260 ) ;
241261 }
242262 } catch ( error ) {
0 commit comments