Exemplo n.º 1
0
        public static OperationMeta Decode(IByteReader stream)
        {
            OperationMeta decodedOperationMeta = new OperationMeta();

            decodedOperationMeta.Changes = LedgerEntryChanges.Decode(stream);
            return(decodedOperationMeta);
        }
Exemplo n.º 2
0
        public static TransactionMeta Decode(XdrDataInputStream stream)
        {
            TransactionMeta decodedTransactionMeta = new TransactionMeta();
            int             discriminant           = stream.ReadInt();

            decodedTransactionMeta.Discriminant = discriminant;

            switch (decodedTransactionMeta.Discriminant)
            {
            case 0:
                int operationssize = stream.ReadInt();
                decodedTransactionMeta.Operations = new OperationMeta[operationssize];

                for (int i = 0; i < operationssize; i++)
                {
                    decodedTransactionMeta.Operations[i] = OperationMeta.Decode(stream);
                }

                break;

            case 1:
                decodedTransactionMeta.V1 = TransactionMetaV1.Decode(stream);
                break;
            }

            return(decodedTransactionMeta);
        }
Exemplo n.º 3
0
        public async Task <Transaction> GetOrBuildTransferTransaction(Guid operationId,
                                                                      BitcoinAddress fromAddress,
                                                                      BitcoinAddress toAddress,
                                                                      string assetId,
                                                                      Money amountToSend,
                                                                      bool includeFee)
        {
            if (await _operationMetaRepository.Exist(operationId))
            {
                var alreadyBuildedTransaction = await _transactionBlobStorage.GetTransaction(operationId, TransactionBlobType.Initial);

                return(Transaction.Parse(alreadyBuildedTransaction));
            }

            var buildedTransaction = await _transactionBuilder.GetTransferTransaction(fromAddress, toAddress, amountToSend, includeFee);

            await _transactionBlobStorage.AddOrReplaceTransaction(operationId, TransactionBlobType.Initial,
                                                                  buildedTransaction.TransactionData.ToHex());

            var operation = OperationMeta.Create(operationId, fromAddress.ToString(), toAddress.ToString(), assetId,
                                                 buildedTransaction.Amount.Satoshi, buildedTransaction.Fee.Satoshi, includeFee);
            await _operationMetaRepository.Insert(operation);

            return(buildedTransaction.TransactionData);
        }
Exemplo n.º 4
0
        public async Task <string> GetOrBuildTransferTransaction(Guid operationId,
                                                                 BitcoinAddress fromAddress,
                                                                 PubKey fromAddressPubkey,
                                                                 BitcoinAddress toAddress,
                                                                 string assetId,
                                                                 Money amountToSend,
                                                                 bool includeFee)
        {
            if (await _operationMetaRepository.Exist(operationId))
            {
                return(await _transactionBlobStorage.GetTransaction(operationId, TransactionBlobType.Initial));
            }

            var buildedTransaction = await _transactionBuilder.GetTransferTransaction(fromAddress, fromAddressPubkey, toAddress, amountToSend, includeFee);

            var transactionContext =
                Serializer.ToString((tx: buildedTransaction.TransactionData, spentCoins: buildedTransaction.SpentCoins));

            await _transactionBlobStorage.AddOrReplaceTransaction(operationId,
                                                                  TransactionBlobType.Initial,
                                                                  transactionContext);

            var operation = OperationMeta.Create(operationId, fromAddress.ToString(), toAddress.ToString(), assetId,
                                                 buildedTransaction.Amount.Satoshi, buildedTransaction.Fee.Satoshi, includeFee);
            await _operationMetaRepository.Insert(operation);

            return(transactionContext);
        }
Exemplo n.º 5
0
        public static OperationMeta Decode(XdrDataInputStream stream)
        {
            var decodedOperationMeta = new OperationMeta();

            decodedOperationMeta.Changes = LedgerEntryChanges.Decode(stream);
            return(decodedOperationMeta);
        }
        public static void Encode(XdrDataOutputStream stream, TransactionMetaV1 encodedTransactionMetaV1)
        {
            LedgerEntryChanges.Encode(stream, encodedTransactionMetaV1.TxChanges);
            int operationssize = encodedTransactionMetaV1.Operations.Length;

            stream.WriteInt(operationssize);
            for (int i = 0; i < operationssize; i++)
            {
                OperationMeta.Encode(stream, encodedTransactionMetaV1.Operations[i]);
            }
        }
Exemplo n.º 7
0
        public Task <ResponseModel> Get()
        {
            OperationMeta meta = null; // this will get value through code-generation

            var httpMethod   = meta.HttpMethod;
            var deserializer = _objectFactory.Get <IDeserializer>(meta.DeserializerType);
            var uri          = _routeProvider.GetUri(meta);
            var request      = new HttpRequestMessage(httpMethod, uri);
            var result       = _requestHandler.HandleAsync <ResponseModel>(request, deserializer);

            return(result);
        }
Exemplo n.º 8
0
        public async Task <BuiltTransactionInfo> GetOrBuildTransferTransaction(Guid operationId,
                                                                               BitcoinAddress fromAddress,
                                                                               PubKey fromAddressPubkey,
                                                                               BitcoinAddress toAddress,
                                                                               string assetId,
                                                                               Money amountToSend,
                                                                               bool includeFee)
        {
            var existingOperation = await _operationMetaRepository.Get(operationId);

            if (existingOperation != null)
            {
                var existingAmount = existingOperation.IncludeFee
                    ? existingOperation.AmountSatoshi + existingOperation.FeeSatoshi
                    : existingOperation.AmountSatoshi;

                if (existingOperation.FromAddress != fromAddress.ToString() ||
                    existingOperation.ToAddress != toAddress.ToString() ||
                    existingOperation.AssetId != assetId ||
                    existingOperation.IncludeFee != includeFee ||
                    existingAmount != amountToSend.Satoshi)
                {
                    throw new BusinessException("Conflict in operation parameters", ErrorCode.Conflict);
                }

                return(await GetExistingTransaction(existingOperation.OperationId, existingOperation.Hash));
            }

            var builtTransaction = await _transactionBuilder.GetTransferTransaction(fromAddress, fromAddressPubkey, toAddress, amountToSend, includeFee);

            var builtTransactionInfo = new BuiltTransactionInfo
            {
                TransactionHex = builtTransaction.TransactionData.ToHex(),
                UsedCoins      = builtTransaction.UsedCoins
            };

            var txHash = builtTransaction.TransactionData.GetHash().ToString();

            await _transactionBlobStorage.AddOrReplaceTransaction(operationId, txHash, TransactionBlobType.Initial, builtTransactionInfo.ToJson(_network));

            var operation = OperationMeta.Create(operationId, txHash, fromAddress.ToString(), toAddress.ToString(), assetId,
                                                 builtTransaction.Amount.Satoshi, builtTransaction.Fee.Satoshi, includeFee);

            if (await _operationMetaRepository.TryInsert(operation))
            {
                return(builtTransactionInfo);
            }

            existingOperation = await _operationMetaRepository.Get(operationId);

            return(await GetExistingTransaction(operationId, existingOperation.Hash));
        }
        public static TransactionMetaV1 Decode(XdrDataInputStream stream)
        {
            TransactionMetaV1 decodedTransactionMetaV1 = new TransactionMetaV1();

            decodedTransactionMetaV1.TxChanges = LedgerEntryChanges.Decode(stream);
            int operationssize = stream.ReadInt();

            decodedTransactionMetaV1.Operations = new OperationMeta[operationssize];
            for (int i = 0; i < operationssize; i++)
            {
                decodedTransactionMetaV1.Operations[i] = OperationMeta.Decode(stream);
            }
            return(decodedTransactionMetaV1);
        }
        public static TransactionMetaV2 Decode(XdrDataInputStream stream)
        {
            TransactionMetaV2 decodedTransactionMetaV2 = new TransactionMetaV2();

            decodedTransactionMetaV2.TxChangesBefore = LedgerEntryChanges.Decode(stream);
            int operationssize = stream.ReadInt();

            decodedTransactionMetaV2.Operations = new OperationMeta[operationssize];
            for (int i = 0; i < operationssize; i++)
            {
                decodedTransactionMetaV2.Operations[i] = OperationMeta.Decode(stream);
            }
            decodedTransactionMetaV2.TxChangesAfter = LedgerEntryChanges.Decode(stream);
            return(decodedTransactionMetaV2);
        }
Exemplo n.º 11
0
 public static void Encode(IByteWriter stream, TransactionMeta encodedTransactionMeta)
 {
     XdrEncoding.EncodeInt32(encodedTransactionMeta.Discriminant, stream);
     switch (encodedTransactionMeta.Discriminant)
     {
     case 0:
         int operationssize = encodedTransactionMeta.Operations.Length;
         XdrEncoding.EncodeInt32(operationssize, stream);
         for (int i = 0; i < operationssize; i++)
         {
             OperationMeta.Encode(stream, encodedTransactionMeta.Operations[i]);
         }
         break;
     }
 }
Exemplo n.º 12
0
 public static void Encode(XdrDataOutputStream stream, TransactionMeta encodedTransactionMeta)
 {
     stream.WriteInt(encodedTransactionMeta.Discriminant);
     switch (encodedTransactionMeta.Discriminant)
     {
     case 0:
         var operationssize = encodedTransactionMeta.Operations.Length;
         stream.WriteInt(operationssize);
         for (var i = 0; i < operationssize; i++)
         {
             OperationMeta.Encode(stream, encodedTransactionMeta.Operations[i]);
         }
         break;
     }
 }
Exemplo n.º 13
0
        public static TransactionMeta Decode(IByteReader stream)
        {
            TransactionMeta decodedTransactionMeta = new TransactionMeta();

            decodedTransactionMeta.Discriminant = XdrEncoding.DecodeInt32(stream);
            switch (decodedTransactionMeta.Discriminant)
            {
            case 0:
                int operationssize = XdrEncoding.DecodeInt32(stream);
                decodedTransactionMeta.Operations = new OperationMeta[operationssize];
                for (int i = 0; i < operationssize; i++)
                {
                    decodedTransactionMeta.Operations[i] = OperationMeta.Decode(stream);
                }
                break;
            }
            return(decodedTransactionMeta);
        }
Exemplo n.º 14
0
        public static TransactionMeta Decode(XdrDataInputStream stream)
        {
            var decodedTransactionMeta = new TransactionMeta();
            var discriminant           = stream.ReadInt();

            decodedTransactionMeta.Discriminant = discriminant;
            switch (decodedTransactionMeta.Discriminant)
            {
            case 0:
                var operationssize = stream.ReadInt();
                decodedTransactionMeta.Operations = new OperationMeta[operationssize];
                for (var i = 0; i < operationssize; i++)
                {
                    decodedTransactionMeta.Operations[i] = OperationMeta.Decode(stream);
                }
                break;
            }
            return(decodedTransactionMeta);
        }
Exemplo n.º 15
0
        public static void Encode(XdrDataOutputStream stream, TransactionMeta encodedTransactionMeta)
        {
            stream.WriteInt((int)encodedTransactionMeta.Discriminant);
            switch (encodedTransactionMeta.Discriminant)
            {
            case 0:
                int operationssize = encodedTransactionMeta.Operations.Length;
                stream.WriteInt(operationssize);
                for (int i = 0; i < operationssize; i++)
                {
                    OperationMeta.Encode(stream, encodedTransactionMeta.Operations[i]);
                }
                break;

            case 1:
                TransactionMetaV1.Encode(stream, encodedTransactionMeta.V1);
                break;

            case 2:
                TransactionMetaV2.Encode(stream, encodedTransactionMeta.V2);
                break;
            }
        }
Exemplo n.º 16
0
 public static void Encode(IByteWriter stream, OperationMeta encodedOperationMeta)
 {
     LedgerEntryChanges.Encode(stream, encodedOperationMeta.Changes);
 }
Exemplo n.º 17
0
 public static OperationMeta Decode(IByteReader stream)
 {
     OperationMeta decodedOperationMeta = new OperationMeta();
     decodedOperationMeta.Changes = LedgerEntryChanges.Decode(stream);
     return decodedOperationMeta;
 }
Exemplo n.º 18
0
 public static void Encode(XdrDataOutputStream stream, OperationMeta encodedOperationMeta)
 {
     LedgerEntryChanges.Encode(stream, encodedOperationMeta.Changes);
 }
Exemplo n.º 19
0
 public static void Encode(IByteWriter stream, OperationMeta encodedOperationMeta)
 {
     LedgerEntryChanges.Encode(stream, encodedOperationMeta.Changes);
 }
Exemplo n.º 20
0
        public async Task <BuiltTransactionInfo> GetOrBuildTransferTransactionAsync(Guid operationId,
                                                                                    IList <OperationInput> inputs,
                                                                                    IList <OperationOutput> outputs,
                                                                                    OperationType operationType,
                                                                                    string assetId,
                                                                                    bool includeFee)
        {
            var existingOperation = await _operationMetaRepository.GetAsync(operationId);

            if (existingOperation != null)
            {
                if (!OperationMetaComparer.Compare(existingOperation, inputs, outputs, assetId, includeFee))
                {
                    throw new BusinessException("Conflict in operation parameters", ErrorCode.Conflict);
                }
                return(await GetExistingTransaction(existingOperation.OperationId, existingOperation.Hash));
            }
            IBuiltTransaction builtTransaction;

            switch (operationType)
            {
            case OperationType.Single:
                builtTransaction = await _transactionBuilder.GetTransferTransactionAsync(inputs.Single(), outputs.Single(), includeFee);

                break;

            case OperationType.ManyInputs:
                builtTransaction = await _transactionBuilder.GetManyInputsTransferTransactionAsync(inputs, outputs.Single(), includeFee);

                break;

            case OperationType.ManyOutputs:
                builtTransaction = await _transactionBuilder.GetManyOutputsTransferTransactionAsync(inputs.Single(), outputs, includeFee);

                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(operationType));
            }

            var builtTransactionInfo = new BuiltTransactionInfo
            {
                TransactionHex = builtTransaction.TransactionData.ToHex(),
                UsedCoins      = builtTransaction.UsedCoins
            };

            await _transactionOutputsService.AddInternalOutputs(operationId,
                                                                builtTransaction.TransactionData.Outputs.AsCoins());

            var txHash = builtTransaction.TransactionData.GetHash().ToString();

            await _transactionBlobStorage.AddOrReplaceTransactionAsync(operationId, txHash, TransactionBlobType.Initial,
                                                                       builtTransactionInfo.ToJson(_network));

            var operation = OperationMeta.Create(operationId, txHash, inputs, outputs, assetId, builtTransaction.Fee.Satoshi, includeFee);

            if (await _operationMetaRepository.TryInsertAsync(operation))
            {
                return(builtTransactionInfo);
            }

            existingOperation = await _operationMetaRepository.GetAsync(operationId);

            return(await GetExistingTransaction(operationId, existingOperation.Hash));
        }