sui_jsonrpc/msgs/
sui_coin.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use std::collections::HashMap;
5
6use af_sui_types::{EpochId, ObjectDigest, ObjectId, ObjectRef, TransactionDigest};
7use serde::{Deserialize, Serialize};
8use serde_with::{IfIsHumanReadable, serde_as};
9use sui_sdk_types::Version;
10
11use super::Page;
12use crate::serde::BigInt;
13
14pub type CoinPage = Page<Coin, String>;
15
16#[serde_as]
17#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
18#[serde(rename_all = "camelCase")]
19pub struct Balance {
20    pub coin_type: String,
21    pub coin_object_count: usize,
22    #[serde_as(as = "BigInt<u128>")]
23    pub total_balance: u128,
24    #[serde_as(as = "HashMap<BigInt<u64>, BigInt<u128>>")]
25    pub locked_balance: HashMap<EpochId, u128>,
26}
27
28impl Balance {
29    pub fn zero(coin_type: String) -> Self {
30        Self {
31            coin_type,
32            coin_object_count: 0,
33            total_balance: 0,
34            locked_balance: HashMap::new(),
35        }
36    }
37}
38
39#[serde_as]
40#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
41#[serde(rename_all = "camelCase")]
42pub struct Coin {
43    pub coin_type: String,
44    pub coin_object_id: ObjectId,
45    #[serde_as(as = "BigInt<u64>")]
46    pub version: Version,
47    pub digest: ObjectDigest,
48    #[serde_as(as = "BigInt<u64>")]
49    pub balance: u64,
50    pub previous_transaction: TransactionDigest,
51}
52
53impl Coin {
54    pub fn object_ref(&self) -> ObjectRef {
55        (self.coin_object_id, self.version, self.digest)
56    }
57}
58
59#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
60#[serde(rename_all = "camelCase")]
61pub struct SuiCoinMetadata {
62    /// Number of decimal places the coin uses.
63    pub decimals: u8,
64    /// Name for the token
65    pub name: String,
66    /// Symbol for the token
67    pub symbol: String,
68    /// Description of the token
69    pub description: String,
70    /// URL for the token logo
71    pub icon_url: Option<String>,
72    /// Object id for the CoinMetadata object
73    pub id: Option<ObjectId>,
74}
75
76/// Originally from `sui_types::balance`.
77#[serde_as]
78#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
79pub struct Supply {
80    #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
81    pub value: u64,
82}
83
84#[cfg(test)]
85mod tests {
86    use super::CoinPage;
87
88    #[test]
89    fn coin_page_json() {
90        let value = serde_json::json!({
91          "data": [
92            {
93              "coinType": "0x2::sui::SUI",
94              "coinObjectId": "0x778e75c813cc7bf615a3477b5c2e5cc4364cde735b80c43597ec8175fd943671",
95              "version": "364688977",
96              "digest": "7yc3F75UbHU9Qshf951zmbkQ7rgQmE8r1YRKGTbmLJ2f",
97              "balance": "9998727478293",
98              "previousTransaction": "CQHxo6mn7zNQX11guHTUPNa5PMhCvodhmoz982PFnErX"
99            },
100            {
101              "coinType": "0x2::sui::SUI",
102              "coinObjectId": "0x15be68e1baa31868d463e0676fa46e1fb6b0f51063d804e857f0113d2920c67a",
103              "version": "204442968",
104              "digest": "4YBFFvLDMhuQPsLtENqfGsvAcV4mDqzaiZBvhJ7KdjiH",
105              "balance": "996650164",
106              "previousTransaction": "HsstpwxjrXBJCf5eqSzV7asXnE2e2JVDYQxCNtzEiDHG"
107            },
108            {
109              "coinType": "0x2::sui::SUI",
110              "coinObjectId": "0x4aca24029ffb5583adc4e9a298244ced3faf6827412269aa1ea0feb89038f0be",
111              "version": "281343209",
112              "digest": "5zSTxMKJABvj31nw5ZYrffwU6Adeiu5vcNsP2h55JNFU",
113              "balance": "995220764",
114              "previousTransaction": "HLY1QY8okXbXmPGKvdpYSgTvZyjgJECpiXjQNQTnBiQj"
115            },
116            {
117              "coinType": "0x2::sui::SUI",
118              "coinObjectId": "0xbe02f79a382915959c457880f12f03b1ec475d3084795fc014c4f43e50e5afe6",
119              "version": "169438719",
120              "digest": "ApvnC81FCi71JhMnZjBn1y1NN6Lw279j2NiG1ehvtDhM",
121              "balance": "993603580",
122              "previousTransaction": "F9u1PgGAyaBkKYGs8r7L8zjTJxa6SwamuzpTxEjUyizy"
123            },
124            {
125              "coinType": "0x2::sui::SUI",
126              "coinObjectId": "0x89f6504590d43becf58fd949772e609731bffbd72e6ac5521357b12a0b2fc2d2",
127              "version": "204443012",
128              "digest": "2soVvf43GDoEUvNy2sSYxbmwketGdS6fU65H1Ze4BqJD",
129              "balance": "320804480",
130              "previousTransaction": "37skCQJmUCn5sPJJShi8sk1EhvKMuxjAuN7pT9nEydvi"
131            },
132            {
133              "coinType": "0x2::sui::SUI",
134              "coinObjectId": "0x00c4eaac095d54118eba1ba78c1f7e59b42620e070baeb6b7ff2ee481ccda314",
135              "version": "204443010",
136              "digest": "7H3SutEWwU5uJSx6AB2vAUCRz9QdrAvfJU2f4DXVUQiX",
137              "balance": "100000000",
138              "previousTransaction": "67YwHzL7hY1E6CC3WQ7a9M3neAGQpPK56MnLGYHC63Lc"
139            },
140            {
141              "coinType": "0x2::sui::SUI",
142              "coinObjectId": "0x00d3f6aa6e02253f6f8f128af2772be4922d28b38909746bc3aee9528fd02c1f",
143              "version": "204443012",
144              "digest": "mBS7PgFZ3kEWXdEjf9H87zLXAXusUm33zP4hvf2c6PN",
145              "balance": "100000000",
146              "previousTransaction": "37skCQJmUCn5sPJJShi8sk1EhvKMuxjAuN7pT9nEydvi"
147            },
148            {
149              "coinType": "0x2::sui::SUI",
150              "coinObjectId": "0x01180d0165e367f8cae862e2f8bb31db099de3127cac2e015f482a330ad53f0c",
151              "version": "204443011",
152              "digest": "9o9fNdXkgQ1Q9obzPXnRykrADrfvXYEVkpHihBh3bkAW",
153              "balance": "100000000",
154              "previousTransaction": "C8reWy1j85aBxeKRweoeW1amkiWBdLmHpdajzFzAh9vN"
155            },
156            {
157              "coinType": "0x2::sui::SUI",
158              "coinObjectId": "0x011bf3b329893627c875da9136af03dd4c80a0b50df80b620317d72f867a57a5",
159              "version": "204443011",
160              "digest": "HbGQS5rvjrZ7Kb5rGtuqqhyQzDwzQca7ZwTqqXejWgny",
161              "balance": "100000000",
162              "previousTransaction": "C8reWy1j85aBxeKRweoeW1amkiWBdLmHpdajzFzAh9vN"
163            },
164            {
165              "coinType": "0x2::sui::SUI",
166              "coinObjectId": "0x0137cbf95c63ad3f5eebcb3ce00eddb2469c033b84aa652853fa3f8ab1673e91",
167              "version": "204443009",
168              "digest": "BrrqeYcBhYXXQTNVb93fD5XBMT8qkLKzMjcWnhc6HQxF",
169              "balance": "100000000",
170              "previousTransaction": "ErMm3QXPzdk6hnWDnm4ikvzGqEoLptGNRbXxf4hetxfZ"
171            },
172            {
173              "coinType": "0x2::sui::SUI",
174              "coinObjectId": "0x0142b2b7a38fbbe2be62c367d475960ec59d4a1f270d51d575ff477ac833e331",
175              "version": "204443009",
176              "digest": "E2JFhJuutsVYp6AfcWnLT6UBydfHc7fQQA6t3AMJ1YEV",
177              "balance": "100000000",
178              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
179            },
180            {
181              "coinType": "0x2::sui::SUI",
182              "coinObjectId": "0x014a72c032016a3e735b1b3c87ac63b7b56ece83a70074d69ffd334a5b890dbb",
183              "version": "204443009",
184              "digest": "5nLWKmLfbBZZJ54UFV3FUgWycLj5VSvno7oYsM5xcn5r",
185              "balance": "100000000",
186              "previousTransaction": "ErMm3QXPzdk6hnWDnm4ikvzGqEoLptGNRbXxf4hetxfZ"
187            },
188            {
189              "coinType": "0x2::sui::SUI",
190              "coinObjectId": "0x01ee86bd47d7e193b22f63475b62bb7b4c86dcbd245ad835116d450fc5002d0c",
191              "version": "204443009",
192              "digest": "59iohfduZsQMUXiNZgY36y5kyaZqTYoEPpRHvJXqCyMA",
193              "balance": "100000000",
194              "previousTransaction": "ErMm3QXPzdk6hnWDnm4ikvzGqEoLptGNRbXxf4hetxfZ"
195            },
196            {
197              "coinType": "0x2::sui::SUI",
198              "coinObjectId": "0x01fb41a94580b9815ab5b64f909b5c76e57648dffa17a46902e854735c7b2664",
199              "version": "204443009",
200              "digest": "A9f9GxA4ceAhRetrDDg9gQEdt6yBJKr1CAikYHChcbUv",
201              "balance": "100000000",
202              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
203            },
204            {
205              "coinType": "0x2::sui::SUI",
206              "coinObjectId": "0x020c674a7dfe642fab957ae1781a72e220b7e4e161dac134be3ee21c67397659",
207              "version": "204443010",
208              "digest": "3jFHQm2pUcZvFdRmBrQiqfPQtUi2oyAbRUHNHXRTiWRp",
209              "balance": "100000000",
210              "previousTransaction": "67YwHzL7hY1E6CC3WQ7a9M3neAGQpPK56MnLGYHC63Lc"
211            },
212            {
213              "coinType": "0x2::sui::SUI",
214              "coinObjectId": "0x0302b7bfeb5523014f9293d86ad63da8a4e85d7397b58c9488c7279b571608e8",
215              "version": "204443009",
216              "digest": "C1V1zxgv42UdkUEMxQy3aSeE7CqWpw1RHZaswW377Bco",
217              "balance": "100000000",
218              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
219            },
220            {
221              "coinType": "0x2::sui::SUI",
222              "coinObjectId": "0x035d124b3577893985e3def4f7822178ffce315b010250148cb4d9fe4eb26fbd",
223              "version": "204443012",
224              "digest": "C7L7hhpNavzyrEHSFa3vMd84dPomMmA27nT5mQoj7wC7",
225              "balance": "100000000",
226              "previousTransaction": "37skCQJmUCn5sPJJShi8sk1EhvKMuxjAuN7pT9nEydvi"
227            },
228            {
229              "coinType": "0x2::sui::SUI",
230              "coinObjectId": "0x037c3b0c4604963cf7e5b96b9e692045961d1871c8ebbc0eb5e06cb3c5641239",
231              "version": "204443011",
232              "digest": "6a36ybzpPogNRfcdJ8CSeEwUFBjEpZPBEmZUwXgHxgdQ",
233              "balance": "100000000",
234              "previousTransaction": "C8reWy1j85aBxeKRweoeW1amkiWBdLmHpdajzFzAh9vN"
235            },
236            {
237              "coinType": "0x2::sui::SUI",
238              "coinObjectId": "0x039783a068009f91dcd4ef048626834b9a0fbb9d75ec6c3aefde2e4a68940340",
239              "version": "204443012",
240              "digest": "31b4YUjmo25h4SHP4hc5JhMRZ2Lpak1AjfNmLQJFxDhc",
241              "balance": "100000000",
242              "previousTransaction": "37skCQJmUCn5sPJJShi8sk1EhvKMuxjAuN7pT9nEydvi"
243            },
244            {
245              "coinType": "0x2::sui::SUI",
246              "coinObjectId": "0x03bb15c8b1efb827c0f05a8ca90c4629bcf7eac577f021d3be26356543664e7d",
247              "version": "204443010",
248              "digest": "HVWRpHFmmqaPXvPcZ4bcEyCV6hJ5pCgqnZX3ZANfsiPP",
249              "balance": "100000000",
250              "previousTransaction": "67YwHzL7hY1E6CC3WQ7a9M3neAGQpPK56MnLGYHC63Lc"
251            },
252            {
253              "coinType": "0x2::sui::SUI",
254              "coinObjectId": "0x03c9ab723d12ed8096e5e9bbfa171ae79de975bc1519d054b52e50f93566519c",
255              "version": "204443011",
256              "digest": "7A17g6F3XSdBPuZ6UPJmepQdJBovmmcS4PETH8pusHDt",
257              "balance": "100000000",
258              "previousTransaction": "C8reWy1j85aBxeKRweoeW1amkiWBdLmHpdajzFzAh9vN"
259            },
260            {
261              "coinType": "0x2::sui::SUI",
262              "coinObjectId": "0x03ce6f9849e55f20699b32df05d2b31bb69affe67c74a1e655d287430d08b86a",
263              "version": "204443011",
264              "digest": "FWaFBi4tEMEV2ca54KYpBCGd7xoYqNcyzWmjZbrcD5mW",
265              "balance": "100000000",
266              "previousTransaction": "C8reWy1j85aBxeKRweoeW1amkiWBdLmHpdajzFzAh9vN"
267            },
268            {
269              "coinType": "0x2::sui::SUI",
270              "coinObjectId": "0x040363647d1f837eedd65712144ec12b0d08d3f9843fe88260c738dea483c191",
271              "version": "204443009",
272              "digest": "AyQAViL6gkkg2bUojgP2tNcSxtUe1HhSvvAyqvmYdgvk",
273              "balance": "100000000",
274              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
275            },
276            {
277              "coinType": "0x2::sui::SUI",
278              "coinObjectId": "0x04078b551cc46943c62e138ee84a5b74c4572afc2a7ceadce2db87362d7d3fbd",
279              "version": "204443010",
280              "digest": "HtahaMU1PShZU52dnnte9wz6wjym2JrUdQe94H363g3V",
281              "balance": "100000000",
282              "previousTransaction": "67YwHzL7hY1E6CC3WQ7a9M3neAGQpPK56MnLGYHC63Lc"
283            },
284            {
285              "coinType": "0x2::sui::SUI",
286              "coinObjectId": "0x04223a97a52778a930caeac1095064c9992145bf6c736acd67c215c3b749dc85",
287              "version": "204443009",
288              "digest": "9Wis1StoPER6VQKF4niT2Et5AWFKrQCC1xF4vBuwTZiY",
289              "balance": "100000000",
290              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
291            },
292            {
293              "coinType": "0x2::sui::SUI",
294              "coinObjectId": "0x043527fbcd0a98dfcd24a553c16c2e424a6c0eb511cd28c7a0fd0dcc0cae7db5",
295              "version": "204443009",
296              "digest": "7WMkbHnFRqyu6bh7j9aC87sZT7dv3v5fN7rt9tSx3RFD",
297              "balance": "100000000",
298              "previousTransaction": "ErMm3QXPzdk6hnWDnm4ikvzGqEoLptGNRbXxf4hetxfZ"
299            },
300            {
301              "coinType": "0x2::sui::SUI",
302              "coinObjectId": "0x043d85bc1fd4e22da944c2aadb079c42baa8f412cb2ada9495768b2760000dbf",
303              "version": "204443011",
304              "digest": "6TfSFvfyAbrP86xB18YY3DSoy2KqHxj2gg8Dg4XWrqfK",
305              "balance": "100000000",
306              "previousTransaction": "C8reWy1j85aBxeKRweoeW1amkiWBdLmHpdajzFzAh9vN"
307            },
308            {
309              "coinType": "0x2::sui::SUI",
310              "coinObjectId": "0x046a3e3af89ac4787770aa5528b1e920812a1ec012aefba05799f1f45cede1d7",
311              "version": "204443009",
312              "digest": "8DSbVPCKABx7P5cY8LxNWiXyZhcKju5vUbTRRgqh49NL",
313              "balance": "100000000",
314              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
315            },
316            {
317              "coinType": "0x2::sui::SUI",
318              "coinObjectId": "0x04f907b30aa0fe2168d887c7e8971944a48bee5fb810d6a07ff4c944665d964c",
319              "version": "204443012",
320              "digest": "Ge4ZBwXFyfMXj1Fe9GurS5RTHwY29a3jo6Fu7AB3QEtX",
321              "balance": "100000000",
322              "previousTransaction": "37skCQJmUCn5sPJJShi8sk1EhvKMuxjAuN7pT9nEydvi"
323            },
324            {
325              "coinType": "0x2::sui::SUI",
326              "coinObjectId": "0x05001d2eb977205bdb6e928a374adaa67049b0f2e42b1c8ca51649fba7ec8c2a",
327              "version": "204443009",
328              "digest": "8ScwnnePv1A6Gjw2CKs6VDuvDSEtyfWcJyDLCk8a2SiY",
329              "balance": "100000000",
330              "previousTransaction": "ErMm3QXPzdk6hnWDnm4ikvzGqEoLptGNRbXxf4hetxfZ"
331            },
332            {
333              "coinType": "0x2::sui::SUI",
334              "coinObjectId": "0x050ac19b018586da46bbb980d2a60d5cc1e34059a9da7b1a8365bb4129d98b8f",
335              "version": "204443009",
336              "digest": "GUnP1FZ89C8gMCz864SyqeUnFEAAAUXfcWTZUw8bBrrG",
337              "balance": "100000000",
338              "previousTransaction": "ErMm3QXPzdk6hnWDnm4ikvzGqEoLptGNRbXxf4hetxfZ"
339            },
340            {
341              "coinType": "0x2::sui::SUI",
342              "coinObjectId": "0x051fe3a93a08feaa0321702eda9c17484cc33f139be93b19fba6ec0e386b2e7b",
343              "version": "204443009",
344              "digest": "43mCkekG6meCs1srwrCnQkSm5zyH9MaUUyHPMD4u2GN4",
345              "balance": "100000000",
346              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
347            },
348            {
349              "coinType": "0x2::sui::SUI",
350              "coinObjectId": "0x052078a0212f3589d0b7a605377edbdd35c8728c7ec1dfe5ac68020bbd213e74",
351              "version": "204443011",
352              "digest": "9Av7girBZB9nRMidT485NtbihgALzjnQ2KVk9XGKG3PJ",
353              "balance": "100000000",
354              "previousTransaction": "C8reWy1j85aBxeKRweoeW1amkiWBdLmHpdajzFzAh9vN"
355            },
356            {
357              "coinType": "0x2::sui::SUI",
358              "coinObjectId": "0x05314165d8133f713f95164af7566e4d21a25bca64d0dea55355f66ed5913ee4",
359              "version": "204443009",
360              "digest": "4hn3chb1uXvYqYDMAtrQLPyPMxE7fQA3ceQTYjiaVF3D",
361              "balance": "100000000",
362              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
363            },
364            {
365              "coinType": "0x2::sui::SUI",
366              "coinObjectId": "0x054c752dcc8ecd01c57c0f6238d923a343be7f4b5caff289b3b18aa828e94c2e",
367              "version": "204443010",
368              "digest": "4ZyXKGvoVrgRt8MXzFoLV2Lo6Cau4f9JVaV2HKvQ5am8",
369              "balance": "100000000",
370              "previousTransaction": "67YwHzL7hY1E6CC3WQ7a9M3neAGQpPK56MnLGYHC63Lc"
371            },
372            {
373              "coinType": "0x2::sui::SUI",
374              "coinObjectId": "0x0571b0dc38a486690c350b00a4fa1d3715de639eaea44da358abb3cbf6bfdff3",
375              "version": "204443010",
376              "digest": "3n1pvJgv71Rm7KndZHEdrF3WhdfTdMkzMEYsqTrvqeuJ",
377              "balance": "100000000",
378              "previousTransaction": "67YwHzL7hY1E6CC3WQ7a9M3neAGQpPK56MnLGYHC63Lc"
379            },
380            {
381              "coinType": "0x2::sui::SUI",
382              "coinObjectId": "0x057b88851b9e39d0f718ddb93213c59195104266d40ee403861097de67cadd12",
383              "version": "204443009",
384              "digest": "8ov5nQehtR7X85hmw7jmyc2qvFB8jM9BgXQGXa1Ht1z5",
385              "balance": "100000000",
386              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
387            },
388            {
389              "coinType": "0x2::sui::SUI",
390              "coinObjectId": "0x05a0295f2e2b20131537040d84a03057b044cb8fc35d9e2707e827daaa103e43",
391              "version": "204443009",
392              "digest": "8h94mavAQ3PD3N2XT2RqzPNdZhid4tYcnbg2RGDMJoFc",
393              "balance": "100000000",
394              "previousTransaction": "ErMm3QXPzdk6hnWDnm4ikvzGqEoLptGNRbXxf4hetxfZ"
395            },
396            {
397              "coinType": "0x2::sui::SUI",
398              "coinObjectId": "0x060106721f9a27d742b4d6dfe8cf240d1088807ac884f81297e80db07933b72e",
399              "version": "204443009",
400              "digest": "95MZwBssgeR4Ap2LsuqxM798XxrTXZNRftL9V45fCfbL",
401              "balance": "100000000",
402              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
403            },
404            {
405              "coinType": "0x2::sui::SUI",
406              "coinObjectId": "0x074964684593b5db26c7bedd364eb04358e031533264e37fa4630ad84b72c4db",
407              "version": "204443009",
408              "digest": "A1dsMg84rTkPuGy35eYvfQPMwHyhWKD5MajhGHyDTeV7",
409              "balance": "100000000",
410              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
411            },
412            {
413              "coinType": "0x2::sui::SUI",
414              "coinObjectId": "0x07912db60cc3872aa8e5d72442fd1a5bf716d56fe49e35656f5f671ddadda32f",
415              "version": "204443010",
416              "digest": "Hb6vHTUm7zWE7BadXDfebGwiA4qZx2XUWct57BTWZWpE",
417              "balance": "100000000",
418              "previousTransaction": "67YwHzL7hY1E6CC3WQ7a9M3neAGQpPK56MnLGYHC63Lc"
419            },
420            {
421              "coinType": "0x2::sui::SUI",
422              "coinObjectId": "0x07f5770a3a77bb38ac14a047eed5eef48b17e6a215f803e3b55a5b85185f8df3",
423              "version": "204443009",
424              "digest": "HVVyCc5cmthowwiy1yqoRLbHb9gaZXzNdTebYXu6DEYa",
425              "balance": "100000000",
426              "previousTransaction": "ErMm3QXPzdk6hnWDnm4ikvzGqEoLptGNRbXxf4hetxfZ"
427            },
428            {
429              "coinType": "0x2::sui::SUI",
430              "coinObjectId": "0x07fa317c23168c9323c6cac95f25ef56a3c99aa05c641934601d24a09553e647",
431              "version": "204443012",
432              "digest": "9oH5MfTXX7ofLpLQFvUbPTgAVt5uk731WiHJMsXPX7fT",
433              "balance": "100000000",
434              "previousTransaction": "37skCQJmUCn5sPJJShi8sk1EhvKMuxjAuN7pT9nEydvi"
435            },
436            {
437              "coinType": "0x2::sui::SUI",
438              "coinObjectId": "0x08331c331296daeedf0db448ab5ea214208c1b5c325fe2a6f3fd3a97515d93a4",
439              "version": "204443009",
440              "digest": "CqbRHiAyxMuzbf8jpGEQa781628mY3KDY4eU1EnHWYha",
441              "balance": "100000000",
442              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
443            },
444            {
445              "coinType": "0x2::sui::SUI",
446              "coinObjectId": "0x0843c7b6884aa474e5293ccc2859fb3d1728692f53ede91755440f3d9fcdef3c",
447              "version": "204443009",
448              "digest": "4eN8p8PQxDjdc9ckqH2stjG8VeyicgQnM857GjgQ93Aj",
449              "balance": "100000000",
450              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
451            },
452            {
453              "coinType": "0x2::sui::SUI",
454              "coinObjectId": "0x084714e3ecf41f41699abe128053f469851a9bd4021a4ca4eb39fa794e42fd97",
455              "version": "204443010",
456              "digest": "372tDbWkUc4jEdnosLNYWUfJda4JvgE2tS9TNfwsm7AR",
457              "balance": "100000000",
458              "previousTransaction": "67YwHzL7hY1E6CC3WQ7a9M3neAGQpPK56MnLGYHC63Lc"
459            },
460            {
461              "coinType": "0x2::sui::SUI",
462              "coinObjectId": "0x0847e6d0f41de20ce3dde0d7ca3bae0e6367a3da6858c60b46b15e651e092883",
463              "version": "204443009",
464              "digest": "3wXmPuCgDXBHJstTEosuEggCkSaHXoy6ZhD9YS1huVbB",
465              "balance": "100000000",
466              "previousTransaction": "5odsa6V4gKA8w1ZQN9RjyBfjX1qPVd1LTu1DnnbpF7At"
467            },
468            {
469              "coinType": "0x2::sui::SUI",
470              "coinObjectId": "0x084c775207a1cd82d2c2f4c9224f03c0c5a75d275c788cf60c1a0d3eb6e6cd33",
471              "version": "204443011",
472              "digest": "3jyRrKtMo2aCaANGwDCDCDNCy5JRHhsV7v4iWJJJcPFp",
473              "balance": "100000000",
474              "previousTransaction": "C8reWy1j85aBxeKRweoeW1amkiWBdLmHpdajzFzAh9vN"
475            },
476            {
477              "coinType": "0x2::sui::SUI",
478              "coinObjectId": "0x08c21fe0fc06e0646a08e0f45249cdd2ffe2db352b6a5593a5246a0a38377485",
479              "version": "204443010",
480              "digest": "ArwKyA8rFg1MTgmTUFDC45KUNunUB8QskPd1k1hJFSX9",
481              "balance": "100000000",
482              "previousTransaction": "67YwHzL7hY1E6CC3WQ7a9M3neAGQpPK56MnLGYHC63Lc"
483            },
484            {
485              "coinType": "0x2::sui::SUI",
486              "coinObjectId": "0x091b13426217f690598ba2f86fa16d71b054bce516f0d8d73369b19dd5fd3114",
487              "version": "204443012",
488              "digest": "5YgtXfLYeqPaSsHsAggdwL9CkENZNCs2am2Wo4sGKf9v",
489              "balance": "100000000",
490              "previousTransaction": "37skCQJmUCn5sPJJShi8sk1EhvKMuxjAuN7pT9nEydvi"
491            }
492          ],
493          "nextCursor": "eyJjb2luX3R5cGUiOiIweDI6OnN1aTo6U1VJIiwiaW52ZXJ0ZWRfYmFsYW5jZSI6MTg0NDY3NDQwNzM2MDk1NTE2MTUsIm9iamVjdF9pZCI6IjB4MDkxYjEzNDI2MjE3ZjY5MDU5OGJhMmY4NmZhMTZkNzFiMDU0YmNlNTE2ZjBkOGQ3MzM2OWIxOWRkNWZkMzExNCJ9",
494          "hasNextPage": true
495        });
496        let _: CoinPage = serde_json::from_value(value).unwrap();
497    }
498}