@@ -1018,9 +1018,77 @@ func (cr *Cryptodotcom) GetOrderHistory(ctx context.Context, getOrdersRequest *o
10181018
10191019// GetFeeByType returns an estimate of fee based on the type of transaction
10201020func (cr * Cryptodotcom ) GetFeeByType (ctx context.Context , feeBuilder * exchange.FeeBuilder ) (float64 , error ) {
1021+ if feeBuilder == nil {
1022+ return 0 , fmt .Errorf ("%T %w" , feeBuilder , common .ErrNilPointer )
1023+ }
1024+ if ! cr .AreCredentialsValid (ctx ) && // Todo check connection status
1025+ feeBuilder .FeeType == exchange .CryptocurrencyTradeFee {
1026+ feeBuilder .FeeType = exchange .OfflineTradeFee
1027+ }
1028+
1029+ var fee float64
1030+
1031+ switch feeBuilder .FeeType {
1032+ case exchange .CryptocurrencyTradeFee :
1033+ fee = cr .calculateTradingFee (ctx , feeBuilder ) * feeBuilder .Amount * feeBuilder .PurchasePrice
1034+ case exchange .CryptocurrencyWithdrawalFee :
1035+ switch feeBuilder .Pair .Base {
1036+ case currency .USDT :
1037+ fee = 1.08
1038+ case currency .TUSD :
1039+ fee = 1.09
1040+ case currency .BTC :
1041+ fee = 0.0005
1042+ case currency .ETH :
1043+ fee = 0.01
1044+ case currency .LTC :
1045+ fee = 0.001
1046+ }
1047+ case exchange .InternationalBankDepositFee :
1048+ fee = getInternationalBankDepositFee (feeBuilder .Amount )
1049+ case exchange .InternationalBankWithdrawalFee :
1050+ fee = getInternationalBankWithdrawalFee (feeBuilder .Amount )
1051+ case exchange .OfflineTradeFee :
1052+ fee = getOfflineTradeFee (feeBuilder .PurchasePrice , feeBuilder .Amount )
1053+ }
1054+ return fee , nil
1055+
10211056 return 0 , common .ErrNotYetImplemented
10221057}
10231058
1059+ func (cr * Cryptodotcom ) checkCredentials (ctx context.Context ) bool {
1060+ creds , err := cr .GetCredentials (ctx )
1061+ return err == nil && cr .ValidateAPICredentials (creds ) == nil
1062+ }
1063+
1064+ // getOfflineTradeFee calculates the worst case-scenario trading fee
1065+ func getOfflineTradeFee (price , amount float64 ) float64 {
1066+ return 0.0750 * price * amount
1067+ }
1068+
1069+ // calculateTradingFee return fee based on users current fee tier or default values
1070+ func (b * Cryptodotcom ) calculateTradingFee (ctx context.Context , feeBuilder * exchange.FeeBuilder ) float64 {
1071+ formattedPair , err := b .FormatExchangeCurrency (feeBuilder .Pair , asset .Spot )
1072+ if err != nil {
1073+ if feeBuilder .IsMaker {
1074+ return 0.001
1075+ }
1076+ return 0.002
1077+ }
1078+ feeTiers , err := dy .GetFeeInformation (ctx , formattedPair .String ())
1079+ if err != nil {
1080+ // TODO: Return actual error, we shouldn't pivot around errors.
1081+ if feeBuilder .IsMaker {
1082+ return 0.001
1083+ }
1084+ return 0.002
1085+ }
1086+ if feeBuilder .IsMaker {
1087+ return feeTiers [0 ].MakerFee
1088+ }
1089+ return feeTiers [0 ].TakerFee
1090+ }
1091+
10241092// ValidateCredentials validates current credentials used for wrapper
10251093func (cr * Cryptodotcom ) ValidateCredentials (ctx context.Context , assetType asset.Item ) error {
10261094 _ , err := cr .UpdateAccountInfo (ctx , assetType )
0 commit comments