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); }
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}"); }
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}"); }