Skip to content

Commit b4df4f6

Browse files
authored
Merge pull request #3394 from AElfProject/release/1.3.0
Release v1.3.0
2 parents 8d733b0 + 7b06a33 commit b4df4f6

221 files changed

Lines changed: 21163 additions & 9956 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ scripts/patcher/*
303303

304304
tools
305305
.dotnet
306-
!.idea/
306+
.idea/.idea.AElf.All/*
307307
.idea/.idea.AElf/.idea/contentModel.xml
308308
.idea/.idea.AElf/.idea/encodings.xml
309309
.idea/.idea.AElf/.idea/indexLayout.xml

.travis.yml

Lines changed: 0 additions & 21 deletions
This file was deleted.

AElf.All.sln

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -359,14 +359,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.ContractDeployer.Tests
359359
EndProject
360360
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.Contracts.NFT", "contract\AElf.Contracts.NFT\AElf.Contracts.NFT.csproj", "{0ECCF46E-3989-4A7E-BA31-4E73D7515578}"
361361
EndProject
362-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.Contracts.NFT.Tests", "test\AElf.Contracts.NFT.Tests\AElf.Contracts.NFT.Tests.csproj", "{7E07BD13-74BF-4FD7-A294-07E664C47100}"
363-
EndProject
364362
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.Contracts.TestContract.BigIntValue", "test\AElf.Contracts.TestContract.BigIntValue\AElf.Contracts.TestContract.BigIntValue.csproj", "{F50AF512-69E2-46B5-87C6-E058CE2C2D8A}"
365363
EndProject
366364
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.Kernel.FeatureManager", "src\AElf.Kernel.FeatureManager\AElf.Kernel.FeatureManager.csproj", "{B24BC602-DAFD-4941-A913-8B0725691681}"
367365
EndProject
368366
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.Kernel.FeatureManager.Tests", "test\AElf.Kernel.FeatureManager.Tests\AElf.Kernel.FeatureManager.Tests.csproj", "{1B44277E-74EB-49B2-B8FD-05C29EE51985}"
369367
EndProject
368+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.CSharp.CodeOps.UnitTests", "test\AElf.CSharp.CodeOps.UnitTests\AElf.CSharp.CodeOps.UnitTests.csproj", "{D1A00CD6-958E-4E9F-8325-354309E3029E}"
369+
EndProject
370+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.Kernel.SmartContract.ExecutionPluginForUserContractFee.Tests.TestContract", "test\AElf.Kernel.SmartContract.ExecutionPluginForUserContractFee.Tests.TestContract\AElf.Kernel.SmartContract.ExecutionPluginForUserContractFee.Tests.TestContract.csproj", "{AB27298B-E6BE-4ACB-ADF1-64239E2A7A1C}"
371+
EndProject
370372
Global
371373
GlobalSection(SolutionConfigurationPlatforms) = preSolution
372374
Debug|Any CPU = Debug|Any CPU
@@ -1037,10 +1039,6 @@ Global
10371039
{0ECCF46E-3989-4A7E-BA31-4E73D7515578}.Debug|Any CPU.Build.0 = Debug|Any CPU
10381040
{0ECCF46E-3989-4A7E-BA31-4E73D7515578}.Release|Any CPU.ActiveCfg = Release|Any CPU
10391041
{0ECCF46E-3989-4A7E-BA31-4E73D7515578}.Release|Any CPU.Build.0 = Release|Any CPU
1040-
{7E07BD13-74BF-4FD7-A294-07E664C47100}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1041-
{7E07BD13-74BF-4FD7-A294-07E664C47100}.Debug|Any CPU.Build.0 = Debug|Any CPU
1042-
{7E07BD13-74BF-4FD7-A294-07E664C47100}.Release|Any CPU.ActiveCfg = Release|Any CPU
1043-
{7E07BD13-74BF-4FD7-A294-07E664C47100}.Release|Any CPU.Build.0 = Release|Any CPU
10441042
{F50AF512-69E2-46B5-87C6-E058CE2C2D8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
10451043
{F50AF512-69E2-46B5-87C6-E058CE2C2D8A}.Debug|Any CPU.Build.0 = Debug|Any CPU
10461044
{F50AF512-69E2-46B5-87C6-E058CE2C2D8A}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -1053,6 +1051,14 @@ Global
10531051
{1B44277E-74EB-49B2-B8FD-05C29EE51985}.Debug|Any CPU.Build.0 = Debug|Any CPU
10541052
{1B44277E-74EB-49B2-B8FD-05C29EE51985}.Release|Any CPU.ActiveCfg = Release|Any CPU
10551053
{1B44277E-74EB-49B2-B8FD-05C29EE51985}.Release|Any CPU.Build.0 = Release|Any CPU
1054+
{D1A00CD6-958E-4E9F-8325-354309E3029E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1055+
{D1A00CD6-958E-4E9F-8325-354309E3029E}.Debug|Any CPU.Build.0 = Debug|Any CPU
1056+
{D1A00CD6-958E-4E9F-8325-354309E3029E}.Release|Any CPU.ActiveCfg = Release|Any CPU
1057+
{D1A00CD6-958E-4E9F-8325-354309E3029E}.Release|Any CPU.Build.0 = Release|Any CPU
1058+
{AB27298B-E6BE-4ACB-ADF1-64239E2A7A1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1059+
{AB27298B-E6BE-4ACB-ADF1-64239E2A7A1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
1060+
{AB27298B-E6BE-4ACB-ADF1-64239E2A7A1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
1061+
{AB27298B-E6BE-4ACB-ADF1-64239E2A7A1C}.Release|Any CPU.Build.0 = Release|Any CPU
10561062
EndGlobalSection
10571063
GlobalSection(SolutionProperties) = preSolution
10581064
HideSolutionNode = FALSE
@@ -1234,9 +1240,10 @@ Global
12341240
{C3EEC9D9-F818-4058-B6F3-B71C1C0B8D47} = {4E54480A-D155-43ED-9736-1A5BE7957211}
12351241
{B64C5954-9CC0-4A0B-9453-92324B51C23D} = {4E54480A-D155-43ED-9736-1A5BE7957211}
12361242
{0ECCF46E-3989-4A7E-BA31-4E73D7515578} = {9AA521A5-80BF-4D20-9339-31D7E86D5868}
1237-
{7E07BD13-74BF-4FD7-A294-07E664C47100} = {D3950CC9-808F-4ED8-946A-79A992F3F8EF}
12381243
{F50AF512-69E2-46B5-87C6-E058CE2C2D8A} = {D3950CC9-808F-4ED8-946A-79A992F3F8EF}
12391244
{B24BC602-DAFD-4941-A913-8B0725691681} = {90B310B4-C2DB-419E-B5EE-97FA096B62CC}
12401245
{1B44277E-74EB-49B2-B8FD-05C29EE51985} = {4E54480A-D155-43ED-9736-1A5BE7957211}
1246+
{D1A00CD6-958E-4E9F-8325-354309E3029E} = {4E54480A-D155-43ED-9736-1A5BE7957211}
1247+
{AB27298B-E6BE-4ACB-ADF1-64239E2A7A1C} = {4E54480A-D155-43ED-9736-1A5BE7957211}
12411248
EndGlobalSection
12421249
EndGlobal

README.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
[![Twitter Follow](https://img.shields.io/twitter/follow/aelfblockchain.svg?label=%40aelfblockchain&style=social)](https://twitter.com/aelfblockchain)
88
[![Telegram](https://badgen.net/badge/telegram/join/blue?icon=telegram)](https://t.me/aelfdeveloper)
99

10-
BRANCH | TRAVIS CI | AZURE PIPELINES | TESTS | CODE COVERAGE
11-
-------|-----------|-----------------|-------|--------------
12-
MASTER |[![Build Status](https://travis-ci.org/AElfProject/AElf.svg?branch=master)](https://travis-ci.org/AElfProject/AElf) | [![Build Status](https://dev.azure.com/AElfProject/AElf/_apis/build/status/AElfProject.AElf?branchName=master)](https://dev.azure.com/AElfProject/AElf/_build/latest?definitionId=1&branchName=master) | [![Test Status](https://img.shields.io/azure-devops/tests/AElfProject/AElf/1/master)](https://dev.azure.com/AElfProject/AElf/_build/latest?definitionId=1&branchName=master) | [![codecov](https://codecov.io/gh/AElfProject/AElf/branch/master/graph/badge.svg)](https://codecov.io/gh/AElfProject/AElf)
13-
DEV |[![Build Status](https://travis-ci.org/AElfProject/AElf.svg?branch=dev)](https://travis-ci.org/AElfProject/AElf) | [![Build Status](https://dev.azure.com/AElfProject/AElf/_apis/build/status/AElfProject.AElf?branchName=dev)](https://dev.azure.com/AElfProject/AElf/_build/latest?definitionId=1&branchName=dev) | [![Test Status](https://img.shields.io/azure-devops/tests/AElfProject/AElf/1/dev)](https://dev.azure.com/AElfProject/AElf/_build/latest?definitionId=1&branchName=dev) | [![codecov](https://codecov.io/gh/AElfProject/AElf/branch/dev/graph/badge.svg)](https://codecov.io/gh/AElfProject/AElf)
10+
BRANCH | AZURE PIPELINES | TESTS | CODE COVERAGE
11+
------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------
12+
MASTER | [![Build Status](https://dev.azure.com/AElfProject/AElf/_apis/build/status/AElfProject.AElf?branchName=master)](https://dev.azure.com/AElfProject/AElf/_build/latest?definitionId=1&branchName=master) | [![Test Status](https://img.shields.io/azure-devops/tests/AElfProject/AElf/1/master)](https://dev.azure.com/AElfProject/AElf/_build/latest?definitionId=1&branchName=master) | [![codecov](https://codecov.io/gh/AElfProject/AElf/branch/master/graph/badge.svg)](https://codecov.io/gh/AElfProject/AElf)
13+
DEV | [![Build Status](https://dev.azure.com/AElfProject/AElf/_apis/build/status/AElfProject.AElf?branchName=dev)](https://dev.azure.com/AElfProject/AElf/_build/latest?definitionId=1&branchName=dev) | [![Test Status](https://img.shields.io/azure-devops/tests/AElfProject/AElf/1/dev)](https://dev.azure.com/AElfProject/AElf/_build/latest?definitionId=1&branchName=dev) | [![codecov](https://codecov.io/gh/AElfProject/AElf/branch/dev/graph/badge.svg)](https://codecov.io/gh/AElfProject/AElf)
1414

1515
Welcome to AElf's official GitHub repo !
1616

@@ -19,12 +19,12 @@ AElf is a blockchain system aiming to achieve scalability and extensibility thro
1919
For more information you can follow these links:
2020
* [Official website](https://aelf.io)
2121
* [Documentation](https://docs.aelf.io/en/latest/)
22-
* [Environment setup](https://docs.aelf.io/en/latest/getting-started/development-environment/environment-setup.html)
23-
* [Running a node](https://docs.aelf.io/en/latest/getting-started/development-environment/docker.html)
24-
* [Smart contract development](https://docs.aelf.io/en/latest/getting-started/smart-contract-development/index.html)
22+
* [Environment setup](https://docs.aelf.io/en/latest/getting_started/development-environment/index.html)
23+
* [Running a node](https://docs.aelf.io/en/latest/getting_started/development-environment/node.html)
24+
* [Smart contract development](https://docs.aelf.io/en/latest/getting_started/smart_contracts/index.html)
2525
* [Web Api](https://docs.aelf.io/en/latest/reference/web-api/web-api.html)
2626
* [Testnet](https://docs.aelf.io/en/latest/tutorials/testnet.html)
27-
* [White Paper](https://aelf.io/gridcn/aelf_whitepaper_EN.pdf)
27+
* [White Paper](https://aelf.com/gridcn/aelf_whitepaper_v1.7_en.pdf)
2828

2929
This repository contains the code that runs an AElf node, you'll find bellow other important repositories in the AElf
3030
ecosystem:
@@ -45,8 +45,8 @@ This repo is where you will find the code that can use to run an AElf node. It a
4545

4646
We strongly recommend you follow official documentation that will guide you through installing dependencies and running the node,
4747
these two guides will get you started:
48-
* [Environment setup](https://docs.aelf.io/en/latest/getting-started/development-environment/environment-setup.html)
49-
* [Running a node](https://docs.aelf.io/en/latest/getting-started/development-environment/docker.html)
48+
* [Environment setup](https://docs.aelf.io/en/latest/getting_started/development-environment/index.html)
49+
* [Running a node](https://docs.aelf.io/en/latest/getting_started/development-environment/node.html)
5050

5151
## Contributing
5252

@@ -79,7 +79,7 @@ For any non trivial modification of the code, the pull requests should be associ
7979
- add the tests corresponding to your modifications.
8080
- pull requests should be made against the **dev** branch.
8181

82-
When you are ready for a review by the core team, just remove ```[WIP]``` from your PR's title and others will review. This will either lead to a discussion or to a refactor of the code. The Travis CI system makes sure that every pull request is built for Windows, Linux, and macOS, and that unit tests are run automatically. The CI passing is a pre-condition for the PR to be merged as well as the approval from the core team.
82+
When you are ready for a review by the core team, just remove ```[WIP]``` from your PR's title and others will review. This will either lead to a discussion or to a refactor of the code. The Azure Pipelines CI system makes sure that every pull request is built for Windows, Linux, and macOS, and that unit tests are run automatically. The CI passing is a pre-condition for the PR to be merged as well as the approval from the core team.
8383

8484
## Versioning
8585

bench/AElf.Benchmark/AElf.Benchmark.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<ItemGroup>
1111
<PackageReference Include="BenchmarkDotNet" Version="0.12.1"/>
1212
<PackageReference Include="BenchmarkDotNet.Diagnostics.Windows" Version="0.12.1"/>
13+
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.6.0-1.final" />
1314
</ItemGroup>
1415

1516
<ItemGroup>

contract/AElf.Contracts.CrossChain/CrossChainContract_Helper.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,12 @@ private IndexedParentChainBlockData IndexParentChainBlockData(IList<ParentChainB
795795
}
796796

797797
State.CurrentParentChainHeight.Value = currentHeight;
798+
799+
Context.Fire(new ParentChainIndexed
800+
{
801+
ChainId = parentChainId,
802+
IndexedHeight = currentHeight
803+
});
798804

799805
return indexedParentChainBlockData;
800806
}
@@ -870,6 +876,12 @@ private List<SideChainBlockData> IndexSideChainBlockData(IList<SideChainBlockDat
870876

871877
State.SideChainInfo[chainId] = sideChainInfo;
872878
State.CurrentSideChainHeight[chainId] = currentSideChainHeight;
879+
880+
Context.Fire(new SideChainIndexed
881+
{
882+
ChainId = chainId,
883+
IndexedHeight = currentSideChainHeight
884+
});
873885
}
874886

875887
if (indexedSideChainBlockData.Count > 0)

contract/AElf.Contracts.Election/ElectionContractState.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,5 @@ public partial class ElectionContractState : ContractState
9696
public BoolState ElectionEnabled { get; set; }
9797

9898
public MappedState<Hash, bool> WeightsAlreadyFixedMap { get; set; }
99+
99100
}

contract/AElf.Contracts.Election/ElectionContract_Candidate.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public override Empty AnnounceElection(Address input)
112112
if (State.Candidates.Value.Value.Count <= GetValidationDataCenterCount())
113113
{
114114
State.DataCentersRankingList.Value.DataCenters.Add(pubkey, 0);
115-
RegisterCandidateToSubsidyProfitScheme(address);
115+
RegisterCandidateToSubsidyProfitScheme(pubkey);
116116
}
117117

118118
return new Empty();
@@ -134,7 +134,7 @@ public override Empty AnnounceElectionFor(AnnounceElectionForInput input)
134134
if (State.Candidates.Value.Value.Count <= GetValidationDataCenterCount())
135135
{
136136
State.DataCentersRankingList.Value.DataCenters.Add(pubkey, 0);
137-
RegisterCandidateToSubsidyProfitScheme(address);
137+
RegisterCandidateToSubsidyProfitScheme(pubkey);
138138
}
139139

140140
State.CandidateSponsorMap[input.Pubkey] = Context.Sender;
@@ -208,18 +208,13 @@ private void AddCandidateAsOption(string publicKey)
208208
});
209209
}
210210

211-
private void RegisterCandidateToSubsidyProfitScheme(Address candidateAddress)
211+
private void RegisterCandidateToSubsidyProfitScheme(string candidatePubkey)
212212
{
213213
if (State.ProfitContract.Value == null)
214214
State.ProfitContract.Value =
215215
Context.GetContractAddressByName(SmartContractConstants.ProfitContractSystemName);
216216

217-
// Add 1 Shares for this candidate in subsidy profit scheme.
218-
State.ProfitContract.AddBeneficiary.Send(new AddBeneficiaryInput
219-
{
220-
SchemeId = State.SubsidyHash.Value,
221-
BeneficiaryShare = new BeneficiaryShare { Beneficiary = candidateAddress, Shares = 1 }
222-
});
217+
AddBeneficiary(candidatePubkey);
223218
}
224219

225220
#endregion

contract/AElf.Contracts.Election/ElectionContract_Elector.cs

Lines changed: 60 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using AElf.Contracts.MultiToken;
55
using AElf.Contracts.Profit;
6+
using AElf.Contracts.Treasury;
67
using AElf.Contracts.Vote;
78
using AElf.CSharp.Core;
89
using AElf.Sdk.CSharp;
@@ -106,16 +107,7 @@ public override Empty ChangeVotingOption(ChangeVotingOptionInput input)
106107
dataCenterList.DataCenters.Add(input.CandidatePubkey,
107108
State.CandidateVotes[input.CandidatePubkey].ObtainedActiveVotedVotesAmount);
108109

109-
State.ProfitContract.AddBeneficiary.Send(new AddBeneficiaryInput
110-
{
111-
SchemeId = State.SubsidyHash.Value,
112-
BeneficiaryShare = new BeneficiaryShare
113-
{
114-
Beneficiary =
115-
Address.FromPublicKey(ByteArrayHelper.HexStringToByteArray(input.CandidatePubkey)),
116-
Shares = 1
117-
}
118-
});
110+
AddBeneficiary(input.CandidatePubkey);
119111
}
120112
else
121113
{
@@ -465,16 +457,7 @@ public override Hash Vote(VoteMinerInput input)
465457
{
466458
State.DataCentersRankingList.Value.DataCenters.Add(input.CandidatePubkey,
467459
candidateVotesAmount);
468-
State.ProfitContract.AddBeneficiary.Send(new AddBeneficiaryInput
469-
{
470-
SchemeId = State.SubsidyHash.Value,
471-
BeneficiaryShare = new BeneficiaryShare
472-
{
473-
Beneficiary =
474-
Address.FromPublicKey(ByteArrayHelper.HexStringToByteArray(input.CandidatePubkey)),
475-
Shares = 1
476-
}
477-
});
460+
AddBeneficiary(input.CandidatePubkey);
478461
}
479462
else
480463
{
@@ -749,24 +732,72 @@ private void CandidateReplaceMemberInDataCenter(DataCenterRankingList rankingLis
749732
private void NotifyProfitReplaceCandidateInDataCenter(string oldCandidateInDataCenter,
750733
string newCandidateDataCenter)
751734
{
752-
State.ProfitContract.RemoveBeneficiary.Send(new RemoveBeneficiaryInput
753-
{
754-
SchemeId = State.SubsidyHash.Value,
755-
Beneficiary = Address.FromPublicKey(ByteArrayHelper.HexStringToByteArray(oldCandidateInDataCenter))
756-
});
735+
RemoveBeneficiary(oldCandidateInDataCenter);
736+
757737
if (newCandidateDataCenter == null)
758738
return;
739+
740+
AddBeneficiary(newCandidateDataCenter);
741+
}
742+
743+
#endregion
744+
745+
#region subsidy helper
746+
747+
private Hash GenerateSubsidyId(string pubkey,Address beneficiaryAddress)
748+
{
749+
return HashHelper.ConcatAndCompute(HashHelper.ComputeFrom(pubkey), HashHelper.ComputeFrom(beneficiaryAddress),
750+
HashHelper.ComputeFrom(Context.Self));
751+
}
752+
753+
private Address GetProfitsReceiverOrDefault(string pubkey)
754+
{
755+
if (State.TreasuryContract.Value == null)
756+
State.TreasuryContract.Value =
757+
Context.GetContractAddressByName(SmartContractConstants.TreasuryContractSystemName);
758+
var address = State.TreasuryContract.GetProfitsReceiverOrDefault.Call(new StringValue
759+
{
760+
Value = pubkey
761+
});
762+
return address;
763+
}
764+
765+
private void AddBeneficiary(string candidatePubkey, Address profitsReceiver = null)
766+
{
767+
var beneficiaryAddress = GetBeneficiaryAddress(candidatePubkey, profitsReceiver);
768+
var subsidyId = GenerateSubsidyId(candidatePubkey,beneficiaryAddress);
759769
State.ProfitContract.AddBeneficiary.Send(new AddBeneficiaryInput
760770
{
761771
SchemeId = State.SubsidyHash.Value,
762772
BeneficiaryShare = new BeneficiaryShare
763773
{
764-
Beneficiary =
765-
Address.FromPublicKey(ByteArrayHelper.HexStringToByteArray(newCandidateDataCenter)),
766-
Shares = 1
767-
}
774+
Beneficiary = beneficiaryAddress,
775+
Shares = 1,
776+
},
777+
ProfitDetailId = subsidyId
768778
});
769779
}
770780

781+
private void RemoveBeneficiary(string candidatePubkey,Address profitsReceiver = null)
782+
{
783+
var beneficiaryAddress = GetBeneficiaryAddress(candidatePubkey, profitsReceiver);
784+
var previousSubsidyId = GenerateSubsidyId(candidatePubkey,beneficiaryAddress);
785+
State.ProfitContract.RemoveBeneficiary.Send(new RemoveBeneficiaryInput
786+
{
787+
SchemeId = State.SubsidyHash.Value,
788+
Beneficiary = beneficiaryAddress,
789+
ProfitDetailId = previousSubsidyId
790+
});
791+
}
792+
793+
private Address GetBeneficiaryAddress(string candidatePubkey, Address profitsReceiver = null)
794+
{
795+
profitsReceiver = profitsReceiver == null ? GetProfitsReceiverOrDefault(candidatePubkey) : profitsReceiver;
796+
var beneficiaryAddress = profitsReceiver.Value.Any()
797+
? profitsReceiver
798+
: Address.FromPublicKey(ByteArrayHelper.HexStringToByteArray(candidatePubkey));
799+
return beneficiaryAddress;
800+
}
801+
771802
#endregion
772803
}

0 commit comments

Comments
 (0)