From 92301e70d2588018a239d4fc43ac7dce7c5bda35 Mon Sep 17 00:00:00 2001 From: martonp Date: Mon, 23 Oct 2023 23:34:24 -0400 Subject: [PATCH] Update wbtc and weth handling --- client/asset/polygon/polygon.go | 4 +- client/mm/libxc/binance.go | 109 ++++++++++++++++++++------- client/mm/libxc/binance_live_test.go | 35 ++++++++- client/mm/libxc/binance_test.go | 19 +++++ client/webserver/site/src/js/doc.ts | 3 +- dex/bip-id.go | 4 +- dex/networks/polygon/params.go | 4 +- server/asset/polygon/polygon.go | 4 +- 8 files changed, 141 insertions(+), 41 deletions(-) diff --git a/client/asset/polygon/polygon.go b/client/asset/polygon/polygon.go index 4609a642e8..ac5e0486c9 100644 --- a/client/asset/polygon/polygon.go +++ b/client/asset/polygon/polygon.go @@ -53,8 +53,8 @@ const ( var ( simnetTokenID, _ = dex.BipSymbolID("dextt.polygon") usdcTokenID, _ = dex.BipSymbolID("usdc.polygon") - wethTokenID, _ = dex.BipSymbolID("eth.polygon") - wbtcTokenID, _ = dex.BipSymbolID("btc.polygon") + wethTokenID, _ = dex.BipSymbolID("weth.polygon") + wbtcTokenID, _ = dex.BipSymbolID("wbtc.polygon") // WalletInfo defines some general information about a Polygon Wallet(EVM // Compatible). diff --git a/client/mm/libxc/binance.go b/client/mm/libxc/binance.go index 1cc20ade9c..c32f767b98 100644 --- a/client/mm/libxc/binance.go +++ b/client/mm/libxc/binance.go @@ -82,13 +82,51 @@ type bncAssetConfig struct { } // TODO: check all symbols -func mapDEXSymbolToBinance(symbol string) string { - if symbol == "POLYGON" { - return "MATIC" +var dexToBinanceSymbol = map[string]string{ + "POLYGON": "MATIC", + "WETH": "ETH", +} + +var binanceToDexSymbol = make(map[string]string) + +func init() { + for key, value := range dexToBinanceSymbol { + binanceToDexSymbol[value] = key + } +} + +func mapDexToBinanceSymbol(symbol string) string { + if binanceSymbol, found := dexToBinanceSymbol[symbol]; found { + return binanceSymbol } return symbol } +func binanceCoinNetworkToDexSymbol(coin, network string) string { + if coin == "ETH" && network == "ETH" { + return "eth" + } + + var dexSymbol, dexNetwork string + if symbol, found := binanceToDexSymbol[coin]; found { + dexSymbol = strings.ToLower(symbol) + } else { + dexSymbol = strings.ToLower(coin) + } + + if symbol, found := binanceToDexSymbol[network]; found && network != "ETH" { + dexNetwork = strings.ToLower(symbol) + } else { + dexNetwork = strings.ToLower(network) + } + + if dexSymbol == dexNetwork { + return dexSymbol + } + + return fmt.Sprintf("%s.%s", dexSymbol, dexNetwork) +} + func bncAssetCfg(assetID uint32) (*bncAssetConfig, error) { symbol := dex.BipIDSymbol(assetID) if symbol == "" { @@ -97,8 +135,7 @@ func bncAssetCfg(assetID uint32) (*bncAssetConfig, error) { coin := strings.ToUpper(symbol) chain := strings.ToUpper(symbol) - if token := asset.TokenInfo(assetID); token != nil { - parts := strings.Split(symbol, ".") + if parts := strings.Split(symbol, "."); len(parts) > 1 { coin = strings.ToUpper(parts[0]) chain = strings.ToUpper(parts[1]) } @@ -110,8 +147,8 @@ func bncAssetCfg(assetID uint32) (*bncAssetConfig, error) { return &bncAssetConfig{ symbol: symbol, - coin: mapDEXSymbolToBinance(coin), - chain: mapDEXSymbolToBinance(chain), + coin: mapDexToBinanceSymbol(coin), + chain: mapDexToBinanceSymbol(chain), conversionFactor: ui.Conventional.ConversionFactor, }, nil } @@ -226,6 +263,12 @@ func (bnc *binance) getCoinInfo(ctx context.Context) error { tokenIDs := make(map[string][]uint32) for _, nfo := range coins { + if nfo.Coin == "WBTC" { + bnc.log.Infof("WBTC INFO: %+v", nfo) + for _, netInfo := range nfo.NetworkList { + bnc.log.Infof("%+v", netInfo) + } + } tokenSymbol := strings.ToLower(nfo.Coin) chainIDs, isToken := dex.TokenChains[tokenSymbol] if !isToken { @@ -523,6 +566,8 @@ func (bnc *binance) Withdraw(ctx context.Context, assetID uint32, qty uint64, ad return false, 0, "" } + bnc.log.Tracef("Withdrawal status: %+v", status) + amt := status.Amount * float64(assetCfg.conversionFactor) return status.Status == 6, uint64(amt), status.TxID } @@ -576,45 +621,52 @@ func (bnc *binance) ConfirmDeposit(ctx context.Context, txID string, onConfirm f waitingUserConfirmStatus = 8 ) - checkDepositStatus := func() (success, done bool) { - var resp []*struct { - Amount float64 `json:"amount,string"` - Coin string `json:"coin"` - Network string `json:"network"` - Status int `json:"status"` - Address string `json:"address"` - AddressTag string `json:"addressTag"` - TxID string `json:"txId"` - InsertTime int64 `json:"insertTime"` - TransferType int `json:"transferType"` - ConfirmTimes string `json:"confirmTimes"` + checkDepositStatus := func() (success, done bool, amt uint64) { + var resp []struct { + Amount float64 `json:"amount,string"` + Coin string `json:"coin"` + Network string `json:"network"` + Status int `json:"status"` + TxID string `json:"txId"` } - err := bnc.getAPI(ctx, "/sapi/v1/capital/deposit/hisrec", nil, true, true, resp) + err := bnc.getAPI(ctx, "/sapi/v1/capital/deposit/hisrec", nil, true, true, &resp) if err != nil { bnc.log.Errorf("error getting deposit status: %v", err) - return false, false + return false, false, 0 } for _, status := range resp { if status.TxID == txID { switch status.Status { case successStatus, creditedStatus: - return true, true + dexSymbol := binanceCoinNetworkToDexSymbol(status.Coin, status.Network) + assetID, found := dex.BipSymbolID(dexSymbol) + if !found { + bnc.log.Errorf("Failed to find DEX asset ID for Coin: %s, Network %s", status.Coin, status.Network) + return false, true, 0 + } + ui, err := asset.UnitInfo(assetID) + if err != nil { + bnc.log.Errorf("Failed to find unit info for asset ID %d", assetID) + return false, true, 0 + } + amount := uint64(status.Amount * float64(ui.Conventional.ConversionFactor)) + return true, true, amount case pendingStatus: - return false, false + return false, false, 0 case waitingUserConfirmStatus: // This shouldn't ever happen. bnc.log.Errorf("Deposit %s to binance requires user confirmation!") - return false, false + return false, true, 0 case wrongDepositStatus: - return false, true + return false, true, 0 default: bnc.log.Errorf("Deposit %s to binance has an unknown status %d", status.Status) } } } - return false, false + return false, false, 0 } go func() { @@ -626,10 +678,9 @@ func (bnc *binance) ConfirmDeposit(ctx context.Context, txID string, onConfirm f case <-ctx.Done(): return case <-ticker.C: - success, done := checkDepositStatus() + success, done, amt := checkDepositStatus() if done { - // TODO: get amount - onConfirm(success, 0) + onConfirm(success, amt) return } } diff --git a/client/mm/libxc/binance_live_test.go b/client/mm/libxc/binance_live_test.go index a63eacccb6..e5266a43ba 100644 --- a/client/mm/libxc/binance_live_test.go +++ b/client/mm/libxc/binance_live_test.go @@ -73,6 +73,15 @@ func init() { }, }, }, &asset.WalletDefinition{}, dex.Mainnet, dex.Testnet, dex.Simnet) + asset.RegisterToken(966002, &dex.Token{ + ParentID: 966, + Name: "WETH", + UnitInfo: dex.UnitInfo{ + Conventional: dex.Denomination{ + ConversionFactor: 1e9, + }, + }, + }, &asset.WalletDefinition{}, dex.Mainnet, dex.Testnet, dex.Simnet) } func TestConnect(t *testing.T) { @@ -235,7 +244,7 @@ func TestVWAP(t *testing.T) { } func TestWithdrawal(t *testing.T) { - bnc := tNewBinance(t, dex.Testnet) + bnc := tNewBinance(t, dex.Mainnet) ctx, cancel := context.WithTimeout(context.Background(), time.Hour*23) defer cancel() @@ -251,7 +260,7 @@ func TestWithdrawal(t *testing.T) { wg.Done() } - err = bnc.Withdraw(ctx, 60001, 4e10, "", onComplete) + err = bnc.Withdraw(ctx, 966, 2e10, "", onComplete) if err != nil { fmt.Printf("withdrawal error: %v", err) return @@ -260,6 +269,28 @@ func TestWithdrawal(t *testing.T) { wg.Wait() } +func TestConfirmDeposit(t *testing.T) { + bnc := tNewBinance(t, dex.Mainnet) + ctx, cancel := context.WithTimeout(context.Background(), time.Hour*23) + defer cancel() + + _, err := bnc.Connect(ctx) + if err != nil { + t.Fatalf("Connect error: %v", err) + } + + wg := sync.WaitGroup{} + wg.Add(1) + onComplete := func(success bool, amount uint64) { + t.Logf("deposit complete: %v, %v", success, amount) + wg.Done() + } + + bnc.ConfirmDeposit(ctx, "", onComplete) + + wg.Wait() +} + func TestGetDepositAddress(t *testing.T) { bnc := tNewBinance(t, dex.Mainnet) ctx, cancel := context.WithTimeout(context.Background(), time.Hour*23) diff --git a/client/mm/libxc/binance_test.go b/client/mm/libxc/binance_test.go index d8dd463c3f..d76c49288f 100644 --- a/client/mm/libxc/binance_test.go +++ b/client/mm/libxc/binance_test.go @@ -38,3 +38,22 @@ func TestSubscribeTradeUpdates(t *testing.T) { t.Fatalf("id2 not found") } } + +func TestBinanceToDexSymbol(t *testing.T) { + tests := map[[2]string]string{ + {"ETH", "ETH"}: "eth", + {"ETH", "MATIC"}: "weth.polygon", + {"MATIC", "MATIC"}: "polygon", + {"USDC", "ETH"}: "usdc.eth", + {"USDC", "MATIC"}: "usdc.polygon", + {"BTC", "BTC"}: "btc", + {"WBTC", "ETH"}: "wbtc.eth", + } + + for test, expected := range tests { + dexSymbol := binanceCoinNetworkToDexSymbol(test[0], test[1]) + if expected != dexSymbol { + t.Fatalf("expected %s but got %v", expected, dexSymbol) + } + } +} diff --git a/client/webserver/site/src/js/doc.ts b/client/webserver/site/src/js/doc.ts index 4f26267370..d14c19722a 100644 --- a/client/webserver/site/src/js/doc.ts +++ b/client/webserver/site/src/js/doc.ts @@ -37,8 +37,7 @@ const BipIDs: Record = { 966000: 'dextt.polygon', 966001: 'usdc.polygon', 966002: 'weth.polygon', - 966003: 'wbtc.polygon', - 147: 'zcl' + 966003: 'wbtc.polygon' } const BipSymbolIDs: Record = {}; diff --git a/dex/bip-id.go b/dex/bip-id.go index 46ba91d10a..26b3ff1ef7 100644 --- a/dex/bip-id.go +++ b/dex/bip-id.go @@ -619,8 +619,8 @@ var bipIDs = map[uint32]string{ // Polygon reserved token range 966000-966999 966000: "dextt.polygon", 966001: "usdc.polygon", - 966002: "eth.polygon", - 966003: "btc.polygon", + 966002: "weth.polygon", + 966003: "wbtc.polygon", // END Polygon reserved token range 1171337: "ilt", 1313114: "etho", diff --git a/dex/networks/polygon/params.go b/dex/networks/polygon/params.go index b54fb7166a..868da483a0 100644 --- a/dex/networks/polygon/params.go +++ b/dex/networks/polygon/params.go @@ -57,8 +57,8 @@ var ( testTokenID, _ = dex.BipSymbolID("dextt.polygon") usdcTokenID, _ = dex.BipSymbolID("usdc.polygon") - wethTokenID, _ = dex.BipSymbolID("eth.polygon") - wbtcTokenID, _ = dex.BipSymbolID("btc.polygon") + wethTokenID, _ = dex.BipSymbolID("weth.polygon") + wbtcTokenID, _ = dex.BipSymbolID("wbtc.polygon") Tokens = map[uint32]*dexeth.Token{ testTokenID: TestToken, diff --git a/server/asset/polygon/polygon.go b/server/asset/polygon/polygon.go index 399cee1acd..9f8e3faf88 100644 --- a/server/asset/polygon/polygon.go +++ b/server/asset/polygon/polygon.go @@ -63,8 +63,8 @@ const ( var ( testTokenID, _ = dex.BipSymbolID("dextt.polygon") usdcID, _ = dex.BipSymbolID("usdc.polygon") - wethTokenID, _ = dex.BipSymbolID("eth.polygon") - wbtcTokenID, _ = dex.BipSymbolID("btc.polygon") + wethTokenID, _ = dex.BipSymbolID("weth.polygon") + wbtcTokenID, _ = dex.BipSymbolID("wbtc.polygon") // blockPollInterval is the delay between calls to bestBlockHash to check // for new blocks. Modify at compile time via blockPollIntervalStr: