/// <summary> Gets bitshares address from bitcoin deposit. </summary> /// /// <remarks> Paul, 25/01/2015. </remarks> /// /// <param name="t"> The TransactionSinceBlock to process. </param> /// /// <returns> The bitshares address from bitcoin deposit. </returns> protected override AddressOrAccountName GetBitsharesAddressFromBitcoinDeposit(TransactionSinceBlock t) { // look up the deposit address in our map of sender->deposit SenderToDepositRow senderToDeposit = GetSenderDepositFromDeposit(t.Address); if (senderToDeposit != null) { return(new AddressOrAccountName { m_text = senderToDeposit.receiving_address, m_isAddress = false }); } else { return(null); } }
/// <summary> Bitshares transaction to bitcoin address. </summary> /// /// <remarks> Paul, 31/01/2015. </remarks> /// /// <param name="l"> The BitsharesLedgerEntry to process. </param> /// <param name="t"> The TransactionSinceBlock to process. </param> /// /// <returns> A string. </returns> /*protected override string BitsharesTransactionToBitcoinAddress(BitsharesLedgerEntry l, BitsharesTransaction t) * { * // look up the BTS address this transaction was sent to * BitsharesOperation op = t.trx.operations.First(o => o.type == BitsharesTransactionOp.deposit_op_type); * * string depositAddress = op.data.condition.data.owner; * * // look that address up in our map of sender->deposit address * SenderToDepositRow senderToDeposit = GetSenderDepositFromDeposit(depositAddress); * if (senderToDeposit != null) * { * return senderToDeposit.sender; * } * else * { * return null; * } * }*/ /// <summary> Bitshares transaction to bitcoin address. </summary> /// /// <remarks> Paul, 31/01/2015. </remarks> /// /// <param name="l"> The BitsharesLedgerEntry to process. </param> /// <param name="t"> The TransactionSinceBlock to process. </param> /// /// <returns> A string. </returns> protected override string BitsharesTransactionToBitcoinAddress(BitsharesLedgerEntry l, BitsharesTransaction t) { // look up the BTS address this transaction was sent to // look that address up in our map of sender->deposit address SenderToDepositRow senderToDeposit = GetSenderDepositFromDeposit(l.memo); if (senderToDeposit != null) { return(senderToDeposit.receiving_address); } else { throw new RefundBitsharesException("Missing memo!"); } }
/// <summary> Executes the submit address action. </summary> /// /// <remarks> Paul, 25/01/2015. </remarks> /// /// <exception cref="ApiExceptionMessage"> Thrown when an API exception message error /// condition occurs. </exception> /// <exception cref="ApiExceptionMissingParameter"> Thrown when an API exception missing /// parameter error condition occurs. </exception> /// /// <param name="ctx"> The context. </param> /// <param name="dummy"> The dummy. </param> /// /// <returns> A Task. </returns> Task OnSubmitAddress(RequestContext ctx, IDummy dummy) { CurrencyTypes fromCurrency = RestHelpers.GetPostArg <CurrencyTypes, ApiExceptionMissingParameter>(ctx, WebForms.kFromCurrency); CurrencyTypes toCurrency = RestHelpers.GetPostArg <CurrencyTypes, ApiExceptionMissingParameter>(ctx, WebForms.kToCurrency); string receivingAddress = RestHelpers.GetPostArg <string, ApiExceptionMissingParameter>(ctx, WebForms.kReceivingAddress); SubmitAddressResponse response; if (fromCurrency == CurrencyTypes.BTC && toCurrency == CurrencyTypes.bitBTC) { string accountName = receivingAddress; // try and retrieve a previous entry SenderToDepositRow senderToDeposit = m_database.Query <SenderToDepositRow>("SELECT * FROM sender_to_deposit WHERE receiving_address=@s;", accountName).FirstOrDefault(); if (senderToDeposit == null || !BitsharesWallet.IsValidAccountName(accountName)) { // no dice, create a new entry // validate bitshares account name try { BitsharesAccount account = m_bitshares.WalletGetAccount(accountName); // generate a new bitcoin address and tie it to this account string depositAdress = m_bitcoin.GetNewAddress(); senderToDeposit = InsertSenderToDeposit(account.name, depositAdress); } catch (BitsharesRpcException) { throw new ApiExceptionMessage(accountName + " is not an existing account! Are you sure it is registered?"); } } response = new SubmitAddressResponse { deposit_address = senderToDeposit.deposit_address }; } else if (fromCurrency == CurrencyTypes.bitBTC && toCurrency == CurrencyTypes.BTC) { string bitcoinAddress = receivingAddress; // try and retrieve a previous entry SenderToDepositRow senderToDeposit = m_database.Query <SenderToDepositRow>("SELECT * FROM sender_to_deposit WHERE receiving_address=@s;", bitcoinAddress).FirstOrDefault(); if (senderToDeposit == null) { // validate bitcoin address byte[] check = Util.Base58CheckToByteArray(bitcoinAddress); if (check == null) { throw new ApiExceptionMessage(bitcoinAddress + " is not a valid bitcoin address!"); } // generate a memo field to use instead string start = "meta-"; string memo = start + bitcoinAddress.Substring(0, BitsharesWallet.kBitsharesMaxMemoLength - start.Length); senderToDeposit = InsertSenderToDeposit(bitcoinAddress, memo); } response = new SubmitAddressResponse { deposit_address = m_bitsharesAccount, memo = senderToDeposit.deposit_address }; } else { throw new ApiExceptionUnsupportedTrade(fromCurrency, toCurrency); } ctx.Respond <SubmitAddressResponse>(response); return(null); }