github.com/0chain/gosdk@v1.17.11/wasmsdk/ethwallet.go (about)

     1  // +build js,wasm
     2  
     3  package main
     4  
     5  import (
     6  	"fmt"
     7  	"strconv"
     8  	"sync"
     9  	"syscall/js"
    10  
    11  	"github.com/0chain/gosdk/zcncore"
    12  )
    13  
    14  // JS does not have int64 so we must take a string instead of int64.
    15  func strToInt64(s string) int64 {
    16  	tokens, err := strconv.ParseInt(s, 10, 64)
    17  	if err != nil {
    18  		panic(err)
    19  	}
    20  	return tokens
    21  }
    22  
    23  func int64ToStr(x int64) string {
    24  	return strconv.FormatInt(x, 10)
    25  }
    26  
    27  func TokensToEth(this js.Value, p []js.Value) interface{} {
    28  	tokens := strToInt64(p[0].String())
    29  	result := zcncore.TokensToEth(tokens)
    30  	return result
    31  }
    32  
    33  func EthToTokens(this js.Value, p []js.Value) interface{} {
    34  	tokens := p[0].Float()
    35  	result := zcncore.EthToTokens(tokens)
    36  	return int64ToStr(result)
    37  }
    38  
    39  func GTokensToEth(this js.Value, p []js.Value) interface{} {
    40  	tokens := strToInt64(p[0].String())
    41  	result := zcncore.GTokensToEth(tokens)
    42  	return result
    43  }
    44  
    45  func GEthToTokens(this js.Value, p []js.Value) interface{} {
    46  	tokens := p[0].Float()
    47  	result := zcncore.GEthToTokens(tokens)
    48  	return int64ToStr(result)
    49  }
    50  
    51  func GetWalletAddrFromEthMnemonic(this js.Value, p []js.Value) interface{} {
    52  	mnemonic := p[0].String()
    53  	result, err := zcncore.GetWalletAddrFromEthMnemonic(mnemonic)
    54  	if err != nil {
    55  		fmt.Println("error:", err)
    56  	}
    57  	return result
    58  }
    59  
    60  func ConvertZcnTokenToETH(this js.Value, p []js.Value) interface{} {
    61  	token := p[0].Float()
    62  	result, err := zcncore.ConvertZcnTokenToETH(token)
    63  	if err != nil {
    64  		return map[string]interface{}{
    65  			"err": err.Error(),
    66  		}
    67  	}
    68  	return result
    69  }
    70  
    71  func SuggestEthGasPrice(this js.Value, p []js.Value) interface{} {
    72  	handler := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
    73  		resolve := args[0]
    74  		reject := args[1]
    75  
    76  		go func() {
    77  			result, err := zcncore.SuggestEthGasPrice()
    78  			if err != nil {
    79  				reject.Invoke(err.Error())
    80  			}
    81  
    82  			resolve.Invoke(int64ToStr(result))
    83  		}()
    84  
    85  		return nil
    86  	})
    87  
    88  	promiseConstructor := js.Global().Get("Promise")
    89  	return promiseConstructor.New(handler)
    90  }
    91  
    92  func TransferEthTokens(this js.Value, p []js.Value) interface{} {
    93  	fromPrivKey := p[0].String()
    94  	amountTokens := strToInt64(p[1].String())
    95  	gasPrice := strToInt64(p[2].String())
    96  
    97  	handler := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
    98  		resolve := args[0]
    99  		reject := args[1]
   100  
   101  		go func() {
   102  			result, err := zcncore.TransferEthTokens(fromPrivKey, amountTokens, gasPrice)
   103  			if err != nil {
   104  				reject.Invoke(err.Error())
   105  			}
   106  
   107  			resolve.Invoke(result)
   108  		}()
   109  
   110  		return nil
   111  	})
   112  
   113  	promiseConstructor := js.Global().Get("Promise")
   114  	return promiseConstructor.New(handler)
   115  }
   116  
   117  // Exports public functions in github.com/0chain/gosdk/zcncore/ethwallet.go
   118  func IsValidEthAddress(this js.Value, p []js.Value) interface{} {
   119  	ethAddr := p[0].String()
   120  	success, err := zcncore.IsValidEthAddress(ethAddr)
   121  	if err != nil {
   122  		return map[string]interface{}{
   123  			"err": err.Error(),
   124  		}
   125  	}
   126  	return success
   127  }
   128  
   129  func GetEthBalance(this js.Value, p []js.Value) interface{} {
   130  	ethAddress := p[0].String()
   131  
   132  	handler := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
   133  		resolve := args[0]
   134  		reject := args[1]
   135  
   136  		go func() {
   137  			tcb := &BalanceCallback{}
   138  			tcb.wg = &sync.WaitGroup{}
   139  			tcb.wg.Add(1)
   140  
   141  			err := zcncore.GetEthBalance(ethAddress, tcb)
   142  			if err != nil {
   143  				tcb.wg.Done()
   144  				reject.Invoke(err.Error())
   145  			}
   146  			tcb.wg.Wait()
   147  
   148  			resolve.Invoke(map[string]interface{}{
   149  				"info":   tcb.info,
   150  				"status": tcb.status,
   151  				"value":  tcb.value,
   152  			})
   153  		}()
   154  
   155  		return nil
   156  	})
   157  
   158  	promiseConstructor := js.Global().Get("Promise")
   159  	return promiseConstructor.New(handler)
   160  }
   161  
   162  func CreateWalletFromEthMnemonic(this js.Value, p []js.Value) interface{} {
   163  	mnemonic := p[0].String()
   164  	password := p[1].String()
   165  
   166  	handler := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
   167  		resolve := args[0]
   168  		reject := args[1]
   169  
   170  		go func() {
   171  			tcb := &WalletCallback{}
   172  			tcb.wg = &sync.WaitGroup{}
   173  			tcb.wg.Add(1)
   174  
   175  			err := zcncore.CreateWalletFromEthMnemonic(mnemonic, password, tcb)
   176  			if err != nil {
   177  				tcb.wg.Done()
   178  				reject.Invoke(err.Error())
   179  			}
   180  			tcb.wg.Wait()
   181  
   182  			resolve.Invoke(map[string]interface{}{
   183  				"status": tcb.status,
   184  				"err":    tcb.err,
   185  				"wallet": tcb.wallet,
   186  			})
   187  		}()
   188  
   189  		return nil
   190  	})
   191  
   192  	promiseConstructor := js.Global().Get("Promise")
   193  	return promiseConstructor.New(handler)
   194  }
   195  
   196  type WalletCallback struct {
   197  	wg     *sync.WaitGroup
   198  	status int
   199  	wallet string
   200  	err    string
   201  }
   202  
   203  type BalanceCallback struct {
   204  	wg     *sync.WaitGroup
   205  	status int
   206  	value  int64
   207  	info   string
   208  }
   209  
   210  type InfoCallback struct {
   211  	wg     *sync.WaitGroup
   212  	op     int
   213  	status int
   214  	info   string
   215  	err    string
   216  }
   217  
   218  type USDInfoCallback struct {
   219  	wg     *sync.WaitGroup
   220  	status int
   221  	info   string
   222  	err    string
   223  }
   224  
   225  type AuthCallback struct {
   226  	wg     *sync.WaitGroup
   227  	status int
   228  	err    string
   229  }
   230  
   231  func (balCall *BalanceCallback) OnBalanceAvailable(status int, value int64, info string) {
   232  	defer balCall.wg.Done()
   233  
   234  	balCall.status = status
   235  	balCall.value = value
   236  	balCall.info = info
   237  }
   238  
   239  func (wallCall *WalletCallback) OnWalletCreateComplete(status int, w string, err string) {
   240  	defer wallCall.wg.Done()
   241  	fmt.Println("callback [status, w, err]:", status, w, err)
   242  
   243  	wallCall.status = status
   244  	wallCall.wallet = w
   245  	wallCall.err = err
   246  }
   247  
   248  func (infoCall *InfoCallback) OnInfoAvailable(op int, status int, info string, err string) {
   249  	defer infoCall.wg.Done()
   250  	fmt.Println("callback [op, status, info, err]:", op, status, info, err)
   251  
   252  	infoCall.op = op
   253  	infoCall.status = status
   254  	infoCall.info = info
   255  	infoCall.err = err
   256  }
   257  
   258  func (usdCall *USDInfoCallback) OnUSDInfoAvailable(status int, info string, err string) {
   259  	defer usdCall.wg.Done()
   260  	fmt.Println("callback [status, info, err]:", status, info, err)
   261  
   262  	usdCall.status = status
   263  	usdCall.info = info
   264  	usdCall.err = err
   265  }
   266  
   267  func (authCall *AuthCallback) OnSetupComplete(status int, err string) {
   268  	defer authCall.wg.Done()
   269  	fmt.Println("callback [status, err]:", status, err)
   270  
   271  	authCall.status = status
   272  	authCall.err = err
   273  }