예제 #1
0
        public void Serialize(ref MessagePackWriter writer, IAccountStateDelta value,
                              MessagePackSerializerOptions options)
        {
            var state = new Dictionary(
                value.UpdatedAddresses.Select(addr => new KeyValuePair <IKey, IValue>(
                                                  (Binary)addr.ToByteArray(),
                                                  value.GetState(addr) ?? new Bencodex.Types.Null()
                                                  ))
                );
            var balance = new Bencodex.Types.List(
#pragma warning disable LAA1002
                value.UpdatedFungibleAssets.SelectMany(ua =>
#pragma warning restore LAA1002
                                                       ua.Value.Select(c =>
            {
                FungibleAssetValue b = value.GetBalance(ua.Key, c);
                return(new Bencodex.Types.Dictionary(new[]
                {
                    new KeyValuePair <IKey, IValue>((Text)"address", (Binary)ua.Key.ToByteArray()),
                    new KeyValuePair <IKey, IValue>((Text)"currency", CurrencyExtensions.Serialize(c)),
                    new KeyValuePair <IKey, IValue>((Text)"amount", (Integer)b.RawValue),
                }));
            }
                                                                       )
                                                       ).Cast <IValue>()
                );

            var bdict = new Dictionary(new[]
            {
                new KeyValuePair <IKey, IValue>((Text)"states", state),
                new KeyValuePair <IKey, IValue>((Text)"balances", balance),
            });

            writer.Write(new Codec().Encode(bdict));
        }
예제 #2
0
        public override void LoadPlainValue(IValue plainValue)
        {
            var asDict = (Dictionary)plainValue;

            Sender    = asDict["sender"].ToAddress();
            Recipient = asDict["recipient"].ToAddress();
            Amount    = asDict["amount"].ToBigInteger();
            Currency  = CurrencyExtensions.Deserialize((Dictionary)asDict["currency"]);
        }
        public UnaryResult <byte[]> GetBalance(byte[] addressBytes, byte[] currencyBytes)
        {
            var        address            = new Address(addressBytes);
            var        serializedCurrency = (Bencodex.Types.Dictionary)_codec.Decode(currencyBytes);
            Currency   currency           = CurrencyExtensions.Deserialize(serializedCurrency);
            BigInteger balance            = _blockChain.GetBalance(address, currency);

            byte[] encoded = _codec.Encode((Bencodex.Types.Integer)balance);
            return(UnaryResult(encoded));
        }
예제 #4
0
        public override IValue Serialize()
        {
            var values = new Dictionary <IKey, IValue>
            {
                [(Text)"currency"] = CurrencyExtensions.Serialize(Currency)
            };

#pragma warning disable LAA1002
            return(new Dictionary(values.Union((Dictionary)base.Serialize())));

#pragma warning restore LAA1002
        }
예제 #5
0
        public async Task <IWriterResult> CreateAddressBook(string userId, AddressBookModel model)
        {
            try
            {
                var address = model.Address;
                if (model.AddressType == AddressType.Message || model.AddressType == AddressType.PayloadId || model.AddressType == AddressType.PaymentId)
                {
                    address = $"{model.Address}:{model.PaymentId ?? string.Empty}";
                }

                if (model.CurrencyId == Constant.NZDT_ID && !string.IsNullOrEmpty(model.BankAccount))
                {
                    address = $"{model.BankAccount}:{model.BankReference ?? string.Empty}";
                    if (!Constant.NZDT_BANK_REGEX.IsMatch(address))
                    {
                        return(new WriterResult(false, "Invalid Bank Account Number"));
                    }
                }

                if (model.AddressType == AddressType.PaymentId && !CurrencyExtensions.IsValidPaymentId(model.PaymentId))
                {
                    return(new WriterResult(false, "Invalid {0} PaymentId", model.Symbol));
                }

                if (!await DepositService.ValidateAddress(model.CurrencyId, address).ConfigureAwait(false))
                {
                    return(new WriterResult(false, "Invalid {0} Address", model.Symbol));
                }

                using (var context = ExchangeDataContextFactory.CreateContext())
                {
                    var currentUser = new Guid(userId);
                    var addressBook = new Entity.AddressBook
                    {
                        Address    = address,
                        CurrencyId = model.CurrencyId,
                        IsEnabled  = true,
                        Label      = model.Label,
                        UserId     = currentUser,
                    };
                    context.AddressBook.Add(addressBook);
                    await context.SaveChangesAsync().ConfigureAwait(false);

                    return(new WriterResult(true));
                }
            }
            catch (Exception)
            {
                return(new WriterResult(false, "Failed to validate {0} Address", model.Symbol));
            }
        }
예제 #6
0
        public FungibleAssetValue GetBalance(Address address, Currency currency)
        {
            var result = _service.GetBalance(
                address.ToByteArray(),
                _codec.Encode(currency.Serialize())
                );

            byte[] raw        = result.ResponseAsync.Result;
            var    serialized = (Bencodex.Types.List)_codec.Decode(raw);

            return(FungibleAssetValue.FromRawValue(
                       CurrencyExtensions.Deserialize((Bencodex.Types.Dictionary)serialized.ElementAt(0)),
                       serialized.ElementAt(1).ToBigInteger()));
        }
예제 #7
0
        public UnaryResult <byte[]> GetBalance(byte[] addressBytes, byte[] currencyBytes)
        {
            var                address            = new Address(addressBytes);
            var                serializedCurrency = (Bencodex.Types.Dictionary)_codec.Decode(currencyBytes);
            Currency           currency           = CurrencyExtensions.Deserialize(serializedCurrency);
            FungibleAssetValue balance            = _blockChain.GetBalance(address, currency);

            byte[] encoded = _codec.Encode(
                new Bencodex.Types.List(
                    new IValue[]
            {
                balance.Currency.Serialize(),
                (Integer)balance.RawValue,
            }
                    )
                );
            return(UnaryResult(encoded));
        }
        public IActionResult ConvertCurrency([FromBody] ConversionDto requestedConversion)
        {
            if (requestedConversion == null)
            {
                return(BadRequest());
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var exchangeRate = _currencyConverterRepo
                               .GetRate(requestedConversion.FromCurrencyId, requestedConversion.ToCurrencyId);
            var result = CurrencyExtensions.Convert(exchangeRate.Ratio, requestedConversion.Amount);

            return(Ok(result));
        }
        public async Task <ActionResult> Create(WithdrawCurrencyModel model)
        {
            var currencyData = await CurrencyReader.GetCurrency(model.Symbol);

            var user = await UserManager.FindValidByIdAsync(User.Identity.GetUserId());

            if (currencyData == null || user == null)
            {
                ViewBag.Message = $"Currency {model.Symbol} not found.";
                return(View("Error"));
            }

            if (currencyData.CurrencyId == Constant.NZDT_ID && !UserVerificationReader.IsVerified(user.VerificationLevel))
            {
                return(View("NotVerified"));
            }

            // Verify Address
            var address = model.AddressData?.Trim();

            if (string.IsNullOrEmpty(address))
            {
                address = model.SelectedAddress;
            }
            else if (currencyData.AddressType != AddressType.Standard)
            {
                if (currencyData.AddressType == AddressType.PaymentId && !CurrencyExtensions.IsValidPaymentId(model.AddressData2?.Trim()))
                {
                    ModelState.AddModelError("AddressData2", $"Please enter a valid Cryptonote PaymentId.");
                    return(View(await CreateWithdrawModel(user, model)));
                }
                address = $"{model.AddressData?.Trim()}:{model.AddressData2?.Trim()}";
                if (currencyData.Type == CurrencyType.Fiat)
                {
                    address = address.TrimEnd(':');
                }
            }
            if (string.IsNullOrEmpty(address))
            {
                ModelState.AddModelError(user.IsUnsafeWithdrawEnabled ? "AddressData" : "AddressBookError", $"Please enter a valid {model.Symbol} address");
                return(View(await CreateWithdrawModel(user, model)));
            }

            // Verify Amount
            var withdrawAmount = decimal.Round(model.Amount, currencyData.CurrencyDecimals);

            if (withdrawAmount < currencyData.WithdrawMin || withdrawAmount >= currencyData.WithdrawMax)
            {
                ModelState.AddModelError("Amount", $"Withdrawal amount must be between {currencyData.WithdrawMin} {currencyData.Symbol} and {currencyData.WithdrawMax} {currencyData.Symbol}");
                return(View(await CreateWithdrawModel(user, model)));
            }

            // Verify Two Factor
            if (!await UserManager.VerifyUserTwoFactorCodeAsync(TwoFactorComponent.Withdraw, user.Id, model.Code1, model.Code2))
            {
                ModelState.AddModelError("TwoFactorError", "The TFA code entered was incorrect or has expired, please try again.");
                return(View(await CreateWithdrawModel(user, model)));
            }

            // Create withdraw

            var twoFactortoken = await GenerateUserTwoFactorTokenAsync(TwoFactorTokenType.WithdrawConfirm, user.Id);

            var result = await WithdrawWriter.CreateWithdraw(User.Identity.GetUserId(), new CreateWithdrawModel
            {
                Address        = address,
                Amount         = withdrawAmount,
                CurrencyId     = model.CurrencyId,
                TwoFactorToken = twoFactortoken,
                Type           = WithdrawType.Normal,
            });

            if (!result.Success)
            {
                ModelState.AddModelError("Error", result.Message);
                return(View(await CreateWithdrawModel(user, model)));
            }

            // Send Confirmation email
            if (!user.DisableWithdrawEmailConfirmation)
            {
                await SendConfirmationEmail(user, model.Symbol, withdrawAmount - model.Fee, address, result.Result, twoFactortoken, currencyData.AddressType);
            }

            return(RedirectToAction("Summary", new { withdrawId = result.Result, returnUrl = GetLocalReturnUrl(model.ReturnUrl) }));
        }
예제 #10
0
 public static IValue Serialize(this FungibleAssetValue value) =>
 new Bencodex.Types.List(new IValue[]
 {
     CurrencyExtensions.Serialize(value.Currency),
     value.RawValue.Serialize(),
 });
예제 #11
0
 public GoldCurrencyState(Dictionary serialized)
     : base(serialized)
 {
     Currency = CurrencyExtensions.Deserialize((Dictionary)serialized["currency"]);
 }