Skip to content

Commit 0361d03

Browse files
committed
fix: store TokenHolder scheme under manager address instead of caller
1 parent 2d25fe2 commit 0361d03

File tree

3 files changed

+74
-4
lines changed

3 files changed

+74
-4
lines changed

contract/AElf.Contracts.TokenHolder/TokenHolderContract.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public partial class TokenHolderContract : TokenHolderContractImplContainer.Toke
1313
{
1414
public override Empty CreateScheme(CreateTokenHolderProfitSchemeInput input)
1515
{
16+
Assert(State.TokenHolderProfitSchemes[Context.Sender] == null, "Token holder profit scheme already exists.");
17+
1618
if (State.ProfitContract.Value == null)
1719
State.ProfitContract.Value =
1820
Context.GetContractAddressByName(SmartContractConstants.ProfitContractSystemName);
@@ -52,7 +54,7 @@ public override Empty AddBeneficiary(AddTokenHolderBeneficiaryInput input)
5254
SchemeId = scheme.SchemeId,
5355
Beneficiary = input.Beneficiary
5456
});
55-
shares.Add(detail.Details.Single().Shares);
57+
shares = shares.Add(detail.Details.Single().Shares);
5658
}
5759

5860
State.ProfitContract.AddBeneficiary.Send(new AddBeneficiaryInput
@@ -295,6 +297,6 @@ private void UpdateTokenHolderProfitScheme(ref TokenHolderProfitScheme scheme, A
295297
var originScheme = State.ProfitContract.GetScheme.Call(originSchemeId);
296298
scheme.SchemeId = originScheme.SchemeId;
297299
scheme.Period = originScheme.CurrentPeriod;
298-
State.TokenHolderProfitSchemes[Context.Sender] = scheme;
300+
State.TokenHolderProfitSchemes[manager] = scheme;
299301
}
300302
}

test/AElf.Contracts.TokenHolder.Tests/TokenHolderContractTestBase.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ public class TokenHolderContractTestBase : ContractTestBase<TokenHolderContractT
3535
protected Address Receiver => Accounts[1].Address;
3636

3737
protected List<ECKeyPair> UserKeyPairs => Accounts.Skip(2).Take(3).Select(a => a.KeyPair).ToList();
38+
39+
protected ECKeyPair OtherKeyPair => Accounts[2].KeyPair;
40+
protected Address Other => Accounts[2].Address;
3841

3942
protected List<Address> UserAddresses =>
4043
UserKeyPairs.Select(k => Address.FromPublicKey(k.PublicKey)).ToList();
@@ -58,6 +61,8 @@ public class TokenHolderContractTestBase : ContractTestBase<TokenHolderContractT
5861
internal ParliamentContractImplContainer.ParliamentContractImplStub ParliamentContractStub { get; set; }
5962

6063
internal TokenHolderContractImplContainer.TokenHolderContractImplStub TokenHolderContractStub { get; set; }
64+
65+
internal TokenHolderContractImplContainer.TokenHolderContractImplStub OtherTokenHolderContractStub { get; set; }
6166

6267
internal DAppContainer.DAppStub DAppContractStub { get; set; }
6368

@@ -90,6 +95,8 @@ protected void InitializeContracts()
9095
new SystemContractDeploymentInput.Types.SystemTransactionMethodCallList()
9196
})).Output;
9297
TokenHolderContractStub = GetTokenHolderContractTester(StarterKeyPair);
98+
99+
OtherTokenHolderContractStub = GetTokenHolderContractTester(OtherKeyPair);
93100

94101
//deploy parliament auth contract
95102
ParliamentContractAddress = AsyncHelper.RunSync(() => GetContractZeroTester(StarterKeyPair)

test/AElf.Contracts.TokenHolder.Tests/TokenHolderTests.cs

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,71 @@ await TokenHolderContractStub.ContributeProfits.SendAsync(new ContributeProfitsI
5454

5555
{
5656
var tokenHolderProfitScheme = await TokenHolderContractStub.GetScheme.CallAsync(Starter);
57-
tokenHolderProfitScheme.SchemeId.ShouldNotBeNull();
57+
var schemeId = tokenHolderProfitScheme.SchemeId;
58+
schemeId.ShouldNotBeNull();
59+
60+
var result = await TokenHolderContractStub.CreateScheme.SendWithExceptionAsync(new CreateTokenHolderProfitSchemeInput
61+
{
62+
Symbol = "AUG"
63+
});
64+
65+
result.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
66+
result.TransactionResult.Error.ShouldContain("Token holder profit scheme already exists");
5867
}
5968
}
6069

70+
[Fact]
71+
public async Task AddBeneficiaryWithWrongManagerTest()
72+
{
73+
var symbol = "AUG";
74+
var totalSupply = 10000000;
75+
var transferAmount = 1000;
76+
await StarterCreateIssueAndApproveTokenAsync(symbol, totalSupply, totalSupply);
77+
await TokenHolderContractStub.CreateScheme.SendAsync(new CreateTokenHolderProfitSchemeInput
78+
{
79+
Symbol = symbol
80+
});
81+
82+
await TokenContractStub.Transfer.SendAsync(new TransferInput
83+
{
84+
To = Other,
85+
Amount = transferAmount,
86+
Symbol = symbol
87+
});
88+
89+
await OtherTokenHolderContractStub.RegisterForProfits.SendAsync(new RegisterForProfitsInput
90+
{
91+
SchemeManager = Starter,
92+
Amount = 10
93+
});
94+
95+
var tokenHolderProfitScheme = await TokenHolderContractStub.GetScheme.CallAsync(Other);
96+
tokenHolderProfitScheme.SchemeId.ShouldBeNull();
97+
tokenHolderProfitScheme.Symbol.ShouldBeEmpty();
98+
99+
tokenHolderProfitScheme = await TokenHolderContractStub.GetScheme.CallAsync(Starter);
100+
101+
var scheme = await ProfitContractStub.GetScheme.CallAsync(tokenHolderProfitScheme.SchemeId);
102+
scheme.TotalShares.ShouldBe(10);
103+
104+
var result = await OtherTokenHolderContractStub.AddBeneficiary.SendWithExceptionAsync(new AddTokenHolderBeneficiaryInput
105+
{
106+
Beneficiary = Other,
107+
Shares = 100
108+
});
109+
result.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
110+
result.TransactionResult.Error.ShouldContain("Token holder profit scheme not found");
111+
112+
await TokenHolderContractStub.AddBeneficiary.SendAsync(new AddTokenHolderBeneficiaryInput
113+
{
114+
Beneficiary = Other,
115+
Shares = 100
116+
});
117+
118+
scheme = await ProfitContractStub.GetScheme.CallAsync(tokenHolderProfitScheme.SchemeId);
119+
scheme.TotalShares.ShouldBe(110);
120+
}
121+
61122
[Fact]
62123
public async Task ContributeProfitsTest()
63124
{
@@ -130,7 +191,7 @@ await TokenHolderContractStub.AddBeneficiary.SendAsync(new AddTokenHolderBenefic
130191

131192
{
132193
var originScheme = await ProfitContractStub.GetScheme.CallAsync(tokenHolderProfitScheme.SchemeId);
133-
originScheme.TotalShares.ShouldBe(newShare);
194+
originScheme.TotalShares.ShouldBe(newShare + 1);
134195
}
135196
}
136197

0 commit comments

Comments
 (0)