Web3 traitant des décimales dans ERC20

A Gilani

Web3 traitant des décimales dans ERC20


J’utilise web3 v1.0.27 et j’essaie d’envoyer des jetons erc20. Ces jetons ont une décimale de 18 mais peuvent avoir une décimale différente. Essayer de le garder générique. J’ai essayé ce qui suit.

    const  amountToSendinDecimal =  amountToSend *   Math . pow ( 10 ,  decimal ); 
   const  amountToSendinDecimalBN =   new   BigNumber ( amountToSendinDecimal ); 

Avec une décimale de 18 et une valeur de 3178,44. Je continue d’obtenir l’erreur suivante.

[BigNumber Error] Number primitive has more than 15 significant digits: 3.1784400000000003e+21

Impossible de trouver un moyen de le contourner.

Aucune suggestion.

Réponses


 Rajesh

Lorsque vous disposez de web3 js, vous pouvez le faire de l’une des manières suivantes.

 var  amountToSend =   2 ; 
 var  weiAmout =  amountToSend *   1e18 ; 
 var  weiAmount2 =  web3 . toWei ( amountToSend ); 

A Gilani

Merci. J’ai utilisé un mélange ou votre solution et des utilitaires BigNumber.


 N. McA.

Le code suivant effectue soigneusement cette conversion. Il faut un constructeur BN parce que je / vous ne voulez pas insérer une bibliothèque BN distincte ou créer web3, vous devez donc le passer (par exemple) à toBaseUnit("0.01", 18, web3.utils.BN)

 function  isString ( s )   { 
   return   ( typeof  s ===   'string'   ||  s instanceof   String ) 
 } 

 export   function  toBaseUnit ( value ,  decimals ,  BN )   { 
   if   (! isString ( value ))   { 
     throw   new   Error ( 'Pass strings to prevent floating point precision issues.' ) 
   } 
   const  ten =   new  BN ( 10 ); 
   const  base =  ten . pow ( new  BN ( decimals )); 

   // Is it negative? 
   let  negative =   ( value . substring ( 0 ,   1 )   ===   '-' ); 
   if   ( negative )   { value =  value . substring ( 1 ); 
   } 

   if   ( value ===   '.' )   {  
     throw   new   Error ( 
     ` Invalid  value $ { value }  cannot be converted to ` 
     +   `  base unit with  $ { decimals }  decimals .`);  
   } 

   // Split it into a whole and fractional part 
   let  comps =  value . split ( '.' ); 
   if   ( comps . length >   2 )   {   throw   new   Error ( 'Too many decimal points' );   } 

   let  whole =  comps [ 0 ],  fraction =  comps [ 1 ]; 

   if   (! whole )   {  whole =   '0' ;   } 
   if   (! fraction )   {  fraction =   '0' ;   } 
   if   ( fraction . length >  decimals )   {  
     throw   new   Error ( 'Too many decimal places' );  
   } 

   while   ( fraction . length <  decimals )   { fraction +=   '0' ; 
   } whole =   new  BN ( whole ); fraction =   new  BN ( fraction ); 
   let  wei =   ( whole . mul ( base )). add ( fraction ); 

   if   ( negative )   { wei =  wei . mul ( negative1 ); 
   } 

   return   new  BN ( wei . toString ( 10 ),   10 ); 
 } 

alsco77

noice. Cela gère bien les grandes valeurs


 A Gilani

J’ai utilisé le code suivant pour contourner le problème

private _fromDecimal = (value) => { const decimal = 18; const amountToSendinDecimal = value * ( 10 ** decimal) ; return this.toBigNumber(amountToSendinDecimal); };

 

dans, décimales, des, ERC20?, traitant, web3

 

yahoo

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *