diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..d921d0f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: gomod + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..2a91bbe --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,38 @@ +name: CI +on: + push: + tags: + - v* + branches: + - master + - main + pull_request: + branches: + - master + - main +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: golangci-lint + uses: golangci/golangci-lint-action@v2 + with: + version: v1.41 + + build: + name: build + runs-on: ubuntu-latest + strategy: + matrix: + go: [1.16, 1.15] + steps: + - name: Setup + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go }} + - name: Check out source + uses: actions/checkout@v2 + - name: Build + run: make build \ No newline at end of file diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..269d209 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,60 @@ +name: "CodeQL" + +on: + push: + branches: [ main ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ main ] + schedule: + - cron: '42 21 * * 3' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'go' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # âœī¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1f9c510..e7295d0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ tmp vendor bin .exe +dist/ diff --git a/.goreleaser.yml b/.goreleaser.yml new file mode 100644 index 0000000..26849b2 --- /dev/null +++ b/.goreleaser.yml @@ -0,0 +1,63 @@ +before: + hooks: + - go mod tidy +builds: + - goos: + - linux + - darwin + - windows + ignore: + - goos: linux + goarch: 386 + - goos: darwin + goarch: 386 + - goos: windows + goarch: 386 + id: "executor" + main: ./cmd/executor + binary: executor + - goos: + - linux + - darwin + - windows + ignore: + - goos: linux + goarch: 386 + - goos: darwin + goarch: 386 + - goos: windows + goarch: 386 + id: "tradeclient" + main: ./cmd/tradeclient + binary: tradeclient + - goos: + - linux + - darwin + - windows + ignore: + - goos: linux + goarch: 386 + - goos: darwin + goarch: 386 + - goos: windows + goarch: 386 + id: "ordermatch" + main: ./cmd/ordermatch + binary: ordermatch + +archives: + - replacements: + darwin: Darwin + linux: Linux + windows: Windows + amd64: x86_64 +checksum: + name_template: 'checksums.txt' +snapshot: + name_template: "{{ .Tag }}-next" +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8a75d2d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: go - -matrix: - allow_failures: - - go: tip - fast_finish: true - include: - - go: 1.11.x - env: GO111MODULE=on - - go: 1.12.x - env: GO111MODULE=on - - go: 1.13.x - - go: tip - -before_install: - - if [[ "${GO111MODULE}" = "on" ]]; then mkdir "${HOME}/go"; export GOPATH="${HOME}/go"; fi - - go mod download - - if [[ "${GO111MODULE}" = "on" ]]; then export PATH="${GOPATH}/bin:${GOROOT}/bin:${PATH}"; fi - - travis_retry go get -u golang.org/x/lint/golint - -script: make test - -sudo: false \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE similarity index 95% rename from LICENSE.txt rename to LICENSE index d9eb364..4f5ba2b 100644 --- a/LICENSE.txt +++ b/LICENSE @@ -1,6 +1,6 @@ The QuickFIX Software License, Version 1.0 -Copyright (c) 2001-2010 quickfixengine.org All rights +Copyright (c) 2001-present quickfixengine.org All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Makefile b/Makefile index e33319f..7060743 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ SHELL := /bin/bash test: lint vet build lint: - golint ./... + golangci-lint run vet: go vet ./... diff --git a/README.md b/README.md index fbee9d8..0fb8dab 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,28 @@ -Example QuickFIX/Go Applications -================================ +# Example QuickFIX/Go Applications -[![Build Status](https://travis-ci.org/quickfixgo/examples.svg?branch=master)](https://travis-ci.org/quickfixgo/examples) +[![Build Status](https://github.com/quickfixgo/examples/workflows/CI/badge.svg)](https://github.com/quickfixgo/examples/actions) [![GoDoc](https://godoc.org/github.com/quickfixgo/examples?status.png)](https://godoc.org/github.com/quickfixgo/examples) [![Go Report Card](https://goreportcard.com/badge/github.com/quickfixgo/examples)](https://goreportcard.com/report/github.com/quickfixgo/examples) -* TradeClient is a simple console based trading client -* Executor is a server that fills every limit order it receives -* OrderMatch is a primitive matching engine +* [TradeClient](cmd/tradeclient/README.md) is a simple console based trading client +* [Executor](cmd/executor/README.md) is a server that fills every limit order it receives +* [OrderMatch](cmd/ordermatch/README.md) is a primitive matching engine All examples have been ported from [QuickFIX](http://quickfixengine.org) -Installation ------------- +## Installation -To build and run the examples, you will first need [Go](http://www.golang.org) installed on your machine (version 1.6+ is *required*). +### Build From Source +To build and run the examples, you will first need [Go](https://www.golang.org) installed on your machine -For local dev first make sure Go is properly installed, including setting up a [GOPATH](http://golang.org/doc/code.html#GOPATH). - -Next, using [Git](https://git-scm.com/), clone this repository into `$GOPATH/src/github.com/quickfixgo/examples`. All the necessary dependencies are either vendored, so you just need to type `make`. This will compile and install the examples into `$GOPATH/bin`. If this exits with exit status 0, then everything is working! +Next, clone this repository with `git clone git@github.com:quickfixgo/examples.git`. This project uses go modules, so you just need to type `make build`. This will compile the examples executables in the `./bin` dir in your local copy of the repo. If this exits with exit status 0, then everything is working! You may need to pull the module deps with `go mod download`. ```sh -$ make +make build ``` -Running the Examples --------------------- +### Running the Examples -Following installation, the examples can be found in `$GOPATH/bin`. The examples are meant to be run in pairs- the TradeClient as a client of either the Executor or OrderMatch. By default, the examples will load the default configurations named after the example apps provided in the `config/` root directory. Eg, running `$GOPATH/bin/tradeclient` will load the `config/tradeclient.cfg` configuration. Each example can be run with a custom configuration as a command line argument (`$GOPATH/bin/tradeclient my_trade_client.cfg`). +Following installation, the examples can be found in `./bin`. The examples are meant to be run in pairs- the TradeClient as a client of either the Executor or OrderMatch. By default, the examples will load the default configurations named after the example apps provided in the `config/` root directory. i.e., running `./bin/tradeclient` will load the `config/tradeclient.cfg` configuration. Each example can be run with a custom configuration as a command line argument (`./bin/tradeclient my_trade_client.cfg`). -Licensing ---------- +### Licensing -This software is available under the QuickFIX Software License. Please see the [LICENSE.txt](https://github.com/quickfixgo/examples/blob/master/LICENSE.txt) for the terms specified by the QuickFIX Software License. +This software is available under the QuickFIX Software License. Please see the [LICENSE](LICENSE) for the terms specified by the QuickFIX Software License. diff --git a/cmd/executor/README.md b/cmd/executor/README.md new file mode 100644 index 0000000..933aa2e --- /dev/null +++ b/cmd/executor/README.md @@ -0,0 +1,39 @@ +# Executor + +## Usage +A config file similar to the example config [here](../../config/executor.cfg) is required to run the executor. +The cli command usage takes the form of + +```sh +executor [CONFIG_PATH_FILENAME] +``` +where CONFIG_PATH_FILENAME defaults to `config/executor.cfg` + +## Example Config Contents +``` +[DEFAULT] +SocketAcceptPort=5001 +SenderCompID=ISLD +TargetCompID=TW +ResetOnLogon=Y +FileLogPath=tmp + +[SESSION] +BeginString=FIX.4.0 + +[SESSION] +BeginString=FIX.4.1 + +[SESSION] +BeginString=FIX.4.2 + +[SESSION] +BeginString=FIX.4.3 + +[SESSION] +BeginString=FIX.4.4 + +[SESSION] +BeginString=FIXT.1.1 +DefaultApplVerID=7 +``` \ No newline at end of file diff --git a/cmd/executor/main.go b/cmd/executor/main.go index f1ea8b1..aa2a8c0 100644 --- a/cmd/executor/main.go +++ b/cmd/executor/main.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "path" + "syscall" "github.com/quickfixgo/enum" "github.com/quickfixgo/field" @@ -59,10 +60,10 @@ func (e *executor) genExecID() field.ExecIDField { } //quickfix.Application interface -func (e executor) OnCreate(sessionID quickfix.SessionID) { return } -func (e executor) OnLogon(sessionID quickfix.SessionID) { return } -func (e executor) OnLogout(sessionID quickfix.SessionID) { return } -func (e executor) ToAdmin(msg *quickfix.Message, sessionID quickfix.SessionID) { return } +func (e executor) OnCreate(sessionID quickfix.SessionID) {} +func (e executor) OnLogon(sessionID quickfix.SessionID) {} +func (e executor) OnLogout(sessionID quickfix.SessionID) {} +func (e executor) ToAdmin(msg *quickfix.Message, sessionID quickfix.SessionID) {} func (e executor) ToApp(msg *quickfix.Message, sessionID quickfix.SessionID) error { return nil } func (e executor) FromAdmin(msg *quickfix.Message, sessionID quickfix.SessionID) quickfix.MessageRejectError { return nil @@ -123,7 +124,10 @@ func (e *executor) OnFIX40NewOrderSingle(msg fix40nos.NewOrderSingle, sessionID } execReport.SetClOrdID(clOrdID) - quickfix.SendToTarget(execReport, sessionID) + sendErr := quickfix.SendToTarget(execReport, sessionID) + if sendErr != nil { + fmt.Println(sendErr) + } return nil } @@ -179,8 +183,10 @@ func (e *executor) OnFIX41NewOrderSingle(msg fix41nos.NewOrderSingle, sessionID } execReport.SetClOrdID(clOrdID) - quickfix.SendToTarget(execReport, sessionID) - + sendErr := quickfix.SendToTarget(execReport, sessionID) + if sendErr != nil { + fmt.Println(sendErr) + } return } @@ -245,7 +251,10 @@ func (e *executor) OnFIX42NewOrderSingle(msg fix42nos.NewOrderSingle, sessionID execReport.SetAccount(acct) } - quickfix.SendToTarget(execReport, sessionID) + sendErr := quickfix.SendToTarget(execReport, sessionID) + if sendErr != nil { + fmt.Println(sendErr) + } return } @@ -309,7 +318,10 @@ func (e *executor) OnFIX43NewOrderSingle(msg fix43nos.NewOrderSingle, sessionID execReport.SetAccount(acct) } - quickfix.SendToTarget(execReport, sessionID) + sendErr := quickfix.SendToTarget(execReport, sessionID) + if sendErr != nil { + fmt.Println(sendErr) + } return } @@ -374,7 +386,10 @@ func (e *executor) OnFIX44NewOrderSingle(msg fix44nos.NewOrderSingle, sessionID execReport.SetAccount(acct) } - quickfix.SendToTarget(execReport, sessionID) + sendErr := quickfix.SendToTarget(execReport, sessionID) + if sendErr != nil { + fmt.Println(sendErr) + } return } @@ -439,7 +454,10 @@ func (e *executor) OnFIX50NewOrderSingle(msg fix50nos.NewOrderSingle, sessionID execReport.SetAccount(acct) } - quickfix.SendToTarget(execReport, sessionID) + sendErr := quickfix.SendToTarget(execReport, sessionID) + if sendErr != nil { + fmt.Println(sendErr) + } return } @@ -479,8 +497,8 @@ func main() { return } - interrupt := make(chan os.Signal) - signal.Notify(interrupt, os.Interrupt, os.Kill) + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) <-interrupt acceptor.Stop() diff --git a/cmd/ordermatch/README.md b/cmd/ordermatch/README.md new file mode 100644 index 0000000..49c998e --- /dev/null +++ b/cmd/ordermatch/README.md @@ -0,0 +1,39 @@ +# Ordermatch + +## Usage +A config file similar to the example config [here](../../config/ordermatch.cfg) is required to run the ordermatch. +The cli command usage takes the form of + +```sh +ordermatch [CONFIG_PATH_FILENAME] +``` +where CONFIG_PATH_FILENAME defaults to `config/ordermatch.cfg` + +## Example Config Contents +``` +[DEFAULT] +SocketAcceptPort=5001 +SenderCompID=ISLD +TargetCompID=TW +ResetOnLogon=Y +FileLogPath=tmp + +[SESSION] +BeginString=FIX.4.0 + +[SESSION] +BeginString=FIX.4.1 + +[SESSION] +BeginString=FIX.4.2 + +[SESSION] +BeginString=FIX.4.3 + +[SESSION] +BeginString=FIX.4.4 + +[SESSION] +BeginString=FIXT.1.1 +DefaultApplVerID=7 +``` \ No newline at end of file diff --git a/cmd/ordermatch/main.go b/cmd/ordermatch/main.go index 4ccf805..5f4f163 100644 --- a/cmd/ordermatch/main.go +++ b/cmd/ordermatch/main.go @@ -8,6 +8,7 @@ import ( "os/signal" "path" "strconv" + "syscall" "github.com/quickfixgo/enum" "github.com/quickfixgo/examples/cmd/ordermatch/internal" @@ -39,16 +40,16 @@ func newApplication() *Application { } //OnCreate implemented as part of Application interface -func (a Application) OnCreate(sessionID quickfix.SessionID) { return } +func (a Application) OnCreate(sessionID quickfix.SessionID) {} //OnLogon implemented as part of Application interface -func (a Application) OnLogon(sessionID quickfix.SessionID) { return } +func (a Application) OnLogon(sessionID quickfix.SessionID) {} //OnLogout implemented as part of Application interface -func (a Application) OnLogout(sessionID quickfix.SessionID) { return } +func (a Application) OnLogout(sessionID quickfix.SessionID) {} //ToAdmin implemented as part of Application interface -func (a Application) ToAdmin(msg *quickfix.Message, sessionID quickfix.SessionID) { return } +func (a Application) ToAdmin(msg *quickfix.Message, sessionID quickfix.SessionID) {} //ToApp implemented as part of Application interface func (a Application) ToApp(msg *quickfix.Message, sessionID quickfix.SessionID) error { @@ -205,7 +206,11 @@ func (a *Application) updateOrder(order internal.Order, status enum.OrdStatus) { execReport.Header.SetTargetCompID(order.SenderCompID) execReport.Header.SetSenderCompID(order.TargetCompID) - quickfix.Send(execReport) + sendErr := quickfix.Send(execReport) + if sendErr != nil { + fmt.Println(sendErr) + } + } func main() { @@ -243,8 +248,8 @@ func main() { return } - interrupt := make(chan os.Signal) - signal.Notify(interrupt, os.Interrupt, os.Kill) + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) go func() { <-interrupt acceptor.Stop() diff --git a/cmd/tradeclient/README.md b/cmd/tradeclient/README.md new file mode 100644 index 0000000..f2a90f4 --- /dev/null +++ b/cmd/tradeclient/README.md @@ -0,0 +1,42 @@ +# Tradeclient + +## Usage +A config file similar to the example config [here](../../config/tradeclient.cfg) is required to run the tradeclient. +The cli command usage takes the form of + +```sh +tradeclient [CONFIG_PATH_FILENAME] +``` +where CONFIG_PATH_FILENAME defaults to `config/tradeclient.cfg` + + +## Example Config Contents +``` +[DEFAULT] +SocketConnectHost=127.0.0.1 +SocketConnectPort=5001 +HeartBtInt=30 +SenderCompID=TW +TargetCompID=ISLD +ResetOnLogon=Y +FileLogPath=tmp + +[SESSION] +BeginString=FIX.4.0 + +[SESSION] +BeginString=FIX.4.1 + +[SESSION] +BeginString=FIX.4.2 + +[SESSION] +BeginString=FIX.4.3 + +[SESSION] +BeginString=FIX.4.4 + +[SESSION] +BeginString=FIXT.1.1 +DefaultApplVerID=7 +``` \ No newline at end of file diff --git a/cmd/tradeclient/main.go b/cmd/tradeclient/main.go index d1941b0..4fedac9 100644 --- a/cmd/tradeclient/main.go +++ b/cmd/tradeclient/main.go @@ -15,29 +15,21 @@ type TradeClient struct { } //OnCreate implemented as part of Application interface -func (e TradeClient) OnCreate(sessionID quickfix.SessionID) { - return -} +func (e TradeClient) OnCreate(sessionID quickfix.SessionID) {} //OnLogon implemented as part of Application interface -func (e TradeClient) OnLogon(sessionID quickfix.SessionID) { - return -} +func (e TradeClient) OnLogon(sessionID quickfix.SessionID) {} //OnLogout implemented as part of Application interface -func (e TradeClient) OnLogout(sessionID quickfix.SessionID) { - return -} +func (e TradeClient) OnLogout(sessionID quickfix.SessionID) {} //FromAdmin implemented as part of Application interface func (e TradeClient) FromAdmin(msg *quickfix.Message, sessionID quickfix.SessionID) (reject quickfix.MessageRejectError) { - return + return nil } //ToAdmin implemented as part of Application interface -func (e TradeClient) ToAdmin(msg *quickfix.Message, sessionID quickfix.SessionID) { - return -} +func (e TradeClient) ToAdmin(msg *quickfix.Message, sessionID quickfix.SessionID) {} //ToApp implemented as part of Application interface func (e TradeClient) ToApp(msg *quickfix.Message, sessionID quickfix.SessionID) (err error) { @@ -85,7 +77,11 @@ func main() { return } - initiator.Start() + err = initiator.Start() + if err != nil { + fmt.Printf("Unable to start Initiator: %s\n", err) + return + } Loop: for { diff --git a/go.mod b/go.mod index f63fd63..6f30062 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.13 require ( github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 // indirect - github.com/kr/pretty v0.1.0 // indirect - github.com/mattn/go-sqlite3 v1.11.0 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/mattn/go-sqlite3 v1.14.7 // indirect github.com/quickfixgo/enum v0.0.0-20171007195659-2cbed3730c3e github.com/quickfixgo/field v0.0.0-20171007195410-74cea5ec78c7 github.com/quickfixgo/fix40 v0.0.0-20171007200002-cce875b2c2e7 @@ -17,8 +17,10 @@ require ( github.com/quickfixgo/fixt11 v0.0.0-20171007213433-d9788ca97f5d // indirect github.com/quickfixgo/quickfix v0.6.1-0.20190718201950-819c58d51b95 github.com/quickfixgo/tag v0.0.0-20171007194743-cbb465760521 - github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 - github.com/stretchr/testify v1.4.0 // indirect - golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 // indirect - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect + github.com/shopspring/decimal v1.2.0 + github.com/stretchr/objx v0.3.0 // indirect + github.com/stretchr/testify v1.7.0 // indirect + golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/go.sum b/go.sum index acbcfa3..827d5a7 100644 --- a/go.sum +++ b/go.sum @@ -1,14 +1,17 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA= +github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/quickfixgo/enum v0.0.0-20171007195659-2cbed3730c3e h1:wRd/InvIlulM/I/0banUdkKp1G9IO9GXomKr0BVofGI= @@ -33,19 +36,24 @@ github.com/quickfixgo/quickfix v0.6.1-0.20190718201950-819c58d51b95 h1:csOsA0SML github.com/quickfixgo/quickfix v0.6.1-0.20190718201950-819c58d51b95/go.mod h1:RuN5MIPnzolPNDYibgBXHhgMoTEjjPzcCN3rLFcODS4= github.com/quickfixgo/tag v0.0.0-20171007194743-cbb465760521 h1:RXfjXtjvXb4wgzBHTTFbyW5uBP04Nrlky9e9lAe8mIE= github.com/quickfixgo/tag v0.0.0-20171007194743-cbb465760521/go.mod h1:EKAI2kkSaIuSywW0WbIgXIcuA9vS4IXfCga9U9Oax2E= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=