mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-20 23:16:49 +00:00
* Remove pointer reference * Fix portfolio withdraw tests * Add nil protection in validator method to reduce prospective panics and for future outbound checking * Updated tests * ch order var to not ref package * rm comparison * Add order ID validation check * Add exchange name validation check * Add in test details * fix tests * fix linter issues * linter issues strikes again * linter rabbit hole * Addr nitterinos * Add validation variadic interface to define sets of functionality check POC * didn't want to add an amount other than 0, didn't want to add address to exchange withdraw, didn't want to whitlist, can change if need be * add coverage * Add validation method options for exchange wrappers and abstracted validation into its own package * Add validation code for structs in exchange template generation * remove extra validation call as this is done in wrapper * fix niterinos for examplerinos * Add template to documentation tool and regenerated documentation * Addr niticles * Fix tests due to validation update * Add more validation checks for modify/submit orders * update tests * fix more tests * Add asset type to submit variable in tests and rpc call. Regen funcs. * Add field to modify struct in tests * applied field asset to cancel struct across project * fix woopsy
90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
package withdraw
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
"github.com/thrasher-corp/gocryptotrader/currency"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/validate"
|
|
"github.com/thrasher-corp/gocryptotrader/portfolio"
|
|
)
|
|
|
|
// Validate takes interface and passes to asset type to check the request meets requirements to submit
|
|
func (r *Request) Validate(opt ...validate.Checker) (err error) {
|
|
if r == nil {
|
|
return ErrRequestCannotBeNil
|
|
}
|
|
|
|
if r.Exchange == "" {
|
|
return ErrExchangeNameUnset
|
|
}
|
|
|
|
var allErrors []string
|
|
if r.Amount <= 0 {
|
|
allErrors = append(allErrors, ErrStrAmountMustBeGreaterThanZero)
|
|
}
|
|
|
|
if (r.Currency == currency.Code{}) {
|
|
allErrors = append(allErrors, ErrStrNoCurrencySet)
|
|
}
|
|
|
|
switch r.Type {
|
|
case Fiat:
|
|
if (r.Currency != currency.Code{}) && !r.Currency.IsFiatCurrency() {
|
|
allErrors = append(allErrors, ErrStrCurrencyNotFiat)
|
|
}
|
|
allErrors = append(allErrors, validateFiat(r)...)
|
|
case Crypto:
|
|
if (r.Currency != currency.Code{}) && !r.Currency.IsCryptocurrency() {
|
|
allErrors = append(allErrors, ErrStrCurrencyNotCrypto)
|
|
}
|
|
allErrors = append(allErrors, validateCrypto(r)...)
|
|
default:
|
|
allErrors = append(allErrors, "invalid request type")
|
|
}
|
|
|
|
for _, o := range opt {
|
|
if o == nil {
|
|
continue
|
|
}
|
|
err := o.Check()
|
|
if err != nil {
|
|
allErrors = append(allErrors, err.Error())
|
|
}
|
|
}
|
|
|
|
if len(allErrors) > 0 {
|
|
return errors.New(strings.Join(allErrors, ", "))
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// validateFiat takes interface and passes to asset type to check the request meets requirements to submit
|
|
func validateFiat(request *Request) (err []string) {
|
|
errBank := request.Fiat.Bank.ValidateForWithdrawal(request.Exchange, request.Currency)
|
|
if errBank != nil {
|
|
err = append(err, errBank...)
|
|
}
|
|
return err
|
|
}
|
|
|
|
// validateCrypto checks if Crypto request is valid and meets the minimum requirements to submit a crypto withdrawal request
|
|
func validateCrypto(request *Request) (err []string) {
|
|
if !portfolio.IsWhiteListed(request.Crypto.Address) {
|
|
err = append(err, ErrStrAddressNotWhiteListed)
|
|
}
|
|
|
|
if !portfolio.IsExchangeSupported(request.Exchange, request.Crypto.Address) {
|
|
err = append(err, ErrStrExchangeNotSupportedByAddress)
|
|
}
|
|
|
|
if request.Crypto.Address == "" {
|
|
err = append(err, ErrStrAddressNotSet)
|
|
}
|
|
|
|
if request.Crypto.FeeAmount < 0 {
|
|
err = append(err, ErrStrFeeCannotBeNegative)
|
|
}
|
|
return
|
|
}
|