├── .gitignore ├── types ├── icon.png └── commons.go ├── helpers ├── changer.go ├── helper.go └── calc.go ├── LICENSE ├── go.mod ├── client_public_test.go ├── public ├── request.go ├── common.go └── types.go ├── onboard └── onboarding.go ├── private ├── common.go ├── request.go └── types.go ├── client_private_test.go ├── client.go ├── README.md ├── realtime └── connect.go └── go.sum /.gitignore: -------------------------------------------------------------------------------- 1 | *.json 2 | *.toml -------------------------------------------------------------------------------- /types/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/go-numb/go-dydx/HEAD/types/icon.png -------------------------------------------------------------------------------- /helpers/changer.go: -------------------------------------------------------------------------------- 1 | package helpers 2 | 3 | import ( 4 | "fmt" 5 | "math" 6 | "net/url" 7 | "reflect" 8 | "strconv" 9 | ) 10 | 11 | func ToFloat(s string) float64 { 12 | f, err := strconv.ParseFloat(s, 64) 13 | if err != nil { 14 | return math.NaN() 15 | } 16 | return f 17 | } 18 | 19 | func ToValues(i interface{}) (values url.Values) { 20 | values = url.Values{} 21 | iVal := reflect.ValueOf(i).Elem() 22 | typ := iVal.Type() 23 | for i := 0; i < iVal.NumField(); i++ { 24 | values.Set(typ.Field(i).Name, fmt.Sprint(iVal.Field(i))) 25 | } 26 | return 27 | } 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 _numbP 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/go-numb/go-dydx 2 | 3 | go 1.18 4 | 5 | require ( 6 | github.com/buger/jsonparser v1.1.1 7 | github.com/ethereum/go-ethereum v1.10.16 8 | github.com/google/go-querystring v1.1.0 9 | github.com/gorilla/websocket v1.4.2 10 | github.com/miguelmota/go-solidity-sha3 v0.1.1 11 | github.com/satori/go.uuid v1.2.0 12 | github.com/stretchr/testify v1.7.0 13 | github.com/umbracle/ethgo v0.1.0 14 | github.com/yanue/starkex v0.0.0-20211122094927-61a9aa6b8d97 15 | ) 16 | 17 | require ( 18 | github.com/btcsuite/btcd v0.21.0-beta // indirect 19 | github.com/davecgh/go-spew v1.1.1 // indirect 20 | github.com/google/gofuzz v1.2.0 // indirect 21 | github.com/huandu/xstrings v1.3.2 // indirect 22 | github.com/klauspost/compress v1.4.1 // indirect 23 | github.com/klauspost/cpuid v1.2.0 // indirect 24 | github.com/pmezard/go-difflib v1.0.0 // indirect 25 | github.com/shopspring/decimal v1.3.1 // indirect 26 | github.com/umbracle/fastrlp v0.0.0-20211229195328-c1416904ae17 // indirect 27 | github.com/valyala/bytebufferpool v1.0.0 // indirect 28 | github.com/valyala/fasthttp v1.4.0 // indirect 29 | github.com/valyala/fastjson v1.4.1 // indirect 30 | golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect 31 | golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 // indirect 32 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect 33 | ) 34 | -------------------------------------------------------------------------------- /client_public_test.go: -------------------------------------------------------------------------------- 1 | package dydx_test 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | "time" 7 | 8 | "github.com/go-numb/go-dydx" 9 | "github.com/go-numb/go-dydx/helpers" 10 | "github.com/go-numb/go-dydx/public" 11 | "github.com/stretchr/testify/assert" 12 | ) 13 | 14 | func TestGetMarkets(t *testing.T) { 15 | client := dydx.New(options) 16 | res, err := client.Public.GetMarkets("") 17 | assert.NoError(t, err) 18 | 19 | for k, v := range res.Markets { 20 | fmt.Printf("max position - %v\n", v.MaxPositionSize) 21 | fmt.Printf("%v - %#v\n", k, helpers.ToFloat(v.MinOrderSize)*helpers.ToFloat(v.IndexPrice)) 22 | } 23 | } 24 | 25 | func TestGetTrades(t *testing.T) { 26 | client := dydx.New(options) 27 | res, err := client.Public.GetTrades(&public.TradesParam{ 28 | MarketID: "BTC-USD", 29 | }) 30 | assert.NoError(t, err) 31 | fmt.Printf("%v", res) 32 | } 33 | 34 | func TestGetCandles(t *testing.T) { 35 | client := dydx.New(options) 36 | start := -100 * 24 * time.Hour 37 | res, err := client.Public.GetCandles(&public.CandlesParam{ 38 | Market: "BTC-USD", 39 | Resolution: "5MINS", 40 | FromISO: time.Now().UTC().Add(start).Format(time.RFC3339), 41 | ToISO: time.Now().UTC().Add(start + time.Duration(5*100)*time.Minute).Format(time.RFC3339), 42 | Limit: 100, 43 | }) 44 | 45 | assert.NoError(t, err) 46 | fmt.Printf("%v, lenght: %d\n", res, len(res.Candles)) 47 | } 48 | func TestGetHistoricalFunding(t *testing.T) { 49 | client := dydx.New(options) 50 | res, err := client.Public.GetHistoricalFunding(&public.HistoricalFundingsParam{ 51 | Market: "BTC-USD", 52 | }) 53 | assert.NoError(t, err) 54 | fmt.Printf("%v", res) 55 | } 56 | -------------------------------------------------------------------------------- /helpers/helper.go: -------------------------------------------------------------------------------- 1 | package helpers 2 | 3 | import ( 4 | "fmt" 5 | "math/rand" 6 | "net/url" 7 | "strconv" 8 | "strings" 9 | "time" 10 | 11 | "github.com/ethereum/go-ethereum/common/hexutil" 12 | solsha3 "github.com/miguelmota/go-solidity-sha3" 13 | uuid "github.com/satori/go.uuid" 14 | ) 15 | 16 | var namespace = Must(FromString("0f9da948-a6fb-4c45-9edc-4685c3f3317d")) 17 | 18 | func getUserId(address string) string { 19 | return uuid.NewV5(namespace, address).String() 20 | } 21 | 22 | func GetAccountId(address string) string { 23 | return uuid.NewV5(namespace, getUserId(strings.ToLower(address))+strconv.Itoa(0)).String() 24 | } 25 | 26 | func FromString(input string) (u uuid.UUID, err error) { 27 | err = u.UnmarshalText([]byte(input)) 28 | return 29 | } 30 | 31 | func Must(u uuid.UUID, err error) uuid.UUID { 32 | if err != nil { 33 | panic(err) 34 | } 35 | return u 36 | } 37 | 38 | func RandomClientId() string { 39 | rand.Seed(time.Now().UnixNano()) 40 | return fmt.Sprintf("%016d", rand.Intn(10000000000000000)) 41 | } 42 | 43 | func GenerateQueryPath(url string, params url.Values) string { 44 | if len(params) == 0 { 45 | return url 46 | } 47 | return fmt.Sprintf("%s?%s", url, params.Encode()) 48 | } 49 | 50 | func CreateTypedSignature(signature string, sigType int) string { 51 | return fmt.Sprintf("%s0%s", fixRawSignature(signature), strconv.Itoa(sigType)) 52 | } 53 | 54 | func fixRawSignature(signature string) string { 55 | stripped := strings.TrimPrefix(signature, "0x") 56 | if len(stripped) != 130 { 57 | panic(fmt.Sprintf("Invalid raw signature: %s", signature)) 58 | } 59 | rs := stripped[:128] 60 | v := stripped[128:130] 61 | if v == "00" { 62 | return "0x" + rs + "1b" 63 | } 64 | if v == "01" { 65 | return "0x" + rs + "1c" 66 | } 67 | if v == "1b" || v == "1c" { 68 | return "0x" + stripped 69 | } 70 | panic(fmt.Sprintf("Invalid v value: %s", v)) 71 | } 72 | 73 | func HashString(input string) string { 74 | return hexutil.Encode(solsha3.SoliditySHA3([]string{"string"}, input)) 75 | } 76 | 77 | func ExpireAfter(duration time.Duration) string { 78 | return time.Now().Add(duration).UTC().Format("2006-01-02T15:04:05.999Z") 79 | } 80 | -------------------------------------------------------------------------------- /public/request.go: -------------------------------------------------------------------------------- 1 | package public 2 | 3 | import ( 4 | "encoding/json" 5 | "errors" 6 | "fmt" 7 | "net/url" 8 | 9 | "github.com/google/go-querystring/query" 10 | ) 11 | 12 | func (p *Public) GetMarkets(marketID string) (*MarketsResponse, error) { 13 | u := url.Values{} 14 | if marketID != "" { 15 | u.Add("market", marketID) 16 | } 17 | res, err := p.get("markets", u) 18 | if err != nil { 19 | return nil, err 20 | } 21 | m := &MarketsResponse{} 22 | if err := json.Unmarshal(res, m); err != nil { 23 | return nil, err 24 | } 25 | 26 | return m, nil 27 | } 28 | 29 | func (p *Public) GetTrades(param *TradesParam) (*TradesResponse, error) { 30 | u, err := query.Values(param) 31 | if err != nil { 32 | return nil, errors.New("error when changed struct to query") 33 | } 34 | 35 | res, err := p.get(fmt.Sprintf("trades/%s", param.MarketID), u) 36 | if err != nil { 37 | return nil, err 38 | } 39 | t := &TradesResponse{} 40 | if err := json.Unmarshal(res, t); err != nil { 41 | return nil, err 42 | } 43 | 44 | return t, nil 45 | } 46 | 47 | // GetCandles response head of the array is currently 48 | func (p *Public) GetCandles(param *CandlesParam) (*CandlesResponse, error) { 49 | u, err := query.Values(param) 50 | if err != nil { 51 | return nil, errors.New("error when changed struct to query") 52 | } 53 | 54 | res, err := p.get(fmt.Sprintf("candles/%s", param.Market), u) 55 | if err != nil { 56 | return nil, err 57 | } 58 | t := &CandlesResponse{} 59 | if err := json.Unmarshal(res, t); err != nil { 60 | return nil, err 61 | } 62 | 63 | return t, nil 64 | } 65 | 66 | func (p *Public) GetHistoricalFunding(param *HistoricalFundingsParam) (*HistoricalFundingsResponse, error) { 67 | u, err := query.Values(param) 68 | if err != nil { 69 | return nil, errors.New("error when changed struct to query") 70 | } 71 | 72 | res, err := p.get(fmt.Sprintf("historical-funding/%s", param.Market), u) 73 | if err != nil { 74 | return nil, err 75 | } 76 | t := &HistoricalFundingsResponse{} 77 | if err := json.Unmarshal(res, t); err != nil { 78 | return nil, err 79 | } 80 | 81 | return t, nil 82 | } 83 | -------------------------------------------------------------------------------- /public/common.go: -------------------------------------------------------------------------------- 1 | package public 2 | 3 | import ( 4 | "bytes" 5 | "encoding/json" 6 | "fmt" 7 | "github.com/go-numb/go-dydx/helpers" 8 | "io/ioutil" 9 | "net/http" 10 | "net/url" 11 | "strings" 12 | ) 13 | 14 | func (p *Public) get(endpoint string, params url.Values) ([]byte, error) { 15 | return p.request(http.MethodGet, helpers.GenerateQueryPath(endpoint, params), "") 16 | } 17 | 18 | func (p *Public) post(endpoint string, data interface{}) ([]byte, error) { 19 | d, err := json.Marshal(data) 20 | if err != nil { 21 | return nil, err 22 | } 23 | return p.request(http.MethodPost, endpoint, string(d)) 24 | } 25 | 26 | func (p *Public) delete(endpoint string, params url.Values) ([]byte, error) { 27 | return p.request(http.MethodGet, helpers.GenerateQueryPath(endpoint, params), "") 28 | } 29 | 30 | func (p *Public) request(method, endpoint string, data string) ([]byte, error) { 31 | requestPath := fmt.Sprintf("/v3/%s", endpoint) 32 | headers := map[string]string{} 33 | res, err := p.execute(method, requestPath, headers, data) 34 | if err != nil { 35 | return nil, err 36 | } 37 | defer res.Body.Close() 38 | 39 | // Rate Limit 40 | p.RateLimit.Remaining = res.Header.Get("RateLimit-Remaining") 41 | p.RateLimit.Reset = res.Header.Get("RateLimit-Reset") 42 | p.RateLimit.RetryAfter = res.Header.Get("Retry-After") 43 | p.RateLimit.Limit = res.Header.Get("RateLimit-Limit") 44 | 45 | if res.StatusCode < 200 || res.StatusCode > 300 { 46 | buf := new(bytes.Buffer) 47 | buf.ReadFrom(res.Body) 48 | p.Logger.Printf("uri: %s, code: %d, err msg: %s", requestPath, res.StatusCode, buf.String()) 49 | return nil, fmt.Errorf("uri:%v , status cod e: %d", requestPath, res.StatusCode) 50 | } 51 | b, err := ioutil.ReadAll(res.Body) 52 | p.Logger.Printf("uri: %s,response body:%s", requestPath, b) 53 | return b, err 54 | } 55 | 56 | func (p *Public) execute(method string, requestPath string, headers map[string]string, data string) (*http.Response, error) { 57 | requestPath = fmt.Sprintf("%s%s", p.Host, requestPath) 58 | req, err := http.NewRequest(method, requestPath, strings.NewReader(data)) 59 | if err != nil { 60 | return nil, err 61 | } 62 | 63 | for key, val := range headers { 64 | req.Header.Add(key, val) 65 | } 66 | req.Header.Add("Content-Type", "application/json") 67 | req.Header.Add("User-Agent", "go-dydx") 68 | 69 | return p.HttpClient.Do(req) 70 | } 71 | -------------------------------------------------------------------------------- /onboard/onboarding.go: -------------------------------------------------------------------------------- 1 | package onboard 2 | 3 | import ( 4 | "encoding/base64" 5 | "encoding/hex" 6 | "fmt" 7 | "log" 8 | "math/big" 9 | "strings" 10 | 11 | "github.com/ethereum/go-ethereum/common/hexutil" 12 | ethmath "github.com/ethereum/go-ethereum/common/math" 13 | solsha3 "github.com/miguelmota/go-solidity-sha3" 14 | 15 | "github.com/go-numb/go-dydx/helpers" 16 | "github.com/go-numb/go-dydx/types" 17 | ) 18 | 19 | type OnBoarding struct { 20 | Host string 21 | EthSigner helpers.EthSigner 22 | NetworkId int 23 | EthAddress string 24 | StarkPublicKey string 25 | StarkPublicKeyYCoordinate string 26 | Singer *helpers.SignOnboardingAction 27 | Logger *log.Logger 28 | } 29 | 30 | type ApiKeyCredentials struct { 31 | Key string 32 | Secret string 33 | Passphrase string 34 | } 35 | 36 | func (board *OnBoarding) RecoverDefaultApiCredentials(ethereumAddress string) *types.ApiKeyCredentials { 37 | signature := board.Singer.Sign(ethereumAddress, map[string]interface{}{"action": types.OffChainOnboardingAction}) 38 | rHex := signature[2:66] 39 | rInt, _ := ethmath.MaxBig256.SetString(rHex, 16) 40 | 41 | hashedRBytes := solsha3.SoliditySHA3([]string{"uint256"}, rInt.String()) 42 | secretBytes := hashedRBytes[:30] 43 | sHex := signature[66:130] 44 | sInt, _ := ethmath.MaxBig256.SetString(sHex, 16) 45 | 46 | hashedSBytes := solsha3.SoliditySHA3([]string{"uint256"}, sInt.String()) 47 | keyBytes := hashedSBytes[:16] 48 | passphraseBytes := hashedSBytes[16:31] 49 | 50 | keyHex := hex.EncodeToString(keyBytes) 51 | keyUuid := strings.Join([]string{ 52 | keyHex[:8], 53 | keyHex[8:12], 54 | keyHex[12:16], 55 | keyHex[16:20], 56 | keyHex[20:], 57 | }, "-") 58 | return &types.ApiKeyCredentials{ 59 | Secret: base64.URLEncoding.EncodeToString(secretBytes), 60 | Key: keyUuid, 61 | Passphrase: base64.URLEncoding.EncodeToString(passphraseBytes), 62 | } 63 | } 64 | 65 | func (board *OnBoarding) DeriveStarkKey(ethereumAddress string) string { 66 | signature := board.Singer.Sign(ethereumAddress, map[string]interface{}{"action": types.OffChainKeyDerivationAction}) 67 | sig, _ := new(big.Int).SetString(signature, 0) 68 | 69 | sha3 := solsha3.SoliditySHA3([]string{"uint256"}, sig.String()) 70 | hashedSignature := hexutil.Encode(sha3) 71 | 72 | privateKey, _ := new(big.Int).SetString(hashedSignature, 0) 73 | privateKey = new(big.Int).Rsh(privateKey, 5) 74 | return fmt.Sprintf("0x%s", privateKey.Text(16)) 75 | } 76 | 77 | func (board *OnBoarding) sign(signerAddress, action string) string { 78 | return board.Singer.Sign(signerAddress, map[string]interface{}{"action": action}) 79 | } 80 | -------------------------------------------------------------------------------- /types/commons.go: -------------------------------------------------------------------------------- 1 | package types 2 | 3 | import ( 4 | "log" 5 | "net/http" 6 | "strconv" 7 | 8 | "github.com/umbracle/ethgo/jsonrpc" 9 | ) 10 | 11 | const ( 12 | ApiHostMainnet = "https://api.dydx.exchange" 13 | ApiHostRopsten = "https://api.stage.dydx.exchange" 14 | WsHostMainnet = "wss://api.dydx.exchange/v3/ws" 15 | WsHostRopsten = "wss://api.stage.dydx.exchange/v3/ws" 16 | ) 17 | 18 | const ( 19 | SignatureTypeNoPrepend = 0 20 | SignatureTypeDecimal = 1 21 | SignatureTypeHexadecimal = 2 22 | ) 23 | 24 | const ( 25 | Domain = "dYdX" 26 | Version = "1.0" 27 | Eip712DomainStringNoContract = "EIP712Domain(string name,string version,uint256 chainId)" 28 | ) 29 | 30 | const ( 31 | OffChainOnboardingAction = "dYdX Onboarding" 32 | OffChainKeyDerivationAction = "dYdX STARK Key" 33 | ) 34 | 35 | const ( 36 | NetworkIdMainnet = 1 37 | NetworkIdRopsten = 3 38 | ) 39 | 40 | const ( 41 | OPEN = "OPEN" 42 | CLOSED = "CLOSED" 43 | LIQUIDATED = "LIQUIDATED" 44 | LIQUIDATION = "LIQUIDATION" 45 | UNTRIGGERED = "UNTRIGGERED" 46 | ) 47 | 48 | const ( 49 | MARKET = "MARKET" 50 | LIMIT = "LIMIT" 51 | STOP = "STOP" 52 | STOPLIMIT = "STOP_LIMIT" 53 | TRAILINGSTOP = "TRAILING_STOP" 54 | TAKEPROFIT = "TAKE_PROFIT" 55 | ) 56 | 57 | const ( 58 | BUY = "BUY" 59 | SELL = "SELL" 60 | ) 61 | 62 | const ( 63 | LONG = "LONG" 64 | SHORT = "SHORT" 65 | ) 66 | 67 | const ( 68 | TimeInForceGtt = "GTT" 69 | TimeInForceFok = "FOK" 70 | TimeInForceIoc = "IOC" 71 | ) 72 | 73 | const ( 74 | OrderStatusPending = "PENDING" 75 | OrderStatusOpen = "OPEN" 76 | OrderStatusFilled = "FILLED" 77 | OrderStatusCanceled = "CANCELED" 78 | OrderStatusUntriggered = "UNTRIGGERED" 79 | ) 80 | 81 | const ( 82 | Resolution1D = "1DAY" 83 | Resolution4HOURS = "4HOURS" 84 | Resolution1HOUR = "1HOUR" 85 | Resolution30MINS = "30MINS" 86 | Resolution15MINS = "15MINS" 87 | Resolution5MINS = "5MINS" 88 | Resolution1MIN = "1MIN" 89 | ) 90 | 91 | type Options struct { 92 | NetworkId int 93 | Host string 94 | DefaultEthereumAddress string 95 | 96 | StarkPublicKey string 97 | StarkPrivateKey string 98 | StarkPublicKeyYCoordinate string 99 | ApiKeyCredentials *ApiKeyCredentials 100 | 101 | Web3 *jsonrpc.Client 102 | HttpClient *http.Client 103 | Logger *log.Logger 104 | } 105 | 106 | type ApiKeyCredentials struct { 107 | Key string 108 | Secret string 109 | Passphrase string 110 | } 111 | 112 | type RateLimit struct { 113 | Remaining string 114 | Reset string 115 | RetryAfter string 116 | Limit string 117 | } 118 | 119 | func (p *RateLimit) ToNumber() (remaining, reset, retryAfter, limit int64) { 120 | remaining, _ = strconv.ParseInt(p.Remaining, 10, 64) 121 | reset, _ = strconv.ParseInt(p.Reset, 10, 64) 122 | retryAfter, _ = strconv.ParseInt(p.RetryAfter, 10, 64) 123 | limit, _ = strconv.ParseInt(p.Limit, 10, 64) 124 | return 125 | } -------------------------------------------------------------------------------- /private/common.go: -------------------------------------------------------------------------------- 1 | package private 2 | 3 | import ( 4 | "bytes" 5 | "crypto/hmac" 6 | "crypto/sha256" 7 | "encoding/base64" 8 | "encoding/json" 9 | "fmt" 10 | "io/ioutil" 11 | "net/http" 12 | "net/url" 13 | "strings" 14 | "time" 15 | 16 | "github.com/go-numb/go-dydx/helpers" 17 | ) 18 | 19 | func (p *Private) get(endpoint string, params url.Values) ([]byte, error) { 20 | return p.request(http.MethodGet, helpers.GenerateQueryPath(endpoint, params), "") 21 | } 22 | 23 | func (p *Private) post(endpoint string, data interface{}) ([]byte, error) { 24 | b, err := json.Marshal(data) 25 | if err != nil { 26 | return nil, err 27 | } 28 | 29 | return p.request(http.MethodPost, endpoint, string(b)) 30 | } 31 | 32 | func (p *Private) delete(endpoint string, params url.Values) ([]byte, error) { 33 | return p.request(http.MethodDelete, helpers.GenerateQueryPath(endpoint, params), "") 34 | } 35 | 36 | func (p *Private) request(method, endpoint string, data string) ([]byte, error) { 37 | isoTimestamp := generateNowISO() 38 | requestPath := fmt.Sprintf("/v3/%s", endpoint) 39 | headers := map[string]string{ 40 | "DYDX-SIGNATURE": p.Sign(requestPath, method, isoTimestamp, data), 41 | "DYDX-API-KEY": p.ApiKeyCredentials.Key, 42 | "DYDX-TIMESTAMP": isoTimestamp, 43 | "DYDX-PASSPHRASE": p.ApiKeyCredentials.Passphrase, 44 | } 45 | res, err := p.execute(method, requestPath, headers, data) 46 | if err != nil { 47 | return nil, err 48 | } 49 | defer res.Body.Close() 50 | 51 | // Rate Limit 52 | p.RateLimit.Remaining = res.Header.Get("RateLimit-Remaining") 53 | p.RateLimit.Reset = res.Header.Get("RateLimit-Reset") 54 | p.RateLimit.RetryAfter = res.Header.Get("Retry-After") 55 | p.RateLimit.Limit = res.Header.Get("RateLimit-Limit") 56 | 57 | if res.StatusCode < 200 || res.StatusCode > 300 { 58 | buf := new(bytes.Buffer) 59 | buf.ReadFrom(res.Body) 60 | p.Logger.Printf("uri: %s, code: %d, err msg: %s", requestPath, res.StatusCode, buf.String()) 61 | return nil, fmt.Errorf("uri: %v , status code: %d", requestPath, res.StatusCode) 62 | } 63 | 64 | b, err := ioutil.ReadAll(res.Body) 65 | p.Logger.Printf("uri: %s, response body: %s", requestPath, b) 66 | return b, err 67 | } 68 | 69 | func (p *Private) execute(method string, requestPath string, headers map[string]string, data string) (*http.Response, error) { 70 | requestPath = fmt.Sprintf("%s%s", p.Host, requestPath) 71 | req, err := http.NewRequest(method, requestPath, strings.NewReader(data)) 72 | if err != nil { 73 | return nil, err 74 | } 75 | 76 | for key, val := range headers { 77 | req.Header.Add(key, val) 78 | } 79 | req.Header.Add("Content-Type", "application/json") 80 | req.Header.Add("User-Agent", "go-dydx") 81 | 82 | return p.HttpClient.Do(req) 83 | 84 | } 85 | 86 | func generateNowISO() string { 87 | return time.Now().UTC().Format("2006-01-02T15:04:05.999Z") 88 | } 89 | 90 | func (p *Private) Sign(requestPath, method, isoTimestamp, body string) string { 91 | message := fmt.Sprintf("%s%s%s%s", isoTimestamp, method, requestPath, body) 92 | secret, _ := base64.URLEncoding.DecodeString(p.ApiKeyCredentials.Secret) 93 | h := hmac.New(sha256.New, secret) 94 | h.Write([]byte(message)) 95 | return base64.URLEncoding.EncodeToString(h.Sum(nil)) 96 | } 97 | -------------------------------------------------------------------------------- /client_private_test.go: -------------------------------------------------------------------------------- 1 | package dydx_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "log" 7 | "testing" 8 | "time" 9 | 10 | dydx "github.com/go-numb/go-dydx" 11 | "github.com/go-numb/go-dydx/helpers" 12 | "github.com/go-numb/go-dydx/private" 13 | "github.com/go-numb/go-dydx/realtime" 14 | "github.com/go-numb/go-dydx/types" 15 | "github.com/stretchr/testify/assert" 16 | ) 17 | 18 | const ( 19 | DefaultHost = "http://localhost:8080" 20 | EthereumAddress = "" 21 | StarkKey = "" 22 | ) 23 | 24 | var userID int64 = 1 25 | 26 | var options = types.Options{ 27 | Host: types.ApiHostMainnet, 28 | StarkPublicKey: "", 29 | StarkPrivateKey: "", 30 | StarkPublicKeyYCoordinate: "", 31 | DefaultEthereumAddress: EthereumAddress, 32 | ApiKeyCredentials: &types.ApiKeyCredentials{ 33 | Key: "", 34 | Secret: "", 35 | Passphrase: "", 36 | }, 37 | } 38 | 39 | func TestConnect(t *testing.T) { 40 | client := dydx.New(options) 41 | 42 | account, err := client.Private.GetAccount(client.Private.DefaultAddress) 43 | assert.NoError(t, err) 44 | 45 | fmt.Println(account) 46 | 47 | parent := context.Background() 48 | ctx, cancel := context.WithCancel(parent) 49 | 50 | r := make(chan realtime.Response) 51 | 52 | go realtime.Connect(ctx, r, []string{realtime.ACCOUNT, realtime.TRADES}, []string{"BTC-USD"}, client.Private, nil) 53 | 54 | for { 55 | select { 56 | case v := <-r: 57 | switch v.Channel { 58 | case realtime.ACCOUNT: 59 | fmt.Println(v.Account) 60 | case realtime.TRADES: 61 | fmt.Println(v.Trades) 62 | case realtime.ERROR: 63 | log.Println(v.Results) 64 | goto EXIT 65 | } 66 | 67 | } 68 | } 69 | 70 | EXIT: 71 | cancel() 72 | } 73 | 74 | func TestUsers(t *testing.T) { 75 | client := dydx.New(options) 76 | res, err := client.Private.GetUsers() 77 | assert.NoError(t, err) 78 | 79 | fmt.Printf("%v", res) 80 | 81 | fmt.Printf("makerFee: %s, takeFee: %s\n", res.User.MakerFeeRate, res.User.TakerFeeRate) 82 | } 83 | 84 | func TestCreateOrder(t *testing.T) { 85 | client := dydx.New(options) 86 | o := &private.ApiOrder{ 87 | ApiBaseOrder: private.ApiBaseOrder{Expiration: helpers.ExpireAfter(5 * time.Minute)}, 88 | Market: "ETH-USD", 89 | Side: "BUY", 90 | Type: "LIMIT", 91 | Size: "1", 92 | Price: "2500", 93 | ClientId: helpers.RandomClientId(), 94 | TimeInForce: "GTT", 95 | PostOnly: true, 96 | LimitFee: "0.01", 97 | } 98 | fmt.Printf("%+v\n", client.Private.NetworkId) 99 | res, err := client.Private.CreateOrder(o, userID) 100 | assert.NoError(t, err) 101 | 102 | fmt.Printf("%v", res) 103 | } 104 | 105 | // important!! WithDraw has not done any actual testing 106 | func TestWithdrawFast(t *testing.T) { 107 | client := dydx.New(options) 108 | res, err := client.Private.WithdrawFast(&private.WithdrawalParam{}) 109 | assert.NoError(t, err) 110 | 111 | fmt.Printf("%v", res) 112 | } 113 | 114 | func TestGetHistoricalPnL(t *testing.T) { 115 | client := dydx.New(options) 116 | res, err := client.Private.GetHistoricalPnL(&private.HistoricalPnLParam{}) 117 | assert.NoError(t, err) 118 | 119 | fmt.Printf("%v", res) 120 | } 121 | 122 | func TestGetTradingRewards(t *testing.T) { 123 | client := dydx.New(options) 124 | res, err := client.Private.GetTradingRewards(&private.TradingRewardsParam{ 125 | Epoch: 8, 126 | }) 127 | assert.NoError(t, err) 128 | 129 | fmt.Printf("%v", res) 130 | } 131 | -------------------------------------------------------------------------------- /client.go: -------------------------------------------------------------------------------- 1 | package dydx 2 | 3 | import ( 4 | "log" 5 | "net/http" 6 | "net/url" 7 | "os" 8 | "strings" 9 | "time" 10 | 11 | "github.com/go-numb/go-dydx/helpers" 12 | "github.com/go-numb/go-dydx/onboard" 13 | "github.com/go-numb/go-dydx/private" 14 | "github.com/go-numb/go-dydx/public" 15 | "github.com/go-numb/go-dydx/types" 16 | "github.com/umbracle/ethgo/jsonrpc" 17 | ) 18 | 19 | type Client struct { 20 | options types.Options 21 | 22 | Host string 23 | StarkPublicKey string 24 | StarkPrivateKey string 25 | StarkPublicKeyYCoordinate string 26 | ApiKeyCredentials *types.ApiKeyCredentials 27 | ApiTimeout time.Duration 28 | 29 | DefaultAddress string 30 | NetworkId int 31 | Web3 *jsonrpc.Client 32 | EthSigner helpers.EthSigner 33 | 34 | Private *private.Private 35 | Public *public.Public 36 | OnBoarding *onboard.OnBoarding 37 | 38 | Logger *log.Logger 39 | 40 | httpClient *http.Client 41 | } 42 | 43 | func New(options types.Options) *Client { 44 | client := &Client{ 45 | Host: strings.TrimPrefix(options.Host, "/"), 46 | ApiTimeout: 3 * time.Second, 47 | DefaultAddress: options.DefaultEthereumAddress, 48 | StarkPublicKey: options.StarkPublicKey, 49 | StarkPrivateKey: options.StarkPrivateKey, 50 | ApiKeyCredentials: options.ApiKeyCredentials, 51 | NetworkId: options.NetworkId, 52 | 53 | Logger: log.New(os.Stderr, "go-dydx ", log.LstdFlags), 54 | 55 | httpClient: &http.Client{ 56 | Timeout: time.Second * 5, 57 | }, 58 | } 59 | 60 | // Add http proxy support. 61 | if os.Getenv("HTTP_PROXY") != "" { 62 | proxy, _ := url.Parse(os.Getenv("HTTP_PROXY")) 63 | client.httpClient.Transport = &http.Transport{ 64 | Proxy: http.ProxyURL(proxy), 65 | } 66 | } 67 | 68 | if options.Web3 != nil { 69 | networkId := options.NetworkId 70 | if networkId == 0 { 71 | net, _ := options.Web3.Net().Version() 72 | networkId = int(net) 73 | } 74 | 75 | client.Web3 = options.Web3 76 | client.EthSigner = &helpers.EthWeb3Signer{Web3: options.Web3} 77 | client.NetworkId = networkId 78 | } 79 | 80 | if client.NetworkId == 0 { 81 | client.NetworkId = types.NetworkIdMainnet 82 | } 83 | 84 | if options.StarkPrivateKey != "" { 85 | client.StarkPrivateKey = options.StarkPrivateKey 86 | client.EthSigner = &helpers.EthKeySinger{PrivateKey: options.StarkPrivateKey} 87 | } 88 | 89 | if options.HttpClient != nil { 90 | client.httpClient = options.HttpClient 91 | } 92 | 93 | if options.Logger != nil { 94 | client.Logger = options.Logger 95 | } 96 | 97 | client.OnBoarding = &onboard.OnBoarding{ 98 | Host: client.Host, 99 | EthSigner: client.EthSigner, 100 | NetworkId: client.NetworkId, 101 | EthAddress: client.DefaultAddress, 102 | Singer: helpers.NewSigner(client.EthSigner, client.NetworkId), 103 | Logger: client.Logger, 104 | } 105 | if options.ApiKeyCredentials == nil { 106 | client.ApiKeyCredentials = client.OnBoarding.RecoverDefaultApiCredentials(client.DefaultAddress) 107 | } 108 | 109 | client.Private = &private.Private{ 110 | Host: client.Host, 111 | NetworkId: client.NetworkId, 112 | StarkPrivateKey: client.StarkPrivateKey, 113 | DefaultAddress: client.DefaultAddress, 114 | ApiKeyCredentials: client.ApiKeyCredentials, 115 | 116 | RateLimit: new(types.RateLimit), 117 | Logger: client.Logger, 118 | HttpClient: client.httpClient, 119 | } 120 | client.Public = &public.Public{ 121 | Host: client.Host, 122 | NetworkId: client.NetworkId, 123 | 124 | RateLimit: new(types.RateLimit), 125 | Logger: client.Logger, 126 | HttpClient: client.httpClient, 127 | } 128 | 129 | return client 130 | } 131 | -------------------------------------------------------------------------------- /public/types.go: -------------------------------------------------------------------------------- 1 | package public 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | "net/http" 7 | "time" 8 | 9 | "github.com/go-numb/go-dydx/types" 10 | ) 11 | 12 | type Public struct { 13 | Host string 14 | NetworkId int 15 | 16 | RateLimit *types.RateLimit 17 | Logger *log.Logger 18 | HttpClient *http.Client 19 | } 20 | 21 | type MarketsResponse struct { 22 | Markets map[string]Market `json:"markets"` 23 | } 24 | 25 | type Market struct { 26 | Market string `json:"market"` 27 | BaseAsset string `json:"baseAsset"` 28 | QuoteAsset string `json:"quoteAsset"` 29 | StepSize string `json:"stepSize"` 30 | TickSize string `json:"tickSize"` 31 | IndexPrice string `json:"indexPrice"` 32 | OraclePrice string `json:"oraclePrice"` 33 | PriceChange24H string `json:"priceChange24H"` 34 | NextFundingRate string `json:"nextFundingRate"` 35 | MinOrderSize string `json:"minOrderSize"` 36 | Type string `json:"type"` 37 | InitialMarginFraction string `json:"initialMarginFraction"` 38 | MaintenanceMarginFraction string `json:"maintenanceMarginFraction"` 39 | BaselinePositionSize string `json:"baselinePositionSize"` 40 | IncrementalPositionSize string `json:"incrementalPositionSize"` 41 | IncrementalInitialMarginFraction string `json:"incrementalInitialMarginFraction"` 42 | Volume24H string `json:"volume24H"` 43 | Trades24H string `json:"trades24H"` 44 | OpenInterest string `json:"openInterest"` 45 | MaxPositionSize string `json:"maxPositionSize"` 46 | AssetResolution string `json:"assetResolution"` 47 | SyntheticAssetID string `json:"syntheticAssetId"` 48 | Status string `json:"status"` 49 | NextFundingAt time.Time `json:"nextFundingAt"` 50 | } 51 | 52 | type TradesResponse struct { 53 | Trades []Trade `json:"trades"` 54 | } 55 | 56 | type Trade struct { 57 | Side string `json:"side"` 58 | Size string `json:"size"` 59 | Price string `json:"price"` 60 | CreatedAt time.Time `json:"createdAt"` 61 | } 62 | 63 | type TradesParam struct { 64 | MarketID string `url:"-"` 65 | Limit int `url:"limit,omitempty"` 66 | StartingBeforeOrAt string `url:"startingBeforeOrAt,omitempty"` 67 | } 68 | 69 | type OrderbookResponse struct { 70 | Offset string `json:"offset"` 71 | Bids []Book `json:"bids"` 72 | Asks []Book `json:"asks"` 73 | } 74 | 75 | type Book struct { 76 | Price string 77 | Size string 78 | Offset string 79 | } 80 | 81 | func (p *Book) UnmarshalJSON(data []byte) error { 82 | var s []string 83 | if err := json.Unmarshal(data, &s); err != nil { 84 | return err 85 | } 86 | 87 | l := len(s) 88 | switch l { 89 | case 2: 90 | p.Price = s[0] 91 | p.Size = s[1] 92 | case 3: 93 | p.Price = s[0] 94 | p.Size = s[1] 95 | p.Offset = s[2] 96 | } 97 | 98 | return nil 99 | } 100 | 101 | type CandlesResponse struct { 102 | Candles []Candle `json:"candles"` 103 | } 104 | 105 | type Candle struct { 106 | Market string `json:"market"` 107 | Resolution string `json:"resolution"` 108 | Low string `json:"low"` 109 | High string `json:"high"` 110 | Open string `json:"open"` 111 | Close string `json:"close"` 112 | BaseTokenVolume string `json:"baseTokenVolume"` 113 | Trades string `json:"trades"` 114 | UsdVolume string `json:"usdVolume"` 115 | StartingOpenInterest string `json:"startingOpenInterest"` 116 | StartedAt time.Time `json:"startedAt"` 117 | UpdatedAt time.Time `json:"updatedAt"` 118 | } 119 | 120 | type CandlesParam struct { 121 | Market string `url:"-"` 122 | Resolution string `url:"resolution,omitempty"` 123 | FromISO string `url:"fromISO,omitempty"` 124 | ToISO string `url:"toISO,omitempty"` 125 | // Max:100 126 | Limit int `url:"limit,omitempty"` 127 | } 128 | 129 | type HistoricalFundingsResponse struct { 130 | HistoricalFundings []HistoricalFunding `json:"historicalFunding"` 131 | } 132 | 133 | type HistoricalFunding struct { 134 | Market string `json:"-"` 135 | Rate string `json:"rate"` 136 | Price string `json:"price"` 137 | EffectiveAt time.Time `json:"effectiveAt"` 138 | } 139 | 140 | type HistoricalFundingsParam struct { 141 | Market string `url:"-"` 142 | EffectiveBeforeOrAt string `url:"effectiveBeforeOrAt,omitempty"` 143 | } 144 | -------------------------------------------------------------------------------- /helpers/calc.go: -------------------------------------------------------------------------------- 1 | package helpers 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/ethereum/go-ethereum/common/hexutil" 7 | solsha3 "github.com/miguelmota/go-solidity-sha3" 8 | "github.com/umbracle/ethgo/jsonrpc" 9 | 10 | "github.com/go-numb/go-dydx/types" 11 | ) 12 | 13 | var ( 14 | Eip712OnboardingActionStruct = []map[string]string{ 15 | {"type": "string", "name": "action"}, 16 | {"type": "string", "name": "onlySignOn"}, 17 | } 18 | Eip712OnboardingActionStructString = "dYdX(string action,string onlySignOn)" 19 | 20 | Eip712OnboardingActionStructTestnet = []map[string]string{ 21 | {"type": "string", "name": "action"}, 22 | } 23 | Eip712OnboardingActionStructStringTestnet = "dYdX(string action)" 24 | Eip712StructName = "dYdX" 25 | OnlySignOnDomainMainnet = "https://trade.dydx.exchange" 26 | ) 27 | 28 | type SignOnboardingAction struct { 29 | Signer EthSigner 30 | NetworkId int 31 | } 32 | 33 | func NewSigner(signer EthSigner, networkId int) *SignOnboardingAction { 34 | return &SignOnboardingAction{signer, networkId} 35 | } 36 | 37 | func (a *SignOnboardingAction) Sign(signerAddress string, message map[string]interface{}) string { 38 | eip712Message := a.GetEIP712Message(message) 39 | action := message["action"].(string) 40 | messageHash := a.GetHash(action) 41 | typedSignature := a.Signer.sign(eip712Message, messageHash, signerAddress) 42 | return typedSignature 43 | } 44 | 45 | func (a *SignOnboardingAction) GetEIP712Message(message map[string]interface{}) map[string]interface{} { 46 | structName := a.GetEIP712StructName() 47 | eip712Message := map[string]interface{}{ 48 | "types": map[string]interface{}{ 49 | "EIP712Domain": []map[string]string{ 50 | { 51 | "name": "name", 52 | "type": "string", 53 | }, 54 | { 55 | "name": "version", 56 | "type": "string", 57 | }, 58 | { 59 | "name": "chainId", 60 | "type": "uint256", 61 | }, 62 | }, 63 | structName: a.GetEIP712Struct(), 64 | }, 65 | "domain": map[string]interface{}{ 66 | "name": types.Domain, 67 | "version": types.Version, 68 | "chainId": a.NetworkId, 69 | }, 70 | "primaryType": structName, 71 | "message": message, 72 | } 73 | if a.NetworkId == types.NetworkIdMainnet { 74 | msg := eip712Message["message"].(map[string]interface{}) 75 | msg["onlySignOn"] = OnlySignOnDomainMainnet 76 | } 77 | 78 | return eip712Message 79 | } 80 | 81 | func (a *SignOnboardingAction) GetEip712Hash(structHash string) string { 82 | fact := solsha3.SoliditySHA3( 83 | []string{"bytes2", "bytes32", "bytes32"}, 84 | []interface{}{"0x1901", a.GetDomainHash(), structHash}, 85 | ) 86 | return fmt.Sprintf("0x%x", fact) 87 | } 88 | 89 | func (a *SignOnboardingAction) GetDomainHash() string { 90 | fact := solsha3.SoliditySHA3( 91 | []string{"bytes32", "bytes32", "bytes32", "uint256"}, 92 | []interface{}{HashString(types.Eip712DomainStringNoContract), HashString(types.Domain), HashString(types.Version), a.NetworkId}, 93 | ) 94 | return fmt.Sprintf("0x%x", fact) 95 | } 96 | 97 | func (a *SignOnboardingAction) GetEIP712Struct() []map[string]string { 98 | if a.NetworkId == types.NetworkIdMainnet { 99 | return Eip712OnboardingActionStruct 100 | } else { 101 | return Eip712OnboardingActionStructTestnet 102 | } 103 | } 104 | 105 | func (a *SignOnboardingAction) GetEIP712StructName() string { 106 | return Eip712StructName 107 | } 108 | 109 | func (a *SignOnboardingAction) GetHash(action string) string { 110 | var eip712StructStr string 111 | if a.NetworkId == types.NetworkIdMainnet { 112 | eip712StructStr = Eip712OnboardingActionStructString 113 | } else { 114 | eip712StructStr = Eip712OnboardingActionStructStringTestnet 115 | } 116 | data := [][]string{ 117 | {"bytes32", "bytes32"}, 118 | {HashString(eip712StructStr), HashString(action)}, 119 | } 120 | if a.NetworkId == types.NetworkIdMainnet { 121 | data[0] = append(data[0], "bytes32") 122 | data[1] = append(data[1], HashString(OnlySignOnDomainMainnet)) 123 | } 124 | structHash := solsha3.SoliditySHA3(data[0], data[1]) 125 | return a.GetEip712Hash(hexutil.Encode(structHash)) 126 | } 127 | 128 | type EthSigner interface { 129 | sign(eip712Message map[string]interface{}, messageHash, optSingerAddress string) string 130 | } 131 | 132 | type EthWeb3Signer struct { 133 | Web3 *jsonrpc.Client 134 | } 135 | 136 | func (web3Singer *EthWeb3Signer) sign(eip712Message map[string]interface{}, messageHash, address string) string { 137 | rawSignature := signTypedData(eip712Message, web3Singer, address) 138 | return CreateTypedSignature(rawSignature, types.SignatureTypeNoPrepend) 139 | } 140 | 141 | func signTypedData(eip712Message map[string]interface{}, web3Singer *EthWeb3Signer, address string) string { 142 | var out string 143 | if err := web3Singer.Web3.Call("eth_signTypedData", &out, address, eip712Message); err != nil { 144 | panic(err) 145 | } 146 | return out 147 | } 148 | 149 | type EthKeySinger struct { 150 | Address string 151 | PrivateKey string 152 | } 153 | 154 | func (keySinger EthKeySinger) sign(eip712Message map[string]interface{}, messageHash, optSingerAddress string) string { 155 | panic("implement me") 156 | } 157 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # go-dydx 2 | ![dYdX exhange DEX](https://github.com/go-numb/go-dydx/blob/master/types/icon.png) 3 | 4 | dYdX exchange API version3. 5 | 6 | part OnBoarding referred to [verichenn/dydx-v3-go](https://github.com/verichenn/dydx-v3-go). 7 | 8 | ## Description 9 | 10 | go-dydx is a go client library for dYdX, [dYdX API Document](https://docs.dydx.exchange). 11 | 12 | ## Support 13 | - [x] private/websocket, public/websocket 14 | - [x] private/users 15 | - [x] private/accounts 16 | - [x] private/positions 17 | - [x] private/orders (get, post, delete) 18 | - [x] private/fast-withdrawals 19 | - [x] private/fills 20 | - [x] private/funding 21 | - [x] private/historical-pnl 22 | - [x] public/markets 23 | - [x] public/orderbook 24 | - [x] public/trades 25 | - [x] public/candles 26 | - [x] public/historical-funding 27 | 28 | ## Usage 29 | ### Rest 30 | ```go 31 | package main 32 | 33 | import ( 34 | "fmt" 35 | "time" 36 | 37 | "github.com/labstack/gommon/log" 38 | 39 | "github.com/go-numb/go-dydx" 40 | "github.com/go-numb/go-dydx/helpers" 41 | "github.com/go-numb/go-dydx/private" 42 | "github.com/go-numb/go-dydx/types" 43 | ) 44 | 45 | const ( 46 | EthereumAddress = "0xtest" 47 | ) 48 | 49 | var userID int64 = 11111 50 | var options = types.Options{ 51 | Host: types.ApiHostMainnet, 52 | StarkPublicKey: " application starkkey>", 53 | StarkPrivateKey: " application starkkey>", 54 | StarkPublicKeyYCoordinate: " application starkkey>", 55 | DefaultEthereumAddress: EthereumAddress, 56 | ApiKeyCredentials: &types.ApiKeyCredentials{ 57 | Key: " application apikey>", 58 | Secret: " application secret>", 59 | Passphrase: " application passphrase>", 60 | }, 61 | } 62 | 63 | func main() { 64 | start := time.Now() 65 | defer func() { 66 | fmt.Println("exec time: ", time.Since(start)) 67 | }() 68 | 69 | client := dydx.New(options) 70 | account, err := client.Private.GetAccount(EthereumAddress) 71 | if err != nil { 72 | log.Fatal(err) 73 | } 74 | fmt.Println(account) 75 | 76 | // print rate limit numbers 77 | fmt.Println(client.Public.RateLimit.ToNumber()) 78 | 79 | 80 | params := &private.ApiOrder{ 81 | ApiBaseOrder: private.ApiBaseOrder{Expiration: helpers.ExpireAfter(5 * time.Minute)}, 82 | Market: "ETH-USD", 83 | Side: "BUY", 84 | Type: "LIMIT", 85 | Size: "1", 86 | Price: "2000", 87 | ClientId: helpers.RandomClientId(), 88 | TimeInForce: "GTT", 89 | PostOnly: true, 90 | LimitFee: "0.01", 91 | } 92 | res, err := client.Private.CreateOrder(params, userID) 93 | if err != nil { 94 | log.Fatal(err) 95 | } 96 | fmt.Println(res) 97 | 98 | // rate limit updated above 99 | // print rate limit numbers 100 | fmt.Println(client.Private.RateLimit.ToNumber()) 101 | } 102 | 103 | ``` 104 | 105 | ### Websocket 106 | ```go 107 | 108 | package main 109 | 110 | import ( 111 | "context" 112 | "fmt" 113 | "time" 114 | "log" 115 | 116 | "github.com/go-numb/go-dydx" 117 | "github.com/go-numb/go-dydx/public" 118 | "github.com/go-numb/go-dydx/realtime" 119 | ) 120 | 121 | 122 | var userID int64 = 11111 123 | var options = types.Options{ 124 | Host: types.ApiHostMainnet, 125 | StarkPublicKey: " application starkkey>", 126 | StarkPrivateKey: " application starkkey>", 127 | StarkPublicKeyYCoordinate: " application starkkey>", 128 | DefaultEthereumAddress: EthereumAddress, 129 | ApiKeyCredentials: &types.ApiKeyCredentials{ 130 | Key: " application apikey>", 131 | Secret: " application secret>", 132 | Passphrase: " application passphrase>", 133 | }, 134 | } 135 | func main() { 136 | client := dydx.New(options) 137 | 138 | account, err := client.Private.GetAccount(client.Private.DefaultAddress) 139 | if err != nil { 140 | log.Fatal(err) 141 | } 142 | 143 | fmt.Println(account) 144 | 145 | parent := context.Background() 146 | ctx, cancel := context.WithCancel(parent) 147 | 148 | r := make(chan realtime.Response) 149 | 150 | // with Private 151 | go realtime.Connect(ctx, r, []string{realtime.ACCOUNT}, []string{}, client.Private, nil) 152 | // or without Private 153 | go realtime.Connect(ctx, r, []string{realtime.TRADES}, []string{"BTC-USD"}, nil, nil) 154 | 155 | for { 156 | select { 157 | case v := <-r: 158 | switch v.Channel { 159 | case realtime.ACCOUNT: 160 | fmt.Println(v.Account) 161 | case realtime.TRADES: 162 | fmt.Println(v.Trades) 163 | case realtime.ERROR: 164 | log.Println(v.Results) 165 | goto EXIT 166 | case realtime.UNDEFINED: 167 | log.Println(v.Results) 168 | } 169 | 170 | } 171 | } 172 | 173 | EXIT: 174 | cancel() 175 | } 176 | ``` 177 | 178 | ## Author 179 | 180 | [@_numbP](https://twitter.com/_numbP) 181 | 182 | ## License 183 | 184 | [MIT](https://github.com/go-numb/go-dydx/blob/master/LICENSE) -------------------------------------------------------------------------------- /private/request.go: -------------------------------------------------------------------------------- 1 | package private 2 | 3 | import ( 4 | "encoding/json" 5 | "errors" 6 | "fmt" 7 | "net/url" 8 | 9 | "github.com/go-numb/go-dydx/helpers" 10 | 11 | "github.com/yanue/starkex" 12 | ) 13 | 14 | func (p *Private) GetUsers() (*UsersResponse, error) { 15 | res, err := p.get("users", nil) 16 | if err != nil { 17 | return nil, err 18 | } 19 | 20 | result := &UsersResponse{} 21 | if err := json.Unmarshal(res, result); err != nil { 22 | return nil, err 23 | } 24 | return result, nil 25 | } 26 | 27 | func (p *Private) GetAccount(ethereumAddress string) (*AccountResponse, error) { 28 | if ethereumAddress == "" { 29 | ethereumAddress = p.DefaultAddress 30 | } 31 | uri := fmt.Sprintf("accounts/%s", helpers.GetAccountId(ethereumAddress)) 32 | res, err := p.get(uri, nil) 33 | if err != nil { 34 | return nil, err 35 | } 36 | 37 | result := &AccountResponse{} 38 | if err := json.Unmarshal(res, result); err != nil { 39 | return nil, err 40 | } 41 | return result, nil 42 | } 43 | 44 | func (p *Private) CreateOrder(input *ApiOrder, positionId int64) (*OrderResponse, error) { 45 | orderSignParam := starkex.OrderSignParam{ 46 | NetworkId: p.NetworkId, 47 | PositionId: positionId, 48 | Market: input.Market, 49 | Side: input.Side, 50 | HumanSize: input.Size, 51 | HumanPrice: input.Price, 52 | LimitFee: input.LimitFee, 53 | ClientId: input.ClientId, 54 | Expiration: input.Expiration, 55 | } 56 | signature, err := starkex.OrderSign(p.StarkPrivateKey, orderSignParam) 57 | if err != nil { 58 | return nil, errors.New("sign error") 59 | } 60 | input.Signature = signature 61 | 62 | res, err := p.post("orders", input) 63 | if err != nil { 64 | return nil, err 65 | } 66 | 67 | result := &OrderResponse{} 68 | if err = json.Unmarshal(res, result); err != nil { 69 | return nil, errors.New("json parser error") 70 | } 71 | return result, nil 72 | } 73 | 74 | func (p *Private) GetPositions(market string) (*PositionResponse, error) { 75 | params := url.Values{} 76 | if market != "" { 77 | params.Add("market", market) 78 | } 79 | 80 | res, err := p.get("positions", params) 81 | if err != nil { 82 | return nil, err 83 | } 84 | 85 | result := &PositionResponse{} 86 | if err = json.Unmarshal(res, &result); err != nil { 87 | return nil, errors.New("json parser error") 88 | } 89 | return result, nil 90 | } 91 | 92 | func (p *Private) GetOrders(input *OrderQueryParam) (*OrderListResponse, error) { 93 | data, err := p.get("orders", input.ToParams()) 94 | if err != nil { 95 | return nil, err 96 | } 97 | 98 | result := &OrderListResponse{} 99 | if err := json.Unmarshal(data, &result); err != nil { 100 | return nil, errors.New("json parser error") 101 | } 102 | return result, nil 103 | } 104 | 105 | func (p *Private) CancelOrder(orderId string) (*CancelOrderResponse, error) { 106 | data, err := p.delete("orders/"+orderId, nil) 107 | if err != nil { 108 | return nil, err 109 | } 110 | 111 | result := &CancelOrderResponse{} 112 | if err = json.Unmarshal(data, &result); err != nil { 113 | return nil, errors.New("json parser error") 114 | } 115 | return result, nil 116 | } 117 | 118 | func (p *Private) CancelOrders(market string) (*CancelOrdersResponse, error) { 119 | values := url.Values{} 120 | if market != "" { 121 | values.Add("market", market) 122 | } 123 | 124 | res, err := p.delete("orders", values) 125 | if err != nil { 126 | return nil, err 127 | } 128 | result := &CancelOrdersResponse{} 129 | if err := json.Unmarshal(res, result); err != nil { 130 | return nil, errors.New("json parser error") 131 | } 132 | return result, nil 133 | } 134 | 135 | func (p *Private) GetOrderById(orderId string) (*OrderResponse, error) { 136 | res, err := p.get("orders/"+orderId, nil) 137 | if err != nil { 138 | return nil, err 139 | } 140 | 141 | result := &OrderResponse{} 142 | if err := json.Unmarshal(res, result); err != nil { 143 | return nil, errors.New("json parser error") 144 | } 145 | return result, nil 146 | } 147 | 148 | func (p *Private) WithdrawFast(param *WithdrawalParam) (*WithdrawResponse, error) { 149 | signature, err := starkex.WithdrawSign(p.StarkPrivateKey, starkex.WithdrawSignParam{ 150 | NetworkId: p.NetworkId, 151 | ClientId: param.ClientID, 152 | PositionId: int64(helpers.ToFloat(param.LpPositionId)), 153 | HumanAmount: param.CreditAmount, 154 | Expiration: param.Expiration, 155 | }) 156 | if err != nil { 157 | return nil, errors.New("sign error") 158 | } 159 | param.Signature = signature 160 | 161 | res, err := p.post("fast-withdrawals", param) 162 | if err != nil { 163 | return nil, err 164 | } 165 | 166 | result := &WithdrawResponse{} 167 | if err := json.Unmarshal(res, result); err != nil { 168 | return nil, errors.New("json parser error") 169 | } 170 | return result, nil 171 | } 172 | 173 | func (p *Private) GetFills(param *FillsParam) (*FillsResponse, error) { 174 | u := helpers.ToValues(param) 175 | res, err := p.get("fills", u) 176 | if err != nil { 177 | return nil, err 178 | } 179 | 180 | result := &FillsResponse{} 181 | if err := json.Unmarshal(res, result); err != nil { 182 | return nil, errors.New("json parser error") 183 | } 184 | return result, nil 185 | } 186 | 187 | func (p *Private) GetFundingPayments(param *FundingPaymentsParam) (*FundingPaymentsResponse, error) { 188 | u := helpers.ToValues(param) 189 | res, err := p.get("funding", u) 190 | if err != nil { 191 | return nil, err 192 | } 193 | 194 | result := &FundingPaymentsResponse{} 195 | if err := json.Unmarshal(res, result); err != nil { 196 | return nil, errors.New("json parser error") 197 | } 198 | return result, nil 199 | } 200 | 201 | func (p *Private) GetHistoricalPnL(param *HistoricalPnLParam) (*HistoricalPnLResponse, error) { 202 | u := helpers.ToValues(param) 203 | res, err := p.get("historical-pnl", u) 204 | if err != nil { 205 | return nil, err 206 | } 207 | 208 | result := &HistoricalPnLResponse{} 209 | if err := json.Unmarshal(res, result); err != nil { 210 | return nil, errors.New("json parser error") 211 | } 212 | return result, nil 213 | } 214 | 215 | func (p *Private) GetTradingRewards(param *TradingRewardsParam) (*TradingRewardsResponse, error) { 216 | u := helpers.ToValues(param) 217 | res, err := p.get("rewards/weight", u) 218 | if err != nil { 219 | return nil, err 220 | } 221 | 222 | result := &TradingRewardsResponse{} 223 | if err := json.Unmarshal(res, result); err != nil { 224 | return nil, errors.New("json parser error") 225 | } 226 | return result, nil 227 | } 228 | -------------------------------------------------------------------------------- /realtime/connect.go: -------------------------------------------------------------------------------- 1 | package realtime 2 | 3 | import ( 4 | "context" 5 | "encoding/json" 6 | "fmt" 7 | "log" 8 | "net/http" 9 | "os" 10 | "time" 11 | 12 | "github.com/buger/jsonparser" 13 | "github.com/go-numb/go-dydx/private" 14 | "github.com/go-numb/go-dydx/public" 15 | 16 | "github.com/gorilla/websocket" 17 | ) 18 | 19 | const ( 20 | PRODUCTION = "wss://api.dydx.exchange/v3/ws" 21 | STAGING = "wss://api.stage.dydx.exchange/v3/ws" 22 | ) 23 | 24 | const ( 25 | UNDEFINED = "undefined" 26 | ERROR = "error" 27 | ACCOUNT = "v3_accounts" 28 | MARKETS = "v3_markets" 29 | ORDERBOOK = "v3_orderbook" 30 | TRADES = "v3_trades" 31 | ) 32 | 33 | type request struct { 34 | Type string `json:"type"` 35 | Channel string `json:"channel"` 36 | 37 | // Public 38 | ID string `json:"id,omitempty"` 39 | IncludeOffsets bool `json:"includeOffsets,omitempty"` 40 | 41 | // Private 42 | AccountNumber string `json:"accountNumber,omitempty"` 43 | ApiKey string `json:"apiKey,omitempty"` 44 | Signature string `json:"signature,omitempty"` 45 | Timestamp string `json:"timestamp,omitempty"` 46 | Passphrase string `json:"passphrase,omitempty"` 47 | } 48 | 49 | type Response struct { 50 | Type string `json:"type"` 51 | Channel string `json:"channel"` 52 | ConnectionID string `json:"connection_id,omitempty"` 53 | ID string `json:"id,omitempty"` 54 | MessageID int `json:"message_id,omitempty"` 55 | Contents any `json:"-"` 56 | 57 | Account Account `json:"-"` 58 | Markets public.MarketsResponse `json:"-"` 59 | Trades public.TradesResponse `json:"-"` 60 | Orderbook public.OrderbookResponse `json:"-"` 61 | 62 | Results error 63 | } 64 | 65 | type Account struct { 66 | Orders []private.Order `json:"orders"` 67 | private.AccountResponse 68 | private.TransfersResponse 69 | private.FundingPaymentsResponse 70 | private.FillsResponse 71 | private.PositionResponse 72 | } 73 | 74 | func subscribe(conn *websocket.Conn, private *private.Private, channels, symbols []string) error { 75 | for i := range channels { 76 | if private != nil && channels[i] == ACCOUNT { 77 | r := &request{ 78 | Type: "subscribe", 79 | Channel: channels[i], 80 | // single account 81 | AccountNumber: "0", 82 | ApiKey: private.ApiKeyCredentials.Key, 83 | Passphrase: private.ApiKeyCredentials.Passphrase, 84 | } 85 | 86 | isoTimestamp := time.Now().UTC().Format("2006-01-02T15:04:05.999Z") 87 | r.Signature = private.Sign("/ws/accounts", http.MethodGet, isoTimestamp, "") 88 | r.Timestamp = isoTimestamp 89 | if err := conn.WriteJSON(r); err != nil { 90 | return err 91 | } 92 | time.Sleep(time.Second) 93 | fmt.Println("account request") 94 | continue 95 | } 96 | 97 | for j := range symbols { 98 | r := &request{ // "{"type":"subscribe","channel":"v3_trades","id":"BTC-USD"} 99 | Type: "subscribe", 100 | Channel: channels[i], 101 | ID: symbols[j], 102 | } 103 | 104 | if r.Channel == ORDERBOOK { 105 | r.IncludeOffsets = true 106 | } 107 | 108 | if err := conn.WriteJSON(r); err != nil { 109 | return err 110 | } 111 | time.Sleep(time.Second) 112 | } 113 | } 114 | 115 | return nil 116 | } 117 | 118 | func unsubscribe(conn *websocket.Conn, channels, symbols []string) error { 119 | for i := range channels { 120 | if err := conn.WriteJSON(&request{ 121 | Type: "unsubscribe", 122 | Channel: channels[i], 123 | }); err != nil { 124 | return err 125 | } 126 | } 127 | return nil 128 | } 129 | 130 | func ping(conn *websocket.Conn) (err error) { 131 | ticker := time.NewTicker(10 * time.Second) 132 | defer ticker.Stop() 133 | 134 | for { 135 | select { 136 | case <-ticker.C: 137 | if err := conn.WriteMessage(websocket.PingMessage, []byte(`pong`)); err != nil { 138 | goto EXIT 139 | } 140 | } 141 | } 142 | EXIT: 143 | return err 144 | } 145 | 146 | func Connect(ctx context.Context, ch chan Response, channels, symbols []string, private *private.Private, l *log.Logger) error { 147 | RESTART: 148 | 149 | if l == nil { 150 | l = log.New(os.Stdout, "dYdX websocket ", log.Llongfile) 151 | } 152 | 153 | conn, _, err := websocket.DefaultDialer.Dial(PRODUCTION, nil) 154 | if err != nil { 155 | return err 156 | } 157 | 158 | // Initial connect 159 | _, msg, err := conn.ReadMessage() 160 | if err != nil { 161 | l.Printf("[ERROR]: msg error: %+v", err) 162 | return err 163 | } 164 | if err := subscribe(conn, private, channels, symbols); err != nil { 165 | l.Printf("[ERROR]: connected error: %+v", string(msg)) 166 | return err 167 | } 168 | 169 | // Dorument: The server will send pings every 30s and expects a pong within 10s. The server does not expect pings, but will respond with a pong if sent one. 170 | // Pong every 10 seconds without Ping. 171 | go ping(conn) 172 | 173 | func() { 174 | defer conn.Close() 175 | defer unsubscribe(conn, channels, symbols) 176 | 177 | for { 178 | var res Response 179 | _, msg, err := conn.ReadMessage() 180 | if err != nil { 181 | l.Printf("[ERROR]: msg error: %+v", err) 182 | res.Channel = ERROR 183 | res.Results = fmt.Errorf("%v", err) 184 | ch <- res 185 | } 186 | 187 | if err := json.Unmarshal(msg, &res); err != nil { 188 | l.Printf("[ERROR]: unmarshal error: %+v", string(msg)) 189 | res.Channel = ERROR 190 | res.Results = fmt.Errorf("%v", string(msg)) 191 | ch <- res 192 | } 193 | 194 | data, _, _, err := jsonparser.Get(msg, "contents") 195 | if err != nil { 196 | err = fmt.Errorf("[ERROR]: data err: %v %s", err, string(msg)) 197 | l.Println(err) 198 | res.Channel = ERROR 199 | res.Results = err 200 | ch <- res 201 | } 202 | 203 | switch res.Channel { 204 | case ACCOUNT: 205 | if err := json.Unmarshal(data, &res.Account); err != nil { 206 | l.Printf("[WARN]: cant unmarshal accounts %+v", err) 207 | continue 208 | } 209 | 210 | case MARKETS: 211 | if err := json.Unmarshal([]byte(data), &res.Markets); err != nil { 212 | l.Printf("[WARN]: cant unmarshal markets %+v", err) 213 | continue 214 | } 215 | // handle case where market data response if keys differently in json payload after inital connection 216 | if len(res.Markets.Markets) == 0 { 217 | var marketData map[string]public.Market 218 | if err := json.Unmarshal([]byte(data), &marketData); err != nil { 219 | l.Printf("[WARN]: cant unmarshal markets %+v", err) 220 | continue 221 | } 222 | res.Markets.Markets = marketData 223 | } 224 | 225 | case TRADES: 226 | if err := json.Unmarshal(data, &res.Trades); err != nil { 227 | l.Printf("[WARN]: cant unmarshal trades %+v", err) 228 | continue 229 | } 230 | 231 | case ORDERBOOK: 232 | if err := json.Unmarshal(data, &res.Orderbook); err != nil { 233 | l.Printf("[WARN]: cant unmarshal orderbook %+v", err) 234 | continue 235 | } 236 | 237 | case ERROR: 238 | message, _, _, err := jsonparser.Get(msg, "message") 239 | err = fmt.Errorf("[ERROR]: type err: %v %s", err, string(message)) 240 | l.Println(err) 241 | res.Channel = ERROR 242 | res.Results = err 243 | 244 | default: 245 | res.Channel = UNDEFINED 246 | res.Results = fmt.Errorf("%v", string(msg)) 247 | } 248 | 249 | ch <- res 250 | 251 | } 252 | }() 253 | 254 | goto RESTART 255 | 256 | } 257 | -------------------------------------------------------------------------------- /private/types.go: -------------------------------------------------------------------------------- 1 | package private 2 | 3 | import ( 4 | "log" 5 | "net/http" 6 | "net/url" 7 | "strconv" 8 | "time" 9 | 10 | "github.com/go-numb/go-dydx/types" 11 | ) 12 | 13 | type Private struct { 14 | NetworkId int 15 | Host string 16 | StarkPrivateKey string 17 | DefaultAddress string 18 | ApiKeyCredentials *types.ApiKeyCredentials 19 | 20 | HttpClient *http.Client 21 | RateLimit *types.RateLimit 22 | Logger *log.Logger 23 | } 24 | 25 | type ApiBaseOrder struct { 26 | Signature string `json:"signature"` 27 | Expiration string `json:"expiration"` 28 | } 29 | 30 | type ApiOrder struct { 31 | ApiBaseOrder 32 | Market string `json:"market"` 33 | Side string `json:"side"` 34 | Type string `json:"type"` 35 | Size string `json:"size"` 36 | Price string `json:"price"` 37 | ClientId string `json:"clientId"` 38 | TimeInForce string `json:"timeInForce"` 39 | LimitFee string `json:"limitFee"` 40 | CancelId string `json:"cancelId,omitempty"` 41 | TriggerPrice string `json:"triggerPrice,omitempty"` 42 | TrailingPercent string `json:"trailingPercent,omitempty"` 43 | PostOnly bool `json:"postOnly"` 44 | } 45 | 46 | type UsersResponse struct { 47 | User User `json:"user"` 48 | } 49 | 50 | type User struct { 51 | PublicID string `json:"publicId"` 52 | EthereumAddress string `json:"ethereumAddress"` 53 | IsRegistered bool `json:"isRegistered"` 54 | Email string `json:"email"` 55 | Username string `json:"username"` 56 | UserData struct { 57 | WalletType string `json:"walletType"` 58 | Preferences struct { 59 | SaveOrderAmount bool `json:"saveOrderAmount"` 60 | UserTradeOptions struct { 61 | Limit struct { 62 | PostOnlyChecked bool `json:"postOnlyChecked"` 63 | GoodTilTimeInput string `json:"goodTilTimeInput"` 64 | GoodTilTimeTimescale string `json:"goodTilTimeTimescale"` 65 | SelectedTimeInForceOption string `json:"selectedTimeInForceOption"` 66 | } `json:"LIMIT"` 67 | Market struct { 68 | PostOnlyChecked bool `json:"postOnlyChecked"` 69 | GoodTilTimeInput string `json:"goodTilTimeInput"` 70 | GoodTilTimeTimescale string `json:"goodTilTimeTimescale"` 71 | SelectedTimeInForceOption string `json:"selectedTimeInForceOption"` 72 | } `json:"MARKET"` 73 | StopLimit struct { 74 | PostOnlyChecked bool `json:"postOnlyChecked"` 75 | GoodTilTimeInput string `json:"goodTilTimeInput"` 76 | GoodTilTimeTimescale string `json:"goodTilTimeTimescale"` 77 | SelectedTimeInForceOption string `json:"selectedTimeInForceOption"` 78 | } `json:"STOP_LIMIT"` 79 | TakeProfit struct { 80 | PostOnlyChecked bool `json:"postOnlyChecked"` 81 | GoodTilTimeInput string `json:"goodTilTimeInput"` 82 | GoodTilTimeTimescale string `json:"goodTilTimeTimescale"` 83 | SelectedTimeInForceOption string `json:"selectedTimeInForceOption"` 84 | } `json:"TAKE_PROFIT"` 85 | LastPlacedTradeType string `json:"lastPlacedTradeType"` 86 | } `json:"userTradeOptions"` 87 | PopUpNotifications bool `json:"popUpNotifications"` 88 | OrderbookAnimations bool `json:"orderbookAnimations"` 89 | OneTimeNotifications []string `json:"oneTimeNotifications"` 90 | LeaguesCurrentStartDate time.Time `json:"leaguesCurrentStartDate"` 91 | } `json:"preferences"` 92 | Notifications struct { 93 | Trade struct { 94 | Email bool `json:"email"` 95 | } `json:"trade"` 96 | Deposit struct { 97 | Email bool `json:"email"` 98 | } `json:"deposit"` 99 | Transfer struct { 100 | Email bool `json:"email"` 101 | } `json:"transfer"` 102 | Marketing struct { 103 | Email bool `json:"email"` 104 | } `json:"marketing"` 105 | Withdrawal struct { 106 | Email bool `json:"email"` 107 | } `json:"withdrawal"` 108 | Liquidation struct { 109 | Email bool `json:"email"` 110 | } `json:"liquidation"` 111 | FundingPayment struct { 112 | Email bool `json:"email"` 113 | } `json:"funding_payment"` 114 | } `json:"notifications"` 115 | StarredMarkets []interface{} `json:"starredMarkets"` 116 | } `json:"userData"` 117 | MakerFeeRate string `json:"makerFeeRate"` 118 | TakerFeeRate string `json:"takerFeeRate"` 119 | MakerVolume30D string `json:"makerVolume30D"` 120 | TakerVolume30D string `json:"takerVolume30D"` 121 | Fees30D string `json:"fees30D"` 122 | ReferredByAffiliateLink string `json:"referredByAffiliateLink"` 123 | IsSharingUsername bool `json:"isSharingUsername"` 124 | IsSharingAddress bool `json:"isSharingAddress"` 125 | DydxTokenBalance string `json:"dydxTokenBalance"` 126 | StakedDydxTokenBalance string `json:"stakedDydxTokenBalance"` 127 | ActiveStakedDydxTokenBalance string `json:"activeStakedDydxTokenBalance"` 128 | IsEmailVerified bool `json:"isEmailVerified"` 129 | Country interface{} `json:"country"` 130 | HedgiesHeld []interface{} `json:"hedgiesHeld"` 131 | } 132 | 133 | type AccountResponse struct { 134 | Account Account `json:"account"` 135 | } 136 | 137 | type Account struct { 138 | PositionId int64 `json:"positionId,string"` 139 | ID string `json:"id"` 140 | StarkKey string `json:"starkKey"` 141 | Equity string `json:"equity"` 142 | FreeCollateral string `json:"freeCollateral"` 143 | QuoteBalance string `json:"quoteBalance"` 144 | PendingDeposits string `json:"pendingDeposits"` 145 | PendingWithdrawals string `json:"pendingWithdrawals"` 146 | AccountNumber string `json:"accountNumber"` 147 | OpenPositions map[string]Position `json:"openPositions"` 148 | CreatedAt time.Time `json:"createdAt"` 149 | } 150 | 151 | type PositionResponse struct { 152 | Positions []Position `json:"positions"` 153 | } 154 | 155 | type Position struct { 156 | Market string `json:"market"` 157 | Status string `json:"status"` 158 | Side string `json:"side"` 159 | Size string `json:"size"` 160 | MaxSize string `json:"maxSize"` 161 | EntryPrice string `json:"entryPrice"` 162 | ExitPrice interface{} `json:"exitPrice"` 163 | UnrealizedPnl string `json:"unrealizedPnl"` 164 | RealizedPnl string `json:"realizedPnl"` 165 | CreatedAt time.Time `json:"createdAt"` 166 | ClosedAt interface{} `json:"closedAt"` 167 | NetFunding string `json:"netFunding"` 168 | SumOpen string `json:"sumOpen"` 169 | SumClose string `json:"sumClose"` 170 | } 171 | 172 | type OrderResponse struct { 173 | Order Order `json:"order"` 174 | } 175 | 176 | type CancelOrderResponse struct { 177 | CancelOrder Order `json:"cancelOrder"` 178 | } 179 | 180 | type CancelOrdersResponse struct { 181 | CancelOrders Order `json:"cancelOrder"` 182 | } 183 | 184 | type Order struct { 185 | ID string `json:"id"` 186 | ClientID string `json:"clientId"` 187 | AccountID string `json:"accountId"` 188 | Market string `json:"market"` 189 | Side string `json:"side"` 190 | Price string `json:"price"` 191 | TriggerPrice string `json:"triggerPrice"` 192 | TrailingPercent string `json:"trailingPercent"` 193 | Size string `json:"size"` 194 | RemainingSize string `json:"remainingSize"` 195 | Type string `json:"type"` 196 | UnfillableAt string `json:"unfillableAt"` 197 | Status string `json:"status"` 198 | TimeInForce string `json:"timeInForce"` 199 | CancelReason string `json:"cancelReason"` 200 | PostOnly bool `json:"postOnly"` 201 | CreatedAt time.Time `json:"createdAt"` 202 | ExpiresAt time.Time `json:"expiresAt"` 203 | } 204 | 205 | type OrderListResponse struct { 206 | Orders []Order `json:"orders"` 207 | } 208 | 209 | type OrderQueryParam struct { 210 | Limit int `json:"limit"` 211 | Market string `json:"market"` 212 | Status string `json:"status"` 213 | Type string `json:"type"` 214 | Side string `json:"side"` 215 | CreatedBeforeOrAt string `json:"createdAt"` 216 | ReturnLatestOrders string `json:"returnLatestOrders"` 217 | } 218 | 219 | type WithdrawResponse struct { 220 | Withdrawal []Withdrawal `json:"withdrawal"` 221 | } 222 | 223 | type Withdrawal struct { 224 | ID string `json:"id"` 225 | Type string `json:"type"` 226 | DebitAsset string `json:"debitAsset"` 227 | CreditAsset string `json:"creditAsset"` 228 | DebitAmount string `json:"debitAmount"` 229 | CreditAmount string `json:"creditAmount"` 230 | TransactionHash string `json:"transactionHash"` 231 | Status string `json:"status"` 232 | ClientID string `json:"clientId"` 233 | FromAddress string `json:"fromAddress"` 234 | ToAddress interface{} `json:"toAddress"` 235 | ConfirmedAt interface{} `json:"confirmedAt"` 236 | CreatedAt time.Time `json:"createdAt"` 237 | } 238 | 239 | type WithdrawalParam struct { 240 | ClientID string `json:"clientId"` 241 | ToAddress string `json:"toAddress"` 242 | CreditAsset string `json:"creditAsset"` 243 | CreditAmount string `json:"creditAmount"` 244 | 245 | DebitAmount string `json:"debitAmount"` 246 | 247 | LpPositionId string `json:"lpPositionId"` 248 | Expiration string `json:"expiration"` 249 | Signature string `json:"signature"` 250 | } 251 | 252 | type FillsResponse struct { 253 | Fills []Fill `json:"fills"` 254 | } 255 | 256 | type Fill struct { 257 | ID string `json:"id"` 258 | Side string `json:"side"` 259 | Liquidity string `json:"liquidity"` 260 | Type string `json:"type"` 261 | Market string `json:"market"` 262 | OrderID string `json:"orderId"` 263 | Price string `json:"price"` 264 | Size string `json:"size"` 265 | Fee string `json:"fee"` 266 | CreatedAt time.Time `json:"createdAt"` 267 | } 268 | 269 | type FillsParam struct { 270 | Market string `json:"market,omitempty"` 271 | OrderId string `json:"order_id,omitempty"` 272 | Limit string `json:"limit,omitempty"` 273 | CreatedBeforeOrAt string `json:"createdBeforeOrAt,omitempty"` 274 | } 275 | 276 | type FundingPaymentsResponse struct { 277 | FundingPayments []FundingPayment `json:"fundingPayments"` 278 | } 279 | 280 | type FundingPayment struct { 281 | Market string `json:"market"` 282 | Payment string `json:"payment"` 283 | Rate string `json:"rate"` 284 | PositionSize string `json:"positionSize"` 285 | Price string `json:"price"` 286 | EffectiveAt time.Time `json:"effectiveAt"` 287 | } 288 | 289 | type FundingPaymentsParam struct { 290 | Market string `json:"market,omitempty"` 291 | Limit string `json:"limit,omitempty"` 292 | EffectiveBeforeOrAt string `json:"effectiveBeforeOrAt,omitempty"` 293 | } 294 | 295 | type HistoricalPnLResponse struct { 296 | HistoricalPnLs []HistoricalPnL `json:"historicalPnl"` 297 | } 298 | 299 | type HistoricalPnL struct { 300 | AccountID string `json:"accountId"` 301 | Equity string `json:"equity"` 302 | TotalPnl string `json:"totalPnl"` 303 | NetTransfers string `json:"netTransfers"` 304 | CreatedAt time.Time `json:"createdAt"` 305 | } 306 | 307 | type HistoricalPnLParam struct { 308 | EffectiveBeforeOrAt string `json:"effectiveBeforeOrAt,omitempty"` 309 | EffectiveAtOrAfter string `json:"effectiveAtOrAfter,omitempty"` 310 | } 311 | 312 | type TradingRewardsResponse TradingReward 313 | 314 | type TradingReward struct { 315 | Epoch int `json:"epoch"` 316 | EpochStart time.Time `json:"epochStart"` 317 | EpochEnd time.Time `json:"epochEnd"` 318 | Fees struct { 319 | FeesPaid string `json:"feesPaid"` 320 | TotalFeesPaid string `json:"totalFeesPaid"` 321 | } `json:"fees"` 322 | OpenInterest struct { 323 | AverageOpenInterest string `json:"averageOpenInterest"` 324 | TotalAverageOpenInterest string `json:"totalAverageOpenInterest"` 325 | } `json:"openInterest"` 326 | StakedDYDX struct { 327 | AverageStakedDYDX string `json:"averageStakedDYDX"` 328 | AverageStakedDYDXWithFloor string `json:"averageStakedDYDXWithFloor"` 329 | TotalAverageStakedDYDX string `json:"totalAverageStakedDYDX"` 330 | } `json:"stakedDYDX"` 331 | Weight struct { 332 | Weight string `json:"weight"` 333 | TotalWeight string `json:"totalWeight"` 334 | } `json:"weight"` 335 | TotalRewards string `json:"totalRewards"` 336 | EstimatedRewards string `json:"estimatedRewards"` 337 | } 338 | 339 | type TradingRewardsParam struct { 340 | Epoch int `json:"epoch,omitempty"` 341 | } 342 | 343 | type TransfersResponse struct { 344 | Transfers []Transfer `json:"transfers"` 345 | } 346 | 347 | type Transfer struct { 348 | Type string `json:"type"` 349 | ID string `json:"id"` 350 | ClientID string `json:"clientId"` 351 | CreditAmount string `json:"creditAmount"` 352 | CreditAsset string `json:"creditAsset"` 353 | DebitAmount string `json:"debitAmount"` 354 | DebitAsset string `json:"debitAsset"` 355 | FromAddress string `json:"fromAddress"` 356 | Status string `json:"status"` 357 | ToAddress string `json:"toAddress"` 358 | TransactionHash string `json:"transactionHash"` 359 | ConfirmedAt time.Time `json:"confirmedAt"` 360 | CreatedAt time.Time `json:"createdAt"` 361 | } 362 | 363 | type TransfersParam struct { 364 | } 365 | 366 | func (o OrderQueryParam) ToParams() url.Values { 367 | params := url.Values{} 368 | if o.Market != "" { 369 | params.Add("market", o.Market) 370 | } 371 | if o.Status != "" { 372 | params.Add("status", o.Status) 373 | } 374 | if o.Side != "" { 375 | params.Add("side", o.Side) 376 | } 377 | if o.Type != "" { 378 | params.Add("type", o.Type) 379 | } 380 | if o.Limit != 0 { 381 | params.Add("limit", strconv.Itoa(o.Limit)) 382 | } 383 | if o.CreatedBeforeOrAt != "" { 384 | params.Add("createdBeforeOrAt", o.CreatedBeforeOrAt) 385 | } 386 | if o.ReturnLatestOrders != "" { 387 | params.Add("returnLatestOrders", o.ReturnLatestOrders) 388 | } 389 | return params 390 | } -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= 2 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 4 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 5 | cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= 6 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 7 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 8 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= 9 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= 10 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= 11 | cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= 12 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= 13 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= 14 | cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= 15 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= 16 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= 17 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= 18 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= 19 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= 20 | collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= 21 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 22 | github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= 23 | github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= 24 | github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= 25 | github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= 26 | github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= 27 | github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= 28 | github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= 29 | github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= 30 | github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= 31 | github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= 32 | github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= 33 | github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= 34 | github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= 35 | github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= 36 | github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= 37 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 38 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 39 | github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= 40 | github.com/Microsoft/go-winio v0.4.13 h1:Hmi80lzZuI/CaYmlJp/b+FjZdRZhKu9c2mDVqKlLWVs= 41 | github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= 42 | github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= 43 | github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= 44 | github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 45 | github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= 46 | github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= 47 | github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= 48 | github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= 49 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 50 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 51 | github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= 52 | github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= 53 | github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= 54 | github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= 55 | github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= 56 | github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= 57 | github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= 58 | github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= 59 | github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= 60 | github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= 61 | github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= 62 | github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= 63 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 64 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 65 | github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= 66 | github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= 67 | github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= 68 | github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= 69 | github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= 70 | github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= 71 | github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= 72 | github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= 73 | github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= 74 | github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= 75 | github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= 76 | github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= 77 | github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= 78 | github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= 79 | github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= 80 | github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= 81 | github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= 82 | github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= 83 | github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= 84 | github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= 85 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 86 | github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= 87 | github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 88 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 89 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 90 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 91 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 92 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 93 | github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= 94 | github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= 95 | github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= 96 | github.com/containerd/continuity v0.0.0-20191214063359-1097c8bae83b h1:pik3LX++5O3UiNWv45wfP/WT81l7ukBJzd3uUiifbSU= 97 | github.com/containerd/continuity v0.0.0-20191214063359-1097c8bae83b/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= 98 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 99 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 100 | github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= 101 | github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= 102 | github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 103 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 104 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 105 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 106 | github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= 107 | github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= 108 | github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= 109 | github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= 110 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 111 | github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= 112 | github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= 113 | github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= 114 | github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= 115 | github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= 116 | github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= 117 | github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= 118 | github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 119 | github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= 120 | github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= 121 | github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 122 | github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= 123 | github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= 124 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 125 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 126 | github.com/ethereum/go-ethereum v1.10.16 h1:3oPrumn0bCW/idjcxMn5YYVCdK7VzJYIvwGZUGLEaoc= 127 | github.com/ethereum/go-ethereum v1.10.16/go.mod h1:Anj6cxczl+AHy63o4X9O8yWNHuN5wMpfb8MAnHkWn7Y= 128 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 129 | github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= 130 | github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= 131 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 132 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= 133 | github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= 134 | github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= 135 | github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= 136 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 137 | github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= 138 | github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= 139 | github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= 140 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 141 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 142 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 143 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 144 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 145 | github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= 146 | github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 147 | github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 148 | github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= 149 | github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 150 | github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 151 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 152 | github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= 153 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 154 | github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= 155 | github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= 156 | github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= 157 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 158 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 159 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 160 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 161 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 162 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 163 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 164 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 165 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 166 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 167 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 168 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 169 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 170 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 171 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 172 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 173 | github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 174 | github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 175 | github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 176 | github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= 177 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 178 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 179 | github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 180 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 181 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 182 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 183 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 184 | github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 185 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 186 | github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= 187 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 188 | github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= 189 | github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= 190 | github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 191 | github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= 192 | github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 193 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 194 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 195 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 196 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 197 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 198 | github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 199 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 200 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 201 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 202 | github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= 203 | github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 204 | github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= 205 | github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 206 | github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= 207 | github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= 208 | github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= 209 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 210 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 211 | github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 212 | github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= 213 | github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= 214 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 215 | github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= 216 | github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= 217 | github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= 218 | github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= 219 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 220 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 221 | github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= 222 | github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= 223 | github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= 224 | github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= 225 | github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= 226 | github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= 227 | github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= 228 | github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= 229 | github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= 230 | github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= 231 | github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= 232 | github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= 233 | github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= 234 | github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 235 | github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 236 | github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= 237 | github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= 238 | github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= 239 | github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= 240 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 241 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 242 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 243 | github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= 244 | github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 245 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 246 | github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= 247 | github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= 248 | github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= 249 | github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 250 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 251 | github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= 252 | github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= 253 | github.com/klauspost/compress v1.4.1 h1:8VMb5+0wMgdBykOV96DwNwKFQ+WTI4pzYURP99CcB9E= 254 | github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= 255 | github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 256 | github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 257 | github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE= 258 | github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 259 | github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= 260 | github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= 261 | github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= 262 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 263 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 264 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 265 | github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= 266 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 267 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 268 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 269 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 270 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 271 | github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 272 | github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= 273 | github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= 274 | github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= 275 | github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= 276 | github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= 277 | github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 278 | github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 279 | github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= 280 | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 281 | github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 282 | github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 283 | github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 284 | github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= 285 | github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= 286 | github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 287 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 288 | github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= 289 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 290 | github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 291 | github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= 292 | github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= 293 | github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= 294 | github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= 295 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 296 | github.com/miguelmota/go-solidity-sha3 v0.1.1 h1:3Y08sKZDtudtE5kbTBPC9RYJznoSYyWI9VD6mghU0CA= 297 | github.com/miguelmota/go-solidity-sha3 v0.1.1/go.mod h1:sax1FvQF+f71j8W1uUHMZn8NxKyl5rYLks2nqj8RFEw= 298 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 299 | github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 300 | github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= 301 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 302 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 303 | github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= 304 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 305 | github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= 306 | github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= 307 | github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= 308 | github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= 309 | github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= 310 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 311 | github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 312 | github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 313 | github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= 314 | github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= 315 | github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= 316 | github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 317 | github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 318 | github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= 319 | github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= 320 | github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= 321 | github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= 322 | github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= 323 | github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= 324 | github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y= 325 | github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= 326 | github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 327 | github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 328 | github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 329 | github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= 330 | github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= 331 | github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= 332 | github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= 333 | github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= 334 | github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= 335 | github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= 336 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 337 | github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 338 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 339 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 340 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 341 | github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= 342 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 343 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 344 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 345 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 346 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 347 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 348 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 349 | github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 350 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 351 | github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= 352 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 353 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 354 | github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= 355 | github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= 356 | github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= 357 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 358 | github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= 359 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 360 | github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= 361 | github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= 362 | github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= 363 | github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= 364 | github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= 365 | github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= 366 | github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= 367 | github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= 368 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 369 | github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= 370 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 371 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= 372 | github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= 373 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 374 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 375 | github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 376 | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 377 | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 378 | github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 379 | github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 380 | github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 381 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 382 | github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= 383 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 384 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 385 | github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 386 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 387 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 388 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 389 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 390 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 391 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 392 | github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= 393 | github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= 394 | github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= 395 | github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= 396 | github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= 397 | github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= 398 | github.com/umbracle/ethgo v0.1.0 h1:YFcEQbizZTS/WlJEmrjYI5wiiOLJSaqZkK7vd25SWz0= 399 | github.com/umbracle/ethgo v0.1.0/go.mod h1:IRxrWYxMlmIezmLY5/GETr1UJfkD1+dj1SZ/afuzs/I= 400 | github.com/umbracle/fastrlp v0.0.0-20211229195328-c1416904ae17 h1:ZZy8Rj2SqGcZn1hTcoLdwFBROzrf5KiuRwhp8G4nnfA= 401 | github.com/umbracle/fastrlp v0.0.0-20211229195328-c1416904ae17/go.mod h1:c8J0h9aULj2i3umrfyestM6jCq0LK0U6ly6bWy96nd4= 402 | github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= 403 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 404 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 405 | github.com/valyala/fasthttp v1.4.0 h1:PuaTGZIw3mjYhhhbVbCQp8aciRZN9YdoB7MGX9Ko76A= 406 | github.com/valyala/fasthttp v1.4.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= 407 | github.com/valyala/fastjson v1.4.1 h1:hrltpHpIpkaxll8QltMU8c3QZ5+qIiCL8yKqPFJI/yE= 408 | github.com/valyala/fastjson v1.4.1/go.mod h1:nV6MsjxL2IMJQUoHDIrjEI7oLyeqK6aBD7EFWPsvP8o= 409 | github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= 410 | github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= 411 | github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= 412 | github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= 413 | github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= 414 | github.com/yanue/starkex v0.0.0-20211122094927-61a9aa6b8d97 h1:2J/o24Zad7R0J+F/OqMazZHoXJSIpMMBN8PksR8bm4s= 415 | github.com/yanue/starkex v0.0.0-20211122094927-61a9aa6b8d97/go.mod h1:Owc+hA2CxIsKGVgX6n/KIJtyXxJoAGNcHO+8iyL0J6A= 416 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 417 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 418 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 419 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 420 | go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 421 | go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= 422 | go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 423 | golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 424 | golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 425 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 426 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 427 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 428 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 429 | golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 430 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 431 | golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 432 | golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 433 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 434 | golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 435 | golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= 436 | golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= 437 | golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 438 | golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 439 | golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 440 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 441 | golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 442 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 443 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 444 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= 445 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= 446 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 447 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 448 | golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 449 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 450 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 451 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 452 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 453 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 454 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 455 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 456 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 457 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 458 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= 459 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 460 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= 461 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 462 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= 463 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 464 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 465 | golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 466 | golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 467 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 468 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 469 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 470 | golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 471 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 472 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 473 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 474 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 475 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 476 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 477 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 478 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 479 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 480 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 481 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 482 | golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 483 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 484 | golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 485 | golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 486 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 487 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 488 | golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 489 | golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 490 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 491 | golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= 492 | golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 493 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 494 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 495 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 496 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 497 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 498 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 499 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 500 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 501 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 502 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 503 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 504 | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 505 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 506 | golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 507 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 508 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 509 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 510 | golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 511 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 512 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 513 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 514 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 515 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 516 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 517 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 518 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 519 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 520 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 521 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 522 | golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 523 | golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 524 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 525 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 526 | golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 527 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 528 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 529 | golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 530 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 531 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 532 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 533 | golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 534 | golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 535 | golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 536 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 537 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 538 | golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 539 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 540 | golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 541 | golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 542 | golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 543 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 544 | golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= 545 | golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 546 | golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 547 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 548 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 549 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 550 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 551 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 552 | golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 553 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 554 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 555 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 556 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 557 | golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 558 | golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 559 | golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 560 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 561 | golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 562 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 563 | golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 564 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 565 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 566 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 567 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 568 | golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 569 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 570 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 571 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 572 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 573 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 574 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 575 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 576 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 577 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 578 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 579 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 580 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 581 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 582 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 583 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 584 | golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 585 | golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= 586 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 587 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 588 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 589 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 590 | gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= 591 | gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= 592 | gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= 593 | gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= 594 | gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= 595 | gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= 596 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 597 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= 598 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 599 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 600 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 601 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 602 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 603 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 604 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 605 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 606 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 607 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 608 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 609 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 610 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 611 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 612 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 613 | google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 614 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 615 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 616 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= 617 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 618 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 619 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 620 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 621 | google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 622 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 623 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 624 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 625 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 626 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 627 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 628 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 629 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 630 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 631 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 632 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 633 | gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= 634 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 635 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 636 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 637 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= 638 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 639 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 640 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 641 | gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= 642 | gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= 643 | gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= 644 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 645 | gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= 646 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 647 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 648 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 649 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 650 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 651 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 652 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 653 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= 654 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 655 | gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= 656 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 657 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 658 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 659 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 660 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 661 | honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= 662 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 663 | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 664 | --------------------------------------------------------------------------------