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 }