예제 #1
0
        private (EthereumAmount nativeCurrencyAmount, Token tokenAmount) CalculateFundsToIssue(INetworkAccount recipient,
                                                                                               EthereumAmount recipientNativeCurrencyBalance,
                                                                                               Token recipientTokenBalance,
                                                                                               EthereumAmount faucetNativeCurrencyBalance,
                                                                                               Token faucetTokenBalance)
        {
            bool giveNativeCurrency = recipientNativeCurrencyBalance < this._nativeCurrencyLimits.MaximumRecipientBalance;
            bool giveToken          = recipientTokenBalance < this._tokenCurrencyLimits.MaximumRecipientBalance;

            this._logger.LogInformation(
                $"{recipient.Network.Name}: Source: {faucetNativeCurrencyBalance.ToFormattedUnitWithSymbol()} {faucetTokenBalance.ToFormattedUnitWithSymbol()} Recipient: {recipientNativeCurrencyBalance.ToFormattedUnitWithSymbol()} {recipientTokenBalance.ToFormattedUnitWithSymbol()} Issue: ETH: {giveNativeCurrency} FUN: {giveToken} Max Eth: {this._nativeCurrencyLimits.MaximumRecipientBalance.ToFormattedUnitWithSymbol()} Max FUN: {this._tokenCurrencyLimits.MaximumRecipientBalance.ToFormattedUnitWithSymbol()}");

            if (!giveNativeCurrency && !giveToken)
            {
                if (this._executionEnvironment.IsDevelopmentOrTest())
                {
                    this._logger.LogWarning(
                        $"{recipient.Network.Name}: Could not issue {recipient.Network.NativeCurrency} or {this._tokenContract.Symbol} to {recipient.Address} - Recipient balance > max");
                }

                throw new TooMuchTokenException();
            }

            EthereumAmount nativeCurrencyAmount = giveNativeCurrency ? this.CalculateAmountOfNativeCurrencyToIssueFromFaucet(recipientNativeCurrencyBalance) : EthereumAmount.Zero;
            Token          tokenAmount          = giveToken ? this.CalculateAmountOfTokenToIssueFromFaucet(recipientTokenBalance) : Token.Zero;

            return(nativeCurrencyAmount, tokenAmount);
        }
예제 #2
0
        private Task <PendingTransaction> IssueFundsAsync(INetworkSigningAccount networkSigningAccount, Issuance issuance, TransactionContext context)
        {
            this._logger.LogDebug($"Faucet Contract Balances: {issuance.SourceAccountBalance.ToFormattedUnitWithSymbol()}, {issuance.SourceTokenBalance.ToFormattedUnitWithSymbol()}");

            EthereumAmount minEth = MinSourceNativeCurrencyAccountBalance(issuance.EthToIssue);
            Token          minFun = MinSourceTokenAccountBalance(issuance.TokenToIssue);

            // don't allow the source account balance to go too low
            if (issuance.SourceAccountBalance < minEth)
            {
                string message =
                    $"{issuance.Recipient.Network.Name}: Cannot issue {issuance.Recipient.Network.NativeCurrency} from {issuance.SourceName}. Faucet Contract {issuance.FundsSourceContract.Address} is low on ETH (Has {issuance.SourceAccountBalance.ToFormattedUnitWithSymbol()}. Minimum {minEth.ToFormattedUnitWithSymbol()})";
                this._logger.LogCritical(message);

                throw new InsufficientTokenException(message);
            }

            if (issuance.SourceTokenBalance < minFun)
            {
                string message =
                    $"{issuance.Recipient.Network.Name}: Cannot issue {this._tokenContract.Symbol} from {issuance.SourceName}. Faucet Contract {issuance.FundsSourceContract.Address} is low on FUN (Has {issuance.SourceTokenBalance.ToFormattedUnitWithSymbol()}. Minimum {minFun.ToFormattedUnitWithSymbol()})";
                this._logger.LogCritical(message);

                throw new InsufficientTokenException(message);
            }

            return(issuance.SendFundsAsync(networkSigningAccount: networkSigningAccount, context: context, transactionExecutorFactory: this._transactionExecutorFactory));
        }