public virtual ITransactionEnvelope GenerateNeuraliumMultiTransferTransaction(Guid accountUuid, List <RecipientSet> recipients, Amount tip, CorrelationContext correlationContext)
        {
            try {
                INeuraliumMultiTransferTransaction multiTransferTransaction = new NeuraliumMultiTransferTransaction();

                ITransactionEnvelope envelope = this.GenerateTransaction(multiTransferTransaction, GlobalsService.TRANSACTION_KEY_NAME, EnvelopeSignatureTypes.Instance.Published, () => {
                    multiTransferTransaction.Recipients.AddRange(recipients);
                    multiTransferTransaction.Total = recipients.Sum(e => e.Amount);
                    multiTransferTransaction.Tip   = tip;

                    // let's ensure we have the balance
                    Amount balance = this.CentralCoordinator.ChainComponentProvider.WalletProvider.GetAccountBalance(accountUuid, false).Total;

                    // make sure that the amount spent and tip are less than what we have in total

                    if ((balance - (multiTransferTransaction.Total + tip)) < 0)
                    {
                        //TODO: what to do here?
                        throw new InvalidOperationException("We don't have enough to transfer");
                    }
                });

                return(envelope);
            } catch (Exception ex) {
                throw new ApplicationException("failed to generate neuralium key change transaction", ex);
            }
        }
        public override void InsertLocalTransactionCacheEntry(ITransactionEnvelope transactionEnvelope)
        {
            base.InsertLocalTransactionCacheEntry(transactionEnvelope);

            AccountId targetAccountId = transactionEnvelope.Contents.Uuid.Account;

            TotalAPI total = this.GetAccountBalance(targetAccountId, true);

            this.centralCoordinator.PostSystemEvent(NeuraliumSystemEventGenerator.NeuraliumAccountTotalUpdated(targetAccountId.SequenceId, targetAccountId.AccountType, total));
        }
        protected override ValidationResult ValidateContents(ITransactionEnvelope envelope)
        {
            ValidationResult result = base.ValidateContents(envelope);

            if (result.Invalid)
            {
                return(result);
            }

            return(NeuraliumTransactionCreationUtils.ValidateTransaction(envelope.Contents.RehydratedTransaction));
        }
        public override ITransactionEnvelope GenerateDebugTransaction()
        {
            try {
                ITransaction transaction = this.CreateNewDebugTransaction();

                ITransactionEnvelope envelope = this.GenerateTransaction(transaction, GlobalsService.TRANSACTION_KEY_NAME, null);

                return(envelope);
            } catch (Exception ex) {
                throw new ApplicationException("failed to generate neuralium debug transaction", ex);
            }
        }
        public virtual ITransactionEnvelope GenerateRefillNeuraliumsTransaction(Guid accountUuid, CorrelationContext correlationContext)
        {
            try {
                INeuraliumRefillNeuraliumsTransaction refillTransaction = new NeuraliumRefillNeuraliumsTransaction();

                ITransactionEnvelope envelope = this.GenerateTransaction(refillTransaction, GlobalsService.TRANSACTION_KEY_NAME, EnvelopeSignatureTypes.Instance.Published);

                return(envelope);
            } catch (Exception ex) {
                throw new ApplicationException("failed to generate neuralium key change transaction", ex);
            }
        }
        protected override void FillWalletTransactionCacheEntry(IWalletTransactionCache walletAccountTransactionCache, ITransactionEnvelope transactionEnvelope, AccountId targetAccountId)
        {
            this.EnsureWalletLoaded();
            base.FillWalletTransactionCacheEntry(walletAccountTransactionCache, transactionEnvelope, targetAccountId);

            ITransaction transaction = transactionEnvelope.Contents.RehydratedTransaction;

            if (walletAccountTransactionCache is INeuraliumWalletTransactionCache neuraliumWalletTransactionCache)
            {
                bool ours = transaction.TransactionId.Account == targetAccountId;

                //here we record the impact amount. + value increases our amount. - reduces
                if (transaction is INeuraliumTransferTransaction neuraliumTransferTransaction)
                {
                    neuraliumWalletTransactionCache.Amount = neuraliumTransferTransaction.Amount;
                    neuraliumWalletTransactionCache.MoneratyTransactionType = NeuraliumWalletTransactionCache.MoneratyTransactionTypes.Debit;
                }
                else if (transaction is INeuraliumMultiTransferTransaction neuraliumMultiTransferTransaction)
                {
                    neuraliumWalletTransactionCache.Amount = neuraliumMultiTransferTransaction.Total;
                    neuraliumWalletTransactionCache.MoneratyTransactionType = NeuraliumWalletTransactionCache.MoneratyTransactionTypes.Debit;
                }
                else if (transaction is INeuraliumRefillNeuraliumsTransaction neuraliumsTransaction)
                {
                    neuraliumWalletTransactionCache.Amount = 1000;
                    neuraliumWalletTransactionCache.MoneratyTransactionType = NeuraliumWalletTransactionCache.MoneratyTransactionTypes.Credit;
                }

                if (transaction is ITipTransaction tipTransaction)
                {
                    neuraliumWalletTransactionCache.Tip = tipTransaction.Tip;
                }
            }
        }
Esempio n. 7
0
        protected override void PrepareTransactionEntry(NeuraliumChainPoolSqlitePublicTransactions entry, ITransactionEnvelope transactionEnvelope, DateTime chainInception)
        {
            base.PrepareTransactionEntry(entry, transactionEnvelope, chainInception);

            if (transactionEnvelope.Contents.RehydratedTransaction is ITipTransaction tipTransaction)
            {
                entry.Tip = tipTransaction.Tip.Value;
            }
        }
Esempio n. 8
0
        protected override ValidationResult PerformBasicTransactionValidation(ITransaction transaction, ITransactionEnvelope envelope, bool?accreditationCertificateValid)
        {
            ValidationResult result = base.PerformBasicTransactionValidation(transaction, envelope, accreditationCertificateValid);

            bool validCertificate = accreditationCertificateValid.HasValue && accreditationCertificateValid.Value;

            if (result == ValidationResult.ValidationResults.Valid)
            {
                if (!validCertificate && transaction is ITipTransaction tipTransaction)
                {
                    byte scope = transaction.TransactionId.Scope;

                    // we allow one transaction for free per second
                    if (scope >= 1)
                    {
                        decimal tip = tipTransaction.Tip;

                        if (tip <= 0M)
                        {
                            return(this.CreateTrasactionValidationResult(ValidationResult.ValidationResults.Invalid, NeuraliumTransactionValidationErrorCodes.Instance.TIP_REQUIRED));
                        }

                        // tiered tip
                        if (scope > 3)
                        {
                            //TODO: define these values
                            if ((scope <= 25) && (tip <= 0.0001M))
                            {
                                return(this.CreateTrasactionValidationResult(ValidationResult.ValidationResults.Invalid, NeuraliumTransactionValidationErrorCodes.Instance.INSUFFICIENT_TIP));
                            }

                            if ((scope <= 100) && (tip <= 0.001M))
                            {
                                return(this.CreateTrasactionValidationResult(ValidationResult.ValidationResults.Invalid, NeuraliumTransactionValidationErrorCodes.Instance.INSUFFICIENT_TIP));
                            }

                            if (tip <= 0.01M)
                            {
                                return(this.CreateTrasactionValidationResult(ValidationResult.ValidationResults.Invalid, NeuraliumTransactionValidationErrorCodes.Instance.INSUFFICIENT_TIP));
                            }
                        }
                    }
                }
            }

            return(result);
        }
Esempio n. 9
0
        public override IBlockchainGossipMessageSet CreateTransactionCreatedGossipMessageSet(ITransactionEnvelope envelope)
        {
            if (!(envelope.Contents.RehydratedTransaction is INeuraliumTransaction castedTransaction))
            {
                throw new ApplicationException("Invalid transaction type");
            }

            return(this.CreateGossipMessageSet <NeuraliumGossipMessageSet <NeuraliumTransactionCreatedGossipMessage, INeuraliumTransactionEnvelope>, NeuraliumTransactionCreatedGossipMessage, INeuraliumTransactionEnvelope>((INeuraliumTransactionEnvelope)envelope));
        }
Esempio n. 10
0
 public override IBlockchainGossipMessageSet CreateTransactionCreatedGossipMessageSet <GOSSIP_MESSAGE_SET, GOSSIP_MESSAGE_TYPE, EVENT_ENVELOPE_TYPE>(ITransactionEnvelope transaction)
 {
     return(this.CreateGossipMessageSet <GOSSIP_MESSAGE_SET, GOSSIP_MESSAGE_TYPE, IDehydratedTransaction, EVENT_ENVELOPE_TYPE, EVENT_ENVELOPE_TYPE>(transaction.Contents));
 }