diff --git a/.Lib9c.Tests/Action/DPoS/CancelUndelegationTest.cs b/.Lib9c.Tests/Action/DPoS/CancelUndelegationTest.cs index 2c5cc72268..ff9b0c3d09 100644 --- a/.Lib9c.Tests/Action/DPoS/CancelUndelegationTest.cs +++ b/.Lib9c.Tests/Action/DPoS/CancelUndelegationTest.cs @@ -8,6 +8,8 @@ using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; using Nekoyume.Action.DPoS.Sys; + using Nekoyume.Model.State; + using Nekoyume.Module; using Xunit; public class CancelUndelegationTest : PoSTest @@ -21,22 +23,24 @@ public void Execute() var validatorAddress = Nekoyume.Action.DPoS.Model.Validator.DeriveAddress(validatorOperatorAddress); var delegatorAddress = delegatorPrivateKey.Address; - var states = InitializeStates(); + var states = InitialState; // Prepare initial governance token for the delegator and validator - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, validatorOperatorAddress, - Asset.GovernanceToken * 100); - states = states.MintAsset( - new ActionContext { PreviousState = states }, + GovernanceToken * 100); + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, delegatorAddress, - Asset.GovernanceToken * 50); + GovernanceToken * 50); // Promote the validator states = new PromoteValidator( validatorPrivateKey.PublicKey, - amount: Asset.GovernanceToken * 100) + amount: GovernanceToken * 100) .Execute( new ActionContext { PreviousState = states, Signer = validatorOperatorAddress }); @@ -45,7 +49,7 @@ public void Execute() new ActionContext { PreviousState = states, Miner = validatorOperatorAddress }); // Delegate the delegator - states = new Nekoyume.Action.DPoS.Delegate(validatorAddress, Asset.GovernanceToken * 50).Execute( + states = new Nekoyume.Action.DPoS.Delegate(validatorAddress, GovernanceToken * 50).Execute( new ActionContext { PreviousState = states, Signer = delegatorAddress }); states = new UpdateValidators().Execute(new ActionContext { PreviousState = states }); @@ -82,22 +86,24 @@ public void CancelAll() var validatorAddress = Nekoyume.Action.DPoS.Model.Validator.DeriveAddress(validatorOperatorAddress); var delegatorAddress = delegatorPrivateKey.Address; - var states = InitializeStates(); + var states = InitialState; // Prepare initial governance token for the delegator and validator - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, validatorOperatorAddress, - Asset.GovernanceToken * 100); - states = states.MintAsset( - new ActionContext { PreviousState = states }, + GovernanceToken * 100); + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, delegatorAddress, - Asset.GovernanceToken * 50); + GovernanceToken * 50); // Promote the validator states = new PromoteValidator( validatorPrivateKey.PublicKey, - amount: Asset.GovernanceToken * 100) + amount: GovernanceToken * 100) .Execute( new ActionContext { PreviousState = states, Signer = validatorOperatorAddress }); @@ -106,7 +112,7 @@ public void CancelAll() new ActionContext { PreviousState = states, Miner = validatorOperatorAddress }); // Delegate the delegator - states = new Nekoyume.Action.DPoS.Delegate(validatorAddress, Asset.GovernanceToken * 50).Execute( + states = new Nekoyume.Action.DPoS.Delegate(validatorAddress, GovernanceToken * 50).Execute( new ActionContext { PreviousState = states, Signer = delegatorAddress }); states = new UpdateValidators().Execute(new ActionContext { PreviousState = states }); diff --git a/.Lib9c.Tests/Action/DPoS/Control/DelegateCtrlTest.cs b/.Lib9c.Tests/Action/DPoS/Control/DelegateCtrlTest.cs index e490bd912a..1def54ee71 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/DelegateCtrlTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/DelegateCtrlTest.cs @@ -8,6 +8,7 @@ namespace Lib9c.Tests.Action.DPoS.Control using Nekoyume.Action.DPoS.Exception; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; + using Nekoyume.Model.State; using Nekoyume.Module; using Xunit; @@ -26,9 +27,8 @@ public DelegateCtrlTest() _operatorAddress = _operatorPublicKey.Address; _delegatorAddress = CreateAddress(); _validatorAddress = Validator.DeriveAddress(_operatorAddress); - _nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); - _states = InitializeStates(); + _states = InitialState; + _nativeTokens = NativeTokens; } [Fact] @@ -42,7 +42,7 @@ public void InvalidCurrencyTest() BlockIndex = 1, }, _delegatorAddress, - Asset.ConsensusFromGovernance(50)); + Asset.ConvertTokens(GovernanceToken * 50, Asset.ConsensusToken)); Assert.Throws( () => _states = DelegateCtrl.Execute( _states, @@ -53,7 +53,7 @@ public void InvalidCurrencyTest() }, _delegatorAddress, _validatorAddress, - Asset.ConsensusFromGovernance(30), + Asset.ConvertTokens(GovernanceToken * 30, Asset.ConsensusToken), _nativeTokens)); } @@ -71,7 +71,7 @@ public void InvalidValidatorTest() }, _delegatorAddress, CreateAddress(), - Asset.GovernanceToken * 10, + GovernanceToken * 10, _nativeTokens)); } @@ -86,7 +86,7 @@ public void InvalidShareTest() BlockIndex = 1, }, _validatorAddress, - Asset.ConsensusFromGovernance(100)); + Asset.ConvertTokens(PoSTest.GovernanceToken * 100, Asset.ConsensusToken)); Assert.Throws( () => _states = DelegateCtrl.Execute( _states, @@ -97,7 +97,7 @@ public void InvalidShareTest() }, _delegatorAddress, _validatorAddress, - Asset.GovernanceToken * 10, + GovernanceToken * 10, _nativeTokens)); } @@ -120,16 +120,16 @@ public void BalanceTest( }, _delegatorAddress, _validatorAddress, - Asset.GovernanceToken * delegateAmount, + GovernanceToken * delegateAmount, _nativeTokens); Assert.Equal( - Asset.GovernanceToken * 0, - _states.GetBalance(_validatorAddress, Asset.GovernanceToken)); + GovernanceToken * 0, + _states.GetBalance(_validatorAddress, GovernanceToken)); Assert.Equal( - Asset.ConsensusFromGovernance(0), + Asset.ConvertTokens(GovernanceToken * 0, Asset.ConsensusToken), _states.GetBalance(_operatorAddress, Asset.ConsensusToken)); Assert.Equal( - Asset.ConsensusFromGovernance(0), + Asset.ConvertTokens(GovernanceToken * 0, Asset.ConsensusToken), _states.GetBalance(_delegatorAddress, Asset.ConsensusToken)); Assert.Equal( ShareFromGovernance(0), @@ -138,17 +138,17 @@ public void BalanceTest( ShareFromGovernance(0), _states.GetBalance(_delegatorAddress, Asset.Share)); Assert.Equal( - Asset.ConsensusFromGovernance(selfDelegateAmount + delegateAmount), + Asset.ConvertTokens(GovernanceToken * (selfDelegateAmount + delegateAmount), Asset.ConsensusToken), _states.GetBalance(_validatorAddress, Asset.ConsensusToken)); Assert.Equal( - Asset.GovernanceToken * (operatorMintAmount - selfDelegateAmount), - _states.GetBalance(_operatorAddress, Asset.GovernanceToken)); + GovernanceToken * (operatorMintAmount - selfDelegateAmount), + _states.GetBalance(_operatorAddress, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken * (delegatorMintAmount - delegateAmount), - _states.GetBalance(_delegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (delegatorMintAmount - delegateAmount), + _states.GetBalance(_delegatorAddress, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken * (selfDelegateAmount + delegateAmount), - _states.GetBalance(ReservedAddress.UnbondedPool, Asset.GovernanceToken)); + GovernanceToken * (selfDelegateAmount + delegateAmount), + _states.GetBalance(ReservedAddress.UnbondedPool, GovernanceToken)); var balanceA = _states.GetBalance( Delegation.DeriveAddress(_operatorAddress, _validatorAddress), Asset.Share); @@ -163,23 +163,16 @@ public void BalanceTest( private void Initialize( int operatorMintAmount, int delegatorMintAmount, int selfDelegateAmount) { - _states = InitializeStates(); - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, _operatorAddress, - Asset.GovernanceToken * operatorMintAmount); - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + GovernanceToken * operatorMintAmount); + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, _delegatorAddress, - Asset.GovernanceToken * delegatorMintAmount); + GovernanceToken * delegatorMintAmount); _states = ValidatorCtrl.Create( _states, new ActionContext @@ -189,7 +182,7 @@ private void Initialize( }, _operatorAddress, _operatorPublicKey, - Asset.GovernanceToken * selfDelegateAmount, + GovernanceToken * selfDelegateAmount, _nativeTokens); } } diff --git a/.Lib9c.Tests/Action/DPoS/Control/EvidenceCtrlTest.cs b/.Lib9c.Tests/Action/DPoS/Control/EvidenceCtrlTest.cs index 8ced766ce4..a36c5faa26 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/EvidenceCtrlTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/EvidenceCtrlTest.cs @@ -20,8 +20,7 @@ public class EvidenceCtrlTest : PoSTest private readonly Address _operatorAddress; private readonly Address _delegatorAddress; private readonly Address _validatorAddress; - private readonly FungibleAssetValue _governanceToken - = new FungibleAssetValue(Asset.GovernanceToken, 100, 0); + private readonly FungibleAssetValue _governanceTokens = GovernanceToken * 100; private IWorld _states; @@ -31,13 +30,13 @@ public EvidenceCtrlTest() _operatorAddress = _operatorPublicKey.Address; _delegatorAddress = CreateAddress(); _validatorAddress = Validator.DeriveAddress(_operatorAddress); - _states = InitializeStates(); + _states = InitialState; } [Fact] public void Execute_Test() { - var governanceToken = _governanceToken; + var governanceTokens = _governanceTokens; var states = _states; var operatorPublicKey = _operatorPublicKey; var validatorAddress = _validatorAddress; @@ -46,7 +45,7 @@ public void Execute_Test() states: states, blockIndex: 1, operatorPublicKey: operatorPublicKey, - ncg: governanceToken); + ncg: governanceTokens); states = Update( states: states, blockIndex: 1); @@ -80,7 +79,7 @@ public void Execute_Test() [Fact] public void Execute_MaxAge_Test() { - var governanceToken = _governanceToken; + var governanceTokens = _governanceTokens; var states = _states; var operatorPublicKey = _operatorPublicKey; var validatorAddress = _validatorAddress; @@ -90,7 +89,7 @@ public void Execute_MaxAge_Test() states: states, blockIndex: blockIndex, operatorPublicKey: operatorPublicKey, - ncg: governanceToken); + ncg: governanceTokens); states = Update( states: states, blockIndex: blockIndex); diff --git a/.Lib9c.Tests/Action/DPoS/Control/RedelegateCtrlTest.cs b/.Lib9c.Tests/Action/DPoS/Control/RedelegateCtrlTest.cs index 58cadf3122..fb5cb2f01b 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/RedelegateCtrlTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/RedelegateCtrlTest.cs @@ -10,6 +10,7 @@ namespace Lib9c.Tests.Action.DPoS.Control using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; using Nekoyume.Action.DPoS.Util; + using Nekoyume.Model.State; using Nekoyume.Module; using Xunit; @@ -37,9 +38,8 @@ public RedelegateCtrlTest() _dstValidatorAddress = Validator.DeriveAddress(_dstOperatorAddress); _redelegationAddress = Redelegation.DeriveAddress( _delegatorAddress, _srcValidatorAddress, _dstValidatorAddress); - _nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); - _states = InitializeStates(); + _states = InitialState; + _nativeTokens = NativeTokens; } [Fact] @@ -53,7 +53,7 @@ public void InvalidCurrencyTest() BlockIndex = 1, }, _delegatorAddress, - Asset.ConsensusFromGovernance(50)); + Asset.ConvertTokens(GovernanceToken * 50, Asset.ConsensusToken)); Assert.Throws( () => _states = RedelegateCtrl.Execute( _states, @@ -65,7 +65,7 @@ public void InvalidCurrencyTest() _delegatorAddress, _srcValidatorAddress, _dstValidatorAddress, - Asset.ConsensusFromGovernance(30), + Asset.ConvertTokens(GovernanceToken * 30, Asset.ConsensusToken), _nativeTokens)); Assert.Throws( () => _states = RedelegateCtrl.Execute( @@ -78,7 +78,7 @@ public void InvalidCurrencyTest() _delegatorAddress, _srcValidatorAddress, _dstValidatorAddress, - Asset.GovernanceToken * 30, + GovernanceToken * 30, _nativeTokens)); } @@ -242,19 +242,19 @@ public void BalanceTest( Asset.Share * redelegateAmount, _nativeTokens); Assert.Equal( - Asset.GovernanceToken * 0, - _states.GetBalance(_srcValidatorAddress, Asset.GovernanceToken)); + GovernanceToken * 0, + _states.GetBalance(_srcValidatorAddress, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken * 0, - _states.GetBalance(_dstValidatorAddress, Asset.GovernanceToken)); + GovernanceToken * 0, + _states.GetBalance(_dstValidatorAddress, GovernanceToken)); Assert.Equal( - Asset.ConsensusFromGovernance(0), + Asset.ConsensusFromGovernance(GovernanceToken * 0), _states.GetBalance(_srcOperatorAddress, Asset.ConsensusToken)); Assert.Equal( - Asset.ConsensusFromGovernance(0), + Asset.ConsensusFromGovernance(GovernanceToken * 0), _states.GetBalance(_dstOperatorAddress, Asset.ConsensusToken)); Assert.Equal( - Asset.ConsensusFromGovernance(0), + Asset.ConsensusFromGovernance(GovernanceToken * 0), _states.GetBalance(_delegatorAddress, Asset.ConsensusToken)); Assert.Equal( ShareFromGovernance(0), @@ -266,17 +266,17 @@ public void BalanceTest( ShareFromGovernance(0), _states.GetBalance(_delegatorAddress, Asset.Share)); Assert.Equal( - Asset.GovernanceToken * (operatorMintAmount - selfDelegateAmount), - _states.GetBalance(_srcOperatorAddress, Asset.GovernanceToken)); + GovernanceToken * (operatorMintAmount - selfDelegateAmount), + _states.GetBalance(_srcOperatorAddress, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken * (operatorMintAmount - selfDelegateAmount), - _states.GetBalance(_dstOperatorAddress, Asset.GovernanceToken)); + GovernanceToken * (operatorMintAmount - selfDelegateAmount), + _states.GetBalance(_dstOperatorAddress, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken * (delegatorMintAmount - delegateAmount), - _states.GetBalance(_delegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (delegatorMintAmount - delegateAmount), + _states.GetBalance(_delegatorAddress, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken * (2 * selfDelegateAmount + delegateAmount), - _states.GetBalance(ReservedAddress.UnbondedPool, Asset.GovernanceToken)); + GovernanceToken * (2 * selfDelegateAmount + delegateAmount), + _states.GetBalance(ReservedAddress.UnbondedPool, GovernanceToken)); var balanceA = _states.GetBalance( Delegation.DeriveAddress( _srcOperatorAddress, @@ -308,11 +308,11 @@ public void BalanceTest( RedelegateCtrl.GetRedelegation(_states, _redelegationAddress)! .RedelegationEntryAddresses[0])!); Assert.Equal( - Asset.ConsensusFromGovernance(selfDelegateAmount + delegateAmount) + Asset.ConsensusFromGovernance(GovernanceToken * (selfDelegateAmount + delegateAmount)) - entry.UnbondingConsensusToken, _states.GetBalance(_srcValidatorAddress, Asset.ConsensusToken)); Assert.Equal( - Asset.ConsensusFromGovernance(selfDelegateAmount) + Asset.ConsensusFromGovernance(GovernanceToken * selfDelegateAmount) + entry.UnbondingConsensusToken, _states.GetBalance(_dstValidatorAddress, Asset.ConsensusToken)); } @@ -323,31 +323,21 @@ private void Initialize( int selfDelegateAmount, int delegateAmount) { - _states = InitializeStates(); - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, _srcOperatorAddress, - Asset.GovernanceToken * operatorMintAmount); - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + GovernanceToken * operatorMintAmount); + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, _dstOperatorAddress, - Asset.GovernanceToken * operatorMintAmount); - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + GovernanceToken * operatorMintAmount); + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, _delegatorAddress, - Asset.GovernanceToken * delegatorMintAmount); + GovernanceToken * delegatorMintAmount); _states = ValidatorCtrl.Create( _states, new ActionContext @@ -357,7 +347,7 @@ private void Initialize( }, _srcOperatorAddress, _srcOperatorPublicKey, - Asset.GovernanceToken * selfDelegateAmount, + GovernanceToken * selfDelegateAmount, _nativeTokens); _states = ValidatorCtrl.Create( _states, @@ -368,7 +358,7 @@ private void Initialize( }, _dstOperatorAddress, _dstOperatorPublicKey, - Asset.GovernanceToken * selfDelegateAmount, + GovernanceToken * selfDelegateAmount, _nativeTokens); _states = DelegateCtrl.Execute( _states, @@ -379,7 +369,7 @@ private void Initialize( }, _delegatorAddress, _srcValidatorAddress, - Asset.GovernanceToken * delegateAmount, + GovernanceToken * delegateAmount, _nativeTokens); } } diff --git a/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlComplexTest.cs b/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlComplexTest.cs index 41d3036b9e..de5ec83d2c 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlComplexTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlComplexTest.cs @@ -42,7 +42,7 @@ public SlashCtrlComplexTest() _validatorAddresses = _operatorAddresses .Select(item => Validator.DeriveAddress(item)) .ToArray(); - _states = InitializeStates(); + _states = InitialState; } [Theory] diff --git a/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlTest.cs b/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlTest.cs index 3cc8207509..3b9176aff9 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlTest.cs @@ -20,8 +20,7 @@ public class SlashCtrlTest : SlashCtrlTestBase private readonly Address[] _operatorAddresses; private readonly Address[] _delegatorAddresses; private readonly Address[] _validatorAddresses; - private readonly FungibleAssetValue _defaultNCG - = new FungibleAssetValue(Asset.GovernanceToken, 1, 0); + private readonly FungibleAssetValue _defaultNCG = GovernanceToken * 1; private IWorld _states; @@ -37,7 +36,7 @@ public SlashCtrlTest() _validatorAddresses = _operatorAddresses .Select(item => Validator.DeriveAddress(item)) .ToArray(); - _states = InitializeStates(); + _states = InitialState; } [Theory] @@ -691,7 +690,7 @@ public void Slash_NegativeSlashFactor_FailTest(int slashFactor) states: states, blockIndex: 1, operatorPublicKey: operatorPublicKey, - ncg: new FungibleAssetValue(Asset.GovernanceToken, 100, 0)); + ncg: GovernanceToken * 100); Assert.Throws(() => { @@ -710,7 +709,7 @@ public void Slash_NegativeSlashFactor_FailTest(int slashFactor) public void Slash_FutureBlockHeight_FailTest() { var validatorNCG = _defaultNCG; - var consensusToken = Asset.ConsensusFromGovernance(validatorNCG); + var consensusToken = Asset.ConvertTokens(validatorNCG, Asset.ConsensusToken); var operatorPublicKey = _operatorPublicKeys[0]; var validatorAddress = _validatorAddresses[0]; @@ -884,7 +883,7 @@ public void Unjail_PowerIsLessThanMinimum_FailTest() blockIndex: 2, validatorAddress: validatorAddress, infractionHeight: 1, - power: Asset.ConsensusFromGovernance(validatorNCG).RawValue, + power: Asset.ConvertTokens(validatorNCG, Asset.ConsensusToken).RawValue, slashFactor: 2); states = Jail( states: states, diff --git a/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlTestBase.cs b/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlTestBase.cs index 15598a53a1..193798f32d 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlTestBase.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/SlashCtrlTestBase.cs @@ -13,11 +13,9 @@ namespace Lib9c.Tests.Action.DPoS.Control public abstract class SlashCtrlTestBase : PoSTest { - public static readonly FungibleAssetValue ZeroNCG - = new FungibleAssetValue(Asset.GovernanceToken, 0, 0); + public static readonly FungibleAssetValue ZeroNCG = GovernanceToken * 0; - public static readonly FungibleAssetValue ZeroPower - = new FungibleAssetValue(Asset.ConsensusToken, 0, 0); + public static readonly FungibleAssetValue ZeroPower = Asset.ConsensusToken * 0; protected static FungibleAssetValue SlashPower( FungibleAssetValue value, @@ -39,10 +37,10 @@ protected static FungibleAssetValue SlashNCG( BigInteger factor, params FungibleAssetValue[] assetsToSlashFirst) { - if (!value.Currency.Equals(Asset.GovernanceToken)) + if (!value.Currency.Equals(GovernanceToken)) { throw new ArgumentException( - message: $"'{value.Currency}' is different from '{Asset.GovernanceToken}'.", + message: $"'{value.Currency}' is different from '{GovernanceToken}'.", paramName: nameof(value)); } @@ -59,7 +57,7 @@ protected static FungibleAssetValue SumPower(IEnumerable val => Sum(values, Asset.ConsensusToken); protected static FungibleAssetValue SumNCG(IEnumerable values) - => Sum(values, Asset.GovernanceToken); + => Sum(values, GovernanceToken); protected static FungibleAssetValue GetPower(IWorldState worldState, Address validatorAddress) { @@ -72,7 +70,7 @@ protected static FungibleAssetValue GetNCG(IWorldState worldState, Address addre { return worldState.GetBalance( address: address, - currency: Asset.GovernanceToken); + currency: GovernanceToken); } protected static FungibleAssetValue GetShare(IWorldState worldState, Address validatorAddress) @@ -103,7 +101,7 @@ protected static FungibleAssetValue[] GetSlashAmounts(FungibleAssetValue[] value protected static FungibleAssetValue NextNCG() { return new FungibleAssetValue( - currency: Asset.GovernanceToken, + currency: GovernanceToken, majorUnit: Random.Shared.Next(1, 100), minorUnit: Random.Shared.Next(0, 100)); } @@ -116,7 +114,11 @@ protected static FungibleAssetValue[] NextNCGMany(int length) } protected static FungibleAssetValue PowerFromNCG(FungibleAssetValue value) - => Asset.ConsensusFromGovernance(value); + => value.Currency.Equals(GovernanceToken) + ? Asset.ConvertTokens(value, Asset.ConsensusToken) + : throw new ArgumentException( + $"Expected a currency {GovernanceToken} but got {value.Currency}", + nameof(value)); protected static FungibleAssetValue[] PowerFromNCG(FungibleAssetValue[] values) => values.Select(PowerFromNCG).ToArray(); diff --git a/.Lib9c.Tests/Action/DPoS/Control/UndelegateCtrlTest.cs b/.Lib9c.Tests/Action/DPoS/Control/UndelegateCtrlTest.cs index 6c7eec7426..0842a82c81 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/UndelegateCtrlTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/UndelegateCtrlTest.cs @@ -8,6 +8,7 @@ namespace Lib9c.Tests.Action.DPoS.Control using Nekoyume.Action.DPoS.Exception; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; + using Nekoyume.Model.State; using Nekoyume.Module; using Xunit; @@ -28,9 +29,8 @@ public UndelegateCtrlTest() _delegatorAddress = CreateAddress(); _validatorAddress = Validator.DeriveAddress(_operatorAddress); _undelegationAddress = Undelegation.DeriveAddress(_delegatorAddress, _validatorAddress); - _nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); - _states = InitializeStates(); + _states = InitialState; + _nativeTokens = NativeTokens; } [Fact] @@ -44,7 +44,7 @@ public void InvalidCurrencyTest() BlockIndex = 1, }, _delegatorAddress, - Asset.ConsensusFromGovernance(50)); + Asset.ConsensusFromGovernance(GovernanceToken * 50)); Assert.Throws( () => _states = UndelegateCtrl.Execute( _states, @@ -55,7 +55,7 @@ public void InvalidCurrencyTest() }, _delegatorAddress, _validatorAddress, - Asset.ConsensusFromGovernance(30), + Asset.ConsensusFromGovernance(GovernanceToken * 30), _nativeTokens)); Assert.Throws( () => _states = UndelegateCtrl.Execute( @@ -67,7 +67,7 @@ public void InvalidCurrencyTest() }, _delegatorAddress, _validatorAddress, - Asset.GovernanceToken * 30, + GovernanceToken * 30, _nativeTokens)); } @@ -166,11 +166,11 @@ public void CompleteUnbondingTest( UndelegateCtrl.GetUndelegation(_states, _undelegationAddress)! .UndelegationEntryAddresses); Assert.Equal( - Asset.GovernanceToken * (delegatorMintAmount - delegateAmount), - _states.GetBalance(_delegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (delegatorMintAmount - delegateAmount), + _states.GetBalance(_delegatorAddress, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken * (selfDelegateAmount + delegateAmount), - _states.GetBalance(ReservedAddress.UnbondedPool, Asset.GovernanceToken)); + GovernanceToken * (selfDelegateAmount + delegateAmount), + _states.GetBalance(ReservedAddress.UnbondedPool, GovernanceToken)); _states = UndelegateCtrl.Complete( _states, new ActionContext @@ -182,11 +182,11 @@ public void CompleteUnbondingTest( Assert.Single(UndelegateCtrl.GetUndelegation(_states, _undelegationAddress)! .UndelegationEntryAddresses); Assert.Equal( - Asset.GovernanceToken * (delegatorMintAmount - delegateAmount), - _states.GetBalance(_delegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (delegatorMintAmount - delegateAmount), + _states.GetBalance(_delegatorAddress, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken * (selfDelegateAmount + delegateAmount), - _states.GetBalance(ReservedAddress.UnbondedPool, Asset.GovernanceToken)); + GovernanceToken * (selfDelegateAmount + delegateAmount), + _states.GetBalance(ReservedAddress.UnbondedPool, GovernanceToken)); _states = UndelegateCtrl.Complete( _states, new ActionContext @@ -198,11 +198,11 @@ public void CompleteUnbondingTest( Assert.Empty(UndelegateCtrl.GetUndelegation(_states, _undelegationAddress)! .UndelegationEntryAddresses); Assert.Equal( - Asset.GovernanceToken * (delegatorMintAmount - delegateAmount + undelegateAmount), - _states.GetBalance(_delegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (delegatorMintAmount - delegateAmount + undelegateAmount), + _states.GetBalance(_delegatorAddress, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken * (selfDelegateAmount + delegateAmount - undelegateAmount), - _states.GetBalance(ReservedAddress.UnbondedPool, Asset.GovernanceToken)); + GovernanceToken * (selfDelegateAmount + delegateAmount - undelegateAmount), + _states.GetBalance(ReservedAddress.UnbondedPool, GovernanceToken)); } [Theory] @@ -229,10 +229,10 @@ public void CancelUndelegateTest( ShareFromGovernance(undelegateAmount), _nativeTokens); Assert.Equal( - Asset.GovernanceToken * (delegatorMintAmount - delegateAmount), - _states.GetBalance(_delegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (delegatorMintAmount - delegateAmount), + _states.GetBalance(_delegatorAddress, GovernanceToken)); Assert.Equal( - Asset.ConsensusFromGovernance(selfDelegateAmount + delegateAmount - undelegateAmount), + Asset.ConsensusFromGovernance(PoSTest.GovernanceToken * (selfDelegateAmount + delegateAmount - undelegateAmount)), _states.GetBalance(_validatorAddress, Asset.ConsensusToken)); _states = UndelegateCtrl.Cancel( _states, @@ -242,14 +242,14 @@ public void CancelUndelegateTest( BlockIndex = 2, }, _undelegationAddress, - Asset.ConsensusFromGovernance(cancelAmount), + Asset.ConsensusFromGovernance(PoSTest.GovernanceToken * cancelAmount), _nativeTokens); Assert.Equal( - Asset.GovernanceToken * (delegatorMintAmount - delegateAmount), - _states.GetBalance(_delegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (delegatorMintAmount - delegateAmount), + _states.GetBalance(_delegatorAddress, GovernanceToken)); Assert.Equal( Asset.ConsensusFromGovernance( - selfDelegateAmount + delegateAmount - undelegateAmount + cancelAmount), + PoSTest.GovernanceToken * (selfDelegateAmount + delegateAmount - undelegateAmount + cancelAmount)), _states.GetBalance(_validatorAddress, Asset.ConsensusToken)); _states = UndelegateCtrl.Complete( _states, @@ -260,11 +260,11 @@ public void CancelUndelegateTest( }, _undelegationAddress); Assert.Equal( - Asset.GovernanceToken * (delegatorMintAmount - delegateAmount), - _states.GetBalance(_delegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (delegatorMintAmount - delegateAmount), + _states.GetBalance(_delegatorAddress, GovernanceToken)); Assert.Equal( Asset.ConsensusFromGovernance( - selfDelegateAmount + delegateAmount - undelegateAmount + cancelAmount), + PoSTest.GovernanceToken * (selfDelegateAmount + delegateAmount - undelegateAmount + cancelAmount)), _states.GetBalance(_validatorAddress, Asset.ConsensusToken)); _states = UndelegateCtrl.Complete( _states, @@ -275,12 +275,11 @@ public void CancelUndelegateTest( }, _undelegationAddress); Assert.Equal( - Asset.GovernanceToken - * (delegatorMintAmount - delegateAmount + undelegateAmount - cancelAmount), - _states.GetBalance(_delegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (delegatorMintAmount - delegateAmount + undelegateAmount - cancelAmount), + _states.GetBalance(_delegatorAddress, GovernanceToken)); Assert.Equal( Asset.ConsensusFromGovernance( - selfDelegateAmount + delegateAmount - undelegateAmount + cancelAmount), + PoSTest.GovernanceToken * (selfDelegateAmount + delegateAmount - undelegateAmount + cancelAmount)), _states.GetBalance(_validatorAddress, Asset.ConsensusToken)); } @@ -307,13 +306,13 @@ public void BalanceTest( ShareFromGovernance(undelegateAmount), _nativeTokens); Assert.Equal( - Asset.GovernanceToken * 0, - _states.GetBalance(_validatorAddress, Asset.GovernanceToken)); + GovernanceToken * 0, + _states.GetBalance(_validatorAddress, GovernanceToken)); Assert.Equal( - Asset.ConsensusFromGovernance(0), + Asset.ConsensusFromGovernance(PoSTest.GovernanceToken * 0), _states.GetBalance(_operatorAddress, Asset.ConsensusToken)); Assert.Equal( - Asset.ConsensusFromGovernance(0), + Asset.ConsensusFromGovernance(PoSTest.GovernanceToken * 0), _states.GetBalance(_delegatorAddress, Asset.ConsensusToken)); Assert.Equal( ShareFromGovernance(0), @@ -322,14 +321,14 @@ public void BalanceTest( ShareFromGovernance(0), _states.GetBalance(_delegatorAddress, Asset.Share)); Assert.Equal( - Asset.GovernanceToken * (operatorMintAmount - selfDelegateAmount), - _states.GetBalance(_operatorAddress, Asset.GovernanceToken)); + GovernanceToken * (operatorMintAmount - selfDelegateAmount), + _states.GetBalance(_operatorAddress, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken * (delegatorMintAmount - delegateAmount), - _states.GetBalance(_delegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (delegatorMintAmount - delegateAmount), + _states.GetBalance(_delegatorAddress, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken * (selfDelegateAmount + delegateAmount), - _states.GetBalance(ReservedAddress.UnbondedPool, Asset.GovernanceToken)); + GovernanceToken * (selfDelegateAmount + delegateAmount), + _states.GetBalance(ReservedAddress.UnbondedPool, GovernanceToken)); var balanceA = _states.GetBalance( Delegation.DeriveAddress( _operatorAddress, @@ -344,7 +343,7 @@ public void BalanceTest( ValidatorCtrl.GetValidator(_states, _validatorAddress)!.DelegatorShares, balanceA + balanceB); Assert.Equal( - Asset.ConsensusFromGovernance(selfDelegateAmount + delegateAmount - undelegateAmount), + Asset.ConsensusFromGovernance(PoSTest.GovernanceToken * (selfDelegateAmount + delegateAmount - undelegateAmount)), _states.GetBalance(_validatorAddress, Asset.ConsensusToken)); } @@ -354,23 +353,16 @@ private void Initialize( int selfDelegateAmount, int delegateAmount) { - _states = InitializeStates(); - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, _operatorAddress, - Asset.GovernanceToken * operatorMintAmount); - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + GovernanceToken * operatorMintAmount); + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, _delegatorAddress, - Asset.GovernanceToken * delegatorMintAmount); + GovernanceToken * delegatorMintAmount); _states = ValidatorCtrl.Create( _states, new ActionContext @@ -380,7 +372,7 @@ private void Initialize( }, _operatorAddress, _operatorPublicKey, - Asset.GovernanceToken * selfDelegateAmount, + GovernanceToken * selfDelegateAmount, _nativeTokens); _states = DelegateCtrl.Execute( _states, @@ -391,7 +383,7 @@ private void Initialize( }, _delegatorAddress, _validatorAddress, - Asset.GovernanceToken * delegateAmount, + GovernanceToken * delegateAmount, _nativeTokens); } } diff --git a/.Lib9c.Tests/Action/DPoS/Control/ValidatorCtrlTest.cs b/.Lib9c.Tests/Action/DPoS/Control/ValidatorCtrlTest.cs index a20ef898d6..d9204126a1 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/ValidatorCtrlTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/ValidatorCtrlTest.cs @@ -8,6 +8,7 @@ namespace Lib9c.Tests.Action.DPoS.Control using Nekoyume.Action.DPoS.Exception; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; + using Nekoyume.Model.State; using Nekoyume.Module; using Xunit; @@ -17,8 +18,6 @@ public class ValidatorCtrlTest : PoSTest private readonly Address _operatorAddress; private readonly Address _validatorAddress; private readonly ImmutableHashSet _nativeTokens; - private readonly FungibleAssetValue _governanceToken - = new FungibleAssetValue(Asset.GovernanceToken, 100, 0); private IWorld _states; @@ -28,9 +27,8 @@ public ValidatorCtrlTest() _operatorPublicKey = new PrivateKey().PublicKey; _operatorAddress = _operatorPublicKey.Address; _validatorAddress = Validator.DeriveAddress(_operatorAddress); - _nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); - _states = InitializeStates(); + _states = InitialState; + _nativeTokens = NativeTokens; } [Fact] @@ -43,7 +41,7 @@ public void InvalidCurrencyTest() BlockIndex = 1, }, _operatorAddress, - Asset.ConsensusFromGovernance(50)); + Asset.ConsensusFromGovernance(GovernanceToken * 50)); Assert.Throws( () => _states = ValidatorCtrl.Create( _states, @@ -54,7 +52,7 @@ public void InvalidCurrencyTest() }, _operatorAddress, _operatorPublicKey, - Asset.ConsensusFromGovernance(30), + Asset.ConsensusFromGovernance(GovernanceToken * 30), _nativeTokens)); } @@ -63,14 +61,11 @@ public void InvalidCurrencyTest() [InlineData(500, 1000)] public void InvalidSelfDelegateTest(int mintAmount, int selfDelegateAmount) { - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, _operatorAddress, - Asset.GovernanceToken * mintAmount); + GovernanceToken * mintAmount); Assert.Throws( () => _states = ValidatorCtrl.Create( _states, @@ -81,7 +76,7 @@ public void InvalidSelfDelegateTest(int mintAmount, int selfDelegateAmount) }, _operatorAddress, _operatorPublicKey, - Asset.GovernanceToken * selfDelegateAmount, + GovernanceToken * selfDelegateAmount, _nativeTokens)); } @@ -90,14 +85,11 @@ public void InvalidSelfDelegateTest(int mintAmount, int selfDelegateAmount) [InlineData(500, 100)] public void BalanceTest(int mintAmount, int selfDelegateAmount) { - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, _operatorAddress, - Asset.GovernanceToken * mintAmount); + GovernanceToken * mintAmount); _states = ValidatorCtrl.Create( _states, new ActionContext @@ -107,14 +99,14 @@ public void BalanceTest(int mintAmount, int selfDelegateAmount) }, _operatorAddress, _operatorPublicKey, - Asset.GovernanceToken * selfDelegateAmount, + GovernanceToken * selfDelegateAmount, _nativeTokens); Assert.Equal( - Asset.ConsensusFromGovernance(selfDelegateAmount), + Asset.ConsensusFromGovernance(PoSTest.GovernanceToken * selfDelegateAmount), _states.GetBalance(_validatorAddress, Asset.ConsensusToken)); Assert.Equal( - Asset.GovernanceToken * (mintAmount - selfDelegateAmount), - _states.GetBalance(_operatorAddress, Asset.GovernanceToken)); + GovernanceToken * (mintAmount - selfDelegateAmount), + _states.GetBalance(_operatorAddress, GovernanceToken)); Assert.Equal( ShareFromGovernance(selfDelegateAmount), _states.GetBalance( @@ -127,7 +119,6 @@ public void BalanceTest(int mintAmount, int selfDelegateAmount) [Fact] public void JailTest() { - var governanceToken = _governanceToken; var states = _states; var operatorPublicKey = _operatorPublicKey; var validatorAddress = _validatorAddress; @@ -136,7 +127,7 @@ public void JailTest() states: states, blockIndex: 1, operatorPublicKey: operatorPublicKey, - ncg: governanceToken); + ncg: GovernanceToken * 100); // Test before jailing var validator1 = ValidatorCtrl.GetValidator(states, validatorAddress)!; @@ -175,7 +166,6 @@ public void Jail_NotPromotedValidator_FailTest() [Fact] public void Jail_JailedValidator_FailTest() { - var governanceToken = _governanceToken; var states = _states; var operatorPublicKey = _operatorPublicKey; var validatorAddress = _validatorAddress; @@ -184,7 +174,7 @@ public void Jail_JailedValidator_FailTest() states: states, blockIndex: 1, operatorPublicKey: operatorPublicKey, - ncg: governanceToken); + ncg: GovernanceToken * 100); // Jail states = ValidatorCtrl.Jail( @@ -202,7 +192,6 @@ public void Jail_JailedValidator_FailTest() [Fact] public void UnjailTest() { - var governanceToken = _governanceToken; var states = _states; var operatorPublicKey = _operatorPublicKey; var validatorAddress = _validatorAddress; @@ -211,7 +200,7 @@ public void UnjailTest() states: states, blockIndex: 1, operatorPublicKey: operatorPublicKey, - ncg: governanceToken); + ncg: GovernanceToken * 100); states = ValidatorCtrl.Jail( states, @@ -254,7 +243,6 @@ public void Unjail_NotPromotedValidator_FailTest() [Fact] public void Unjail_NotJailedValidator_FailTest() { - var governanceToken = _governanceToken; var states = _states; var operatorPublicKey = _operatorPublicKey; var validatorAddress = _validatorAddress; @@ -263,7 +251,7 @@ public void Unjail_NotJailedValidator_FailTest() states: states, blockIndex: 1, operatorPublicKey: operatorPublicKey, - ncg: governanceToken); + ncg: GovernanceToken * 100); Assert.Throws(() => { diff --git a/.Lib9c.Tests/Action/DPoS/Control/ValidatorDelegationSetCtrlTest.cs b/.Lib9c.Tests/Action/DPoS/Control/ValidatorDelegationSetCtrlTest.cs index c799f7b515..39881f315c 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/ValidatorDelegationSetCtrlTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/ValidatorDelegationSetCtrlTest.cs @@ -5,8 +5,8 @@ namespace Lib9c.Tests.Action.DPoS.Control using Libplanet.Crypto; using Libplanet.Types.Assets; using Nekoyume.Action.DPoS.Control; - using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; + using Nekoyume.Model.State; using Nekoyume.Module; using Xunit; @@ -24,19 +24,19 @@ public ValidatorDelegationSetCtrlTest() _operatorPublicKey = new PrivateKey().PublicKey; _operatorAddress = _operatorPublicKey.Address; _validatorAddress = Validator.DeriveAddress(_operatorAddress); - _nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); - _states = InitializeStates(); - _states = _states.MintAsset( - context: new ActionContext { PreviousState = _states, }, + _states = InitialState; + _nativeTokens = NativeTokens; + _states = _states.TransferAsset( + context: new ActionContext(), + sender: GoldCurrencyState.Address, recipient: _operatorAddress, - value: Asset.GovernanceToken * 100000); + value: GovernanceToken * 100000); _states = ValidatorCtrl.Create( states: _states, ctx: new ActionContext { PreviousState = _states, }, operatorAddress: _operatorAddress, operatorPublicKey: _operatorPublicKey, - Asset.GovernanceToken * 10, + GovernanceToken * 10, nativeTokens: _nativeTokens ); } diff --git a/.Lib9c.Tests/Action/DPoS/Control/ValidatorPowerIndexCtrlTest.cs b/.Lib9c.Tests/Action/DPoS/Control/ValidatorPowerIndexCtrlTest.cs index 0ebafe576b..661aa46bdd 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/ValidatorPowerIndexCtrlTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/ValidatorPowerIndexCtrlTest.cs @@ -10,6 +10,7 @@ namespace Lib9c.Tests.Action.DPoS.Control using Nekoyume.Action.DPoS.Control; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; + using Nekoyume.Model.State; using Nekoyume.Module; using Xunit; @@ -32,23 +33,18 @@ public ValidatorPowerIndexCtrlTest() List
operatorAddresses = operatorPublicKeys.Select( pubKey => pubKey.Address).ToList(); - _nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); - - _states = InitializeStates(); + _states = InitialState; + _nativeTokens = NativeTokens; ValidatorAddresses = new List
(); var pairs = operatorAddresses.Zip(operatorPublicKeys, (addr, key) => (addr, key)); foreach (var (addr, key) in pairs) { - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, addr, - Asset.GovernanceToken * 100); + GovernanceToken * 100); _states = ValidatorCtrl.Create( _states, new ActionContext @@ -58,7 +54,7 @@ public ValidatorPowerIndexCtrlTest() }, addr, key, - Asset.GovernanceToken * 10, + GovernanceToken * 10, _nativeTokens); ValidatorAddresses.Add(Validator.DeriveAddress(addr)); } @@ -76,7 +72,7 @@ public void SortingTestDifferentToken() BlockIndex = 1, }, ValidatorAddresses[0], - Asset.ConsensusFromGovernance(10)); + Asset.ConsensusFromGovernance(GovernanceToken * 10)); _states = _states.MintAsset( new ActionContext { @@ -84,7 +80,7 @@ public void SortingTestDifferentToken() BlockIndex = 1, }, ValidatorAddresses[1], - Asset.ConsensusFromGovernance(30)); + Asset.ConsensusFromGovernance(GovernanceToken * 30)); _states = _states.MintAsset( new ActionContext { @@ -92,7 +88,7 @@ public void SortingTestDifferentToken() BlockIndex = 1, }, ValidatorAddresses[2], - Asset.ConsensusFromGovernance(50)); + Asset.ConsensusFromGovernance(GovernanceToken * 50)); _states = _states.MintAsset( new ActionContext { @@ -100,7 +96,7 @@ public void SortingTestDifferentToken() BlockIndex = 1, }, ValidatorAddresses[3], - Asset.ConsensusFromGovernance(40)); + Asset.ConsensusFromGovernance(GovernanceToken * 40)); _states = _states.MintAsset( new ActionContext { @@ -108,7 +104,7 @@ public void SortingTestDifferentToken() BlockIndex = 1, }, ValidatorAddresses[4], - Asset.ConsensusFromGovernance(20)); + Asset.ConsensusFromGovernance(GovernanceToken * 20)); _states = ValidatorPowerIndexCtrl.Update(_states, ValidatorAddresses); ValidatorPowerIndex validatorPowerIndex; (_states, validatorPowerIndex) @@ -116,15 +112,15 @@ public void SortingTestDifferentToken() List index = validatorPowerIndex.Index.ToList(); Assert.Equal(5, index.Count); Assert.Equal(ValidatorAddresses[2], index[0].ValidatorAddress); - Assert.Equal(Asset.ConsensusFromGovernance(60), index[0].ConsensusToken); + Assert.Equal(Asset.ConsensusFromGovernance(GovernanceToken * 60), index[0].ConsensusToken); Assert.Equal(ValidatorAddresses[3], index[1].ValidatorAddress); - Assert.Equal(Asset.ConsensusFromGovernance(50), index[1].ConsensusToken); + Assert.Equal(Asset.ConsensusFromGovernance(GovernanceToken * 50), index[1].ConsensusToken); Assert.Equal(ValidatorAddresses[1], index[2].ValidatorAddress); - Assert.Equal(Asset.ConsensusFromGovernance(40), index[2].ConsensusToken); + Assert.Equal(Asset.ConsensusFromGovernance(GovernanceToken * 40), index[2].ConsensusToken); Assert.Equal(ValidatorAddresses[4], index[3].ValidatorAddress); - Assert.Equal(Asset.ConsensusFromGovernance(30), index[3].ConsensusToken); + Assert.Equal(Asset.ConsensusFromGovernance(GovernanceToken * 30), index[3].ConsensusToken); Assert.Equal(ValidatorAddresses[0], index[4].ValidatorAddress); - Assert.Equal(Asset.ConsensusFromGovernance(20), index[4].ConsensusToken); + Assert.Equal(Asset.ConsensusFromGovernance(GovernanceToken * 20), index[4].ConsensusToken); } [Fact] @@ -138,7 +134,7 @@ public void SortingTestSameToken() BlockIndex = 1, }, ValidatorAddresses[0], - Asset.ConsensusFromGovernance(10)); + Asset.ConsensusFromGovernance(GovernanceToken * 10)); _states = _states.MintAsset( new ActionContext { @@ -146,7 +142,7 @@ public void SortingTestSameToken() BlockIndex = 1, }, ValidatorAddresses[1], - Asset.ConsensusFromGovernance(10)); + Asset.ConsensusFromGovernance(GovernanceToken * 10)); _states = _states.MintAsset( new ActionContext { @@ -154,7 +150,7 @@ public void SortingTestSameToken() BlockIndex = 1, }, ValidatorAddresses[2], - Asset.ConsensusFromGovernance(10)); + Asset.ConsensusFromGovernance(GovernanceToken * 10)); _states = _states.MintAsset( new ActionContext { @@ -162,7 +158,7 @@ public void SortingTestSameToken() BlockIndex = 1, }, ValidatorAddresses[3], - Asset.ConsensusFromGovernance(10)); + Asset.ConsensusFromGovernance(GovernanceToken * 10)); _states = _states.MintAsset( new ActionContext { @@ -170,7 +166,7 @@ public void SortingTestSameToken() BlockIndex = 1, }, ValidatorAddresses[4], - Asset.ConsensusFromGovernance(10)); + Asset.ConsensusFromGovernance(GovernanceToken * 10)); _states = ValidatorPowerIndexCtrl.Update(_states, ValidatorAddresses); ValidatorPowerIndex validatorPowerIndex; (_states, validatorPowerIndex) diff --git a/.Lib9c.Tests/Action/DPoS/Control/ValidatorSetCtrlTest.cs b/.Lib9c.Tests/Action/DPoS/Control/ValidatorSetCtrlTest.cs index fec51a4a7c..c429a222af 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/ValidatorSetCtrlTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/ValidatorSetCtrlTest.cs @@ -9,41 +9,37 @@ namespace Lib9c.Tests.Action.DPoS.Control using Nekoyume.Action.DPoS.Control; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; + using Nekoyume.Model.State; using Nekoyume.Module; using Xunit; public class ValidatorSetCtrlTest : PoSTest { - private ImmutableHashSet _nativeTokens; + private readonly ImmutableHashSet _nativeTokens; private IWorld _states; public ValidatorSetCtrlTest() : base() { - _nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); - _states = InitializeStates(); + _states = InitialState; + _nativeTokens = NativeTokens; OperatorAddresses = new List
(); ValidatorAddresses = new List
(); DelegatorAddress = CreateAddress(); - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - }, + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, DelegatorAddress, - Asset.GovernanceToken * 100000); + GovernanceToken * 100000); for (int i = 0; i < 200; i++) { PublicKey operatorPublicKey = new PrivateKey().PublicKey; Address operatorAddress = operatorPublicKey.Address; - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - }, + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, operatorAddress, - Asset.GovernanceToken * 1000); + GovernanceToken * 1000); OperatorAddresses.Add(operatorAddress); _states = ValidatorCtrl.Create( _states, @@ -54,7 +50,7 @@ public ValidatorSetCtrlTest() }, operatorAddress, operatorPublicKey, - Asset.GovernanceToken * 1, + GovernanceToken * 1, _nativeTokens); ValidatorAddresses.Add(Validator.DeriveAddress(operatorAddress)); } @@ -80,7 +76,7 @@ public void ValidatorSetTest() }, DelegatorAddress, ValidatorAddresses[i], - Asset.GovernanceToken * (i + 1), + GovernanceToken * (i + 1), _nativeTokens); } @@ -98,7 +94,7 @@ public void ValidatorSetTest() }, DelegatorAddress, validatorAddressA, - Asset.GovernanceToken * 200, + GovernanceToken * 200, _nativeTokens); _states = DelegateCtrl.Execute( @@ -110,7 +106,7 @@ public void ValidatorSetTest() }, DelegatorAddress, validatorAddressB, - Asset.GovernanceToken * 300, + GovernanceToken * 300, _nativeTokens); _states = ValidatorSetCtrl.Update( @@ -131,20 +127,20 @@ public void ValidatorSetTest() ShareFromGovernance(5 + 1 + 300), _states.GetBalance(delegationAddressB, Asset.Share)); Assert.Equal( - Asset.ConsensusFromGovernance(1 + 5 + 1 + 300), + Asset.ConsensusFromGovernance(GovernanceToken * (1 + 5 + 1 + 300)), _states.GetBalance(ValidatorAddresses[5], Asset.ConsensusToken)); Assert.Equal( - Asset.GovernanceToken + GovernanceToken * (100 + (101 + 200) * 50 - 101 - 102 + 204 + 306), - _states.GetBalance(ReservedAddress.BondedPool, Asset.GovernanceToken)); + _states.GetBalance(ReservedAddress.BondedPool, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken + GovernanceToken * (100 + (1 + 100) * 50 - 4 - 6 + 101 + 102), - _states.GetBalance(ReservedAddress.UnbondedPool, Asset.GovernanceToken)); + _states.GetBalance(ReservedAddress.UnbondedPool, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken + GovernanceToken * (100000 - (1 + 200) * 100 - 200 - 300), - _states.GetBalance(DelegatorAddress, Asset.GovernanceToken)); + _states.GetBalance(DelegatorAddress, GovernanceToken)); _states = UndelegateCtrl.Execute( _states, @@ -162,20 +158,17 @@ public void ValidatorSetTest() ShareFromGovernance(0), _states.GetBalance(delegationAddressB, Asset.Share)); Assert.Equal( - Asset.ConsensusFromGovernance(1), + Asset.ConsensusFromGovernance(GovernanceToken * 1), _states.GetBalance(validatorAddressB, Asset.ConsensusToken)); Assert.Equal( - Asset.GovernanceToken - * (100 + (101 + 200) * 50 - 101 - 102 + 204 + 306 - 306), - _states.GetBalance(ReservedAddress.BondedPool, Asset.GovernanceToken)); + GovernanceToken * (100 + (101 + 200) * 50 - 101 - 102 + 204 + 306 - 306), + _states.GetBalance(ReservedAddress.BondedPool, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken - * (100 + (1 + 100) * 50 - 4 - 6 + 101 + 102 + 306), - _states.GetBalance(ReservedAddress.UnbondedPool, Asset.GovernanceToken)); + GovernanceToken * (100 + (1 + 100) * 50 - 4 - 6 + 101 + 102 + 306), + _states.GetBalance(ReservedAddress.UnbondedPool, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken - * (100000 - (1 + 200) * 100 - 200 - 300), - _states.GetBalance(DelegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (100000 - (1 + 200) * 100 - 200 - 300), + _states.GetBalance(DelegatorAddress, GovernanceToken)); _states = ValidatorSetCtrl.Update( _states, @@ -188,17 +181,14 @@ public void ValidatorSetTest() Assert.Equal( validatorAddressA, bondedSet.Set.ToList()[0].ValidatorAddress); Assert.Equal( - Asset.GovernanceToken - * (100 + (101 + 200) * 50 - 101 - 102 + 204 + 306 - 306 + 102), - _states.GetBalance(ReservedAddress.BondedPool, Asset.GovernanceToken)); + GovernanceToken * (100 + (101 + 200) * 50 - 101 - 102 + 204 + 306 - 306 + 102), + _states.GetBalance(ReservedAddress.BondedPool, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken - * (100 + (1 + 100) * 50 - 4 - 6 + 101 + 102 + 306 - 102), - _states.GetBalance(ReservedAddress.UnbondedPool, Asset.GovernanceToken)); + GovernanceToken * (100 + (1 + 100) * 50 - 4 - 6 + 101 + 102 + 306 - 102), + _states.GetBalance(ReservedAddress.UnbondedPool, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken - * (100000 - (1 + 200) * 100 - 200 - 300), - _states.GetBalance(DelegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (100000 - (1 + 200) * 100 - 200 - 300), + _states.GetBalance(DelegatorAddress, GovernanceToken)); _states = ValidatorSetCtrl.Update( _states, @@ -209,13 +199,11 @@ public void ValidatorSetTest() }); Assert.Equal( - Asset.GovernanceToken - * (100 + (1 + 100) * 50 - 4 - 6 + 101 + 102 + 306 - 102 - 306), - _states.GetBalance(ReservedAddress.UnbondedPool, Asset.GovernanceToken)); + GovernanceToken * (100 + (1 + 100) * 50 - 4 - 6 + 101 + 102 + 306 - 102 - 306), + _states.GetBalance(ReservedAddress.UnbondedPool, GovernanceToken)); Assert.Equal( - Asset.GovernanceToken - * (100000 - (1 + 200) * 100 - 200 - 300 + 306), - _states.GetBalance(DelegatorAddress, Asset.GovernanceToken)); + GovernanceToken * (100000 - (1 + 200) * 100 - 200 - 300 + 306), + _states.GetBalance(DelegatorAddress, GovernanceToken)); } } } diff --git a/.Lib9c.Tests/Action/DPoS/Control/ValidatorSigningInfoCtrlTest.cs b/.Lib9c.Tests/Action/DPoS/Control/ValidatorSigningInfoCtrlTest.cs index 2307cbff47..5d5e9cf6bb 100644 --- a/.Lib9c.Tests/Action/DPoS/Control/ValidatorSigningInfoCtrlTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Control/ValidatorSigningInfoCtrlTest.cs @@ -8,6 +8,7 @@ namespace Lib9c.Tests.Action.DPoS.Control using Nekoyume.Action.DPoS.Exception; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; + using Nekoyume.Module; using Xunit; public class ValidatorSigningInfoCtrlTest : PoSTest @@ -16,8 +17,6 @@ public class ValidatorSigningInfoCtrlTest : PoSTest private readonly Address _operatorAddress; private readonly Address _delegatorAddress; private readonly Address _validatorAddress; - private readonly FungibleAssetValue _governanceToken - = new FungibleAssetValue(Asset.GovernanceToken, 100, 0); private IWorld _states; @@ -27,7 +26,7 @@ public ValidatorSigningInfoCtrlTest() _operatorAddress = _operatorPublicKey.Address; _delegatorAddress = CreateAddress(); _validatorAddress = Validator.DeriveAddress(_operatorAddress); - _states = InitializeStates(); + _states = InitialState; } [Fact] @@ -66,7 +65,6 @@ public void GetSigningInfo_Test() [Fact] public void Tombstone_Test() { - var governanceToken = _governanceToken; var states = _states; var operatorPublicKey = _operatorPublicKey; var validatorAddress = _validatorAddress; @@ -75,7 +73,7 @@ public void Tombstone_Test() states: states, blockIndex: 1, operatorPublicKey: operatorPublicKey, - ncg: governanceToken); + ncg: GovernanceToken * 100); states = ValidatorSigningInfoCtrl.Tombstone(states, validatorAddress); @@ -97,7 +95,6 @@ public void Tombstone_NotPromotedValidator_FailTest() [Fact] public void Tombstone_TombstonedValidator_FailTest() { - var governanceToken = _governanceToken; var states = _states; var operatorPublicKey = _operatorPublicKey; var validatorAddress = _validatorAddress; @@ -106,7 +103,7 @@ public void Tombstone_TombstonedValidator_FailTest() states: states, blockIndex: 1, operatorPublicKey: operatorPublicKey, - ncg: governanceToken); + ncg: GovernanceToken * 100); states = ValidatorSigningInfoCtrl.Tombstone(states, validatorAddress); @@ -119,7 +116,6 @@ public void Tombstone_TombstonedValidator_FailTest() [Fact] public void JailUtil_Test() { - var governanceToken = _governanceToken; var states = _states; var operatorPublicKey = _operatorPublicKey; var validatorAddress = _validatorAddress; @@ -128,7 +124,7 @@ public void JailUtil_Test() states: states, blockIndex: 1, operatorPublicKey: operatorPublicKey, - ncg: governanceToken); + ncg: GovernanceToken * 100); states = ValidatorSigningInfoCtrl.JailUntil( world: states, @@ -156,7 +152,6 @@ public void JailUtil_NotPromotedValidator_FailTest() [Fact] public void JailUtil_NegativeBlockHeight_FailTest() { - var governanceToken = _governanceToken; var states = _states; var operatorPublicKey = _operatorPublicKey; var validatorAddress = _validatorAddress; @@ -165,7 +160,7 @@ public void JailUtil_NegativeBlockHeight_FailTest() states: states, blockIndex: 1, operatorPublicKey: operatorPublicKey, - ncg: governanceToken); + ncg: GovernanceToken * 100); Assert.Throws(() => { @@ -176,7 +171,6 @@ public void JailUtil_NegativeBlockHeight_FailTest() [Fact] public void JailUtil_MultipleInvocation_Test() { - var governanceToken = _governanceToken; var states = _states; var operatorPublicKey = _operatorPublicKey; var validatorAddress = _validatorAddress; @@ -185,7 +179,7 @@ public void JailUtil_MultipleInvocation_Test() states: states, blockIndex: 1, operatorPublicKey: operatorPublicKey, - ncg: governanceToken); + ncg: GovernanceToken * 100); states = ValidatorSigningInfoCtrl.JailUntil( world: states, diff --git a/.Lib9c.Tests/Action/DPoS/DelegateTest.cs b/.Lib9c.Tests/Action/DPoS/DelegateTest.cs index af5a9f4d7e..6f9fe6ee98 100644 --- a/.Lib9c.Tests/Action/DPoS/DelegateTest.cs +++ b/.Lib9c.Tests/Action/DPoS/DelegateTest.cs @@ -12,6 +12,8 @@ using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; using Nekoyume.Action.DPoS.Sys; + using Nekoyume.Model.State; + using Nekoyume.Module; using Xunit; public class DelegateTest : PoSTest @@ -25,22 +27,24 @@ public void Execute() var validatorAddress = Nekoyume.Action.DPoS.Model.Validator.DeriveAddress(validatorOperatorAddress); var delegatorAddress = delegatorPrivateKey.Address; - var states = InitializeStates(); + var states = InitialState; // Prepare initial governance token for the delegator and validator - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, validatorOperatorAddress, - Asset.GovernanceToken * 100); - states = states.MintAsset( - new ActionContext { PreviousState = states }, + GovernanceToken * 100); + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, delegatorAddress, - Asset.GovernanceToken * 50); + GovernanceToken * 50); // Promote the delegator states = new PromoteValidator( validatorPrivateKey.PublicKey, - amount: Asset.GovernanceToken * 100) + amount: GovernanceToken * 100) .Execute( new ActionContext { PreviousState = states, Signer = validatorOperatorAddress }); @@ -49,7 +53,7 @@ public void Execute() new ActionContext { PreviousState = states, Miner = validatorOperatorAddress }); // Delegate the validator - states = new Nekoyume.Action.DPoS.Delegate(validatorAddress, Asset.GovernanceToken * 50).Execute( + states = new Nekoyume.Action.DPoS.Delegate(validatorAddress, GovernanceToken * 50).Execute( new ActionContext { PreviousState = states, Signer = delegatorAddress }); states = new UpdateValidators().Execute(new ActionContext { PreviousState = states }); @@ -69,10 +73,11 @@ public void Execute() Assert.Equal((100 + 50) * 100, power); // Mint and allocate rewards - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, ReservedAddress.RewardPool, - Asset.GovernanceToken * 5); + GovernanceToken * 5); states = new AllocateReward().Execute( new ActionContext { @@ -97,10 +102,10 @@ public void Execute() var validatorOperatorReward = states.GetBalance( AllocateRewardCtrl.RewardAddress(validatorOperatorAddress), - Asset.GovernanceToken).RawValue; + GovernanceToken).RawValue; var validatorReward = states.GetBalance( - ValidatorRewards.DeriveAddress(validatorAddress, Asset.GovernanceToken), - Asset.GovernanceToken).RawValue; + ValidatorRewards.DeriveAddress(validatorAddress, GovernanceToken), + GovernanceToken).RawValue; Assert.Equal(72, validatorOperatorReward); Assert.Equal(428, validatorReward); @@ -109,13 +114,13 @@ public void Execute() { PreviousState = states, BlockIndex = 1, Signer = delegatorAddress }); Assert.Equal( 142, - states.GetBalance(delegatorAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(delegatorAddress, GovernanceToken).RawValue); Assert.Equal( 0, - states.GetBalance(validatorOperatorAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(validatorOperatorAddress, GovernanceToken).RawValue); validatorReward = states.GetBalance( - ValidatorRewards.DeriveAddress(validatorAddress, Asset.GovernanceToken), - Asset.GovernanceToken).RawValue; + ValidatorRewards.DeriveAddress(validatorAddress, GovernanceToken), + GovernanceToken).RawValue; Assert.Equal(286, validatorReward); } } diff --git a/.Lib9c.Tests/Action/DPoS/DistributeTest.cs b/.Lib9c.Tests/Action/DPoS/DistributeTest.cs index 4f55911bb9..6f8305702f 100644 --- a/.Lib9c.Tests/Action/DPoS/DistributeTest.cs +++ b/.Lib9c.Tests/Action/DPoS/DistributeTest.cs @@ -11,6 +11,7 @@ namespace Lib9c.Tests.Action.DPoS using Nekoyume.Action.DPoS.Control; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; + using Nekoyume.Model.State; using Nekoyume.Module; using Xunit; using Validator = Nekoyume.Action.DPoS.Model.Validator; @@ -23,35 +24,28 @@ public class DistributeTest : PoSTest public DistributeTest() : base() { - _nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); - _states = InitializeStates(); + _states = InitialState; + _nativeTokens = NativeTokens; OperatorPrivateKeys = new List(); OperatorPublicKeys = new List(); OperatorAddresses = new List
(); ValidatorAddresses = new List
(); DelegatorAddress = CreateAddress(); - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, DelegatorAddress, - Asset.GovernanceToken * 100000); + GovernanceToken * 100000); for (int i = 0; i < 200; i++) { PrivateKey operatorPrivateKey = new PrivateKey(); PublicKey operatorPublicKey = operatorPrivateKey.PublicKey; Address operatorAddress = operatorPublicKey.Address; - _states = _states.MintAsset( - new ActionContext - { - PreviousState = _states, - BlockIndex = 1, - }, + _states = _states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, operatorAddress, - Asset.GovernanceToken * 1000); + GovernanceToken * 1000); OperatorPrivateKeys.Add(operatorPrivateKey); OperatorPublicKeys.Add(operatorPublicKey); @@ -65,7 +59,7 @@ public DistributeTest() }, operatorAddress, operatorPublicKey, - Asset.GovernanceToken * 1, + GovernanceToken * 1, _nativeTokens); ValidatorAddresses.Add(Validator.DeriveAddress(operatorAddress)); } @@ -95,7 +89,7 @@ public void ValidatorSetTest() }, DelegatorAddress, ValidatorAddresses[i], - Asset.GovernanceToken * (i + 1), + GovernanceToken * (i + 1), _nativeTokens); } @@ -111,7 +105,7 @@ public void ValidatorSetTest() }, DelegatorAddress, validatorAddressA, - Asset.GovernanceToken * 200, + GovernanceToken * 200, _nativeTokens); _states = DelegateCtrl.Execute( @@ -123,7 +117,7 @@ public void ValidatorSetTest() }, DelegatorAddress, validatorAddressB, - Asset.GovernanceToken * 300, + GovernanceToken * 300, _nativeTokens); _states = ValidatorSetCtrl.Update( @@ -157,7 +151,7 @@ public void ValidatorSetTest() pk => pk.PublicKey.Equals(validator.OperatorPublicKey)) : null); }) .ToList(); - FungibleAssetValue blockReward = Asset.ConsensusFromGovernance(50); + FungibleAssetValue blockReward = Asset.ConsensusFromGovernance(GovernanceToken * 50); _states = _states.MintAsset( new ActionContext { @@ -202,19 +196,19 @@ public void ValidatorSetTest() .DivRem(Validator.CommissionDenominator); Assert.Equal( - Asset.ConsensusFromGovernance(0), + Asset.ConsensusFromGovernance(GovernanceToken * 0), _states.GetBalance(ReservedAddress.RewardPool, Asset.ConsensusToken)); Assert.Equal( - Asset.GovernanceToken * (100 + (101 + 200) * 50 - 101 - 102 + 204 + 306), - _states.GetBalance(ReservedAddress.BondedPool, Asset.GovernanceToken)); + GovernanceToken * (100 + (101 + 200) * 50 - 101 - 102 + 204 + 306), + _states.GetBalance(ReservedAddress.BondedPool, GovernanceToken)); Assert.Equal( - Asset.ConsensusFromGovernance(205), + Asset.ConsensusFromGovernance(GovernanceToken * 205), _states.GetBalance(validatorAddressA, Asset.ConsensusToken)); Assert.Equal( - Asset.ConsensusFromGovernance(307), + Asset.ConsensusFromGovernance(GovernanceToken * 307), _states.GetBalance(validatorAddressB, Asset.ConsensusToken)); Assert.Equal( @@ -231,7 +225,7 @@ Address delegationAddressA = Delegation.DeriveAddress(DelegatorAddress, validatorAddressA); Assert.Equal( - Asset.ConsensusFromGovernance(0), + Asset.ConsensusFromGovernance(GovernanceToken * 0), _states.GetBalance( AllocateRewardCtrl.RewardAddress(DelegatorAddress), Asset.ConsensusToken)); diff --git a/.Lib9c.Tests/Action/DPoS/Model/RedelegationEntryTest.cs b/.Lib9c.Tests/Action/DPoS/Model/RedelegationEntryTest.cs index ba9655a817..2a9eff0a68 100644 --- a/.Lib9c.Tests/Action/DPoS/Model/RedelegationEntryTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Model/RedelegationEntryTest.cs @@ -14,7 +14,7 @@ public RedelegationEntryTest() _redelegationEntry = new RedelegationEntry( CreateAddress(), ShareFromGovernance(1), - Asset.ConsensusFromGovernance(1), + Asset.ConvertTokens(GovernanceToken * 1, Asset.ConsensusToken), ShareFromGovernance(1), 1, 1); @@ -24,17 +24,17 @@ public RedelegationEntryTest() public void InvalidUnbondingConsensusToken() { Assert.Throws( - () => _redelegationEntry.RedelegatingShare = Asset.GovernanceToken * 1); + () => _redelegationEntry.RedelegatingShare = GovernanceToken * 1); Assert.Throws( - () => _redelegationEntry.RedelegatingShare = Asset.ConsensusFromGovernance(1)); + () => _redelegationEntry.RedelegatingShare = Asset.ConvertTokens(GovernanceToken * 1, Asset.ConsensusToken)); Assert.Throws( - () => _redelegationEntry.UnbondingConsensusToken = Asset.GovernanceToken * 1); + () => _redelegationEntry.UnbondingConsensusToken = GovernanceToken * 1); Assert.Throws( () => _redelegationEntry.UnbondingConsensusToken = ShareFromGovernance(1)); Assert.Throws( - () => _redelegationEntry.IssuedShare = Asset.GovernanceToken * 1); + () => _redelegationEntry.IssuedShare = GovernanceToken * 1); Assert.Throws( - () => _redelegationEntry.IssuedShare = Asset.ConsensusFromGovernance(1)); + () => _redelegationEntry.IssuedShare = Asset.ConvertTokens(GovernanceToken * 1, Asset.ConsensusToken)); } [Fact] diff --git a/.Lib9c.Tests/Action/DPoS/Model/UndelegationEntryTest.cs b/.Lib9c.Tests/Action/DPoS/Model/UndelegationEntryTest.cs index eaf4bc74c9..c9abb37b9f 100644 --- a/.Lib9c.Tests/Action/DPoS/Model/UndelegationEntryTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Model/UndelegationEntryTest.cs @@ -12,14 +12,14 @@ public class UndelegationEntryTest : PoSTest public UndelegationEntryTest() { _undelegationEntry = new UndelegationEntry( - CreateAddress(), Asset.ConsensusFromGovernance(1), 1, 1); + CreateAddress(), Asset.ConsensusFromGovernance(GovernanceToken * 1), 1, 1); } [Fact] public void InvalidUnbondingConsensusToken() { Assert.Throws( - () => _undelegationEntry.UnbondingConsensusToken = Asset.GovernanceToken * 1); + () => _undelegationEntry.UnbondingConsensusToken = GovernanceToken * 1); Assert.Throws( () => _undelegationEntry.UnbondingConsensusToken = ShareFromGovernance(1)); } diff --git a/.Lib9c.Tests/Action/DPoS/Model/ValidatorPowerTest.cs b/.Lib9c.Tests/Action/DPoS/Model/ValidatorPowerTest.cs index 3853c2fd61..74e8c38827 100644 --- a/.Lib9c.Tests/Action/DPoS/Model/ValidatorPowerTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Model/ValidatorPowerTest.cs @@ -15,14 +15,14 @@ public ValidatorPowerTest() _validatorPower = new ValidatorPower( CreateAddress(), new PrivateKey().PublicKey, - Asset.ConsensusFromGovernance(10)); + Asset.ConsensusFromGovernance(GovernanceToken * 10)); } [Fact] public void InvalidUnbondingConsensusToken() { Assert.Throws( - () => _validatorPower.ConsensusToken = Asset.GovernanceToken * 1); + () => _validatorPower.ConsensusToken = GovernanceToken * 1); Assert.Throws( () => _validatorPower.ConsensusToken = ShareFromGovernance(1)); } diff --git a/.Lib9c.Tests/Action/DPoS/Model/ValidatorTest.cs b/.Lib9c.Tests/Action/DPoS/Model/ValidatorTest.cs index 570107613d..8848697a35 100644 --- a/.Lib9c.Tests/Action/DPoS/Model/ValidatorTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Model/ValidatorTest.cs @@ -19,9 +19,9 @@ public ValidatorTest() public void InvalidShareTypeTest() { Assert.Throws( - () => _validator.DelegatorShares = Asset.ConsensusFromGovernance(1)); + () => _validator.DelegatorShares = Asset.ConsensusFromGovernance(GovernanceToken * 1)); Assert.Throws( - () => _validator.DelegatorShares = Asset.GovernanceToken * 1); + () => _validator.DelegatorShares = GovernanceToken * 1); } [Fact] diff --git a/.Lib9c.Tests/Action/DPoS/PoSTest.cs b/.Lib9c.Tests/Action/DPoS/PoSTest.cs index 3be1af5e83..06483f35aa 100644 --- a/.Lib9c.Tests/Action/DPoS/PoSTest.cs +++ b/.Lib9c.Tests/Action/DPoS/PoSTest.cs @@ -9,12 +9,43 @@ namespace Lib9c.Tests.Action.DPoS using Libplanet.Types.Assets; using Nekoyume.Action.DPoS.Control; using Nekoyume.Action.DPoS.Misc; + using Nekoyume.Model.State; using Nekoyume.Module; public class PoSTest { - protected static readonly ImmutableHashSet NativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); + static PoSTest() + { + InitialState = new World(InitialStateHelper.EmptyWorldState.WithGoldCurrencyState()); + GovernanceToken = InitialState.GetGoldCurrency(); + NativeTokens = ImmutableHashSet.Create( + GovernanceToken, + Asset.ConsensusToken, + Asset.Share); + } + + /// + /// An empty with its gold currency state set and its initial supply + /// given to . + /// + /// + /// The used for the gold currency state has a single randomized + /// minter for each test. + /// + protected static IWorld InitialState { get; } + + /// + /// The set of native tokens including the hard coded ones in and + /// a randomized NCG type set for . + /// + protected static ImmutableHashSet NativeTokens { get; } + + /// + /// The used for governance. This is consistent with + /// the of the gold currency state set for + /// . + /// + protected static Currency GovernanceToken { get; } protected static IWorld InitializeStates() { @@ -31,7 +62,7 @@ protected static FungibleAssetValue ShareFromGovernance(FungibleAssetValue gover => FungibleAssetValue.FromRawValue(Asset.Share, governanceToken.RawValue); protected static FungibleAssetValue ShareFromGovernance(BigInteger amount) - => ShareFromGovernance(Asset.GovernanceToken * amount); + => ShareFromGovernance(GovernanceToken * amount); protected static IWorld Promote( IWorld states, @@ -40,8 +71,9 @@ protected static IWorld Promote( FungibleAssetValue ncg) { var operatorAddress = operatorPublicKey.Address; - states = states.MintAsset( - context: new ActionContext { PreviousState = states, BlockIndex = blockIndex }, + states = states.TransferAsset( + context: new ActionContext(), + sender: GoldCurrencyState.Address, recipient: operatorAddress, value: ncg); states = ValidatorCtrl.Create( @@ -61,8 +93,9 @@ protected static IWorld Delegate( Address delegatorAddress, FungibleAssetValue ncg) { - states = states.MintAsset( - context: new ActionContext { PreviousState = states, BlockIndex = blockIndex }, + states = states.TransferAsset( + context: new ActionContext(), + sender: GoldCurrencyState.Address, recipient: delegatorAddress, value: ncg); states = DelegateCtrl.Execute( diff --git a/.Lib9c.Tests/Action/DPoS/RedelegateTest.cs b/.Lib9c.Tests/Action/DPoS/RedelegateTest.cs index 85c693e75f..d7cf1a38c0 100644 --- a/.Lib9c.Tests/Action/DPoS/RedelegateTest.cs +++ b/.Lib9c.Tests/Action/DPoS/RedelegateTest.cs @@ -12,6 +12,8 @@ using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; using Nekoyume.Action.DPoS.Sys; + using Nekoyume.Model.State; + using Nekoyume.Module; using Xunit; public class RedelegateTest : PoSTest @@ -29,32 +31,35 @@ public void Execute() var validator2Address = Nekoyume.Action.DPoS.Model.Validator.DeriveAddress(validator2OperatorAddress); var delegatorAddress = delegatorPrivateKey.Address; - var states = InitializeStates(); + var states = InitialState; // Prepare initial governance token for the delegator and validator - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, validator1OperatorAddress, - Asset.GovernanceToken * 100); - states = states.MintAsset( - new ActionContext { PreviousState = states }, + GovernanceToken * 100); + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, validator2OperatorAddress, - Asset.GovernanceToken * 100); - states = states.MintAsset( - new ActionContext { PreviousState = states }, + GovernanceToken * 100); + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, delegatorAddress, - Asset.GovernanceToken * 50); + GovernanceToken * 50); // Promote the delegator states = new PromoteValidator( validator1PrivateKey.PublicKey, - amount: Asset.GovernanceToken * 100) + amount: GovernanceToken * 100) .Execute( new ActionContext { PreviousState = states, Signer = validator1OperatorAddress }); states = new PromoteValidator( validator2PrivateKey.PublicKey, - amount: Asset.GovernanceToken * 100) + amount: GovernanceToken * 100) .Execute( new ActionContext { PreviousState = states, Signer = validator2OperatorAddress }); @@ -63,7 +68,7 @@ public void Execute() new ActionContext { PreviousState = states, Miner = validator1OperatorAddress }); // Delegate the validator 1 - states = new Nekoyume.Action.DPoS.Delegate(validator1Address, Asset.GovernanceToken * 50).Execute( + states = new Nekoyume.Action.DPoS.Delegate(validator1Address, GovernanceToken * 50).Execute( new ActionContext { PreviousState = states, Signer = delegatorAddress }); states = new UpdateValidators().Execute(new ActionContext { PreviousState = states }); @@ -89,10 +94,11 @@ public void Execute() Assert.Equal(100 * 100, power2); // Mint and allocate rewards - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, ReservedAddress.RewardPool, - Asset.GovernanceToken * 5); + GovernanceToken * 5); states = new AllocateReward().Execute( new ActionContext { @@ -125,16 +131,16 @@ public void Execute() var validator1OperatorReward = states.GetBalance( AllocateRewardCtrl.RewardAddress(validator1OperatorAddress), - Asset.GovernanceToken).RawValue; + GovernanceToken).RawValue; var validator2OperatorReward = states.GetBalance( AllocateRewardCtrl.RewardAddress(validator2OperatorAddress), - Asset.GovernanceToken).RawValue; + GovernanceToken).RawValue; var validator1Reward = states.GetBalance( - ValidatorRewards.DeriveAddress(validator1Address, Asset.GovernanceToken), - Asset.GovernanceToken).RawValue; + ValidatorRewards.DeriveAddress(validator1Address, GovernanceToken), + GovernanceToken).RawValue; var validator2Reward = states.GetBalance( - ValidatorRewards.DeriveAddress(validator2Address, Asset.GovernanceToken), - Asset.GovernanceToken).RawValue; + ValidatorRewards.DeriveAddress(validator2Address, GovernanceToken), + GovernanceToken).RawValue; // Sum is 500 Assert.Equal(53, validator1OperatorReward); @@ -163,10 +169,11 @@ public void Execute() Assert.Equal((100 + 30) * 100, power2); // Mint and allocate rewards - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, ReservedAddress.RewardPool, - Asset.GovernanceToken * 5); + GovernanceToken * 5); states = new AllocateReward().Execute( new ActionContext { @@ -199,19 +206,19 @@ public void Execute() validator1OperatorReward = states.GetBalance( AllocateRewardCtrl.RewardAddress(validator1OperatorAddress), - Asset.GovernanceToken).RawValue; + GovernanceToken).RawValue; validator2OperatorReward = states.GetBalance( AllocateRewardCtrl.RewardAddress(validator2OperatorAddress), - Asset.GovernanceToken).RawValue; + GovernanceToken).RawValue; validator1Reward = states.GetBalance( - ValidatorRewards.DeriveAddress(validator1Address, Asset.GovernanceToken), - Asset.GovernanceToken).RawValue; + ValidatorRewards.DeriveAddress(validator1Address, GovernanceToken), + GovernanceToken).RawValue; validator2Reward = states.GetBalance( - ValidatorRewards.DeriveAddress(validator2Address, Asset.GovernanceToken), - Asset.GovernanceToken).RawValue; + ValidatorRewards.DeriveAddress(validator2Address, GovernanceToken), + GovernanceToken).RawValue; var delegatorReward = states.GetBalance( AllocateRewardCtrl.RewardAddress(delegatorAddress), - Asset.GovernanceToken).RawValue; + GovernanceToken).RawValue; // Sum is 1000 Assert.Equal(291, validator1OperatorReward); diff --git a/.Lib9c.Tests/Action/DPoS/Sys/UpdateValidatorsTest.cs b/.Lib9c.Tests/Action/DPoS/Sys/UpdateValidatorsTest.cs index 1951d40a31..84d4993321 100644 --- a/.Lib9c.Tests/Action/DPoS/Sys/UpdateValidatorsTest.cs +++ b/.Lib9c.Tests/Action/DPoS/Sys/UpdateValidatorsTest.cs @@ -10,6 +10,7 @@ using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; using Nekoyume.Action.DPoS.Sys; + using Nekoyume.Model.State; using Nekoyume.Module; using Xunit; @@ -19,19 +20,20 @@ public class UpdateValidatorsTest : PoSTest public void Execute() { // Prepare initial state. - IWorld initialState = new World(MockWorldState.CreateModern()); + IWorld initialState = InitialState; const int count = 4; var validatorKeys = Enumerable.Range(0, count).Select(_ => new PrivateKey().PublicKey).ToArray(); initialState = validatorKeys.Aggregate( initialState, - (current, key) => current.MintAsset( + (current, key) => current.TransferAsset( new ActionContext(), + GoldCurrencyState.Address, key.Address, - new FungibleAssetValue(Asset.GovernanceToken, 1, 0))); + new FungibleAssetValue(GovernanceToken, 1, 0))); foreach (var key in validatorKeys) { - Assert.Equal(1, initialState.GetBalance(key.Address, Asset.GovernanceToken).MajorUnit); - Assert.Equal(0, initialState.GetBalance(key.Address, Asset.GovernanceToken).MinorUnit); + Assert.Equal(1, initialState.GetBalance(key.Address, GovernanceToken).MajorUnit); + Assert.Equal(0, initialState.GetBalance(key.Address, GovernanceToken).MinorUnit); } // Stake 1 for each validator. @@ -39,7 +41,7 @@ public void Execute() { initialState = new PromoteValidator( key, - new FungibleAssetValue(Asset.GovernanceToken, 1, 0)).Execute( + new FungibleAssetValue(GovernanceToken, 1, 0)).Execute( new ActionContext { PreviousState = initialState, diff --git a/.Lib9c.Tests/Action/DPoS/UndelegateTest.cs b/.Lib9c.Tests/Action/DPoS/UndelegateTest.cs index 073936792a..df6a5b877b 100644 --- a/.Lib9c.Tests/Action/DPoS/UndelegateTest.cs +++ b/.Lib9c.Tests/Action/DPoS/UndelegateTest.cs @@ -12,6 +12,8 @@ using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; using Nekoyume.Action.DPoS.Sys; + using Nekoyume.Model.State; + using Nekoyume.Module; using Xunit; public class UndelegateTest : PoSTest @@ -25,22 +27,24 @@ public void Execute() var validatorAddress = Nekoyume.Action.DPoS.Model.Validator.DeriveAddress(validatorOperatorAddress); var delegatorAddress = delegatorPrivateKey.Address; - var states = InitializeStates(); + var states = InitialState; // Prepare initial governance token for the delegator and validator - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, validatorOperatorAddress, - Asset.GovernanceToken * 100); - states = states.MintAsset( - new ActionContext { PreviousState = states }, + GovernanceToken * 100); + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, delegatorAddress, - Asset.GovernanceToken * 50); + GovernanceToken * 50); // Promote the validator states = new PromoteValidator( validatorPrivateKey.PublicKey, - amount: Asset.GovernanceToken * 100) + amount: GovernanceToken * 100) .Execute( new ActionContext { PreviousState = states, Signer = validatorOperatorAddress }); @@ -49,7 +53,7 @@ public void Execute() new ActionContext { PreviousState = states, Miner = validatorOperatorAddress }); // Delegate the delegator - states = new Nekoyume.Action.DPoS.Delegate(validatorAddress, Asset.GovernanceToken * 50).Execute( + states = new Nekoyume.Action.DPoS.Delegate(validatorAddress, GovernanceToken * 50).Execute( new ActionContext { PreviousState = states, Signer = delegatorAddress }); states = new UpdateValidators().Execute(new ActionContext { PreviousState = states }); @@ -79,10 +83,11 @@ public void Execute() var blockHash = new BlockHash(bytes); // Mint and allocate rewards - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, ReservedAddress.RewardPool, - Asset.GovernanceToken * 5); + GovernanceToken * 5); states = new AllocateReward().Execute( new ActionContext { @@ -107,10 +112,10 @@ public void Execute() var validatorOperatorReward = states.GetBalance( AllocateRewardCtrl.RewardAddress(validatorOperatorAddress), - Asset.GovernanceToken).RawValue; + GovernanceToken).RawValue; var validatorReward = states.GetBalance( - ValidatorRewards.DeriveAddress(validatorAddress, Asset.GovernanceToken), - Asset.GovernanceToken).RawValue; + ValidatorRewards.DeriveAddress(validatorAddress, GovernanceToken), + GovernanceToken).RawValue; Assert.Equal(72, validatorOperatorReward); Assert.Equal(428, validatorReward); @@ -119,13 +124,13 @@ public void Execute() { PreviousState = states, BlockIndex = 2, Signer = delegatorAddress }); Assert.Equal( 71, - states.GetBalance(delegatorAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(delegatorAddress, GovernanceToken).RawValue); Assert.Equal( 0, - states.GetBalance(validatorOperatorAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(validatorOperatorAddress, GovernanceToken).RawValue); validatorReward = states.GetBalance( - ValidatorRewards.DeriveAddress(validatorAddress, Asset.GovernanceToken), - Asset.GovernanceToken).RawValue; + ValidatorRewards.DeriveAddress(validatorAddress, GovernanceToken), + GovernanceToken).RawValue; Assert.Equal(357, validatorReward); // Check if balance is not yet returned to the delegator @@ -134,7 +139,7 @@ public void Execute() { PreviousState = states, BlockIndex = UnbondingSet.Period - 1 }); Assert.Equal( 71, - states.GetBalance(delegatorAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(delegatorAddress, GovernanceToken).RawValue); // Check if balance is returned to the delegator states = new UpdateValidators().Execute( @@ -142,7 +147,7 @@ public void Execute() { PreviousState = states, BlockIndex = UnbondingSet.Period + 10 }); Assert.Equal( 71 + 30 * 100, - states.GetBalance(delegatorAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(delegatorAddress, GovernanceToken).RawValue); } [Fact] @@ -153,22 +158,24 @@ public void UndelegateAll() var validatorOperatorAddress = validatorPrivateKey.Address; var validatorAddress = Nekoyume.Action.DPoS.Model.Validator.DeriveAddress(validatorOperatorAddress); var delegatorAddress = delegatorPrivateKey.Address; - var states = InitializeStates(); + var states = InitialState; // Prepare initial governance token for the delegator and validator - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, validatorOperatorAddress, - Asset.GovernanceToken * 100); - states = states.MintAsset( - new ActionContext { PreviousState = states }, + GovernanceToken * 100); + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, delegatorAddress, - Asset.GovernanceToken * 50); + GovernanceToken * 50); // Promote the validator states = new PromoteValidator( validatorPrivateKey.PublicKey, - amount: Asset.GovernanceToken * 100) + amount: GovernanceToken * 100) .Execute( new ActionContext { PreviousState = states, Signer = validatorOperatorAddress }); @@ -177,7 +184,7 @@ public void UndelegateAll() new ActionContext { PreviousState = states, Miner = validatorOperatorAddress }); // Delegate the delegator - states = new Nekoyume.Action.DPoS.Delegate(validatorAddress, Asset.GovernanceToken * 50).Execute( + states = new Nekoyume.Action.DPoS.Delegate(validatorAddress, GovernanceToken * 50).Execute( new ActionContext { PreviousState = states, Signer = delegatorAddress }); states = new UpdateValidators().Execute(new ActionContext { PreviousState = states }); @@ -207,10 +214,11 @@ public void UndelegateAll() var blockHash = new BlockHash(bytes); // Mint and allocate rewards - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, ReservedAddress.RewardPool, - Asset.GovernanceToken * 5); + GovernanceToken * 5); states = new AllocateReward().Execute( new ActionContext { @@ -235,10 +243,10 @@ public void UndelegateAll() var validatorOperatorReward = states.GetBalance( AllocateRewardCtrl.RewardAddress(validatorOperatorAddress), - Asset.GovernanceToken).RawValue; + GovernanceToken).RawValue; var validatorReward = states.GetBalance( - ValidatorRewards.DeriveAddress(validatorAddress, Asset.GovernanceToken), - Asset.GovernanceToken).RawValue; + ValidatorRewards.DeriveAddress(validatorAddress, GovernanceToken), + GovernanceToken).RawValue; Assert.Equal(72, validatorOperatorReward); Assert.Equal(428, validatorReward); @@ -247,13 +255,13 @@ public void UndelegateAll() { PreviousState = states, BlockIndex = 2, Signer = delegatorAddress }); Assert.Equal( 0, - states.GetBalance(delegatorAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(delegatorAddress, GovernanceToken).RawValue); Assert.Equal( 0, - states.GetBalance(validatorOperatorAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(validatorOperatorAddress, GovernanceToken).RawValue); validatorReward = states.GetBalance( - ValidatorRewards.DeriveAddress(validatorAddress, Asset.GovernanceToken), - Asset.GovernanceToken).RawValue; + ValidatorRewards.DeriveAddress(validatorAddress, GovernanceToken), + GovernanceToken).RawValue; Assert.Equal(428, validatorReward); // Check if balance is not yet returned to the delegator @@ -262,7 +270,7 @@ public void UndelegateAll() { PreviousState = states, BlockIndex = UnbondingSet.Period - 1 }); Assert.Equal( 0, - states.GetBalance(delegatorAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(delegatorAddress, GovernanceToken).RawValue); // Check if balance is returned to the delegator states = new UpdateValidators().Execute( @@ -270,7 +278,7 @@ public void UndelegateAll() { PreviousState = states, BlockIndex = UnbondingSet.Period + 10 }); Assert.Equal( 50 * 100, - states.GetBalance(delegatorAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(delegatorAddress, GovernanceToken).RawValue); } } } diff --git a/.Lib9c.Tests/Action/DPoS/ValidatorPowerComparerTest.cs b/.Lib9c.Tests/Action/DPoS/ValidatorPowerComparerTest.cs index 16f69f2d11..6371ce8138 100644 --- a/.Lib9c.Tests/Action/DPoS/ValidatorPowerComparerTest.cs +++ b/.Lib9c.Tests/Action/DPoS/ValidatorPowerComparerTest.cs @@ -14,9 +14,9 @@ public void CompareDifferentTokenTest() PublicKey publicKeyA = new PrivateKey().PublicKey; PublicKey publicKeyB = new PrivateKey().PublicKey; ValidatorPower validatorPowerA = new ValidatorPower( - publicKeyA.Address, publicKeyA, Asset.ConsensusFromGovernance(10)); + publicKeyA.Address, publicKeyA, Asset.ConsensusFromGovernance(GovernanceToken * 10)); ValidatorPower validatorPowerB = new ValidatorPower( - publicKeyB.Address, publicKeyB, Asset.ConsensusFromGovernance(11)); + publicKeyB.Address, publicKeyB, Asset.ConsensusFromGovernance(GovernanceToken * 11)); Assert.True(((IComparable)validatorPowerA) .CompareTo(validatorPowerB) > 0); } @@ -27,9 +27,9 @@ public void CompareSameTokenTest() PublicKey publicKeyA = new PrivateKey().PublicKey; PublicKey publicKeyB = new PrivateKey().PublicKey; ValidatorPower validatorPowerA = new ValidatorPower( - publicKeyA.Address, publicKeyA, Asset.ConsensusFromGovernance(10)); + publicKeyA.Address, publicKeyA, Asset.ConsensusFromGovernance(GovernanceToken * 10)); ValidatorPower validatorPowerB = new ValidatorPower( - publicKeyB.Address, publicKeyB, Asset.ConsensusFromGovernance(10)); + publicKeyB.Address, publicKeyB, Asset.ConsensusFromGovernance(GovernanceToken * 10)); int sign = -((IComparable
)publicKeyA.Address) .CompareTo(publicKeyB.Address); Assert.True(((IComparable)validatorPowerA) diff --git a/.Lib9c.Tests/Action/DPoS/WithdrawDelegatorTest.cs b/.Lib9c.Tests/Action/DPoS/WithdrawDelegatorTest.cs index 6011ec7833..b26c277540 100644 --- a/.Lib9c.Tests/Action/DPoS/WithdrawDelegatorTest.cs +++ b/.Lib9c.Tests/Action/DPoS/WithdrawDelegatorTest.cs @@ -10,6 +10,8 @@ using Nekoyume.Action.DPoS; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Sys; + using Nekoyume.Model.State; + using Nekoyume.Module; using Xunit; public class WithdrawDelegatorTest : PoSTest @@ -21,14 +23,15 @@ public void Execute() var address = validatorPrivateKey.Address; var validatorAddress = Nekoyume.Action.DPoS.Model.Validator.DeriveAddress(address); + IWorld states = InitialState; var rewardAddress = Nekoyume.Action.DPoS.Model.ValidatorRewards.DeriveAddress( validatorAddress, - Asset.GovernanceToken); - var states = InitializeStates(); - var amount = Asset.GovernanceToken * 100; - states = states.MintAsset( - new ActionContext { PreviousState = states }, + GovernanceToken); + var amount = GovernanceToken * 100; + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, address, amount); states = new PromoteValidator(validatorPrivateKey.PublicKey, amount: amount).Execute( @@ -45,10 +48,11 @@ public void Execute() Assert.Equal(10000, power); // Mint and allocate rewards - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, ReservedAddress.RewardPool, - Asset.GovernanceToken * 5); + GovernanceToken * 5); states = new AllocateReward().Execute( new ActionContext { @@ -72,19 +76,19 @@ public void Execute() }); Assert.Equal( 0, - states.GetBalance(address, Asset.GovernanceToken).RawValue); + states.GetBalance(address, GovernanceToken).RawValue); Assert.Equal( 428, - states.GetBalance(rewardAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(rewardAddress, GovernanceToken).RawValue); states = new WithdrawDelegator(validatorAddress).Execute( new ActionContext { PreviousState = states, BlockIndex = 2, Signer = address }); Assert.Equal( - 5 * Asset.GovernanceToken, - states.GetBalance(address, Asset.GovernanceToken)); + 5 * GovernanceToken, + states.GetBalance(address, GovernanceToken)); Assert.Equal( 0, - states.GetBalance(rewardAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(rewardAddress, GovernanceToken).RawValue); } } } diff --git a/.Lib9c.Tests/Action/DPoS/WithdrawValidatorTest.cs b/.Lib9c.Tests/Action/DPoS/WithdrawValidatorTest.cs index 660e2eade6..2343658ef3 100644 --- a/.Lib9c.Tests/Action/DPoS/WithdrawValidatorTest.cs +++ b/.Lib9c.Tests/Action/DPoS/WithdrawValidatorTest.cs @@ -11,6 +11,8 @@ using Nekoyume.Action.DPoS.Control; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Sys; + using Nekoyume.Model.State; + using Nekoyume.Module; using Xunit; public class WithdrawValidatorTest : PoSTest @@ -21,10 +23,11 @@ public void Execute() var validatorPrivateKey = new PrivateKey(); var address = validatorPrivateKey.Address; var rewardAddress = AllocateRewardCtrl.RewardAddress(address); - var states = InitializeStates(); - var amount = Asset.GovernanceToken * 100; - states = states.MintAsset( - new ActionContext { PreviousState = states }, + var states = InitialState; + var amount = GovernanceToken * 100; + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, address, amount); states = new PromoteValidator(validatorPrivateKey.PublicKey, amount: amount).Execute( @@ -41,10 +44,11 @@ public void Execute() Assert.Equal(10000, power); // Mint and allocate rewards - states = states.MintAsset( - new ActionContext { PreviousState = states }, + states = states.TransferAsset( + new ActionContext(), + GoldCurrencyState.Address, ReservedAddress.RewardPool, - Asset.GovernanceToken * 5); + GovernanceToken * 5); states = new AllocateReward().Execute( new ActionContext { @@ -68,18 +72,18 @@ public void Execute() }); Assert.Equal( 0, - states.GetBalance(address, Asset.GovernanceToken).RawValue); + states.GetBalance(address, GovernanceToken).RawValue); Assert.Equal( 72, - states.GetBalance(rewardAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(rewardAddress, GovernanceToken).RawValue); states = new WithdrawValidator().Execute( new ActionContext { PreviousState = states, Signer = address }); Assert.Equal( 72, - states.GetBalance(address, Asset.GovernanceToken).RawValue); + states.GetBalance(address, GovernanceToken).RawValue); Assert.Equal( 0, - states.GetBalance(rewardAddress, Asset.GovernanceToken).RawValue); + states.GetBalance(rewardAddress, GovernanceToken).RawValue); } } } diff --git a/.Lib9c.Tests/TestHelper/InitialStateHelper.cs b/.Lib9c.Tests/TestHelper/InitialStateHelper.cs new file mode 100644 index 0000000000..f31672f7b0 --- /dev/null +++ b/.Lib9c.Tests/TestHelper/InitialStateHelper.cs @@ -0,0 +1,79 @@ +using System; +using Libplanet.Action.State; +using Libplanet.Crypto; +using Libplanet.Mocks; +using Libplanet.Types.Assets; +using Nekoyume.Model.State; +using Nekoyume.Module; + +public static class InitialStateHelper +{ + /// + /// Randomly generates a with "NCG" as its ticker, two decimal places, + /// and a random address as its only minter. + /// + /// + /// The minter is changed every time this is called. + /// + public static Currency RandomNCGTypeCurrency => Currency.Legacy("NCG", 2, new PrivateKey().Address); + + public static MockWorldState EmptyWorldState => MockWorldState.CreateModern(); + + public static MockWorldState WithGoldCurrencyState(this MockWorldState mock) => + WithGoldCurrencyState(mock, RandomNCGTypeCurrency); + + public static MockWorldState WithGoldCurrencyState(this MockWorldState mock, Currency currency) => + WithGoldCurrencyState(mock, new GoldCurrencyState(currency)); + + /// + /// Creates a new with its gold currency state set with . + /// + /// + /// + /// A with + /// set as its and the supply amount given + /// to . + /// Thrown when one of the following is true: + /// + /// + /// already has its gold currency state set. + /// + /// + /// 's has ticker that is not NCG. + /// + /// + /// 's has decimal places that is not 2. + /// + /// + /// + public static MockWorldState WithGoldCurrencyState(this MockWorldState mock, GoldCurrencyState goldCurrencyState) + { + if (mock.GetAccountState(ReservedAddresses.LegacyAccount).GetState(GoldCurrencyState.Address) is { } state) + { + throw new ArgumentException( + $"Given {nameof(mock)} already has its gold currency state set: {state}", + nameof(mock)); + } + else if (!goldCurrencyState.Currency.Ticker.Equals("NCG")) + { + throw new ArgumentException( + $"Given {nameof(goldCurrencyState)} must have currency with ticker NCG: {goldCurrencyState.Currency.Ticker}", + nameof(goldCurrencyState)); + } + else if (!goldCurrencyState.Currency.DecimalPlaces.Equals(2)) + { + throw new ArgumentException( + $"Given {nameof(goldCurrencyState)} must have currency with decimal places 2: {goldCurrencyState.Currency.DecimalPlaces}", + nameof(goldCurrencyState)); + } + + mock = mock.SetAccount( + ReservedAddresses.LegacyAccount, + new Account(mock.GetAccountState(ReservedAddresses.LegacyAccount)) + .SetState(GoldCurrencyState.Address, goldCurrencyState.Serialize())); + mock = mock.SetBalance( + GoldCurrencyState.Address, + goldCurrencyState.Currency * goldCurrencyState.InitialSupply); + return mock; + } +} diff --git a/Lib9c.Utils/DPoSBlockHelper.cs b/Lib9c.Utils/DPoSBlockHelper.cs deleted file mode 100644 index 285a33b963..0000000000 --- a/Lib9c.Utils/DPoSBlockHelper.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.IO; -using System.Linq; -using System.Numerics; -using Lib9c; -using Libplanet.Action; -using Libplanet.Action.State; -using Libplanet.Blockchain; -using Libplanet.Crypto; -using Libplanet.Store; -using Libplanet.Store.Trie; -using Libplanet.Types.Assets; -using Libplanet.Types.Blocks; -using Libplanet.Types.Tx; -using Nekoyume.Action.DPoS; -using Nekoyume.Action.DPoS.Misc; -using Nekoyume.Action.DPoS.Sys; - -namespace Nekoyume; - -public class DPoSBlockHelper -{ - public static Block ProposeGenesisBlock( - PrivateKey? privateKey, - IStateStore stateStore, - Dictionary initialNCGs, - Dictionary initialValidators) - { - privateKey ??= new PrivateKey(); - var trie = stateStore.GetStateRoot(null); - trie = trie.SetMetadata(new TrieMetadata(BlockMetadata.CurrentProtocolVersion)); - IWorld world = new World(new WorldBaseState(trie, stateStore)); - foreach (var pair in initialNCGs) - { - world = world.MintAsset( - new ActionContext - { - PreviousState = world, - Signer = privateKey.Address, - }, - pair.Key, - Asset.GovernanceToken * pair.Value); - world = world.MintAsset( - new ActionContext - { - PreviousState = world, - Signer = privateKey.Address, - }, - pair.Key, - Currencies.Mead * 10000); - } - - foreach (var pair in initialValidators) - { - var actionContext = new ActionContext - { - PreviousState = world, - Signer = pair.Key.Address, - }; - world = new PromoteValidator(pair.Key, Asset.GovernanceToken * pair.Value) - .Execute(actionContext); - } - - world = new UpdateValidators().Execute( - new ActionContext - { - PreviousState = world, - Signer = privateKey.Address - }); - world = ActionEvaluator.CommitWorld(world, stateStore); - trie = stateStore.Commit(world.Trie); - - return - BlockChain.ProposeGenesisBlock( - privateKey: privateKey, - stateRootHash: trie.Hash, - transactions: ImmutableList.Empty, - timestamp: DateTimeOffset.UtcNow); - } - - private class ActionContext : IActionContext - { - public Address Signer { get; set; } - - public TxId? TxId => null; - - public Address Miner { get; set; } - - public int BlockProtocolVersion => BlockMetadata.CurrentProtocolVersion; - - public BlockCommit? LastCommit => null; - - public long BlockIndex => 0; - - public IWorld PreviousState { get; set; } - - public int RandomSeed { get; set; } - - public bool IsBlockAction => true; - - public FungibleAssetValue? MaxGasPrice => null; - - public IReadOnlyList Txs => Enumerable.Empty().ToList(); - - public void UseGas(long gas) - { - } - - public IRandom GetRandom() - { - throw new NotImplementedException(); - } - - public long GasUsed() - { - throw new NotImplementedException(); - } - - public long GasLimit() - { - throw new NotImplementedException(); - } - } -} diff --git a/Lib9c/Action/DPoS/CancelUndelegation.cs b/Lib9c/Action/DPoS/CancelUndelegation.cs index 230efdc190..f3f966ffbe 100644 --- a/Lib9c/Action/DPoS/CancelUndelegation.cs +++ b/Lib9c/Action/DPoS/CancelUndelegation.cs @@ -9,6 +9,7 @@ using Nekoyume.Action.DPoS.Model; using Nekoyume.Action.DPoS.Sys; using Nekoyume.Action.DPoS.Util; +using Nekoyume.Module; namespace Nekoyume.Action.DPoS { @@ -67,9 +68,9 @@ public override void LoadPlainValue(IValue plainValue) public override IWorld Execute(IActionContext context) { context.UseGas(1); - var states = context.PreviousState; - var nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); + IActionContext ctx = context; + var states = ctx.PreviousState; + var nativeTokens = states.GetNativeTokens(); states = UndelegateCtrl.Cancel( states, diff --git a/Lib9c/Action/DPoS/Control/DelegateCtrl.cs b/Lib9c/Action/DPoS/Control/DelegateCtrl.cs index c637965bcc..bde2a7c72e 100644 --- a/Lib9c/Action/DPoS/Control/DelegateCtrl.cs +++ b/Lib9c/Action/DPoS/Control/DelegateCtrl.cs @@ -61,13 +61,13 @@ internal static IWorld Execute( FungibleAssetValue governanceToken, IImmutableSet nativeTokens) { - if (!governanceToken.Currency.Equals(Asset.GovernanceToken)) + if (!governanceToken.Currency.Equals(states.GetGoldCurrency())) { - throw new Exception.InvalidCurrencyException(Asset.GovernanceToken, governanceToken.Currency); + throw new Exception.InvalidCurrencyException(states.GetGoldCurrency(), governanceToken.Currency); } FungibleAssetValue delegatorGovernanceTokenBalance = states.GetBalance( - delegatorAddress, Asset.GovernanceToken); + delegatorAddress, states.GetGoldCurrency()); if (governanceToken > delegatorGovernanceTokenBalance) { throw new InsufficientFungibleAssetValueException( @@ -84,7 +84,7 @@ internal static IWorld Execute( Delegation? delegation; (states, delegation) = FetchDelegation(states, delegatorAddress, validatorAddress); - FungibleAssetValue consensusToken = Asset.ConsensusFromGovernance(governanceToken); + FungibleAssetValue consensusToken = Asset.ConvertTokens(governanceToken, Asset.ConsensusToken); Address poolAddress = validator.Status == BondingStatus.Bonded ? ReservedAddress.BondedPool : ReservedAddress.UnbondedPool; diff --git a/Lib9c/Action/DPoS/Control/RedelegateCtrl.cs b/Lib9c/Action/DPoS/Control/RedelegateCtrl.cs index 57080c8126..284212f6e7 100644 --- a/Lib9c/Action/DPoS/Control/RedelegateCtrl.cs +++ b/Lib9c/Action/DPoS/Control/RedelegateCtrl.cs @@ -169,28 +169,29 @@ internal static IWorld Execute( throw new NullValidatorException(dstValidatorAddress); } + var governanceToken = states.GetGoldCurrency(); states = (srcValidator.Status, dstValidator.Status) switch { (BondingStatus.Bonded, BondingStatus.Unbonding) => states.TransferAsset( ctx, ReservedAddress.BondedPool, ReservedAddress.UnbondedPool, - Asset.GovernanceFromConsensus(unbondingConsensusToken)), + Asset.ConvertTokens(unbondingConsensusToken, governanceToken)), (BondingStatus.Bonded, BondingStatus.Unbonded) => states.TransferAsset( ctx, ReservedAddress.BondedPool, ReservedAddress.UnbondedPool, - Asset.GovernanceFromConsensus(unbondingConsensusToken)), + Asset.ConvertTokens(unbondingConsensusToken, governanceToken)), (BondingStatus.Unbonding, BondingStatus.Bonded) => states.TransferAsset( ctx, ReservedAddress.UnbondedPool, ReservedAddress.BondedPool, - Asset.GovernanceFromConsensus(unbondingConsensusToken)), + Asset.ConvertTokens(unbondingConsensusToken, governanceToken)), (BondingStatus.Unbonded, BondingStatus.Bonded) => states.TransferAsset( ctx, ReservedAddress.UnbondedPool, ReservedAddress.BondedPool, - Asset.GovernanceFromConsensus(unbondingConsensusToken)), + Asset.ConvertTokens(unbondingConsensusToken, governanceToken)), _ => states, }; diff --git a/Lib9c/Action/DPoS/Control/SlashCtrl.cs b/Lib9c/Action/DPoS/Control/SlashCtrl.cs index 74bf736537..d81ac843ab 100644 --- a/Lib9c/Action/DPoS/Control/SlashCtrl.cs +++ b/Lib9c/Action/DPoS/Control/SlashCtrl.cs @@ -473,7 +473,8 @@ private static IWorld BurnBondedTokens( throw new Exception.InvalidCurrencyException(Asset.ConsensusToken, amount.Currency); } - var tokensToBurn = Asset.GovernanceFromConsensus(amount); + var governanceToken = world.GetGoldCurrency(); + var tokensToBurn = Asset.ConvertTokens(amount, governanceToken); return world.TransferAsset(actionContext, ReservedAddress.BondedPool, ReservedAddress.CommunityPool, tokensToBurn); } @@ -487,7 +488,8 @@ private static IWorld BurnNotBondedTokens( throw new Exception.InvalidCurrencyException(Asset.ConsensusToken, amount.Currency); } - var tokensToBurn = Asset.GovernanceFromConsensus(amount); + var governanceToken = world.GetGoldCurrency(); + var tokensToBurn = Asset.ConvertTokens(amount, governanceToken); return world.TransferAsset(actionContext, ReservedAddress.UnbondedPool, ReservedAddress.CommunityPool, tokensToBurn); } } diff --git a/Lib9c/Action/DPoS/Control/UndelegateCtrl.cs b/Lib9c/Action/DPoS/Control/UndelegateCtrl.cs index a42c0b3450..d800fa4744 100644 --- a/Lib9c/Action/DPoS/Control/UndelegateCtrl.cs +++ b/Lib9c/Action/DPoS/Control/UndelegateCtrl.cs @@ -160,11 +160,12 @@ internal static IWorld Execute( // Governance token pool transfer if (validator.Status == BondingStatus.Bonded) { + var governanceToken = states.GetGoldCurrency(); states = states.TransferAsset( ctx, ReservedAddress.BondedPool, ReservedAddress.UnbondedPool, - Asset.GovernanceFromConsensus(unbondingConsensusToken)); + Asset.ConvertTokens(unbondingConsensusToken, governanceToken)); } // Entry register @@ -287,11 +288,12 @@ UndelegationEntry undelegationEntry if (validator.Status == BondingStatus.Bonded) { + var governanceToken = states.GetGoldCurrency(); states = states.TransferAsset( ctx, ReservedAddress.UnbondedPool, ReservedAddress.BondedPool, - Asset.GovernanceFromConsensus(cancelledConsensusToken)); + Asset.ConvertTokens(cancelledConsensusToken, governanceToken)); } undelegationEntryIndices.ForEach( @@ -346,11 +348,12 @@ UndelegationEntry undelegationEntry if (undelegationEntry.IsMatured(blockHeight)) { // Pay back governance token to delegator + var governanceToken = states.GetGoldCurrency(); states = states.TransferAsset( ctx, ReservedAddress.UnbondedPool, undelegation.DelegatorAddress, - Asset.GovernanceFromConsensus(undelegationEntry.UnbondingConsensusToken)); + Asset.ConvertTokens(undelegationEntry.UnbondingConsensusToken, governanceToken)); // Remove entry completedIndices.Add(undelegationEntry.Index); diff --git a/Lib9c/Action/DPoS/Control/ValidatorCtrl.cs b/Lib9c/Action/DPoS/Control/ValidatorCtrl.cs index ea4290db82..c0d5733a1b 100644 --- a/Lib9c/Action/DPoS/Control/ValidatorCtrl.cs +++ b/Lib9c/Action/DPoS/Control/ValidatorCtrl.cs @@ -61,12 +61,12 @@ internal static IWorld Create( FungibleAssetValue governanceToken, IImmutableSet nativeTokens) { - if (!governanceToken.Currency.Equals(Asset.GovernanceToken)) + if (!governanceToken.Currency.Equals(states.GetGoldCurrency())) { - throw new Exception.InvalidCurrencyException(Asset.GovernanceToken, governanceToken.Currency); + throw new Exception.InvalidCurrencyException(states.GetGoldCurrency(), governanceToken.Currency); } - FungibleAssetValue consensusToken = Asset.ConsensusFromGovernance(governanceToken); + FungibleAssetValue consensusToken = Asset.ConvertTokens(governanceToken, Asset.ConsensusToken); if (consensusToken < Validator.MinSelfDelegation) { throw new InsufficientFungibleAssetValueException( @@ -206,8 +206,9 @@ internal static IWorld Bond( ctx, ReservedAddress.UnbondedPool, ReservedAddress.BondedPool, - Asset.GovernanceFromConsensus( - states.GetBalance(validator.Address, Asset.ConsensusToken))); + Asset.ConvertTokens( + states.GetBalance(validator.Address, Asset.ConsensusToken), + states.GetGoldCurrency())); } validator.Status = BondingStatus.Bonded; @@ -233,12 +234,14 @@ internal static IWorld Unbond( if (consensusToken.RawValue > 0) { // Transfer consensus token to unbonded pool if remaining. + var governanceToken = states.GetGoldCurrency(); states = states.TransferAsset( ctx, ReservedAddress.BondedPool, ReservedAddress.UnbondedPool, - Asset.GovernanceFromConsensus( - states.GetBalance(validator.Address, Asset.ConsensusToken))); + Asset.ConvertTokens( + states.GetBalance(validator.Address, Asset.ConsensusToken), + governanceToken)); } } diff --git a/Lib9c/Action/DPoS/Delegate.cs b/Lib9c/Action/DPoS/Delegate.cs index 93f0802244..7d059a3f2d 100644 --- a/Lib9c/Action/DPoS/Delegate.cs +++ b/Lib9c/Action/DPoS/Delegate.cs @@ -7,6 +7,7 @@ using Nekoyume.Action.DPoS.Control; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Util; +using Nekoyume.Module; namespace Nekoyume.Action.DPoS { @@ -61,9 +62,9 @@ public override void LoadPlainValue(IValue plainValue) public override IWorld Execute(IActionContext context) { context.UseGas(1); - var states = context.PreviousState; - var nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); + IActionContext ctx = context; + var states = ctx.PreviousState; + var nativeTokens = states.GetNativeTokens(); states = DelegateCtrl.Execute( states, context, diff --git a/Lib9c/Action/DPoS/Misc/Asset.cs b/Lib9c/Action/DPoS/Misc/Asset.cs index 080b548399..5d237c375f 100644 --- a/Lib9c/Action/DPoS/Misc/Asset.cs +++ b/Lib9c/Action/DPoS/Misc/Asset.cs @@ -8,44 +8,25 @@ namespace Nekoyume.Action.DPoS.Misc { public struct Asset { - public static readonly Currency GovernanceToken = - Currency.Legacy( - "NCG", - 2, - new[] { new Address("47d082a115c63e7b58b1532d20e631538eafadde") } - .ToImmutableHashSet()); - public static readonly Currency ConsensusToken = Currency.Uncapped("ConsensusToken", 0, minters: null); public static readonly Currency Share = Currency.Uncapped("Share", 0, minters: null); - public static FungibleAssetValue ConsensusFromGovernance(FungibleAssetValue governanceToken) - { - if (!governanceToken.Currency.Equals(GovernanceToken)) - { - throw new ArgumentException( - message: $"'{governanceToken}' is not {nameof(GovernanceToken)}", - paramName: nameof(governanceToken)); - } - - return FungibleAssetValue.FromRawValue(ConsensusToken, governanceToken.RawValue); - } - - public static FungibleAssetValue ConsensusFromGovernance(BigInteger amount) - => ConsensusFromGovernance(GovernanceToken * amount); + public static FungibleAssetValue ConsensusFromGovernance(FungibleAssetValue governanceTokens) => + ConvertTokens(governanceTokens, ConsensusToken); - public static FungibleAssetValue GovernanceFromConsensus(FungibleAssetValue consensusToken) + public static FungibleAssetValue ConvertTokens(FungibleAssetValue sourceTokens, Currency targetToken) { - if (!consensusToken.Currency.Equals(ConsensusToken)) + if (sourceTokens.Currency.Equals(targetToken)) { throw new ArgumentException( - message: $"'{consensusToken}' is not {nameof(ConsensusToken)}", - paramName: nameof(consensusToken)); + $"Target currency {targetToken} cannot be the same as the source asset's currency {sourceTokens.Currency}.", + nameof(targetToken)); } - return FungibleAssetValue.FromRawValue(GovernanceToken, consensusToken.RawValue); + return FungibleAssetValue.FromRawValue(targetToken, sourceTokens.RawValue); } } } diff --git a/Lib9c/Action/DPoS/PromoteValidator.cs b/Lib9c/Action/DPoS/PromoteValidator.cs index 762a8bdc76..5d5b8f0a78 100644 --- a/Lib9c/Action/DPoS/PromoteValidator.cs +++ b/Lib9c/Action/DPoS/PromoteValidator.cs @@ -8,6 +8,7 @@ using Nekoyume.Action.DPoS.Exception; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Util; +using Nekoyume.Module; namespace Nekoyume.Action.DPoS { @@ -73,8 +74,7 @@ public override IWorld Execute(IActionContext context) } var states = context.PreviousState; - var nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); + var nativeTokens = states.GetNativeTokens(); states = ValidatorCtrl.Create( states, diff --git a/Lib9c/Action/DPoS/Redelegate.cs b/Lib9c/Action/DPoS/Redelegate.cs index 2b806a4ded..21da3db520 100644 --- a/Lib9c/Action/DPoS/Redelegate.cs +++ b/Lib9c/Action/DPoS/Redelegate.cs @@ -7,6 +7,7 @@ using Nekoyume.Action.DPoS.Control; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Util; +using Nekoyume.Module; namespace Nekoyume.Action.DPoS { @@ -74,9 +75,9 @@ public override void LoadPlainValue(IValue plainValue) public override IWorld Execute(IActionContext context) { context.UseGas(1); - var states = context.PreviousState; - var nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); + IActionContext ctx = context; + var states = ctx.PreviousState; + var nativeTokens = states.GetNativeTokens(); states = RedelegateCtrl.Execute( states, diff --git a/Lib9c/Action/DPoS/Sys/AllocateReward.cs b/Lib9c/Action/DPoS/Sys/AllocateReward.cs index 8d18336e1f..88d894d2e8 100644 --- a/Lib9c/Action/DPoS/Sys/AllocateReward.cs +++ b/Lib9c/Action/DPoS/Sys/AllocateReward.cs @@ -6,6 +6,8 @@ using Nekoyume.Action.DPoS.Control; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Model; +using Nekoyume.Model.State; +using Nekoyume.Module; namespace Nekoyume.Action.DPoS.Sys { @@ -35,9 +37,8 @@ public override void LoadPlainValue(IValue plainValue) public override IWorld Execute(IActionContext context) { var states = context.PreviousState; - var nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Currencies.Mead); -; + var nativeTokens = states.GetNativeTokens(); + if (states.GetDPoSState(ReservedAddress.ProposerInfo) is { } proposerInfoState) { states = AllocateRewardCtrl.Execute( diff --git a/Lib9c/Action/DPoS/Undelegate.cs b/Lib9c/Action/DPoS/Undelegate.cs index 3a06c87b83..8775542c7a 100644 --- a/Lib9c/Action/DPoS/Undelegate.cs +++ b/Lib9c/Action/DPoS/Undelegate.cs @@ -7,6 +7,7 @@ using Nekoyume.Action.DPoS.Control; using Nekoyume.Action.DPoS.Misc; using Nekoyume.Action.DPoS.Util; +using Nekoyume.Module; namespace Nekoyume.Action.DPoS { @@ -64,9 +65,9 @@ public override void LoadPlainValue(IValue plainValue) public override IWorld Execute(IActionContext context) { context.UseGas(1); - var states = context.PreviousState; - var nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Asset.ConsensusToken, Asset.Share); + IActionContext ctx = context; + var states = ctx.PreviousState; + var nativeTokens = states.GetNativeTokens(); states = UndelegateCtrl.Execute( states, diff --git a/Lib9c/Action/DPoS/WithdrawDelegator.cs b/Lib9c/Action/DPoS/WithdrawDelegator.cs index 6740817b87..e8554168f0 100644 --- a/Lib9c/Action/DPoS/WithdrawDelegator.cs +++ b/Lib9c/Action/DPoS/WithdrawDelegator.cs @@ -56,9 +56,9 @@ public override void LoadPlainValue(IValue plainValue) public override IWorld Execute(IActionContext context) { context.UseGas(1); - var states = context.PreviousState; - var nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Currencies.Mead, Asset.ConsensusToken, Asset.Share); + IActionContext ctx = context; + var states = ctx.PreviousState; + var nativeTokens = states.GetNativeTokens(); states = DelegateCtrl.Distribute( states, diff --git a/Lib9c/Action/DPoS/WithdrawValidator.cs b/Lib9c/Action/DPoS/WithdrawValidator.cs index 06aca9fd32..8778866199 100644 --- a/Lib9c/Action/DPoS/WithdrawValidator.cs +++ b/Lib9c/Action/DPoS/WithdrawValidator.cs @@ -40,9 +40,9 @@ public override void LoadPlainValue(IValue plainValue) public override IWorld Execute(IActionContext context) { context.UseGas(1); - var states = context.PreviousState; - var nativeTokens = ImmutableHashSet.Create( - Asset.GovernanceToken, Currencies.Mead, Asset.ConsensusToken, Asset.Share); + IActionContext ctx = context; + var states = ctx.PreviousState; + var nativeTokens = states.GetNativeTokens(); #pragma warning disable LAA1002 foreach (Currency nativeToken in nativeTokens) diff --git a/Lib9c/Module/LegacyModule.cs b/Lib9c/Module/LegacyModule.cs index a87722df9b..b98da86a5a 100644 --- a/Lib9c/Module/LegacyModule.cs +++ b/Lib9c/Module/LegacyModule.cs @@ -15,6 +15,7 @@ using Libplanet.Types.Assets; using LruCacheNet; using Nekoyume.Action; +using Nekoyume.Action.DPoS.Misc; using Nekoyume.Helper; using Nekoyume.Model.Arena; using Nekoyume.Model.Coupons; @@ -240,6 +241,13 @@ public static Currency GetGoldCurrency(this IWorldState worldState) ); } + public static ImmutableHashSet GetNativeTokens(this IWorldState worldState) => + ImmutableHashSet.Create( + GetGoldCurrency(worldState), + Asset.ConsensusToken, + Asset.Share, + Currencies.Mead); + public static WeeklyArenaState GetWeeklyArenaState(this IWorldState worldState, Address address) { var iValue = GetLegacyState(worldState, address);