diff --git a/Directory.Build.props b/Directory.Build.props
index 5ec85203..f954c406 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,6 +1,6 @@
- 1.20.1-dev.e639502afb22df4d230d52002b519b3f8ef16b4f
- 5.4.2
+ 1.21.0-dev.fa7c58ff1072e2d81526c4f414c5e54a265f283f
+ 5.5.0
diff --git a/Lib9c.Models.Tests/Lib9c.Models.Tests.csproj b/Lib9c.Models.Tests/Lib9c.Models.Tests.csproj
index dc23cbb6..27898d19 100644
--- a/Lib9c.Models.Tests/Lib9c.Models.Tests.csproj
+++ b/Lib9c.Models.Tests/Lib9c.Models.Tests.csproj
@@ -1,7 +1,7 @@
- net6.0
+ net8.0
10
enable
enable
diff --git a/Lib9c.Models/Factories/MailFactory.cs b/Lib9c.Models/Factories/MailFactory.cs
index c7f82acb..6b4039ab 100644
--- a/Lib9c.Models/Factories/MailFactory.cs
+++ b/Lib9c.Models/Factories/MailFactory.cs
@@ -41,6 +41,7 @@ public static Mail Create(IValue bencoded)
"sellCancel" => new SellCancelMail(d),
"seller" => new SellerMail(d),
nameof(UnloadFromMyGaragesRecipientMail) => new UnloadFromMyGaragesRecipientMail(d),
+ nameof(PatrolRewardMail) => new PatrolRewardMail(d),
_ => throw new UnsupportedArgumentValueException("typeId", typeId),
};
}
diff --git a/Lib9c.Models/Mails/PatrolRewardMail.cs b/Lib9c.Models/Mails/PatrolRewardMail.cs
new file mode 100644
index 00000000..c6a11bd0
--- /dev/null
+++ b/Lib9c.Models/Mails/PatrolRewardMail.cs
@@ -0,0 +1,61 @@
+using Bencodex.Types;
+using Lib9c.Models.Exceptions;
+using Lib9c.Models.Extensions;
+using Libplanet.Types.Assets;
+using MongoDB.Bson.Serialization.Attributes;
+using ValueKind = Bencodex.Types.ValueKind;
+
+namespace Lib9c.Models.Mails;
+
+///
+///
+///
+[BsonIgnoreExtraElements]
+public record PatrolRewardMail : Mail
+{
+ public List FungibleAssetValues { get; init; }
+ public List<(int id, int count)> Items { get; init; }
+
+ public override IValue Bencoded
+ {
+ get
+ {
+ var d = (Dictionary)base.Bencoded;
+ if (FungibleAssetValues.Count != 0)
+ {
+ d = d.SetItem("f", new List(FungibleAssetValues
+ .Select(f => f.Serialize())));
+ }
+
+ if (Items.Count != 0)
+ {
+ d = d.SetItem("i", new List(Items
+ .Select(tuple => List.Empty.Add(tuple.id).Add(tuple.count))));
+ }
+
+ return d;
+ }
+ }
+
+ public PatrolRewardMail(IValue bencoded) : base(bencoded)
+ {
+ if (bencoded is not Dictionary d)
+ {
+ throw new UnsupportedArgumentTypeException(
+ nameof(bencoded),
+ new[] { ValueKind.Dictionary },
+ bencoded.Kind);
+ }
+
+ FungibleAssetValues = d.ContainsKey("f")
+ ? d["f"].ToList(StateExtensions.ToFungibleAssetValue)
+ : new List();
+ Items = d.ContainsKey("i")
+ ? d["i"].ToList<(int, int)>(v =>
+ {
+ var list = (List)v;
+ return ((Integer)list[0], (Integer)list[1]);
+ })
+ : new List<(int id, int count)>();
+ }
+}
diff --git a/Mimir.Worker/Mimir.Worker.csproj b/Mimir.Worker/Mimir.Worker.csproj
index 790a24d0..c80c84fa 100644
--- a/Mimir.Worker/Mimir.Worker.csproj
+++ b/Mimir.Worker/Mimir.Worker.csproj
@@ -10,7 +10,7 @@
-
+