diff --git a/crates/iota-e2e-tests/tests/protocol_version_tests.rs b/crates/iota-e2e-tests/tests/protocol_version_tests.rs index 4d34b9a39bc..9a9bcb9c3b8 100644 --- a/crates/iota-e2e-tests/tests/protocol_version_tests.rs +++ b/crates/iota-e2e-tests/tests/protocol_version_tests.rs @@ -974,7 +974,7 @@ mod sim_only_tests { // The system state object will be upgraded next time we execute advance_epoch // transaction at epoch boundary. let system_state = test_cluster.wait_for_epoch(Some(2)).await; - if let IotaSystemState::V1(inner) = system_state { + if let IotaSystemState::V2(inner) = system_state { assert_eq!(inner.parameters.min_validator_count, 4); } else { unreachable!("Unexpected iota system state version"); diff --git a/crates/iota-e2e-tests/tests/reconfiguration_tests.rs b/crates/iota-e2e-tests/tests/reconfiguration_tests.rs index b731b4d1169..65d8b7753a8 100644 --- a/crates/iota-e2e-tests/tests/reconfiguration_tests.rs +++ b/crates/iota-e2e-tests/tests/reconfiguration_tests.rs @@ -847,7 +847,7 @@ async fn safe_mode_reconfig_test() { let system_state = test_cluster.wait_for_epoch(Some(1)).await; assert!(!system_state.safe_mode()); assert_eq!(system_state.epoch(), 1); - assert_eq!(system_state.system_state_version(), 1); + assert_eq!(system_state.system_state_version(), 2); let prev_epoch_start_timestamp = system_state.epoch_start_timestamp_ms(); @@ -876,7 +876,7 @@ async fn safe_mode_reconfig_test() { let system_state = test_cluster.wait_for_epoch(Some(3)).await; assert!(!system_state.safe_mode()); assert_eq!(system_state.epoch(), 3); - assert_eq!(system_state.system_state_version(), 1); + assert_eq!(system_state.system_state_version(), 2); } async fn add_validator_candidate( diff --git a/crates/iota-e2e-tests/tests/snapshot_tests.rs b/crates/iota-e2e-tests/tests/snapshot_tests.rs index 9c482884972..7e77a7e4439 100644 --- a/crates/iota-e2e-tests/tests/snapshot_tests.rs +++ b/crates/iota-e2e-tests/tests/snapshot_tests.rs @@ -68,7 +68,7 @@ async fn basic_read_cmd_snapshot_tests() -> Result<(), anyhow::Error> { // 0x3b5121a0603ef7ab4cb57827fceca17db3338ef2cd76126cc1523b681df27cee --bcs", // valid // object BCS "iota client object 0x0000000000000000000000000000000000000000000000000000000000000000", /* non-existent object */ - "iota client tx-block 5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", // valid tx digest + "iota client tx-block ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", // valid tx digest "iota client tx-block 11111111111111111111111111111111", /* non-existent tx * digest */ ]; diff --git a/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap b/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap index 90e0d1468c9..dd5877c35c4 100644 --- a/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap +++ b/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap @@ -1,21 +1,20 @@ --- source: crates/iota-e2e-tests/tests/snapshot_tests.rs expression: "run_one(cmds, context).await?" -snapshot_kind: text --- [ "iota client objects {ME}", [ { "data": { - "objectId": "0x5b0e7d31f9c3a421f94dae3511983a2be67e04a7071171da2380f82be103239f", + "objectId": "0x3c3f0be08714a623caa897116df8a1ad08bf1198d0cb37b79c61a6d8f76d44fb", "version": "1", - "digest": "6s1xQf5HR8HMLNaR1QxPcfV4Ys8AL94UUg7cRpD6r4WD", + "digest": "GJnCyTsnXBsbhwk5HoxmT65dnMpBGLqyGwirnBxFfqmz", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -23,7 +22,7 @@ snapshot_kind: text "fields": { "balance": "30000000000000000", "id": { - "id": "0x5b0e7d31f9c3a421f94dae3511983a2be67e04a7071171da2380f82be103239f" + "id": "0x3c3f0be08714a623caa897116df8a1ad08bf1198d0cb37b79c61a6d8f76d44fb" } } } @@ -31,14 +30,14 @@ snapshot_kind: text }, { "data": { - "objectId": "0x5ee269cea868091ea1c5da5f15581c2f7b1708413b3bdda3e4c9528f2b3a5bb9", + "objectId": "0x6db53eec8c20c7627aebb85667183082b157b891d5a0d44eaefdfff54eefbeaa", "version": "1", - "digest": "7mvhi6RxxMnPohJzMnCYoLHBTLUcRtwFtBXe1ZoanE6D", + "digest": "A4FvZH7nVXVKSm4qvc8NrE8A2kHFUDHqPFNAevHzpRTC", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -46,7 +45,7 @@ snapshot_kind: text "fields": { "balance": "30000000000000000", "id": { - "id": "0x5ee269cea868091ea1c5da5f15581c2f7b1708413b3bdda3e4c9528f2b3a5bb9" + "id": "0x6db53eec8c20c7627aebb85667183082b157b891d5a0d44eaefdfff54eefbeaa" } } } @@ -54,14 +53,14 @@ snapshot_kind: text }, { "data": { - "objectId": "0x759bb64d0a576b00a8aae6d439da4a72ef7d8797282c90211bab2bc723cd48e5", + "objectId": "0x8ee7bb555371a152528adf72b0526f8d31ae5fd30c9c482edaeb9df55d2294a7", "version": "1", - "digest": "7cuKDvum6Rx2utLqquqYZGr6K3S5xbA2fq88cqs8qjZd", + "digest": "EcExPqgRxi8ZWqjSPigCHrNgaZBkLTYyjkMcmyUK7Q8h", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -69,7 +68,7 @@ snapshot_kind: text "fields": { "balance": "30000000000000000", "id": { - "id": "0x759bb64d0a576b00a8aae6d439da4a72ef7d8797282c90211bab2bc723cd48e5" + "id": "0x8ee7bb555371a152528adf72b0526f8d31ae5fd30c9c482edaeb9df55d2294a7" } } } @@ -77,14 +76,14 @@ snapshot_kind: text }, { "data": { - "objectId": "0xa010e1486bfd2f1d7c57a3b2c2edd369e64e8fddc1ca17667314317273cb491d", + "objectId": "0x92e6155f43c9f8ca6eaefd02c386268c9891142b9bfeb70e91dba62a6fde8193", "version": "1", - "digest": "DAFo7bkSkk2XRZv88Nb2V9jatTse1TYTqgMmVxVKGRtF", + "digest": "21zig1jQpeJZPRPPL2oxftfZvCKbicbr75rCCCEEbmpK", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -92,7 +91,7 @@ snapshot_kind: text "fields": { "balance": "30000000000000000", "id": { - "id": "0xa010e1486bfd2f1d7c57a3b2c2edd369e64e8fddc1ca17667314317273cb491d" + "id": "0x92e6155f43c9f8ca6eaefd02c386268c9891142b9bfeb70e91dba62a6fde8193" } } } @@ -100,14 +99,14 @@ snapshot_kind: text }, { "data": { - "objectId": "0xb279227ad10111e5d870facc26d048a05bc440859e718cde0e3bbf257765544c", + "objectId": "0xbe5c82684aada8d68df9a95cbd7ed5b3e0a00e29a62d059483e3e34f7c116aeb", "version": "1", - "digest": "BZaGDacxqx5MFLFm6F3UeBVpHG5hZykqSHFoD1o5F5kq", + "digest": "E6XuAJ91aYiTtibmrhdrK7NXFUeYevh49svaCBrw1kzJ", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -115,7 +114,7 @@ snapshot_kind: text "fields": { "balance": "30000000000000000", "id": { - "id": "0xb279227ad10111e5d870facc26d048a05bc440859e718cde0e3bbf257765544c" + "id": "0xbe5c82684aada8d68df9a95cbd7ed5b3e0a00e29a62d059483e3e34f7c116aeb" } } } @@ -130,14 +129,14 @@ snapshot_kind: text "data": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": "1", - "digest": "73woKiMAUkS1ejdzSwyD1WLDCxsPVYURbwpMBa64Tu4h", + "digest": "AcsitSFsV9JCcodqkR4Md9nuxkfah3E16uFSJLqwSfW8", "type": "0x3::iota_system::IotaSystemState", "owner": { "Shared": { "initial_shared_version": 1 } }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -158,14 +157,14 @@ snapshot_kind: text "data": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": "1", - "digest": "73woKiMAUkS1ejdzSwyD1WLDCxsPVYURbwpMBa64Tu4h", + "digest": "AcsitSFsV9JCcodqkR4Md9nuxkfah3E16uFSJLqwSfW8", "type": "0x3::iota_system::IotaSystemState", "owner": { "Shared": { "initial_shared_version": 1 } }, - "previousTransaction": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "previousTransaction": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "storageRebate": "0", "bcs": { "dataType": "moveObject", @@ -185,9 +184,9 @@ snapshot_kind: text } } ], - "iota client tx-block 5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "iota client tx-block ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", { - "digest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "digest": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "transaction": { "data": { "messageVersion": "v1", @@ -203,64 +202,64 @@ snapshot_kind: text "0x000000000000000000000000000000000000000000000000000000000000000b", "0x0000000000000000000000000000000000000000000000000000000000000403", "0x000000000000000000000000000000000000000000000000000000000000107a", - "0x018673f8b9c2eee4dd923fb6fcb3eb77d0e33d15921ac59f1c57ea7dfe4c3f40", - "0x08e1bd72a9f239c8e99a3ee8f1f4141b48ba063ecc0ebff878152e2b481b94bc", - "0x163b3f079eb959dc96768c65497ef5c3b48106439a306324c484a8d28e0ba50f", - "0x16d23fb8f64faebeea28ecdd43d96cb60ed1c5a297347d61a0c3fa4fff08944e", - "0x1a1f82376293f736136384ae03744241eb257a82f25eb223c7ef02e67442d6df", - "0x1d8f7a031fcca49d212b5bf2b57704913f7c6ca423357a01dda70a150e8a35b0", - "0x1f3119f496e7c38af65bc0f29ee79354de5f554d03d0aa433bee015e280e97b4", - "0x2438ca49fb81fc37f74d890207c3a922b27de14b474525b4fa111de094e5194c", - "0x303fac6452e9b844d960dcd60c84efbbd28b017774787c58705b67af946d7076", - "0x3238c6a409ed6951125aaea3334cf632e053e0d09507e8a53d4b4b5923b896d0", - "0x3873a7b96acdc98bfa6db49a096f8e704caa6dc7cca29aecff52abe11442dc3f", - "0x3e5b52bc91e54ac367f5987785c7b0a68869a4be2eb0a74f7bee2172e0a70dbc", - "0x3fb0323b083da0415032b289cb6e610388de91f9666a67c02df8ddd9edb00f4c", - "0x4451b2f6d468c331dafa10f4b3fbf057b89f684553bf9298d0c4f8e61df2fa95", - "0x4547fa20f95dcc6e221d18eaf933f993ee8f46f98eef1705853a71f9c917c185", - "0x49315560aecdcf0beba3cfccb2d04f29f5d95b440cb0b6dadec64349b81083d6", - "0x497d698dce0d808d05cb3543b2decd461eb67a0a832acf7e3d822ff61663acb4", - "0x4a4a868c023e670163f57e2467cccdaedef147daf5170fc9b0ce7caa48284a76", - "0x4df66b7aab12f518bfba67b0081cadb8a321870b171a98d2aceafb6804e3b003", - "0x50948c5a6a706b267a6b2c2a4a2043d28ba11c5e022198f58be4182d65987a2d", - "0x58efd4d54b74b390e2d3bbe785ec5df555c366b1a6eb616fb07c44d6c3f67c8c", - "0x5b0e7d31f9c3a421f94dae3511983a2be67e04a7071171da2380f82be103239f", - "0x5c995a223cf5e88e2d19935481d2d06b2e55977cb3615ad6784cc360a42d6501", - "0x5ee269cea868091ea1c5da5f15581c2f7b1708413b3bdda3e4c9528f2b3a5bb9", - "0x61f2f500cb861d8d92affc84519c4c0a6b794058b58607768c8e38ab275de0eb", + "0x009b54bbbf6943296863ea53b2d486fe612dc1a5ea743c92ea3730b88e428008", + "0x02d4eba743319566c72fe10311f86b6b7ad6367d29e39d3d35b2a08cf49c718a", + "0x0a35c6c50da4f58cdbe6761fbd37694d640113a794971ac3f64dc46a5d2c5806", + "0x26a4daf0ef9f464dbaafca6df38b5cb49bc3c2b1384f45ef85c5d082145c693c", + "0x2930e3c448175f7475cf1d1382d4cc5be3045b7212d45f1a2676de7a110fb43d", + "0x395a5188ebc00c1dd61f9fe2b8d83fb92d516953cb09bc2d25d0437179df6544", + "0x3c3f0be08714a623caa897116df8a1ad08bf1198d0cb37b79c61a6d8f76d44fb", + "0x3d16eae3eec41f60e3aa1893ad10e404f0248711f5cd46cd2103a12fc3348991", + "0x410a84fda39b1c5c510cedf00c95052a76f49710e6cf8033375b6165e140e783", + "0x44741e7645e8ac6c25356d6633a991eb1c0e6e66c9b2d126394a222f56f9b948", + "0x4dbca9f8e23a01313d8077d83750466d452814c2a889f5c64edc4530278c51f4", + "0x514dc561960a054c1a78a6c81db868478e9ae07e15af57e7531e84518c3de855", + "0x5c349bc42113c2bb209ab01129ca2aa089588f5209afe074ba0ddb15ad86241d", + "0x60707993b78b76514b82bdd65c703b52e268958a509f4f6c8f25a191d9bdbdca", + "0x63652f6ae7c6a598dac6b20a23eda4d12812513ac569df393200600dbe27b3df", + "0x68aa8412706a49ad22bdb1740ab4a2542ca6692491682715cc09d2a2d165347c", "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", - "0x6b517df3c5888ce924d7871e550989f835335c726a43a224ce3df6b6dfa53666", - "0x759bb64d0a576b00a8aae6d439da4a72ef7d8797282c90211bab2bc723cd48e5", - "0x76472cb3b720491fb9a66db21befaed5fbc8528976bc6fb2bc3c5deeef9d114c", - "0x7c9f819b470ae3ac98b6e44eeea9b461d66a38b22a3d2f61ce62c69f68d0c71a", - "0x81c7cfd9c7fa81f57a59f14739ee82157fc6a04d48a1b0a6e1187a8898042299", - "0x85a7aabfb1d8ef14efd87338a58efcdbfaf0cab5e5fc247ccd1080dcdd3d2d7f", - "0x8cd9aca3790437fc6b1b7258c5fefb2e95ffb54134aae1fd04ba757d4286055d", - "0x8fd46357d5ae46f9ee8de7d9b6dfc9da4e497c70dbd2ce5c2fc124658798d5c9", - "0xa010e1486bfd2f1d7c57a3b2c2edd369e64e8fddc1ca17667314317273cb491d", - "0xa6e659b1120b373f598d1f6c3214d73abda596eb913857e1fa471ab4420f2e27", - "0xb271c22281276193f817eeab5291b79f5f37698a21323fbafe014e1774c3d22e", - "0xb279227ad10111e5d870facc26d048a05bc440859e718cde0e3bbf257765544c", - "0xbb43894417b1b4a4cee286133d85cae9706c217d150daf4d12168bc5e9147d78", - "0xc066a3793934a82847a3cee2a0dd84832ba1ba24b71ac0602b1a60cbbe553d17", - "0xc79de55a6454ac8e927645a08e4e9b3ce8e814ce9fc25eb7a347a91fc2228f4f", - "0xc7ee80d93a34f12ff58b0ceaf16c4e06ee6ceeb547b031b0d3eab1a8a6ca873f", - "0xd1e455eb2c367047a03756eb830bf0d2357b0c69905f0d4f3a648cc81498905e", - "0xd26171201bf3e074f1d1c694ea6ebc5d95d75b75583c393055efbca3eeb9c629", - "0xd6090aa14b28b0e907434cd8f8469b24769a80ebd722f18df48fe59e5fd47c0f", - "0xe47935c2607151b36e2e7d6971418157d7a8997ab2771ae779f5b6a2230334c9", - "0xe54599f1bb4b687498caf1e5212c6eaf0b088dcc8159d283ecf2c6287ede48dc", - "0xefd24c24d3784edec255308f6fc3619f65902ebd122f5a34b105727994326ce1", - "0xfbf79fe230691c666820739add167373a61a7faa858231f42feb961ec8fffcf5", - "0xffc04eb3011a2933dd0fbfff34cbd6759dbf999f7e2ac372e08d577c56a459cb" + "0x6be75614ce32eef2b10fc89aefcefa78235e1357fde4d1a5f03f0dedcea2155d", + "0x6db53eec8c20c7627aebb85667183082b157b891d5a0d44eaefdfff54eefbeaa", + "0x70ee97df35fc2c8b910420e7e5a5e3bf1c2343a2053de4cc4116f300e3e6c147", + "0x7444f0409e63051805b20ce782a83cb360bcd51bad24f49adecaa06d69980679", + "0x78bb01884e7b79c33dd9bf2b81dd0941a96642df8a193cbb69725824a24a5659", + "0x83a53517002ebdb0608f2cbaa36831bf3e4893abd80497619e5863045e324c63", + "0x88b64785efff540f7e81bb6f6a7974001a7996668e2233c7c1e499ed06150369", + "0x8de4c8fc8566c3e3820ed547371ca3909dd8f8953b7142618e341feaa13e8cc5", + "0x8e0336f93faca1a97f0b9388a6a209a045d4cca2a9058784e2c5f695c5dc05b5", + "0x8e471b154ec29a8385011d34dbb464e6ed6ea73c4a71310135ba24cfbc277cc9", + "0x8ee7bb555371a152528adf72b0526f8d31ae5fd30c9c482edaeb9df55d2294a7", + "0x92e6155f43c9f8ca6eaefd02c386268c9891142b9bfeb70e91dba62a6fde8193", + "0x98325c5a56855922a0a15f22595cbfc22b5272be0505f4615b98af9ba9d77d67", + "0x99f01282794c8a2056eaae435dccfe5a78bc4cbdbca447a8460e908bda6b60e8", + "0xa12e2f0f034e4717b38c91d0e7df7e5bb600c7da7599e3a6e46faf9218d8c33b", + "0xb0a869ee5d127f9b17ae2ce839e3e26f314da6c8805d14111a3754b910625f72", + "0xb1d7d70ce1377c4c352227877045dce2f1c57689143dbbcaa5e747e2093ba29e", + "0xbd14be5bf17d1001d3ada57fd8e0a9c2a37f15a33445566e9861033e2d39865b", + "0xbe1a2f2e258e4e66e4498a165bd49acfa5008ece793ede8bbde216b0312775ee", + "0xbe5c82684aada8d68df9a95cbd7ed5b3e0a00e29a62d059483e3e34f7c116aeb", + "0xbe5f46a906fa8e82533f5ae9d96b49c6c85b85d13bd8e86619018ec3a4b44b6a", + "0xc0f7cf8ae9d06120456e93c4aff25ff3e4ea6f537b0bbcc073afb09b5af6cbd0", + "0xc4a19dc4aeffa3a2f8c30355632601cc408baf876f04e1a03762270c0fabed28", + "0xcb02d0d88409950bbe1b44f0db14f160a722229b37188da349042e85302d1f1b", + "0xcbd0081672ac10224257e5c9a135220b0de72deae01a3a5e853a720757e6b1e4", + "0xcf7d3300b1f97f315c28aa58ecb6eba87b5d91a06fbc4d3c7403838a10a37970", + "0xded54d36c461af7eb2ed9377f0994ce3725b403b673240588a8d7e3bebab4d0e", + "0xe204e0f49beea2e42187f31fdeef1277eba0699f1d044b28c956be49efb4fdea", + "0xe64176a259a2555a36fea2d9976653fd9f24c337eeb0c1ac0ee7cd0051d8f3c3", + "0xec83be01a3e83d0fe39bba8f6d24a69df49345640ab1e4870bc92448982e7e02", + "0xf30fbbf1a433e42ccc60ad49b15f8f16e8f4070f08f902dbe8e0bdfec38b8aab", + "0xf45504098525c749d7b05375b77a72334894d955ec1743f1ba1e6de91c758acc", + "0xf79453a7867218e7e874219f42b27a9c759caec9c4560ed3042b6136942b7439" ], "events": [ { - "txDigest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "txDigest": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "eventSeq": "0" }, { - "txDigest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "txDigest": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "eventSeq": "1" } ] @@ -296,14 +295,14 @@ snapshot_kind: text "storageRebate": "0", "nonRefundableStorageFee": "0" }, - "transactionDigest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "transactionDigest": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "created": [ { "owner": "Immutable", "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000001", "version": 1, - "digest": "4JE3kcoZSKseaSsSdgQveyB6GHU2GF3oBpg5pJ39ZSFG" + "digest": "7ffxuki3ecvz6iPs6ZSeXTiAJ8VupCSJFPkNizJNw6qW" } }, { @@ -311,7 +310,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000002", "version": 1, - "digest": "8zNipc5CUAJYs6ak77VrFXPxQyY5vwtkUmyZz8w2j5Fq" + "digest": "56nza4jjMjfVYpNr2XWRcu6PFcszn1ajqknEEUDfgDbU" } }, { @@ -319,7 +318,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000003", "version": 1, - "digest": "GCLhS6D6SeU7JstsXGPEF2PTY9rGQXNLo3A6j162jdFi" + "digest": "9gRKKT1P3pomUzU9HkgSAqApx42bL5zATQLy3b4jdRJV" } }, { @@ -331,7 +330,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": 1, - "digest": "73woKiMAUkS1ejdzSwyD1WLDCxsPVYURbwpMBa64Tu4h" + "digest": "AcsitSFsV9JCcodqkR4Md9nuxkfah3E16uFSJLqwSfW8" } }, { @@ -343,7 +342,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000006", "version": 1, - "digest": "2iNGKB1PQafgW1o6Y3ZSkUwhxJrNbbEK4PfrqW4zxokW" + "digest": "G4FJbPmssUjumCGevpg7zC89B6aY7C4bv62VfmStxvrS" } }, { @@ -355,7 +354,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000008", "version": 1, - "digest": "4ZVAMTUCrpGjd97gLUnqTSvk2gqJvr7FnGopRvQkVnzn" + "digest": "2puYWLi4oACfvF6YbePDMj59twCAArMRWYgfmAQZ9AQQ" } }, { @@ -363,7 +362,7 @@ snapshot_kind: text "reference": { "objectId": "0x000000000000000000000000000000000000000000000000000000000000000b", "version": 1, - "digest": "81neBedYgjyePBFEUdm3PPC3K6BLGjwuyyFXxaDFKbAT" + "digest": "8NXiGhAshDoXFUTZF7jvh8RyTYG6XLNnPTv9ndQkAymq" } }, { @@ -375,7 +374,7 @@ snapshot_kind: text "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000403", "version": 1, - "digest": "E7zwAronHAhg8gRcCNJrzffEcMCqyGwTRvXzk6tZYTzG" + "digest": "7KD7JJUTK19LymvEcM3963Zvg21X6HahpfPNNri8tedo" } }, { @@ -383,175 +382,175 @@ snapshot_kind: text "reference": { "objectId": "0x000000000000000000000000000000000000000000000000000000000000107a", "version": 1, - "digest": "BvAgaA1pE6cMYg7tNZv7sdafwnYCgxk9DPseprtGCXw5" + "digest": "GzKKaavJG11SYQg7UdBonH2VRpiqJ3N6E77HMaEVT61b" } }, { "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "ObjectOwner": "0xb0e1ee6d4bc415ffe76412a4a259b36821ea90db3e223a2c81e6e88bf4f2946b" }, "reference": { - "objectId": "0x018673f8b9c2eee4dd923fb6fcb3eb77d0e33d15921ac59f1c57ea7dfe4c3f40", + "objectId": "0x009b54bbbf6943296863ea53b2d486fe612dc1a5ea743c92ea3730b88e428008", "version": 1, - "digest": "AkRRb1Y6sXYHYunTUhbhqZoeTF2KdJ9E2YJh8zncRof3" + "digest": "74XsheU7SrxUvPCfJwVxf2PqZQSSLpnHRwQJE1fjENoE" } }, { - "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" - }, + "owner": "Immutable", "reference": { - "objectId": "0x08e1bd72a9f239c8e99a3ee8f1f4141b48ba063ecc0ebff878152e2b481b94bc", + "objectId": "0x02d4eba743319566c72fe10311f86b6b7ad6367d29e39d3d35b2a08cf49c718a", "version": 1, - "digest": "FszgvFokRH5rBBNoLrTxKWBGnCAdiRqXpWYixmwBvwpf" + "digest": "92q7iTZEbGFNTkjtNi2NA4ppdyQkSxowCVmmwhrFeGY6" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "ObjectOwner": "0x087de53ab99dd733000e0ef64e158cc118d4a3645b584dff3f1cb03059a7699c" }, "reference": { - "objectId": "0x163b3f079eb959dc96768c65497ef5c3b48106439a306324c484a8d28e0ba50f", + "objectId": "0x0a35c6c50da4f58cdbe6761fbd37694d640113a794971ac3f64dc46a5d2c5806", "version": 1, - "digest": "2ueUhUo7CYjPNknnKCgASKC7u1ifGVYa9N2GpqNEFzoE" + "digest": "6DzNYaPL853kEUjU9vcWEi5oc5UPWgVqim1m7PDAfmKu" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0x480cc02603df09501722ee2bb9acd35315dddad55d7492bb7b24d2c07ebaa082" }, "reference": { - "objectId": "0x16d23fb8f64faebeea28ecdd43d96cb60ed1c5a297347d61a0c3fa4fff08944e", + "objectId": "0x26a4daf0ef9f464dbaafca6df38b5cb49bc3c2b1384f45ef85c5d082145c693c", "version": 1, - "digest": "ApwvoSkL1WC5UcJWSbzGuNJHn9F5ZPuALucnMNP63sCF" + "digest": "6AfW1uBGVSga4vztHKw6pJp45G3B6ccFSakYvtsTpAhY" } }, { - "owner": "Immutable", + "owner": { + "ObjectOwner": "0x480cc02603df09501722ee2bb9acd35315dddad55d7492bb7b24d2c07ebaa082" + }, "reference": { - "objectId": "0x1a1f82376293f736136384ae03744241eb257a82f25eb223c7ef02e67442d6df", + "objectId": "0x2930e3c448175f7475cf1d1382d4cc5be3045b7212d45f1a2676de7a110fb43d", "version": 1, - "digest": "CJY1zNjevKH6Kya6aWr3Ri1HQsgeZFCf9qR4HqH72Fnt" + "digest": "6TTq7VQt73GXiSo3DdgwzGQvLn1mW4d7ePSdhV93cKm2" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, "reference": { - "objectId": "0x1d8f7a031fcca49d212b5bf2b57704913f7c6ca423357a01dda70a150e8a35b0", + "objectId": "0x395a5188ebc00c1dd61f9fe2b8d83fb92d516953cb09bc2d25d0437179df6544", "version": 1, - "digest": "7yn1SCAHPQVAmJANbtPKjkZyzpN675SHdNBNwdFfXGbZ" + "digest": "Hr6Gjm7XQJHEPMHkXjiP4qG4A69pj5sPotJLu6C8n6T" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x1f3119f496e7c38af65bc0f29ee79354de5f554d03d0aa433bee015e280e97b4", + "objectId": "0x3c3f0be08714a623caa897116df8a1ad08bf1198d0cb37b79c61a6d8f76d44fb", "version": 1, - "digest": "59iXLqERWshXAXJqsVuwRRmoxW4AXLv5jnH3cPxRwAXw" + "digest": "GJnCyTsnXBsbhwk5HoxmT65dnMpBGLqyGwirnBxFfqmz" } }, { "owner": { - "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "reference": { - "objectId": "0x2438ca49fb81fc37f74d890207c3a922b27de14b474525b4fa111de094e5194c", + "objectId": "0x3d16eae3eec41f60e3aa1893ad10e404f0248711f5cd46cd2103a12fc3348991", "version": 1, - "digest": "A5e18Gy41Bxq2McoH7FbiYJFfU1yx26XRgvDk31KbRTz" + "digest": "Hh8Wm5GtLdDJExuxMzfBqWuN8gqveWYqYLtgxj28Xzw2" } }, { "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, "reference": { - "objectId": "0x303fac6452e9b844d960dcd60c84efbbd28b017774787c58705b67af946d7076", + "objectId": "0x410a84fda39b1c5c510cedf00c95052a76f49710e6cf8033375b6165e140e783", "version": 1, - "digest": "D582bFMq1ftKpRhrcFeRLhEJUbfrRZZLA6Ymgs87S6cC" + "digest": "Cjt4h2qYLCAmPSzvtEqT8NpyyfnjZAsKEZyRLADvm5YK" } }, { "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0x3238c6a409ed6951125aaea3334cf632e053e0d09507e8a53d4b4b5923b896d0", + "objectId": "0x44741e7645e8ac6c25356d6633a991eb1c0e6e66c9b2d126394a222f56f9b948", "version": 1, - "digest": "GZiR6Qj8jF3vb8Eq3AF3zrCrqGcHpKPFv3MYRCn4RLsT" + "digest": "4pCSEeAeCshaTZQHLoDQo8aBGXN1fqzMh9PbBt1ESa9B" } }, { "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0x3873a7b96acdc98bfa6db49a096f8e704caa6dc7cca29aecff52abe11442dc3f", + "objectId": "0x4dbca9f8e23a01313d8077d83750466d452814c2a889f5c64edc4530278c51f4", "version": 1, - "digest": "DmLPuMUMQHtu4hRNpXbcjqtRKWrJqPLUDnZw84GmgaUZ" + "digest": "8prBerHbn7zbWUeHShLMvQuXye9AHTT5Te2o7ciCQu2c" } }, { "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0x3e5b52bc91e54ac367f5987785c7b0a68869a4be2eb0a74f7bee2172e0a70dbc", + "objectId": "0x514dc561960a054c1a78a6c81db868478e9ae07e15af57e7531e84518c3de855", "version": 1, - "digest": "ARd1kECfyCcc3TUTnFZrdYRAGX6xn9G3ZKNtQKNDEA8R" + "digest": "9JeM91PfQcBwThEVnxE4K3bM8TPdrQaJm18FXL78XTpp" } }, { "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0x3fb0323b083da0415032b289cb6e610388de91f9666a67c02df8ddd9edb00f4c", + "objectId": "0x5c349bc42113c2bb209ab01129ca2aa089588f5209afe074ba0ddb15ad86241d", "version": 1, - "digest": "EidyXR5ajBRafVgkEA1cm598AdyK66F2NBub16VyE9aB" + "digest": "ag1NBRsb4HA7b33GvZL7s1nKiMRccnQg7MCyV4tEmED" } }, { "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0x4451b2f6d468c331dafa10f4b3fbf057b89f684553bf9298d0c4f8e61df2fa95", + "objectId": "0x60707993b78b76514b82bdd65c703b52e268958a509f4f6c8f25a191d9bdbdca", "version": 1, - "digest": "33vUxz6x2MsvDWTQWpFpjWQbPbbZhUxPyn3uwSDfAVQx" + "digest": "u412hXUPgBXN2Qap6XJoPuN4EHbDXasyLWNiXHrRbC8" } }, { "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0x4547fa20f95dcc6e221d18eaf933f993ee8f46f98eef1705853a71f9c917c185", + "objectId": "0x63652f6ae7c6a598dac6b20a23eda4d12812513ac569df393200600dbe27b3df", "version": 1, - "digest": "J3kRd8hXaaV2mFKES9k7X2NnjxDCGcFAUoXCqsY2reZJ" + "digest": "5rjXsGwM7wWYDumyhxn1NF7Rbu2Cj9oYz8mu12H3bQZ5" } }, { "owner": { - "ObjectOwner": "0xbc4cf4a6e17ba874f668896d13e8dda92bab7a8870b3118d26fd67501028c2f3" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, "reference": { - "objectId": "0x49315560aecdcf0beba3cfccb2d04f29f5d95b440cb0b6dadec64349b81083d6", + "objectId": "0x68aa8412706a49ad22bdb1740ab4a2542ca6692491682715cc09d2a2d165347c", "version": 1, - "digest": "BRyi5NozgWp2Aji5hM8p83M8VgyR3PYg7G27MiYR2B9z" + "digest": "5eVK1tCEY184EUoCVxZWiwVE6rVTLQhAZNDxyLjPPekL" } }, { "owner": { - "ObjectOwner": "0x672bba3ef273000a1627a5f128022e261e36a85db6c508b917aa3139a2e9720d" + "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" }, "reference": { - "objectId": "0x497d698dce0d808d05cb3543b2decd461eb67a0a832acf7e3d822ff61663acb4", + "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", "version": 1, - "digest": "242fQBuczzCLdXuMZ7FZwR9m86DacJxUTC5xuUW62DSG" + "digest": "EHfQFb84KU46SCdxDNwEYSyVEVPce4ap4ndNghxhGAuK" } }, { @@ -559,99 +558,97 @@ snapshot_kind: text "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, "reference": { - "objectId": "0x4a4a868c023e670163f57e2467cccdaedef147daf5170fc9b0ce7caa48284a76", + "objectId": "0x6be75614ce32eef2b10fc89aefcefa78235e1357fde4d1a5f03f0dedcea2155d", "version": 1, - "digest": "AWztWHzVjwd5rYXr7ork1gYC54JqtGpwHNdFA9i6gA16" + "digest": "4ne2hK9k5X52h3uoUb3z57yNKemx6epwCdcrN66SUdtL" } }, { "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x4df66b7aab12f518bfba67b0081cadb8a321870b171a98d2aceafb6804e3b003", + "objectId": "0x6db53eec8c20c7627aebb85667183082b157b891d5a0d44eaefdfff54eefbeaa", "version": 1, - "digest": "EPxkpuZZYcjDJq9AzNLMPM8vsY1URjow7nmDuxQQ1QCb" + "digest": "A4FvZH7nVXVKSm4qvc8NrE8A2kHFUDHqPFNAevHzpRTC" } }, { "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "ObjectOwner": "0x16aaaa67fab71c005b40b0b7aae0ee18f74f13da37c8af9433307fea13a0414a" }, "reference": { - "objectId": "0x50948c5a6a706b267a6b2c2a4a2043d28ba11c5e022198f58be4182d65987a2d", + "objectId": "0x70ee97df35fc2c8b910420e7e5a5e3bf1c2343a2053de4cc4116f300e3e6c147", "version": 1, - "digest": "9SGZtrm6U2rsCqiaFoVQEUSreYstnrCRg6f2EzwKGHq" + "digest": "292jf11i9u2tezY8K8ZZXDrxGptoyxHtWrkqZ5kwMpyy" } }, { "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" }, "reference": { - "objectId": "0x58efd4d54b74b390e2d3bbe785ec5df555c366b1a6eb616fb07c44d6c3f67c8c", + "objectId": "0x7444f0409e63051805b20ce782a83cb360bcd51bad24f49adecaa06d69980679", "version": 1, - "digest": "FbrF4mnrw5oXKX1trYT2NoENq7CaSGVZfXj5XitjSqhH" + "digest": "6xYBTF7RN6wTC73niFMAJp9vGvZ3CRJGpj6bMjuaWJQT" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0x5b0e7d31f9c3a421f94dae3511983a2be67e04a7071171da2380f82be103239f", + "objectId": "0x78bb01884e7b79c33dd9bf2b81dd0941a96642df8a193cbb69725824a24a5659", "version": 1, - "digest": "6s1xQf5HR8HMLNaR1QxPcfV4Ys8AL94UUg7cRpD6r4WD" + "digest": "kRLTPAysmEBVJ11Xipe6KTSzBVW72fKgmm6tGkwSGdQ" } }, { "owner": { - "ObjectOwner": "0x1dd0079cb68a9c0dc5cbbb0c9c5d831bb56ed88c4a12c647f1352832092d11dc" + "ObjectOwner": "0x66d5aecec555f796c53f4fe7ce5f2fd8a9551b9fc9d656b9879c00ece6b9bae2" }, "reference": { - "objectId": "0x5c995a223cf5e88e2d19935481d2d06b2e55977cb3615ad6784cc360a42d6501", + "objectId": "0x83a53517002ebdb0608f2cbaa36831bf3e4893abd80497619e5863045e324c63", "version": 1, - "digest": "2ih9uvSzKBSv9YhrNZdMokhPcZgZ8gTt48TyUToB6JgX" + "digest": "4yR1DxgRtypf5kB4vRWrXoKZY5VEWnMniE6XMdq8uLdw" } }, { - "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" - }, + "owner": "Immutable", "reference": { - "objectId": "0x5ee269cea868091ea1c5da5f15581c2f7b1708413b3bdda3e4c9528f2b3a5bb9", + "objectId": "0x88b64785efff540f7e81bb6f6a7974001a7996668e2233c7c1e499ed06150369", "version": 1, - "digest": "7mvhi6RxxMnPohJzMnCYoLHBTLUcRtwFtBXe1ZoanE6D" + "digest": "3dnFuKAuFYU3NR5ZwB5yfgKT31fjnA2FNKdD8PSSRoxa" } }, { "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0x61f2f500cb861d8d92affc84519c4c0a6b794058b58607768c8e38ab275de0eb", + "objectId": "0x8de4c8fc8566c3e3820ed547371ca3909dd8f8953b7142618e341feaa13e8cc5", "version": 1, - "digest": "AvgJes9PZYnWwM9KZmEiBZamurEgezPZUBB2gVJzvEgb" + "digest": "HhVmRsC4vVAL7EEAA17iw4QQkNXPTyWt85WLFPRYy2db" } }, { "owner": { - "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", + "objectId": "0x8e0336f93faca1a97f0b9388a6a209a045d4cca2a9058784e2c5f695c5dc05b5", "version": 1, - "digest": "36ayTWhEK1Ez85fRT6j93sMbQtxo3V55FDsJSnWXTFe5" + "digest": "4kHTKzkjZCeDnHcwwLoKdoeKsCdW7FKmPuWZhczkK8Ah" } }, { "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "reference": { - "objectId": "0x6b517df3c5888ce924d7871e550989f835335c726a43a224ce3df6b6dfa53666", + "objectId": "0x8e471b154ec29a8385011d34dbb464e6ed6ea73c4a71310135ba24cfbc277cc9", "version": 1, - "digest": "ARFnQexwF3Q6CDzCgnQfH1v8gY9YAfpXLq4K89FU9koJ" + "digest": "EyAzc4a4Xhs7ycooubM5TK3pmdCjX2SFUyEfRY3h97QR" } }, { @@ -659,139 +656,139 @@ snapshot_kind: text "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x759bb64d0a576b00a8aae6d439da4a72ef7d8797282c90211bab2bc723cd48e5", + "objectId": "0x8ee7bb555371a152528adf72b0526f8d31ae5fd30c9c482edaeb9df55d2294a7", "version": 1, - "digest": "7cuKDvum6Rx2utLqquqYZGr6K3S5xbA2fq88cqs8qjZd" + "digest": "EcExPqgRxi8ZWqjSPigCHrNgaZBkLTYyjkMcmyUK7Q8h" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x76472cb3b720491fb9a66db21befaed5fbc8528976bc6fb2bc3c5deeef9d114c", + "objectId": "0x92e6155f43c9f8ca6eaefd02c386268c9891142b9bfeb70e91dba62a6fde8193", "version": 1, - "digest": "zQeqLseHTy2tGhRk4gwvQGoCtUkRd4LqGjKuuvW2Xh1" + "digest": "21zig1jQpeJZPRPPL2oxftfZvCKbicbr75rCCCEEbmpK" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "reference": { - "objectId": "0x7c9f819b470ae3ac98b6e44eeea9b461d66a38b22a3d2f61ce62c69f68d0c71a", + "objectId": "0x98325c5a56855922a0a15f22595cbfc22b5272be0505f4615b98af9ba9d77d67", "version": 1, - "digest": "EsxwZdo265ZPbYh99YeTGunSWrMj8dXyNBw2H1E9D9eL" + "digest": "GUPe9nCTcx5Y38Gup2xU2Y1pbtf4RWwdLDwZ2XxzW6hA" } }, { "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0x81c7cfd9c7fa81f57a59f14739ee82157fc6a04d48a1b0a6e1187a8898042299", + "objectId": "0x99f01282794c8a2056eaae435dccfe5a78bc4cbdbca447a8460e908bda6b60e8", "version": 1, - "digest": "8ESph921vnJz6UaENHxg2ytx68MtT4UoxNpPgWTT99a5" + "digest": "7MayLUpkPJYGDXBEXzaq2iiKKJ9tmSU3K1MLdg5QhYaJ" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0xc2797a0797434bd2d32a40ac9fa463f92765ca5775a6f819cdc7b00222fc2039" }, "reference": { - "objectId": "0x85a7aabfb1d8ef14efd87338a58efcdbfaf0cab5e5fc247ccd1080dcdd3d2d7f", + "objectId": "0xa12e2f0f034e4717b38c91d0e7df7e5bb600c7da7599e3a6e46faf9218d8c33b", "version": 1, - "digest": "277zG7Ypo7ruZu1WMxXDUoApdKnUYLBvrws1KkqzHuFm" + "digest": "6q1dxsFS5Ccbzydy58NNywuhFjZZbGNmNNAYRSunAnfu" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "reference": { - "objectId": "0x8cd9aca3790437fc6b1b7258c5fefb2e95ffb54134aae1fd04ba757d4286055d", + "objectId": "0xb0a869ee5d127f9b17ae2ce839e3e26f314da6c8805d14111a3754b910625f72", "version": 1, - "digest": "AEXYy8VGP4NX8xpTs7LHiuZYfzTwFiRypmiQrZy9waNY" + "digest": "8PFjrLYmyevb3GWbJ4mhpDCMeSCRJRywsvoQ5srXU51Y" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0x8fd46357d5ae46f9ee8de7d9b6dfc9da4e497c70dbd2ce5c2fc124658798d5c9", + "objectId": "0xb1d7d70ce1377c4c352227877045dce2f1c57689143dbbcaa5e747e2093ba29e", "version": 1, - "digest": "3xUtUi7VT3NzhFGUGsAJbSaimrdSTb2ujoesjNukQjS8" + "digest": "B22UhJye9j1cab6hGmhhx2LCvVZuM4dACR39nfZPFnxc" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "reference": { - "objectId": "0xa010e1486bfd2f1d7c57a3b2c2edd369e64e8fddc1ca17667314317273cb491d", + "objectId": "0xbd14be5bf17d1001d3ada57fd8e0a9c2a37f15a33445566e9861033e2d39865b", "version": 1, - "digest": "DAFo7bkSkk2XRZv88Nb2V9jatTse1TYTqgMmVxVKGRtF" + "digest": "2AUoN26MSwRU44u5VBcbFiFiDst9EdqHVQZhkB2tLj4Z" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "reference": { - "objectId": "0xa6e659b1120b373f598d1f6c3214d73abda596eb913857e1fa471ab4420f2e27", + "objectId": "0xbe1a2f2e258e4e66e4498a165bd49acfa5008ece793ede8bbde216b0312775ee", "version": 1, - "digest": "E3tr1QPatiEWCjxUNrbKfyRgkNq8tBeiTKFKGyA7g9vk" + "digest": "GP6zWTkW9Vuk5gpHPd5HizWHhNDMuyKVLkYrMrsSSizx" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0xb271c22281276193f817eeab5291b79f5f37698a21323fbafe014e1774c3d22e", + "objectId": "0xbe5c82684aada8d68df9a95cbd7ed5b3e0a00e29a62d059483e3e34f7c116aeb", "version": 1, - "digest": "GjnVg1dHinKTEkLLZYLedhgmLkmNddYhYM9pUZrUDrzc" + "digest": "E6XuAJ91aYiTtibmrhdrK7NXFUeYevh49svaCBrw1kzJ" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "ObjectOwner": "0x480cc02603df09501722ee2bb9acd35315dddad55d7492bb7b24d2c07ebaa082" }, "reference": { - "objectId": "0xb279227ad10111e5d870facc26d048a05bc440859e718cde0e3bbf257765544c", + "objectId": "0xbe5f46a906fa8e82533f5ae9d96b49c6c85b85d13bd8e86619018ec3a4b44b6a", "version": 1, - "digest": "BZaGDacxqx5MFLFm6F3UeBVpHG5hZykqSHFoD1o5F5kq" + "digest": "CsshpM7uS6k6JmmbWMgZcyC2gRcmzStqB65dX1M3zMwb" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0xbb43894417b1b4a4cee286133d85cae9706c217d150daf4d12168bc5e9147d78", + "objectId": "0xc0f7cf8ae9d06120456e93c4aff25ff3e4ea6f537b0bbcc073afb09b5af6cbd0", "version": 1, - "digest": "E9CuCY7GpGsGHb6cjKdSrrWc3xmRN3wjp4FqjZ22DmoT" + "digest": "Eiw9mpDkeBdYHS4YspgqjSMqG5JCMMuf8vyz7FxjqWXU" } }, { "owner": { - "ObjectOwner": "0xc2bda3bfc534a80abf077c5be16ba9a0832c206ab8e230605d6839b7d87c2038" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0xc066a3793934a82847a3cee2a0dd84832ba1ba24b71ac0602b1a60cbbe553d17", + "objectId": "0xc4a19dc4aeffa3a2f8c30355632601cc408baf876f04e1a03762270c0fabed28", "version": 1, - "digest": "DWvQzrbs9HQQ411fc6f9QtEFerRLv956sUyRzY1M9HPJ" + "digest": "3zT8rtqHPup3GuVZqADkWs22qnwmDAVLHHnZyPDwRNJM" } }, { "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0xc79de55a6454ac8e927645a08e4e9b3ce8e814ce9fc25eb7a347a91fc2228f4f", + "objectId": "0xcb02d0d88409950bbe1b44f0db14f160a722229b37188da349042e85302d1f1b", "version": 1, - "digest": "6avmJYgcDx3Ha6XXNTRCZeHACaaERgC4AkNDCE1a8TGA" + "digest": "ePVkvmaCV5zTUKfNt5dAbgNbzE2h3wAgiycUqcaFRN3" } }, { @@ -799,9 +796,9 @@ snapshot_kind: text "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0xc7ee80d93a34f12ff58b0ceaf16c4e06ee6ceeb547b031b0d3eab1a8a6ca873f", + "objectId": "0xcbd0081672ac10224257e5c9a135220b0de72deae01a3a5e853a720757e6b1e4", "version": 1, - "digest": "F3PmgDERQbRNn44B6on5QPxNVXCLUn18L33fNgv1cazu" + "digest": "8dnVdhQBxxsvLFem18y1m2a3NGdgpJvNjwhRvoJcakRw" } }, { @@ -809,77 +806,79 @@ snapshot_kind: text "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0xd1e455eb2c367047a03756eb830bf0d2357b0c69905f0d4f3a648cc81498905e", + "objectId": "0xcf7d3300b1f97f315c28aa58ecb6eba87b5d91a06fbc4d3c7403838a10a37970", "version": 1, - "digest": "C2SeaJLLw3x6ShuvPfND8mXCAvLgNz293iTtu5L1SWCW" + "digest": "3r4imMJeSnXJLkA5CuX7usNZ8uYUprEt15qq7sLH2o1U" } }, { "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0xd26171201bf3e074f1d1c694ea6ebc5d95d75b75583c393055efbca3eeb9c629", + "objectId": "0xded54d36c461af7eb2ed9377f0994ce3725b403b673240588a8d7e3bebab4d0e", "version": 1, - "digest": "AVs21Q7q1cFThjfKGkzGSSaKsQCjWo3NtDcBDPCCKM76" + "digest": "Axwnd3S2qRtgqgMYw9Hcqnno8EFUcR8usq5bgFKKkjT9" } }, { "owner": { - "ObjectOwner": "0x8ee7b25e9189b59bcedfe3525114b47d4602ce383d1ddbbc3e49d95134fd8286" + "ObjectOwner": "0x480cc02603df09501722ee2bb9acd35315dddad55d7492bb7b24d2c07ebaa082" }, "reference": { - "objectId": "0xd6090aa14b28b0e907434cd8f8469b24769a80ebd722f18df48fe59e5fd47c0f", + "objectId": "0xe204e0f49beea2e42187f31fdeef1277eba0699f1d044b28c956be49efb4fdea", "version": 1, - "digest": "4yuGdRvF2jHEwP7yfNE56bWPNY9v4b4wDzDngue7sHxb" + "digest": "CqvgpRD6zuKfCeQKtGmaeZpp8XayF8RGgjpH1JTJnHDq" } }, { "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0xe47935c2607151b36e2e7d6971418157d7a8997ab2771ae779f5b6a2230334c9", + "objectId": "0xe64176a259a2555a36fea2d9976653fd9f24c337eeb0c1ac0ee7cd0051d8f3c3", "version": 1, - "digest": "GTBQbGkLPeC4hbkBB6QtzPC7P1zngzPdh2tAyPUnS8c" + "digest": "HmgNY14N9HnnBugq4tcJLhFkQMzFx1jB6cUqkqCCKeB5" } }, { "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0xe54599f1bb4b687498caf1e5212c6eaf0b088dcc8159d283ecf2c6287ede48dc", + "objectId": "0xec83be01a3e83d0fe39bba8f6d24a69df49345640ab1e4870bc92448982e7e02", "version": 1, - "digest": "Cs9n9dTaq4n8KjEDib829cYFgPQRsyubTQRzX1upqE6x" + "digest": "9jFjRnRn3U97Gaji9HWv4RfBeLpicX22h8qYL6pZRVcd" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, "reference": { - "objectId": "0xefd24c24d3784edec255308f6fc3619f65902ebd122f5a34b105727994326ce1", + "objectId": "0xf30fbbf1a433e42ccc60ad49b15f8f16e8f4070f08f902dbe8e0bdfec38b8aab", "version": 1, - "digest": "FNNTstnHpGPZCv6PNrv7dcodbfXkA4xiz71ZUtiVKYcY" + "digest": "DUwPzvrauc7bcLaby31Mr7wkX65GQ4qZYcPr2gzu8ov9" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0xfbf79fe230691c666820739add167373a61a7faa858231f42feb961ec8fffcf5", + "objectId": "0xf45504098525c749d7b05375b77a72334894d955ec1743f1ba1e6de91c758acc", "version": 1, - "digest": "2FRzkPVb45cxXoE68vu5QcfM9T7WypPFu199wSHeXUWj" + "digest": "8LAsAKy6na6ub3TVvdThhPr5YaAhAWT5UFVgpFjpwgr7" } }, { - "owner": "Immutable", + "owner": { + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + }, "reference": { - "objectId": "0xffc04eb3011a2933dd0fbfff34cbd6759dbf999f7e2ac372e08d577c56a459cb", + "objectId": "0xf79453a7867218e7e874219f42b27a9c759caec9c4560ed3042b6136942b7439", "version": 1, - "digest": "FVzi8BDkddrv8mDQE6DG5JxD7THHn1PKLqzSj5sovdAc" + "digest": "GV3oJPeQpgUYKM7hGz2FW1UVwzm2YLvpBdbhudiXED5h" } } ], @@ -893,12 +892,12 @@ snapshot_kind: text "digest": "11111111111111111111111111111111" } }, - "eventsDigest": "HvJEc58b44AonQBEvAqrxrG5GmZUBc284MWDDNCirwNT" + "eventsDigest": "7JaYc1yqmmvDfZPPB2a3hBwohiZih6zaEaMtLTeezAgk" }, "events": [ { "id": { - "txDigest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "txDigest": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "eventSeq": "0" }, "packageId": "0x000000000000000000000000000000000000000000000000000000000000107a", @@ -906,13 +905,13 @@ snapshot_kind: text "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "type": "0x2::display::DisplayCreated<0x107a::nft::Nft>", "parsedJson": { - "id": "0xffc04eb3011a2933dd0fbfff34cbd6759dbf999f7e2ac372e08d577c56a459cb" + "id": "0x88b64785efff540f7e81bb6f6a7974001a7996668e2233c7c1e499ed06150369" }, - "bcs": "JDM3MXfy5KRcXneqNjftj86a4vwAgXavnUbYjyJPxxsc" + "bcs": "ACff2orxGMNBb5ohcz7vk4AZymYiCgKEEzQxEZJKAtRe" }, { "id": { - "txDigest": "5zibcom3dMckjyN16ygFwr5XNa9Exi1MmY3BQs984x1N", + "txDigest": "ATrNp2hJwQz1EgbEuZgsbt6Hn7DRmhNWbBxneyyawyxf", "eventSeq": "1" }, "packageId": "0x000000000000000000000000000000000000000000000000000000000000107a", @@ -956,10 +955,10 @@ snapshot_kind: text } ] }, - "id": "0xffc04eb3011a2933dd0fbfff34cbd6759dbf999f7e2ac372e08d577c56a459cb", + "id": "0x88b64785efff540f7e81bb6f6a7974001a7996668e2233c7c1e499ed06150369", "version": 1 }, - "bcs": "32c8gaMxAbF5n7wL32Kdpi5pBQy2PGi7t3onffny9jqe2gaDRgL1VDGq8Qdf7iMRM4tBvAxYsetLqrYETRwRew9c7x9XTW9aw4K9dDM1KZfHC5jj2QMRwbEHALCq9vYszTEk8A5F3x1rR1edmQyMMY7mKPRCGoRymgHdDSN6gcN6F7HBf3ya4ybxTpZax5RE4tawq5kbjSJnGNe54KAsAtqMpnJsSJ1PP5Z91r3CkDB3gKAeDah1WxySJMBgdpoJbzcniQJBQQ4ppTBFoe1FBhES9fcsbpKhMNxqyMi19TdopYSpDJHgfhPs1urgbMuNTJR6fNjbDsfY1a1DgeW7QAxpcQENY4gY4qFsWX86W8bC8K4kJYuxEEfcGCrJ16Rj2svNVE9gEeDKeRFfCH6gc9Je35Gd4chRcCjkgDoKcqzyB2vDiUrtCCbRGBrJa77x3y4TmucBM5v7LVs8eha6hEAEYQG5CDQdxTmTR6k" + "bcs": "25sF4EJtdNUazgMXAccoxc8JJrzzYH8JUsYNgKu7rEP8s5oYMsPC84BMkEpmj7GSjFwTZ4U7Uef13PYmjC3UrmsArfrvQkbDy4m9S7gGSDpA8HfAKhD9hBbQN8cxxnZEChihro2SXTJ3aP3gSiLbeZ2JZQAPQfNMNvH8rxsKULPir5arPke6mgb4zmPyZdSb3hTABpRe3kXc4woBJXWiDdd2FkdXKZw7o2LKFmnkV7EcwB78TRzdSSxhLsUSM6jnJdqWzCDbvCYXZ7o3GH7C4Bf5NWeBmgTN5hT19obT2MHc8KgdvxoyVsX94HoateZcoGJay827fHLWcX6uQDSvSPeYU6SZTz1vKrsi3q8qDLUCUQz2YuxYWoc6YuJRmWt4HKzUwoy1BVDsGSgyKV2ZcuURXAguqDy6L2PEtkR77BeQqkHQGky8pPesiyDaFoiWLaA8x4vFUyNG4441SWkhkYWcajZHekoNihzeDWc" } ], "objectChanges": [ @@ -967,7 +966,7 @@ snapshot_kind: text "type": "published", "packageId": "0x0000000000000000000000000000000000000000000000000000000000000001", "version": "1", - "digest": "4JE3kcoZSKseaSsSdgQveyB6GHU2GF3oBpg5pJ39ZSFG", + "digest": "7ffxuki3ecvz6iPs6ZSeXTiAJ8VupCSJFPkNizJNw6qW", "modules": [ "address", "ascii", @@ -993,7 +992,7 @@ snapshot_kind: text "type": "published", "packageId": "0x0000000000000000000000000000000000000000000000000000000000000002", "version": "1", - "digest": "8zNipc5CUAJYs6ak77VrFXPxQyY5vwtkUmyZz8w2j5Fq", + "digest": "56nza4jjMjfVYpNr2XWRcu6PFcszn1ajqknEEUDfgDbU", "modules": [ "address", "authenticator_state", @@ -1056,7 +1055,7 @@ snapshot_kind: text "type": "published", "packageId": "0x0000000000000000000000000000000000000000000000000000000000000003", "version": "1", - "digest": "GCLhS6D6SeU7JstsXGPEF2PTY9rGQXNLo3A6j162jdFi", + "digest": "9gRKKT1P3pomUzU9HkgSAqApx42bL5zATQLy3b4jdRJV", "modules": [ "genesis", "iota_system", @@ -1067,6 +1066,7 @@ snapshot_kind: text "validator", "validator_cap", "validator_set", + "validator_set_v2", "validator_wrapper", "voting_power" ] @@ -1082,7 +1082,7 @@ snapshot_kind: text "objectType": "0x3::iota_system::IotaSystemState", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": "1", - "digest": "73woKiMAUkS1ejdzSwyD1WLDCxsPVYURbwpMBa64Tu4h" + "digest": "AcsitSFsV9JCcodqkR4Md9nuxkfah3E16uFSJLqwSfW8" }, { "type": "created", @@ -1095,7 +1095,7 @@ snapshot_kind: text "objectType": "0x2::clock::Clock", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000006", "version": "1", - "digest": "2iNGKB1PQafgW1o6Y3ZSkUwhxJrNbbEK4PfrqW4zxokW" + "digest": "G4FJbPmssUjumCGevpg7zC89B6aY7C4bv62VfmStxvrS" }, { "type": "created", @@ -1108,13 +1108,13 @@ snapshot_kind: text "objectType": "0x2::random::Random", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000008", "version": "1", - "digest": "4ZVAMTUCrpGjd97gLUnqTSvk2gqJvr7FnGopRvQkVnzn" + "digest": "2puYWLi4oACfvF6YbePDMj59twCAArMRWYgfmAQZ9AQQ" }, { "type": "published", "packageId": "0x000000000000000000000000000000000000000000000000000000000000000b", "version": "1", - "digest": "81neBedYgjyePBFEUdm3PPC3K6BLGjwuyyFXxaDFKbAT", + "digest": "8NXiGhAshDoXFUTZF7jvh8RyTYG6XLNnPTv9ndQkAymq", "modules": [ "bridge", "chain_ids", @@ -1137,13 +1137,13 @@ snapshot_kind: text "objectType": "0x2::deny_list::DenyList", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000403", "version": "1", - "digest": "E7zwAronHAhg8gRcCNJrzffEcMCqyGwTRvXzk6tZYTzG" + "digest": "7KD7JJUTK19LymvEcM3963Zvg21X6HahpfPNNri8tedo" }, { "type": "published", "packageId": "0x000000000000000000000000000000000000000000000000000000000000107a", "version": "1", - "digest": "BvAgaA1pE6cMYg7tNZv7sdafwnYCgxk9DPseprtGCXw5", + "digest": "GzKKaavJG11SYQg7UdBonH2VRpiqJ3N6E77HMaEVT61b", "modules": [ "address_unlock_condition", "alias", @@ -1163,186 +1163,186 @@ snapshot_kind: text "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "ObjectOwner": "0xb0e1ee6d4bc415ffe76412a4a259b36821ea90db3e223a2c81e6e88bf4f2946b" }, - "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0x018673f8b9c2eee4dd923fb6fcb3eb77d0e33d15921ac59f1c57ea7dfe4c3f40", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0x009b54bbbf6943296863ea53b2d486fe612dc1a5ea743c92ea3730b88e428008", "version": "1", - "digest": "AkRRb1Y6sXYHYunTUhbhqZoeTF2KdJ9E2YJh8zncRof3" + "digest": "74XsheU7SrxUvPCfJwVxf2PqZQSSLpnHRwQJE1fjENoE" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", - "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" - }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x08e1bd72a9f239c8e99a3ee8f1f4141b48ba063ecc0ebff878152e2b481b94bc", + "owner": "Immutable", + "objectType": "0x2::coin::CoinMetadata<0x2::iota::IOTA>", + "objectId": "0x02d4eba743319566c72fe10311f86b6b7ad6367d29e39d3d35b2a08cf49c718a", "version": "1", - "digest": "FszgvFokRH5rBBNoLrTxKWBGnCAdiRqXpWYixmwBvwpf" + "digest": "92q7iTZEbGFNTkjtNi2NA4ppdyQkSxowCVmmwhrFeGY6" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "ObjectOwner": "0x087de53ab99dd733000e0ef64e158cc118d4a3645b584dff3f1cb03059a7699c" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x163b3f079eb959dc96768c65497ef5c3b48106439a306324c484a8d28e0ba50f", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0x0a35c6c50da4f58cdbe6761fbd37694d640113a794971ac3f64dc46a5d2c5806", "version": "1", - "digest": "2ueUhUo7CYjPNknnKCgASKC7u1ifGVYa9N2GpqNEFzoE" + "digest": "6DzNYaPL853kEUjU9vcWEi5oc5UPWgVqim1m7PDAfmKu" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0x480cc02603df09501722ee2bb9acd35315dddad55d7492bb7b24d2c07ebaa082" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x16d23fb8f64faebeea28ecdd43d96cb60ed1c5a297347d61a0c3fa4fff08944e", + "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", + "objectId": "0x26a4daf0ef9f464dbaafca6df38b5cb49bc3c2b1384f45ef85c5d082145c693c", "version": "1", - "digest": "ApwvoSkL1WC5UcJWSbzGuNJHn9F5ZPuALucnMNP63sCF" + "digest": "6AfW1uBGVSga4vztHKw6pJp45G3B6ccFSakYvtsTpAhY" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", - "owner": "Immutable", - "objectType": "0x2::coin::CoinMetadata<0x2::iota::IOTA>", - "objectId": "0x1a1f82376293f736136384ae03744241eb257a82f25eb223c7ef02e67442d6df", + "owner": { + "ObjectOwner": "0x480cc02603df09501722ee2bb9acd35315dddad55d7492bb7b24d2c07ebaa082" + }, + "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", + "objectId": "0x2930e3c448175f7475cf1d1382d4cc5be3045b7212d45f1a2676de7a110fb43d", "version": "1", - "digest": "CJY1zNjevKH6Kya6aWr3Ri1HQsgeZFCf9qR4HqH72Fnt" + "digest": "6TTq7VQt73GXiSo3DdgwzGQvLn1mW4d7ePSdhV93cKm2" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x1d8f7a031fcca49d212b5bf2b57704913f7c6ca423357a01dda70a150e8a35b0", + "objectId": "0x395a5188ebc00c1dd61f9fe2b8d83fb92d516953cb09bc2d25d0437179df6544", "version": "1", - "digest": "7yn1SCAHPQVAmJANbtPKjkZyzpN675SHdNBNwdFfXGbZ" + "digest": "Hr6Gjm7XQJHEPMHkXjiP4qG4A69pj5sPotJLu6C8n6T" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x1f3119f496e7c38af65bc0f29ee79354de5f554d03d0aa433bee015e280e97b4", + "objectId": "0x3c3f0be08714a623caa897116df8a1ad08bf1198d0cb37b79c61a6d8f76d44fb", "version": "1", - "digest": "59iXLqERWshXAXJqsVuwRRmoxW4AXLv5jnH3cPxRwAXw" + "digest": "GJnCyTsnXBsbhwk5HoxmT65dnMpBGLqyGwirnBxFfqmz" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x2438ca49fb81fc37f74d890207c3a922b27de14b474525b4fa111de094e5194c", + "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", + "objectId": "0x3d16eae3eec41f60e3aa1893ad10e404f0248711f5cd46cd2103a12fc3348991", "version": "1", - "digest": "A5e18Gy41Bxq2McoH7FbiYJFfU1yx26XRgvDk31KbRTz" + "digest": "Hh8Wm5GtLdDJExuxMzfBqWuN8gqveWYqYLtgxj28Xzw2" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0x303fac6452e9b844d960dcd60c84efbbd28b017774787c58705b67af946d7076", + "objectId": "0x410a84fda39b1c5c510cedf00c95052a76f49710e6cf8033375b6165e140e783", "version": "1", - "digest": "D582bFMq1ftKpRhrcFeRLhEJUbfrRZZLA6Ymgs87S6cC" + "digest": "Cjt4h2qYLCAmPSzvtEqT8NpyyfnjZAsKEZyRLADvm5YK" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, - "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0x3238c6a409ed6951125aaea3334cf632e053e0d09507e8a53d4b4b5923b896d0", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x44741e7645e8ac6c25356d6633a991eb1c0e6e66c9b2d126394a222f56f9b948", "version": "1", - "digest": "GZiR6Qj8jF3vb8Eq3AF3zrCrqGcHpKPFv3MYRCn4RLsT" + "digest": "4pCSEeAeCshaTZQHLoDQo8aBGXN1fqzMh9PbBt1ESa9B" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, - "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0x3873a7b96acdc98bfa6db49a096f8e704caa6dc7cca29aecff52abe11442dc3f", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x4dbca9f8e23a01313d8077d83750466d452814c2a889f5c64edc4530278c51f4", "version": "1", - "digest": "DmLPuMUMQHtu4hRNpXbcjqtRKWrJqPLUDnZw84GmgaUZ" + "digest": "8prBerHbn7zbWUeHShLMvQuXye9AHTT5Te2o7ciCQu2c" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, - "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0x3e5b52bc91e54ac367f5987785c7b0a68869a4be2eb0a74f7bee2172e0a70dbc", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x514dc561960a054c1a78a6c81db868478e9ae07e15af57e7531e84518c3de855", "version": "1", - "digest": "ARd1kECfyCcc3TUTnFZrdYRAGX6xn9G3ZKNtQKNDEA8R" + "digest": "9JeM91PfQcBwThEVnxE4K3bM8TPdrQaJm18FXL78XTpp" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x3fb0323b083da0415032b289cb6e610388de91f9666a67c02df8ddd9edb00f4c", + "objectId": "0x5c349bc42113c2bb209ab01129ca2aa089588f5209afe074ba0ddb15ad86241d", "version": "1", - "digest": "EidyXR5ajBRafVgkEA1cm598AdyK66F2NBub16VyE9aB" + "digest": "ag1NBRsb4HA7b33GvZL7s1nKiMRccnQg7MCyV4tEmED" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, - "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0x4451b2f6d468c331dafa10f4b3fbf057b89f684553bf9298d0c4f8e61df2fa95", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x60707993b78b76514b82bdd65c703b52e268958a509f4f6c8f25a191d9bdbdca", "version": "1", - "digest": "33vUxz6x2MsvDWTQWpFpjWQbPbbZhUxPyn3uwSDfAVQx" + "digest": "u412hXUPgBXN2Qap6XJoPuN4EHbDXasyLWNiXHrRbC8" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, - "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0x4547fa20f95dcc6e221d18eaf933f993ee8f46f98eef1705853a71f9c917c185", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x63652f6ae7c6a598dac6b20a23eda4d12812513ac569df393200600dbe27b3df", "version": "1", - "digest": "J3kRd8hXaaV2mFKES9k7X2NnjxDCGcFAUoXCqsY2reZJ" + "digest": "5rjXsGwM7wWYDumyhxn1NF7Rbu2Cj9oYz8mu12H3bQZ5" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xbc4cf4a6e17ba874f668896d13e8dda92bab7a8870b3118d26fd67501028c2f3" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0x49315560aecdcf0beba3cfccb2d04f29f5d95b440cb0b6dadec64349b81083d6", + "objectType": "0x3::staking_pool::StakedIota", + "objectId": "0x68aa8412706a49ad22bdb1740ab4a2542ca6692491682715cc09d2a2d165347c", "version": "1", - "digest": "BRyi5NozgWp2Aji5hM8p83M8VgyR3PYg7G27MiYR2B9z" + "digest": "5eVK1tCEY184EUoCVxZWiwVE6rVTLQhAZNDxyLjPPekL" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x672bba3ef273000a1627a5f128022e261e36a85db6c508b917aa3139a2e9720d" + "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0x497d698dce0d808d05cb3543b2decd461eb67a0a832acf7e3d822ff61663acb4", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", "version": "1", - "digest": "242fQBuczzCLdXuMZ7FZwR9m86DacJxUTC5xuUW62DSG" + "digest": "EHfQFb84KU46SCdxDNwEYSyVEVPce4ap4ndNghxhGAuK" }, { "type": "created", @@ -1350,109 +1350,107 @@ snapshot_kind: text "owner": { "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, - "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0x4a4a868c023e670163f57e2467cccdaedef147daf5170fc9b0ce7caa48284a76", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x6be75614ce32eef2b10fc89aefcefa78235e1357fde4d1a5f03f0dedcea2155d", "version": "1", - "digest": "AWztWHzVjwd5rYXr7ork1gYC54JqtGpwHNdFA9i6gA16" + "digest": "4ne2hK9k5X52h3uoUb3z57yNKemx6epwCdcrN66SUdtL" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x4df66b7aab12f518bfba67b0081cadb8a321870b171a98d2aceafb6804e3b003", + "objectId": "0x6db53eec8c20c7627aebb85667183082b157b891d5a0d44eaefdfff54eefbeaa", "version": "1", - "digest": "EPxkpuZZYcjDJq9AzNLMPM8vsY1URjow7nmDuxQQ1QCb" + "digest": "A4FvZH7nVXVKSm4qvc8NrE8A2kHFUDHqPFNAevHzpRTC" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xce3d02f2a570935f50158318f1f0f8706fb80873afce7bb914625c1082225399" + "ObjectOwner": "0x16aaaa67fab71c005b40b0b7aae0ee18f74f13da37c8af9433307fea13a0414a" }, - "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0x50948c5a6a706b267a6b2c2a4a2043d28ba11c5e022198f58be4182d65987a2d", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0x70ee97df35fc2c8b910420e7e5a5e3bf1c2343a2053de4cc4116f300e3e6c147", "version": "1", - "digest": "9SGZtrm6U2rsCqiaFoVQEUSreYstnrCRg6f2EzwKGHq" + "digest": "292jf11i9u2tezY8K8ZZXDrxGptoyxHtWrkqZ5kwMpyy" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" }, - "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0x58efd4d54b74b390e2d3bbe785ec5df555c366b1a6eb616fb07c44d6c3f67c8c", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x7444f0409e63051805b20ce782a83cb360bcd51bad24f49adecaa06d69980679", "version": "1", - "digest": "FbrF4mnrw5oXKX1trYT2NoENq7CaSGVZfXj5XitjSqhH" + "digest": "6xYBTF7RN6wTC73niFMAJp9vGvZ3CRJGpj6bMjuaWJQT" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x5b0e7d31f9c3a421f94dae3511983a2be67e04a7071171da2380f82be103239f", + "objectId": "0x78bb01884e7b79c33dd9bf2b81dd0941a96642df8a193cbb69725824a24a5659", "version": "1", - "digest": "6s1xQf5HR8HMLNaR1QxPcfV4Ys8AL94UUg7cRpD6r4WD" + "digest": "kRLTPAysmEBVJ11Xipe6KTSzBVW72fKgmm6tGkwSGdQ" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x1dd0079cb68a9c0dc5cbbb0c9c5d831bb56ed88c4a12c647f1352832092d11dc" + "ObjectOwner": "0x66d5aecec555f796c53f4fe7ce5f2fd8a9551b9fc9d656b9879c00ece6b9bae2" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0x5c995a223cf5e88e2d19935481d2d06b2e55977cb3615ad6784cc360a42d6501", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0x83a53517002ebdb0608f2cbaa36831bf3e4893abd80497619e5863045e324c63", "version": "1", - "digest": "2ih9uvSzKBSv9YhrNZdMokhPcZgZ8gTt48TyUToB6JgX" + "digest": "4yR1DxgRtypf5kB4vRWrXoKZY5VEWnMniE6XMdq8uLdw" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", - "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" - }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x5ee269cea868091ea1c5da5f15581c2f7b1708413b3bdda3e4c9528f2b3a5bb9", + "owner": "Immutable", + "objectType": "0x2::display::Display<0x107a::nft::Nft>", + "objectId": "0x88b64785efff540f7e81bb6f6a7974001a7996668e2233c7c1e499ed06150369", "version": "1", - "digest": "7mvhi6RxxMnPohJzMnCYoLHBTLUcRtwFtBXe1ZoanE6D" + "digest": "3dnFuKAuFYU3NR5ZwB5yfgKT31fjnA2FNKdD8PSSRoxa" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, - "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0x61f2f500cb861d8d92affc84519c4c0a6b794058b58607768c8e38ab275de0eb", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x8de4c8fc8566c3e3820ed547371ca3909dd8f8953b7142618e341feaa13e8cc5", "version": "1", - "digest": "AvgJes9PZYnWwM9KZmEiBZamurEgezPZUBB2gVJzvEgb" + "digest": "HhVmRsC4vVAL7EEAA17iw4QQkNXPTyWt85WLFPRYy2db" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x8e0336f93faca1a97f0b9388a6a209a045d4cca2a9058784e2c5f695c5dc05b5", "version": "1", - "digest": "36ayTWhEK1Ez85fRT6j93sMbQtxo3V55FDsJSnWXTFe5" + "digest": "4kHTKzkjZCeDnHcwwLoKdoeKsCdW7FKmPuWZhczkK8Ah" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x6b517df3c5888ce924d7871e550989f835335c726a43a224ce3df6b6dfa53666", + "objectId": "0x8e471b154ec29a8385011d34dbb464e6ed6ea73c4a71310135ba24cfbc277cc9", "version": "1", - "digest": "ARFnQexwF3Q6CDzCgnQfH1v8gY9YAfpXLq4K89FU9koJ" + "digest": "EyAzc4a4Xhs7ycooubM5TK3pmdCjX2SFUyEfRY3h97QR" }, { "type": "created", @@ -1461,152 +1459,152 @@ snapshot_kind: text "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x759bb64d0a576b00a8aae6d439da4a72ef7d8797282c90211bab2bc723cd48e5", + "objectId": "0x8ee7bb555371a152528adf72b0526f8d31ae5fd30c9c482edaeb9df55d2294a7", "version": "1", - "digest": "7cuKDvum6Rx2utLqquqYZGr6K3S5xbA2fq88cqs8qjZd" + "digest": "EcExPqgRxi8ZWqjSPigCHrNgaZBkLTYyjkMcmyUK7Q8h" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x76472cb3b720491fb9a66db21befaed5fbc8528976bc6fb2bc3c5deeef9d114c", + "objectId": "0x92e6155f43c9f8ca6eaefd02c386268c9891142b9bfeb70e91dba62a6fde8193", "version": "1", - "digest": "zQeqLseHTy2tGhRk4gwvQGoCtUkRd4LqGjKuuvW2Xh1" + "digest": "21zig1jQpeJZPRPPL2oxftfZvCKbicbr75rCCCEEbmpK" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x7c9f819b470ae3ac98b6e44eeea9b461d66a38b22a3d2f61ce62c69f68d0c71a", + "objectId": "0x98325c5a56855922a0a15f22595cbfc22b5272be0505f4615b98af9ba9d77d67", "version": "1", - "digest": "EsxwZdo265ZPbYh99YeTGunSWrMj8dXyNBw2H1E9D9eL" + "digest": "GUPe9nCTcx5Y38Gup2xU2Y1pbtf4RWwdLDwZ2XxzW6hA" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x81c7cfd9c7fa81f57a59f14739ee82157fc6a04d48a1b0a6e1187a8898042299", + "objectId": "0x99f01282794c8a2056eaae435dccfe5a78bc4cbdbca447a8460e908bda6b60e8", "version": "1", - "digest": "8ESph921vnJz6UaENHxg2ytx68MtT4UoxNpPgWTT99a5" + "digest": "7MayLUpkPJYGDXBEXzaq2iiKKJ9tmSU3K1MLdg5QhYaJ" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0xc2797a0797434bd2d32a40ac9fa463f92765ca5775a6f819cdc7b00222fc2039" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x85a7aabfb1d8ef14efd87338a58efcdbfaf0cab5e5fc247ccd1080dcdd3d2d7f", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0xa12e2f0f034e4717b38c91d0e7df7e5bb600c7da7599e3a6e46faf9218d8c33b", "version": "1", - "digest": "277zG7Ypo7ruZu1WMxXDUoApdKnUYLBvrws1KkqzHuFm" + "digest": "6q1dxsFS5Ccbzydy58NNywuhFjZZbGNmNNAYRSunAnfu" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x8cd9aca3790437fc6b1b7258c5fefb2e95ffb54134aae1fd04ba757d4286055d", + "objectType": "0x3::staking_pool::StakedIota", + "objectId": "0xb0a869ee5d127f9b17ae2ce839e3e26f314da6c8805d14111a3754b910625f72", "version": "1", - "digest": "AEXYy8VGP4NX8xpTs7LHiuZYfzTwFiRypmiQrZy9waNY" + "digest": "8PFjrLYmyevb3GWbJ4mhpDCMeSCRJRywsvoQ5srXU51Y" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x8fd46357d5ae46f9ee8de7d9b6dfc9da4e497c70dbd2ce5c2fc124658798d5c9", + "objectId": "0xb1d7d70ce1377c4c352227877045dce2f1c57689143dbbcaa5e747e2093ba29e", "version": "1", - "digest": "3xUtUi7VT3NzhFGUGsAJbSaimrdSTb2ujoesjNukQjS8" + "digest": "B22UhJye9j1cab6hGmhhx2LCvVZuM4dACR39nfZPFnxc" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xa010e1486bfd2f1d7c57a3b2c2edd369e64e8fddc1ca17667314317273cb491d", + "objectType": "0x3::staking_pool::StakedIota", + "objectId": "0xbd14be5bf17d1001d3ada57fd8e0a9c2a37f15a33445566e9861033e2d39865b", "version": "1", - "digest": "DAFo7bkSkk2XRZv88Nb2V9jatTse1TYTqgMmVxVKGRtF" + "digest": "2AUoN26MSwRU44u5VBcbFiFiDst9EdqHVQZhkB2tLj4Z" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xa6e659b1120b373f598d1f6c3214d73abda596eb913857e1fa471ab4420f2e27", + "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", + "objectId": "0xbe1a2f2e258e4e66e4498a165bd49acfa5008ece793ede8bbde216b0312775ee", "version": "1", - "digest": "E3tr1QPatiEWCjxUNrbKfyRgkNq8tBeiTKFKGyA7g9vk" + "digest": "GP6zWTkW9Vuk5gpHPd5HizWHhNDMuyKVLkYrMrsSSizx" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xb271c22281276193f817eeab5291b79f5f37698a21323fbafe014e1774c3d22e", + "objectId": "0xbe5c82684aada8d68df9a95cbd7ed5b3e0a00e29a62d059483e3e34f7c116aeb", "version": "1", - "digest": "GjnVg1dHinKTEkLLZYLedhgmLkmNddYhYM9pUZrUDrzc" + "digest": "E6XuAJ91aYiTtibmrhdrK7NXFUeYevh49svaCBrw1kzJ" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "ObjectOwner": "0x480cc02603df09501722ee2bb9acd35315dddad55d7492bb7b24d2c07ebaa082" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xb279227ad10111e5d870facc26d048a05bc440859e718cde0e3bbf257765544c", + "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", + "objectId": "0xbe5f46a906fa8e82533f5ae9d96b49c6c85b85d13bd8e86619018ec3a4b44b6a", "version": "1", - "digest": "BZaGDacxqx5MFLFm6F3UeBVpHG5hZykqSHFoD1o5F5kq" + "digest": "CsshpM7uS6k6JmmbWMgZcyC2gRcmzStqB65dX1M3zMwb" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xbb43894417b1b4a4cee286133d85cae9706c217d150daf4d12168bc5e9147d78", + "objectId": "0xc0f7cf8ae9d06120456e93c4aff25ff3e4ea6f537b0bbcc073afb09b5af6cbd0", "version": "1", - "digest": "E9CuCY7GpGsGHb6cjKdSrrWc3xmRN3wjp4FqjZ22DmoT" + "digest": "Eiw9mpDkeBdYHS4YspgqjSMqG5JCMMuf8vyz7FxjqWXU" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xc2bda3bfc534a80abf077c5be16ba9a0832c206ab8e230605d6839b7d87c2038" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0xc066a3793934a82847a3cee2a0dd84832ba1ba24b71ac0602b1a60cbbe553d17", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0xc4a19dc4aeffa3a2f8c30355632601cc408baf876f04e1a03762270c0fabed28", "version": "1", - "digest": "DWvQzrbs9HQQ411fc6f9QtEFerRLv956sUyRzY1M9HPJ" + "digest": "3zT8rtqHPup3GuVZqADkWs22qnwmDAVLHHnZyPDwRNJM" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xc79de55a6454ac8e927645a08e4e9b3ce8e814ce9fc25eb7a347a91fc2228f4f", + "objectId": "0xcb02d0d88409950bbe1b44f0db14f160a722229b37188da349042e85302d1f1b", "version": "1", - "digest": "6avmJYgcDx3Ha6XXNTRCZeHACaaERgC4AkNDCE1a8TGA" + "digest": "ePVkvmaCV5zTUKfNt5dAbgNbzE2h3wAgiycUqcaFRN3" }, { "type": "created", @@ -1615,9 +1613,9 @@ snapshot_kind: text "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xc7ee80d93a34f12ff58b0ceaf16c4e06ee6ceeb547b031b0d3eab1a8a6ca873f", + "objectId": "0xcbd0081672ac10224257e5c9a135220b0de72deae01a3a5e853a720757e6b1e4", "version": "1", - "digest": "F3PmgDERQbRNn44B6on5QPxNVXCLUn18L33fNgv1cazu" + "digest": "8dnVdhQBxxsvLFem18y1m2a3NGdgpJvNjwhRvoJcakRw" }, { "type": "created", @@ -1626,84 +1624,86 @@ snapshot_kind: text "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xd1e455eb2c367047a03756eb830bf0d2357b0c69905f0d4f3a648cc81498905e", + "objectId": "0xcf7d3300b1f97f315c28aa58ecb6eba87b5d91a06fbc4d3c7403838a10a37970", "version": "1", - "digest": "C2SeaJLLw3x6ShuvPfND8mXCAvLgNz293iTtu5L1SWCW" + "digest": "3r4imMJeSnXJLkA5CuX7usNZ8uYUprEt15qq7sLH2o1U" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, - "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0xd26171201bf3e074f1d1c694ea6ebc5d95d75b75583c393055efbca3eeb9c629", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0xded54d36c461af7eb2ed9377f0994ce3725b403b673240588a8d7e3bebab4d0e", "version": "1", - "digest": "AVs21Q7q1cFThjfKGkzGSSaKsQCjWo3NtDcBDPCCKM76" + "digest": "Axwnd3S2qRtgqgMYw9Hcqnno8EFUcR8usq5bgFKKkjT9" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x8ee7b25e9189b59bcedfe3525114b47d4602ce383d1ddbbc3e49d95134fd8286" + "ObjectOwner": "0x480cc02603df09501722ee2bb9acd35315dddad55d7492bb7b24d2c07ebaa082" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0xd6090aa14b28b0e907434cd8f8469b24769a80ebd722f18df48fe59e5fd47c0f", + "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", + "objectId": "0xe204e0f49beea2e42187f31fdeef1277eba0699f1d044b28c956be49efb4fdea", "version": "1", - "digest": "4yuGdRvF2jHEwP7yfNE56bWPNY9v4b4wDzDngue7sHxb" + "digest": "CqvgpRD6zuKfCeQKtGmaeZpp8XayF8RGgjpH1JTJnHDq" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xe47935c2607151b36e2e7d6971418157d7a8997ab2771ae779f5b6a2230334c9", + "objectId": "0xe64176a259a2555a36fea2d9976653fd9f24c337eeb0c1ac0ee7cd0051d8f3c3", "version": "1", - "digest": "GTBQbGkLPeC4hbkBB6QtzPC7P1zngzPdh2tAyPUnS8c" + "digest": "HmgNY14N9HnnBugq4tcJLhFkQMzFx1jB6cUqkqCCKeB5" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xe54599f1bb4b687498caf1e5212c6eaf0b088dcc8159d283ecf2c6287ede48dc", + "objectId": "0xec83be01a3e83d0fe39bba8f6d24a69df49345640ab1e4870bc92448982e7e02", "version": "1", - "digest": "Cs9n9dTaq4n8KjEDib829cYFgPQRsyubTQRzX1upqE6x" + "digest": "9jFjRnRn3U97Gaji9HWv4RfBeLpicX22h8qYL6pZRVcd" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xefd24c24d3784edec255308f6fc3619f65902ebd122f5a34b105727994326ce1", + "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", + "objectId": "0xf30fbbf1a433e42ccc60ad49b15f8f16e8f4070f08f902dbe8e0bdfec38b8aab", "version": "1", - "digest": "FNNTstnHpGPZCv6PNrv7dcodbfXkA4xiz71ZUtiVKYcY" + "digest": "DUwPzvrauc7bcLaby31Mr7wkX65GQ4qZYcPr2gzu8ov9" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xfbf79fe230691c666820739add167373a61a7faa858231f42feb961ec8fffcf5", + "objectId": "0xf45504098525c749d7b05375b77a72334894d955ec1743f1ba1e6de91c758acc", "version": "1", - "digest": "2FRzkPVb45cxXoE68vu5QcfM9T7WypPFu199wSHeXUWj" + "digest": "8LAsAKy6na6ub3TVvdThhPr5YaAhAWT5UFVgpFjpwgr7" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", - "owner": "Immutable", - "objectType": "0x2::display::Display<0x107a::nft::Nft>", - "objectId": "0xffc04eb3011a2933dd0fbfff34cbd6759dbf999f7e2ac372e08d577c56a459cb", + "owner": { + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + }, + "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", + "objectId": "0xf79453a7867218e7e874219f42b27a9c759caec9c4560ed3042b6136942b7439", "version": "1", - "digest": "FVzi8BDkddrv8mDQE6DG5JxD7THHn1PKLqzSj5sovdAc" + "digest": "GV3oJPeQpgUYKM7hGz2FW1UVwzm2YLvpBdbhudiXED5h" } ], "timestampMs": "1641175496000", diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000001 b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000001 new file mode 100644 index 00000000000..6aae6016489 Binary files /dev/null and b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000001 differ diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000002 b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000002 new file mode 100644 index 00000000000..6e14adb5fdf Binary files /dev/null and b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000002 differ diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000003 b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000003 new file mode 100644 index 00000000000..225fa0f8361 Binary files /dev/null and b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x0000000000000000000000000000000000000000000000000000000000000003 differ diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000000b b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000000b new file mode 100644 index 00000000000..a28b3206877 Binary files /dev/null and b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000000b differ diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000107a b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000107a new file mode 100644 index 00000000000..56d912f6c89 Binary files /dev/null and b/crates/iota-framework-snapshot/bytecode_snapshot/2/0x000000000000000000000000000000000000000000000000000000000000107a differ diff --git a/crates/iota-framework-snapshot/manifest.json b/crates/iota-framework-snapshot/manifest.json index 71466febef4..61b742093ce 100644 --- a/crates/iota-framework-snapshot/manifest.json +++ b/crates/iota-framework-snapshot/manifest.json @@ -8,5 +8,15 @@ "0x000000000000000000000000000000000000000000000000000000000000000b", "0x000000000000000000000000000000000000000000000000000000000000107a" ] + }, + "2": { + "git_revision": "cb723f4d0988", + "package_ids": [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000107a" + ] } } \ No newline at end of file diff --git a/crates/iota-framework/packages/iota-system/sources/iota_system.move b/crates/iota-framework/packages/iota-system/sources/iota_system.move index 573ffddb165..812ab516142 100644 --- a/crates/iota-framework/packages/iota-system/sources/iota_system.move +++ b/crates/iota-framework/packages/iota-system/sources/iota_system.move @@ -49,13 +49,13 @@ module iota_system::iota_system { use iota::system_admin_cap::IotaSystemAdminCap; use iota_system::validator::ValidatorV1; use iota_system::validator_cap::UnverifiedValidatorOperationCap; - use iota_system::iota_system_state_inner::{Self, SystemParametersV1, IotaSystemStateV1}; + use iota_system::iota_system_state_inner::{Self, SystemParametersV1, IotaSystemStateV1, IotaSystemStateV2 as IotaSystemStateLatest}; use iota_system::staking_pool::PoolTokenExchangeRate; use iota::dynamic_field; use iota::vec_map::VecMap; #[test_only] use iota::balance; - #[test_only] use iota_system::validator_set::ValidatorSetV1; + #[test_only] use iota_system::validator_set_v2::ValidatorSet as ValidatorSetLatest; #[test_only] use iota::vec_set::VecSet; public struct IotaSystemState has key { @@ -548,16 +548,23 @@ module iota_system::iota_system { storage_rebate } - fun load_system_state(self: &mut IotaSystemState): &IotaSystemStateV1 { + fun load_system_state(self: &mut IotaSystemState): &IotaSystemStateLatest { load_inner_maybe_upgrade(self) } - fun load_system_state_mut(self: &mut IotaSystemState): &mut IotaSystemStateV1 { + fun load_system_state_mut(self: &mut IotaSystemState): &mut IotaSystemStateLatest { load_inner_maybe_upgrade(self) } - fun load_inner_maybe_upgrade(self: &mut IotaSystemState): &mut IotaSystemStateV1 { - let inner: &mut IotaSystemStateV1 = dynamic_field::borrow_mut( + fun load_inner_maybe_upgrade(self: &mut IotaSystemState): &mut IotaSystemStateLatest { + if (self.version == 1) { + let old_version: IotaSystemStateV1 = dynamic_field::remove(&mut self.id, self.version); + let new_version = old_version.v1_to_v2(); + self.version = 2; + dynamic_field::add(&mut self.id, self.version, new_version); + }; + + let inner: &mut IotaSystemStateLatest = dynamic_field::borrow_mut( &mut self.id, self.version ); @@ -624,7 +631,7 @@ module iota_system::iota_system { #[test_only] /// Return the current validator set - public fun validators(wrapper: &mut IotaSystemState): &ValidatorSetV1 { + public fun validators(wrapper: &mut IotaSystemState): &ValidatorSetLatest { let self = load_system_state(wrapper); self.validators() } diff --git a/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move b/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move index 5e701a31961..7d455e46c67 100644 --- a/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move +++ b/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move @@ -9,6 +9,7 @@ module iota_system::iota_system_state_inner { use iota::system_admin_cap::IotaSystemAdminCap; use iota_system::validator::{Self, ValidatorV1}; use iota_system::validator_set::{Self, ValidatorSetV1}; + use iota_system::validator_set_v2::ValidatorSet; use iota_system::validator_cap::{UnverifiedValidatorOperationCap, ValidatorOperationCap}; use iota_system::storage_fund::{Self, StorageFundV1}; use iota_system::staking_pool::{PoolTokenExchangeRate, StakedIota}; @@ -58,6 +59,56 @@ module iota_system::iota_system_state_inner { extra_fields: Bag, } + /// The top-level object containing all information of the Iota system. + public struct IotaSystemStateV2 has store { + /// The current epoch ID, starting from 0. + epoch: u64, + /// The current protocol version, starting from 1. + protocol_version: u64, + /// The current version of the system state data structure type. + /// This is always the same as IotaSystemState.version. Keeping a copy here so that + /// we know what version it is by inspecting IotaSystemStateV2 as well. + system_state_version: u64, + /// The IOTA's TreasuryCap. + iota_treasury_cap: IotaTreasuryCap, + /// Contains all information about the validators. + validators: ValidatorSet, + /// The storage fund. + storage_fund: StorageFundV1, + /// A list of system config parameters. + parameters: SystemParametersV1, + /// A capability allows to perform privileged IOTA system operations. + iota_system_admin_cap: IotaSystemAdminCap, + /// The reference gas price for the current epoch. + reference_gas_price: u64, + /// A map storing the records of validator reporting each other. + /// There is an entry in the map for each validator that has been reported + /// at least once. The entry VecSet contains all the validators that reported + /// them. If a validator has never been reported they don't have an entry in this map. + /// This map persists across epoch: a peer continues being in a reported state until the + /// reporter doesn't explicitly remove their report. + /// Note that in case we want to support validator address change in future, + /// the reports should be based on validator ids + validator_report_records: VecMap>, + + /// Whether the system is running in a downgraded safe mode due to a non-recoverable bug. + /// This is set whenever we failed to execute advance_epoch, and ended up executing advance_epoch_safe_mode. + /// It can be reset once we are able to successfully execute advance_epoch. + /// The rest of the fields starting with `safe_mode_` are accmulated during safe mode + /// when advance_epoch_safe_mode is executed. They will eventually be processed once we + /// are out of safe mode. + safe_mode: bool, + safe_mode_storage_charges: Balance, + safe_mode_computation_rewards: Balance, + safe_mode_storage_rebates: u64, + safe_mode_non_refundable_storage_fee: u64, + + /// Unix timestamp of the current epoch start + epoch_start_timestamp_ms: u64, + /// Any extra fields that's not defined statically. + extra_fields: Bag, + } + /// The top-level object containing all information of the Iota system. public struct IotaSystemStateV1 has store { /// The current epoch ID, starting from 0. @@ -199,6 +250,48 @@ module iota_system::iota_system_state_inner { } } + public(package) fun v1_to_v2(self: IotaSystemStateV1): IotaSystemStateV2 { + let IotaSystemStateV1 { + epoch, + protocol_version, + system_state_version, + iota_treasury_cap, + validators, + storage_fund, + parameters, + iota_system_admin_cap, + reference_gas_price, + validator_report_records, + safe_mode, + safe_mode_storage_charges, + safe_mode_computation_rewards, + safe_mode_storage_rebates, + safe_mode_non_refundable_storage_fee, + epoch_start_timestamp_ms, + extra_fields, + } = self; + IotaSystemStateV2 { + epoch, + protocol_version, + system_state_version: system_state_version + 1, + iota_treasury_cap, + validators: validators.v1_to_v2(), + storage_fund, + parameters, + iota_system_admin_cap, + reference_gas_price, + validator_report_records, + safe_mode, + safe_mode_storage_charges, + safe_mode_computation_rewards, + safe_mode_storage_rebates, + safe_mode_non_refundable_storage_fee, + epoch_start_timestamp_ms, + extra_fields, + } + } + + // ==== public(package) functions ==== /// Can be called by anyone who wishes to become a validator candidate and starts accuring delegated @@ -208,7 +301,7 @@ module iota_system::iota_system_state_inner { /// Note: `proof_of_possession` MUST be a valid signature using iota_address and authority_pubkey_bytes. /// To produce a valid PoP, run [fn test_proof_of_possession]. public(package) fun request_add_validator_candidate( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, authority_pubkey_bytes: vector, network_pubkey_bytes: vector, protocol_pubkey_bytes: vector, @@ -248,7 +341,7 @@ module iota_system::iota_system_state_inner { /// Called by a validator candidate to remove themselves from the candidacy. After this call /// their staking pool becomes deactivate. public(package) fun request_remove_validator_candidate( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, ctx: &mut TxContext, ) { self.validators.request_remove_validator_candidate(ctx); @@ -259,7 +352,7 @@ module iota_system::iota_system_state_inner { /// stake the validator has doesn't meet the min threshold, or if the number of new validators for the next /// epoch has already reached the maximum. public(package) fun request_add_validator( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, ctx: &TxContext, ) { assert!( @@ -276,7 +369,7 @@ module iota_system::iota_system_state_inner { /// At the end of the epoch, the `validator` object will be returned to the iota_address /// of the validator. public(package) fun request_remove_validator( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, ctx: &TxContext, ) { // Only check min validator condition if the current number of validators satisfy the constraint. @@ -295,7 +388,7 @@ module iota_system::iota_system_state_inner { /// A validator can call this function to submit a new gas price quote, to be /// used for the reference gas price calculation at the end of the epoch. public(package) fun request_set_gas_price( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, cap: &UnverifiedValidatorOperationCap, new_gas_price: u64, ) { @@ -308,7 +401,7 @@ module iota_system::iota_system_state_inner { /// This function is used to set new gas price for candidate validators public(package) fun set_candidate_validator_gas_price( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, cap: &UnverifiedValidatorOperationCap, new_gas_price: u64, ) { @@ -321,7 +414,7 @@ module iota_system::iota_system_state_inner { /// A validator can call this function to set a new commission rate, updated at the end of /// the epoch. public(package) fun request_set_commission_rate( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, new_commission_rate: u64, ctx: &TxContext, ) { @@ -333,7 +426,7 @@ module iota_system::iota_system_state_inner { /// This function is used to set new commission rate for candidate validators public(package) fun set_candidate_validator_commission_rate( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, new_commission_rate: u64, ctx: &TxContext, ) { @@ -343,7 +436,7 @@ module iota_system::iota_system_state_inner { /// Add stake to a validator's staking pool. public(package) fun request_add_stake( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, stake: Coin, validator_address: address, ctx: &mut TxContext, @@ -357,7 +450,7 @@ module iota_system::iota_system_state_inner { /// Add stake to a validator's staking pool using multiple coins. public(package) fun request_add_stake_mul_coin( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, stakes: vector>, stake_amount: option::Option, validator_address: address, @@ -369,7 +462,7 @@ module iota_system::iota_system_state_inner { /// Withdraw some portion of a stake from a validator's staking pool. public(package) fun request_withdraw_stake( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, staked_iota: StakedIota, ctx: &TxContext, ) : Balance { @@ -383,7 +476,7 @@ module iota_system::iota_system_state_inner { /// 3. the cap object is still valid. /// This function is idempotent. public(package) fun report_validator( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, cap: &UnverifiedValidatorOperationCap, reportee_addr: address, ) { @@ -400,7 +493,7 @@ module iota_system::iota_system_state_inner { /// 2. the sender has not previously reported the `reportee_addr`, or /// 3. the cap is not valid public(package) fun undo_report_validator( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, cap: &UnverifiedValidatorOperationCap, reportee_addr: address, ) { @@ -447,7 +540,7 @@ module iota_system::iota_system_state_inner { /// Create a new `UnverifiedValidatorOperationCap`, transfer it to the /// validator and registers it. The original object is thus revoked. public(package) fun rotate_operation_cap( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, ctx: &mut TxContext, ) { let validator = self.validators.get_validator_mut_with_ctx_including_candidates(ctx); @@ -456,7 +549,7 @@ module iota_system::iota_system_state_inner { /// Update a validator's name. public(package) fun update_validator_name( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, name: vector, ctx: &TxContext, ) { @@ -467,7 +560,7 @@ module iota_system::iota_system_state_inner { /// Update a validator's description public(package) fun update_validator_description( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, description: vector, ctx: &TxContext, ) { @@ -477,7 +570,7 @@ module iota_system::iota_system_state_inner { /// Update a validator's image url public(package) fun update_validator_image_url( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, image_url: vector, ctx: &TxContext, ) { @@ -487,7 +580,7 @@ module iota_system::iota_system_state_inner { /// Update a validator's project url public(package) fun update_validator_project_url( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, project_url: vector, ctx: &TxContext, ) { @@ -498,7 +591,7 @@ module iota_system::iota_system_state_inner { /// Update a validator's network address. /// The change will only take effects starting from the next epoch. public(package) fun update_validator_next_epoch_network_address( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, network_address: vector, ctx: &TxContext, ) { @@ -510,7 +603,7 @@ module iota_system::iota_system_state_inner { /// Update candidate validator's network address. public(package) fun update_candidate_validator_network_address( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, network_address: vector, ctx: &TxContext, ) { @@ -521,7 +614,7 @@ module iota_system::iota_system_state_inner { /// Update a validator's p2p address. /// The change will only take effects starting from the next epoch. public(package) fun update_validator_next_epoch_p2p_address( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, p2p_address: vector, ctx: &TxContext, ) { @@ -533,7 +626,7 @@ module iota_system::iota_system_state_inner { /// Update candidate validator's p2p address. public(package) fun update_candidate_validator_p2p_address( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, p2p_address: vector, ctx: &TxContext, ) { @@ -544,7 +637,7 @@ module iota_system::iota_system_state_inner { /// Update a validator's primary address. /// The change will only take effects starting from the next epoch. public(package) fun update_validator_next_epoch_primary_address( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, primary_address: vector, ctx: &TxContext, ) { @@ -554,7 +647,7 @@ module iota_system::iota_system_state_inner { /// Update candidate validator's primary address. public(package) fun update_candidate_validator_primary_address( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, primary_address: vector, ctx: &TxContext, ) { @@ -565,7 +658,7 @@ module iota_system::iota_system_state_inner { /// Update a validator's public key of authority key and proof of possession. /// The change will only take effects starting from the next epoch. public(package) fun update_validator_next_epoch_authority_pubkey( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, authority_pubkey: vector, proof_of_possession: vector, ctx: &TxContext, @@ -578,7 +671,7 @@ module iota_system::iota_system_state_inner { /// Update candidate validator's public key of authority key and proof of possession. public(package) fun update_candidate_validator_authority_pubkey( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, authority_pubkey: vector, proof_of_possession: vector, ctx: &TxContext, @@ -590,7 +683,7 @@ module iota_system::iota_system_state_inner { /// Update a validator's public key of protocol key. /// The change will only take effects starting from the next epoch. public(package) fun update_validator_next_epoch_protocol_pubkey( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, protocol_pubkey: vector, ctx: &TxContext, ) { @@ -602,7 +695,7 @@ module iota_system::iota_system_state_inner { /// Update candidate validator's public key of protocol key. public(package) fun update_candidate_validator_protocol_pubkey( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, protocol_pubkey: vector, ctx: &TxContext, ) { @@ -613,7 +706,7 @@ module iota_system::iota_system_state_inner { /// Update a validator's public key of network key. /// The change will only take effects starting from the next epoch. public(package) fun update_validator_next_epoch_network_pubkey( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, network_pubkey: vector, ctx: &TxContext, ) { @@ -625,7 +718,7 @@ module iota_system::iota_system_state_inner { /// Update candidate validator's public key of network key. public(package) fun update_candidate_validator_network_pubkey( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, network_pubkey: vector, ctx: &TxContext, ) { @@ -644,7 +737,7 @@ module iota_system::iota_system_state_inner { /// 5. Burn any leftover rewards. /// 6. Update all validators. public(package) fun advance_epoch( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, new_epoch: u64, next_protocol_version: u64, validator_target_reward: u64, @@ -773,19 +866,19 @@ module iota_system::iota_system_state_inner { /// Return the current epoch number. Useful for applications that need a coarse-grained concept of time, /// since epochs are ever-increasing and epoch changes are intended to happen every 24 hours. - public(package) fun epoch(self: &IotaSystemStateV1): u64 { + public(package) fun epoch(self: &IotaSystemStateV2): u64 { self.epoch } - public(package) fun protocol_version(self: &IotaSystemStateV1): u64 { + public(package) fun protocol_version(self: &IotaSystemStateV2): u64 { self.protocol_version } - public(package) fun system_state_version(self: &IotaSystemStateV1): u64 { + public(package) fun system_state_version(self: &IotaSystemStateV2): u64 { self.system_state_version } - public(package) fun iota_system_admin_cap(self: &IotaSystemStateV1): &IotaSystemAdminCap { + public(package) fun iota_system_admin_cap(self: &IotaSystemStateV2): &IotaSystemAdminCap { &self.iota_system_admin_cap } @@ -796,24 +889,24 @@ module iota_system::iota_system_state_inner { } /// Returns unix timestamp of the start of current epoch - public(package) fun epoch_start_timestamp_ms(self: &IotaSystemStateV1): u64 { + public(package) fun epoch_start_timestamp_ms(self: &IotaSystemStateV2): u64 { self.epoch_start_timestamp_ms } /// Returns the total amount staked with `validator_addr`. /// Aborts if `validator_addr` is not an active validator. - public(package) fun validator_stake_amount(self: &IotaSystemStateV1, validator_addr: address): u64 { + public(package) fun validator_stake_amount(self: &IotaSystemStateV2, validator_addr: address): u64 { self.validators.validator_total_stake_amount(validator_addr) } /// Returns the voting power for `validator_addr`. /// Aborts if `validator_addr` is not an active validator. - public(package) fun active_validator_voting_powers(self: &IotaSystemStateV1): VecMap { + public(package) fun active_validator_voting_powers(self: &IotaSystemStateV2): VecMap { let mut active_validators = active_validator_addresses(self); let mut voting_powers = vec_map::empty(); while (!vector::is_empty(&active_validators)) { let validator = vector::pop_back(&mut active_validators); - let voting_power = validator_set::validator_voting_power(&self.validators, validator); + let voting_power = self.validators.validator_voting_power(validator); vec_map::insert(&mut voting_powers, validator, voting_power); }; voting_powers @@ -821,24 +914,24 @@ module iota_system::iota_system_state_inner { /// Returns the staking pool id of a given validator. /// Aborts if `validator_addr` is not an active validator. - public(package) fun validator_staking_pool_id(self: &IotaSystemStateV1, validator_addr: address): ID { + public(package) fun validator_staking_pool_id(self: &IotaSystemStateV2, validator_addr: address): ID { self.validators.validator_staking_pool_id(validator_addr) } /// Returns reference to the staking pool mappings that map pool ids to active validator addresses - public(package) fun validator_staking_pool_mappings(self: &IotaSystemStateV1): &Table { + public(package) fun validator_staking_pool_mappings(self: &IotaSystemStateV2): &Table { self.validators.staking_pool_mappings() } /// Returns the total iota supply. - public(package) fun get_total_iota_supply(self: &IotaSystemStateV1): u64 { + public(package) fun get_total_iota_supply(self: &IotaSystemStateV2): u64 { self.iota_treasury_cap.total_supply() } /// Returns all the validators who are currently reporting `addr` - public(package) fun get_reporters_of(self: &IotaSystemStateV1, addr: address): VecSet
{ + public(package) fun get_reporters_of(self: &IotaSystemStateV2, addr: address): VecSet
{ if (self.validator_report_records.contains(&addr)) { self.validator_report_records[&addr] @@ -847,23 +940,23 @@ module iota_system::iota_system_state_inner { } } - public(package) fun get_storage_fund_total_balance(self: &IotaSystemStateV1): u64 { + public(package) fun get_storage_fund_total_balance(self: &IotaSystemStateV2): u64 { self.storage_fund.total_balance() } - public(package) fun get_storage_fund_object_rebates(self: &IotaSystemStateV1): u64 { + public(package) fun get_storage_fund_object_rebates(self: &IotaSystemStateV2): u64 { self.storage_fund.total_object_storage_rebates() } public(package) fun pool_exchange_rates( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, pool_id: &ID ): &Table { let validators = &mut self.validators; validators.pool_exchange_rates(pool_id) } - public(package) fun active_validator_addresses(self: &IotaSystemStateV1): vector
{ + public(package) fun active_validator_addresses(self: &IotaSystemStateV2): vector
{ let validator_set = &self.validators; validator_set.active_validator_addresses() } @@ -893,36 +986,36 @@ module iota_system::iota_system_state_inner { #[test_only] /// Return the current validator set - public(package) fun validators(self: &IotaSystemStateV1): &ValidatorSetV1 { + public(package) fun validators(self: &IotaSystemStateV2): &ValidatorSet { &self.validators } #[test_only] /// Return the currently active validator by address - public(package) fun active_validator_by_address(self: &IotaSystemStateV1, validator_address: address): &ValidatorV1 { + public(package) fun active_validator_by_address(self: &IotaSystemStateV2, validator_address: address): &ValidatorV1 { self.validators().get_active_validator_ref(validator_address) } #[test_only] /// Return the currently pending validator by address - public(package) fun pending_validator_by_address(self: &IotaSystemStateV1, validator_address: address): &ValidatorV1 { + public(package) fun pending_validator_by_address(self: &IotaSystemStateV2, validator_address: address): &ValidatorV1 { self.validators().get_pending_validator_ref(validator_address) } #[test_only] /// Return the currently candidate validator by address - public(package) fun candidate_validator_by_address(self: &IotaSystemStateV1, validator_address: address): &ValidatorV1 { + public(package) fun candidate_validator_by_address(self: &IotaSystemStateV2, validator_address: address): &ValidatorV1 { validators(self).get_candidate_validator_ref(validator_address) } #[test_only] - public(package) fun set_epoch_for_testing(self: &mut IotaSystemStateV1, epoch_num: u64) { + public(package) fun set_epoch_for_testing(self: &mut IotaSystemStateV2, epoch_num: u64) { self.epoch = epoch_num } #[test_only] public(package) fun request_add_validator_for_testing( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, min_joining_stake_for_testing: u64, ctx: &TxContext, ) { @@ -939,7 +1032,7 @@ module iota_system::iota_system_state_inner { // in the process. #[test_only] public(package) fun request_add_validator_candidate_for_testing( - self: &mut IotaSystemStateV1, + self: &mut IotaSystemStateV2, pubkey_bytes: vector, network_pubkey_bytes: vector, protocol_pubkey_bytes: vector, diff --git a/crates/iota-framework/packages/iota-system/sources/validator_set.move b/crates/iota-framework/packages/iota-system/sources/validator_set.move index b0579a00205..bd26bf02084 100644 --- a/crates/iota-framework/packages/iota-system/sources/validator_set.move +++ b/crates/iota-framework/packages/iota-system/sources/validator_set.move @@ -8,6 +8,7 @@ module iota_system::validator_set { use iota::iota::IOTA; use iota_system::validator::{ValidatorV1, staking_pool_id, iota_address}; use iota_system::validator_cap::{Self, UnverifiedValidatorOperationCap, ValidatorOperationCap}; + use iota_system::validator_set_v2::{Self, ValidatorSet}; use iota_system::staking_pool::{PoolTokenExchangeRate, StakedIota, pool_id}; use iota::priority_queue as pq; use iota::vec_map::{Self, VecMap}; @@ -146,6 +147,30 @@ module iota_system::validator_set { validators } + public(package) fun v1_to_v2(self: ValidatorSetV1): ValidatorSet { + let ValidatorSetV1 { + total_stake, + active_validators, + pending_active_validators, + pending_removals, + staking_pool_mappings, + inactive_validators, + validator_candidates, + at_risk_validators, + extra_fields, + } = self; + validator_set_v2::import( + total_stake, + active_validators, + pending_active_validators, + pending_removals, + staking_pool_mappings, + inactive_validators, + validator_candidates, + at_risk_validators, + extra_fields, + ) + } // ==== functions to add or remove validators ==== diff --git a/crates/iota-framework/packages/iota-system/sources/validator_set_v2.move b/crates/iota-framework/packages/iota-system/sources/validator_set_v2.move new file mode 100644 index 00000000000..748861c7e49 --- /dev/null +++ b/crates/iota-framework/packages/iota-system/sources/validator_set_v2.move @@ -0,0 +1,1223 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +module iota_system::validator_set_v2 { + + use iota::balance::Balance; + use iota::iota::IOTA; + use iota_system::validator::{ValidatorV1, staking_pool_id, iota_address}; + use iota_system::validator_cap::{Self, UnverifiedValidatorOperationCap, ValidatorOperationCap}; + use iota_system::staking_pool::{PoolTokenExchangeRate, StakedIota, pool_id}; + use iota::priority_queue as pq; + use iota::vec_map::{Self, VecMap}; + use iota::vec_set::VecSet; + use iota::table::{Self, Table}; + use iota::event; + use iota::table_vec::{Self, TableVec}; + use iota_system::voting_power; + use iota_system::validator_wrapper::Validator; + use iota_system::validator_wrapper; + use iota::bag::Bag; + use iota::bag; + + public struct ValidatorSet has store { + /// Total amount of stake from all active validators at the beginning of the epoch. + total_stake: u64, + + /// The current list of active validators. + active_validators: vector, + + /// Subset of validators responsible for consensus. Each element is an index + /// pointing to `active_validators`. + committee_members: vector, + + /// List of new validator candidates added during the current epoch. + /// They will be processed at the end of the epoch. + pending_active_validators: TableVec, + + /// Removal requests from the validators. Each element is an index + /// pointing to `active_validators`. + pending_removals: vector, + + /// Mappings from staking pool's ID to the iota address of a validator. + staking_pool_mappings: Table, + + /// Mapping from a staking pool ID to the inactive validator that has that pool as its staking pool. + /// When a validator is deactivated the validator is removed from `active_validators` it + /// is added to this table so that stakers can continue to withdraw their stake from it. + inactive_validators: Table, + + /// Table storing preactive/candidate validators, mapping their addresses to their `ValidatorV1 ` structs. + /// When an address calls `request_add_validator_candidate`, they get added to this table and become a preactive + /// validator. + /// When the candidate has met the min stake requirement, they can call `request_add_validator` to + /// officially add them to the active validator set `active_validators` next epoch. + validator_candidates: Table, + + /// Table storing the number of epochs during which a validator's stake has been below the low stake threshold. + at_risk_validators: VecMap, + + /// Any extra fields that's not defined statically. + extra_fields: Bag, + } + + #[allow(unused_field)] + /// Event containing staking and rewards related information of + /// each validator, emitted during epoch advancement. + public struct ValidatorEpochInfoEventV1 has copy, drop { + epoch: u64, + validator_address: address, + reference_gas_survey_quote: u64, + stake: u64, + voting_power: u64, + commission_rate: u64, + pool_staking_reward: u64, + pool_token_exchange_rate: PoolTokenExchangeRate, + tallying_rule_reporters: vector
, + tallying_rule_global_score: u64, + } + + /// Event emitted every time a new validator joins the committee. + /// The epoch value corresponds to the first epoch this change takes place. + public struct ValidatorJoinEvent has copy, drop { + epoch: u64, + validator_address: address, + staking_pool_id: ID, + } + + /// Event emitted every time a validator leaves the committee. + /// The epoch value corresponds to the first epoch this change takes place. + public struct ValidatorLeaveEvent has copy, drop { + epoch: u64, + validator_address: address, + staking_pool_id: ID, + is_voluntary: bool, + } + + // same as in iota_system + const ACTIVE_VALIDATOR_ONLY: u8 = 1; + const ACTIVE_OR_PENDING_VALIDATOR: u8 = 2; + const ANY_VALIDATOR: u8 = 3; + + const BASIS_POINT_DENOMINATOR: u128 = 10000; + const MIN_STAKING_THRESHOLD: u64 = 1_000_000_000; // 1 IOTA + + // Errors + const ENonValidatorInReportRecords: u64 = 0; + #[allow(unused_const)] + const EInvalidStakeAdjustmentAmount: u64 = 1; + const EDuplicateValidator: u64 = 2; + const ENoPoolFound: u64 = 3; + const ENotAValidator: u64 = 4; + const EMinJoiningStakeNotReached: u64 = 5; + const EAlreadyValidatorCandidate: u64 = 6; + const EValidatorNotCandidate: u64 = 7; + const ENotValidatorCandidate: u64 = 8; + const ENotActiveOrPendingValidator: u64 = 9; + const EStakingBelowThreshold: u64 = 10; + const EValidatorAlreadyRemoved: u64 = 11; + const ENotAPendingValidator: u64 = 12; + const EValidatorSetEmpty: u64 = 13; + + const EInvalidCap: u64 = 101; + + + // ==== initialization at genesis ==== + + public(package) fun import( + total_stake: u64, + active_validators: vector, + pending_active_validators: TableVec, + pending_removals: vector, + staking_pool_mappings: Table, + inactive_validators: Table, + validator_candidates: Table, + at_risk_validators: VecMap, + extra_fields: Bag, + ): ValidatorSet { + let mut validators = ValidatorSet { + total_stake, + active_validators, + committee_members: vector[], + pending_active_validators, + pending_removals, + staking_pool_mappings, + inactive_validators, + validator_candidates, + at_risk_validators, + extra_fields, + }; + validators.select_committee_members(); + validators + } + + public(package) fun new(init_active_validators: vector, ctx: &mut TxContext): ValidatorSet { + let total_stake = calculate_total_stakes(&init_active_validators); + let mut staking_pool_mappings = table::new(ctx); + let num_validators = init_active_validators.length(); + let mut i = 0; + while (i < num_validators) { + let validator = &init_active_validators[i]; + staking_pool_mappings.add(staking_pool_id(validator), iota_address(validator)); + i = i + 1; + }; + let mut validators = ValidatorSet { + total_stake, + active_validators: init_active_validators, + committee_members: vector[], + pending_active_validators: table_vec::empty(ctx), + pending_removals: vector[], + staking_pool_mappings, + inactive_validators: table::new(ctx), + validator_candidates: table::new(ctx), + at_risk_validators: vec_map::empty(), + extra_fields: bag::new(ctx), + }; + voting_power::set_voting_power(&mut validators.active_validators); + validators.select_committee_members(); + validators + } + + // ==== functions to add or remove validators ==== + + /// Called by `iota_system` to add a new validator candidate. + public(package) fun request_add_validator_candidate( + self: &mut ValidatorSet, + validator: ValidatorV1, + ctx: &mut TxContext, + ) { + // The next assertions are not critical for the protocol, but they are here to catch problematic configs earlier. + assert!( + !is_duplicate_with_active_validator(self, &validator) + && !is_duplicate_with_pending_validator(self, &validator), + EDuplicateValidator + ); + let validator_address = iota_address(&validator); + assert!( + !self.validator_candidates.contains(validator_address), + EAlreadyValidatorCandidate + ); + + assert!(validator.is_preactive(), EValidatorNotCandidate); + // Add validator to the candidates mapping and the pool id mappings so that users can start + // staking with this candidate. + self.staking_pool_mappings.add(staking_pool_id(&validator), validator_address); + self.validator_candidates.add( + iota_address(&validator), + validator_wrapper::create_v1(validator, ctx), + ); + } + + /// Called by `iota_system` to remove a validator candidate, and move them to `inactive_validators`. + public(package) fun request_remove_validator_candidate(self: &mut ValidatorSet, ctx: &mut TxContext) { + let validator_address = ctx.sender(); + assert!( + self.validator_candidates.contains(validator_address), + ENotValidatorCandidate + ); + let wrapper = self.validator_candidates.remove(validator_address); + let mut validator = wrapper.destroy(); + assert!(validator.is_preactive(), EValidatorNotCandidate); + + let staking_pool_id = staking_pool_id(&validator); + + // Remove the validator's staking pool from mappings. + self.staking_pool_mappings.remove(staking_pool_id); + + // Deactivate the staking pool. + validator.deactivate(ctx.epoch()); + + // Add to the inactive tables. + self.inactive_validators.add( + staking_pool_id, + validator_wrapper::create_v1(validator, ctx), + ); + } + + /// Called by `iota_system` to add a new validator to `pending_active_validators`, which will be + /// processed at the end of epoch. + public(package) fun request_add_validator(self: &mut ValidatorSet, min_joining_stake_amount: u64, ctx: &TxContext) { + let validator_address = ctx.sender(); + assert!( + self.validator_candidates.contains(validator_address), + ENotValidatorCandidate + ); + let wrapper = self.validator_candidates.remove(validator_address); + let validator = wrapper.destroy(); + assert!( + !is_duplicate_with_active_validator(self, &validator) + && !is_duplicate_with_pending_validator(self, &validator), + EDuplicateValidator + ); + assert!(validator.is_preactive(), EValidatorNotCandidate); + assert!(validator.total_stake_amount() >= min_joining_stake_amount, EMinJoiningStakeNotReached); + + self.pending_active_validators.push_back(validator); + } + + public(package) fun assert_no_pending_or_active_duplicates(self: &ValidatorSet, validator: &ValidatorV1) { + // Validator here must be active or pending, and thus must be identified as duplicate exactly once. + assert!( + count_duplicates_vec(&self.active_validators, validator) + + count_duplicates_tablevec(&self.pending_active_validators, validator) == 1, + EDuplicateValidator + ); + } + + /// Called by `iota_system`, to remove a validator. + /// The index of the validator is added to `pending_removals` and + /// will be processed at the end of epoch. + /// Only an active validator can request to be removed. + public(package) fun request_remove_validator( + self: &mut ValidatorSet, + ctx: &TxContext, + ) { + let validator_address = ctx.sender(); + let mut validator_index_opt = find_validator(&self.active_validators, validator_address); + assert!(validator_index_opt.is_some(), ENotAValidator); + let validator_index = validator_index_opt.extract(); + assert!( + !self.pending_removals.contains(&validator_index), + EValidatorAlreadyRemoved + ); + self.pending_removals.push_back(validator_index); + } + + + // ==== staking related functions ==== + + /// Called by `iota_system`, to add a new stake to the validator. + /// This request is added to the validator's staking pool's pending stake entries, processed at the end + /// of the epoch. + /// Aborts in case the staking amount is smaller than MIN_STAKING_THRESHOLD + public(package) fun request_add_stake( + self: &mut ValidatorSet, + validator_address: address, + stake: Balance, + ctx: &mut TxContext, + ) : StakedIota { + let iota_amount = stake.value(); + assert!(iota_amount >= MIN_STAKING_THRESHOLD, EStakingBelowThreshold); + let validator = get_candidate_or_active_validator_mut(self, validator_address); + validator.request_add_stake(stake, ctx.sender(), ctx) + } + + /// Called by `iota_system`, to withdraw some share of a stake from the validator. The share to withdraw + /// is denoted by `principal_withdraw_amount`. One of two things occurs in this function: + /// 1. If the `staked_iota` is staked with an active validator, the request is added to the validator's + /// staking pool's pending stake withdraw entries, processed at the end of the epoch. + /// 2. If the `staked_iota` was staked with a validator that is no longer active, + /// the stake and any rewards corresponding to it will be immediately processed. + public(package) fun request_withdraw_stake( + self: &mut ValidatorSet, + staked_iota: StakedIota, + ctx: &TxContext, + ) : Balance { + let staking_pool_id = pool_id(&staked_iota); + let validator = + if (self.staking_pool_mappings.contains(staking_pool_id)) { // This is an active validator. + let validator_address = self.staking_pool_mappings[pool_id(&staked_iota)]; + get_candidate_or_active_validator_mut(self, validator_address) + } else { // This is an inactive pool. + assert!(self.inactive_validators.contains(staking_pool_id), ENoPoolFound); + let wrapper = &mut self.inactive_validators[staking_pool_id]; + wrapper.load_validator_maybe_upgrade() + }; + validator.request_withdraw_stake(staked_iota, ctx) + } + + // ==== validator config setting functions ==== + + public(package) fun request_set_commission_rate( + self: &mut ValidatorSet, + new_commission_rate: u64, + ctx: &TxContext, + ) { + let validator_address = ctx.sender(); + let validator = get_validator_mut(&mut self.active_validators, validator_address); + validator.request_set_commission_rate(new_commission_rate); + } + + + // ==== epoch change functions ==== + + /// Update the validator set at the end of epoch. + /// It does the following things: + /// 1. Distribute stake award. + /// 2. Process pending stake deposits and withdraws for each validator (`adjust_stake`). + /// 3. Process pending stake deposits, and withdraws. + /// 4. Process pending validator application and withdraws. + /// 5. At the end, we calculate the total stake for the new epoch. + public(package) fun advance_epoch( + self: &mut ValidatorSet, + total_validator_rewards: &mut Balance, + validator_report_records: &mut VecMap>, + reward_slashing_rate: u64, + low_stake_threshold: u64, + very_low_stake_threshold: u64, + low_stake_grace_period: u64, + ctx: &mut TxContext, + ) { + let new_epoch = ctx.epoch() + 1; + let total_voting_power = voting_power::total_voting_power(); + + // Compute the reward distribution without taking into account the tallying rule slashing. + let unadjusted_staking_reward_amounts = compute_unadjusted_reward_distribution( + &self.active_validators, + total_voting_power, + total_validator_rewards.value(), + ); + + // Use the tallying rule report records for the epoch to compute validators that will be + // punished. + let slashed_validators = compute_slashed_validators(self, *validator_report_records); + + let total_slashed_validator_voting_power = sum_voting_power_by_addresses(&self.active_validators, &slashed_validators); + + // Compute the reward adjustments of slashed validators, to be taken into + // account in adjusted reward computation. + let (total_staking_reward_adjustment, individual_staking_reward_adjustments) = + compute_reward_adjustments( + get_validator_indices(&self.active_validators, &slashed_validators), + reward_slashing_rate, + &unadjusted_staking_reward_amounts, + ); + + // Compute the adjusted amounts of stake each validator should get given the tallying rule + // reward adjustments we computed before. + // `compute_adjusted_reward_distribution` must be called before `distribute_reward` and `adjust_stake_and_gas_price` to + // make sure we are using the current epoch's stake information to compute reward distribution. + let adjusted_staking_reward_amounts = compute_adjusted_reward_distribution( + &self.active_validators, + total_voting_power, + total_slashed_validator_voting_power, + unadjusted_staking_reward_amounts, + total_staking_reward_adjustment, + individual_staking_reward_adjustments, + ); + + // Distribute the rewards before adjusting stake so that we immediately start compounding + // the rewards for validators and stakers. + distribute_reward( + &mut self.active_validators, + &adjusted_staking_reward_amounts, + total_validator_rewards, + ctx + ); + + adjust_stake_and_gas_price(&mut self.active_validators); + + process_pending_stakes_and_withdraws(&mut self.active_validators, ctx); + + // Emit events after we have processed all the rewards distribution and pending stakes. + emit_validator_epoch_events(new_epoch, &self.active_validators, &adjusted_staking_reward_amounts, + validator_report_records, &slashed_validators); + + // Note that all their staged next epoch metadata will be effectuated below. + process_pending_validators(self, new_epoch); + + process_pending_removals(self, validator_report_records, ctx); + + // kick low stake validators out. + update_and_process_low_stake_departures( + self, + low_stake_threshold, + very_low_stake_threshold, + low_stake_grace_period, + validator_report_records, + ctx + ); + + self.total_stake = calculate_total_stakes(&self.active_validators); + + voting_power::set_voting_power(&mut self.active_validators); + + // At this point, self.active_validators are updated for next epoch. + // Now we process the staged validator metadata. + effectuate_staged_metadata(self); + + self.select_committee_members(); + } + + fun update_and_process_low_stake_departures( + self: &mut ValidatorSet, + low_stake_threshold: u64, + very_low_stake_threshold: u64, + low_stake_grace_period: u64, + validator_report_records: &mut VecMap>, + ctx: &mut TxContext + ) { + // Iterate through all the active validators, record their low stake status, and kick them out if the condition is met. + let mut i = self.active_validators.length(); + while (i > 0) { + i = i - 1; + let validator_ref = &self.active_validators[i]; + let validator_address = validator_ref.iota_address(); + let stake = validator_ref.total_stake_amount(); + if (stake >= low_stake_threshold) { + // The validator is safe. We remove their entry from the at_risk map if there exists one. + if (self.at_risk_validators.contains(&validator_address)) { + self.at_risk_validators.remove(&validator_address); + } + } else if (stake >= very_low_stake_threshold) { + // The stake is a bit below the threshold so we increment the entry of the validator in the map. + let new_low_stake_period = + if (self.at_risk_validators.contains(&validator_address)) { + let num_epochs = &mut self.at_risk_validators[&validator_address]; + *num_epochs = *num_epochs + 1; + *num_epochs + } else { + self.at_risk_validators.insert(validator_address, 1); + 1 + }; + + // If the grace period has passed, the validator has to leave us. + if (new_low_stake_period > low_stake_grace_period) { + let validator = self.active_validators.remove(i); + process_validator_departure(self, validator, validator_report_records, false /* the validator is kicked out involuntarily */, ctx); + } + } else { + // The validator's stake is lower than the very low threshold so we kick them out immediately. + let validator = self.active_validators.remove(i); + process_validator_departure(self, validator, validator_report_records, false /* the validator is kicked out involuntarily */, ctx); + } + } + } + + /// Effectutate pending next epoch metadata if they are staged. + fun effectuate_staged_metadata( + self: &mut ValidatorSet, + ) { + let num_validators = self.active_validators.length(); + let mut i = 0; + while (i < num_validators) { + let validator = &mut self.active_validators[i]; + validator.effectuate_staged_metadata(); + i = i + 1; + } + } + + + /// Called by `iota_system` to derive reference gas price for the new epoch. + /// Derive the reference gas price based on the gas price quote submitted by each validator. + /// The returned gas price should be greater than or equal to 2/3 of the validators submitted + /// gas price, weighted by stake. + public fun derive_reference_gas_price(self: &ValidatorSet): u64 { + let vs = &self.active_validators; + let num_validators = vs.length(); + let mut entries = vector[]; + let mut i = 0; + while (i < num_validators) { + let v = &vs[i]; + entries.push_back( + pq::new_entry(v.gas_price(), v.voting_power()) + ); + i = i + 1; + }; + // Build a priority queue that will pop entries with gas price from the highest to the lowest. + let mut pq = pq::new(entries); + let mut sum = 0; + let threshold = voting_power::total_voting_power() - voting_power::quorum_threshold(); + let mut result = 0; + while (sum < threshold) { + let (gas_price, voting_power) = pq.pop_max(); + result = gas_price; + sum = sum + voting_power; + }; + result + } + + // ==== getter functions ==== + + public fun total_stake(self: &ValidatorSet): u64 { + self.total_stake + } + + public fun validator_total_stake_amount(self: &ValidatorSet, validator_address: address): u64 { + let validator = get_validator_ref(&self.active_validators, validator_address); + validator.total_stake_amount() + } + + public fun validator_stake_amount(self: &ValidatorSet, validator_address: address): u64 { + let validator = get_validator_ref(&self.active_validators, validator_address); + validator.stake_amount() + } + + public fun validator_voting_power(self: &ValidatorSet, validator_address: address): u64 { + let validator = get_validator_ref(&self.active_validators, validator_address); + validator.voting_power() + } + + public fun validator_staking_pool_id(self: &ValidatorSet, validator_address: address): ID { + let validator = get_validator_ref(&self.active_validators, validator_address); + validator.staking_pool_id() + } + + public fun staking_pool_mappings(self: &ValidatorSet): &Table { + &self.staking_pool_mappings + } + + public(package) fun pool_exchange_rates( + self: &mut ValidatorSet, pool_id: &ID + ) : &Table { + let validator = + // If the pool id is recorded in the mapping, then it must be either candidate or active. + if (self.staking_pool_mappings.contains(*pool_id)) { + let validator_address = self.staking_pool_mappings[*pool_id]; + get_active_or_pending_or_candidate_validator_ref(self, validator_address, ANY_VALIDATOR) + } else { // otherwise it's inactive + let wrapper = &mut self.inactive_validators[*pool_id]; + wrapper.load_validator_maybe_upgrade() + }; + validator.get_staking_pool_ref().exchange_rates() + } + + /// Get the total number of validators in the next epoch. + public(package) fun next_epoch_validator_count(self: &ValidatorSet): u64 { + self.active_validators.length() - self.pending_removals.length() + self.pending_active_validators.length() + } + + /// Returns true iff the address exists in active validators. + public(package) fun is_active_validator_by_iota_address( + self: &ValidatorSet, + validator_address: address, + ): bool { + find_validator(&self.active_validators, validator_address).is_some() + } + + // ==== private helpers ==== + + /// Checks whether `new_validator` is duplicate with any currently active validators. + /// It differs from `is_active_validator_by_iota_address` in that the former checks + /// only the iota address but this function looks at more metadata. + fun is_duplicate_with_active_validator(self: &ValidatorSet, new_validator: &ValidatorV1): bool { + is_duplicate_validator(&self.active_validators, new_validator) + } + + public(package) fun is_duplicate_validator(validators: &vector, new_validator: &ValidatorV1): bool { + count_duplicates_vec(validators, new_validator) > 0 + } + + fun count_duplicates_vec(validators: &vector, validator: &ValidatorV1): u64 { + let len = validators.length(); + let mut i = 0; + let mut result = 0; + while (i < len) { + let v = &validators[i]; + if (v.is_duplicate(validator)) { + result = result + 1; + }; + i = i + 1; + }; + result + } + + /// Checks whether `new_validator` is duplicate with any currently pending validators. + fun is_duplicate_with_pending_validator(self: &ValidatorSet, new_validator: &ValidatorV1): bool { + count_duplicates_tablevec(&self.pending_active_validators, new_validator) > 0 + } + + fun count_duplicates_tablevec(validators: &TableVec, validator: &ValidatorV1): u64 { + let len = validators.length(); + let mut i = 0; + let mut result = 0; + while (i < len) { + let v = &validators[i]; + if (v.is_duplicate(validator)) { + result = result + 1; + }; + i = i + 1; + }; + result + } + + /// Get mutable reference to either a candidate or an active validator by address. + fun get_candidate_or_active_validator_mut(self: &mut ValidatorSet, validator_address: address): &mut ValidatorV1 { + if (self.validator_candidates.contains(validator_address)) { + let wrapper = &mut self.validator_candidates[validator_address]; + return wrapper.load_validator_maybe_upgrade() + }; + get_validator_mut(&mut self.active_validators, validator_address) + } + + /// Find validator by `validator_address`, in `validators`. + /// Returns (true, index) if the validator is found, and the index is its index in the list. + /// If not found, returns (false, 0). + fun find_validator(validators: &vector, validator_address: address): Option { + let length = validators.length(); + let mut i = 0; + while (i < length) { + let v = &validators[i]; + if (v.iota_address() == validator_address) { + return option::some(i) + }; + i = i + 1; + }; + option::none() + } + + /// Find validator by `validator_address`, in `validators`. + /// Returns (true, index) if the validator is found, and the index is its index in the list. + /// If not found, returns (false, 0). + fun find_validator_from_table_vec(validators: &TableVec, validator_address: address): Option { + let length = validators.length(); + let mut i = 0; + while (i < length) { + let v = &validators[i]; + if (v.iota_address() == validator_address) { + return option::some(i) + }; + i = i + 1; + }; + option::none() + } + + + /// Given a vector of validator addresses, return their indices in the validator set. + /// Aborts if any address isn't in the given validator set. + fun get_validator_indices(validators: &vector, validator_addresses: &vector
): vector { + let length = validator_addresses.length(); + let mut i = 0; + let mut res = vector[]; + while (i < length) { + let addr = validator_addresses[i]; + let index_opt = find_validator(validators, addr); + assert!(index_opt.is_some(), ENotAValidator); + res.push_back(index_opt.destroy_some()); + i = i + 1; + }; + res + } + + public(package) fun get_validator_mut( + validators: &mut vector, + validator_address: address, + ): &mut ValidatorV1 { + let mut validator_index_opt = find_validator(validators, validator_address); + assert!(validator_index_opt.is_some(), ENotAValidator); + let validator_index = validator_index_opt.extract(); + &mut validators[validator_index] + } + + /// Get mutable reference to an active or (if active does not exist) pending or (if pending and + /// active do not exist) or candidate validator by address. + /// Note: this function should be called carefully, only after verifying the transaction + /// sender has the ability to modify the `ValidatorV1`. + fun get_active_or_pending_or_candidate_validator_mut( + self: &mut ValidatorSet, + validator_address: address, + include_candidate: bool, + ): &mut ValidatorV1 { + let mut validator_index_opt = find_validator(&self.active_validators, validator_address); + if (validator_index_opt.is_some()) { + let validator_index = validator_index_opt.extract(); + return &mut self.active_validators[validator_index] + }; + let mut validator_index_opt = find_validator_from_table_vec(&self.pending_active_validators, validator_address); + // consider both pending validators and the candidate ones + if (validator_index_opt.is_some()) { + let validator_index = validator_index_opt.extract(); + return &mut self.pending_active_validators[validator_index] + }; + assert!(include_candidate, ENotActiveOrPendingValidator); + let wrapper = &mut self.validator_candidates[validator_address]; + wrapper.load_validator_maybe_upgrade() + } + + public(package) fun get_validator_mut_with_verified_cap( + self: &mut ValidatorSet, + verified_cap: &ValidatorOperationCap, + include_candidate: bool, + ): &mut ValidatorV1 { + get_active_or_pending_or_candidate_validator_mut(self, *verified_cap.verified_operation_cap_address(), include_candidate) + } + + public(package) fun get_validator_mut_with_ctx( + self: &mut ValidatorSet, + ctx: &TxContext, + ): &mut ValidatorV1 { + let validator_address = ctx.sender(); + get_active_or_pending_or_candidate_validator_mut(self, validator_address, false) + } + + public(package) fun get_validator_mut_with_ctx_including_candidates( + self: &mut ValidatorSet, + ctx: &TxContext, + ): &mut ValidatorV1 { + let validator_address = ctx.sender(); + get_active_or_pending_or_candidate_validator_mut(self, validator_address, true) + } + + fun get_validator_ref( + validators: &vector, + validator_address: address, + ): &ValidatorV1 { + let mut validator_index_opt = find_validator(validators, validator_address); + assert!(validator_index_opt.is_some(), ENotAValidator); + let validator_index = validator_index_opt.extract(); + &validators[validator_index] + } + + public(package) fun get_active_or_pending_or_candidate_validator_ref( + self: &mut ValidatorSet, + validator_address: address, + which_validator: u8, + ): &ValidatorV1 { + let mut validator_index_opt = find_validator(&self.active_validators, validator_address); + if (validator_index_opt.is_some() || which_validator == ACTIVE_VALIDATOR_ONLY) { + let validator_index = validator_index_opt.extract(); + return &self.active_validators[validator_index] + }; + let mut validator_index_opt = find_validator_from_table_vec(&self.pending_active_validators, validator_address); + if (validator_index_opt.is_some() || which_validator == ACTIVE_OR_PENDING_VALIDATOR) { + let validator_index = validator_index_opt.extract(); + return &self.pending_active_validators[validator_index] + }; + self.validator_candidates[validator_address].load_validator_maybe_upgrade() + } + + public fun get_active_validator_ref( + self: &ValidatorSet, + validator_address: address, + ): &ValidatorV1 { + let mut validator_index_opt = find_validator(&self.active_validators, validator_address); + assert!(validator_index_opt.is_some(), ENotAValidator); + let validator_index = validator_index_opt.extract(); + &self.active_validators[validator_index] + } + + public fun get_pending_validator_ref( + self: &ValidatorSet, + validator_address: address, + ): &ValidatorV1 { + let mut validator_index_opt = find_validator_from_table_vec(&self.pending_active_validators, validator_address); + assert!(validator_index_opt.is_some(), ENotAPendingValidator); + let validator_index = validator_index_opt.extract(); + &self.pending_active_validators[validator_index] + } + + #[test_only] + public fun get_candidate_validator_ref( + self: &ValidatorSet, + validator_address: address, + ): &ValidatorV1 { + self.validator_candidates[validator_address].get_inner_validator_ref() + } + + /// Verify the capability is valid for a Validator. + /// If `active_validator_only` is true, only verify the Cap for an active validator. + /// Otherwise, verify the Cap for au either active or pending validator. + public(package) fun verify_cap( + self: &mut ValidatorSet, + cap: &UnverifiedValidatorOperationCap, + which_validator: u8, + ): ValidatorOperationCap { + let cap_address = *cap.unverified_operation_cap_address(); + let validator = + if (which_validator == ACTIVE_VALIDATOR_ONLY) + get_active_validator_ref(self, cap_address) + else + get_active_or_pending_or_candidate_validator_ref(self, cap_address, which_validator); + assert!(validator.operation_cap_id() == &object::id(cap), EInvalidCap); + validator_cap::new_from_unverified(cap) + } + + /// Process the pending withdraw requests. For each pending request, the validator + /// is removed from `validators` and its staking pool is put into the `inactive_validators` table. + fun process_pending_removals( + self: &mut ValidatorSet, + validator_report_records: &mut VecMap>, + ctx: &mut TxContext, + ) { + sort_removal_list(&mut self.pending_removals); + while (!self.pending_removals.is_empty()) { + let index = self.pending_removals.pop_back(); + let validator = self.active_validators.remove(index); + process_validator_departure(self, validator, validator_report_records, true /* the validator removes itself voluntarily */, ctx); + } + } + + fun process_validator_departure( + self: &mut ValidatorSet, + mut validator: ValidatorV1, + validator_report_records: &mut VecMap>, + is_voluntary: bool, + ctx: &mut TxContext, + ) { + let new_epoch = ctx.epoch() + 1; + let validator_address = validator.iota_address(); + let validator_pool_id = staking_pool_id(&validator); + + // Remove the validator from our tables. + self.staking_pool_mappings.remove(validator_pool_id); + if (self.at_risk_validators.contains(&validator_address)) { + self.at_risk_validators.remove(&validator_address); + }; + + self.total_stake = self.total_stake - validator.total_stake_amount(); + + clean_report_records_leaving_validator(validator_report_records, validator_address); + + event::emit( + ValidatorLeaveEvent { + epoch: new_epoch, + validator_address, + staking_pool_id: staking_pool_id(&validator), + is_voluntary, + } + ); + + // Deactivate the validator and its staking pool + validator.deactivate(new_epoch); + self.inactive_validators.add( + validator_pool_id, + validator_wrapper::create_v1(validator, ctx), + ); + } + + fun clean_report_records_leaving_validator( + validator_report_records: &mut VecMap>, + leaving_validator_addr: address + ) { + // Remove the records about this validator + if (validator_report_records.contains(&leaving_validator_addr)) { + validator_report_records.remove(&leaving_validator_addr); + }; + + // Remove the reports submitted by this validator + let reported_validators = validator_report_records.keys(); + let length = reported_validators.length(); + let mut i = 0; + while (i < length) { + let reported_validator_addr = &reported_validators[i]; + let reporters = &mut validator_report_records[reported_validator_addr]; + if (reporters.contains(&leaving_validator_addr)) { + reporters.remove(&leaving_validator_addr); + if (reporters.is_empty()) { + validator_report_records.remove(reported_validator_addr); + }; + }; + i = i + 1; + } + } + + /// Process the pending new validators. They are activated and inserted into `validators`. + fun process_pending_validators( + self: &mut ValidatorSet, new_epoch: u64, + ) { + while (!self.pending_active_validators.is_empty()) { + let mut validator = self.pending_active_validators.pop_back(); + validator.activate(new_epoch); + event::emit( + ValidatorJoinEvent { + epoch: new_epoch, + validator_address: validator.iota_address(), + staking_pool_id: staking_pool_id(&validator), + } + ); + self.active_validators.push_back(validator); + } + } + + /// Sort all the pending removal indexes. + fun sort_removal_list(withdraw_list: &mut vector) { + let length = withdraw_list.length(); + let mut i = 1; + while (i < length) { + let cur = withdraw_list[i]; + let mut j = i; + while (j > 0) { + j = j - 1; + if (withdraw_list[j] > cur) { + withdraw_list.swap(j, j + 1); + } else { + break + }; + }; + i = i + 1; + }; + } + + /// Process all active validators' pending stake deposits and withdraws. + fun process_pending_stakes_and_withdraws( + validators: &mut vector, ctx: &TxContext + ) { + let length = validators.length(); + let mut i = 0; + while (i < length) { + let validator = &mut validators[i]; + validator.process_pending_stakes_and_withdraws(ctx); + i = i + 1; + } + } + + /// Calculate the total active validator stake. + fun calculate_total_stakes(validators: &vector): u64 { + let mut stake = 0; + let length = validators.length(); + let mut i = 0; + while (i < length) { + let v = &validators[i]; + stake = stake + v.total_stake_amount(); + i = i + 1; + }; + stake + } + + /// Process the pending stake changes for each validator. + fun adjust_stake_and_gas_price(validators: &mut vector) { + let length = validators.length(); + let mut i = 0; + while (i < length) { + let validator = &mut validators[i]; + validator.adjust_stake_and_gas_price(); + i = i + 1; + } + } + + /// Compute both the individual reward adjustments and total reward adjustment for staking rewards. + fun compute_reward_adjustments( + mut slashed_validator_indices: vector, + reward_slashing_rate: u64, + unadjusted_staking_reward_amounts: &vector, + ): ( + u64, // sum of staking reward adjustments + VecMap, // mapping of individual validator's staking reward adjustment from index -> amount + ) { + let mut total_staking_reward_adjustment = 0; + let mut individual_staking_reward_adjustments = vec_map::empty(); + + while (!slashed_validator_indices.is_empty()) { + let validator_index = slashed_validator_indices.pop_back(); + + // Use the slashing rate to compute the amount of staking rewards slashed from this punished validator. + let unadjusted_staking_reward = unadjusted_staking_reward_amounts[validator_index]; + let staking_reward_adjustment_u128 = + unadjusted_staking_reward as u128 * (reward_slashing_rate as u128) + / BASIS_POINT_DENOMINATOR; + + // Insert into individual mapping and record into the total adjustment sum. + individual_staking_reward_adjustments.insert(validator_index, staking_reward_adjustment_u128 as u64); + total_staking_reward_adjustment = total_staking_reward_adjustment + (staking_reward_adjustment_u128 as u64); + }; + + (total_staking_reward_adjustment, individual_staking_reward_adjustments) + } + + /// Process the validator report records of the epoch and return the addresses of the + /// non-performant validators according to the input threshold. + fun compute_slashed_validators( + self: &ValidatorSet, + mut validator_report_records: VecMap>, + ): vector
{ + let mut slashed_validators = vector[]; + while (!validator_report_records.is_empty()) { + let (validator_address, reporters) = validator_report_records.pop(); + assert!( + is_active_validator_by_iota_address(self, validator_address), + ENonValidatorInReportRecords, + ); + // Sum up the voting power of validators that have reported this validator and check if it has + // passed the slashing threshold. + let reporter_votes = sum_voting_power_by_addresses(&self.active_validators, &reporters.into_keys()); + if (reporter_votes >= voting_power::quorum_threshold()) { + slashed_validators.push_back(validator_address); + } + }; + slashed_validators + } + + /// Given the current list of active validators, the total stake and total reward, + /// calculate the amount of reward each validator should get, without taking into + /// account the tallying rule results. + /// Returns the unadjusted amounts of staking reward for each validator. + fun compute_unadjusted_reward_distribution( + validators: &vector, + total_voting_power: u64, + total_staking_reward: u64, + ): vector { + let mut staking_reward_amounts = vector[]; + let length = validators.length(); + let mut i = 0; + while (i < length) { + let validator = &validators[i]; + // Integer divisions will truncate the results. Because of this, we expect that at the end + // there will be some reward remaining in `total_staking_reward`. + // Use u128 to avoid multiplication overflow. + let voting_power: u128 = validator.voting_power() as u128; + let reward_amount = voting_power * (total_staking_reward as u128) / (total_voting_power as u128); + staking_reward_amounts.push_back(reward_amount as u64); + i = i + 1; + }; + staking_reward_amounts + } + + /// Use the reward adjustment info to compute the adjusted rewards each validator should get. + /// Returns the staking rewards each validator gets. + /// The staking rewards are shared with the stakers. + fun compute_adjusted_reward_distribution( + validators: &vector, + total_voting_power: u64, + total_slashed_validator_voting_power: u64, + unadjusted_staking_reward_amounts: vector, + total_staking_reward_adjustment: u64, + individual_staking_reward_adjustments: VecMap, + ): vector { + let total_unslashed_validator_voting_power = total_voting_power - total_slashed_validator_voting_power; + let mut adjusted_staking_reward_amounts = vector[]; + + let length = validators.length(); + + let mut i = 0; + while (i < length) { + let validator = &validators[i]; + // Integer divisions will truncate the results. Because of this, we expect that at the end + // there will be some reward remaining in `total_reward`. + // Use u128 to avoid multiplication overflow. + let voting_power = validator.voting_power() as u128; + + // Compute adjusted staking reward. + let unadjusted_staking_reward_amount = unadjusted_staking_reward_amounts[i]; + let adjusted_staking_reward_amount = + // If the validator is one of the slashed ones, then subtract the adjustment. + if (individual_staking_reward_adjustments.contains(&i)) { + let adjustment = individual_staking_reward_adjustments[&i]; + unadjusted_staking_reward_amount - adjustment + } else { + // Otherwise the slashed rewards should be distributed among the unslashed + // validators so add the corresponding adjustment. + let adjustment = total_staking_reward_adjustment as u128 * voting_power + / (total_unslashed_validator_voting_power as u128); + unadjusted_staking_reward_amount + (adjustment as u64) + }; + adjusted_staking_reward_amounts.push_back(adjusted_staking_reward_amount); + + i = i + 1; + }; + + adjusted_staking_reward_amounts + } + + fun distribute_reward( + validators: &mut vector, + adjusted_staking_reward_amounts: &vector, + staking_rewards: &mut Balance, + ctx: &mut TxContext + ) { + let length = validators.length(); + assert!(length > 0, EValidatorSetEmpty); + let mut i = 0; + while (i < length) { + let validator = &mut validators[i]; + let staking_reward_amount = adjusted_staking_reward_amounts[i]; + let mut staker_reward = staking_rewards.split(staking_reward_amount); + + // Validator takes a cut of the rewards as commission. + let validator_commission_amount = (staking_reward_amount as u128) * (validator.commission_rate() as u128) / BASIS_POINT_DENOMINATOR; + + // The validator reward = commission. + let validator_reward = staker_reward.split(validator_commission_amount as u64); + + // Add rewards to the validator. Don't try and distribute rewards though if the payout is zero. + if (validator_reward.value() > 0) { + let validator_address = validator.iota_address(); + let rewards_stake = validator.request_add_stake(validator_reward, validator_address, ctx); + transfer::public_transfer(rewards_stake, validator_address); + } else { + validator_reward.destroy_zero(); + }; + + // Add rewards to stake staking pool to auto compound for stakers. + validator.deposit_stake_rewards(staker_reward); + i = i + 1; + } + } + + /// Emit events containing information of each validator for the epoch, + /// including stakes, rewards, performance, etc. + fun emit_validator_epoch_events( + new_epoch: u64, + vs: &vector, + pool_staking_reward_amounts: &vector, + report_records: &VecMap>, + slashed_validators: &vector
, + ) { + let num_validators = vs.length(); + let mut i = 0; + while (i < num_validators) { + let v = &vs[i]; + let validator_address = v.iota_address(); + let tallying_rule_reporters = + if (report_records.contains(&validator_address)) { + report_records[&validator_address].into_keys() + } else { + vector[] + }; + let tallying_rule_global_score = + if (slashed_validators.contains(&validator_address)) 0 + else 1; + event::emit( + ValidatorEpochInfoEventV1 { + epoch: new_epoch, + validator_address, + reference_gas_survey_quote: v.gas_price(), + stake: v.total_stake_amount(), + voting_power: v.voting_power(), + commission_rate: v.commission_rate(), + pool_staking_reward: pool_staking_reward_amounts[i], + pool_token_exchange_rate: v.pool_token_exchange_rate_at_epoch(new_epoch), + tallying_rule_reporters, + tallying_rule_global_score, + } + ); + i = i + 1; + } + } + + /// Sum up the total stake of a given list of validator addresses. + public fun sum_voting_power_by_addresses(vs: &vector, addresses: &vector
): u64 { + let mut sum = 0; + let mut i = 0; + let length = addresses.length(); + while (i < length) { + let validator = get_validator_ref(vs, addresses[i]); + sum = sum + validator.voting_power(); + i = i + 1; + }; + sum + } + + /// Return the active validators in `self` + public fun active_validators(self: &ValidatorSet): &vector { + &self.active_validators + } + + /// Returns true if the `addr` is a validator candidate. + public fun is_validator_candidate(self: &ValidatorSet, addr: address): bool { + self.validator_candidates.contains(addr) + } + + /// Returns true if the staking pool identified by `staking_pool_id` is of an inactive validator. + public fun is_inactive_validator(self: &ValidatorSet, staking_pool_id: ID): bool { + self.inactive_validators.contains(staking_pool_id) + } + + public(package) fun active_validator_addresses(self: &ValidatorSet): vector
{ + let vs = &self.active_validators; + let mut res = vector[]; + let mut i = 0; + let length = vs.length(); + while (i < length) { + let validator_address = vs[i].iota_address(); + res.push_back(validator_address); + i = i + 1; + }; + res + } + + public(package) fun select_committee_members(self: &mut ValidatorSet) { + self.committee_members = vector[]; + self.active_validators.length().do!(|i| self.committee_members.push_back(i)); + } +} diff --git a/crates/iota-framework/packages/iota-system/tests/delegation_tests.move b/crates/iota-framework/packages/iota-system/tests/delegation_tests.move index 7a233847c4f..4b92a9872eb 100644 --- a/crates/iota-framework/packages/iota-system/tests/delegation_tests.move +++ b/crates/iota-framework/packages/iota-system/tests/delegation_tests.move @@ -9,7 +9,7 @@ module iota_system::stake_tests { use iota_system::iota_system::IotaSystemState; use iota_system::staking_pool::{Self, StakedIota, PoolTokenExchangeRate}; use iota::test_utils::assert_eq; - use iota_system::validator_set; + use iota_system::validator_set_v2 as validator_set; use iota::test_utils; use iota::table::Table; diff --git a/crates/iota-framework/packages/iota-system/tests/iota_system_tests.move b/crates/iota-framework/packages/iota-system/tests/iota_system_tests.move index 18d51aaff4b..7f1263df7e9 100644 --- a/crates/iota-framework/packages/iota-system/tests/iota_system_tests.move +++ b/crates/iota-framework/packages/iota-system/tests/iota_system_tests.move @@ -14,7 +14,7 @@ module iota_system::iota_system_tests { use iota_system::iota_system::IotaSystemState; use iota_system::iota_system_state_inner; use iota_system::validator::{Self, ValidatorV1}; - use iota_system::validator_set; + use iota_system::validator_set_v2 as validator_set; use iota_system::validator_cap::UnverifiedValidatorOperationCap; use iota::balance; use iota::test_utils::assert_eq; @@ -120,7 +120,7 @@ module iota_system::iota_system_tests { } #[test] - #[expected_failure(abort_code = ::iota_system::validator_set::EInvalidCap)] + #[expected_failure(abort_code = validator_set::EInvalidCap)] fun test_report_validator_by_stakee_revoked() { let mut scenario_val = test_scenario::begin(@0x0); let scenario = &mut scenario_val; @@ -146,7 +146,7 @@ module iota_system::iota_system_tests { } #[test] - #[expected_failure(abort_code = ::iota_system::validator_set::EInvalidCap)] + #[expected_failure(abort_code = validator_set::EInvalidCap)] fun test_set_reference_gas_price_by_stakee_revoked() { let mut scenario_val = test_scenario::begin(@0x0); let scenario = &mut scenario_val; diff --git a/crates/iota-framework/packages/iota-system/tests/timelocked_delegation_tests.move b/crates/iota-framework/packages/iota-system/tests/timelocked_delegation_tests.move index 295a04d6d8c..53d074d8e2c 100644 --- a/crates/iota-framework/packages/iota-system/tests/timelocked_delegation_tests.move +++ b/crates/iota-framework/packages/iota-system/tests/timelocked_delegation_tests.move @@ -15,7 +15,7 @@ module iota_system::timelocked_stake_tests { use iota_system::iota_system::IotaSystemState; use iota_system::staking_pool::{Self, PoolTokenExchangeRate}; - use iota_system::validator_set::{Self, ValidatorSetV1}; + use iota_system::validator_set_v2::{Self as validator_set, ValidatorSet}; use iota_system::governance_test_utils::{ add_validator, add_validator_candidate, @@ -1115,7 +1115,7 @@ module iota_system::timelocked_stake_tests { scenario.has_most_recent_for_sender>() } - fun is_active_validator_by_iota_address(set: &ValidatorSetV1, validator_address: address): bool { + fun is_active_validator_by_iota_address(set: &ValidatorSet, validator_address: address): bool { let validators = set.active_validators(); let length = validators.length(); let mut i = 0; diff --git a/crates/iota-framework/packages/iota-system/tests/validator_set_tests.move b/crates/iota-framework/packages/iota-system/tests/validator_set_tests.move index eb9c1981e41..cd9adf412a2 100644 --- a/crates/iota-framework/packages/iota-system/tests/validator_set_tests.move +++ b/crates/iota-framework/packages/iota-system/tests/validator_set_tests.move @@ -8,7 +8,7 @@ module iota_system::validator_set_tests { use iota::coin; use iota_system::staking_pool::StakedIota; use iota_system::validator::{Self, ValidatorV1, staking_pool_id}; - use iota_system::validator_set::{Self, ValidatorSetV1, active_validator_addresses}; + use iota_system::validator_set_v2::{Self as validator_set, ValidatorSet, active_validator_addresses}; use iota::test_scenario::{Self, Scenario}; use iota::test_utils::{Self, assert_eq}; use iota::vec_map; @@ -429,7 +429,7 @@ module iota_system::validator_set_tests { ascii_bytes.to_ascii_string().into_bytes() } - fun advance_epoch_with_dummy_rewards(validator_set: &mut ValidatorSetV1, scenario: &mut Scenario) { + fun advance_epoch_with_dummy_rewards(validator_set: &mut ValidatorSet, scenario: &mut Scenario) { scenario.next_epoch(@0x0); let mut dummy_computation_reward = balance::zero(); @@ -447,7 +447,7 @@ module iota_system::validator_set_tests { } fun advance_epoch_with_low_stake_params( - validator_set: &mut ValidatorSetV1, + validator_set: &mut ValidatorSet, low_stake_threshold: u64, very_low_stake_threshold: u64, low_stake_grace_period: u64, @@ -468,7 +468,7 @@ module iota_system::validator_set_tests { dummy_computation_reward.destroy_zero(); } - fun add_and_activate_validator(validator_set: &mut ValidatorSetV1, validator: ValidatorV1, scenario: &mut Scenario) { + fun add_and_activate_validator(validator_set: &mut ValidatorSet, validator: ValidatorV1, scenario: &mut Scenario) { scenario.next_tx(validator.iota_address()); let ctx = scenario.ctx(); validator_set.request_add_validator_candidate(validator, ctx); diff --git a/crates/iota-framework/packages_compiled/iota-system b/crates/iota-framework/packages_compiled/iota-system index 794306b9814..c48be8f5460 100644 Binary files a/crates/iota-framework/packages_compiled/iota-system and b/crates/iota-framework/packages_compiled/iota-system differ diff --git a/crates/iota-framework/published_api.txt b/crates/iota-framework/published_api.txt index fc186af1667..e4b0f3dfe3b 100644 --- a/crates/iota-framework/published_api.txt +++ b/crates/iota-framework/published_api.txt @@ -406,6 +406,204 @@ upgrade_to_latest version fun 0x3::validator_wrapper +ValidatorSet + public struct + 0x3::validator_set_v2 +ValidatorEpochInfoEventV1 + public struct + 0x3::validator_set_v2 +ValidatorJoinEvent + public struct + 0x3::validator_set_v2 +ValidatorLeaveEvent + public struct + 0x3::validator_set_v2 +import + public(package) fun + 0x3::validator_set_v2 +new + public(package) fun + 0x3::validator_set_v2 +request_add_validator_candidate + public(package) fun + 0x3::validator_set_v2 +request_remove_validator_candidate + public(package) fun + 0x3::validator_set_v2 +request_add_validator + public(package) fun + 0x3::validator_set_v2 +assert_no_pending_or_active_duplicates + public(package) fun + 0x3::validator_set_v2 +request_remove_validator + public(package) fun + 0x3::validator_set_v2 +request_add_stake + public(package) fun + 0x3::validator_set_v2 +request_withdraw_stake + public(package) fun + 0x3::validator_set_v2 +request_set_commission_rate + public(package) fun + 0x3::validator_set_v2 +advance_epoch + public(package) fun + 0x3::validator_set_v2 +update_and_process_low_stake_departures + fun + 0x3::validator_set_v2 +effectuate_staged_metadata + fun + 0x3::validator_set_v2 +derive_reference_gas_price + public fun + 0x3::validator_set_v2 +total_stake + public fun + 0x3::validator_set_v2 +validator_total_stake_amount + public fun + 0x3::validator_set_v2 +validator_stake_amount + public fun + 0x3::validator_set_v2 +validator_voting_power + public fun + 0x3::validator_set_v2 +validator_staking_pool_id + public fun + 0x3::validator_set_v2 +staking_pool_mappings + public fun + 0x3::validator_set_v2 +pool_exchange_rates + public(package) fun + 0x3::validator_set_v2 +next_epoch_validator_count + public(package) fun + 0x3::validator_set_v2 +is_active_validator_by_iota_address + public(package) fun + 0x3::validator_set_v2 +is_duplicate_with_active_validator + fun + 0x3::validator_set_v2 +is_duplicate_validator + public(package) fun + 0x3::validator_set_v2 +count_duplicates_vec + fun + 0x3::validator_set_v2 +is_duplicate_with_pending_validator + fun + 0x3::validator_set_v2 +count_duplicates_tablevec + fun + 0x3::validator_set_v2 +get_candidate_or_active_validator_mut + fun + 0x3::validator_set_v2 +find_validator + fun + 0x3::validator_set_v2 +find_validator_from_table_vec + fun + 0x3::validator_set_v2 +get_validator_indices + fun + 0x3::validator_set_v2 +get_validator_mut + public(package) fun + 0x3::validator_set_v2 +get_active_or_pending_or_candidate_validator_mut + fun + 0x3::validator_set_v2 +get_validator_mut_with_verified_cap + public(package) fun + 0x3::validator_set_v2 +get_validator_mut_with_ctx + public(package) fun + 0x3::validator_set_v2 +get_validator_mut_with_ctx_including_candidates + public(package) fun + 0x3::validator_set_v2 +get_validator_ref + fun + 0x3::validator_set_v2 +get_active_or_pending_or_candidate_validator_ref + public(package) fun + 0x3::validator_set_v2 +get_active_validator_ref + public fun + 0x3::validator_set_v2 +get_pending_validator_ref + public fun + 0x3::validator_set_v2 +verify_cap + public(package) fun + 0x3::validator_set_v2 +process_pending_removals + fun + 0x3::validator_set_v2 +process_validator_departure + fun + 0x3::validator_set_v2 +clean_report_records_leaving_validator + fun + 0x3::validator_set_v2 +process_pending_validators + fun + 0x3::validator_set_v2 +sort_removal_list + fun + 0x3::validator_set_v2 +process_pending_stakes_and_withdraws + fun + 0x3::validator_set_v2 +calculate_total_stakes + fun + 0x3::validator_set_v2 +adjust_stake_and_gas_price + fun + 0x3::validator_set_v2 +compute_reward_adjustments + fun + 0x3::validator_set_v2 +compute_slashed_validators + fun + 0x3::validator_set_v2 +compute_unadjusted_reward_distribution + fun + 0x3::validator_set_v2 +compute_adjusted_reward_distribution + fun + 0x3::validator_set_v2 +distribute_reward + fun + 0x3::validator_set_v2 +emit_validator_epoch_events + fun + 0x3::validator_set_v2 +sum_voting_power_by_addresses + public fun + 0x3::validator_set_v2 +active_validators + public fun + 0x3::validator_set_v2 +is_validator_candidate + public fun + 0x3::validator_set_v2 +is_inactive_validator + public fun + 0x3::validator_set_v2 +active_validator_addresses + public(package) fun + 0x3::validator_set_v2 +select_committee_members + public(package) fun + 0x3::validator_set_v2 ValidatorSetV1 public struct 0x3::validator_set @@ -421,6 +619,9 @@ ValidatorLeaveEvent new public(package) fun 0x3::validator_set +v1_to_v2 + public(package) fun + 0x3::validator_set request_add_validator_candidate public(package) fun 0x3::validator_set @@ -616,6 +817,9 @@ total_balance SystemParametersV1 public struct 0x3::iota_system_state_inner +IotaSystemStateV2 + public struct + 0x3::iota_system_state_inner IotaSystemStateV1 public struct 0x3::iota_system_state_inner @@ -628,6 +832,9 @@ create create_system_parameters public(package) fun 0x3::iota_system_state_inner +v1_to_v2 + public(package) fun + 0x3::iota_system_state_inner request_add_validator_candidate public(package) fun 0x3::iota_system_state_inner diff --git a/crates/iota-genesis-builder/src/lib.rs b/crates/iota-genesis-builder/src/lib.rs index b3725eded9b..83604d4f6f2 100644 --- a/crates/iota-genesis-builder/src/lib.rs +++ b/crates/iota-genesis-builder/src/lib.rs @@ -473,6 +473,7 @@ impl Builder { #[allow(clippy::infallible_destructuring_match)] let system_state = match unsigned_genesis.iota_system_object() { IotaSystemState::V1(inner) => inner, + IotaSystemState::V2(_) => unreachable!(), #[cfg(msim)] _ => { // Types other than V1 used in simtests do not need to be validated. diff --git a/crates/iota-indexer/tests/rpc-tests/governance_api.rs b/crates/iota-indexer/tests/rpc-tests/governance_api.rs index 3f662fef1d3..1c4ed1fb19c 100644 --- a/crates/iota-indexer/tests/rpc-tests/governance_api.rs +++ b/crates/iota-indexer/tests/rpc-tests/governance_api.rs @@ -5,6 +5,7 @@ use iota_json_rpc_api::{GovernanceReadApiClient, TransactionBuilderClient}; use iota_json_rpc_types::{ DelegatedStake, DelegatedTimelockedStake, StakeStatus, TransactionBlockBytes, }; +use iota_protocol_config::MAX_PROTOCOL_VERSION; use iota_test_transaction_builder::TestTransactionBuilder; use iota_types::{ IOTA_FRAMEWORK_ADDRESS, IOTA_SYSTEM_ADDRESS, @@ -484,7 +485,7 @@ fn get_latest_iota_system_state() { indexer_wait_for_checkpoint(store, 1).await; let system_state = client.get_latest_iota_system_state().await.unwrap(); - assert_eq!(system_state.protocol_version, 1); + assert_eq!(system_state.protocol_version, MAX_PROTOCOL_VERSION); assert_eq!(system_state.system_state_version, 1); }); } diff --git a/crates/iota-indexer/tests/rpc-tests/read_api.rs b/crates/iota-indexer/tests/rpc-tests/read_api.rs index 382c6ea4ad3..9e1afafd621 100644 --- a/crates/iota-indexer/tests/rpc-tests/read_api.rs +++ b/crates/iota-indexer/tests/rpc-tests/read_api.rs @@ -8,6 +8,7 @@ use iota_json_rpc_types::{ CheckpointId, IotaGetPastObjectRequest, IotaObjectDataOptions, IotaObjectResponse, IotaObjectResponseQuery, IotaTransactionBlockResponse, IotaTransactionBlockResponseOptions, }; +use iota_protocol_config::MAX_PROTOCOL_VERSION; use iota_types::{ base_types::{ObjectID, SequenceNumber}, digests::TransactionDigest, @@ -1099,7 +1100,10 @@ fn get_protocol_config() { assert_eq!(fullnode_protocol_config, indexer_protocol_config); - let indexer_protocol_config = client.get_protocol_config(Some(1u64.into())).await.unwrap(); + let indexer_protocol_config = client + .get_protocol_config(Some(MAX_PROTOCOL_VERSION.into())) + .await + .unwrap(); assert_eq!(fullnode_protocol_config, indexer_protocol_config); }); @@ -1122,7 +1126,7 @@ fn get_protocol_config_invalid_protocol_version() { assert!(rpc_call_error_msg_matches( result, - r#"{"code":-32603,"message":"Unsupported protocol version requested. Min supported: 1, max supported: 1"}"#, + &format!(r#"{{"code":-32603,"message":"Unsupported protocol version requested. Min supported: 1, max supported: {MAX_PROTOCOL_VERSION}"}}"#), )); }); } diff --git a/crates/iota-open-rpc/spec/openrpc.json b/crates/iota-open-rpc/spec/openrpc.json index 89343df8e73..8ac4b105f2d 100644 --- a/crates/iota-open-rpc/spec/openrpc.json +++ b/crates/iota-open-rpc/spec/openrpc.json @@ -1300,7 +1300,7 @@ "name": "Result", "value": { "minSupportedProtocolVersion": "1", - "maxSupportedProtocolVersion": "1", + "maxSupportedProtocolVersion": "2", "protocolVersion": "1", "featureFlags": { "accept_zklogin_in_multisig": false, diff --git a/crates/iota-protocol-config/src/lib.rs b/crates/iota-protocol-config/src/lib.rs index fe3b91a845e..e7fa458baa8 100644 --- a/crates/iota-protocol-config/src/lib.rs +++ b/crates/iota-protocol-config/src/lib.rs @@ -16,7 +16,7 @@ use tracing::{info, warn}; /// The minimum and maximum protocol versions supported by this build. const MIN_PROTOCOL_VERSION: u64 = 1; -pub const MAX_PROTOCOL_VERSION: u64 = 1; +pub const MAX_PROTOCOL_VERSION: u64 = 2; // Record history of protocol version allocations here: // @@ -1639,6 +1639,7 @@ impl ProtocolConfig { for cur in 2..=version.0 { match cur { 1 => unreachable!(), + 2 => (), // Use this template when making changes: // diff --git a/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Mainnet_version_2.snap b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Mainnet_version_2.snap new file mode 100644 index 00000000000..c228b2f3654 --- /dev/null +++ b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Mainnet_version_2.snap @@ -0,0 +1,269 @@ +--- +source: crates/iota-protocol-config/src/lib.rs +expression: "ProtocolConfig::get_for_version(cur, *chain_id)" +--- +version: 2 +feature_flags: + consensus_transaction_ordering: ByGasPrice + per_object_congestion_control_mode: TotalTxCount + zklogin_max_epoch_upper_bound_delta: 30 +max_tx_size_bytes: 131072 +max_input_objects: 2048 +max_size_written_objects: 5000000 +max_size_written_objects_system_tx: 50000000 +max_serialized_tx_effects_size_bytes: 524288 +max_serialized_tx_effects_size_bytes_system_tx: 8388608 +max_gas_payment_objects: 256 +max_modules_in_publish: 64 +max_package_dependencies: 32 +max_arguments: 512 +max_type_arguments: 16 +max_type_argument_depth: 16 +max_pure_argument_size: 16384 +max_programmable_tx_commands: 1024 +move_binary_format_version: 7 +min_move_binary_format_version: 6 +binary_module_handles: 100 +binary_struct_handles: 300 +binary_function_handles: 1500 +binary_function_instantiations: 750 +binary_signatures: 1000 +binary_constant_pool: 4000 +binary_identifiers: 10000 +binary_address_identifiers: 100 +binary_struct_defs: 200 +binary_struct_def_instantiations: 100 +binary_function_defs: 1000 +binary_field_handles: 500 +binary_field_instantiations: 250 +binary_friend_decls: 100 +max_move_object_size: 256000 +max_move_package_size: 102400 +max_publish_or_upgrade_per_ptb: 5 +max_tx_gas: 50000000000 +max_gas_price: 100000 +max_gas_computation_bucket: 5000000 +gas_rounding_step: 1000 +max_loop_depth: 5 +max_generic_instantiation_length: 32 +max_function_parameters: 128 +max_basic_blocks: 1024 +max_value_stack_size: 1024 +max_type_nodes: 256 +max_push_size: 10000 +max_struct_definitions: 200 +max_function_definitions: 1000 +max_fields_in_struct: 32 +max_dependency_depth: 100 +max_num_event_emit: 1024 +max_num_new_move_object_ids: 2048 +max_num_new_move_object_ids_system_tx: 32768 +max_num_deleted_move_object_ids: 2048 +max_num_deleted_move_object_ids_system_tx: 32768 +max_num_transferred_move_object_ids: 2048 +max_num_transferred_move_object_ids_system_tx: 32768 +max_event_emit_size: 256000 +max_event_emit_size_total: 65536000 +max_move_vector_len: 262144 +max_move_identifier_len: 128 +max_move_value_depth: 128 +max_back_edges_per_function: 10000 +max_back_edges_per_module: 10000 +max_verifier_meter_ticks_per_function: 16000000 +max_meter_ticks_per_module: 16000000 +max_meter_ticks_per_package: 16000000 +object_runtime_max_num_cached_objects: 1000 +object_runtime_max_num_cached_objects_system_tx: 16000 +object_runtime_max_num_store_entries: 1000 +object_runtime_max_num_store_entries_system_tx: 16000 +base_tx_cost_fixed: 1000 +package_publish_cost_fixed: 1000 +base_tx_cost_per_byte: 0 +package_publish_cost_per_byte: 80 +obj_access_cost_read_per_byte: 15 +obj_access_cost_mutate_per_byte: 40 +obj_access_cost_delete_per_byte: 40 +obj_access_cost_verify_per_byte: 200 +gas_model_version: 1 +obj_data_cost_refundable: 100 +obj_metadata_cost_non_refundable: 50 +storage_rebate_rate: 10000 +reward_slashing_rate: 10000 +storage_gas_price: 76 +validator_target_reward: 767000000000000 +max_transactions_per_checkpoint: 10000 +max_checkpoint_size_bytes: 31457280 +buffer_stake_for_protocol_upgrade_bps: 5000 +address_from_bytes_cost_base: 52 +address_to_u256_cost_base: 52 +address_from_u256_cost_base: 52 +config_read_setting_impl_cost_base: 100 +config_read_setting_impl_cost_per_byte: 40 +dynamic_field_hash_type_and_key_cost_base: 100 +dynamic_field_hash_type_and_key_type_cost_per_byte: 2 +dynamic_field_hash_type_and_key_value_cost_per_byte: 2 +dynamic_field_hash_type_and_key_type_tag_cost_per_byte: 2 +dynamic_field_add_child_object_cost_base: 100 +dynamic_field_add_child_object_type_cost_per_byte: 10 +dynamic_field_add_child_object_value_cost_per_byte: 10 +dynamic_field_add_child_object_struct_tag_cost_per_byte: 10 +dynamic_field_borrow_child_object_cost_base: 100 +dynamic_field_borrow_child_object_child_ref_cost_per_byte: 10 +dynamic_field_borrow_child_object_type_cost_per_byte: 10 +dynamic_field_remove_child_object_cost_base: 100 +dynamic_field_remove_child_object_child_cost_per_byte: 2 +dynamic_field_remove_child_object_type_cost_per_byte: 2 +dynamic_field_has_child_object_cost_base: 100 +dynamic_field_has_child_object_with_ty_cost_base: 100 +dynamic_field_has_child_object_with_ty_type_cost_per_byte: 2 +dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: 2 +event_emit_cost_base: 52 +event_emit_value_size_derivation_cost_per_byte: 2 +event_emit_tag_size_derivation_cost_per_byte: 5 +event_emit_output_cost_per_byte: 10 +object_borrow_uid_cost_base: 52 +object_delete_impl_cost_base: 52 +object_record_new_uid_cost_base: 52 +transfer_transfer_internal_cost_base: 52 +transfer_freeze_object_cost_base: 52 +transfer_share_object_cost_base: 52 +transfer_receive_object_cost_base: 52 +tx_context_derive_id_cost_base: 52 +types_is_one_time_witness_cost_base: 52 +types_is_one_time_witness_type_tag_cost_per_byte: 2 +types_is_one_time_witness_type_cost_per_byte: 2 +validator_validate_metadata_cost_base: 52 +validator_validate_metadata_data_cost_per_byte: 2 +crypto_invalid_arguments_cost: 100 +bls12381_bls12381_min_sig_verify_cost_base: 52 +bls12381_bls12381_min_sig_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_sig_verify_msg_cost_per_block: 2 +bls12381_bls12381_min_pk_verify_cost_base: 52 +bls12381_bls12381_min_pk_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_pk_verify_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_keccak256_cost_base: 52 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_sha256_cost_base: 52 +ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_k1_decompress_pubkey_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_k1_secp256k1_verify_sha256_cost_base: 52 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_keccak256_cost_base: 52 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_sha256_cost_base: 52 +ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_keccak256_cost_base: 52 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_sha256_cost_base: 52 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: 2 +ecvrf_ecvrf_verify_cost_base: 52 +ecvrf_ecvrf_verify_alpha_string_cost_per_byte: 2 +ecvrf_ecvrf_verify_alpha_string_cost_per_block: 2 +ed25519_ed25519_verify_cost_base: 52 +ed25519_ed25519_verify_msg_cost_per_byte: 2 +ed25519_ed25519_verify_msg_cost_per_block: 2 +groth16_prepare_verifying_key_bls12381_cost_base: 52 +groth16_prepare_verifying_key_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bn254_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_public_input_cost_per_byte: 2 +hash_blake2b256_cost_base: 52 +hash_blake2b256_data_cost_per_byte: 2 +hash_blake2b256_data_cost_per_block: 2 +hash_keccak256_cost_base: 52 +hash_keccak256_data_cost_per_byte: 2 +hash_keccak256_data_cost_per_block: 2 +group_ops_bls12381_decode_scalar_cost: 52 +group_ops_bls12381_decode_g1_cost: 52 +group_ops_bls12381_decode_g2_cost: 52 +group_ops_bls12381_decode_gt_cost: 52 +group_ops_bls12381_scalar_add_cost: 52 +group_ops_bls12381_g1_add_cost: 52 +group_ops_bls12381_g2_add_cost: 52 +group_ops_bls12381_gt_add_cost: 52 +group_ops_bls12381_scalar_sub_cost: 52 +group_ops_bls12381_g1_sub_cost: 52 +group_ops_bls12381_g2_sub_cost: 52 +group_ops_bls12381_gt_sub_cost: 52 +group_ops_bls12381_scalar_mul_cost: 52 +group_ops_bls12381_g1_mul_cost: 52 +group_ops_bls12381_g2_mul_cost: 52 +group_ops_bls12381_gt_mul_cost: 52 +group_ops_bls12381_scalar_div_cost: 52 +group_ops_bls12381_g1_div_cost: 52 +group_ops_bls12381_g2_div_cost: 52 +group_ops_bls12381_gt_div_cost: 52 +group_ops_bls12381_g1_hash_to_base_cost: 52 +group_ops_bls12381_g2_hash_to_base_cost: 52 +group_ops_bls12381_g1_hash_to_cost_per_byte: 2 +group_ops_bls12381_g2_hash_to_cost_per_byte: 2 +group_ops_bls12381_g1_msm_base_cost: 52 +group_ops_bls12381_g2_msm_base_cost: 52 +group_ops_bls12381_g1_msm_base_cost_per_input: 52 +group_ops_bls12381_g2_msm_base_cost_per_input: 52 +group_ops_bls12381_msm_max_len: 32 +group_ops_bls12381_pairing_cost: 52 +hmac_hmac_sha3_256_cost_base: 52 +hmac_hmac_sha3_256_input_cost_per_byte: 2 +hmac_hmac_sha3_256_input_cost_per_block: 2 +check_zklogin_id_cost_base: 200 +check_zklogin_issuer_cost_base: 200 +bcs_per_byte_serialized_cost: 2 +bcs_legacy_min_output_size_cost: 1 +bcs_failure_cost: 52 +hash_sha2_256_base_cost: 52 +hash_sha2_256_per_byte_cost: 2 +hash_sha2_256_legacy_min_input_len_cost: 1 +hash_sha3_256_base_cost: 52 +hash_sha3_256_per_byte_cost: 2 +hash_sha3_256_legacy_min_input_len_cost: 1 +type_name_get_base_cost: 52 +type_name_get_per_byte_cost: 2 +string_check_utf8_base_cost: 52 +string_check_utf8_per_byte_cost: 2 +string_is_char_boundary_base_cost: 52 +string_sub_string_base_cost: 52 +string_sub_string_per_byte_cost: 2 +string_index_of_base_cost: 52 +string_index_of_per_byte_pattern_cost: 2 +string_index_of_per_byte_searched_cost: 2 +vector_empty_base_cost: 52 +vector_length_base_cost: 52 +vector_push_back_base_cost: 52 +vector_push_back_legacy_per_abstract_memory_unit_cost: 2 +vector_borrow_base_cost: 52 +vector_pop_back_base_cost: 52 +vector_destroy_empty_base_cost: 52 +vector_swap_base_cost: 52 +debug_print_base_cost: 52 +debug_print_stack_trace_base_cost: 52 +execution_version: 1 +consensus_bad_nodes_stake_threshold: 20 +max_jwk_votes_per_validator_per_epoch: 240 +max_age_of_jwk_in_epochs: 1 +random_beacon_reduction_allowed_delta: 800 +random_beacon_reduction_lower_bound: 1000 +random_beacon_dkg_timeout_round: 3000 +random_beacon_min_round_interval_ms: 500 +random_beacon_dkg_version: 1 +consensus_max_transaction_size_bytes: 262144 +consensus_max_transactions_in_block_bytes: 524288 +consensus_max_num_transactions_in_block: 512 +max_deferral_rounds_for_congestion_control: 10 +min_checkpoint_interval_ms: 200 +checkpoint_summary_version_specific_data: 1 +max_soft_bundle_size: 5 +bridge_should_try_to_finalize_committee: false +max_accumulated_txn_cost_per_object_in_mysticeti_commit: 10 diff --git a/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Testnet_version_2.snap b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Testnet_version_2.snap new file mode 100644 index 00000000000..f594802daf4 --- /dev/null +++ b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Testnet_version_2.snap @@ -0,0 +1,269 @@ +--- +source: crates/iota-protocol-config/src/lib.rs +expression: "ProtocolConfig::get_for_version(cur, *chain_id)" +--- +version: 2 +feature_flags: + consensus_transaction_ordering: ByGasPrice + per_object_congestion_control_mode: TotalTxCount + zklogin_max_epoch_upper_bound_delta: 30 +max_tx_size_bytes: 131072 +max_input_objects: 2048 +max_size_written_objects: 5000000 +max_size_written_objects_system_tx: 50000000 +max_serialized_tx_effects_size_bytes: 524288 +max_serialized_tx_effects_size_bytes_system_tx: 8388608 +max_gas_payment_objects: 256 +max_modules_in_publish: 64 +max_package_dependencies: 32 +max_arguments: 512 +max_type_arguments: 16 +max_type_argument_depth: 16 +max_pure_argument_size: 16384 +max_programmable_tx_commands: 1024 +move_binary_format_version: 7 +min_move_binary_format_version: 6 +binary_module_handles: 100 +binary_struct_handles: 300 +binary_function_handles: 1500 +binary_function_instantiations: 750 +binary_signatures: 1000 +binary_constant_pool: 4000 +binary_identifiers: 10000 +binary_address_identifiers: 100 +binary_struct_defs: 200 +binary_struct_def_instantiations: 100 +binary_function_defs: 1000 +binary_field_handles: 500 +binary_field_instantiations: 250 +binary_friend_decls: 100 +max_move_object_size: 256000 +max_move_package_size: 102400 +max_publish_or_upgrade_per_ptb: 5 +max_tx_gas: 50000000000 +max_gas_price: 100000 +max_gas_computation_bucket: 5000000 +gas_rounding_step: 1000 +max_loop_depth: 5 +max_generic_instantiation_length: 32 +max_function_parameters: 128 +max_basic_blocks: 1024 +max_value_stack_size: 1024 +max_type_nodes: 256 +max_push_size: 10000 +max_struct_definitions: 200 +max_function_definitions: 1000 +max_fields_in_struct: 32 +max_dependency_depth: 100 +max_num_event_emit: 1024 +max_num_new_move_object_ids: 2048 +max_num_new_move_object_ids_system_tx: 32768 +max_num_deleted_move_object_ids: 2048 +max_num_deleted_move_object_ids_system_tx: 32768 +max_num_transferred_move_object_ids: 2048 +max_num_transferred_move_object_ids_system_tx: 32768 +max_event_emit_size: 256000 +max_event_emit_size_total: 65536000 +max_move_vector_len: 262144 +max_move_identifier_len: 128 +max_move_value_depth: 128 +max_back_edges_per_function: 10000 +max_back_edges_per_module: 10000 +max_verifier_meter_ticks_per_function: 16000000 +max_meter_ticks_per_module: 16000000 +max_meter_ticks_per_package: 16000000 +object_runtime_max_num_cached_objects: 1000 +object_runtime_max_num_cached_objects_system_tx: 16000 +object_runtime_max_num_store_entries: 1000 +object_runtime_max_num_store_entries_system_tx: 16000 +base_tx_cost_fixed: 1000 +package_publish_cost_fixed: 1000 +base_tx_cost_per_byte: 0 +package_publish_cost_per_byte: 80 +obj_access_cost_read_per_byte: 15 +obj_access_cost_mutate_per_byte: 40 +obj_access_cost_delete_per_byte: 40 +obj_access_cost_verify_per_byte: 200 +gas_model_version: 1 +obj_data_cost_refundable: 100 +obj_metadata_cost_non_refundable: 50 +storage_rebate_rate: 10000 +reward_slashing_rate: 10000 +storage_gas_price: 76 +validator_target_reward: 767000000000000 +max_transactions_per_checkpoint: 10000 +max_checkpoint_size_bytes: 31457280 +buffer_stake_for_protocol_upgrade_bps: 5000 +address_from_bytes_cost_base: 52 +address_to_u256_cost_base: 52 +address_from_u256_cost_base: 52 +config_read_setting_impl_cost_base: 100 +config_read_setting_impl_cost_per_byte: 40 +dynamic_field_hash_type_and_key_cost_base: 100 +dynamic_field_hash_type_and_key_type_cost_per_byte: 2 +dynamic_field_hash_type_and_key_value_cost_per_byte: 2 +dynamic_field_hash_type_and_key_type_tag_cost_per_byte: 2 +dynamic_field_add_child_object_cost_base: 100 +dynamic_field_add_child_object_type_cost_per_byte: 10 +dynamic_field_add_child_object_value_cost_per_byte: 10 +dynamic_field_add_child_object_struct_tag_cost_per_byte: 10 +dynamic_field_borrow_child_object_cost_base: 100 +dynamic_field_borrow_child_object_child_ref_cost_per_byte: 10 +dynamic_field_borrow_child_object_type_cost_per_byte: 10 +dynamic_field_remove_child_object_cost_base: 100 +dynamic_field_remove_child_object_child_cost_per_byte: 2 +dynamic_field_remove_child_object_type_cost_per_byte: 2 +dynamic_field_has_child_object_cost_base: 100 +dynamic_field_has_child_object_with_ty_cost_base: 100 +dynamic_field_has_child_object_with_ty_type_cost_per_byte: 2 +dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: 2 +event_emit_cost_base: 52 +event_emit_value_size_derivation_cost_per_byte: 2 +event_emit_tag_size_derivation_cost_per_byte: 5 +event_emit_output_cost_per_byte: 10 +object_borrow_uid_cost_base: 52 +object_delete_impl_cost_base: 52 +object_record_new_uid_cost_base: 52 +transfer_transfer_internal_cost_base: 52 +transfer_freeze_object_cost_base: 52 +transfer_share_object_cost_base: 52 +transfer_receive_object_cost_base: 52 +tx_context_derive_id_cost_base: 52 +types_is_one_time_witness_cost_base: 52 +types_is_one_time_witness_type_tag_cost_per_byte: 2 +types_is_one_time_witness_type_cost_per_byte: 2 +validator_validate_metadata_cost_base: 52 +validator_validate_metadata_data_cost_per_byte: 2 +crypto_invalid_arguments_cost: 100 +bls12381_bls12381_min_sig_verify_cost_base: 52 +bls12381_bls12381_min_sig_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_sig_verify_msg_cost_per_block: 2 +bls12381_bls12381_min_pk_verify_cost_base: 52 +bls12381_bls12381_min_pk_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_pk_verify_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_keccak256_cost_base: 52 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_sha256_cost_base: 52 +ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_k1_decompress_pubkey_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_k1_secp256k1_verify_sha256_cost_base: 52 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_keccak256_cost_base: 52 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_sha256_cost_base: 52 +ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_keccak256_cost_base: 52 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_sha256_cost_base: 52 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: 2 +ecvrf_ecvrf_verify_cost_base: 52 +ecvrf_ecvrf_verify_alpha_string_cost_per_byte: 2 +ecvrf_ecvrf_verify_alpha_string_cost_per_block: 2 +ed25519_ed25519_verify_cost_base: 52 +ed25519_ed25519_verify_msg_cost_per_byte: 2 +ed25519_ed25519_verify_msg_cost_per_block: 2 +groth16_prepare_verifying_key_bls12381_cost_base: 52 +groth16_prepare_verifying_key_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bn254_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_public_input_cost_per_byte: 2 +hash_blake2b256_cost_base: 52 +hash_blake2b256_data_cost_per_byte: 2 +hash_blake2b256_data_cost_per_block: 2 +hash_keccak256_cost_base: 52 +hash_keccak256_data_cost_per_byte: 2 +hash_keccak256_data_cost_per_block: 2 +group_ops_bls12381_decode_scalar_cost: 52 +group_ops_bls12381_decode_g1_cost: 52 +group_ops_bls12381_decode_g2_cost: 52 +group_ops_bls12381_decode_gt_cost: 52 +group_ops_bls12381_scalar_add_cost: 52 +group_ops_bls12381_g1_add_cost: 52 +group_ops_bls12381_g2_add_cost: 52 +group_ops_bls12381_gt_add_cost: 52 +group_ops_bls12381_scalar_sub_cost: 52 +group_ops_bls12381_g1_sub_cost: 52 +group_ops_bls12381_g2_sub_cost: 52 +group_ops_bls12381_gt_sub_cost: 52 +group_ops_bls12381_scalar_mul_cost: 52 +group_ops_bls12381_g1_mul_cost: 52 +group_ops_bls12381_g2_mul_cost: 52 +group_ops_bls12381_gt_mul_cost: 52 +group_ops_bls12381_scalar_div_cost: 52 +group_ops_bls12381_g1_div_cost: 52 +group_ops_bls12381_g2_div_cost: 52 +group_ops_bls12381_gt_div_cost: 52 +group_ops_bls12381_g1_hash_to_base_cost: 52 +group_ops_bls12381_g2_hash_to_base_cost: 52 +group_ops_bls12381_g1_hash_to_cost_per_byte: 2 +group_ops_bls12381_g2_hash_to_cost_per_byte: 2 +group_ops_bls12381_g1_msm_base_cost: 52 +group_ops_bls12381_g2_msm_base_cost: 52 +group_ops_bls12381_g1_msm_base_cost_per_input: 52 +group_ops_bls12381_g2_msm_base_cost_per_input: 52 +group_ops_bls12381_msm_max_len: 32 +group_ops_bls12381_pairing_cost: 52 +hmac_hmac_sha3_256_cost_base: 52 +hmac_hmac_sha3_256_input_cost_per_byte: 2 +hmac_hmac_sha3_256_input_cost_per_block: 2 +check_zklogin_id_cost_base: 200 +check_zklogin_issuer_cost_base: 200 +bcs_per_byte_serialized_cost: 2 +bcs_legacy_min_output_size_cost: 1 +bcs_failure_cost: 52 +hash_sha2_256_base_cost: 52 +hash_sha2_256_per_byte_cost: 2 +hash_sha2_256_legacy_min_input_len_cost: 1 +hash_sha3_256_base_cost: 52 +hash_sha3_256_per_byte_cost: 2 +hash_sha3_256_legacy_min_input_len_cost: 1 +type_name_get_base_cost: 52 +type_name_get_per_byte_cost: 2 +string_check_utf8_base_cost: 52 +string_check_utf8_per_byte_cost: 2 +string_is_char_boundary_base_cost: 52 +string_sub_string_base_cost: 52 +string_sub_string_per_byte_cost: 2 +string_index_of_base_cost: 52 +string_index_of_per_byte_pattern_cost: 2 +string_index_of_per_byte_searched_cost: 2 +vector_empty_base_cost: 52 +vector_length_base_cost: 52 +vector_push_back_base_cost: 52 +vector_push_back_legacy_per_abstract_memory_unit_cost: 2 +vector_borrow_base_cost: 52 +vector_pop_back_base_cost: 52 +vector_destroy_empty_base_cost: 52 +vector_swap_base_cost: 52 +debug_print_base_cost: 52 +debug_print_stack_trace_base_cost: 52 +execution_version: 1 +consensus_bad_nodes_stake_threshold: 20 +max_jwk_votes_per_validator_per_epoch: 240 +max_age_of_jwk_in_epochs: 1 +random_beacon_reduction_allowed_delta: 800 +random_beacon_reduction_lower_bound: 1000 +random_beacon_dkg_timeout_round: 3000 +random_beacon_min_round_interval_ms: 500 +random_beacon_dkg_version: 1 +consensus_max_transaction_size_bytes: 262144 +consensus_max_transactions_in_block_bytes: 524288 +consensus_max_num_transactions_in_block: 512 +max_deferral_rounds_for_congestion_control: 10 +min_checkpoint_interval_ms: 200 +checkpoint_summary_version_specific_data: 1 +max_soft_bundle_size: 5 +bridge_should_try_to_finalize_committee: true +max_accumulated_txn_cost_per_object_in_mysticeti_commit: 10 diff --git a/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__version_2.snap b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__version_2.snap new file mode 100644 index 00000000000..be0682d418b --- /dev/null +++ b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__version_2.snap @@ -0,0 +1,277 @@ +--- +source: crates/iota-protocol-config/src/lib.rs +expression: "ProtocolConfig::get_for_version(cur, *chain_id)" +--- +version: 2 +feature_flags: + consensus_transaction_ordering: ByGasPrice + enable_poseidon: true + enable_group_ops_native_function_msm: true + per_object_congestion_control_mode: TotalTxCount + zklogin_max_epoch_upper_bound_delta: 30 + enable_vdf: true + passkey_auth: true +max_tx_size_bytes: 131072 +max_input_objects: 2048 +max_size_written_objects: 5000000 +max_size_written_objects_system_tx: 50000000 +max_serialized_tx_effects_size_bytes: 524288 +max_serialized_tx_effects_size_bytes_system_tx: 8388608 +max_gas_payment_objects: 256 +max_modules_in_publish: 64 +max_package_dependencies: 32 +max_arguments: 512 +max_type_arguments: 16 +max_type_argument_depth: 16 +max_pure_argument_size: 16384 +max_programmable_tx_commands: 1024 +move_binary_format_version: 7 +min_move_binary_format_version: 6 +binary_module_handles: 100 +binary_struct_handles: 300 +binary_function_handles: 1500 +binary_function_instantiations: 750 +binary_signatures: 1000 +binary_constant_pool: 4000 +binary_identifiers: 10000 +binary_address_identifiers: 100 +binary_struct_defs: 200 +binary_struct_def_instantiations: 100 +binary_function_defs: 1000 +binary_field_handles: 500 +binary_field_instantiations: 250 +binary_friend_decls: 100 +max_move_object_size: 256000 +max_move_package_size: 102400 +max_publish_or_upgrade_per_ptb: 5 +max_tx_gas: 50000000000 +max_gas_price: 100000 +max_gas_computation_bucket: 5000000 +gas_rounding_step: 1000 +max_loop_depth: 5 +max_generic_instantiation_length: 32 +max_function_parameters: 128 +max_basic_blocks: 1024 +max_value_stack_size: 1024 +max_type_nodes: 256 +max_push_size: 10000 +max_struct_definitions: 200 +max_function_definitions: 1000 +max_fields_in_struct: 32 +max_dependency_depth: 100 +max_num_event_emit: 1024 +max_num_new_move_object_ids: 2048 +max_num_new_move_object_ids_system_tx: 32768 +max_num_deleted_move_object_ids: 2048 +max_num_deleted_move_object_ids_system_tx: 32768 +max_num_transferred_move_object_ids: 2048 +max_num_transferred_move_object_ids_system_tx: 32768 +max_event_emit_size: 256000 +max_event_emit_size_total: 65536000 +max_move_vector_len: 262144 +max_move_identifier_len: 128 +max_move_value_depth: 128 +max_back_edges_per_function: 10000 +max_back_edges_per_module: 10000 +max_verifier_meter_ticks_per_function: 16000000 +max_meter_ticks_per_module: 16000000 +max_meter_ticks_per_package: 16000000 +object_runtime_max_num_cached_objects: 1000 +object_runtime_max_num_cached_objects_system_tx: 16000 +object_runtime_max_num_store_entries: 1000 +object_runtime_max_num_store_entries_system_tx: 16000 +base_tx_cost_fixed: 1000 +package_publish_cost_fixed: 1000 +base_tx_cost_per_byte: 0 +package_publish_cost_per_byte: 80 +obj_access_cost_read_per_byte: 15 +obj_access_cost_mutate_per_byte: 40 +obj_access_cost_delete_per_byte: 40 +obj_access_cost_verify_per_byte: 200 +gas_model_version: 1 +obj_data_cost_refundable: 100 +obj_metadata_cost_non_refundable: 50 +storage_rebate_rate: 10000 +reward_slashing_rate: 10000 +storage_gas_price: 76 +validator_target_reward: 767000000000000 +max_transactions_per_checkpoint: 10000 +max_checkpoint_size_bytes: 31457280 +buffer_stake_for_protocol_upgrade_bps: 5000 +address_from_bytes_cost_base: 52 +address_to_u256_cost_base: 52 +address_from_u256_cost_base: 52 +config_read_setting_impl_cost_base: 100 +config_read_setting_impl_cost_per_byte: 40 +dynamic_field_hash_type_and_key_cost_base: 100 +dynamic_field_hash_type_and_key_type_cost_per_byte: 2 +dynamic_field_hash_type_and_key_value_cost_per_byte: 2 +dynamic_field_hash_type_and_key_type_tag_cost_per_byte: 2 +dynamic_field_add_child_object_cost_base: 100 +dynamic_field_add_child_object_type_cost_per_byte: 10 +dynamic_field_add_child_object_value_cost_per_byte: 10 +dynamic_field_add_child_object_struct_tag_cost_per_byte: 10 +dynamic_field_borrow_child_object_cost_base: 100 +dynamic_field_borrow_child_object_child_ref_cost_per_byte: 10 +dynamic_field_borrow_child_object_type_cost_per_byte: 10 +dynamic_field_remove_child_object_cost_base: 100 +dynamic_field_remove_child_object_child_cost_per_byte: 2 +dynamic_field_remove_child_object_type_cost_per_byte: 2 +dynamic_field_has_child_object_cost_base: 100 +dynamic_field_has_child_object_with_ty_cost_base: 100 +dynamic_field_has_child_object_with_ty_type_cost_per_byte: 2 +dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: 2 +event_emit_cost_base: 52 +event_emit_value_size_derivation_cost_per_byte: 2 +event_emit_tag_size_derivation_cost_per_byte: 5 +event_emit_output_cost_per_byte: 10 +object_borrow_uid_cost_base: 52 +object_delete_impl_cost_base: 52 +object_record_new_uid_cost_base: 52 +transfer_transfer_internal_cost_base: 52 +transfer_freeze_object_cost_base: 52 +transfer_share_object_cost_base: 52 +transfer_receive_object_cost_base: 52 +tx_context_derive_id_cost_base: 52 +types_is_one_time_witness_cost_base: 52 +types_is_one_time_witness_type_tag_cost_per_byte: 2 +types_is_one_time_witness_type_cost_per_byte: 2 +validator_validate_metadata_cost_base: 52 +validator_validate_metadata_data_cost_per_byte: 2 +crypto_invalid_arguments_cost: 100 +bls12381_bls12381_min_sig_verify_cost_base: 52 +bls12381_bls12381_min_sig_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_sig_verify_msg_cost_per_block: 2 +bls12381_bls12381_min_pk_verify_cost_base: 52 +bls12381_bls12381_min_pk_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_pk_verify_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_keccak256_cost_base: 52 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_sha256_cost_base: 52 +ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_k1_decompress_pubkey_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_k1_secp256k1_verify_sha256_cost_base: 52 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_keccak256_cost_base: 52 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_sha256_cost_base: 52 +ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_keccak256_cost_base: 52 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_sha256_cost_base: 52 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: 2 +ecvrf_ecvrf_verify_cost_base: 52 +ecvrf_ecvrf_verify_alpha_string_cost_per_byte: 2 +ecvrf_ecvrf_verify_alpha_string_cost_per_block: 2 +ed25519_ed25519_verify_cost_base: 52 +ed25519_ed25519_verify_msg_cost_per_byte: 2 +ed25519_ed25519_verify_msg_cost_per_block: 2 +groth16_prepare_verifying_key_bls12381_cost_base: 52 +groth16_prepare_verifying_key_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bn254_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_public_input_cost_per_byte: 2 +hash_blake2b256_cost_base: 52 +hash_blake2b256_data_cost_per_byte: 2 +hash_blake2b256_data_cost_per_block: 2 +hash_keccak256_cost_base: 52 +hash_keccak256_data_cost_per_byte: 2 +hash_keccak256_data_cost_per_block: 2 +poseidon_bn254_cost_base: 260 +poseidon_bn254_cost_per_block: 10 +group_ops_bls12381_decode_scalar_cost: 52 +group_ops_bls12381_decode_g1_cost: 52 +group_ops_bls12381_decode_g2_cost: 52 +group_ops_bls12381_decode_gt_cost: 52 +group_ops_bls12381_scalar_add_cost: 52 +group_ops_bls12381_g1_add_cost: 52 +group_ops_bls12381_g2_add_cost: 52 +group_ops_bls12381_gt_add_cost: 52 +group_ops_bls12381_scalar_sub_cost: 52 +group_ops_bls12381_g1_sub_cost: 52 +group_ops_bls12381_g2_sub_cost: 52 +group_ops_bls12381_gt_sub_cost: 52 +group_ops_bls12381_scalar_mul_cost: 52 +group_ops_bls12381_g1_mul_cost: 52 +group_ops_bls12381_g2_mul_cost: 52 +group_ops_bls12381_gt_mul_cost: 52 +group_ops_bls12381_scalar_div_cost: 52 +group_ops_bls12381_g1_div_cost: 52 +group_ops_bls12381_g2_div_cost: 52 +group_ops_bls12381_gt_div_cost: 52 +group_ops_bls12381_g1_hash_to_base_cost: 52 +group_ops_bls12381_g2_hash_to_base_cost: 52 +group_ops_bls12381_g1_hash_to_cost_per_byte: 2 +group_ops_bls12381_g2_hash_to_cost_per_byte: 2 +group_ops_bls12381_g1_msm_base_cost: 52 +group_ops_bls12381_g2_msm_base_cost: 52 +group_ops_bls12381_g1_msm_base_cost_per_input: 52 +group_ops_bls12381_g2_msm_base_cost_per_input: 52 +group_ops_bls12381_msm_max_len: 32 +group_ops_bls12381_pairing_cost: 52 +hmac_hmac_sha3_256_cost_base: 52 +hmac_hmac_sha3_256_input_cost_per_byte: 2 +hmac_hmac_sha3_256_input_cost_per_block: 2 +check_zklogin_id_cost_base: 200 +check_zklogin_issuer_cost_base: 200 +vdf_verify_vdf_cost: 1500 +vdf_hash_to_input_cost: 100 +bcs_per_byte_serialized_cost: 2 +bcs_legacy_min_output_size_cost: 1 +bcs_failure_cost: 52 +hash_sha2_256_base_cost: 52 +hash_sha2_256_per_byte_cost: 2 +hash_sha2_256_legacy_min_input_len_cost: 1 +hash_sha3_256_base_cost: 52 +hash_sha3_256_per_byte_cost: 2 +hash_sha3_256_legacy_min_input_len_cost: 1 +type_name_get_base_cost: 52 +type_name_get_per_byte_cost: 2 +string_check_utf8_base_cost: 52 +string_check_utf8_per_byte_cost: 2 +string_is_char_boundary_base_cost: 52 +string_sub_string_base_cost: 52 +string_sub_string_per_byte_cost: 2 +string_index_of_base_cost: 52 +string_index_of_per_byte_pattern_cost: 2 +string_index_of_per_byte_searched_cost: 2 +vector_empty_base_cost: 52 +vector_length_base_cost: 52 +vector_push_back_base_cost: 52 +vector_push_back_legacy_per_abstract_memory_unit_cost: 2 +vector_borrow_base_cost: 52 +vector_pop_back_base_cost: 52 +vector_destroy_empty_base_cost: 52 +vector_swap_base_cost: 52 +debug_print_base_cost: 52 +debug_print_stack_trace_base_cost: 52 +execution_version: 1 +consensus_bad_nodes_stake_threshold: 20 +max_jwk_votes_per_validator_per_epoch: 240 +max_age_of_jwk_in_epochs: 1 +random_beacon_reduction_allowed_delta: 800 +random_beacon_reduction_lower_bound: 1000 +random_beacon_dkg_timeout_round: 3000 +random_beacon_min_round_interval_ms: 500 +random_beacon_dkg_version: 1 +consensus_max_transaction_size_bytes: 262144 +consensus_max_transactions_in_block_bytes: 524288 +consensus_max_num_transactions_in_block: 512 +max_deferral_rounds_for_congestion_control: 10 +min_checkpoint_interval_ms: 200 +checkpoint_summary_version_specific_data: 1 +max_soft_bundle_size: 5 +bridge_should_try_to_finalize_committee: true +max_accumulated_txn_cost_per_object_in_mysticeti_commit: 10 diff --git a/crates/iota-swarm-config/tests/snapshots/snapshot_tests__genesis_config_snapshot_matches.snap b/crates/iota-swarm-config/tests/snapshots/snapshot_tests__genesis_config_snapshot_matches.snap index 560f4a795b4..4dab7cd2563 100644 --- a/crates/iota-swarm-config/tests/snapshots/snapshot_tests__genesis_config_snapshot_matches.snap +++ b/crates/iota-swarm-config/tests/snapshots/snapshot_tests__genesis_config_snapshot_matches.snap @@ -6,7 +6,7 @@ ssfn_config_info: ~ validator_config_info: ~ parameters: chain_start_timestamp_ms: 0 - protocol_version: 1 + protocol_version: 2 allow_insertion_of_extra_objects: true epoch_duration_ms: 86400000 accounts: diff --git a/crates/iota-swarm-config/tests/snapshots/snapshot_tests__populated_genesis_snapshot_matches-2.snap b/crates/iota-swarm-config/tests/snapshots/snapshot_tests__populated_genesis_snapshot_matches-2.snap index 147ad24674c..36bc6e6c90b 100644 --- a/crates/iota-swarm-config/tests/snapshots/snapshot_tests__populated_genesis_snapshot_matches-2.snap +++ b/crates/iota-swarm-config/tests/snapshots/snapshot_tests__populated_genesis_snapshot_matches-2.snap @@ -3,12 +3,12 @@ source: crates/iota-swarm-config/tests/snapshot_tests.rs expression: genesis.iota_system_object().into_genesis_version_for_tooling() --- epoch: 0 -protocol_version: 1 +protocol_version: 2 system_state_version: 1 iota_treasury_cap: inner: id: - id: "0x934856dbf1a6032f66ee5ff2e959767c8efc379e69bd3087e78cdb051df2f876" + id: "0xf9ae1a479f41a1ac47ca296b3be24f13f4bec5cc0e25a7347058a60b6fef1b59" total_supply: value: "751500000000000000" validators: @@ -244,13 +244,13 @@ validators: next_epoch_primary_address: ~ extra_fields: id: - id: "0xe8024a1572d13ddd22144a52f5bb90f9d93f0057d8a7f6886833a8558c5f42dc" + id: "0xc6c85259be86cc5f5eb40393a244c382d1156a434d9a2037a75f9de1bfbc629f" size: 0 voting_power: 10000 - operation_cap_id: "0xced7229b5da6ab4e03dbd482bfc0d31444f1530d0ae1020d55531f80051034de" + operation_cap_id: "0x0553ed98d60ba577a54dee02b2dae98d84e48f43e1f89284b35b27e6d515fa85" gas_price: 1000 staking_pool: - id: "0x7bc82accfac70f4e347e02c215f509b1b22a1ac63f5edd784d16d0e95e1e3840" + id: "0x2be23710d6ac5581454d6b5691ad00012d622f33eec616feda2033527491f1e0" activation_epoch: 0 deactivation_epoch: ~ iota_balance: 1500000000000000 @@ -258,14 +258,14 @@ validators: value: 0 pool_token_balance: 1500000000000000 exchange_rates: - id: "0xe82a41af6638521838d31f97bc54c191f0ce1a1781c35ac3d9a4e8499494e0c2" + id: "0x735e7d92343a093c57dd69244ae363e6b5b926282436778f0a2c10e7fab055de" size: 1 pending_stake: 0 pending_total_iota_withdraw: 0 pending_pool_token_withdraw: 0 extra_fields: id: - id: "0x3589b1f00ea0f4019cd46b56d29b2286c1ec783e52e84415008747fb1d8c9043" + id: "0xe51663dd830ee58435d4c123116c1f29f62d8e0b5f06a6a38255e38526489dbc" size: 0 commission_rate: 200 next_epoch_stake: 1500000000000000 @@ -273,27 +273,27 @@ validators: next_epoch_commission_rate: 200 extra_fields: id: - id: "0x83acc826eb238b984c7bae9e964952dd72902a031d1f555cc4b0676495fc930e" + id: "0x4d5f73d6b0fbd0fde6bbe16e7a4a8f36199fc370f09735eb8234f3f31201873d" size: 0 pending_active_validators: contents: - id: "0xb98e2c63a08a2c27b9d14288105e784144c65dfdb081951e9794d385dcdf378b" + id: "0xbc7bc94ed835a322d1737bcea17eadd0807082fd1a20746ba7a27df540dc0a47" size: 0 pending_removals: [] staking_pool_mappings: - id: "0x17d4a3fab108e0275cfbd2b1966444e99419185643d340b5d1b425faab103cee" + id: "0x11dfa174796c11d6d0273b9252538bf0a71e87f82c6076e4bfab5a9ae7d0b766" size: 1 inactive_validators: - id: "0xe7da2643c898e967489e2227ed2d36a0c8db61410e937dcfea7d915065736bc8" + id: "0x52ce43b09e1a04bb6ff39fb4d9c5b4656c19648d97a9df39cb83424a5160c3cf" size: 0 validator_candidates: - id: "0x7c28f48d2427b54a9b018b62a2caaadd39ce209d779396f8ee23a4f7fc8d4901" + id: "0xc5f981b320c21489c4e93f6e46326b600956e0f2dfbe05129ab3011c70859eda" size: 0 at_risk_validators: contents: [] extra_fields: id: - id: "0x520c8bed0efe1861657f5b33eea0745aeeabfd4d1887172831a99c4fed274b4d" + id: "0x775085fc606c16bdc7c83933a4a837e0ea06a4304da03a3dc0fd8a7552f356c9" size: 0 storage_fund: total_object_storage_rebates: @@ -310,7 +310,7 @@ parameters: validator_low_stake_grace_period: 7 extra_fields: id: - id: "0x4b729e195cfcf8f19c9508866d464aea19e48db9a721114e5a6159d53abf310f" + id: "0x52ff8e3f2cb09961404355357c91b0c3d7fbf021d4e63174ba20160238906801" size: 0 iota_system_admin_cap: dummy_field: false @@ -327,5 +327,5 @@ safe_mode_non_refundable_storage_fee: 0 epoch_start_timestamp_ms: 10 extra_fields: id: - id: "0x3ff2b204a8ce9d05936b477dbcf16285afbd069216734afbe1ae0798be0bb0e4" + id: "0x449559bfe7d24aa6bc2ee10fa2e6791c6b8ec01230c89dadf75aec68578b7338" size: 0 diff --git a/crates/iota-types/src/iota_system_state/iota_system_state_inner_v2.rs b/crates/iota-types/src/iota_system_state/iota_system_state_inner_v2.rs new file mode 100644 index 00000000000..c9612348f83 --- /dev/null +++ b/crates/iota-types/src/iota_system_state/iota_system_state_inner_v2.rs @@ -0,0 +1,297 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use anyhow::Result; +use serde::{Deserialize, Serialize}; + +use super::{ + AdvanceEpochParams, IotaSystemStateTrait, + epoch_start_iota_system_state::EpochStartValidatorInfoV1, + get_validators_from_table_vec, + iota_system_state_inner_v1::{StorageFundV1, SystemParametersV1, ValidatorV1}, + iota_system_state_summary::{IotaSystemStateSummary, IotaValidatorSummary}, +}; +use crate::{ + balance::Balance, + base_types::IotaAddress, + collection_types::{Bag, Table, TableVec, VecMap, VecSet}, + committee::{CommitteeWithNetworkMetadata, NetworkMetadata}, + error::IotaError, + gas_coin::IotaTreasuryCap, + iota_system_state::epoch_start_iota_system_state::EpochStartSystemState, + storage::ObjectStore, + system_admin_cap::IotaSystemAdminCap, +}; + +/// Rust version of the Move iota_system::validator_set::ValidatorSetV2 type +#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] +pub struct ValidatorSetV2 { + pub total_stake: u64, + pub active_validators: Vec, + pub committee_members: Vec, + pub pending_active_validators: TableVec, + pub pending_removals: Vec, + pub staking_pool_mappings: Table, + pub inactive_validators: Table, + pub validator_candidates: Table, + pub at_risk_validators: VecMap, + pub extra_fields: Bag, +} + +impl ValidatorSetV2 { + pub fn iter_committee_members(&self) -> impl Iterator { + self.committee_members.iter().map(|&index| { + self.active_validators + .get(index as usize) + .expect("committee corrupt") + }) + } +} + +/// Rust version of the Move iota_system::iota_system::IotaSystemStateV2 type +#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] +pub struct IotaSystemStateV2 { + pub epoch: u64, + pub protocol_version: u64, + pub system_state_version: u64, + pub iota_treasury_cap: IotaTreasuryCap, + pub validators: ValidatorSetV2, + pub storage_fund: StorageFundV1, + pub parameters: SystemParametersV1, + pub iota_system_admin_cap: IotaSystemAdminCap, + pub reference_gas_price: u64, + pub validator_report_records: VecMap>, + pub safe_mode: bool, + pub safe_mode_storage_charges: Balance, + pub safe_mode_computation_rewards: Balance, + pub safe_mode_storage_rebates: u64, + pub safe_mode_non_refundable_storage_fee: u64, + pub epoch_start_timestamp_ms: u64, + pub extra_fields: Bag, + // TODO: Use getters instead of all pub. +} + +impl IotaSystemStateTrait for IotaSystemStateV2 { + fn epoch(&self) -> u64 { + self.epoch + } + + fn reference_gas_price(&self) -> u64 { + self.reference_gas_price + } + + fn protocol_version(&self) -> u64 { + self.protocol_version + } + + fn system_state_version(&self) -> u64 { + self.system_state_version + } + + fn epoch_start_timestamp_ms(&self) -> u64 { + self.epoch_start_timestamp_ms + } + + fn epoch_duration_ms(&self) -> u64 { + self.parameters.epoch_duration_ms + } + + fn safe_mode(&self) -> bool { + self.safe_mode + } + + fn advance_epoch_safe_mode(&mut self, params: &AdvanceEpochParams) { + self.epoch = params.epoch; + self.safe_mode = true; + self.safe_mode_storage_charges + .deposit_for_safe_mode(params.storage_charge); + self.safe_mode_storage_rebates += params.storage_rebate; + self.safe_mode_computation_rewards + .deposit_for_safe_mode(params.computation_charge); + self.safe_mode_non_refundable_storage_fee += params.non_refundable_storage_fee; + self.epoch_start_timestamp_ms = params.epoch_start_timestamp_ms; + self.protocol_version = params.next_protocol_version.as_u64(); + } + + fn get_current_epoch_committee(&self) -> CommitteeWithNetworkMetadata { + let validators = self + .validators + .iter_committee_members() + .map(|validator| { + let verified_metadata = validator.verified_metadata(); + let name = verified_metadata.iota_pubkey_bytes(); + ( + name, + (validator.voting_power, NetworkMetadata { + network_address: verified_metadata.net_address.clone(), + primary_address: verified_metadata.primary_address.clone(), + }), + ) + }) + .collect(); + CommitteeWithNetworkMetadata::new(self.epoch, validators) + } + + fn get_pending_active_validators( + &self, + object_store: &S, + ) -> Result, IotaError> { + let table_id = self.validators.pending_active_validators.contents.id; + let table_size = self.validators.pending_active_validators.contents.size; + let validators: Vec = + get_validators_from_table_vec(&object_store, table_id, table_size)?; + Ok(validators + .into_iter() + .map(|v| v.into_iota_validator_summary()) + .collect()) + } + + fn into_epoch_start_state(self) -> EpochStartSystemState { + EpochStartSystemState::new_v1( + self.epoch, + self.protocol_version, + self.reference_gas_price, + self.safe_mode, + self.epoch_start_timestamp_ms, + self.parameters.epoch_duration_ms, + self.validators + .iter_committee_members() + .map(|validator| { + let metadata = validator.verified_metadata(); + EpochStartValidatorInfoV1 { + iota_address: metadata.iota_address, + authority_pubkey: metadata.authority_pubkey.clone(), + network_pubkey: metadata.network_pubkey.clone(), + protocol_pubkey: metadata.protocol_pubkey.clone(), + iota_net_address: metadata.net_address.clone(), + p2p_address: metadata.p2p_address.clone(), + primary_address: metadata.primary_address.clone(), + voting_power: validator.voting_power, + hostname: metadata.name.clone(), + } + }) + .collect(), + ) + } + + fn into_iota_system_state_summary(self) -> IotaSystemStateSummary { + // If you are making any changes to IotaSystemStateV2 or any of its dependent + // types before mainnet, please also update IotaSystemStateSummary and + // its corresponding TS type. Post-mainnet, we will need to introduce a + // new version. + let Self { + epoch, + protocol_version, + system_state_version, + iota_treasury_cap, + validators: + ValidatorSetV2 { + total_stake, + active_validators, + committee_members: _, + pending_active_validators: + TableVec { + contents: + Table { + id: pending_active_validators_id, + size: pending_active_validators_size, + }, + }, + pending_removals, + staking_pool_mappings: + Table { + id: staking_pool_mappings_id, + size: staking_pool_mappings_size, + }, + inactive_validators: + Table { + id: inactive_pools_id, + size: inactive_pools_size, + }, + validator_candidates: + Table { + id: validator_candidates_id, + size: validator_candidates_size, + }, + at_risk_validators: + VecMap { + contents: at_risk_validators, + }, + extra_fields: _, + }, + storage_fund, + parameters: + SystemParametersV1 { + epoch_duration_ms, + min_validator_count, + max_validator_count, + min_validator_joining_stake, + validator_low_stake_threshold, + validator_very_low_stake_threshold, + validator_low_stake_grace_period, + extra_fields: _, + }, + iota_system_admin_cap: _, + reference_gas_price, + validator_report_records: + VecMap { + contents: validator_report_records, + }, + safe_mode, + safe_mode_storage_charges, + safe_mode_computation_rewards, + safe_mode_storage_rebates, + safe_mode_non_refundable_storage_fee, + epoch_start_timestamp_ms, + extra_fields: _, + } = self; + IotaSystemStateSummary { + epoch, + protocol_version, + system_state_version, + iota_total_supply: iota_treasury_cap.total_supply().value, + iota_treasury_cap_id: iota_treasury_cap.id().to_owned(), + storage_fund_total_object_storage_rebates: storage_fund + .total_object_storage_rebates + .value(), + storage_fund_non_refundable_balance: storage_fund.non_refundable_balance.value(), + reference_gas_price, + safe_mode, + safe_mode_storage_charges: safe_mode_storage_charges.value(), + safe_mode_computation_rewards: safe_mode_computation_rewards.value(), + safe_mode_storage_rebates, + safe_mode_non_refundable_storage_fee, + epoch_start_timestamp_ms, + epoch_duration_ms, + total_stake, + active_validators: active_validators + .into_iter() + .map(|v| v.into_iota_validator_summary()) + .collect(), + pending_active_validators_id, + pending_active_validators_size, + pending_removals, + staking_pool_mappings_id, + staking_pool_mappings_size, + inactive_pools_id, + inactive_pools_size, + validator_candidates_id, + validator_candidates_size, + at_risk_validators: at_risk_validators + .into_iter() + .map(|e| (e.key, e.value)) + .collect(), + validator_report_records: validator_report_records + .into_iter() + .map(|e| (e.key, e.value.contents)) + .collect(), + min_validator_count, + max_validator_count, + min_validator_joining_stake, + validator_low_stake_threshold, + validator_very_low_stake_threshold, + validator_low_stake_grace_period, + } + } +} diff --git a/crates/iota-types/src/iota_system_state/mod.rs b/crates/iota-types/src/iota_system_state/mod.rs index 18f4fec702d..6cf21739f02 100644 --- a/crates/iota-types/src/iota_system_state/mod.rs +++ b/crates/iota-types/src/iota_system_state/mod.rs @@ -12,6 +12,7 @@ use serde::{Deserialize, Serialize, de::DeserializeOwned}; use self::{ iota_system_state_inner_v1::{IotaSystemStateV1, ValidatorV1}, + iota_system_state_inner_v2::IotaSystemStateV2, iota_system_state_summary::{IotaSystemStateSummary, IotaValidatorSummary}, }; use crate::{ @@ -29,6 +30,7 @@ use crate::{ pub mod epoch_start_iota_system_state; pub mod iota_system_state_inner_v1; +pub mod iota_system_state_inner_v2; pub mod iota_system_state_summary; #[cfg(msim)] @@ -102,6 +104,13 @@ impl IotaSystemStateWrapper { protocol_config, ); } + 2 => { + Self::advance_epoch_safe_mode_impl::( + move_object, + params, + protocol_config, + ); + } #[cfg(msim)] IOTA_SYSTEM_STATE_SIM_TEST_V1 => { Self::advance_epoch_safe_mode_impl::( @@ -190,6 +199,7 @@ pub trait IotaSystemStateTrait { #[enum_dispatch(IotaSystemStateTrait)] pub enum IotaSystemState { V1(IotaSystemStateV1), + V2(IotaSystemStateV2), #[cfg(msim)] SimTestV1(SimTestIotaSystemStateV1), #[cfg(msim)] @@ -211,6 +221,7 @@ impl IotaSystemState { pub fn into_genesis_version_for_tooling(self) -> IotaSystemStateInnerGenesis { match self { IotaSystemState::V1(inner) => inner, + IotaSystemState::V2(_) => unreachable!(), #[cfg(msim)] _ => { // Types other than V1 used in simtests should be unreachable @@ -259,6 +270,18 @@ pub fn get_iota_system_state(object_store: &dyn ObjectStore) -> Result { + let result: IotaSystemStateV2 = + get_dynamic_field_from_store(object_store, id, &wrapper.version).map_err( + |err| { + IotaError::DynamicFieldRead(format!( + "Failed to load iota system state inner object with ID {:?} and version {:?}: {:?}", + id, wrapper.version, err + )) + }, + )?; + Ok(IotaSystemState::V2(result)) + } #[cfg(msim)] IOTA_SYSTEM_STATE_SIM_TEST_V1 => { let result: SimTestIotaSystemStateV1 =