protected async Task DeployContractsAsync()
        {
            {
                // TokenContract
                var category = KernelConstants.CodeCoverageRunnerCategory;
                var code     = Codes.Single(kv => kv.Key.Split(",").First().EndsWith("MultiToken")).Value;
                TokenContractAddress = await DeploySystemSmartContract(category, code, TokenSmartContractAddressNameProvider.Name, DefaultSenderKeyPair);

                TokenContractStub =
                    GetTester <TokenContractContainer.TokenContractStub>(TokenContractAddress, DefaultSenderKeyPair);
                AuthorizedTokenContractStub = GetTester <TokenContractContainer.TokenContractStub>(TokenContractAddress, ManagerKeyPair);
            }
            {
                // TokenConverterContract
                var category = KernelConstants.CodeCoverageRunnerCategory;
                var code     = Codes.Single(kv => kv.Key.Split(",").First().EndsWith("TokenConverter")).Value;
                TokenConverterContractAddress = await DeploySystemSmartContract(category, code, TokenConverterSmartContractAddressNameProvider.Name, DefaultSenderKeyPair);

                DefaultStub = GetTester <TokenConverterContractContainer.TokenConverterContractStub>(
                    TokenConverterContractAddress, DefaultSenderKeyPair);
                AuthorizedTokenConvertStub = GetTester <TokenConverterContractContainer.TokenConverterContractStub>(
                    TokenConverterContractAddress, ManagerKeyPair);
            }

            await TokenContractStub.Create.SendAsync(new CreateInput()
            {
                Symbol        = "ELF",
                Decimals      = 2,
                IsBurnable    = true,
                TokenName     = "elf token",
                TotalSupply   = 1000_0000_0000L,
                Issuer        = DefaultSender,
                LockWhiteList = { TokenConverterContractAddress }
            });
        public async Task <IEnumerable <Transaction> > GetPreTransactionsAsync(IReadOnlyList <ServiceDescriptor> descriptors, ITransactionContext transactionContext)
        {
            if (!IsAcs1(descriptors))
            {
                return(new List <Transaction>());
            }

            var context = _contextService.Create();

            context.TransactionContext = transactionContext;
            var selfStub = new FeeChargedContractContainer.FeeChargedContractStub()
            {
                __factory = new MethodStubFactory(context)
            };

            var fee = await selfStub.GetMethodFee.CallAsync(new MethodName
            {
                Name = context.TransactionContext.Transaction.MethodName
            });

            if (!fee.Amounts.Any())
            {
                return(new List <Transaction>());
            }

            var tokenContractAddress = context.GetContractAddressByName(TokenSmartContractAddressNameProvider.Name);

            if (tokenContractAddress == null)
            {
                return(new List <Transaction>());
            }

            var tokenStub = new TokenContractContainer.TokenContractStub()
            {
                __factory = new TransactionGeneratingOnlyMethodStubFactory()
                {
                    Sender          = transactionContext.Transaction.From,
                    ContractAddress = tokenContractAddress
                }
            };

            if (transactionContext.Transaction.To == tokenContractAddress &&
                transactionContext.Transaction.MethodName == nameof(tokenStub.ChargeTransactionFees))
            {
                // Skip ChargeTransactionFees itself
                return(new List <Transaction>());
            }

            var chargeFeeTransaction = (await tokenStub.ChargeTransactionFees.SendAsync(new ChargeTransactionFeesInput
            {
                SymbolToAmount = { fee.Amounts.ToDictionary(a => a.Symbol, a => a.Amount) }
            })).Transaction;

            return(new List <Transaction>
            {
                chargeFeeTransaction
            });
        }
        public async Task <IEnumerable <Transaction> > GetPreTransactionsAsync(
            IReadOnlyList <ServiceDescriptor> descriptors, ITransactionContext transactionContext)
        {
            if (!IsTargetAcsSymbol(descriptors))
            {
                return(new List <Transaction>());
            }

            var context = _contextService.Create();

            context.TransactionContext = transactionContext;
            var selfStub = new ThresholdSettingContractContainer.ThresholdSettingContractStub
            {
                __factory = new MethodStubFactory(context)
            };

            var threshold = await selfStub.GetMethodCallingThreshold.CallAsync(new StringValue
            {
                Value = context.TransactionContext.Transaction.MethodName
            });

            // Generate token contract stub.
            var tokenContractAddress = context.GetContractAddressByName(TokenSmartContractAddressNameProvider.Name);

            if (tokenContractAddress == null)
            {
                return(new List <Transaction>());
            }

            var tokenStub = new TokenContractContainer.TokenContractStub
            {
                __factory = new TransactionGeneratingOnlyMethodStubFactory
                {
                    Sender          = transactionContext.Transaction.To,
                    ContractAddress = tokenContractAddress
                }
            };

            if (transactionContext.Transaction.To == tokenContractAddress &&
                transactionContext.Transaction.MethodName == nameof(tokenStub.CheckThreshold))
            {
                return(new List <Transaction>());
            }

            var checkThresholdTransaction = (await tokenStub.CheckThreshold.SendAsync(new CheckThresholdInput
            {
                Sender = context.Sender,
                SymbolToThreshold = { threshold.SymbolToAmount },
                IsCheckAllowance = threshold.ThresholdCheckType == ThresholdCheckType.Allowance
            })).Transaction;

            return(new List <Transaction>
            {
                checkThresholdTransaction
            });
        }
        public async Task <IEnumerable <Transaction> > GetPreTransactionsAsync(
            IReadOnlyList <ServiceDescriptor> descriptors, ITransactionContext transactionContext)
        {
            if (!IsAcs8(descriptors))
            {
                return(new List <Transaction>());
            }

            var context = _contextService.Create();

            context.TransactionContext = transactionContext;

            // Generate token contract stub.
            var tokenContractAddress = context.GetContractAddressByName(TokenSmartContractAddressNameProvider.Name);

            if (tokenContractAddress == null)
            {
                return(new List <Transaction>());
            }

            var tokenStub = new TokenContractContainer.TokenContractStub
            {
                __factory = new TransactionGeneratingOnlyMethodStubFactory
                {
                    Sender          = transactionContext.Transaction.To,
                    ContractAddress = tokenContractAddress
                }
            };

            if (transactionContext.Transaction.To == tokenContractAddress &&
                transactionContext.Transaction.MethodName == nameof(tokenStub.ChargeResourceToken))
            {
                return(new List <Transaction>());
            }

            if (transactionContext.Transaction.To == context.Self &&
                transactionContext.Transaction.MethodName == nameof(ResourceConsumptionContractContainer
                                                                    .ResourceConsumptionContractStub.BuyResourceToken))
            {
                return(new List <Transaction>());
            }

            var checkResourceTokenTransaction =
                (await tokenStub.CheckResourceToken.SendAsync(new Empty())).Transaction;

            return(new List <Transaction>
            {
                checkResourceTokenTransaction
            });
        }
Esempio n. 5
0
        protected async Task DeployContractsAsync()
        {
            {
                // TokenContract
                var category = KernelConstants.CodeCoverageRunnerCategory;
                var code     = File.ReadAllBytes(typeof(TokenContract).Assembly.Location);
                TokenContractAddress = await DeployContractAsync(category, code, DefaultSenderKeyPair);

                TokenContractStub =
                    GetTester <TokenContractContainer.TokenContractStub>(TokenContractAddress, DefaultSenderKeyPair);

                await TokenContractStub.Create.SendAsync(new CreateInput()
                {
                    Symbol      = "ELF",
                    Decimals    = 2,
                    IsBurnable  = true,
                    TokenName   = "elf token",
                    TotalSupply = 1000_0000L,
                    Issuer      = DefaultSender
                });
        protected async Task DeployContractsAsync()
        {
            {
                // TokenContract
                var category = KernelConstants.CodeCoverageRunnerCategory;
                var code     = Codes.Single(kv => kv.Key.Split(",").First().EndsWith("MultiToken")).Value;
                TokenContractAddress = await DeployContractAsync(category, code, Hash.FromString("MultiToken"), DefaultSenderKeyPair);

                TokenContractStub =
                    GetTester <TokenContractContainer.TokenContractStub>(TokenContractAddress, DefaultSenderKeyPair);

                await TokenContractStub.Create.SendAsync(new CreateInput()
                {
                    Symbol      = "ELF",
                    Decimals    = 2,
                    IsBurnable  = true,
                    TokenName   = "elf token",
                    TotalSupply = 1000_0000L,
                    Issuer      = DefaultSender
                });
        public async Task <IEnumerable <Transaction> > GetPostTransactionsAsync(
            IReadOnlyList <ServiceDescriptor> descriptors, ITransactionContext transactionContext)
        {
            if (!IsAcs8(descriptors))
            {
                return(new List <Transaction>());
            }

            var context = _contextService.Create();

            context.TransactionContext = transactionContext;

            // Generate token contract stub.
            var tokenContractAddress = context.GetContractAddressByName(TokenSmartContractAddressNameProvider.Name);

            if (tokenContractAddress == null)
            {
                return(new List <Transaction>());
            }

            var tokenStub = new TokenContractContainer.TokenContractStub
            {
                __factory = new TransactionGeneratingOnlyMethodStubFactory
                {
                    Sender          = transactionContext.Transaction.To,
                    ContractAddress = tokenContractAddress
                }
            };

            if (transactionContext.Transaction.To == tokenContractAddress &&
                transactionContext.Transaction.MethodName == nameof(tokenStub.ChargeResourceToken))
            {
                return(new List <Transaction>());
            }

            if (transactionContext.Transaction.To == context.Self &&
                transactionContext.Transaction.MethodName == nameof(ResourceConsumptionContractContainer
                                                                    .ResourceConsumptionContractStub.BuyResourceToken))
            {
                return(new List <Transaction>());
            }

            // Transaction size related to NET Token.
            var transactionSize = transactionContext.Transaction.Size();
            // Transaction trace state set writes count related to STO Token.
            var writesCount = transactionContext.Trace.StateSet.Writes.Count;
            // Transaction trace state set reads count related to CPU Token.
            var readsCount = transactionContext.Trace.StateSet.Reads.Count;

            var chargeResourceTokenTransaction = (await tokenStub.ChargeResourceToken.SendAsync(
                                                      new ChargeResourceTokenInput
            {
                TransactionSize = transactionSize,
                WritesCount = writesCount,
                ReadsCount = readsCount,
                Caller = transactionContext.Transaction.From
            })).Transaction;

            return(new List <Transaction>
            {
                chargeResourceTokenTransaction
            });
        }
Esempio n. 8
0
        public async Task <IEnumerable <Transaction> > GetPreTransactionsAsync(
            IReadOnlyList <ServiceDescriptor> descriptors, ITransactionContext transactionContext)
        {
            try
            {
                var context = _contextService.Create();

                if (_transactionFeeExemptionService.IsFree(transactionContext.Transaction))
                {
                    return(new List <Transaction>());
                }

                context.TransactionContext = transactionContext;
                var tokenContractAddress = context.GetContractAddressByName(TokenSmartContractAddressNameProvider.Name);

                if (context.CurrentHeight < Constants.GenesisBlockHeight + 1 || tokenContractAddress == null)
                {
                    return(new List <Transaction>());
                }

                if (!IsAcs1(descriptors) && transactionContext.Transaction.To != tokenContractAddress)
                {
                    return(new List <Transaction>());
                }

                var tokenStub = new TokenContractContainer.TokenContractStub
                {
                    __factory = new TransactionGeneratingOnlyMethodStubFactory
                    {
                        Sender          = transactionContext.Transaction.From,
                        ContractAddress = tokenContractAddress
                    }
                };
                if (transactionContext.Transaction.To == tokenContractAddress &&
                    transactionContext.Transaction.MethodName == nameof(tokenStub.ChargeTransactionFees))
                {
                    // Skip ChargeTransactionFees itself
                    return(new List <Transaction>());
                }

                var txSize = transactionContext.Transaction.Size();
                var txCost = _calService.CalculateFee(FeeType.Tx, txSize);
                var chargeFeeTransaction = (await tokenStub.ChargeTransactionFees.SendAsync(
                                                new ChargeTransactionFeesInput
                {
                    MethodName = transactionContext.Transaction.MethodName,
                    ContractAddress = transactionContext.Transaction.To,
                    TransactionSizeFee = txCost,
                    PrimaryTokenSymbol = await _primaryTokenSymbolProvider.GetPrimaryTokenSymbol()
                })).Transaction;
                return(new List <Transaction>
                {
                    chargeFeeTransaction
                });
            }
            catch (Exception e)
            {
                Logger.LogError(e, "Failed to generate ChargeTransactionFees tx.");
                throw;
            }
        }
Esempio n. 9
0
        public async Task <IEnumerable <Transaction> > GetPreTransactionsAsync(
            IReadOnlyList <ServiceDescriptor> descriptors, ITransactionContext transactionContext)
        {
            try
            {
                var context = _contextService.Create();

                var systemContractAddresses = new List <Address>
                {
                    context.GetZeroSmartContractAddress(context.ChainId),
                    context.GetContractAddressByName(TokenSmartContractAddressNameProvider.Name),
                    // TODO: Try to use contract address name providers - put providers to one place easy to ref.
                    context.GetContractAddressByName(Hash.FromString("AElf.ContractNames.Consensus")),
                    context.GetContractAddressByName(Hash.FromString("AElf.ContractNames.CrossChain")),
                    context.GetContractAddressByName(Hash.FromString("AElf.ContractNames.Economic")),
                };
                if (systemContractAddresses.Contains(transactionContext.Transaction.To))
                {
                    if (_systemTransactionMethodNameListProvider.GetSystemTransactionMethodNameList()
                        .Contains(transactionContext.Transaction.MethodName))
                    {
                        return(new List <Transaction>());
                    }

                    var methodNameWhiteList = new List <string>
                    {
                        nameof(TokenContractContainer.TokenContractStub.Create),
                        nameof(TokenContractContainer.TokenContractStub.Issue),
                        nameof(TokenContractContainer.TokenContractStub.CrossChainTransfer),
                        nameof(TokenContractContainer.TokenContractStub.CrossChainReceiveToken),
                        "IssueNativeToken"
                    };

                    if (methodNameWhiteList.Contains(transactionContext.Transaction.MethodName))
                    {
                        return(new List <Transaction>());
                    }
                }

                context.TransactionContext = transactionContext;
                var tokenContractAddress = context.GetContractAddressByName(TokenSmartContractAddressNameProvider.Name);

                if (context.CurrentHeight < Constants.GenesisBlockHeight + 1 || tokenContractAddress == null)
                {
                    return(new List <Transaction>());
                }

                if (!IsAcs1(descriptors) && transactionContext.Transaction.To != tokenContractAddress)
                {
                    return(new List <Transaction>());
                }

                var tokenStub = new TokenContractContainer.TokenContractStub
                {
                    __factory = new TransactionGeneratingOnlyMethodStubFactory
                    {
                        Sender          = transactionContext.Transaction.From,
                        ContractAddress = tokenContractAddress
                    }
                };
                if (transactionContext.Transaction.To == tokenContractAddress &&
                    transactionContext.Transaction.MethodName == nameof(tokenStub.ChargeTransactionFees))
                {
                    // Skip ChargeTransactionFees itself
                    return(new List <Transaction>());
                }

                var unitPrice = await _transactionSizeFeeUnitPriceProvider.GetUnitPriceAsync();

                var chargeFeeTransaction = (await tokenStub.ChargeTransactionFees.SendAsync(
                                                new ChargeTransactionFeesInput
                {
                    MethodName = transactionContext.Transaction.MethodName,
                    ContractAddress = transactionContext.Transaction.To,
                    TransactionSizeFee = unitPrice * transactionContext.Transaction.Size(),
                    PrimaryTokenSymbol = await _primaryTokenSymbolProvider.GetPrimaryTokenSymbol()
                })).Transaction;
                return(new List <Transaction>
                {
                    chargeFeeTransaction
                });
            }
            catch (Exception e)
            {
                Logger.LogError("Failed to generate ChargeTransactionFees tx.", e);
                throw;
            }
        }