init
This commit is contained in:
commit
0e82059e44
|
|
@ -0,0 +1,3 @@
|
||||||
|
.idea/*
|
||||||
|
*.log
|
||||||
|
logs/*
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"lbank_connector_go/sve"
|
||||||
|
)
|
||||||
|
|
||||||
|
// rsa
|
||||||
|
const (
|
||||||
|
apiKey = "44b9cdf2-6c66-4f57-a551-a80dbc42542d"
|
||||||
|
secretKey = "71CE6CF6E03A51C61AA6F94A453443E8"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client = sve.NewClient(apiKey, secretKey)
|
||||||
|
|
||||||
|
func TestUserInfo() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{}
|
||||||
|
client.NewAccountService().UserInfo(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSubscribeGetKey() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{}
|
||||||
|
client.NewAccountService().SubscribeGetKey(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSubscribeRefreshKey() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"subscribeKey": "32a6ece19c591f1791cc07ba570db4dd00a4ab7bb32f0f3adc7969b4c9e2e2f0",
|
||||||
|
}
|
||||||
|
client.NewAccountService().SubscribeRefreshKey(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSubscribeDestroyKey() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"subscribeKey": "32a6ece19c591f1791cc07ba570db4dd00a4ab7bb32f0f3adc7969b4c9e2e2f0",
|
||||||
|
}
|
||||||
|
client.NewAccountService().SubscribeDestroyKey(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetDepositAddress() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"assetCode": "BTC",
|
||||||
|
"netWork": "",
|
||||||
|
}
|
||||||
|
client.NewAccountService().GetDepositAddress(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDepositHistory() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"assetCode": "",
|
||||||
|
"startTime": "",
|
||||||
|
"endTime": "",
|
||||||
|
"pageNo": "1",
|
||||||
|
"pageSize": "10",
|
||||||
|
}
|
||||||
|
client.NewAccountService().DepositHistory(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
TestUserInfo()
|
||||||
|
//TestSubscribeGetKey()
|
||||||
|
//TestSubscribeRefreshKey()
|
||||||
|
//TestSubscribeDestroyKey()
|
||||||
|
//TestGetDepositAddress()
|
||||||
|
//TestDepositHistory()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"lbank_connector_go/sve"
|
||||||
|
)
|
||||||
|
|
||||||
|
// rsa
|
||||||
|
const (
|
||||||
|
apiKey = "1cc62cfb-2f36-4ac9-b5fb-2c40138db8ab"
|
||||||
|
secretKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAILOdckXVqiMcLEdpockDZ1bLQc/XDlFxBSXMenZaok1PGljO6j2f45+PRH4X1tls78FHLBjCE4uizJb9kcd6uQTDCV9mMU4Tqyy9hflI1xt4K+u2Oxi+2z+NgrIOQXBazaZ+SJ1t1NMK5DhR7QUMPqMUg+JX7e2Xv89xOTiSfU1AgMBAAECgYB+OtcXs9oA1WZ6xW5Kw9QPokkV0WMiMd1DMZUNYq6YsjMWUJjmONpnnBM7IECFZuPK1xgUb704FVpmwrAreQeOpkS8i8PegP0yB/uaQAw1RYmnhOVpeJJPpHaLBwgSNP+EBBzi8/2ZYJPNbXaQm19QC0Y2grYMz35Z8Ro8zdF4gQJBAMvV5LRS1mSDpn6GG6APv/DjEblgaOAV4RWE1OJNxM3o8FeP41XPJMal6mX6YqwNVIvUFEv9ukiOiWmxrwrwRkkCQQCkSCINnWOQFRpsRkSIZ/ZgAz9PhdRcyIfqKCMstfaYu9SMubBD/rsJZSV27i+bmGwTR/Gmm4T51vadq/NwzUeNAkEAjnIYlKe7KZ0S8iJ4FcBL62RT0497WvYPSQF93/RnD1q08wwb27CZy7TQ/Jkg8YmTRvBbistyrhfmEZXZdLR6+QJBAIlKIvM/0cHKcQ+FVaatQy+P5yvdCtETYMpmCqdF1jRj3EhSsiTQz5wVZE7U1QJySfd/C0sR8vocFHNGDSb61s0CQQDLhsj7WLHTxZKiBvhxuXIwebQOVoqFomeAPloAMs2JUgIKqGXgVcByII2WiROmpWWx/W1ZfRxtHdD62v2BYBEI"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client = sve.NewClient(apiKey, secretKey)
|
||||||
|
|
||||||
|
func TestUserInfo() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{}
|
||||||
|
client.NewAccountService().UserInfo(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSubscribeGetKey() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{}
|
||||||
|
client.NewAccountService().SubscribeGetKey(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSubscribeRefreshKey() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"subscribeKey": "32a6ece19c591f1791cc07ba570db4dd00a4ab7bb32f0f3adc7969b4c9e2e2f0",
|
||||||
|
}
|
||||||
|
client.NewAccountService().SubscribeRefreshKey(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSubscribeDestroyKey() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"subscribeKey": "32a6ece19c591f1791cc07ba570db4dd00a4ab7bb32f0f3adc7969b4c9e2e2f0",
|
||||||
|
}
|
||||||
|
client.NewAccountService().SubscribeDestroyKey(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetDepositAddress() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"assetCode": "BTC",
|
||||||
|
"netWork": "",
|
||||||
|
}
|
||||||
|
client.NewAccountService().GetDepositAddress(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDepositHistory() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"assetCode": "",
|
||||||
|
"startTime": "",
|
||||||
|
"endTime": "",
|
||||||
|
"pageNo": "1",
|
||||||
|
"pageSize": "10",
|
||||||
|
}
|
||||||
|
client.NewAccountService().DepositHistory(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
TestUserInfo()
|
||||||
|
//TestSubscribeGetKey()
|
||||||
|
//TestSubscribeRefreshKey()
|
||||||
|
//TestSubscribeDestroyKey()
|
||||||
|
//TestGetDepositAddress()
|
||||||
|
//TestDepositHistory()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"lbank_connector_go/sve"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SHA256
|
||||||
|
const (
|
||||||
|
apiKey = "44b9cdf2-6c66-4f57-a551-a80dbc42542d"
|
||||||
|
secretKey = "71CE6CF6E03A51C61AA6F94A453443E8"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client = sve.NewClient(apiKey, secretKey)
|
||||||
|
|
||||||
|
func TestAccuracy() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"symbol": "lbk_usdt",
|
||||||
|
"size": "1",
|
||||||
|
}
|
||||||
|
client.NewBaseService().Accuracy(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
TestAccuracy()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"lbank_connector_go/sve"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
apiKey = "1cc62cfb-2f36-4ac9-b5fb-2c40138db8ab"
|
||||||
|
secretKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAILOdckXVqiMcLEdpockDZ1bLQc/XDlFxBSXMenZaok1PGljO6j2f45+PRH4X1tls78FHLBjCE4uizJb9kcd6uQTDCV9mMU4Tqyy9hflI1xt4K+u2Oxi+2z+NgrIOQXBazaZ+SJ1t1NMK5DhR7QUMPqMUg+JX7e2Xv89xOTiSfU1AgMBAAECgYB+OtcXs9oA1WZ6xW5Kw9QPokkV0WMiMd1DMZUNYq6YsjMWUJjmONpnnBM7IECFZuPK1xgUb704FVpmwrAreQeOpkS8i8PegP0yB/uaQAw1RYmnhOVpeJJPpHaLBwgSNP+EBBzi8/2ZYJPNbXaQm19QC0Y2grYMz35Z8Ro8zdF4gQJBAMvV5LRS1mSDpn6GG6APv/DjEblgaOAV4RWE1OJNxM3o8FeP41XPJMal6mX6YqwNVIvUFEv9ukiOiWmxrwrwRkkCQQCkSCINnWOQFRpsRkSIZ/ZgAz9PhdRcyIfqKCMstfaYu9SMubBD/rsJZSV27i+bmGwTR/Gmm4T51vadq/NwzUeNAkEAjnIYlKe7KZ0S8iJ4FcBL62RT0497WvYPSQF93/RnD1q08wwb27CZy7TQ/Jkg8YmTRvBbistyrhfmEZXZdLR6+QJBAIlKIvM/0cHKcQ+FVaatQy+P5yvdCtETYMpmCqdF1jRj3EhSsiTQz5wVZE7U1QJySfd/C0sR8vocFHNGDSb61s0CQQDLhsj7WLHTxZKiBvhxuXIwebQOVoqFomeAPloAMs2JUgIKqGXgVcByII2WiROmpWWx/W1ZfRxtHdD62v2BYBEI"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client = sve.NewClient(apiKey, secretKey)
|
||||||
|
|
||||||
|
func TestAccuracy() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"symbol": "lbk_usdt",
|
||||||
|
"size": "1",
|
||||||
|
}
|
||||||
|
client.NewBaseService().Accuracy(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
TestAccuracy()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"lbank_connector_go/sve"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
apiKey = "1cc62cfb-2f36-4ac9-b5fb-2c40138db8ab"
|
||||||
|
secretKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAILOdckXVqiMcLEdpockDZ1bLQc/XDlFxBSXMenZaok1PGljO6j2f45+PRH4X1tls78FHLBjCE4uizJb9kcd6uQTDCV9mMU4Tqyy9hflI1xt4K+u2Oxi+2z+NgrIOQXBazaZ+SJ1t1NMK5DhR7QUMPqMUg+JX7e2Xv89xOTiSfU1AgMBAAECgYB+OtcXs9oA1WZ6xW5Kw9QPokkV0WMiMd1DMZUNYq6YsjMWUJjmONpnnBM7IECFZuPK1xgUb704FVpmwrAreQeOpkS8i8PegP0yB/uaQAw1RYmnhOVpeJJPpHaLBwgSNP+EBBzi8/2ZYJPNbXaQm19QC0Y2grYMz35Z8Ro8zdF4gQJBAMvV5LRS1mSDpn6GG6APv/DjEblgaOAV4RWE1OJNxM3o8FeP41XPJMal6mX6YqwNVIvUFEv9ukiOiWmxrwrwRkkCQQCkSCINnWOQFRpsRkSIZ/ZgAz9PhdRcyIfqKCMstfaYu9SMubBD/rsJZSV27i+bmGwTR/Gmm4T51vadq/NwzUeNAkEAjnIYlKe7KZ0S8iJ4FcBL62RT0497WvYPSQF93/RnD1q08wwb27CZy7TQ/Jkg8YmTRvBbistyrhfmEZXZdLR6+QJBAIlKIvM/0cHKcQ+FVaatQy+P5yvdCtETYMpmCqdF1jRj3EhSsiTQz5wVZE7U1QJySfd/C0sR8vocFHNGDSb61s0CQQDLhsj7WLHTxZKiBvhxuXIwebQOVoqFomeAPloAMs2JUgIKqGXgVcByII2WiROmpWWx/W1ZfRxtHdD62v2BYBEI"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client = sve.NewClient(apiKey, secretKey)
|
||||||
|
|
||||||
|
func TestDepth() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"symbol": "lbk_usdt",
|
||||||
|
"size": "1",
|
||||||
|
}
|
||||||
|
client.NewMarketService().Depth(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
TestDepth()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"lbank_connector_go/sve"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
apiKey = "1cc62cfb-2f36-4ac9-b5fb-2c40138db8ab"
|
||||||
|
secretKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAILOdckXVqiMcLEdpockDZ1bLQc/XDlFxBSXMenZaok1PGljO6j2f45+PRH4X1tls78FHLBjCE4uizJb9kcd6uQTDCV9mMU4Tqyy9hflI1xt4K+u2Oxi+2z+NgrIOQXBazaZ+SJ1t1NMK5DhR7QUMPqMUg+JX7e2Xv89xOTiSfU1AgMBAAECgYB+OtcXs9oA1WZ6xW5Kw9QPokkV0WMiMd1DMZUNYq6YsjMWUJjmONpnnBM7IECFZuPK1xgUb704FVpmwrAreQeOpkS8i8PegP0yB/uaQAw1RYmnhOVpeJJPpHaLBwgSNP+EBBzi8/2ZYJPNbXaQm19QC0Y2grYMz35Z8Ro8zdF4gQJBAMvV5LRS1mSDpn6GG6APv/DjEblgaOAV4RWE1OJNxM3o8FeP41XPJMal6mX6YqwNVIvUFEv9ukiOiWmxrwrwRkkCQQCkSCINnWOQFRpsRkSIZ/ZgAz9PhdRcyIfqKCMstfaYu9SMubBD/rsJZSV27i+bmGwTR/Gmm4T51vadq/NwzUeNAkEAjnIYlKe7KZ0S8iJ4FcBL62RT0497WvYPSQF93/RnD1q08wwb27CZy7TQ/Jkg8YmTRvBbistyrhfmEZXZdLR6+QJBAIlKIvM/0cHKcQ+FVaatQy+P5yvdCtETYMpmCqdF1jRj3EhSsiTQz5wVZE7U1QJySfd/C0sR8vocFHNGDSb61s0CQQDLhsj7WLHTxZKiBvhxuXIwebQOVoqFomeAPloAMs2JUgIKqGXgVcByII2WiROmpWWx/W1ZfRxtHdD62v2BYBEI"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client = sve.NewClient(apiKey, secretKey)
|
||||||
|
|
||||||
|
func TestCreateOrder() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"symbol": "lbk_usdt",
|
||||||
|
"size": "1",
|
||||||
|
}
|
||||||
|
client.NewOrderService().CreateOrder(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
TestCreateOrder()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"lbank_connector_go/sve"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
apiKey = "1cc62cfb-2f36-4ac9-b5fb-2c40138db8ab"
|
||||||
|
secretKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAILOdckXVqiMcLEdpockDZ1bLQc/XDlFxBSXMenZaok1PGljO6j2f45+PRH4X1tls78FHLBjCE4uizJb9kcd6uQTDCV9mMU4Tqyy9hflI1xt4K+u2Oxi+2z+NgrIOQXBazaZ+SJ1t1NMK5DhR7QUMPqMUg+JX7e2Xv89xOTiSfU1AgMBAAECgYB+OtcXs9oA1WZ6xW5Kw9QPokkV0WMiMd1DMZUNYq6YsjMWUJjmONpnnBM7IECFZuPK1xgUb704FVpmwrAreQeOpkS8i8PegP0yB/uaQAw1RYmnhOVpeJJPpHaLBwgSNP+EBBzi8/2ZYJPNbXaQm19QC0Y2grYMz35Z8Ro8zdF4gQJBAMvV5LRS1mSDpn6GG6APv/DjEblgaOAV4RWE1OJNxM3o8FeP41XPJMal6mX6YqwNVIvUFEv9ukiOiWmxrwrwRkkCQQCkSCINnWOQFRpsRkSIZ/ZgAz9PhdRcyIfqKCMstfaYu9SMubBD/rsJZSV27i+bmGwTR/Gmm4T51vadq/NwzUeNAkEAjnIYlKe7KZ0S8iJ4FcBL62RT0497WvYPSQF93/RnD1q08wwb27CZy7TQ/Jkg8YmTRvBbistyrhfmEZXZdLR6+QJBAIlKIvM/0cHKcQ+FVaatQy+P5yvdCtETYMpmCqdF1jRj3EhSsiTQz5wVZE7U1QJySfd/C0sR8vocFHNGDSb61s0CQQDLhsj7WLHTxZKiBvhxuXIwebQOVoqFomeAPloAMs2JUgIKqGXgVcByII2WiROmpWWx/W1ZfRxtHdD62v2BYBEI"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client = sve.NewClient(apiKey, secretKey)
|
||||||
|
|
||||||
|
func TestCreateOrder() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"symbol": "lbk_usdt",
|
||||||
|
"type": "buy",
|
||||||
|
"price": "0.01",
|
||||||
|
"amount": "1",
|
||||||
|
"custom_id": "test",
|
||||||
|
}
|
||||||
|
client.NewSpotService().CreateOrder(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
TestCreateOrder()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"lbank_connector_go/sve"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
apiKey = "1cc62cfb-2f36-4ac9-b5fb-2c40138db8ab"
|
||||||
|
secretKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAILOdckXVqiMcLEdpockDZ1bLQc/XDlFxBSXMenZaok1PGljO6j2f45+PRH4X1tls78FHLBjCE4uizJb9kcd6uQTDCV9mMU4Tqyy9hflI1xt4K+u2Oxi+2z+NgrIOQXBazaZ+SJ1t1NMK5DhR7QUMPqMUg+JX7e2Xv89xOTiSfU1AgMBAAECgYB+OtcXs9oA1WZ6xW5Kw9QPokkV0WMiMd1DMZUNYq6YsjMWUJjmONpnnBM7IECFZuPK1xgUb704FVpmwrAreQeOpkS8i8PegP0yB/uaQAw1RYmnhOVpeJJPpHaLBwgSNP+EBBzi8/2ZYJPNbXaQm19QC0Y2grYMz35Z8Ro8zdF4gQJBAMvV5LRS1mSDpn6GG6APv/DjEblgaOAV4RWE1OJNxM3o8FeP41XPJMal6mX6YqwNVIvUFEv9ukiOiWmxrwrwRkkCQQCkSCINnWOQFRpsRkSIZ/ZgAz9PhdRcyIfqKCMstfaYu9SMubBD/rsJZSV27i+bmGwTR/Gmm4T51vadq/NwzUeNAkEAjnIYlKe7KZ0S8iJ4FcBL62RT0497WvYPSQF93/RnD1q08wwb27CZy7TQ/Jkg8YmTRvBbistyrhfmEZXZdLR6+QJBAIlKIvM/0cHKcQ+FVaatQy+P5yvdCtETYMpmCqdF1jRj3EhSsiTQz5wVZE7U1QJySfd/C0sR8vocFHNGDSb61s0CQQDLhsj7WLHTxZKiBvhxuXIwebQOVoqFomeAPloAMs2JUgIKqGXgVcByII2WiROmpWWx/W1ZfRxtHdD62v2BYBEI"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client = sve.NewClient(apiKey, secretKey)
|
||||||
|
|
||||||
|
func TestSupplementApiRestrictions() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"symbol": "lbk_usdt",
|
||||||
|
"size": "1",
|
||||||
|
}
|
||||||
|
client.NewWalletService().SupplementApiRestrictions(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
TestSupplementApiRestrictions()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"lbank_connector_go/sve"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
apiKey = "1cc62cfb-2f36-4ac9-b5fb-2c40138db8ab"
|
||||||
|
secretKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAILOdckXVqiMcLEdpockDZ1bLQc/XDlFxBSXMenZaok1PGljO6j2f45+PRH4X1tls78FHLBjCE4uizJb9kcd6uQTDCV9mMU4Tqyy9hflI1xt4K+u2Oxi+2z+NgrIOQXBazaZ+SJ1t1NMK5DhR7QUMPqMUg+JX7e2Xv89xOTiSfU1AgMBAAECgYB+OtcXs9oA1WZ6xW5Kw9QPokkV0WMiMd1DMZUNYq6YsjMWUJjmONpnnBM7IECFZuPK1xgUb704FVpmwrAreQeOpkS8i8PegP0yB/uaQAw1RYmnhOVpeJJPpHaLBwgSNP+EBBzi8/2ZYJPNbXaQm19QC0Y2grYMz35Z8Ro8zdF4gQJBAMvV5LRS1mSDpn6GG6APv/DjEblgaOAV4RWE1OJNxM3o8FeP41XPJMal6mX6YqwNVIvUFEv9ukiOiWmxrwrwRkkCQQCkSCINnWOQFRpsRkSIZ/ZgAz9PhdRcyIfqKCMstfaYu9SMubBD/rsJZSV27i+bmGwTR/Gmm4T51vadq/NwzUeNAkEAjnIYlKe7KZ0S8iJ4FcBL62RT0497WvYPSQF93/RnD1q08wwb27CZy7TQ/Jkg8YmTRvBbistyrhfmEZXZdLR6+QJBAIlKIvM/0cHKcQ+FVaatQy+P5yvdCtETYMpmCqdF1jRj3EhSsiTQz5wVZE7U1QJySfd/C0sR8vocFHNGDSb61s0CQQDLhsj7WLHTxZKiBvhxuXIwebQOVoqFomeAPloAMs2JUgIKqGXgVcByII2WiROmpWWx/W1ZfRxtHdD62v2BYBEI"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client = sve.NewClient(apiKey, secretKey)
|
||||||
|
|
||||||
|
func TestWithdraw() {
|
||||||
|
client.Debug = true
|
||||||
|
client.SetHost(sve.LbankApiHost)
|
||||||
|
data := map[string]string{
|
||||||
|
"symbol": "lbk_usdt",
|
||||||
|
"size": "1",
|
||||||
|
}
|
||||||
|
client.NewWithDrawService().Withdraw(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
TestWithdraw()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "lbank_connector_go/sve"
|
||||||
|
|
||||||
|
var client = sve.NewWsClient("", "")
|
||||||
|
|
||||||
|
func TestKbar() {
|
||||||
|
client.Debug = true
|
||||||
|
//client.SetHost(sve.LbankApiHost)
|
||||||
|
client.NewWsMarketService().Kbar("kbar", "usdt_btc")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
TestKbar()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
module lbank_connector_go
|
||||||
|
|
||||||
|
go 1.20
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/google/uuid v1.6.0
|
||||||
|
github.com/gorilla/websocket v1.5.1
|
||||||
|
github.com/natefinch/lumberjack v2.0.0+incompatible
|
||||||
|
github.com/tidwall/gjson v1.17.0
|
||||||
|
go.uber.org/zap v1.26.0
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/BurntSushi/toml v1.3.2 // indirect
|
||||||
|
github.com/tidwall/match v1.1.1 // indirect
|
||||||
|
github.com/tidwall/pretty v1.2.1 // indirect
|
||||||
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
|
golang.org/x/net v0.17.0 // indirect
|
||||||
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
|
||||||
|
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
|
||||||
|
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
|
||||||
|
github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM=
|
||||||
|
github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||||
|
github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=
|
||||||
|
github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||||
|
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
|
||||||
|
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||||
|
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||||
|
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
|
||||||
|
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||||
|
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
|
||||||
|
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||||
|
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||||
|
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
|
||||||
|
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
|
||||||
|
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
||||||
|
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
|
||||||
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
package pkg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/natefinch/lumberjack"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
"go.uber.org/zap/zapcore"
|
||||||
|
)
|
||||||
|
|
||||||
|
func genEncoder() zapcore.Encoder {
|
||||||
|
encoderConfig := zap.NewDevelopmentEncoderConfig()
|
||||||
|
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
|
||||||
|
encoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05.000")
|
||||||
|
encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
|
||||||
|
return zapcore.NewConsoleEncoder(encoderConfig)
|
||||||
|
}
|
||||||
|
|
||||||
|
func genInfoWrite() zapcore.WriteSyncer {
|
||||||
|
infoLumberIO := &lumberjack.Logger{
|
||||||
|
Filename: "./logs/info.log",
|
||||||
|
MaxSize: 10, // megabytes
|
||||||
|
MaxBackups: 100,
|
||||||
|
MaxAge: 7, // days
|
||||||
|
Compress: false,
|
||||||
|
}
|
||||||
|
return zapcore.AddSync(infoLumberIO)
|
||||||
|
}
|
||||||
|
|
||||||
|
func genErrorWrite() zapcore.WriteSyncer {
|
||||||
|
lumberWriteSyncer := &lumberjack.Logger{
|
||||||
|
Filename: "./logs/error.log",
|
||||||
|
MaxSize: 10, // megabytes
|
||||||
|
MaxBackups: 100,
|
||||||
|
MaxAge: 7, // days
|
||||||
|
Compress: false,
|
||||||
|
}
|
||||||
|
return zapcore.AddSync(lumberWriteSyncer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func InitLogger() *zap.SugaredLogger {
|
||||||
|
encoder := genEncoder()
|
||||||
|
|
||||||
|
info := genInfoWrite()
|
||||||
|
err := genErrorWrite()
|
||||||
|
|
||||||
|
core := zapcore.NewTee(
|
||||||
|
zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(info, zapcore.AddSync(os.Stdout)), zap.DebugLevel),
|
||||||
|
zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(err, zapcore.AddSync(os.Stdout)), zap.WarnLevel),
|
||||||
|
)
|
||||||
|
logger := zap.New(core, zap.AddCaller())
|
||||||
|
zap.ReplaceGlobals(logger)
|
||||||
|
defer logger.Sync()
|
||||||
|
return logger.Sugar()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,161 @@
|
||||||
|
package pkg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto"
|
||||||
|
"crypto/hmac"
|
||||||
|
"crypto/md5"
|
||||||
|
"crypto/rand"
|
||||||
|
"crypto/rsa"
|
||||||
|
"crypto/sha256"
|
||||||
|
"crypto/x509"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
|
"encoding/pem"
|
||||||
|
"errors"
|
||||||
|
mrand "math/rand"
|
||||||
|
"sort"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
func HmacHashing(s string) string {
|
||||||
|
d := []byte(s)
|
||||||
|
h := md5.New()
|
||||||
|
h.Write(d)
|
||||||
|
return strings.ToUpper(hex.EncodeToString(h.Sum(nil)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func HmacSHA256(paramStr, secretKey string) string {
|
||||||
|
h := hmac.New(sha256.New, []byte(secretKey))
|
||||||
|
h.Write([]byte(paramStr))
|
||||||
|
return hex.EncodeToString(h.Sum(nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
func PrettyPrint(str []byte) (string, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if err := json.Indent(&buf, str, "", " "); err != nil {
|
||||||
|
return string(str), err
|
||||||
|
}
|
||||||
|
return strings.TrimSuffix(buf.String(), "\n"), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
//func PrettyPrint(i interface{}) string {
|
||||||
|
// s, _ := json.MarshalIndent(i, "", "\t")
|
||||||
|
// return string(s)
|
||||||
|
//}
|
||||||
|
|
||||||
|
func Map2JsonString(param map[string]interface{}) string {
|
||||||
|
data, _ := json.Marshal(param)
|
||||||
|
return string(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func CurrentTimestamp() int64 {
|
||||||
|
return FormatTimestamp(time.Now())
|
||||||
|
}
|
||||||
|
|
||||||
|
func FormatTimestamp(t time.Time) int64 {
|
||||||
|
return t.UnixNano() / int64(time.Millisecond)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Timestamp() string {
|
||||||
|
return strconv.Itoa(int(time.Now().UnixMilli()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func RandomStr() string {
|
||||||
|
s := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||||
|
arr := strings.Split(s, "")
|
||||||
|
mrand.Shuffle(len(s), func(i, j int) {
|
||||||
|
arr[i], arr[j] = arr[j], arr[i]
|
||||||
|
})
|
||||||
|
return strings.Join(arr[:35], "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Interface2Str(i interface{}) string {
|
||||||
|
switch i.(type) {
|
||||||
|
case string:
|
||||||
|
return i.(string)
|
||||||
|
case int:
|
||||||
|
return strconv.Itoa(i.(int))
|
||||||
|
case int64:
|
||||||
|
return strconv.FormatInt(i.(int64), 10)
|
||||||
|
case float32:
|
||||||
|
return strconv.FormatFloat(i.(float64), 'f', -1, 32)
|
||||||
|
case float64:
|
||||||
|
return strconv.FormatFloat(i.(float64), 'f', -1, 64)
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParsePKCS1PrivateKey(secret []byte) (*rsa.PrivateKey, error) {
|
||||||
|
block, _ := pem.Decode(secret)
|
||||||
|
if block == nil {
|
||||||
|
return nil, errors.New("secret key error")
|
||||||
|
}
|
||||||
|
privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return privateKey.(*rsa.PrivateKey), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func FormatStringBySign(kwargs map[string]string) string {
|
||||||
|
var keys []string
|
||||||
|
|
||||||
|
for k := range kwargs {
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
sort.Strings(keys)
|
||||||
|
paramsSortStr := ""
|
||||||
|
for _, key := range keys {
|
||||||
|
paramsSortStr += key + "=" + kwargs[key] + "&"
|
||||||
|
}
|
||||||
|
paramsSortStr = paramsSortStr[:len(paramsSortStr)-1]
|
||||||
|
|
||||||
|
return paramsSortStr
|
||||||
|
}
|
||||||
|
|
||||||
|
func RSASign(params string, privateKey *rsa.PrivateKey) string {
|
||||||
|
md5Hash := md5.Sum([]byte(params))
|
||||||
|
md5String := strings.ToUpper(hex.EncodeToString(md5Hash[:]))
|
||||||
|
|
||||||
|
paramsSha256 := sha256.New()
|
||||||
|
paramsSha256.Write([]byte(md5String))
|
||||||
|
sha256Hash := paramsSha256.Sum(nil)
|
||||||
|
|
||||||
|
sigMsg, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, sha256Hash)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return base64.StdEncoding.EncodeToString(sigMsg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func HmacSha256Base64Signer(params string, secretKey string) (string, error) {
|
||||||
|
md5Hash := md5.Sum([]byte(params))
|
||||||
|
md5String := strings.ToUpper(hex.EncodeToString(md5Hash[:]))
|
||||||
|
|
||||||
|
mac := hmac.New(sha256.New, []byte(secretKey))
|
||||||
|
_, err := mac.Write([]byte(md5String))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return hex.EncodeToString(mac.Sum(nil)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Now() string {
|
||||||
|
return time.Now().Format("2006-01-02 15:04:05")
|
||||||
|
}
|
||||||
|
|
||||||
|
func RandomUUID() string {
|
||||||
|
id := uuid.New()
|
||||||
|
strID := id.String()
|
||||||
|
return strID
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
type AccountService struct {
|
||||||
|
c *Client
|
||||||
|
hs *HttpService
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AccountService) UserInfo(data map[string]string) {
|
||||||
|
url := a.c.Host + PathUserInfo
|
||||||
|
params := a.hs.BuildSignBody(data)
|
||||||
|
a.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AccountService) SubscribeGetKey(data map[string]string) {
|
||||||
|
url := a.c.Host + PathSubscribeGetKey
|
||||||
|
params := a.hs.BuildSignBody(data)
|
||||||
|
a.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AccountService) SubscribeRefreshKey(data map[string]string) {
|
||||||
|
url := a.c.Host + PathSubscribeRefreshKey
|
||||||
|
params := a.hs.BuildSignBody(data)
|
||||||
|
a.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AccountService) SubscribeDestroyKey(data map[string]string) {
|
||||||
|
url := a.c.Host + PathSubscribeDestroyKey
|
||||||
|
params := a.hs.BuildSignBody(data)
|
||||||
|
a.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AccountService) GetDepositAddress(data map[string]string) {
|
||||||
|
url := a.c.Host + PathGetDepositAddress
|
||||||
|
params := a.hs.BuildSignBody(data)
|
||||||
|
a.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AccountService) DepositHistory(data map[string]string) {
|
||||||
|
url := a.c.Host + PathDepositHistory
|
||||||
|
params := a.hs.BuildSignBody(data)
|
||||||
|
a.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
type BaseService struct {
|
||||||
|
c *Client
|
||||||
|
hs *HttpService
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseService) CurrencyPairs(data map[string]string) {
|
||||||
|
url := b.c.Host + PathCurrencyPairs
|
||||||
|
params := b.hs.BuildSignBody(data)
|
||||||
|
b.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseService) Accuracy(data map[string]string) {
|
||||||
|
url := b.c.Host + PathAccuracy
|
||||||
|
params := b.hs.BuildSignBody(data)
|
||||||
|
b.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseService) UsdToCny(data map[string]string) {
|
||||||
|
url := b.c.Host + PathUsdToCny
|
||||||
|
params := b.hs.BuildSignBody(data)
|
||||||
|
b.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseService) WithdrawConfigs(data map[string]string) {
|
||||||
|
url := b.c.Host + PathWithdrawConfigs
|
||||||
|
params := b.hs.BuildSignBody(data)
|
||||||
|
b.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseService) Timestamp(data map[string]string) {
|
||||||
|
url := b.c.Host + PathTimestamp
|
||||||
|
params := b.hs.BuildSignBody(data)
|
||||||
|
b.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseService) Ticker24hr(data map[string]string) {
|
||||||
|
url := b.c.Host + PathTicker24hr
|
||||||
|
params := b.hs.BuildSignBody(data)
|
||||||
|
b.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseService) EtfTicker24hr(data map[string]string) {
|
||||||
|
url := b.c.Host + PathEtfTicker24hr
|
||||||
|
params := b.hs.BuildSignBody(data)
|
||||||
|
b.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseService) Ticker(data map[string]string) {
|
||||||
|
url := b.c.Host + PathTicker
|
||||||
|
params := b.hs.BuildSignBody(data)
|
||||||
|
b.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseService) IncrDepth(data map[string]string) {
|
||||||
|
url := b.c.Host + PathIncrDepth
|
||||||
|
params := b.hs.BuildSignBody(data)
|
||||||
|
b.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseService) Trades(data map[string]string) {
|
||||||
|
url := b.c.Host + PathTrades
|
||||||
|
params := b.hs.BuildSignBody(data)
|
||||||
|
b.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseService) Kline(data map[string]string) {
|
||||||
|
url := b.c.Host + PathKline
|
||||||
|
params := b.hs.BuildSignBody(data)
|
||||||
|
b.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.uber.org/zap"
|
||||||
|
|
||||||
|
"lbank_connector_go/pkg"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Client struct {
|
||||||
|
ApiKey string
|
||||||
|
SecretKey string
|
||||||
|
Host string
|
||||||
|
Debug bool
|
||||||
|
Logger *zap.SugaredLogger
|
||||||
|
}
|
||||||
|
|
||||||
|
var host = "https://www.lbkex.net"
|
||||||
|
|
||||||
|
func NewClient(apiKey, secretKey string) *Client {
|
||||||
|
devLogger := pkg.InitLogger()
|
||||||
|
c := &Client{
|
||||||
|
ApiKey: apiKey,
|
||||||
|
SecretKey: secretKey,
|
||||||
|
Host: host,
|
||||||
|
Logger: devLogger,
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) debug(msg string, args ...interface{}) {
|
||||||
|
if c.Debug {
|
||||||
|
c.Logger.Debugf(msg, args...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) SetHost(host string) {
|
||||||
|
c.Host = host
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) NewSpotService() *SpotService {
|
||||||
|
hs := c.NewHttpService()
|
||||||
|
return &SpotService{c: c, hs: hs}
|
||||||
|
}
|
||||||
|
func (c *Client) NewMarketService() *MarketService {
|
||||||
|
hs := c.NewHttpService()
|
||||||
|
return &MarketService{c: c, hs: hs}
|
||||||
|
}
|
||||||
|
func (c *Client) NewWalletService() *WalletService {
|
||||||
|
hs := c.NewHttpService()
|
||||||
|
return &WalletService{c: c, hs: hs}
|
||||||
|
}
|
||||||
|
func (c *Client) NewBaseService() *BaseService {
|
||||||
|
hs := c.NewHttpService()
|
||||||
|
return &BaseService{c: c, hs: hs}
|
||||||
|
}
|
||||||
|
func (c *Client) NewAccountService() *AccountService {
|
||||||
|
hs := c.NewHttpService()
|
||||||
|
return &AccountService{c: c, hs: hs}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) NewOrderService() *OrderService {
|
||||||
|
hs := c.NewHttpService()
|
||||||
|
return &OrderService{c: c, hs: hs}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) NewWithDrawService() *WithDrawService {
|
||||||
|
hs := c.NewHttpService()
|
||||||
|
return &WithDrawService{c: c, hs: hs}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) NewHttpService() *HttpService {
|
||||||
|
return &HttpService{c: c}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,277 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/tls"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/tidwall/gjson"
|
||||||
|
|
||||||
|
"lbank_connector_go/pkg"
|
||||||
|
)
|
||||||
|
|
||||||
|
type HttpService struct {
|
||||||
|
c *Client
|
||||||
|
ReqObj *http.Request
|
||||||
|
RespObj *http.Response
|
||||||
|
Body string
|
||||||
|
CostTime int64
|
||||||
|
Method string
|
||||||
|
Headers map[string]string
|
||||||
|
Text string
|
||||||
|
Content []byte
|
||||||
|
IsEchoReq bool
|
||||||
|
isDebug bool
|
||||||
|
|
||||||
|
Error error
|
||||||
|
|
||||||
|
EchoStr string `json:"echostr"`
|
||||||
|
Timestamp string `json:"timestamp"`
|
||||||
|
SignatureMethod string `json:"signature_method"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var defaultHeaders = map[string]string{
|
||||||
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
|
}
|
||||||
|
|
||||||
|
var tr = &http.Transport{
|
||||||
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
||||||
|
MaxIdleConnsPerHost: 2000,
|
||||||
|
}
|
||||||
|
|
||||||
|
type KwArgs func(hs *HttpService)
|
||||||
|
|
||||||
|
func WithHeaders(headers map[string]string) KwArgs {
|
||||||
|
return func(hs *HttpService) {
|
||||||
|
hs.Headers = headers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func WithDebug(debug bool) KwArgs {
|
||||||
|
return func(hs *HttpService) {
|
||||||
|
hs.isDebug = debug
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithParams(params map[string]string) KwArgs {
|
||||||
|
urlParams := url.Values{}
|
||||||
|
for k, v := range params {
|
||||||
|
urlParams.Add(k, v)
|
||||||
|
}
|
||||||
|
return func(hs *HttpService) {
|
||||||
|
hs.ReqObj.URL.RawQuery = urlParams.Encode()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewHttpService() *HttpService {
|
||||||
|
return &HttpService{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) Get(url, data string, kwargs ...KwArgs) *http.Response {
|
||||||
|
var newUrl string
|
||||||
|
if len(data) > 0 {
|
||||||
|
newUrl = fmt.Sprintf("%s?%s", url, data)
|
||||||
|
} else {
|
||||||
|
newUrl = url
|
||||||
|
}
|
||||||
|
text, err := hs.DoHttpRequest("GET", newUrl, "", kwargs...)
|
||||||
|
hs.Error = err
|
||||||
|
hs.Text = text
|
||||||
|
if err != nil {
|
||||||
|
hs.c.debug("[reqErr] %s\n" + err.Error())
|
||||||
|
}
|
||||||
|
return hs.RespObj
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) Post(url, json string, kwargs ...KwArgs) *http.Response {
|
||||||
|
text, err := hs.DoHttpRequest("POST", url, json, kwargs...)
|
||||||
|
hs.Text = text
|
||||||
|
if err != nil {
|
||||||
|
hs.c.Logger.Error("[reqErr] %s\n" + err.Error())
|
||||||
|
}
|
||||||
|
return hs.RespObj
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) IsPrintReq(isEchoReq bool) *HttpService {
|
||||||
|
hs.IsEchoReq = isEchoReq
|
||||||
|
return hs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) DoHttpRequest(method, url, body string, kwargs ...KwArgs) (string, error) {
|
||||||
|
hs.BuildHeader()
|
||||||
|
client := hs.BuildClient()
|
||||||
|
req, err := hs.BuildRequest(method, url, body)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
hs.ReqObj = req
|
||||||
|
|
||||||
|
for _, kw := range kwargs {
|
||||||
|
kw(hs)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(hs.Headers) > 0 {
|
||||||
|
hs.BuildRequestHeaders(hs.ReqObj, hs.Headers)
|
||||||
|
} else {
|
||||||
|
hs.BuildRequestHeaders(hs.ReqObj, defaultHeaders)
|
||||||
|
}
|
||||||
|
startTime := time.Now()
|
||||||
|
respObj, err := client.Do(hs.ReqObj)
|
||||||
|
hs.RespObj = respObj
|
||||||
|
elapsed := time.Since(startTime).Nanoseconds() / int64(time.Millisecond)
|
||||||
|
hs.CostTime = elapsed
|
||||||
|
if hs.IsEchoReq || hs.isDebug || hs.c.Debug {
|
||||||
|
hs.PrintReqInfo(hs.ReqObj)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
hs.c.Logger.Error("[reqErr] %s\n" + err.Error())
|
||||||
|
hs.PrintReqInfo(hs.ReqObj)
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer respObj.Body.Close()
|
||||||
|
content, err := io.ReadAll(respObj.Body)
|
||||||
|
hs.Content = content
|
||||||
|
if err != nil {
|
||||||
|
hs.c.Logger.Error("[RespErr]%s\n" + err.Error())
|
||||||
|
hs.PrintReqInfo(hs.ReqObj)
|
||||||
|
hs.PrintRespInfo(content, elapsed)
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if hs.isDebug || hs.c.Debug {
|
||||||
|
hs.PrintRespInfo(content, elapsed)
|
||||||
|
}
|
||||||
|
return string(content), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) BuildRequest(method, url string, body string) (req *http.Request, err error) {
|
||||||
|
hs.Body = body
|
||||||
|
b := hs.BuildBody(body)
|
||||||
|
req, err = http.NewRequest(method, url, b)
|
||||||
|
if err != nil {
|
||||||
|
hs.c.Logger.Error("BuildRequestErr" + err.Error())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) BuildClient() *http.Client {
|
||||||
|
client := &http.Client{Timeout: 3 * 60 * time.Second, Transport: tr}
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) BuildRequestHeaders(req *http.Request, headers map[string]string) *HttpService {
|
||||||
|
for k, v := range headers {
|
||||||
|
req.Header.Set(k, v)
|
||||||
|
}
|
||||||
|
return hs
|
||||||
|
//{"Content-Type": 'application/x-www-form-urlencoded',
|
||||||
|
// "signature_method": self.sign_method,
|
||||||
|
// 'timestamp': self.timestamp,
|
||||||
|
// 'echostr': self.random_str}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) PrintReqInfo(req *http.Request) {
|
||||||
|
s := fmt.Sprintf("\n [ReqHeaders]:%v", req.Header) + fmt.Sprintf("\n [ReqMethod]:%s", req.Method) +
|
||||||
|
fmt.Sprintf("\n [ReqUrl]:%s", req.URL) + fmt.Sprintf("\n [ReqBody]:%s", hs.Body)
|
||||||
|
hs.c.debug(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) BuildBody(body string) *strings.Reader {
|
||||||
|
hs.Body = body
|
||||||
|
return strings.NewReader(body)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) PrintRespInfo(resInfo []byte, costTime int64) *HttpService {
|
||||||
|
costFloat := float64(costTime) / 1.0e9
|
||||||
|
formatCostTime := fmt.Sprintf("%.3f", costFloat)
|
||||||
|
hs.CostTime = costTime / 1e6
|
||||||
|
r, _ := pkg.PrettyPrint(resInfo)
|
||||||
|
s := fmt.Sprintf("\n [RespHttpCode]:%d", hs.RespObj.StatusCode) + fmt.Sprintf("\n [RespCost]:%sSecond",
|
||||||
|
formatCostTime) + fmt.Sprintf("\n [RespBody]:%s", r)
|
||||||
|
hs.c.debug(s)
|
||||||
|
return hs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) PrettyPrint(resInfo []byte) (string, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if err := json.Indent(&buf, resInfo, "", " "); err != nil {
|
||||||
|
return string(resInfo), err
|
||||||
|
}
|
||||||
|
return strings.TrimSuffix(buf.String(), "\n"), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) Map2String(body map[string]interface{}) string {
|
||||||
|
return pkg.Map2JsonString(body)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Json https://github.com/tidwall/gjson
|
||||||
|
func (hs *HttpService) Json() gjson.Result {
|
||||||
|
return gjson.Parse(hs.Text)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) InitTsAndStr() {
|
||||||
|
hs.Timestamp = pkg.Timestamp()
|
||||||
|
hs.EchoStr = pkg.RandomStr()
|
||||||
|
}
|
||||||
|
func (hs *HttpService) BuildHeader() *HttpService {
|
||||||
|
hd := map[string]string{
|
||||||
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
|
"signature_method": "RSA",
|
||||||
|
"timestamp": hs.Timestamp,
|
||||||
|
"echostr": hs.EchoStr}
|
||||||
|
hs.Headers = hd
|
||||||
|
return hs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) BuildSignBody(kwargs map[string]string) string {
|
||||||
|
hs.InitTsAndStr()
|
||||||
|
kwargs["api_key"] = hs.c.ApiKey
|
||||||
|
kwargs["timestamp"] = hs.Timestamp
|
||||||
|
if len(hs.c.SecretKey) > 0 {
|
||||||
|
kwargs["signature_method"] = "RSA"
|
||||||
|
} else {
|
||||||
|
kwargs["signature_method"] = "HmacSHA256"
|
||||||
|
}
|
||||||
|
kwargs["echostr"] = hs.EchoStr
|
||||||
|
|
||||||
|
paramsSortStr := pkg.FormatStringBySign(kwargs)
|
||||||
|
var sign string
|
||||||
|
if len(hs.c.SecretKey) > 0 {
|
||||||
|
sign, _ = hs.BuildRsaSignV2(paramsSortStr, hs.c.SecretKey)
|
||||||
|
} else {
|
||||||
|
sign, _ = hs.BuildHmacSignV2(paramsSortStr, hs.c.SecretKey)
|
||||||
|
}
|
||||||
|
kwargs["sign"] = sign
|
||||||
|
postData := url.Values{}
|
||||||
|
for k, v := range kwargs {
|
||||||
|
postData.Add(k, v)
|
||||||
|
}
|
||||||
|
postData.Del("echostr")
|
||||||
|
postData.Del("timestamp")
|
||||||
|
postData.Del("signature_method")
|
||||||
|
hs.Body = postData.Encode()
|
||||||
|
return postData.Encode()
|
||||||
|
}
|
||||||
|
|
||||||
|
// BuildRsaSignV2
|
||||||
|
func (hs *HttpService) BuildRsaSignV2(params, secret string) (string, error) {
|
||||||
|
if len(secret) == 0 {
|
||||||
|
return "", errors.New("secret is empty")
|
||||||
|
}
|
||||||
|
b := []byte("-----BEGIN RSA PRIVATE KEY-----\n" + secret + "\n-----END RSA PRIVATE KEY-----")
|
||||||
|
privateKey, err := pkg.ParsePKCS1PrivateKey(b)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return pkg.RSASign(params, privateKey), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hs *HttpService) BuildHmacSignV2(params, secret string) (string, error) {
|
||||||
|
return pkg.HmacSha256Base64Signer(params, secret)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
type MarketService struct {
|
||||||
|
c *Client
|
||||||
|
hs *HttpService
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MarketService) Depth(data map[string]string) {
|
||||||
|
url := m.c.Host + PathDepth
|
||||||
|
params := m.hs.BuildSignBody(data)
|
||||||
|
m.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
func (m *MarketService) SupplementTrades(data map[string]string) {
|
||||||
|
url := m.c.Host + PathSupplementTrades
|
||||||
|
params := m.hs.BuildSignBody(data)
|
||||||
|
m.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
func (m *MarketService) SupplementTickerPrice(data map[string]string) {
|
||||||
|
url := m.c.Host + PathSupplementTickerPrice
|
||||||
|
params := m.hs.BuildSignBody(data)
|
||||||
|
m.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
func (m *MarketService) SupplementTickerBookTicker(data map[string]string) {
|
||||||
|
url := m.c.Host + PathSupplementTickerBookTicker
|
||||||
|
params := m.hs.BuildSignBody(data)
|
||||||
|
m.hs.Get(url, params)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
type OrderService struct {
|
||||||
|
c *Client
|
||||||
|
hs *HttpService
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrderService) CreateOrder(data map[string]string) {
|
||||||
|
url := o.c.Host + PathCreateOrder
|
||||||
|
params := o.hs.BuildSignBody(data)
|
||||||
|
o.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrderService) BatchCreateOrder(data map[string]string) {
|
||||||
|
url := o.c.Host + PathBatchCreateOrder
|
||||||
|
params := o.hs.BuildSignBody(data)
|
||||||
|
o.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrderService) CancelOrder(data map[string]string) {
|
||||||
|
url := o.c.Host + PathCancelOrder
|
||||||
|
params := o.hs.BuildSignBody(data)
|
||||||
|
o.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrderService) CancelClientOrders(data map[string]string) {
|
||||||
|
url := o.c.Host + PathCancelClientOrders
|
||||||
|
params := o.hs.BuildSignBody(data)
|
||||||
|
o.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrderService) OrdersInfo(data map[string]string) {
|
||||||
|
url := o.c.Host + PathOrdersInfo
|
||||||
|
params := o.hs.BuildSignBody(data)
|
||||||
|
o.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrderService) OrdersInfoHistory(data map[string]string) {
|
||||||
|
url := o.c.Host + PathOrdersInfoHistory
|
||||||
|
params := o.hs.BuildSignBody(data)
|
||||||
|
o.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrderService) OrderTransactionDetail(data map[string]string) {
|
||||||
|
url := o.c.Host + PathOrderTransactionDetail
|
||||||
|
params := o.hs.BuildSignBody(data)
|
||||||
|
o.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrderService) TransactionHistory(data map[string]string) {
|
||||||
|
url := o.c.Host + PathTransactionHistory
|
||||||
|
params := o.hs.BuildSignBody(data)
|
||||||
|
o.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrderService) OrdersInfoNoDeal(data map[string]string) {
|
||||||
|
url := o.c.Host + PathOrdersInfoNoDeal
|
||||||
|
params := o.hs.BuildSignBody(data)
|
||||||
|
o.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,82 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
const (
|
||||||
|
//LbankApiHost = "https://api.lbkex.com"
|
||||||
|
LbankApiHost = "https://www.lbkex.net"
|
||||||
|
LbankWsApiHost = ""
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PathSupplementCreatOrder = "/v2/supplement/create_order.do"
|
||||||
|
PathSupplementCancelOrder = "/v2/supplement/cancel_order.do"
|
||||||
|
PathSupplementCancelOrderBySymbol = "/v2/supplement/cancel_order_by_symbol.do"
|
||||||
|
PathSupplementOrdersInfo = "/v2/supplement/orders_info.do"
|
||||||
|
PathSupplementOrdersInfoNoDeal = "/v2/supplement/orders_info_no_deal.do"
|
||||||
|
PathSupplementOrdersInfoHistory = "/v2/supplement/orders_info_history.do"
|
||||||
|
PathSupplementUserInfoAccount = "/v2/supplement/user_info_account.do"
|
||||||
|
PathSupplementTransactionHistory = "/v2/supplement/transaction_history.do"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PathDepth = "/v2/depth.do"
|
||||||
|
PathSupplementTrades = "/v2/supplement/trades.do"
|
||||||
|
PathSupplementTickerPrice = "/v2/supplement/ticker/price.do"
|
||||||
|
PathSupplementTickerBookTicker = "/v2/supplement/ticker/bookTicker.do"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PathSupplementSystemStatus = "/v2/supplement/system_status.do"
|
||||||
|
PathSupplementUserInfo = "/v2/supplement/user_info.do"
|
||||||
|
PathSupplementWithdraw = "/v2/supplement/withdraw.do"
|
||||||
|
PathSupplementDepositHistory = "/v2/supplement/deposit_history.do"
|
||||||
|
PathSupplementWithdraws = "/v2/supplement/withdraws.do"
|
||||||
|
PathSupplementGetDepositAddress = "/v2/supplement/get_deposit_address.do"
|
||||||
|
PathSupplementAssetDetail = "/v2/supplement/asset_detail.do"
|
||||||
|
PathSupplementCustomerTradeFee = "/v2/supplement/customer_trade_fee.do"
|
||||||
|
PathSupplementApiRestrictions = "/v2/supplement/api_Restrictions.do"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PathCurrencyPairs = "/v2/currencyPairs.do"
|
||||||
|
PathAccuracy = "/v2/accuracy.do"
|
||||||
|
PathUsdToCny = "/v2/usdToCny.do"
|
||||||
|
PathWithdrawConfigs = "/v2/withdrawConfigs.do"
|
||||||
|
PathTimestamp = "/v2/timestamp.do"
|
||||||
|
PathTicker24hr = "/v2/ticker/24hr.do"
|
||||||
|
PathEtfTicker24hr = "/v2/etfTicker/24hr.do"
|
||||||
|
PathTicker = "/v2/ticker.do"
|
||||||
|
PathIncrDepth = "/v2/incrDepth.do"
|
||||||
|
PathTrades = "/v2/trades.do"
|
||||||
|
PathKline = "/v2/kline.do"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PathUserInfo = "/v2/user_info.do"
|
||||||
|
PathSubscribeGetKey = "/v2/subscribe/get_key.do"
|
||||||
|
PathSubscribeRefreshKey = "/v2/subscribe/refresh_key.do"
|
||||||
|
PathSubscribeDestroyKey = "/v2/subscribe/destroy_key.do"
|
||||||
|
PathGetDepositAddress = "/v2/get_deposit_address.do"
|
||||||
|
PathDepositHistory = "/v2/deposit_history.do"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PathCreateOrder = "/v2/create_order.do"
|
||||||
|
PathBatchCreateOrder = "/v2/batch_create_order.do"
|
||||||
|
PathCancelOrder = "/v2/cancel_order.do"
|
||||||
|
PathCancelClientOrders = "/v2/cancel_clientOrders.do"
|
||||||
|
PathOrdersInfo = "/v2/orders_info.do"
|
||||||
|
PathOrdersInfoHistory = "/v2/orders_info_history.do"
|
||||||
|
PathOrderTransactionDetail = "/v2/order_transaction_detail.do"
|
||||||
|
PathTransactionHistory = "/v2/transaction_history.do"
|
||||||
|
PathOrdersInfoNoDeal = "/v2/orders_info_no_deal.do"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PathWithdraw = "/v2/withdraw.do"
|
||||||
|
PathWithdrawCancel = "/v2/withdrawCancel.do"
|
||||||
|
PathWithdraws = "/v2/withdraws.do"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PathWs = "wss://www.lbkex.net/ws/V2/"
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
type SpotService struct {
|
||||||
|
c *Client
|
||||||
|
hs *HttpService
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SpotService) CreateOrder(data map[string]string) {
|
||||||
|
url := s.c.Host + PathSupplementCreatOrder
|
||||||
|
params := s.hs.BuildSignBody(data)
|
||||||
|
s.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SpotService) CancelOrder(data map[string]string) {
|
||||||
|
url := s.c.Host + PathSupplementCancelOrder
|
||||||
|
params := s.hs.BuildSignBody(data)
|
||||||
|
s.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SpotService) CancelOrderBySymbol(data map[string]string) {
|
||||||
|
url := s.c.Host + PathSupplementCancelOrderBySymbol
|
||||||
|
params := s.hs.BuildSignBody(data)
|
||||||
|
s.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SpotService) OrdersInfo(data map[string]string) {
|
||||||
|
url := s.c.Host + PathSupplementOrdersInfo
|
||||||
|
params := s.hs.BuildSignBody(data)
|
||||||
|
s.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SpotService) OrdersInfoNoDeal(data map[string]string) {
|
||||||
|
url := s.c.Host + PathSupplementOrdersInfoNoDeal
|
||||||
|
params := s.hs.BuildSignBody(data)
|
||||||
|
s.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SpotService) OrdersInfoHistory(data map[string]string) {
|
||||||
|
url := s.c.Host + PathSupplementOrdersInfoHistory
|
||||||
|
params := s.hs.BuildSignBody(data)
|
||||||
|
s.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SpotService) UserInfoAccount(data map[string]string) {
|
||||||
|
url := s.c.Host + PathSupplementUserInfoAccount
|
||||||
|
params := s.hs.BuildSignBody(data)
|
||||||
|
s.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
func (s *SpotService) TransactionHistory(data map[string]string) {
|
||||||
|
url := s.c.Host + PathSupplementTransactionHistory
|
||||||
|
params := s.hs.BuildSignBody(data)
|
||||||
|
s.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
type WalletService struct {
|
||||||
|
c *Client
|
||||||
|
hs *HttpService
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WalletService) SupplementSystemStatus(data map[string]string) {
|
||||||
|
url := w.c.Host + PathSupplementSystemStatus
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WalletService) SupplementUserInfo(data map[string]string) {
|
||||||
|
url := w.c.Host + PathSupplementUserInfo
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WalletService) SupplementWithdraw(data map[string]string) {
|
||||||
|
url := w.c.Host + PathSupplementWithdraw
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WalletService) SupplementDepositHistory(data map[string]string) {
|
||||||
|
url := w.c.Host + PathSupplementDepositHistory
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WalletService) SupplementWithdraws(data map[string]string) {
|
||||||
|
url := w.c.Host + PathSupplementWithdraws
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WalletService) SupplementGetDepositAddress(data map[string]string) {
|
||||||
|
url := w.c.Host + PathSupplementGetDepositAddress
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WalletService) SupplementAssetDetail(data map[string]string) {
|
||||||
|
url := w.c.Host + PathSupplementAssetDetail
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WalletService) SupplementCustomerTradeFee(data map[string]string) {
|
||||||
|
url := w.c.Host + PathSupplementCustomerTradeFee
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WalletService) SupplementApiRestrictions(data map[string]string) {
|
||||||
|
url := w.c.Host + PathSupplementApiRestrictions
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
type WithDrawService struct {
|
||||||
|
c *Client
|
||||||
|
hs *HttpService
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WithDrawService) Withdraw(data map[string]string) {
|
||||||
|
url := w.c.Host + PathWithdraw
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WithDrawService) WithdrawCancel(data map[string]string) {
|
||||||
|
url := w.c.Host + PathWithdrawCancel
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WithDrawService) Withdraws(data map[string]string) {
|
||||||
|
url := w.c.Host + PathWithdraws
|
||||||
|
params := w.hs.BuildSignBody(data)
|
||||||
|
w.hs.Post(url, params)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net/url"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/gorilla/websocket"
|
||||||
|
|
||||||
|
"lbank_connector_go/pkg"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WsService struct {
|
||||||
|
conn *websocket.Conn
|
||||||
|
Wc *WsClient
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WsService) KeepAlive(timeout time.Duration) {
|
||||||
|
ticker := time.NewTicker(timeout)
|
||||||
|
go func() {
|
||||||
|
defer ticker.Stop()
|
||||||
|
for {
|
||||||
|
pingMap := map[string]string{
|
||||||
|
"ping": pkg.RandomUUID(),
|
||||||
|
"action": "ping",
|
||||||
|
}
|
||||||
|
msg, _ := json.Marshal(pingMap)
|
||||||
|
w.SendMsg(msg)
|
||||||
|
<-ticker.C
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WsService) CreateWsConn() (*websocket.Conn, error) {
|
||||||
|
u := url.URL{Scheme: "wss", Host: "www.lbkex.net", Path: "/ws/V2/"}
|
||||||
|
if w.Wc.Debug {
|
||||||
|
w.Wc.debug("CreateWsConn: %s", u.String())
|
||||||
|
}
|
||||||
|
dialer := websocket.DefaultDialer
|
||||||
|
conn, _, err := dialer.Dial(u.String(), nil)
|
||||||
|
if err != nil {
|
||||||
|
w.Wc.Logger.Fatal("dial:", err)
|
||||||
|
}
|
||||||
|
w.conn = conn
|
||||||
|
return conn, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WsService) SendMsg(content []byte) {
|
||||||
|
err := w.conn.WriteMessage(websocket.TextMessage, content)
|
||||||
|
if err != nil {
|
||||||
|
w.Wc.Logger.Fatal("SendMsg:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if w.Wc.Debug {
|
||||||
|
w.Wc.debug("Sent: %s", content)
|
||||||
|
|
||||||
|
}
|
||||||
|
log.Printf("Sent: %s", content)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WsService) ReceiveMsg() {
|
||||||
|
for {
|
||||||
|
_, message, err := w.conn.ReadMessage()
|
||||||
|
if err != nil {
|
||||||
|
w.Wc.Logger.Fatal("read:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Wc.debug("Received: %s", message)
|
||||||
|
fmt.Printf("Received: %s", message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WsMarketService struct {
|
||||||
|
Ws *WsService
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *WsMarketService) Kbar(kbar, pair string) {
|
||||||
|
conn, _ := w.Ws.CreateWsConn()
|
||||||
|
defer conn.Close()
|
||||||
|
//payloay := map[string]string{
|
||||||
|
// "action": "subscribe",
|
||||||
|
// "subscribe": "kbar",
|
||||||
|
// "kbar": kbar,
|
||||||
|
// "pair": pair,
|
||||||
|
//}
|
||||||
|
w.Ws.KeepAlive(10 * time.Second)
|
||||||
|
//msg, _ := json.Marshal(payloay)
|
||||||
|
msg := []byte(`{"action":"subscribe","subscribe":"kbar","kbar":"5min","pair":"btc_usdt"}`)
|
||||||
|
go w.Ws.SendMsg(msg)
|
||||||
|
go w.Ws.ReceiveMsg()
|
||||||
|
select {}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
package sve
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.uber.org/zap"
|
||||||
|
|
||||||
|
"lbank_connector_go/pkg"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WsClient struct {
|
||||||
|
ApiKey string
|
||||||
|
SecretKey string
|
||||||
|
Host string
|
||||||
|
Debug bool
|
||||||
|
Logger *zap.SugaredLogger
|
||||||
|
}
|
||||||
|
|
||||||
|
//var host = "https://www.lbkex.net"
|
||||||
|
|
||||||
|
func NewWsClient(apiKey, secretKey string) *WsClient {
|
||||||
|
devLogger := pkg.InitLogger()
|
||||||
|
wsClient := &WsClient{
|
||||||
|
ApiKey: apiKey,
|
||||||
|
SecretKey: secretKey,
|
||||||
|
Host: host,
|
||||||
|
Logger: devLogger,
|
||||||
|
}
|
||||||
|
return wsClient
|
||||||
|
}
|
||||||
|
|
||||||
|
func (wc *WsClient) debug(msg string, args ...interface{}) {
|
||||||
|
if wc.Debug {
|
||||||
|
wc.Logger.Debugf(msg, args...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (wc *WsClient) SetHost(host string) {
|
||||||
|
wc.Host = host
|
||||||
|
}
|
||||||
|
|
||||||
|
func (wc *WsClient) NewWsService() *WsService {
|
||||||
|
return &WsService{Wc: wc}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (wc *WsClient) NewWsMarketService() *WsMarketService {
|
||||||
|
ws := wc.NewWsService()
|
||||||
|
return &WsMarketService{ws}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package lbank_connector_go
|
||||||
|
|
||||||
|
const Version = "0.1.0"
|
||||||
|
|
||||||
|
const Name = "lbank-connector-go"
|
||||||
Loading…
Reference in New Issue