mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-29 15:10:37 +00:00
Withdraw additional functionality (validation/submission/tracking) (#409)
* reworked request struct and exchange response started work on validation system * removed import cycle until work around * Added intial withdraw support via CLI added * Added Crypto command to gctcli * moved var declartion to single line * Test updates for binance and anx * All exchange tests have been updated test coverage added to validate * First pass at adding withdrawl select from database * started adding basic lru cache system * Added basic LRU cache including Add Get Remove Contains ContainsOrAdd Clear * wording changes on comments * removed exported var's in strut as they are not required * Added README * README updates * corrected ID on commands * rm line :D * merged in origin/cache * linter fixes (gofmt) * Added basic cache lookup to events * swapped to mutex over rwmutex updated comments * unexported getNewest & getOldest * unexported getNewest & getOldest * Updated comments and cited references in source * updated comments * WIP * Migrated exchange WithdrawFiat wrapper to new struct response * Migrated exchange WithdrawFiat wrapper to new struct response * started work on bank management * Added exchange level banking details back with migration to banking package * Removed broken tests for now * Added validation to bank accounts * removed duplicate bank details from withdraw struct * Test coverage increased * gofmt * merged upstream/master with clean up * First pass at adding command line linking to gctcli * added validation for crypto address, added gctcli support to retreive previous withdrawal requests * general cleanup * general cleanup * reordered imports * Increased test coverage moved to database sublogger * Pass incorrect currency no longer return error from c.CheckBankAccountConfig * remove TestMain() for now as other tests in this package will need to be reworked * Happy little race car * Reverted to upstream tests * Added test covarege for validation method, corrected response on cli protobuf * query clean up and removal of duplicated code * cleaned up queries into singlem ethod increased test coverage * Migrated international fund withdraw to new exchange response and added cache size override * Migrated international fund withdraw to new exchange response and added cache size override * Extended gctcli commands * lowered default cache to 25 * small code clean up * added get by date method * add returned error * cli commands cleaing return error on nil results to fix out of bounds * merged write & read helpers into one for test coverage and increased engine/withdraw test coverage * gofmt * Added test coverage for valid ID * removed unused param * converted to use timestamp package from protobuf * gofmt * use built in RFC3339 timestamp * remove setting of CreatedAt & UpdatedAt and allow ORm to take care of it * also use ptype on byid * code flow improvements * remove inverse conditional check and linters run * removed test data * removed comment * removed comment * also write failures to database for auditing * converted to use default time for start & end * Default to time.Now() minus 30 days * Default to time.Now() minus 30 days * small code clean up * fixed missing semicolon on migrations, code clean up * updated sqlite migrations * Added additonal check for exchange level bank account if global is not found * case sensativity fix for currency names * use correct compare * test coverage fixed * removed space * return pointer to banking.Account * return pointer to banking.Account * added else check back to validate() * Added empty string as default to migration over NULL due to retrivial of data
This commit is contained in:
@@ -14,6 +14,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
grpcauth "github.com/grpc-ecosystem/go-grpc-middleware/auth"
|
||||
grpcruntime "github.com/grpc-ecosystem/grpc-gateway/runtime"
|
||||
"github.com/thrasher-corp/gocryptotrader/common"
|
||||
@@ -21,6 +22,7 @@ import (
|
||||
"github.com/thrasher-corp/gocryptotrader/common/file"
|
||||
"github.com/thrasher-corp/gocryptotrader/common/file/archive"
|
||||
"github.com/thrasher-corp/gocryptotrader/currency"
|
||||
"github.com/thrasher-corp/gocryptotrader/database"
|
||||
"github.com/thrasher-corp/gocryptotrader/database/models/postgres"
|
||||
"github.com/thrasher-corp/gocryptotrader/database/models/sqlite3"
|
||||
"github.com/thrasher-corp/gocryptotrader/database/repository/audit"
|
||||
@@ -34,6 +36,8 @@ import (
|
||||
gctscript "github.com/thrasher-corp/gocryptotrader/gctscript/vm"
|
||||
"github.com/thrasher-corp/gocryptotrader/log"
|
||||
"github.com/thrasher-corp/gocryptotrader/portfolio"
|
||||
"github.com/thrasher-corp/gocryptotrader/portfolio/banking"
|
||||
"github.com/thrasher-corp/gocryptotrader/portfolio/withdraw"
|
||||
"github.com/thrasher-corp/gocryptotrader/utils"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials"
|
||||
@@ -637,6 +641,9 @@ func (s *RPCServer) GetPortfolioSummary(ctx context.Context, r *gctrpc.GetPortfo
|
||||
// AddPortfolioAddress adds an address to the portfolio manager
|
||||
func (s *RPCServer) AddPortfolioAddress(ctx context.Context, r *gctrpc.AddPortfolioAddressRequest) (*gctrpc.AddPortfolioAddressResponse, error) {
|
||||
err := Bot.Portfolio.AddAddress(r.Address, r.Description, currency.NewCode(r.CoinType), r.Balance)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &gctrpc.AddPortfolioAddressResponse{}, err
|
||||
}
|
||||
|
||||
@@ -924,13 +931,172 @@ func (s *RPCServer) GetCryptocurrencyDepositAddress(ctx context.Context, r *gctr
|
||||
|
||||
// WithdrawCryptocurrencyFunds withdraws cryptocurrency funds specified by
|
||||
// exchange
|
||||
func (s *RPCServer) WithdrawCryptocurrencyFunds(ctx context.Context, r *gctrpc.WithdrawCurrencyRequest) (*gctrpc.WithdrawResponse, error) {
|
||||
return &gctrpc.WithdrawResponse{}, common.ErrNotYetImplemented
|
||||
func (s *RPCServer) WithdrawCryptocurrencyFunds(ctx context.Context, r *gctrpc.WithdrawCryptoRequest) (*gctrpc.WithdrawResponse, error) {
|
||||
exch := GetExchangeByName(r.Exchange)
|
||||
if exch == nil {
|
||||
return nil, errors.New("exchange is not loaded/doesn't exist")
|
||||
}
|
||||
|
||||
request := &withdraw.Request{
|
||||
Amount: r.Amount,
|
||||
Currency: currency.NewCode(strings.ToUpper(r.Currency)),
|
||||
Type: withdraw.Crypto,
|
||||
Description: r.Description,
|
||||
Crypto: &withdraw.CryptoRequest{
|
||||
Address: r.Address,
|
||||
AddressTag: r.AddressTag,
|
||||
FeeAmount: r.Fee,
|
||||
},
|
||||
}
|
||||
|
||||
resp, err := SubmitWithdrawal(r.Exchange, request)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &gctrpc.WithdrawResponse{
|
||||
Id: resp.ID.String(),
|
||||
Status: resp.Exchange.Status,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// WithdrawFiatFunds withdraws fiat funds specified by exchange
|
||||
func (s *RPCServer) WithdrawFiatFunds(ctx context.Context, r *gctrpc.WithdrawCurrencyRequest) (*gctrpc.WithdrawResponse, error) {
|
||||
return &gctrpc.WithdrawResponse{}, common.ErrNotYetImplemented
|
||||
func (s *RPCServer) WithdrawFiatFunds(ctx context.Context, r *gctrpc.WithdrawFiatRequest) (*gctrpc.WithdrawResponse, error) {
|
||||
exch := GetExchangeByName(r.Exchange)
|
||||
if exch == nil {
|
||||
return nil, errors.New("exchange is not loaded/doesn't exist")
|
||||
}
|
||||
|
||||
var bankAccount *banking.Account
|
||||
|
||||
bankAccount, err := banking.GetBankAccountByID(r.BankAccountId)
|
||||
if err != nil {
|
||||
bankAccount, err = exch.GetBase().GetExchangeBankAccounts(r.BankAccountId, r.Currency)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
request := &withdraw.Request{
|
||||
Amount: r.Amount,
|
||||
Currency: currency.NewCode(strings.ToUpper(r.Currency)),
|
||||
Type: withdraw.Fiat,
|
||||
Description: r.Description,
|
||||
Fiat: &withdraw.FiatRequest{
|
||||
Bank: bankAccount,
|
||||
},
|
||||
}
|
||||
resp, err := SubmitWithdrawal(r.Exchange, request)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &gctrpc.WithdrawResponse{
|
||||
Id: resp.ID.String(),
|
||||
Status: resp.Exchange.Status,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// WithdrawalEventByID returns previous withdrawal request details
|
||||
func (s *RPCServer) WithdrawalEventByID(ctx context.Context, r *gctrpc.WithdrawalEventByIDRequest) (*gctrpc.WithdrawalEventByIDResponse, error) {
|
||||
if !Bot.Config.Database.Enabled {
|
||||
return nil, database.ErrDatabaseSupportDisabled
|
||||
}
|
||||
v, err := WithdrawalEventByID(r.Id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp := &gctrpc.WithdrawalEventByIDResponse{
|
||||
Event: &gctrpc.WithdrawalEventResponse{
|
||||
Id: v.ID.String(),
|
||||
Exchange: &gctrpc.WithdrawlExchangeEvent{
|
||||
Name: v.Exchange.Name,
|
||||
Id: v.Exchange.Name,
|
||||
Status: v.Exchange.Status,
|
||||
},
|
||||
Request: &gctrpc.WithdrawalRequestEvent{
|
||||
Currency: v.RequestDetails.Currency.String(),
|
||||
Description: v.RequestDetails.Description,
|
||||
Amount: v.RequestDetails.Amount,
|
||||
Type: int32(v.RequestDetails.Type),
|
||||
},
|
||||
},
|
||||
}
|
||||
createdAtPtype, err := ptypes.TimestampProto(v.CreatedAt)
|
||||
if err != nil {
|
||||
log.Errorf(log.Global, "failed to convert time: %v", err)
|
||||
}
|
||||
resp.Event.CreatedAt = createdAtPtype
|
||||
|
||||
updatedAtPtype, err := ptypes.TimestampProto(v.UpdatedAt)
|
||||
if err != nil {
|
||||
log.Errorf(log.Global, "failed to convert time: %v", err)
|
||||
}
|
||||
resp.Event.UpdatedAt = updatedAtPtype
|
||||
|
||||
if v.RequestDetails.Type == withdraw.Crypto {
|
||||
resp.Event.Request.Crypto = new(gctrpc.CryptoWithdrawalEvent)
|
||||
resp.Event.Request.Crypto = &gctrpc.CryptoWithdrawalEvent{
|
||||
Address: v.RequestDetails.Crypto.Address,
|
||||
AddressTag: v.RequestDetails.Crypto.AddressTag,
|
||||
Fee: v.RequestDetails.Crypto.FeeAmount,
|
||||
}
|
||||
} else if v.RequestDetails.Type == withdraw.Fiat {
|
||||
if v.RequestDetails.Fiat != nil {
|
||||
resp.Event.Request.Fiat = new(gctrpc.FiatWithdrawalEvent)
|
||||
resp.Event.Request.Fiat = &gctrpc.FiatWithdrawalEvent{
|
||||
BankName: v.RequestDetails.Fiat.Bank.BankName,
|
||||
AccountName: v.RequestDetails.Fiat.Bank.AccountName,
|
||||
AccountNumber: v.RequestDetails.Fiat.Bank.AccountNumber,
|
||||
Bsb: v.RequestDetails.Fiat.Bank.BSBNumber,
|
||||
Swift: v.RequestDetails.Fiat.Bank.SWIFTCode,
|
||||
Iban: v.RequestDetails.Fiat.Bank.IBAN,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
// WithdrawalEventsByExchange returns previous withdrawal request details by exchange
|
||||
func (s *RPCServer) WithdrawalEventsByExchange(ctx context.Context, r *gctrpc.WithdrawalEventsByExchangeRequest) (*gctrpc.WithdrawalEventsByExchangeResponse, error) {
|
||||
if !Bot.Config.Database.Enabled {
|
||||
return nil, database.ErrDatabaseSupportDisabled
|
||||
}
|
||||
if r.Id == "" {
|
||||
ret, err := WithdrawalEventByExchange(r.Exchange, int(r.Limit))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return parseMultipleEvents(ret), nil
|
||||
}
|
||||
|
||||
ret, err := WithdrawalEventByExchangeID(r.Exchange, r.Id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return parseSingleEvents(ret), nil
|
||||
}
|
||||
|
||||
// WithdrawalEventsByDate returns previous withdrawal request details by exchange
|
||||
func (s *RPCServer) WithdrawalEventsByDate(ctx context.Context, r *gctrpc.WithdrawalEventsByDateRequest) (*gctrpc.WithdrawalEventsByExchangeResponse, error) {
|
||||
UTCStartTime, err := time.Parse(audit.TableTimeFormat, r.Start)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
UTCSEndTime, err := time.Parse(audit.TableTimeFormat, r.End)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ret, err := WithdrawEventByDate(r.Exchange, UTCStartTime, UTCSEndTime, int(r.Limit))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return parseMultipleEvents(ret), nil
|
||||
}
|
||||
|
||||
// GetLoggerDetails returns a loggers details
|
||||
|
||||
Reference in New Issue
Block a user