public void Execute(bool exist, int level, int monsterCollectionRound, int prevLevel, long blockIndex) { Address monsterCollectionAddress = MonsterCollectionState0.DeriveAddress(_signer, monsterCollectionRound); if (exist) { List <MonsterCollectionRewardSheet.RewardInfo> rewards = _tableSheets.MonsterCollectionRewardSheet[prevLevel].Rewards; MonsterCollectionState0 prevMonsterCollectionState = new MonsterCollectionState0(monsterCollectionAddress, prevLevel, 0, _tableSheets.MonsterCollectionRewardSheet); _initialState = _initialState.SetState(monsterCollectionAddress, prevMonsterCollectionState.Serialize()); Assert.All(prevMonsterCollectionState.RewardLevelMap, kv => Assert.Equal(rewards, kv.Value)); } AgentState prevAgentState = _initialState.GetAgentState(_signer); while (prevAgentState.MonsterCollectionRound < monsterCollectionRound) { prevAgentState.IncreaseCollectionRound(); } _initialState = _initialState.SetState(_signer, prevAgentState.Serialize()); Currency currency = _initialState.GetGoldCurrency(); for (int i = 1; i < level + 1; i++) { if (i > prevLevel) { MonsterCollectionSheet.Row row = _tableSheets.MonsterCollectionSheet[i]; _initialState = _initialState.MintAsset(_signer, row.RequiredGold * currency); } } MonsterCollect0 action = new MonsterCollect0 { level = level, collectionRound = monsterCollectionRound, }; IAccountStateDelta nextState = action.Execute(new ActionContext { PreviousStates = _initialState, Signer = _signer, BlockIndex = blockIndex, }); MonsterCollectionState0 nextMonsterCollectionState = new MonsterCollectionState0((Dictionary)nextState.GetState(monsterCollectionAddress)); AgentState nextAgentState = nextState.GetAgentState(_signer); Assert.Equal(level, nextMonsterCollectionState.Level); Assert.Equal(0 * currency, nextState.GetBalance(_signer, currency)); Assert.Equal(monsterCollectionRound, nextAgentState.MonsterCollectionRound); long rewardLevel = nextMonsterCollectionState.GetRewardLevel(blockIndex); for (long i = rewardLevel; i < 4; i++) { List <MonsterCollectionRewardSheet.RewardInfo> expected = _tableSheets.MonsterCollectionRewardSheet[level].Rewards; Assert.Equal(expected, nextMonsterCollectionState.RewardLevelMap[i + 1]); } }
public void Execute(int balance, int?prevLevel, int level, long blockIndex, Type exc, int?expectedStakings) { Address monsterCollectionAddress = MonsterCollectionState.DeriveAddress(_signer, 0); Currency currency = _initialState.GetGoldCurrency(); FungibleAssetValue balanceFav = currency * balance; FungibleAssetValue staked = currency * 0; if (prevLevel is { } prevLevelNotNull) { List <MonsterCollectionRewardSheet.RewardInfo> rewards = _tableSheets.MonsterCollectionRewardSheet[prevLevelNotNull].Rewards; var prevMonsterCollectionState = new MonsterCollectionState( address: monsterCollectionAddress, level: prevLevelNotNull, blockIndex: 0, monsterCollectionRewardSheet: _tableSheets.MonsterCollectionRewardSheet ); _initialState = _initialState.SetState(monsterCollectionAddress, prevMonsterCollectionState.Serialize()); for (int i = 0; i < prevLevel; i++) { MonsterCollectionSheet.Row row = _tableSheets.MonsterCollectionSheet[i + 1]; staked += row.RequiredGold * currency; _initialState = _initialState.MintAsset(monsterCollectionAddress, row.RequiredGold * currency); } } balanceFav -= staked; _initialState = _initialState.MintAsset(_signer, balanceFav); var action = new MonsterCollect { level = level, }; if (exc is { } excType) { Assert.Throws(excType, () => action.Execute(new ActionContext { PreviousStates = _initialState, Signer = _signer, BlockIndex = blockIndex, })); }
public static IAccountStateDelta MarkBalanceChanged( this IAccountStateDelta states, Currency currency, params Address[] accounts ) { if (accounts.Length == 1) { return(states.MintAsset(accounts[0], currency * 1)); } else if (accounts.Length < 1) { return(states); } for (int i = 1; i < accounts.Length; i++) { states = states.TransferAsset(accounts[i - 1], accounts[i], currency * 1, true); } return(states); }
public void Execute(int rewardLevel, int prevRewardLevel, int collectionLevel) { Address collectionAddress = MonsterCollectionState0.DeriveAddress(_signer, 0); List <MonsterCollectionRewardSheet.RewardInfo> rewards = _tableSheets.MonsterCollectionRewardSheet[1].Rewards; MonsterCollectionState0 monsterCollectionState = new MonsterCollectionState0(collectionAddress, 1, 0, _tableSheets.MonsterCollectionRewardSheet); for (int i = 0; i < prevRewardLevel; i++) { int level = i + 1; MonsterCollectionResult result = new MonsterCollectionResult(Guid.NewGuid(), _avatarAddress, rewards); monsterCollectionState.UpdateRewardMap(level, result, i * MonsterCollectionState0.RewardInterval); } List <MonsterCollectionRewardSheet.RewardInfo> collectionRewards = _tableSheets.MonsterCollectionRewardSheet[collectionLevel].Rewards; monsterCollectionState.Update(collectionLevel, rewardLevel, _tableSheets.MonsterCollectionRewardSheet); for (long i = rewardLevel; i < 4; i++) { Assert.Equal(collectionRewards, monsterCollectionState.RewardLevelMap[i + 1]); } Dictionary <int, int> rewardExpectedMap = new Dictionary <int, int>(); foreach (var(key, value) in monsterCollectionState.RewardLevelMap) { if (monsterCollectionState.RewardMap.ContainsKey(key) || key > rewardLevel) { continue; } foreach (var info in value) { if (rewardExpectedMap.ContainsKey(info.ItemId)) { rewardExpectedMap[info.ItemId] += info.Quantity; } else { rewardExpectedMap[info.ItemId] = info.Quantity; } } } AvatarState prevAvatarState = _state.GetAvatarState(_avatarAddress); Assert.Empty(prevAvatarState.mailBox); Currency currency = _state.GetGoldCurrency(); int collectionRound = _state.GetAgentState(_signer).MonsterCollectionRound; _state = _state .SetState(collectionAddress, monsterCollectionState.Serialize()); FungibleAssetValue balance = 0 * currency; if (rewardLevel == 4) { foreach (var row in _tableSheets.MonsterCollectionSheet) { if (row.Level <= collectionLevel) { balance += row.RequiredGold * currency; } } collectionRound += 1; _state = _state .MintAsset(collectionAddress, balance); } Assert.Equal(prevRewardLevel, monsterCollectionState.RewardLevel); Assert.Equal(0, _state.GetAgentState(_signer).MonsterCollectionRound); ClaimMonsterCollectionReward0 action = new ClaimMonsterCollectionReward0 { avatarAddress = _avatarAddress, collectionRound = 0, }; IAccountStateDelta nextState = action.Execute(new ActionContext { PreviousStates = _state, Signer = _signer, BlockIndex = rewardLevel * MonsterCollectionState0.RewardInterval, Random = new TestRandom(), }); MonsterCollectionState0 nextMonsterCollectionState = new MonsterCollectionState0((Dictionary)nextState.GetState(collectionAddress)); Assert.Equal(rewardLevel, nextMonsterCollectionState.RewardLevel); AvatarState nextAvatarState = nextState.GetAvatarState(_avatarAddress); foreach (var(itemId, qty) in rewardExpectedMap) { Assert.True(nextAvatarState.inventory.HasItem(itemId, qty)); } Assert.Equal(rewardLevel - prevRewardLevel, nextAvatarState.mailBox.Count); Assert.All(nextAvatarState.mailBox, mail => { Assert.IsType <MonsterCollectionMail>(mail); MonsterCollectionMail monsterCollectionMail = (MonsterCollectionMail)mail; Assert.IsType <MonsterCollectionResult>(monsterCollectionMail.attachment); MonsterCollectionResult result = (MonsterCollectionResult)monsterCollectionMail.attachment; Assert.Equal(result.id, mail.id); }); for (int i = 0; i < nextMonsterCollectionState.RewardLevel; i++) { int level = i + 1; List <MonsterCollectionRewardSheet.RewardInfo> rewardInfos = _tableSheets.MonsterCollectionRewardSheet[collectionLevel].Rewards; Assert.Contains(level, nextMonsterCollectionState.RewardMap.Keys); Assert.Equal(_avatarAddress, nextMonsterCollectionState.RewardMap[level].avatarAddress); } Assert.Equal(0 * currency, nextState.GetBalance(collectionAddress, currency)); Assert.Equal(balance, nextState.GetBalance(_signer, currency)); Assert.Equal(collectionRound, nextState.GetAgentState(_signer).MonsterCollectionRound); Assert.Equal(nextMonsterCollectionState.End, rewardLevel == 4); }