public void Serialize() { var orderId = Guid.NewGuid(); var mail = new CancelOrderMail(1, Guid.NewGuid(), 2, orderId); var serialized = (Dictionary)mail.Serialize(); var deserialized = (CancelOrderMail)Mail.Deserialize(serialized); Assert.Equal(1, deserialized.blockIndex); Assert.Equal(2, deserialized.requiredBlockIndex); Assert.Equal(orderId, deserialized.OrderId); }
public void Serialize_DotNet_Api() { var orderId = Guid.NewGuid(); var mail = new CancelOrderMail(1, Guid.NewGuid(), 2, orderId); var formatter = new BinaryFormatter(); using var ms = new MemoryStream(); formatter.Serialize(ms, mail); ms.Seek(0, SeekOrigin.Begin); var deserialized = (CancelOrderMail)formatter.Deserialize(ms); Assert.Equal(mail.Serialize(), deserialized.Serialize()); }
public override IAccountStateDelta Execute(IActionContext context) { var states = context.PreviousStates; var shardedShopAddress = ShardedShopStateV2.DeriveAddress(itemSubType, orderId); var inventoryAddress = sellerAvatarAddress.Derive(LegacyInventoryKey); var worldInformationAddress = sellerAvatarAddress.Derive(LegacyWorldInformationKey); var questListAddress = sellerAvatarAddress.Derive(LegacyQuestListKey); var orderDigestListAddress = OrderDigestListState.DeriveAddress(sellerAvatarAddress); var itemAddress = Addresses.GetItemAddress(tradableId); if (context.Rehearsal) { states = states.SetState(shardedShopAddress, MarkChanged); return(states .SetState(inventoryAddress, MarkChanged) .SetState(worldInformationAddress, MarkChanged) .SetState(questListAddress, MarkChanged) .SetState(orderDigestListAddress, MarkChanged) .SetState(itemAddress, MarkChanged) .SetState(sellerAvatarAddress, MarkChanged)); } CheckObsolete(BlockChain.Policy.BlockPolicySource.V100080ObsoleteIndex, context); var addressesHex = GetSignerAndOtherAddressesHex(context, sellerAvatarAddress); var sw = new Stopwatch(); sw.Start(); var started = DateTimeOffset.UtcNow; Log.Verbose("{AddressesHex}Sell Cancel exec started", addressesHex); if (!states.TryGetAvatarStateV2(context.Signer, sellerAvatarAddress, out var avatarState, out _)) { throw new FailedLoadStateException( $"{addressesHex}Aborted as the avatar state of the seller failed to load."); } sw.Stop(); Log.Verbose("{AddressesHex}Sell Cancel Get AgentAvatarStates: {Elapsed}", addressesHex, sw.Elapsed); sw.Restart(); if (!avatarState.worldInformation.IsStageCleared(GameConfig.RequireClearedStageLevel.ActionsInShop)) { avatarState.worldInformation.TryGetLastClearedStageId(out var current); throw new NotEnoughClearedStageLevelException(addressesHex, GameConfig.RequireClearedStageLevel.ActionsInShop, current); } if (!states.TryGetState(shardedShopAddress, out BxDictionary shopStateDict)) { throw new FailedLoadStateException($"{addressesHex}failed to load {nameof(ShardedShopStateV2)}({shardedShopAddress})."); } sw.Stop(); Log.Verbose("{AddressesHex}Sell Cancel Get ShopState: {Elapsed}", addressesHex, sw.Elapsed); sw.Restart(); if (!states.TryGetState(Order.DeriveAddress(orderId), out Dictionary orderDict)) { throw new FailedLoadStateException($"{addressesHex}failed to load {nameof(Order)}({Order.DeriveAddress(orderId)})."); } Order order = OrderFactory.Deserialize(orderDict); order.ValidateCancelOrder2(avatarState, tradableId); ITradableItem sellItem = order.Cancel2(avatarState, context.BlockIndex); var shardedShopState = new ShardedShopStateV2(shopStateDict); shardedShopState.Remove(order, context.BlockIndex); states = states.SetState(shardedShopAddress, shardedShopState.Serialize()); if (!states.TryGetState(orderDigestListAddress, out Dictionary rawList)) { throw new FailedLoadStateException($"{addressesHex}failed to load {nameof(OrderDigest)}({orderDigestListAddress})."); } var digestList = new OrderDigestListState(rawList); digestList.Remove(order.OrderId); var expirationMail = avatarState.mailBox.OfType <OrderExpirationMail>() .FirstOrDefault(m => m.OrderId.Equals(orderId)); if (!(expirationMail is null)) { avatarState.mailBox.Remove(expirationMail); } var mail = new CancelOrderMail( context.BlockIndex, orderId, context.BlockIndex, orderId ); avatarState.Update(mail); avatarState.updatedAt = context.BlockIndex; avatarState.blockIndex = context.BlockIndex; sw.Stop(); Log.Verbose("{AddressesHex}Sell Cancel Update AvatarState: {Elapsed}", addressesHex, sw.Elapsed); sw.Restart(); states = states .SetState(itemAddress, sellItem.Serialize()) .SetState(orderDigestListAddress, digestList.Serialize()) .SetState(inventoryAddress, avatarState.inventory.Serialize()) .SetState(worldInformationAddress, avatarState.worldInformation.Serialize()) .SetState(questListAddress, avatarState.questList.Serialize()) .SetState(sellerAvatarAddress, avatarState.SerializeV2()); sw.Stop(); Log.Verbose("{AddressesHex}Sell Cancel Set AvatarState: {Elapsed}", addressesHex, sw.Elapsed); sw.Restart(); sw.Stop(); var ended = DateTimeOffset.UtcNow; Log.Verbose("{AddressesHex}Sell Cancel Set ShopState: {Elapsed}", addressesHex, sw.Elapsed); Log.Verbose("{AddressesHex}Sell Cancel Total Executed Time: {Elapsed}", addressesHex, ended - started); return(states); }