private async Task ProcessCodeUpdateAsync(Chain chain)
        {
            var chainContext = new ChainContext
            {
                BlockHash   = chain.BestChainHash,
                BlockHeight = chain.BestChainHeight
            };
            var address = await _smartContractAddressService.GetAddressByContractNameAsync(chainContext,
                                                                                           ConfigurationSmartContractAddressNameProvider.StringName);

            var transaction = new Transaction
            {
                From       = _smartContractAddressService.GetZeroSmartContractAddress(),
                To         = _smartContractAddressService.GetZeroSmartContractAddress(),
                MethodName = nameof(ACS0Container.ACS0Stub.UpdateSmartContract),
                Params     = new ContractUpdateInput
                {
                    Code = ByteString.CopyFrom(
                        _smartContractExecutionHelper.ContractCodes["AElf.Contracts.MultiToken"]),
                    Address = address
                }.ToByteString()
            };
            var blockExecutedSet = await _smartContractExecutionHelper.ExecuteTransactionAsync(transaction, chain);

            var interestedEvent = await _codeUpdatedLogEventProcessor.GetInterestedEventAsync(chainContext);

            foreach (var transactionResult in blockExecutedSet.TransactionResultMap.Values)
            {
                var logEvent = transactionResult.Logs.First(l =>
                                                            l.Address == interestedEvent.LogEvent.Address && l.Name == interestedEvent.LogEvent.Name);
                var codeUpdated = new CodeUpdated();
                codeUpdated.MergeFrom(logEvent);
                var smartContractRegistration = await _smartContractRegistrationProvider.GetSmartContractRegistrationAsync(chainContext,
                                                                                                                           codeUpdated.Address);

                await _codeUpdatedLogEventProcessor.ProcessAsync(blockExecutedSet.Block,
                                                                 new Dictionary <TransactionResult, List <LogEvent> >
                {
                    { transactionResult, new List <LogEvent> {
                          logEvent
                      } }
                });

                chainContext = new ChainContext
                {
                    BlockHash   = blockExecutedSet.Block.GetHash(),
                    BlockHeight = blockExecutedSet.Block.Height
                };
                var updatedSmartContractRegistration = await _smartContractRegistrationProvider.GetSmartContractRegistrationAsync(chainContext,
                                                                                                                                  codeUpdated.Address);

                updatedSmartContractRegistration.ShouldNotBe(smartContractRegistration);
                updatedSmartContractRegistration.Code.ShouldBe(ByteString.CopyFrom(
                                                                   _smartContractExecutionHelper.ContractCodes["AElf.Contracts.MultiToken"]));
            }
        }
        public async Task HandleAsync(Block block, TransactionResult transactionResult, LogEvent logEvent)
        {
            var eventData = new CodeUpdated();

            eventData.MergeFrom(logEvent);

            await _smartContractRegistrationService.AddSmartContractRegistrationAsync(eventData.Address, eventData.NewCodeHash,
                                                                                      new BlockIndex
            {
                BlockHash   = block.GetHash(),
                BlockHeight = block.Height
            });

            Logger.LogDebug($"Updated contract {eventData}");
        }
        public Task HandleAsync(Block block, TransactionResult transactionResult, LogEvent logEvent)
        {
            var eventData = new CodeUpdated();

            eventData.MergeFrom(logEvent);

            _smartContractExecutiveProvider.AddSmartContractRegistration(eventData.Address, eventData.NewCodeHash,
                                                                         new BlockIndex
            {
                BlockHash   = block.GetHash(),
                BlockHeight = block.Height
            });
            Logger.LogDebug($"Updated contract {eventData}");
            return(Task.CompletedTask);
        }
Example #4
0
        protected override async Task ProcessLogEventAsync(Block block, LogEvent logEvent)
        {
            var eventData = new CodeUpdated();

            eventData.MergeFrom(logEvent);

            var chainContext = new ChainContext
            {
                BlockHash   = block.GetHash(),
                BlockHeight = block.Height
            };
            var smartContractRegistration =
                await _smartContractRegistrationInStateProvider.GetSmartContractRegistrationAsync(chainContext,
                                                                                                  eventData.Address);

            await _smartContractRegistrationProvider.SetSmartContractRegistrationAsync(chainContext, eventData.Address,
                                                                                       smartContractRegistration);

            _smartContractExecutiveService.CleanExecutive(eventData.Address);

            Logger.LogDebug($"Updated contract {eventData}");
        }
Example #5
0
        public async Task ProcessAsync(Block block, TransactionResult transactionResult, LogEvent logEvent)
        {
            var eventData = new CodeUpdated();

            eventData.MergeFrom(logEvent);

            var smartContractRegistration =
                await _smartContractRegistrationInStateProvider.GetSmartContractRegistrationAsync(new ChainContext
            {
                BlockHash   = block.GetHash(),
                BlockHeight = block.Height
            }, eventData.Address);

            await _smartContractRegistrationProvider.SetSmartContractRegistrationAsync(new BlockIndex
            {
                BlockHash   = block.GetHash(),
                BlockHeight = block.Height
            }, eventData.Address, smartContractRegistration);

            _smartContractExecutiveService.CleanExecutive(eventData.Address);
            Logger.LogDebug($"Updated contract {eventData}");
        }