Beispiel #1
0
 public async Task SendTransferReplyMessageAsync(TransferReplyMessage message)
 {
     await _transportClient.SendAsync(new MessageEnvelope()
     {
         Topic          = this.CounterPartyTopic,
         SigningKey     = _privateSigningKey,
         EncryptionType = EncryptionType.Symmetric,
         EncryptionKey  = _sharedSymKeyId
     }, message);
 }
Beispiel #2
0
        public static ProtoTransferReplyMessage MapToProto(TransferReplyMessage message)
        {
            var proto = new ProtoTransferReplyMessage()
            {
                Comment     = message.Comment,
                Transfer    = Mapper.MapTransferToProto(message.Transfer),
                Beneficiary = Mapper.MapBeneficiaryToProto(message.Beneficiary),
                Originator  = Mapper.MapOriginatorToProto(message.Originator),
                Message     = Mapper.MapMessageToProto(message.MessageType, message.Message),
                VaspInfo    = Mapper.MapVaspInformationToProto(message.VASP)
            };

            return(proto);
        }
        public override int GetHashCode()
        {
            int hash = 1;

            if (msgCase_ == MsgOneofCase.SessionRequestMessage)
            {
                hash ^= SessionRequestMessage.GetHashCode();
            }
            if (msgCase_ == MsgOneofCase.SessionReplyMessage)
            {
                hash ^= SessionReplyMessage.GetHashCode();
            }
            if (msgCase_ == MsgOneofCase.TransferRequestMessage)
            {
                hash ^= TransferRequestMessage.GetHashCode();
            }
            if (msgCase_ == MsgOneofCase.TransferReplyMessage)
            {
                hash ^= TransferReplyMessage.GetHashCode();
            }
            if (msgCase_ == MsgOneofCase.TransferDispatchMessage)
            {
                hash ^= TransferDispatchMessage.GetHashCode();
            }
            if (msgCase_ == MsgOneofCase.TransaferConfirmationMessage)
            {
                hash ^= TransaferConfirmationMessage.GetHashCode();
            }
            if (msgCase_ == MsgOneofCase.TerminationMessage)
            {
                hash ^= TerminationMessage.GetHashCode();
            }
            if (msgCase_ == MsgOneofCase.ReservedField)
            {
                hash ^= ReservedField.GetHashCode();
            }
            if (Signature.Length != 0)
            {
                hash ^= Signature.GetHashCode();
            }
            hash ^= (int)msgCase_;
            if (_unknownFields != null)
            {
                hash ^= _unknownFields.GetHashCode();
            }
            return(hash);
        }
Beispiel #4
0
        public async Task TransferReplyMessageReceivedAsync(string sessionId, TransferReplyMessage message)
        {
            var transaction = _outgoingTransactions.SingleOrDefault(x => x.SessionId == sessionId);

            if (transaction == null || transaction.Status != TransactionStatus.TransferRequested)
            {
                return; //todo: handle this case.
            }
            transaction.Status = message.Message.MessageCode == "5"
                ? TransactionStatus.TransferForbidden
                : TransactionStatus.TransferAllowed;

            if (transaction.Status == TransactionStatus.TransferAllowed)
            {
                transaction.DestinationAddress = message.Transfer.DestinationAddress;
            }
        }
Beispiel #5
0
        public static TransferReplyMessage MapFromProto(ProtoTransferReplyMessage message)
        {
            var messageIn = new Message(
                message.Message.MessageId,
                message.Message.SessionId,
                message.Message.MessageCode);
            var originator  = Mapper.MapOriginatorFromProto(message.Originator);
            var beneficiary = Mapper.MapBeneficiaryFromProto(message.Beneficiary);
            var transfer    = Mapper.MapTransferFromProto(message.Transfer);
            var vasp        = Mapper.MapVaspInformationFromProto(message.VaspInfo);

            var obj = new TransferReplyMessage(messageIn, originator, beneficiary, transfer, vasp)
            {
                Comment = message.Comment,
            };

            return(obj);
        }
Beispiel #6
0
        private static void AssertTransferReply(TransferReplyMessage response, TransferReplyMessage request)
        {
            Assert.NotNull(response);

            Assert.Equal(request.Comment, response.Comment);

            Assert.Equal(request.Message.SessionId, response.Message.SessionId);
            Assert.Equal(request.MessageType, response.MessageType);
            Assert.Equal(request.Message.MessageCode, response.Message.MessageCode);
            Assert.Equal(request.Message.MessageId, response.Message.MessageId);

            AssertPlaceOfBirth(request.VASP.PlaceOfBirth, response.VASP.PlaceOfBirth);

            Assert.Equal(request.VASP.BIC, response.VASP.BIC);
            Assert.Equal(request.VASP.Name, response.VASP.Name);
            Assert.Equal(request.VASP.VaspPublickKey, response.VASP.VaspPublickKey);
            Assert.Equal(request.VASP.VaspIdentity, response.VASP.VaspIdentity);

            Assert.Equal(request.VASP.PostalAddress.StreetName, response.VASP.PostalAddress.StreetName);
            Assert.Equal(request.VASP.PostalAddress.AddressLine, response.VASP.PostalAddress.AddressLine);
            Assert.Equal(request.VASP.PostalAddress.BuildingNumber, response.VASP.PostalAddress.BuildingNumber);
            Assert.Equal(request.VASP.PostalAddress.Country, response.VASP.PostalAddress.Country);
            Assert.Equal(request.VASP.PostalAddress.PostCode, response.VASP.PostalAddress.PostCode);

            Assert.Equal(request.VASP.JuridicalPersonIds.Count(), response.VASP.JuridicalPersonIds.Count());

            AssertJuridicalPersonIds(request.VASP.JuridicalPersonIds, response.VASP.JuridicalPersonIds);

            Assert.Equal(request.VASP.NaturalPersonIds.Count(), response.VASP.NaturalPersonIds.Count());

            AssertNaturalPersonIds(request.VASP.NaturalPersonIds, response.VASP.NaturalPersonIds);

            Assert.Equal(request.Transfer.TransferType, response.Transfer.TransferType);
            Assert.Equal(request.Transfer.VirtualAssetType, response.Transfer.VirtualAssetType);
            Assert.Equal(request.Transfer.Amount, response.Transfer.Amount);
            Assert.Equal(request.Transfer.DestinationAddress, response.Transfer.DestinationAddress);

            AssertBeneficiary(request.Beneficiary, response.Beneficiary);

            AssertOriginator(request.Originator, response.Originator);
        }
Beispiel #7
0
        public async Task SendTransferReplyAsync(
            string id,
            string destinationAddress,
            TransferReplyMessage.TransferReplyMessageCode code)
        {
            var transaction = await _transactionsRepository.GetAsync(id);

            if (transaction == null)
            {
                throw new NullReferenceException();
            }

            if (transaction.Status != TransactionStatus.TransferRequested)
            {
                return; //todo: handle this case.
            }
            if (!_benefeciarySessionsDict.TryGetValue(transaction.SessionId, out var beneficiarySession))
            {
                return; //todo: handle this case.
            }
            await beneficiarySession.TransferReplyAsync(
                TransferReplyMessage.Create(
                    transaction.SessionId,
                    code,
                    destinationAddress));

            if (code == TransferReplyMessage.TransferReplyMessageCode.TransferAccepted)
            {
                transaction.Status             = TransactionStatus.TransferAllowed;
                transaction.DestinationAddress = destinationAddress;
            }
            else
            {
                transaction.Status = TransactionStatus.TransferForbidden;
                transaction.TransferDeclineCode = TransferReplyMessage.GetMessageCode(code);
            }

            await _transactionsRepository.UpdateAsync(transaction);
        }
Beispiel #8
0
        private async Task TransferReplyMessageReceivedAsync(SessionMessageEvent <TransferReplyMessage> evt)
        {
            var transaction = await _transactionsRepository.GetBySessionIdAsync(evt.SessionId);

            if (transaction == null || transaction.Status != TransactionStatus.TransferRequested)
            {
                return; //todo: handle this case.
            }
            if (evt.Message.Message.MessageCode == TransferReplyMessage.GetMessageCode(TransferReplyMessage.TransferReplyMessageCode.TransferAccepted))
            {
                transaction.Status             = TransactionStatus.TransferAllowed;
                transaction.DestinationAddress = evt.Message.DestinationAddress;

                await _transactionsRepository.UpdateAsync(transaction);
            }
            else
            {
                transaction.Status = TransactionStatus.TransferForbidden;
                transaction.TransferDeclineCode = evt.Message.Message.MessageCode;
            }

            await _transactionsRepository.UpdateAsync(transaction);
        }
Beispiel #9
0
 public Task TransferReplyMessageHandlerAsync(TransferReplyMessage message, OriginatorSession session)
 {
     return(_transferReply.Invoke(message, session));
 }
        public async Task CreateSessionBetweenVASPs()
        {
            int sessionTerminationCounter = 0;
            SessionTermination sessionTerminationDelegate = @event => { sessionTerminationCounter++; };

            (VaspInformation vaspInfoPerson, VaspContractInfo vaspContractInfoPerson) = await VaspInformationBuilder.CreateForNaturalPersonAsync(
                NodeClient.EthereumRpc,
                Settings.VaspSmartContractAddressPerson,
                Settings.NaturalPersonIds,
                Settings.PlaceOfBirth);

            VaspClient originator = VaspClient.Create(
                vaspInfoPerson,
                vaspContractInfoPerson,
                Settings.PersonHandshakePrivateKeyHex,
                Settings.PersonSignaturePrivateKeyHex,
                NodeClient.EthereumRpc,
                NodeClient.WhisperRpc,
                _fakeEnsProvider,
                _signService,
                NodeClient.TransportClient);

            (VaspInformation vaspInfoJuridical, VaspContractInfo vaspContractInfoJuridical) = await VaspInformationBuilder.CreateForJuridicalPersonAsync(
                NodeClient.EthereumRpc,
                Settings.VaspSmartContractAddressJuridical,
                Settings.JuridicalIds);

            VaspClient beneficiary = VaspClient.Create(
                vaspInfoJuridical,
                vaspContractInfoJuridical,
                Settings.JuridicalHandshakePrivateKeyHex,
                Settings.JuridicalSignaturePrivateKeyHex,
                NodeClient.EthereumRpc,
                NodeClient.WhisperRpc,
                _fakeEnsProvider,
                _signService,
                NodeClient.TransportClient);

            var originatorVaan  = VirtualAssetssAccountNumber.Create(vaspInfoPerson.GetVaspCode(), "524ee3fb082809");
            var beneficiaryVaan = VirtualAssetssAccountNumber.Create(vaspInfoJuridical.GetVaspCode(), "524ee3fb082809");

            IVaspMessageHandler messageHandler = new VaspMessageHandlerCallbacks(
                (vaspInfo) =>
            {
                return(Task.FromResult(true));
            },
                (request, currentSession) =>
            {
                var message = new TransferReplyMessage(currentSession.SessionId, TransferReplyMessage.TransferReplyMessageCode.TransferAccepted,
                                                       request.Originator,
                                                       new Beneficiary("Mr. Test", request.Beneficiary.VAAN),
                                                       new TransferReply(
                                                           request.Transfer.VirtualAssetType,
                                                           request.Transfer.TransferType,
                                                           request.Transfer.Amount,
                                                           "0x0"),
                                                       request.VASP);

                return(Task.FromResult(message));
            },
                (dispatch, currentSession) =>
            {
                var message = new TransferConfirmationMessage(currentSession.SessionId,
                                                              TransferConfirmationMessage.TransferConfirmationMessageCode.TransferConfirmed,
                                                              dispatch.Originator,
                                                              dispatch.Beneficiary,
                                                              dispatch.Transfer,
                                                              dispatch.Transaction,
                                                              dispatch.VASP);

                return(Task.FromResult(message));
            });

            beneficiary.RunListener(messageHandler);

            originator.SessionTerminated  += sessionTerminationDelegate;
            beneficiary.SessionTerminated += sessionTerminationDelegate;

            // change enum to string and add constants
            //beneficiary.TransferRequest += request => new TransferReply(VirtualAssetType.ETH, TransferType.BlockchainTransfer, "10", "1223");
            //beneficiary.TransferDispatch += message => new TransferConfirmationMessage();

            var originatorDoc = Originator.CreateOriginatorForNaturalPerson(
                "Test van der Test",
                originatorVaan,
                new PostalAddress(
                    "StreetX",
                    44,
                    "AddressLineX",
                    "510051",
                    "TownX",
                    Country.List["DE"]),
                new PlaceOfBirth(DateTime.Today.AddYears(-30), "TownX", Country.List["DE"]),
                new NaturalPersonId[]
            {
                new NaturalPersonId("Id", NaturalIdentificationType.NationalIdentityNumber, Country.List["DE"]),
            });
            var session = await originator.CreateSessionAsync(originatorDoc, beneficiaryVaan);

            var transferReply = await session.TransferRequestAsync(new TransferInstruction()
            {
                VirtualAssetTransfer = new VirtualAssetTransfer()
                {
                    TransferType     = TransferType.BlockchainTransfer,
                    VirtualAssetType = VirtualAssetType.ETH,
                    TransferAmount   = "1000000000000000000"
                }
            });

            var transferConformation =
                await session.TransferDispatchAsync(transferReply.Transfer, new Transaction("0xtxhash", DateTime.UtcNow, "0x0...a"));

            Assert.Equal(1, originator.GetActiveSessions().Count);
            Assert.True(originator.GetActiveSessions().First() is OriginatorSession);

            Assert.Equal(1, beneficiary.GetActiveSessions().Count);
            Assert.True(beneficiary.GetActiveSessions().First() is BeneficiarySession);

            await session.TerminateAsync(TerminationMessage.TerminationMessageCode.SessionClosedTransferOccured);

            session.Wait();
            originator.Dispose();
            beneficiary.Dispose();

            Assert.Equal(2, sessionTerminationCounter);


            _testOutputHelper.WriteLine("End of test");
        }
Beispiel #11
0
        private static TransferReplyMessage GetTransferReplyMessage()
        {
            //Should be a contract
            var vaspKey = EthECKey.GenerateKey();

            var message = new Message(
                Guid.NewGuid().ToByteArray().ToHex(prefix: false),
                Guid.NewGuid().ToByteArray().ToHex(prefix: false),
                "1");

            var postalAddress = new PostalAddress(
                "TestingStreet",
                61,
                "Test Address Line",
                "410000",
                "TownN",
                Country.List["DE"]
                );
            var placeOfBirth    = new PlaceOfBirth(DateTime.UtcNow, "TownN", Country.List["DE"]);
            var vaspInformation = new VaspInformation(
                "Test test",
                vaspKey.GetPublicAddress(),
                vaspKey.GetPubKey().ToHex(prefix: false),
                postalAddress,
                placeOfBirth,
                new NaturalPersonId[]
            {
                new NaturalPersonId("SomeId2", NaturalIdentificationType.AlienRegistrationNumber,
                                    Country.List["DE"]),
            },
                new JuridicalPersonId[]
            {
                new JuridicalPersonId("SomeId1", JuridicalIdentificationType.BankPartyIdentification,
                                      Country.List["DE"]),
            },
                "DEUTDEFF");

            var originator = new Originator("Originator1", "VaaN", postalAddress, placeOfBirth,
                                            new NaturalPersonId[]
            {
                new NaturalPersonId("SomeId2", NaturalIdentificationType.AlienRegistrationNumber,
                                    Country.List["DE"]),
            },
                                            new JuridicalPersonId[]
            {
                new JuridicalPersonId("SomeId1", JuridicalIdentificationType.BankPartyIdentification,
                                      Country.List["DE"]),
            },
                                            "DEUTDEFF");

            var beneficiary = new Beneficiary("Ben1", "VaaN");

            var transferReply = new TransferReply(VirtualAssetType.ETH, TransferType.BlockchainTransfer, "10000000", "0x0000001");

            var request = new TransferReplyMessage(message, originator, beneficiary, transferReply, vaspInformation)
            {
                Comment = "This is test message",
            };

            return(request);
        }
 public async Task TransferReplyAsync(string sessionId, TransferReplyMessage message)
 {
     await _beneficiarySessions[sessionId].SendTransferReplyMessageAsync(message);
 }
        public void MergeFrom(ProtoMessageWrapper other)
        {
            if (other == null)
            {
                return;
            }
            if (other.Signature.Length != 0)
            {
                Signature = other.Signature;
            }
            switch (other.MsgCase)
            {
            case MsgOneofCase.SessionRequestMessage:
                if (SessionRequestMessage == null)
                {
                    SessionRequestMessage = new global::OpenVASP.ProtocolMessages.Messages.ProtoSessionRequestMessage();
                }
                SessionRequestMessage.MergeFrom(other.SessionRequestMessage);
                break;

            case MsgOneofCase.SessionReplyMessage:
                if (SessionReplyMessage == null)
                {
                    SessionReplyMessage = new global::OpenVASP.ProtocolMessages.Messages.ProtoSessionReplyMessage();
                }
                SessionReplyMessage.MergeFrom(other.SessionReplyMessage);
                break;

            case MsgOneofCase.TransferRequestMessage:
                if (TransferRequestMessage == null)
                {
                    TransferRequestMessage = new global::OpenVASP.ProtocolMessages.Messages.ProtoTransferRequestMessage();
                }
                TransferRequestMessage.MergeFrom(other.TransferRequestMessage);
                break;

            case MsgOneofCase.TransferReplyMessage:
                if (TransferReplyMessage == null)
                {
                    TransferReplyMessage = new global::OpenVASP.ProtocolMessages.Messages.ProtoTransferReplyMessage();
                }
                TransferReplyMessage.MergeFrom(other.TransferReplyMessage);
                break;

            case MsgOneofCase.TransferDispatchMessage:
                if (TransferDispatchMessage == null)
                {
                    TransferDispatchMessage = new global::OpenVASP.ProtocolMessages.Messages.ProtoTransferDispatchMessage();
                }
                TransferDispatchMessage.MergeFrom(other.TransferDispatchMessage);
                break;

            case MsgOneofCase.TransaferConfirmationMessage:
                if (TransaferConfirmationMessage == null)
                {
                    TransaferConfirmationMessage = new global::OpenVASP.ProtocolMessages.Messages.ProtoTransferConfirmationMessage();
                }
                TransaferConfirmationMessage.MergeFrom(other.TransaferConfirmationMessage);
                break;

            case MsgOneofCase.TerminationMessage:
                if (TerminationMessage == null)
                {
                    TerminationMessage = new global::OpenVASP.ProtocolMessages.Messages.ProtoTerminationMessage();
                }
                TerminationMessage.MergeFrom(other.TerminationMessage);
                break;

            case MsgOneofCase.ReservedField:
                ReservedField = other.ReservedField;
                break;
            }

            _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
        }