From 952ff98113524e4e803557734160db194bd5ac35 Mon Sep 17 00:00:00 2001 From: Emma Zhong Date: Sat, 12 Nov 2022 15:17:30 -0800 Subject: [PATCH] [staking] add more comments and clean up code --- ...tests__empty_genesis_snapshot_matches.snap | 2 +- ...cal_transaction_cost__good_snapshot-2.snap | 12 +- ...rical_transaction_cost__good_snapshot.snap | 6 +- crates/sui-framework/docs/staking_pool.md | 242 +++++++----- crates/sui-framework/docs/sui_system.md | 5 +- crates/sui-framework/docs/validator.md | 67 ++-- crates/sui-framework/docs/validator_set.md | 371 ++++++++++-------- .../sources/governance/staking_pool.move | 149 ++++--- .../sources/governance/sui_system.move | 7 +- .../sources/governance/validator.move | 30 +- .../sources/governance/validator_set.move | 201 ++++++---- 11 files changed, 622 insertions(+), 470 deletions(-) diff --git a/crates/sui-config/tests/snapshots/snapshot_tests__empty_genesis_snapshot_matches.snap b/crates/sui-config/tests/snapshots/snapshot_tests__empty_genesis_snapshot_matches.snap index 254f0ff7c02a6..63027ace838d0 100644 --- a/crates/sui-config/tests/snapshots/snapshot_tests__empty_genesis_snapshot_matches.snap +++ b/crates/sui-config/tests/snapshots/snapshot_tests__empty_genesis_snapshot_matches.snap @@ -2,5 +2,5 @@ source: crates/sui-config/tests/snapshot_tests.rs expression: genesis --- -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YWxhbmNlCGJsczEyMzgxD2Vwb2NoX3RpbWVfbG9jawVzdGFrZQxzdGFraW5nX3Bvb2wDc3VpCnR4X2NvbnRleHQJVmFsaWRhdG9yEVZhbGlkYXRvck1ldGFkYXRhGmFkanVzdF9zdGFrZV9hbmRfZ2FzX3ByaWNlD2NvbW1pc3Npb25fcmF0ZR5kZWNyZWFzZV9uZXh0X2Vwb2NoX2RlbGVnYXRpb24PZGVsZWdhdGVfYW1vdW50CVR4Q29udGV4dAdkZXN0cm95B0JhbGFuY2UDU1VJEmRpc3RyaWJ1dGVfcmV3YXJkcwlnYXNfcHJpY2ULU3Rha2luZ1Bvb2wYZ2V0X3N0YWtpbmdfcG9vbF9tdXRfcmVmHmluY3JlYXNlX25leHRfZXBvY2hfZGVsZWdhdGlvbgxpc19kdXBsaWNhdGUIbWV0YWRhdGEGT3B0aW9uDUVwb2NoVGltZUxvY2sDbmV3FHBlbmRpbmdfc3Rha2VfYW1vdW50EHBlbmRpbmdfd2l0aGRyYXcbcHJvY2Vzc19wZW5kaW5nX2RlbGVnYXRpb25zFnJlcXVlc3RfYWRkX2RlbGVnYXRpb24RcmVxdWVzdF9hZGRfc3Rha2UbcmVxdWVzdF9zZXRfY29tbWlzc2lvbl9yYXRlFXJlcXVlc3Rfc2V0X2dhc19wcmljZQpEZWxlZ2F0aW9uCVN0YWtlZFN1aRtyZXF1ZXN0X3dpdGhkcmF3X2RlbGVnYXRpb24FU3Rha2UWcmVxdWVzdF93aXRoZHJhd19zdGFrZQxzdGFrZV9hbW91bnQLc3VpX2FkZHJlc3MadmVyaWZ5X3Byb29mX29mX3Bvc3Nlc3Npb24NcGVuZGluZ19zdGFrZRdkZWxlZ2F0aW9uX3N0YWtpbmdfcG9vbAxwdWJrZXlfYnl0ZXMUbmV0d29ya19wdWJrZXlfYnl0ZXMTcHJvb2Zfb2ZfcG9zc2Vzc2lvbgRuYW1lC25ldF9hZGRyZXNzEG5leHRfZXBvY2hfc3Rha2UVbmV4dF9lcG9jaF9kZWxlZ2F0aW9uFG5leHRfZXBvY2hfZ2FzX3ByaWNlGm5leHRfZXBvY2hfY29tbWlzc2lvbl9yYXRlC3N1aV9iYWxhbmNlF2RlYWN0aXZhdGVfc3Rha2luZ19wb29sBXZhbHVlBlN0cmluZwZzdHJpbmcGY3Jl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Cw8CCQAJAQMDCAAIDgEKCAMBCA4BCA0BCAABCQACBgsPAgkACQEGCQABAQEGCQEBCwcBCQAEBwsHAQUGBQcLBwEFBQIGCA4FAwcLDwIJAAkBCQAJAQIHCw8CCQAJAQYJAAEHCQECBgsHAQkABgkAAgcLBwEJAAkAAQsIAQkAAQgQAQsRAQkABQcIDgULBgEIBQsRAQgQBwgCAgsGAQgFCBABCwkBCQACCwYBCQAIEAQHCA4LBgEIBQsRAQgQBwgCAgMIAwEGCwgBCQALBQoCCgIKAgoCCgILBgEIBQsRAQgQAwMHCAIBCAMCBwgOCAMCBwgOBwgCAgcIDgYIAgMHCA4DBwgCBgcIDgcICgcICwUDBwgCBQcIDgcICgcICwMHCAIFBwgOBwgMAwMHCAICBwsHAQkABgkAB2dlbmVzaXMKc3VpX3N5c3RlbQZvcHRpb24HYmFsYW5jZQRjb2luD2Vwb2NoX3RpbWVfbG9jawtsb2NrZWRfY29pbgZvYmplY3QFc3Rha2UMc3Rha2luZ19wb29sA3N1aQh0cmFuc2Zlcgp0eF9jb250ZXh0CXZhbGlkYXRvcg12YWxpZGF0b3Jfc2V0B3ZlY19tYXAHdmVjX3NldA5TdWlTeXN0ZW1TdGF0ZRBTeXN0ZW1QYXJhbWV0ZXJzCVR4Q29udGV4dA1hZHZhbmNlX2Vwb2NoCVZhbGlkYXRvcgZTdXBwbHkDU1VJB0JhbGFuY2UGY3JlYXRlBWVwb2NoBlZlY1NldBBnZXRfcmVwb3J0ZXJzX29mEHJlcG9ydF92YWxpZGF0b3IEQ29pbhZyZXF1ZXN0X2FkZF9kZWxlZ2F0aW9uCkxvY2tlZENvaW4ncmVxdWVzdF9hZGRfZGVsZWdhdGlvbl93aXRoX2xvY2tlZF9jb2luEXJlcXVlc3RfYWRkX3N0YWtlInJlcXVlc3RfYWRkX3N0YWtlX3dpdGhfbG9ja2VkX2NvaW4VcmVxdWVzdF9hZGRfdmFsaWRhdG9yGHJlcXVlc3RfcmVtb3ZlX3ZhbGlkYXRvchtyZXF1ZXN0X3NldF9jb21taXNzaW9uX3JhdGUVcmVxdWVzdF9zZXRfZ2FzX3ByaWNlCkRlbGVnYXRpb24JU3Rha2VkU3VpGXJlcXVlc3Rfc3dpdGNoX2RlbGVnYXRpb24bcmVxdWVzdF93aXRoZHJhd19kZWxlZ2F0aW9uBVN0YWtlFnJlcXVlc3Rfd2l0aGRyYXdfc3Rha2UVdW5kb19yZXBvcnRfdmFsaWRhdG9yGXZhbGlkYXRvcl9kZWxlZ2F0ZV9hbW91bnQWdmFsaWRhdG9yX3N0YWtlX2Ftb3VudAJpZANVSUQKdmFsaWRhdG9ycwxWYWxpZGF0b3JTZXQKc3VpX3N1cHBseQxzdG9yYWdlX2Z1bmQKcGFyYW1ldGVycxNyZWZlcmVuY2VfZ2FzX3ByaWNlGHZhbGlkYXRvcl9yZXBvcnRfcmVjb3JkcwZWZWNNYXATbWluX3ZhbGlkYXRvcl9zdGFrZR1tYXhfdmFsaWRhdG9yX2NhbmRpZGF0ZV9jb3VudBFzdG9yYWdlX2dhc19wcmljZQZzZW5kZXIPaW5jcmVhc2Vfc3VwcGx5FnRvdGFsX2RlbGVnYXRpb25fc3Rha2UVdG90YWxfdmFsaWRhdG9yX3N0YWtlBXZhbHVlBXNwbGl0BGpvaW4aZGVyaXZlX3JlZmVyZW5jZV9nYXNfcHJpY2UPZGVjcmVhc2Vfc3VwcGx5BWVtcHR5A25ldxBzdWlfc3lzdGVtX3N0YXRlDHNoYXJlX29iamVjdAhjb250YWlucwNnZXQTaXNfYWN0aXZlX3ZhbGlkYXRvcglzaW5nbGV0b24GaW5zZXJ0B2dldF9tdXQMaW50b19iYWxhbmNlDUVwb2NoVGltZUxvY2sGT3B0aW9uBG5vbmUEc29tZRpuZXh0X2Vwb2NoX3ZhbGlkYXRvcl9jb3VudAZyZW1vdmUAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAwgDAAAAAAAAAAMIAgAAAAAAAAADCAEAAAAAAAAAAwgAAAAAAAAAAAMIBAAAAAAAAAAFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIIMQgNGgMzCA41CwQBCAU2CwYBCAU3CAE4AzkLDwIFCwcBBQECAzsDPAM9AwABBAASegoFLhETBwUhAwwLAAELBQEGAAAAAAAAAAAnCgAPAAsCOAAMCwoADwAKAzgADAYKABABERUMBwoAEAERFgwNCgAQAjgBDAoKBwsNFgsKFgwMCwcLAxgLDBoMCQ0GCwk4AgwICgAPAgsLOAMBCgAQAxQGAQAAAAAAAAAWCgAPAxULAQoAEAMU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AAEIBQMHCAYLBwEICAcICQIGCAYDBAcIBgUDBwgJAgUDAQgGAwUDCwcBCAEBCAQCBwgGBwgJBQcIBgsHAQgICwoBCAsFBwgJBQcIBgcIAAcIBQMHCAkBBggFAQYIBgEFBQcIAgcIBQcIAAMHCAkDBwgABwgFAwILBwEICAsKAQgLBAcIBgcIAAcIBQMDCwcBCAELBwEICAsKAQgLAwcIBgMLBwEIAQELBwEICAcFCgUDCwcBCAgKCwcBCAgDCwcBCAEBBgoJAAEBAQgIAQYLBwEJAAEIAgEHCAkBCAwBCQABCAEDCAwLBwEIAQMBCwcBCQADCAwLBwEICAsKAQgLAQgLAQYLCgEJAAELCgEJAAUFAwsHAQgIAwsHAQgBAgcLBwEJAAsHAQkAAgsHAQkABwgJAQsOAQkAAQsOAQgIAgkABQIEAwEGCw0BCQAFBwgGAwgAAwsHAQgBAgcLDQEJAAMBCw0BCQABCAMDAwUDAggFAwUFCwcBCAgDCwoBCAsLBwEIAQEGCAkECwcBCQAICwUHCAkIBQcIBgsHAQgIAwsHAQgICwoBCAsDCwcBCAEFCAsLBwEICAsKAQgLCwcBCAgICwIHCwcBCQADAQcLCgEJAAEGCQAFAQMLBwEICAQLCgEICwUHCAYDAwMDAgcLDQEJAAsHAQkACXZhbGlkYXRvcg12YWxpZGF0b3Jfc2V0DHN0YWtpbmdfcG9vbAZvcHRpb24GdmVjdG9yB2JhbGFuY2UEY29pbg9lcG9jaF90aW1lX2xvY2sLbG9ja2VkX2NvaW4Gb2JqZWN0A3N1aQh0cmFuc2Zlcgp0eF9jb250ZXh0CkRlbGVnYXRpb24PRGVsZWdhdGlvblRva2VuE0luYWN0aXZlU3Rha2luZ1Bvb2wWUGVuZGluZ0RlbGVnYXRpb25FbnRyeRRQZW5kaW5nV2l0aGRyYXdFbnRyeQlTdGFrZWRTdWkLU3Rha2luZ1Bvb2wHQmFsYW5jZQNTVUkXYmF0Y2hfcmV3YXJkc193aXRoZHJhd3MJVHhDb250ZXh0F2RlYWN0aXZhdGVfc3Rha2luZ19wb29sF2RlbGVnYXRpb25fdG9rZW5fYW1vdW50GGRlc3Ryb3lfZW1wdHlfZGVsZWdhdGlvbhhkZXN0cm95X2VtcHR5X3N0YWtlZF9zdWkSZGlzdHJpYnV0ZV9yZXdhcmRzDmdldF9zdWlfYW1vdW50EGdldF90b2tlbl9hbW91bnQjbWludF9kZWxlZ2F0aW9uX3Rva2Vuc190b19kZWxlZ2F0b3IDbmV3Gm5ld19wZW5kaW5nX3dpdGhkcmF3X2VudHJ5G3Byb2Nlc3NfcGVuZGluZ19kZWxlZ2F0aW9ucwZPcHRpb24NRXBvY2hUaW1lTG9jaxZyZXF1ZXN0X2FkZF9kZWxlZ2F0aW9uFnJlcXVlc3Rfd2l0aGRyYXdfc3Rha2URc3Rha2VkX3N1aV9hbW91bnQLc3VpX2JhbGFuY2URdmFsaWRhdG9yX2FkZHJlc3Mbd2l0aGRyYXdfZnJvbV9pbmFjdGl2ZV9wb29sF3dpdGhkcmF3X2Zyb21fcHJpbmNpcGFsEndpdGhkcmF3X3ByaW5jaXBhbCV3aXRoZHJhd19yZXdhcmRzX2FuZF9idXJuX3Bvb2xfdG9rZW5zAmlkA1VJRBNwb29sX3N0YXJ0aW5nX2Vwb2NoC3Bvb2xfdG9rZW5zFHByaW5jaXBhbF9zdWlfYW1vdW50C2R1bW15X2ZpZWxkBHBvb2wJZGVsZWdhdG9yCnN1aV9hbW91bnQZcHJpbmNpcGFsX3dpdGhkcmF3X2Ftb3VudBV3aXRoZHJhd25fcG9vbF90b2tlbnMJcHJpbmNpcGFsDnN1aV90b2tlbl9sb2NrDnN0YXJ0aW5nX2Vwb2NoDHJld2FyZHNfcG9vbBdkZWxlZ2F0aW9uX3Rva2VuX3N1cHBseQZTdXBwbHkTcGVuZGluZ19kZWxlZ2F0aW9ucxFwZW5kaW5nX3dpdGhkcmF3cwhpc19lbXB0eQV2YWx1ZQxzaGFyZV9vYmplY3QGZGVsZXRlDGRlc3Ryb3lfemVybwdpc19ub25lDGRlc3Ryb3lfbm9uZQRqb2luBENvaW4MZnJvbV9iYWxhbmNlDHN1cHBseV92YWx1ZQ9pbmNyZWFzZV9zdXBwbHkEemVybw1jcmVhdGVfc3VwcGx5BnNlbmRlcgdpc19zb21lDGRlc3Ryb3lfc29tZRBuZXdfZnJvbV9iYWxhbmNlBXNwbGl0B2V4dHJhY3QGYm9ycm93BHNvbWUEbm9uZQ9kZWNyZWFzZV9zdXBwbHkAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAwgFAAAA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CgMHCwMBCAQHCAcCBgoIAgUBCwkBAwIHCggCBQEHCAIBBggCAgYIAQUBCggCAQgBAgcIAQcIBwIHCggCBwgHAgcKCAIHCggCBQcIAQULAwEIBAsJAQgKBwgHBAcIAQsDAQgECwkBCAoHCAcCBwgBCAICBwgBBggHAwcIAQMHCAcGBwgBBwgLBwgMBQMHCAcFBwgBBwgLBwgMAwcIBwUHCAEHCA0DAwcIBwEHCgMDAwMHCAIBCAIFAwoDAwoDAwEIBAEGCwMBCQACAwMGAwMDAwYIAgMKBAQECgMDAwQEBggCCgMDAwMGCAICBggCBggCCAMDBggIBggIAwMDCggIAQgIAQYICAsKCw8BAwMDAwsQAQMDAwMDBggCBgoIAgELDwEDAgMJAAELDwEJAAEKCw8BCQABCxABCQABBwsQAQkACAQLAwEIBAMDAwcIAgsDAQgEAwIHCwMBCQADAQsDAQkAAgcLAwEJAAsDAQkAAQgKAQsJAQkABAcIAgsDAQgECwkBCAoHCAcDBwgCCwMBCAQHCAcBBQEJAAQHCggCBQMLCQEDAQYLCQEJAAEHCwkBCQACAwsJAQMEAwMDCAECCAAKCA4BCwUCCQAJAQsFCgUKCA4FBwgRBwgCCwMBCAQKCwMBCAQDBQcIAgEGCwUCCQAJAQEHCwUCCQAJAQIJAAkBAQcIEQIHCBEKCA4DCgUKCwMBCAQDAgcIAgMBCwMBCAQBBgoJAAUHCAILAwEIBAsJAQgKBQcIBwIHCAIHCAcCAwgCAgcKCQADAggCBwgHAQYIBwIHCAIFAwUDCwkBAwIGCgkABgkADgcIAQUHCAIFAwsJAQMLAwEIEgUHCggOCA4IAAsDAQgEAwsJAQgKAQYICwQHCBEHCAsHCAwDAwsDAQgSCwMBCAQLCQEICgMFAwsDAQgSAQgOAgYLBQIJAAkBBgkAAQoJAAMHCwUCCQAJAQkACQECBwsFAgkACQEGCQABBwkBBAcIAgUDCwkBAwUHCAIHCAsHCAwDBwgHBQcIAgcIDQMDBwgHCAcKAwMHCgMDAwMDAwpzdWlfc3lzdGVtDXZhbGlkYXRvcl9zZXQGb3B0aW9uBnZlY3RvcgdiYWxhbmNlD2Vwb2NoX3RpbWVfbG9jaw5wcmlvcml0eV9xdWV1ZQVzdGFrZQxzdGFraW5nX3Bvb2wDc3VpCnR4X2NvbnRleHQJdmFsaWRhdG9yB3ZlY19tYXAHdmVjX3NldA1WYWxpZGF0b3JQYWlyDFZhbGlkYXRvclNldAlWYWxpZGF0b3IaYWRqdXN0X3N0YWtlX2FuZF9nYXNfcHJpY2UHQmFsYW5jZQNTVUkGVmVjTWFwBlZlY1NldAlUeENvbnRleHQNYWR2YW5jZV9lcG9jaBpjYWxjdWxhdGVfcXVvcnVtX3RocmVzaG9sZCpjYWxjdWxhdGVfdG90YWxfc3Rha2VfYW5kX3F1b3J1bV90aHJlc2hvbGQbY29tcHV0ZV9yZXdhcmRfZGlzdHJpYnV0aW9uHGNvbnRhaW5zX2R1cGxpY2F0ZV92YWxpZGF0b3IRVmFsaWRhdG9yTWV0YWRhdGEcZGVyaXZlX25leHRfZXBvY2hfdmFsaWRhdG9ycxpkZXJpdmVfcmVmZXJlbmNlX2dhc19wcmljZRFkaXN0cmlidXRlX3Jld2FyZAZPcHRpb24OZmluZF92YWxpZGF0b3IRZ2V0X3ZhbGlkYXRvcl9tdXQRZ2V0X3ZhbGlkYXRvcl9yZWYTaXNfYWN0aXZlX3ZhbGlkYXRvcgNuZXcabmV4dF9lcG9jaF92YWxpZGF0b3JfY291bnQbcHJvY2Vzc19kZWxlZ2F0aW9uX3N3aXRjaGVzG3Byb2Nlc3NfcGVuZGluZ19kZWxlZ2F0aW9ucxhwcm9jZXNzX3BlbmRpbmdfcmVtb3ZhbHMacHJvY2Vzc19wZW5kaW5nX3ZhbGlkYXRvcnMNRXBvY2hUaW1lTG9jaxZyZXF1ZXN0X2FkZF9kZWxlZ2F0aW9uEXJlcXVlc3RfYWRkX3N0YWtlFXJlcXVlc3RfYWRkX3ZhbGlkYXRvchhyZXF1ZXN0X3JlbW92ZV92YWxpZGF0b3IbcmVxdWVzdF9zZXRfY29tbWlzc2lvbl9yYXRlFXJlcXVlc3Rfc2V0X2dhc19wcmljZQpEZWxlZ2F0aW9uCVN0YWtlZFN1aRlyZXF1ZXN0X3N3aXRjaF9kZWxlZ2F0aW9uG3JlcXVlc3Rfd2l0aGRyYXdfZGVsZWdhdGlvbgVTdGFrZRZyZXF1ZXN0X3dpdGhkcmF3X3N0YWtlEXNvcnRfcmVtb3ZhbF9saXN0FnRvdGFsX2RlbGVnYXRpb25fc3Rha2UVdG90YWxfdmFsaWRhdG9yX3N0YWtlGXZhbGlkYXRvcl9kZWxlZ2F0ZV9hbW91bnQWdmFsaWRhdG9yX3N0YWtlX2Ftb3VudARmcm9tAnRvFnF1b3J1bV9zdGFrZV90aHJlc2hvbGQRYWN0aXZlX3ZhbGlkYXRvcnMScGVuZGluZ192YWxpZGF0b3JzEHBlbmRpbmdfcmVtb3ZhbHMVbmV4dF9lcG9jaF92YWxpZGF0b3JzG3BlbmRpbmdfZGVsZWdhdGlvbl9zd2l0Y2hlcxRQZW5kaW5nV2l0aGRyYXdFbnRyeQV2YWx1ZQxzdGFrZV9hbW91bnQPZGVsZWdhdGVfYW1vdW50DGlzX2R1cGxpY2F0ZQhtZXRhZGF0YQVFbnRyeQ1Qcmlvcml0eVF1ZXVlCWdhc19wcmljZQluZXdfZW50cnkHcG9wX21heAVzcGxpdA9jb21taXNzaW9uX3JhdGUEam9pbgRub25lEmRpc3RyaWJ1dGVfcmV3YXJkcwtzdWlfYWRkcmVzcwRzb21lB2lzX3NvbWUHZXh0cmFjdAVlbXB0eQtTdGFraW5nUG9vbAhpc19lbXB0eQNwb3AYZ2V0X3N0YWtpbmdfcG9vbF9tdXRfcmVmF2JhdGNoX3Jld2FyZHNfd2l0aGRyYXdzHmRlY3JlYXNlX25leHRfZXBvY2hfZGVsZWdhdGlvbgZyZW1vdmUHZGVzdHJveQZzZW5kZXIIY29udGFpbnMPRGVsZWdhdGlvblRva2VuEXZhbGlkYXRvcl9hZGRyZXNzEndpdGhkcmF3X3ByaW5jaXBhbBpuZXdfcGVuZGluZ193aXRoZHJhd19lbnRyeQlzaW5nbGV0b24GaW5zZXJ0B2dldF9tdXQAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABBBAQJwAAAAAAAAAAAAAAAAAAAAICPQU+BQECCDoDOQM/A0AKCAJBCggCQgoDQwoICEQLBQIIAAoIDgAAAAAiGQoALkEjDAIGAAAAAAAAAAAMAQoBCgIjAwsFFgoACgFDIwwDCwMRIQsBBgEAAAAAAAAAFgwBBQYLAAECAQMAACRECgAQAAoAEAEUCgEuOAAKABACFAoCLjgAEQQMBgwICgAPABEACgAPAA4ICwEOBgsCCgQRCAoACgQRDwoADwAKBBEQCgAPAAoADwMREgoACwQREQoALhEGCgAPBBUK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lCGJsczEyMzgxD2Vwb2NoX3RpbWVfbG9jawVzdGFrZQxzdGFraW5nX3Bvb2wDc3VpCnR4X2NvbnRleHQJVmFsaWRhdG9yEVZhbGlkYXRvck1ldGFkYXRhGmFkanVzdF9zdGFrZV9hbmRfZ2FzX3ByaWNlD2NvbW1pc3Npb25fcmF0ZR5kZWNyZWFzZV9uZXh0X2Vwb2NoX2RlbGVnYXRpb24PZGVsZWdhdGVfYW1vdW50B0JhbGFuY2UDU1VJGmRlcG9zaXRfZGVsZWdhdGlvbl9yZXdhcmRzCVR4Q29udGV4dAdkZXN0cm95CWdhc19wcmljZQtTdGFraW5nUG9vbBhnZXRfc3Rha2luZ19wb29sX211dF9yZWYMaXNfZHVwbGljYXRlCG1ldGFkYXRhBk9wdGlvbg1FcG9jaFRpbWVMb2NrA25ldxRwZW5kaW5nX3N0YWtlX2Ftb3VudBBwZW5kaW5nX3dpdGhkcmF3KXByb2Nlc3NfcGVuZGluZ19kZWxlZ2F0aW9uc19hbmRfd2l0aGRyYXdzFnJlcXVlc3RfYWRkX2RlbGVnYXRpb24RcmVxdWVzdF9hZGRfc3Rha2UbcmVxdWVzdF9zZXRfY29tbWlzc2lvbl9yYXRlFXJlcXVlc3Rfc2V0X2dhc19wcmljZQpEZWxlZ2F0aW9uCVN0YWtlZFN1aRtyZXF1ZXN0X3dpdGhkcmF3X2RlbGVnYXRpb24FU3Rha2UWcmVxdWVzdF93aXRoZHJhd19zdGFrZQxzdGFrZV9hbW91bnQLc3VpX2FkZHJlc3MadmVyaWZ5X3Byb29mX29mX3Bvc3Nlc3Npb24NcGVuZGluZ19zdGFrZRdkZWxlZ2F0aW9uX3N0YWtpbmdfcG9vbAxwdWJrZXlfYnl0ZXMUbmV0d29ya19wdWJrZXlfYnl0ZXMTcHJvb2Zfb2ZfcG9zc2Vzc2lvbgRuYW1lC25ldF9hZGRyZXNzEG5leHRfZXBvY2hfc3Rha2UVbmV4dF9lcG9jaF9kZWxlZ2F0aW9uFG5leHRfZXBvY2hfZ2FzX3ByaWNlGm5leHRfZXBvY2hfY29tbWlzc2lvbl9yYXRlC3N1aV9iYWxhbmNlBXZhbHVlD2RlcG9zaXRfcmV3YXJkcxdkZWFjdGl2YXRlX3N0YWtpbmdfcG9vbAZTdHJpbmcGc3RyaW5nBmN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CBwsGAQkACwYBCQAFBwgOBwsGAQgFBwsGAQgFBgsPAgULBwEFBwgCAgcLBAEJAAsGAQkAAgULBwEFAQsPAgkACQEDAwgACA4BCggDAQgOAQgNAQgAAQkAAgYLDwIJAAkBBgkAAQEBBgkBAQsHAQkABAcLBwEFBgUHCwcBBQUCBggOBQMHCw8CCQAJAQkACQECBwsPAgkACQEGCQABBwkBAgYLBwEJAAYJAAIHCwcBCQAJAAELCAEJAAEIEAELEQEJAAUHCA4FCwYBCAULEQEIEAcIAgILBgEIBQgQAQsJAQkAAgsGAQkACBAEBwgOCwYBCAULEQEIEAcIAgIDCAMBBgsIAQkACwUKAgoCCgIKAgoCCwYBCAULEQEIEAMDBwgCAQgDAgcIDggDAgcIDgcIAgIHCA4GCAIDBwgOAwcIAgYHCA4HCAoHCAsFAwcIAgUHCA4HCAoHCAsDBwgCBQcIDgcIDAMDBwgCAgcLBwEJAAYJAAdnZW5lc2lzCnN1aV9zeXN0ZW0Gb3B0aW9uB2JhbGFuY2UEY29pbg9lcG9jaF90aW1lX2xvY2sLbG9ja2VkX2NvaW4Gb2JqZWN0BXN0YWtlDHN0YWtpbmdfcG9vbANzdWkIdHJhbnNmZXIKdHhfY29udGV4dAl2YWxpZGF0b3INdmFsaWRhdG9yX3NldAd2ZWNfbWFwB3ZlY19zZXQOU3VpU3lzdGVtU3RhdGUQU3lzdGVtUGFyYW1ldGVycwlUeENvbnRleHQNYWR2YW5jZV9lcG9jaAlWYWxpZGF0b3IGU3VwcGx5A1NVSQdCYWxhbmNlBmNyZWF0ZQVlcG9jaAZWZWNTZXQQZ2V0X3JlcG9ydGVyc19vZhByZXBvcnRfdmFsaWRhdG9yBENvaW4WcmVxdWVzdF9hZGRfZGVsZWdhdGlvbgpMb2NrZWRDb2luJ3JlcXVlc3RfYWRkX2RlbGVnYXRpb25fd2l0aF9sb2NrZWRfY29pbhFyZXF1ZXN0X2FkZF9zdGFrZSJyZXF1ZXN0X2FkZF9zdGFrZV93aXRoX2xvY2tlZF9jb2luFXJlcXVlc3RfYWRkX3ZhbGlkYXRvchhyZXF1ZXN0X3JlbW92ZV92YWxpZGF0b3IbcmVxdWVzdF9zZXRfY29tbWlzc2lvbl9yYXRlFXJlcXVlc3Rfc2V0X2dhc19wcmljZQpEZWxlZ2F0aW9uCVN0YWtlZFN1aRlyZXF1ZXN0X3N3aXRjaF9kZWxlZ2F0aW9uG3JlcXVlc3Rfd2l0aGRyYXdfZGVsZWdhdGlvbgVTdGFrZRZyZXF1ZXN0X3dpdGhkcmF3X3N0YWtlFXVuZG9fcmVwb3J0X3ZhbGlkYXRvchl2YWxpZGF0b3JfZGVsZWdhdGVfYW1vdW50FnZhbGlkYXRvcl9zdGFrZV9hbW91bnQCaWQDVUlECnZhbGlkYXRvcnMMVmFsaWRhdG9yU2V0CnN1aV9zdXBwbHkMc3RvcmFnZV9mdW5kCnBhcmFtZXRlcnMTcmVmZXJlbmNlX2dhc19wcmljZRh2YWxpZGF0b3JfcmVwb3J0X3JlY29yZHMGVmVjTWFwE21pbl92YWxpZGF0b3Jfc3Rha2UdbWF4X3ZhbGlkYXRvcl9jYW5kaWRhdGVfY291bnQRc3RvcmFnZV9nYXNfcHJpY2UGc2VuZGVyD2luY3JlYXNlX3N1cHBseRZ0b3RhbF9kZWxlZ2F0aW9uX3N0YWtlFXRvdGFsX3ZhbGlkYXRvcl9zdGFrZQV2YWx1ZQVzcGxpdARqb2luGmRlcml2ZV9yZWZlcmVuY2VfZ2FzX3ByaWNlD2RlY3JlYXNlX3N1cHBseQVlbXB0eQNuZXcQc3VpX3N5c3RlbV9zdGF0ZQxzaGFyZV9vYmplY3QIY29udGFpbnMDZ2V0E2lzX2FjdGl2ZV92YWxpZGF0b3IJc2luZ2xldG9uBmluc2VydAdnZXRfbXV0DGludG9fYmFsYW5jZQ1FcG9jaFRpbWVMb2NrBk9wdGlvbgRub25lBHNvbWUabmV4dF9lcG9jaF92YWxpZGF0b3JfY291bnQGcmVtb3ZlAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQMIAwAAAAAAAAADCAIAAAAAAAAAAwgBAAAAAAAAAAMIAAAAAAAAAAADCAQAAAAAAAAABRQAAAAAAAAAAAAAAAAAAAAAAAAAAAACCDEIDRoDMwgONQsEAQgFNgsGAQgFNwgBOAM5Cw8CBQsHAQUBAgM7AzwDPQMAAQQAEnoKBS4REwcFIQMMCwABCwUBBgAAAAAAAAAAJwoADwALAjgADAsKAA8ACgM4AAwGCgAQAREVDAcKABABERYMDQoAEAI4AQwKCgcLDRY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iHyMlJB8hNxYzIQgmKicqKB8pJSkfKiorKiwqLSouJQIHCAYKCAQDCgUKCwcBCAgDAggGBwgJAAEGCAABAwIHCAYLBwEICAEIAAEIBQIGCAYDBAcIBgUDBwgJAgUDAQgGAwUDCwcBCAEBCAQCBwgGBwgJBQcIBgsHAQgICwoBCAsFBwgJBQcIBgcIAAcIBQMHCAkBBggFAQYIBgEFBQcIAgcIBQcIAAMHCAkEBwgGBwgABwgFAwMLBwEIAQsHAQgICwoBCAsDBwgABwgFAwILBwEICAsKAQgLAwcIBgMLBwEIAQELBwEICAcFCgUDCwcBCAgKCwcBCAgDCwcBCAEBBgoJAAEBAQgIAQYLBwEJAAEIAgEHCAkBCAwBCQABCAECBwsHAQkACwcBCQADCAwLBwEIAQMBCwcBCQADCAwLBwEICAsKAQgLAQgLAQYLCgEJAAELCgEJAAIEAwEGCw0BCQAFBwgGAwgAAwsHAQgBAgcLDQEJAAMCCQAFAQsNAQkAAQgDBQUDCwcBCAgDCwcBCAECCwcBCQAHCAkBCw4BCQABCw4BCAgCCAUDBQULBwEICAMLCgEICwsHAQgBAQYICQQLBwEJAAgLBQcICQgFBwgGCwcBCAgDCwcBCAgLCgEICwMLBwEIAQUBAwsHAQgIBAsKAQgLAgcLBwEJAAMFCAsLBwEICAsKAQgLCwcBCAgICwEHCwoBCQABBgkABQcIBgMDAwMCBwsNAQkACwcBCQAJdmFsaWRhdG9yDXZhbGlkYXRvcl9zZXQMc3Rha2luZ19wb29sBm9wdGlvbgZ2ZWN0b3IHYmFsYW5jZQRjb2luD2Vwb2NoX3RpbWVfbG9jawtsb2NrZWRfY29pbgZvYmplY3QDc3VpCHRyYW5zZmVyCnR4X2NvbnRleHQKRGVsZWdhdGlvbg9EZWxlZ2F0aW9uVG9rZW4TSW5hY3RpdmVTdGFraW5nUG9vbBZQZW5kaW5nRGVsZWdhdGlvbkVudHJ5FFBlbmRpbmdXaXRoZHJhd0VudHJ5CVN0YWtlZFN1aQtTdGFraW5nUG9vbAdCYWxhbmNlA1NVSStiYXRjaF93aXRoZHJhd19yZXdhcmRzX2FuZF9idXJuX3Bvb2xfdG9rZW5zCVR4Q29udGV4dBdkZWFjdGl2YXRlX3N0YWtpbmdfcG9vbBdkZWxlZ2F0aW9uX3Rva2VuX2Ftb3VudA9kZXBvc2l0X3Jld2FyZHMYZGVzdHJveV9lbXB0eV9kZWxlZ2F0aW9uGGRlc3Ryb3lfZW1wdHlfc3Rha2VkX3N1aQ5nZXRfc3VpX2Ftb3VudBBnZXRfdG9rZW5fYW1vdW50I21pbnRfZGVsZWdhdGlvbl90b2tlbnNfdG9fZGVsZWdhdG9yA25ldxpuZXdfcGVuZGluZ193aXRoZHJhd19lbnRyeSRwcm9jZXNzX3BlbmRpbmdfZGVsZWdhdGlvbl93aXRoZHJhd3MbcHJvY2Vzc19wZW5kaW5nX2RlbGVnYXRpb25zBk9wdGlvbg1FcG9jaFRpbWVMb2NrFnJlcXVlc3RfYWRkX2RlbGVnYXRpb24bcmVxdWVzdF93aXRoZHJhd19kZWxlZ2F0aW9uEXN0YWtlZF9zdWlfYW1vdW50C3N1aV9iYWxhbmNlEXZhbGlkYXRvcl9hZGRyZXNzG3dpdGhkcmF3X2Zyb21faW5hY3RpdmVfcG9vbBd3aXRoZHJhd19mcm9tX3ByaW5jaXBhbBx3aXRoZHJhd19mcm9tX3ByaW5jaXBhbF9pbXBsJXdpdGhkcmF3X3Jld2FyZHNfYW5kX2J1cm5fcG9vbF90b2tlbnMCaWQDVUlEE3Bvb2xfc3RhcnRpbmdfZXBvY2gLcG9vbF90b2tlbnMUcHJpbmNpcGFsX3N1aV9hbW91bnQLZHVtbXlfZmllbGQEcG9vbAlkZWxlZ2F0b3IKc3VpX2Ftb3VudBlwcmluY2lwYWxfd2l0aGRyYXdfYW1vdW50FXdpdGhkcmF3bl9wb29sX3Rva2VucwlwcmluY2lwYWwOc3VpX3Rva2VuX2xvY2sOc3RhcnRpbmdfZXBvY2gMcmV3YXJkc19wb29sF2RlbGVnYXRpb25fdG9rZW5fc3VwcGx5BlN1cHBseRNwZW5kaW5nX2RlbGVnYXRpb25zEXBlbmRpbmdfd2l0aGRyYXdzCGlzX2VtcHR5BXZhbHVlDHNoYXJlX29iamVjdARqb2luBmRlbGV0ZQxkZXN0cm95X3plcm8HaXNfbm9uZQxkZXN0cm95X25vbmUMc3VwcGx5X3ZhbHVlD2luY3JlYXNlX3N1cHBseQR6ZXJvDWNyZWF0ZV9zdXBwbHkEQ29pbgxmcm9tX2JhbGFuY2UGc2VuZGVyB2lzX3N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MNAw1RTZFN0U7TzsMPiM7I0EMR0VIX0lFSkUBBwoIAgAFBwgBBwsDAQgEBwsDAQgEBgsFAgULBgEFBwgHAQYKCAIBAgMDAwMFBgoIAgMDAwMCCgMKAwIGCggCBggCAQEBBggBAQoICAEDBgcKCAIGCgMHCwMBCAQGCgMHCwMBCAQHCAcCBgoIAgUBCwkBAwIHCggCBQEHCAIBBggCAgYIAQUBCggCAQgBAgcIAQcIBwIHCggCBwgHAgcKCAIHCggCBQcIAQULAwEIBAsJAQgKBwgHBAcIAQsDAQgECwkBCAoHCAcCBwgBCAICBwgBBggHAwcIAQMHCAcGBwgBBwgLBwgMBQMHCAcFBwgBBwgLBwgMAwcIBwUHCAEHCA0DAwcIBwEHCgMDAwMHCAIBCAIFAwoDAwoDAwEIBAEGCwMBCQACAwMGAwMDAwYIAgMKBAQECgMDAwQEBggCCgMDAwMGCAICBggCBggCCAMDBggIBggIAwMDCggIAQgIAQYICAsKCw8BAwMDAwsQAQMDAwMDBggCBgoIAgELDwEDAgMJAAELDwEJAAEKCw8BCQABCxABCQABBwsQAQkACAQLAwEIBAMDAwcIAgsDAQgEAwIHCwMBCQADAQsDAQkAAgcLAwEJAAsDAQkAAQgKAQsJAQkABAcIAgsDAQgECwkBCAoHCAcCBwgCCwMBCAQBBQEJAAQHCggCBQMLCQEDAQYLCQEJAAEHCwkBCQACAwsJAQMEAwMDCAECCAAKCA4BCwUCCQAJAQsFCgUKCA4FBwgRBwgCCwMBCAQKCwMBCAQDBQcIAgEGCwUCCQAJAQEHCwUCCQAJAQIJAAkBAQcIEQIHCBEKCA4DCgUKCwMBCAQDAgcIAgMBCwMBCAQBBgoJAAUHCAILAwEIBAsJAQgKBQcIBwIHCAIHCAcCAwgCAgcKCQADAggCBwgHAQYIBwIHCAIFAwUDCwkBAwIGCgkABgkADAcIAQUHCAIFCwMBCBIFBwoIDggOCAALAwEIBAMLCQEICgEGCAsEBwgRBwgLBwgMAwMLAwEIEgsDAQgECwkBCAoDBQMLAwEIEgEIDgIGCwUCCQAJAQYJAAEKCQADBwsFAgkACQEJAAkBAgcLBQIJAAkBBgkAAQcJAQQHCAIFAwsJAQMFBwgCBwgLBwgMAwcIBwUHCAIHCA0DAwcIBwgHCgMDBwoDAwMDAwMKc3VpX3N5c3RlbQ12YWxpZGF0b3Jfc2V0Bm9wdGlvbgZ2ZWN0b3IHYmFsYW5jZQ9lcG9jaF90aW1lX2xvY2sOcHJpb3JpdHlfcXVldWUFc3Rha2UMc3Rha2luZ19wb29sA3N1aQp0eF9jb250ZXh0CXZhbGlkYXRvcgd2ZWNfbWFwB3ZlY19zZXQNVmFsaWRhdG9yUGFpcgxWYWxpZGF0b3JTZXQJVmFsaWRhdG9yGmFkanVzdF9zdGFrZV9hbmRfZ2FzX3ByaWNlB0JhbGFuY2UDU1VJBlZlY01hcAZWZWNTZXQJVHhDb250ZXh0DWFkdmFuY2VfZXBvY2gaY2FsY3VsYXRlX3F1b3J1bV90aHJlc2hvbGQqY2FsY3VsYXRlX3RvdGFsX3N0YWtlX2FuZF9xdW9ydW1fdGhyZXNob2xkG2NvbXB1dGVfcmV3YXJkX2Rpc3RyaWJ1dGlvbhxjb250YWluc19kdXBsaWNhdGVfdmFsaWRhdG9yEVZhbGlkYXRvck1ldGFkYXRhHGRlcml2ZV9uZXh0X2Vwb2NoX3ZhbGlkYXRvcnMaZGVyaXZlX3JlZmVyZW5jZV9nYXNfcHJpY2URZGlzdHJpYnV0ZV9yZXdhcmQGT3B0aW9uDmZpbmRfdmFsaWRhdG9yEWdldF92YWxpZGF0b3JfbXV0EWdldF92YWxpZGF0b3JfcmVmE2lzX2FjdGl2ZV92YWxpZGF0b3IDbmV3Gm5leHRfZXBvY2hfdmFsaWRhdG9yX2NvdW50I3Byb2Nlc3NfcGVuZGluZ19kZWxlZ2F0aW9uX3N3aXRjaGVzKXByb2Nlc3NfcGVuZGluZ19kZWxlZ2F0aW9uc19hbmRfd2l0aGRyYXdzGHByb2Nlc3NfcGVuZGluZ19yZW1vdmFscxpwcm9jZXNzX3BlbmRpbmdfdmFsaWRhdG9ycw1FcG9jaFRpbWVMb2NrFnJlcXVlc3RfYWRkX2RlbGVnYXRpb24RcmVxdWVzdF9hZGRfc3Rha2UVcmVxdWVzdF9hZGRfdmFsaWRhdG9yGHJlcXVlc3RfcmVtb3ZlX3ZhbGlkYXRvchtyZXF1ZXN0X3NldF9jb21taXNzaW9uX3JhdGUVcmVxdWVzdF9zZXRfZ2FzX3ByaWNlCkRlbGVnYXRpb24JU3Rha2VkU3VpGXJlcXVlc3Rfc3dpdGNoX2RlbGVnYXRpb24bcmVxdWVzdF93aXRoZHJhd19kZWxlZ2F0aW9uBVN0YWtlFnJlcXVlc3Rfd2l0aGRyYXdfc3Rha2URc29ydF9yZW1vdmFsX2xpc3QWdG90YWxfZGVsZWdhdGlvbl9zdGFrZRV0b3RhbF92YWxpZGF0b3Jfc3Rha2UZdmFsaWRhdG9yX2RlbGVnYXRlX2Ftb3VudBZ2YWxpZGF0b3Jfc3Rha2VfYW1vdW50BGZyb20CdG8WcXVvcnVtX3N0YWtlX3RocmVzaG9sZBFhY3RpdmVfdmFsaWRhdG9ycxJwZW5kaW5nX3ZhbGlkYXRvcnMQcGVuZGluZ19yZW1vdmFscxVuZXh0X2Vwb2NoX3ZhbGlkYXRvcnMbcGVuZGluZ19kZWxlZ2F0aW9uX3N3aXRjaGVzFFBlbmRpbmdXaXRoZHJhd0VudHJ5BXZhbHVlDHN0YWtlX2Ftb3VudA9kZWxlZ2F0ZV9hbW91bnQMaXNfZHVwbGljYXRlCG1ldGFkYXRhBUVudHJ5DVByaW9yaXR5UXVldWUJZ2FzX3ByaWNlCW5ld19lbnRyeQdwb3BfbWF4BXNwbGl0D2NvbW1pc3Npb25fcmF0ZQRqb2luBG5vbmUaZGVwb3NpdF9kZWxlZ2F0aW9uX3Jld2FyZHMLc3VpX2FkZHJlc3MEc29tZQdpc19zb21lB2V4dHJhY3QFZW1wdHkLU3Rha2luZ1Bvb2wIaXNfZW1wdHkDcG9wGGdldF9zdGFraW5nX3Bvb2xfbXV0X3JlZitiYXRjaF93aXRoZHJhd19yZXdhcmRzX2FuZF9idXJuX3Bvb2xfdG9rZW5zHmRlY3JlYXNlX25leHRfZXBvY2hfZGVsZWdhdGlvbgZyZW1vdmUHZGVzdHJveQZzZW5kZXIIY29udGFpbnMPRGVsZWdhdGlvblRva2VuEXZhbGlkYXRvcl9hZGRyZXNzF3dpdGhkcmF3X2Zyb21fcHJpbmNpcGFsGm5ld19wZW5kaW5nX3dpdGhkcmF3X2VudHJ5CXNpbmdsZXRvbgZpbnNlcnQHZ2V0X211dAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEEEBAnAAAAAAAAAAAAAAAAAAAAAgI9BT4FAQIIOgM5Az8DQAoIAkEKCAJCCgNDCggIRAsFAgg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 diff --git a/crates/sui-cost/tests/snapshots/empirical_transaction_cost__good_snapshot-2.snap b/crates/sui-cost/tests/snapshots/empirical_transaction_cost__good_snapshot-2.snap index 4b9c5e6c618c8..f32789b16cc66 100644 --- a/crates/sui-cost/tests/snapshots/empirical_transaction_cost__good_snapshot-2.snap +++ b/crates/sui-cost/tests/snapshots/empirical_transaction_cost__good_snapshot-2.snap @@ -4,13 +4,13 @@ expression: common_costs_estimate --- { "MergeCoin": { - "computation_cost": 5776, - "storage_cost": 8526, + "computation_cost": 5792, + "storage_cost": 8550, "storage_rebate": 0 }, "Publish": { - "computation_cost": 5764, - "storage_cost": 8461, + "computation_cost": 5781, + "storage_cost": 8485, "storage_rebate": 0 }, "SharedCounterAssertValue": { @@ -29,8 +29,8 @@ expression: common_costs_estimate "storage_rebate": 0 }, "SplitCoin": { - "computation_cost": 5754, - "storage_cost": 8493, + "computation_cost": 5770, + "storage_cost": 8518, "storage_rebate": 0 }, "TransferPortionSuiCoin": { diff --git a/crates/sui-cost/tests/snapshots/empirical_transaction_cost__good_snapshot.snap b/crates/sui-cost/tests/snapshots/empirical_transaction_cost__good_snapshot.snap index 7d04cc3fa9c72..9f4997f07c4cf 100644 --- a/crates/sui-cost/tests/snapshots/empirical_transaction_cost__good_snapshot.snap +++ b/crates/sui-cost/tests/snapshots/empirical_transaction_cost__good_snapshot.snap @@ -4,12 +4,12 @@ expression: common_costs_actual --- { "MergeCoin": { - "computation_cost": 694, + "computation_cost": 696, "storage_cost": 32, "storage_rebate": 0 }, "Publish": { - "computation_cost": 750, + "computation_cost": 752, "storage_cost": 83, "storage_rebate": 0 }, @@ -29,7 +29,7 @@ expression: common_costs_actual "storage_rebate": 15 }, "SplitCoin": { - "computation_cost": 820, + "computation_cost": 822, "storage_cost": 80, "storage_rebate": 0 }, diff --git a/crates/sui-framework/docs/staking_pool.md b/crates/sui-framework/docs/staking_pool.md index c3221ce989572..e279713853474 100644 --- a/crates/sui-framework/docs/staking_pool.md +++ b/crates/sui-framework/docs/staking_pool.md @@ -15,13 +15,14 @@ - [Constants](#@Constants_0) - [Function `new`](#0x2_staking_pool_new) - [Function `request_add_delegation`](#0x2_staking_pool_request_add_delegation) -- [Function `mint_delegation_tokens_to_delegator`](#0x2_staking_pool_mint_delegation_tokens_to_delegator) -- [Function `request_withdraw_stake`](#0x2_staking_pool_request_withdraw_stake) -- [Function `withdraw_principal`](#0x2_staking_pool_withdraw_principal) -- [Function `distribute_rewards`](#0x2_staking_pool_distribute_rewards) +- [Function `request_withdraw_delegation`](#0x2_staking_pool_request_withdraw_delegation) +- [Function `withdraw_from_principal`](#0x2_staking_pool_withdraw_from_principal) +- [Function `deposit_rewards`](#0x2_staking_pool_deposit_rewards) +- [Function `process_pending_delegation_withdraws`](#0x2_staking_pool_process_pending_delegation_withdraws) - [Function `process_pending_delegations`](#0x2_staking_pool_process_pending_delegations) -- [Function `batch_rewards_withdraws`](#0x2_staking_pool_batch_rewards_withdraws) +- [Function `batch_withdraw_rewards_and_burn_pool_tokens`](#0x2_staking_pool_batch_withdraw_rewards_and_burn_pool_tokens) - [Function `withdraw_rewards_and_burn_pool_tokens`](#0x2_staking_pool_withdraw_rewards_and_burn_pool_tokens) +- [Function `mint_delegation_tokens_to_delegator`](#0x2_staking_pool_mint_delegation_tokens_to_delegator) - [Function `deactivate_staking_pool`](#0x2_staking_pool_deactivate_staking_pool) - [Function `withdraw_from_inactive_pool`](#0x2_staking_pool_withdraw_from_inactive_pool) - [Function `destroy_empty_delegation`](#0x2_staking_pool_destroy_empty_delegation) @@ -31,7 +32,7 @@ - [Function `staked_sui_amount`](#0x2_staking_pool_staked_sui_amount) - [Function `delegation_token_amount`](#0x2_staking_pool_delegation_token_amount) - [Function `new_pending_withdraw_entry`](#0x2_staking_pool_new_pending_withdraw_entry) -- [Function `withdraw_from_principal`](#0x2_staking_pool_withdraw_from_principal) +- [Function `withdraw_from_principal_impl`](#0x2_staking_pool_withdraw_from_principal_impl) - [Function `get_sui_amount`](#0x2_staking_pool_get_sui_amount) - [Function `get_token_amount`](#0x2_staking_pool_get_token_amount) @@ -297,7 +298,7 @@ has delegated to a staking pool.
The pool tokens representing the amount of rewards the delegator can get back when they withdraw - from the pool. If this field is none, that means the delegation hasn't been activated yet. + from the pool.
principal_sui_amount: u64 @@ -493,62 +494,18 @@ when the delegation object containing the pool tokens is distributed to the dele - - -## Function `mint_delegation_tokens_to_delegator` - -Activate a delegation. New pool tokens are minted at the current exchange rate and put into the -pool_tokens field of the delegation object. -After activation, the delegation officially counts toward the staking power of the validator. -Aborts if the pool mismatches, the delegation is already activated, or the delegation cannot be activated yet. - - -
public(friend) fun mint_delegation_tokens_to_delegator(pool: &mut staking_pool::StakingPool, delegator: address, sui_amount: u64, ctx: &mut tx_context::TxContext)
-
- - - -
-Implementation - - -
public(friend) fun mint_delegation_tokens_to_delegator(
-    pool: &mut StakingPool,
-    delegator: address,
-    sui_amount: u64,
-    ctx: &mut TxContext
-) {
-    let new_pool_token_amount = get_token_amount(pool, sui_amount);
-
-    // Mint new pool tokens at the current exchange rate.
-    let pool_tokens = balance::increase_supply(&mut pool.delegation_token_supply, new_pool_token_amount);
-
-    let delegation = Delegation {
-        id: object::new(ctx),
-        validator_address: pool.validator_address,
-        pool_starting_epoch: pool.starting_epoch,
-        pool_tokens,
-        principal_sui_amount: sui_amount,
-    };
-
-    transfer::transfer(delegation, delegator);
-}
-
- - - -
- - + -## Function `request_withdraw_stake` +## Function `request_withdraw_delegation` -Withdraw withdraw_pool_token_amount worth of delegated stake from a staking pool. A proportional amount of principal -in SUI will be withdrawn and transferred to the delegator. The rewards portion is withdrawn at the end of the epoch. +Request to withdraw withdraw_pool_token_amount worth of delegated stake from a staking pool. +A proportional amount of principal in SUI is withdrawn and transferred to the delegator. +The rewards portion will be withdrawn at the end of the epoch, after the rewards have come in so we +can use the new exchange rate to calculate the rewards. Returns the amount of SUI withdrawn. -
public(friend) fun request_withdraw_stake(pool: &mut staking_pool::StakingPool, delegation: &mut staking_pool::Delegation, staked_sui: &mut staking_pool::StakedSui, withdraw_pool_token_amount: u64, ctx: &mut tx_context::TxContext): u64
+
public(friend) fun request_withdraw_delegation(pool: &mut staking_pool::StakingPool, delegation: &mut staking_pool::Delegation, staked_sui: &mut staking_pool::StakedSui, withdraw_pool_token_amount: u64, ctx: &mut tx_context::TxContext): u64
 
@@ -557,7 +514,7 @@ Returns the amount of SUI withdrawn. Implementation -
public(friend) fun request_withdraw_stake(
+
public(friend) fun request_withdraw_delegation(
     pool: &mut StakingPool,
     delegation: &mut Delegation,
     staked_sui: &mut StakedSui,
@@ -565,7 +522,7 @@ Returns the amount of SUI withdrawn.
     ctx: &mut TxContext
 ) : u64 {
     let (withdrawn_pool_tokens, principal_withdraw, time_lock) =
-        withdraw_principal(pool, delegation, staked_sui, withdraw_pool_token_amount);
+        withdraw_from_principal(pool, delegation, staked_sui, withdraw_pool_token_amount);
 
     let principal_withdraw_amount = balance::value(&principal_withdraw);
 
@@ -588,14 +545,20 @@ Returns the amount of SUI withdrawn.
 
 
 
-
+
 
-## Function `withdraw_principal`
+## Function `withdraw_from_principal`
 
-Withdraw a proportional amount of the principal SUI stored in the StakedSui object.
+Withdraw a proportional amount of the principal SUI stored in the StakedSui object, as
+well as the requested amount of pool tokens from the delegation object.
+For example, suppose the delegation object contains 15 pool tokens and the principal SUI
+amount is 21. Then if withdraw_pool_token_amount is 5, 5 pool tokens and 7 SUI tokens will
+be withdrawn.
+Returns values are withdrawn pool tokens, withdrawn principal portion of SUI, and its
+time lock if applicable.
 
 
-
public(friend) fun withdraw_principal(pool: &mut staking_pool::StakingPool, delegation: &mut staking_pool::Delegation, staked_sui: &mut staking_pool::StakedSui, withdraw_pool_token_amount: u64): (balance::Balance<staking_pool::DelegationToken>, balance::Balance<sui::SUI>, option::Option<epoch_time_lock::EpochTimeLock>)
+
public(friend) fun withdraw_from_principal(pool: &mut staking_pool::StakingPool, delegation: &mut staking_pool::Delegation, staked_sui: &mut staking_pool::StakedSui, withdraw_pool_token_amount: u64): (balance::Balance<staking_pool::DelegationToken>, balance::Balance<sui::SUI>, option::Option<epoch_time_lock::EpochTimeLock>)
 
@@ -604,12 +567,13 @@ Withdraw a proportional amount of the principal SUI stored in the StakedSui obje Implementation -
public(friend) fun withdraw_principal(
+
public(friend) fun withdraw_from_principal(
     pool: &mut StakingPool,
     delegation: &mut Delegation,
     staked_sui: &mut StakedSui,
     withdraw_pool_token_amount: u64,
 ) : (Balance<DelegationToken>, Balance<SUI>, Option<EpochTimeLock>) {
+    // Check that the delegation information matches the pool.
     assert!(
         delegation.validator_address == pool.validator_address &&
         delegation.pool_starting_epoch == pool.starting_epoch,
@@ -626,7 +590,7 @@ Withdraw a proportional amount of the principal SUI stored in the StakedSui obje
     let sui_withdraw_from_principal =
         (delegation.principal_sui_amount as u128) * (withdraw_pool_token_amount as u128) / (pool_token_balance as u128);
 
-    let (principal_withdraw, time_lock) = withdraw_from_principal(delegation, staked_sui, (sui_withdraw_from_principal as u64));
+    let (principal_withdraw, time_lock) = withdraw_from_principal_impl(delegation, staked_sui, (sui_withdraw_from_principal as u64));
 
     (
         balance::split(&mut delegation.pool_tokens, withdraw_pool_token_amount),
@@ -640,14 +604,14 @@ Withdraw a proportional amount of the principal SUI stored in the StakedSui obje
 
 
 
-
+
 
-## Function `distribute_rewards`
+## Function `deposit_rewards`
 
-Called at epoch advancement times to add rewards (in SUI) to the staking pool, and process pending withdraws.
+Called at epoch advancement times to add rewards (in SUI) to the staking pool.
 
 
-
public(friend) fun distribute_rewards(pool: &mut staking_pool::StakingPool, rewards: balance::Balance<sui::SUI>, ctx: &mut tx_context::TxContext): u64
+
public(friend) fun deposit_rewards(pool: &mut staking_pool::StakingPool, rewards: balance::Balance<sui::SUI>)
 
@@ -656,9 +620,35 @@ Called at epoch advancement times to add rewards (in SUI) to the staking pool, a Implementation -
public(friend) fun distribute_rewards(pool: &mut StakingPool, rewards: Balance<SUI>, ctx: &mut TxContext): u64 {
+
public(friend) fun deposit_rewards(pool: &mut StakingPool, rewards: Balance<SUI>) {
     pool.sui_balance = pool.sui_balance + balance::value(&rewards);
     balance::join(&mut pool.rewards_pool, rewards);
+}
+
+ + + + + + + +## Function `process_pending_delegation_withdraws` + +Called at epoch boundaries to process pending delegation withdraws requested during the epoch. +For each pending withdraw entry, we withdraw the rewards from the pool at the new exchange rate and burn the pool +tokens. + + +
public(friend) fun process_pending_delegation_withdraws(pool: &mut staking_pool::StakingPool, ctx: &mut tx_context::TxContext): u64
+
+ + + +
+Implementation + + +
public(friend) fun process_pending_delegation_withdraws(pool: &mut StakingPool, ctx: &mut TxContext) : u64 {
     let total_reward_withdraw = 0;
 
     while (!vector::is_empty(&pool.pending_withdraws)) {
@@ -680,9 +670,11 @@ Called at epoch advancement times to add rewards (in SUI) to the staking pool, a
 ## Function `process_pending_delegations`
 
 Called at epoch boundaries to mint new pool tokens to new delegators at the new exchange rate.
+New delegators include both entirely new delegations and delegations switched to this staking pool
+during the previous epoch.
 
 
-
public(friend) fun process_pending_delegations(pool: &mut staking_pool::StakingPool, ctx: &mut tx_context::TxContext): u64
+
public(friend) fun process_pending_delegations(pool: &mut staking_pool::StakingPool, ctx: &mut tx_context::TxContext)
 
@@ -691,14 +683,12 @@ Called at epoch boundaries to mint new pool tokens to new delegators at the new Implementation -
public(friend) fun process_pending_delegations(pool: &mut StakingPool, ctx: &mut TxContext) : u64 {
-    let before_sui_balance = pool.sui_balance;
+
public(friend) fun process_pending_delegations(pool: &mut StakingPool, ctx: &mut TxContext) {
     while (!vector::is_empty(&pool.pending_delegations)) {
         let PendingDelegationEntry { delegator, sui_amount } = vector::pop_back(&mut pool.pending_delegations);
         mint_delegation_tokens_to_delegator(pool, delegator, sui_amount, ctx);
         pool.sui_balance = pool.sui_balance + sui_amount;
     };
-    pool.sui_balance - before_sui_balance
 }
 
@@ -706,14 +696,21 @@ Called at epoch boundaries to mint new pool tokens to new delegators at the new
- + -## Function `batch_rewards_withdraws` +## Function `batch_withdraw_rewards_and_burn_pool_tokens` Called by validator_set at epoch boundaries for delegation switches. +This function goes through the provided vector of pending withdraw entries, +and for each entry, calls withdraw_rewards_and_burn_pool_tokens to withdraw +the rewards portion of the delegation and burn the pool tokens. We then aggregate +the delegator addresses and their rewards into vectors, as well as calculate +the total amount of rewards SUI withdrawn. These three return values are then +used in validator_set's delegation switching code to deposit the rewards part +into the new validator's staking pool. -
public(friend) fun batch_rewards_withdraws(pool: &mut staking_pool::StakingPool, entries: vector<staking_pool::PendingWithdrawEntry>): (vector<address>, vector<balance::Balance<sui::SUI>>, u64)
+
public(friend) fun batch_withdraw_rewards_and_burn_pool_tokens(pool: &mut staking_pool::StakingPool, entries: vector<staking_pool::PendingWithdrawEntry>): (vector<address>, vector<balance::Balance<sui::SUI>>, u64)
 
@@ -722,7 +719,7 @@ Called by validator_set at epoch boundaries for delegation switches. Implementation -
public(friend) fun batch_rewards_withdraws(
+
public(friend) fun batch_withdraw_rewards_and_burn_pool_tokens(
     pool: &mut StakingPool,
     entries: vector<PendingWithdrawEntry>,
 ) : (vector<address>, vector<Balance<SUI>>, u64) {
@@ -748,9 +745,19 @@ Called by validator_set at epoch boundaries for delegation switches.
 
 ## Function `withdraw_rewards_and_burn_pool_tokens`
 
+This function does the following:
+1. Calculates the total amount of SUI (including principal and rewards) that the provided pool tokens represent
+at the current exchange rate.
+2. Using the above number and the given principal_withdraw_amount, calculates the rewards portion of the
+delegation we should withdraw.
+3. Withdraws the rewards portion from the rewards pool at the current exchange rate. We only withdraw the rewards
+portion because the principal portion was already taken out of the delegator's self custodied StakedSui at request
+time in request_withdraw_stake.
+4. Since SUI tokens are withdrawn, we need to burn the corresponding pool tokens to keep the exchange rate the same.
+5. Updates the SUI balance amount of the pool.
 
 
-
public(friend) fun withdraw_rewards_and_burn_pool_tokens(pool: &mut staking_pool::StakingPool, principal_withdraw_amount: u64, withdrawn_pool_tokens: balance::Balance<staking_pool::DelegationToken>): balance::Balance<sui::SUI>
+
fun withdraw_rewards_and_burn_pool_tokens(pool: &mut staking_pool::StakingPool, principal_withdraw_amount: u64, withdrawn_pool_tokens: balance::Balance<staking_pool::DelegationToken>): balance::Balance<sui::SUI>
 
@@ -759,7 +766,7 @@ Called by validator_set at epoch boundaries for delegation switches. Implementation -
public(friend) fun withdraw_rewards_and_burn_pool_tokens(
+
fun withdraw_rewards_and_burn_pool_tokens(
     pool: &mut StakingPool,
     principal_withdraw_amount: u64,
     withdrawn_pool_tokens: Balance<DelegationToken>,
@@ -779,6 +786,50 @@ Called by validator_set at epoch boundaries for delegation switches.
 
 
 
+
+
+
+
+## Function `mint_delegation_tokens_to_delegator`
+
+Given the sui_amount, mint the corresponding amount of pool tokens at the current exchange
+rate, puts the pool tokens in a delegation object, and gives the delegation object to the delegator.
+
+
+
fun mint_delegation_tokens_to_delegator(pool: &mut staking_pool::StakingPool, delegator: address, sui_amount: u64, ctx: &mut tx_context::TxContext)
+
+ + + +
+Implementation + + +
fun mint_delegation_tokens_to_delegator(
+    pool: &mut StakingPool,
+    delegator: address,
+    sui_amount: u64,
+    ctx: &mut TxContext
+) {
+    let new_pool_token_amount = get_token_amount(pool, sui_amount);
+
+    // Mint new pool tokens at the current exchange rate.
+    let pool_tokens = balance::increase_supply(&mut pool.delegation_token_supply, new_pool_token_amount);
+
+    let delegation = Delegation {
+        id: object::new(ctx),
+        validator_address: pool.validator_address,
+        pool_starting_epoch: pool.starting_epoch,
+        pool_tokens,
+        principal_sui_amount: sui_amount,
+    };
+
+    transfer::transfer(delegation, delegator);
+}
+
+ + +
@@ -812,7 +863,9 @@ After this pool deactivation, the pool stops earning rewards. Only delegation wi ## Function `withdraw_from_inactive_pool` -Withdraw delegation from an inactive pool. +Withdraw delegation from an inactive pool. Since no epoch rewards will be added to an inactive pool, +the exchange rate between pool tokens and SUI tokens stay the same. Therefore, unlike withdrawing +from an active pool, we can handle both principal and rewards withdraws directly here.
public entry fun withdraw_from_inactive_pool(inactive_pool: &mut staking_pool::InactiveStakingPool, staked_sui: &mut staking_pool::StakedSui, delegation: &mut staking_pool::Delegation, withdraw_pool_token_amount: u64, ctx: &mut tx_context::TxContext)
@@ -833,7 +886,7 @@ Withdraw delegation from an inactive pool.
 ) {
     let pool = &mut inactive_pool.pool;
     let (withdrawn_pool_tokens, principal_withdraw, time_lock) =
-        withdraw_principal(pool, delegation, staked_sui, withdraw_pool_token_amount);
+        withdraw_from_principal(pool, delegation, staked_sui, withdraw_pool_token_amount);
     let principal_withdraw_amount = balance::value(&principal_withdraw);
     let rewards_withdraw = withdraw_rewards_and_burn_pool_tokens(pool, principal_withdraw_amount, withdrawn_pool_tokens);
     let total_withdraw_amount = principal_withdraw_amount + balance::value(&rewards_withdraw);
@@ -1017,6 +1070,7 @@ Destroy an empty delegation that no longer contains any SUI or pool tokens.
 
 ## Function `new_pending_withdraw_entry`
 
+Create a new pending withdraw entry.
 
 
 
public(friend) fun new_pending_withdraw_entry(delegator: address, principal_withdraw_amount: u64, withdrawn_pool_tokens: balance::Balance<staking_pool::DelegationToken>): staking_pool::PendingWithdrawEntry
@@ -1041,15 +1095,15 @@ Destroy an empty delegation that no longer contains any SUI or pool tokens.
 
 
 
-
+
 
-## Function `withdraw_from_principal`
+## Function `withdraw_from_principal_impl`
 
-Withdraw withdraw_amount of SUI tokens from the delegation and give it back to the delegator
-in the original state of the tokens.
+Withdraw withdraw_sui_amount of SUI tokens from the principal stored in the staked_sui together with its time lock
+if applicable, and also decrement the principal_sui_amount field of the delegation object.
 
 
-
fun withdraw_from_principal(delegation: &mut staking_pool::Delegation, staked_sui: &mut staking_pool::StakedSui, withdraw_amount: u64): (balance::Balance<sui::SUI>, option::Option<epoch_time_lock::EpochTimeLock>)
+
fun withdraw_from_principal_impl(delegation: &mut staking_pool::Delegation, staked_sui: &mut staking_pool::StakedSui, withdraw_sui_amount: u64): (balance::Balance<sui::SUI>, option::Option<epoch_time_lock::EpochTimeLock>)
 
@@ -1058,14 +1112,16 @@ in the original state of the tokens. Implementation -
fun withdraw_from_principal(
+
fun withdraw_from_principal_impl(
     delegation: &mut Delegation,
     staked_sui: &mut StakedSui,
-    withdraw_amount: u64,
+    withdraw_sui_amount: u64,
 ) : (Balance<SUI>, Option<EpochTimeLock>) {
-    assert!(balance::value(&staked_sui.principal) >= withdraw_amount, EINSUFFICIENT_SUI_TOKEN_BALANCE);
-    delegation.principal_sui_amount = delegation.principal_sui_amount - withdraw_amount;
-    let principal_withdraw = balance::split(&mut staked_sui.principal, withdraw_amount);
+    assert!(balance::value(&staked_sui.principal) >= withdraw_sui_amount, EINSUFFICIENT_SUI_TOKEN_BALANCE);
+    // Decrement the principal sui value stored in delegation object.
+    delegation.principal_sui_amount = delegation.principal_sui_amount - withdraw_sui_amount;
+    // Withdraw the SUI balance from the staked sui object. Return it and its time lock.
+    let principal_withdraw = balance::split(&mut staked_sui.principal, withdraw_sui_amount);
     if (option::is_some(&staked_sui.sui_token_lock)) {
         let time_lock =
             if (balance::value(&staked_sui.principal) == 0) {option::extract(&mut staked_sui.sui_token_lock)}
diff --git a/crates/sui-framework/docs/sui_system.md b/crates/sui-framework/docs/sui_system.md
index 722d3dcd4ab7e..f31d972018e35 100644
--- a/crates/sui-framework/docs/sui_system.md
+++ b/crates/sui-framework/docs/sui_system.md
@@ -218,7 +218,7 @@ The top-level object containing all information of the Sui system.
 ## Function `create`
 
 Create a new SuiSystemState object and make it shared.
-This function will be called only once in Genesis.
+This function will be called only once in genesis.
 
 
 
public(friend) fun create(validators: vector<validator::Validator>, sui_supply: balance::Supply<sui::SUI>, storage_fund: balance::Balance<sui::SUI>, max_validator_candidate_count: u64, min_validator_stake: u64, storage_gas_price: u64)
@@ -539,6 +539,7 @@ If the sender represents an active validator, the request will be processed at t
 
 ## Function `request_add_delegation`
 
+Add delegated stake to a validator's staking pool.
 
 
 
public entry fun request_add_delegation(self: &mut sui_system::SuiSystemState, delegate_stake: coin::Coin<sui::SUI>, validator_address: address, ctx: &mut tx_context::TxContext)
@@ -574,6 +575,7 @@ If the sender represents an active validator, the request will be processed at t
 
 ## Function `request_add_delegation_with_locked_coin`
 
+Add delegated stake to a validator's staking pool using a locked SUI coin.
 
 
 
public entry fun request_add_delegation_with_locked_coin(self: &mut sui_system::SuiSystemState, delegate_stake: locked_coin::LockedCoin<sui::SUI>, validator_address: address, ctx: &mut tx_context::TxContext)
@@ -604,6 +606,7 @@ If the sender represents an active validator, the request will be processed at t
 
 ## Function `request_withdraw_delegation`
 
+Withdraw some portion of a delegation from a validator's staking pool.
 
 
 
public entry fun request_withdraw_delegation(self: &mut sui_system::SuiSystemState, delegation: &mut staking_pool::Delegation, staked_sui: &mut staking_pool::StakedSui, withdraw_pool_token_amount: u64, ctx: &mut tx_context::TxContext)
diff --git a/crates/sui-framework/docs/validator.md b/crates/sui-framework/docs/validator.md
index 6714dbebc2aec..691f3a31128d1 100644
--- a/crates/sui-framework/docs/validator.md
+++ b/crates/sui-framework/docs/validator.md
@@ -15,13 +15,12 @@
 -  [Function `request_withdraw_stake`](#0x2_validator_request_withdraw_stake)
 -  [Function `adjust_stake_and_gas_price`](#0x2_validator_adjust_stake_and_gas_price)
 -  [Function `request_add_delegation`](#0x2_validator_request_add_delegation)
--  [Function `increase_next_epoch_delegation`](#0x2_validator_increase_next_epoch_delegation)
 -  [Function `request_withdraw_delegation`](#0x2_validator_request_withdraw_delegation)
 -  [Function `decrease_next_epoch_delegation`](#0x2_validator_decrease_next_epoch_delegation)
 -  [Function `request_set_gas_price`](#0x2_validator_request_set_gas_price)
 -  [Function `request_set_commission_rate`](#0x2_validator_request_set_commission_rate)
--  [Function `distribute_rewards`](#0x2_validator_distribute_rewards)
--  [Function `process_pending_delegations`](#0x2_validator_process_pending_delegations)
+-  [Function `deposit_delegation_rewards`](#0x2_validator_deposit_delegation_rewards)
+-  [Function `process_pending_delegations_and_withdraws`](#0x2_validator_process_pending_delegations_and_withdraws)
 -  [Function `get_staking_pool_mut_ref`](#0x2_validator_get_staking_pool_mut_ref)
 -  [Function `metadata`](#0x2_validator_metadata)
 -  [Function `sui_address`](#0x2_validator_sui_address)
@@ -425,7 +424,7 @@ stake still satisfy the minimum requirement.
 
 ## Function `adjust_stake_and_gas_price`
 
-Process pending stake and pending withdraws.
+Process pending stake and pending withdraws, and update the gas price.
 
 
 
public(friend) fun adjust_stake_and_gas_price(self: &mut validator::Validator)
@@ -455,6 +454,7 @@ Process pending stake and pending withdraws.
 
 ## Function `request_add_delegation`
 
+Request to add delegation to the validator's staking pool, processed at the end of the epoch.
 
 
 
public(friend) fun request_add_delegation(self: &mut validator::Validator, delegated_stake: balance::Balance<sui::SUI>, locking_period: option::Option<epoch_time_lock::EpochTimeLock>, delegator: address, ctx: &mut tx_context::TxContext)
@@ -476,32 +476,7 @@ Process pending stake and pending withdraws.
     let delegate_amount = balance::value(&delegated_stake);
     assert!(delegate_amount > 0, 0);
     staking_pool::request_add_delegation(&mut self.delegation_staking_pool, delegated_stake, locking_period, delegator, ctx);
-
-    increase_next_epoch_delegation(self, delegate_amount);
-}
-
- - - - - - - -## Function `increase_next_epoch_delegation` - - - -
public(friend) fun increase_next_epoch_delegation(self: &mut validator::Validator, amount: u64)
-
- - - -
-Implementation - - -
public(friend) fun increase_next_epoch_delegation(self: &mut Validator, amount: u64) {
-    self.metadata.next_epoch_delegation = self.metadata.next_epoch_delegation + amount;
+    self.metadata.next_epoch_delegation = self.metadata.next_epoch_delegation + delegate_amount;
 }
 
@@ -513,6 +488,7 @@ Process pending stake and pending withdraws. ## Function `request_withdraw_delegation` +Request to withdraw delegation from the validator's staking pool, processed at the end of the epoch.
public(friend) fun request_withdraw_delegation(self: &mut validator::Validator, delegation: &mut staking_pool::Delegation, staked_sui: &mut staking_pool::StakedSui, withdraw_pool_token_amount: u64, ctx: &mut tx_context::TxContext)
@@ -531,7 +507,7 @@ Process pending stake and pending withdraws.
     withdraw_pool_token_amount: u64,
     ctx: &mut TxContext,
 ) {
-    let withdraw_sui_amount = staking_pool::request_withdraw_stake(
+    let withdraw_sui_amount = staking_pool::request_withdraw_delegation(
             &mut self.delegation_staking_pool, delegation, staked_sui, withdraw_pool_token_amount, ctx);
     decrease_next_epoch_delegation(self, withdraw_sui_amount);
 }
@@ -545,6 +521,7 @@ Process pending stake and pending withdraws.
 
 ## Function `decrease_next_epoch_delegation`
 
+Decrement the delegation amount for next epoch. Also called by validator_set when handling delegation switches.
 
 
 
public(friend) fun decrease_next_epoch_delegation(self: &mut validator::Validator, amount: u64)
@@ -569,6 +546,7 @@ Process pending stake and pending withdraws.
 
 ## Function `request_set_gas_price`
 
+Request to set new gas price for the next epoch.
 
 
 
public(friend) fun request_set_gas_price(self: &mut validator::Validator, new_price: u64)
@@ -613,13 +591,14 @@ Process pending stake and pending withdraws.
 
 
- + -## Function `distribute_rewards` +## Function `deposit_delegation_rewards` +Deposit delegations rewards into the validator's staking pool, called at the end of the epoch. -
public(friend) fun distribute_rewards(self: &mut validator::Validator, reward: balance::Balance<sui::SUI>, ctx: &mut tx_context::TxContext)
+
public(friend) fun deposit_delegation_rewards(self: &mut validator::Validator, reward: balance::Balance<sui::SUI>)
 
@@ -628,10 +607,9 @@ Process pending stake and pending withdraws. Implementation -
public(friend) fun distribute_rewards(self: &mut Validator, reward: Balance<SUI>, ctx: &mut TxContext) {
+
public(friend) fun deposit_delegation_rewards(self: &mut Validator, reward: Balance<SUI>) {
     self.metadata.next_epoch_delegation = self.metadata.next_epoch_delegation + balance::value(&reward);
-    let reward_withdraw = staking_pool::distribute_rewards(&mut self.delegation_staking_pool, reward, ctx);
-    self.metadata.next_epoch_delegation = self.metadata.next_epoch_delegation - reward_withdraw;
+    staking_pool::deposit_rewards(&mut self.delegation_staking_pool, reward);
 }
 
@@ -639,13 +617,14 @@ Process pending stake and pending withdraws. - + -## Function `process_pending_delegations` +## Function `process_pending_delegations_and_withdraws` +Process pending delegations and withdraws, called at the end of the epoch. -
public(friend) fun process_pending_delegations(self: &mut validator::Validator, ctx: &mut tx_context::TxContext)
+
public(friend) fun process_pending_delegations_and_withdraws(self: &mut validator::Validator, ctx: &mut tx_context::TxContext)
 
@@ -654,8 +633,11 @@ Process pending stake and pending withdraws. Implementation -
public(friend) fun process_pending_delegations(self: &mut Validator, ctx: &mut TxContext) {
-    let _sui_deposit = staking_pool::process_pending_delegations(&mut self.delegation_staking_pool, ctx);
+
public(friend) fun process_pending_delegations_and_withdraws(self: &mut Validator, ctx: &mut TxContext) {
+    staking_pool::process_pending_delegations(&mut self.delegation_staking_pool, ctx);
+    let reward_withdraw_amount = staking_pool::process_pending_delegation_withdraws(
+        &mut self.delegation_staking_pool, ctx);
+    self.metadata.next_epoch_delegation = self.metadata.next_epoch_delegation - reward_withdraw_amount;
     assert!(delegate_amount(self) == self.metadata.next_epoch_delegation, 0);
 }
 
@@ -668,6 +650,7 @@ Process pending stake and pending withdraws. ## Function `get_staking_pool_mut_ref` +Called by validator_set for handling delegation switches.
public(friend) fun get_staking_pool_mut_ref(self: &mut validator::Validator): &mut staking_pool::StakingPool
diff --git a/crates/sui-framework/docs/validator_set.md b/crates/sui-framework/docs/validator_set.md
index 1479a718f4f0b..50823356552cd 100644
--- a/crates/sui-framework/docs/validator_set.md
+++ b/crates/sui-framework/docs/validator_set.md
@@ -9,25 +9,23 @@
 -  [Struct `ValidatorPair`](#0x2_validator_set_ValidatorPair)
 -  [Constants](#@Constants_0)
 -  [Function `new`](#0x2_validator_set_new)
--  [Function `next_epoch_validator_count`](#0x2_validator_set_next_epoch_validator_count)
 -  [Function `request_add_validator`](#0x2_validator_set_request_add_validator)
 -  [Function `request_remove_validator`](#0x2_validator_set_request_remove_validator)
 -  [Function `request_add_stake`](#0x2_validator_set_request_add_stake)
 -  [Function `request_withdraw_stake`](#0x2_validator_set_request_withdraw_stake)
--  [Function `is_active_validator`](#0x2_validator_set_is_active_validator)
 -  [Function `request_add_delegation`](#0x2_validator_set_request_add_delegation)
--  [Function `request_set_gas_price`](#0x2_validator_set_request_set_gas_price)
--  [Function `request_set_commission_rate`](#0x2_validator_set_request_set_commission_rate)
 -  [Function `request_withdraw_delegation`](#0x2_validator_set_request_withdraw_delegation)
 -  [Function `request_switch_delegation`](#0x2_validator_set_request_switch_delegation)
--  [Function `process_delegation_switches`](#0x2_validator_set_process_delegation_switches)
--  [Function `process_pending_delegations`](#0x2_validator_set_process_pending_delegations)
+-  [Function `request_set_gas_price`](#0x2_validator_set_request_set_gas_price)
+-  [Function `request_set_commission_rate`](#0x2_validator_set_request_set_commission_rate)
 -  [Function `advance_epoch`](#0x2_validator_set_advance_epoch)
 -  [Function `derive_reference_gas_price`](#0x2_validator_set_derive_reference_gas_price)
 -  [Function `total_validator_stake`](#0x2_validator_set_total_validator_stake)
 -  [Function `total_delegation_stake`](#0x2_validator_set_total_delegation_stake)
 -  [Function `validator_stake_amount`](#0x2_validator_set_validator_stake_amount)
 -  [Function `validator_delegate_amount`](#0x2_validator_set_validator_delegate_amount)
+-  [Function `next_epoch_validator_count`](#0x2_validator_set_next_epoch_validator_count)
+-  [Function `is_active_validator`](#0x2_validator_set_is_active_validator)
 -  [Function `contains_duplicate_validator`](#0x2_validator_set_contains_duplicate_validator)
 -  [Function `find_validator`](#0x2_validator_set_find_validator)
 -  [Function `get_validator_mut`](#0x2_validator_set_get_validator_mut)
@@ -35,6 +33,8 @@
 -  [Function `process_pending_removals`](#0x2_validator_set_process_pending_removals)
 -  [Function `process_pending_validators`](#0x2_validator_set_process_pending_validators)
 -  [Function `sort_removal_list`](#0x2_validator_set_sort_removal_list)
+-  [Function `process_pending_delegation_switches`](#0x2_validator_set_process_pending_delegation_switches)
+-  [Function `process_pending_delegations_and_withdraws`](#0x2_validator_set_process_pending_delegations_and_withdraws)
 -  [Function `calculate_total_stake_and_quorum_threshold`](#0x2_validator_set_calculate_total_stake_and_quorum_threshold)
 -  [Function `calculate_quorum_threshold`](#0x2_validator_set_calculate_quorum_threshold)
 -  [Function `adjust_stake_and_gas_price`](#0x2_validator_set_adjust_stake_and_gas_price)
@@ -216,38 +216,13 @@
 
 
 
-
-
-
-
-## Function `next_epoch_validator_count`
-
-Get the total number of validators in the next epoch.
-
-
-
public(friend) fun next_epoch_validator_count(self: &validator_set::ValidatorSet): u64
-
- - - -
-Implementation - - -
public(friend) fun next_epoch_validator_count(self: &ValidatorSet): u64 {
-    vector::length(&self.next_epoch_validators)
-}
-
- - -
## Function `request_add_validator` -Called by SuiSystem, add a new validator to pending_validators, which will be +Called by sui_system, add a new validator to pending_validators, which will be processed at the end of epoch. @@ -279,7 +254,7 @@ processed at the end of epoch. ## Function `request_remove_validator` -Called by SuiSystem, to remove a validator. +Called by sui_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. @@ -319,10 +294,10 @@ Only an active validator can request to be removed. ## Function `request_add_stake` -Called by SuiSystem, to add more stake to a validator. +Called by sui_system, to add more stake to a validator. The new stake will be added to the validator's pending stake, which will be processed at the end of epoch. -The total stake of the validator cannot exceed max_validator_stake with the new_stake. +TODO: impl max stake requirement.
public(friend) fun request_add_stake(self: &mut validator_set::ValidatorSet, new_stake: balance::Balance<sui::SUI>, coin_locked_until_epoch: option::Option<epoch_time_lock::EpochTimeLock>, ctx: &mut tx_context::TxContext)
@@ -355,7 +330,7 @@ The total stake of the validator cannot exceed max_validator_stake
 
 ## Function `request_withdraw_stake`
 
-Called by SuiSystem, to withdraw stake from a validator.
+Called by sui_system, to withdraw stake from a validator.
 We send a withdraw request to the validator which will be processed at the end of epoch.
 The remaining stake of the validator cannot be lower than min_validator_stake.
 
@@ -385,39 +360,16 @@ The remaining stake of the validator cannot be lower than min_validator_st
 
 
 
-
-
-
-
-## Function `is_active_validator`
-
-
-
-
public(friend) fun is_active_validator(self: &validator_set::ValidatorSet, validator_address: address): bool
-
- - - -
-Implementation - - -
public(friend) fun is_active_validator(
-    self: &ValidatorSet,
-    validator_address: address,
-): bool {
-    option::is_some(&find_validator(&self.active_validators, validator_address))
-}
-
- - -
## Function `request_add_delegation` +Called by sui_system, to add a new delegation to the validator. +This request is added to the validator's staking pool's pending delegation entries, processed at the end +of the epoch. +TODO: impl max stake requirement.
public(friend) fun request_add_delegation(self: &mut validator_set::ValidatorSet, validator_address: address, delegated_stake: balance::Balance<sui::SUI>, locking_period: option::Option<epoch_time_lock::EpochTimeLock>, ctx: &mut tx_context::TxContext)
@@ -444,72 +396,16 @@ The remaining stake of the validator cannot be lower than min_validator_st
 
 
 
-
-
-
-
-## Function `request_set_gas_price`
-
-
-
-
public(friend) fun request_set_gas_price(self: &mut validator_set::ValidatorSet, new_gas_price: u64, ctx: &mut tx_context::TxContext)
-
- - - -
-Implementation - - -
public(friend) fun request_set_gas_price(
-    self: &mut ValidatorSet,
-    new_gas_price: u64,
-    ctx: &mut TxContext,
-) {
-    let validator_address = tx_context::sender(ctx);
-    let validator = get_validator_mut(&mut self.active_validators, validator_address);
-    validator::request_set_gas_price(validator, new_gas_price);
-}
-
- - - -
- - - -## Function `request_set_commission_rate` - - - -
public(friend) fun request_set_commission_rate(self: &mut validator_set::ValidatorSet, new_commission_rate: u64, ctx: &mut tx_context::TxContext)
-
- - - -
-Implementation - - -
public(friend) fun request_set_commission_rate(
-    self: &mut ValidatorSet,
-    new_commission_rate: u64,
-    ctx: &mut TxContext,
-) {
-    let validator_address = tx_context::sender(ctx);
-    let validator = get_validator_mut(&mut self.active_validators, validator_address);
-    validator::request_set_commission_rate(validator, new_commission_rate);
-}
-
- - -
## Function `request_withdraw_delegation` +Called by sui_system, to withdraw some share of a delegation from the validator. The share to withdraw +is denoted by withdraw_pool_token_amount. +This request is added to the validator's staking pool's pending delegation withdraw entries, processed at the end +of the epoch.
public(friend) fun request_withdraw_delegation(self: &mut validator_set::ValidatorSet, delegation: &mut staking_pool::Delegation, staked_sui: &mut staking_pool::StakedSui, withdraw_pool_token_amount: u64, ctx: &mut tx_context::TxContext)
@@ -548,6 +444,14 @@ The remaining stake of the validator cannot be lower than min_validator_st
 
 ## Function `request_switch_delegation`
 
+Called by sui_system, to switch some share of a delegation from one validator to another.
+The amount to switch is denoted by switch_pool_token_amount.
+Both the principal and reward portions of the withdrawn delegation should be added to the
+new validator's staking pool. We do that in two parts in this function. We first withdraw the
+principal portion from the current staking pool and call request_add_delegation to add the
+principal SUI to the new staking pool. The amount of rewards to switch is only known at the
+end of the epoch, so we bookkeep the switch requests in pending_delegation_switches, and
+process them in advance_epoch by calling process_pending_delegation_switches at epoch changes.
 
 
 
public(friend) fun request_switch_delegation(self: &mut validator_set::ValidatorSet, delegation: &mut staking_pool::Delegation, staked_sui: &mut staking_pool::StakedSui, new_validator_address: address, switch_pool_token_amount: u64, ctx: &mut tx_context::TxContext)
@@ -572,14 +476,11 @@ The remaining stake of the validator cannot be lower than min_validator_st
     // check that the validators are not the same and they are both active.
     assert!(current_validator_address != new_validator_address, 0);
     assert!(is_active_validator(self, new_validator_address), 0);
-    let current_validator_index_opt = find_validator(&self.active_validators, current_validator_address);
-    assert!(option::is_some(¤t_validator_index_opt), 0);
 
     // withdraw principal from the current validator's pool
-    let current_validator_index = option::extract(&mut current_validator_index_opt);
-    let current_validator = vector::borrow_mut(&mut self.active_validators, current_validator_index);
+    let current_validator = get_validator_mut(&mut self.active_validators, current_validator_address);
     let (current_validator_pool_token, principal_stake, time_lock) =
-        staking_pool::withdraw_principal(validator::get_staking_pool_mut_ref(current_validator), delegation, staked_sui, switch_pool_token_amount);
+        staking_pool::withdraw_from_principal(validator::get_staking_pool_mut_ref(current_validator), delegation, staked_sui, switch_pool_token_amount);
     let principal_sui_amount = balance::value(&principal_stake);
     validator::decrease_next_epoch_delegation(current_validator, principal_sui_amount);
 
@@ -606,13 +507,13 @@ The remaining stake of the validator cannot be lower than min_validator_st
 
 
 
-
+
 
-## Function `process_delegation_switches`
+## Function `request_set_gas_price`
 
 
 
-
fun process_delegation_switches(self: &mut validator_set::ValidatorSet, ctx: &mut tx_context::TxContext)
+
public(friend) fun request_set_gas_price(self: &mut validator_set::ValidatorSet, new_gas_price: u64, ctx: &mut tx_context::TxContext)
 
@@ -621,33 +522,14 @@ The remaining stake of the validator cannot be lower than min_validator_st Implementation -
fun process_delegation_switches(self: &mut ValidatorSet, ctx: &mut TxContext) {
-    // for each pair of (from, to) validators, complete the delegation switch
-    while (!vec_map::is_empty(&self.pending_delegation_switches)) {
-        let (ValidatorPair { from, to }, entries) = vec_map::pop(&mut self.pending_delegation_switches);
-        let from_validator = get_validator_mut(&mut self.active_validators, from);
-        let from_pool = validator::get_staking_pool_mut_ref(from_validator);
-        // withdraw rewards from the old validator's pool
-        let (delegators, rewards, rewards_withdraw_amount) = staking_pool::batch_rewards_withdraws(from_pool, entries);
-        validator::decrease_next_epoch_delegation(from_validator, rewards_withdraw_amount);
-
-        assert!(vector::length(&delegators) == vector::length(&rewards), 0);
-
-        let to_validator = get_validator_mut(&mut self.active_validators, to);
-        // add delegations to the new validator
-        while (!vector::is_empty(&rewards)) {
-            let delegator = vector::pop_back(&mut delegators);
-            let new_stake = vector::pop_back(&mut rewards);
-            validator::request_add_delegation(
-                to_validator,
-                new_stake,
-                option::none(), // no time lock for rewards
-                delegator,
-                ctx
-            );
-        };
-        vector::destroy_empty(rewards);
-    };
+
public(friend) fun request_set_gas_price(
+    self: &mut ValidatorSet,
+    new_gas_price: u64,
+    ctx: &mut TxContext,
+) {
+    let validator_address = tx_context::sender(ctx);
+    let validator = get_validator_mut(&mut self.active_validators, validator_address);
+    validator::request_set_gas_price(validator, new_gas_price);
 }
 
@@ -655,13 +537,13 @@ The remaining stake of the validator cannot be lower than min_validator_st - + -## Function `process_pending_delegations` +## Function `request_set_commission_rate` -
fun process_pending_delegations(validators: &mut vector<validator::Validator>, ctx: &mut tx_context::TxContext)
+
public(friend) fun request_set_commission_rate(self: &mut validator_set::ValidatorSet, new_commission_rate: u64, ctx: &mut tx_context::TxContext)
 
@@ -670,14 +552,14 @@ The remaining stake of the validator cannot be lower than min_validator_st Implementation -
fun process_pending_delegations(validators: &mut vector<Validator>, ctx: &mut TxContext) {
-    let length = vector::length(validators);
-    let i = 0;
-    while (i < length) {
-        let validator = vector::borrow_mut(validators, i);
-        validator::process_pending_delegations(validator, ctx);
-        i = i + 1;
-    }
+
public(friend) fun request_set_commission_rate(
+    self: &mut ValidatorSet,
+    new_commission_rate: u64,
+    ctx: &mut TxContext,
+) {
+    let validator_address = tx_context::sender(ctx);
+    let validator = get_validator_mut(&mut self.active_validators, validator_address);
+    validator::request_set_commission_rate(validator, new_commission_rate);
 }
 
@@ -693,8 +575,9 @@ 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 validator application and withdraws. -4. At the end, we calculate the total stake for the new epoch. +3. Process pending delegation switches, deposits, and withdraws. +4. Process pending validator application and withdraws. +5. At the end, we calculate the total stake for the new epoch.
public(friend) fun advance_epoch(self: &mut validator_set::ValidatorSet, validator_reward: &mut balance::Balance<sui::SUI>, delegator_reward: &mut balance::Balance<sui::SUI>, _validator_report_records: &vec_map::VecMap<address, vec_set::VecSet<address>>, ctx: &mut tx_context::TxContext)
@@ -738,9 +621,12 @@ It does the following things:
         ctx
     );
 
-    process_delegation_switches(self, ctx);
+    // Delegation switches must be processed before delgation deposits and withdraws so that the
+    // rewards portion of the delegation switch can be added to the new validator's pool when we
+    // process pending delegations.
+    process_pending_delegation_switches(self, ctx);
 
-    process_pending_delegations(&mut self.active_validators, ctx);
+    process_pending_delegations_and_withdraws(&mut self.active_validators, ctx);
 
     process_pending_validators(&mut self.active_validators, &mut self.pending_validators);
 
@@ -763,6 +649,7 @@ It does the following things:
 
 ## Function `derive_reference_gas_price`
 
+Called by sui_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.
@@ -905,6 +792,59 @@ gas price, weighted by stake.
 
 
 
+
+
+
+
+## Function `next_epoch_validator_count`
+
+Get the total number of validators in the next epoch.
+
+
+
public(friend) fun next_epoch_validator_count(self: &validator_set::ValidatorSet): u64
+
+ + + +
+Implementation + + +
public(friend) fun next_epoch_validator_count(self: &ValidatorSet): u64 {
+    vector::length(&self.next_epoch_validators)
+}
+
+ + + +
+ + + +## Function `is_active_validator` + +Returns true iff validator_address is a member of the active validators. + + +
public(friend) fun is_active_validator(self: &validator_set::ValidatorSet, validator_address: address): bool
+
+ + + +
+Implementation + + +
public(friend) fun is_active_validator(
+    self: &ValidatorSet,
+    validator_address: address,
+): bool {
+    option::is_some(&find_validator(&self.active_validators, validator_address))
+}
+
+ + +
@@ -1140,6 +1080,89 @@ Sort all the pending removal indexes. + + + + +## Function `process_pending_delegation_switches` + +Go through all the delegation switches, withdraws the rewards portion of the switched stake from +the from validator's pool, and deposits it into the to validator's pool. + + +
fun process_pending_delegation_switches(self: &mut validator_set::ValidatorSet, ctx: &mut tx_context::TxContext)
+
+ + + +
+Implementation + + +
fun process_pending_delegation_switches(self: &mut ValidatorSet, ctx: &mut TxContext) {
+    // for each pair of (from, to) validators, complete the delegation switch
+    while (!vec_map::is_empty(&self.pending_delegation_switches)) {
+        let (ValidatorPair { from, to }, entries) = vec_map::pop(&mut self.pending_delegation_switches);
+        let from_validator = get_validator_mut(&mut self.active_validators, from);
+        let from_pool = validator::get_staking_pool_mut_ref(from_validator);
+        // withdraw rewards from the old validator's pool
+        let (delegators, rewards, rewards_withdraw_amount) =
+            staking_pool::batch_withdraw_rewards_and_burn_pool_tokens(from_pool, entries);
+        validator::decrease_next_epoch_delegation(from_validator, rewards_withdraw_amount);
+
+        assert!(vector::length(&delegators) == vector::length(&rewards), 0);
+
+        let to_validator = get_validator_mut(&mut self.active_validators, to);
+        // add delegations to the new validator
+        while (!vector::is_empty(&rewards)) {
+            let delegator = vector::pop_back(&mut delegators);
+            let new_stake = vector::pop_back(&mut rewards);
+            validator::request_add_delegation(
+                to_validator,
+                new_stake,
+                option::none(), // no time lock for rewards
+                delegator,
+                ctx
+            );
+        };
+        vector::destroy_empty(rewards);
+    };
+}
+
+ + + +
+ + + +## Function `process_pending_delegations_and_withdraws` + +Process all active validators' pending delegation deposits and withdraws. + + +
fun process_pending_delegations_and_withdraws(validators: &mut vector<validator::Validator>, ctx: &mut tx_context::TxContext)
+
+ + + +
+Implementation + + +
fun process_pending_delegations_and_withdraws(validators: &mut vector<Validator>, ctx: &mut TxContext) {
+    let length = vector::length(validators);
+    let i = 0;
+    while (i < length) {
+        let validator = vector::borrow_mut(validators, i);
+        validator::process_pending_delegations_and_withdraws(validator, ctx);
+        i = i + 1;
+    }
+}
+
+ + +
@@ -1333,7 +1356,7 @@ due to integer division loss. // Add rewards to the validator. Because reward goes to pending stake, it's the same as calling `request_add_stake`. validator::request_add_stake(validator, validator_reward, option::none(), ctx); // Add rewards to delegation staking pool to auto compound for delegators. - validator::distribute_rewards(validator, delegator_reward, ctx); + validator::deposit_delegation_rewards(validator, delegator_reward); i = i + 1; } } diff --git a/crates/sui-framework/sources/governance/staking_pool.move b/crates/sui-framework/sources/governance/staking_pool.move index 0799c8b693659..8c73b9be9a0df 100644 --- a/crates/sui-framework/sources/governance/staking_pool.move +++ b/crates/sui-framework/sources/governance/staking_pool.move @@ -79,7 +79,7 @@ module sui::staking_pool { /// The epoch at which the staking pool started operating. pool_starting_epoch: u64, /// The pool tokens representing the amount of rewards the delegator can get back when they withdraw - /// from the pool. If this field is `none`, that means the delegation hasn't been activated yet. + /// from the pool. pool_tokens: Balance, /// Number of SUI token staked originally. principal_sui_amount: u64, @@ -95,7 +95,7 @@ module sui::staking_pool { sui_token_lock: Option, } - // == initializer == + // ==== initializer ==== /// Create a new, empty staking pool. public(friend) fun new(validator_address: address, starting_epoch: u64) : StakingPool { @@ -111,7 +111,7 @@ module sui::staking_pool { } - // == delegation requests == + // ==== delegation requests ==== // TODO: implement rate limiting new delegations per epoch. /// Request to delegate to a staking pool. The delegation gets counted at the beginning of the next epoch, @@ -135,36 +135,12 @@ module sui::staking_pool { transfer::transfer(staked_sui, delegator); } - /// Activate a delegation. New pool tokens are minted at the current exchange rate and put into the - /// `pool_tokens` field of the delegation object. - /// After activation, the delegation officially counts toward the staking power of the validator. - /// Aborts if the pool mismatches, the delegation is already activated, or the delegation cannot be activated yet. - public(friend) fun mint_delegation_tokens_to_delegator( - pool: &mut StakingPool, - delegator: address, - sui_amount: u64, - ctx: &mut TxContext - ) { - let new_pool_token_amount = get_token_amount(pool, sui_amount); - - // Mint new pool tokens at the current exchange rate. - let pool_tokens = balance::increase_supply(&mut pool.delegation_token_supply, new_pool_token_amount); - - let delegation = Delegation { - id: object::new(ctx), - validator_address: pool.validator_address, - pool_starting_epoch: pool.starting_epoch, - pool_tokens, - principal_sui_amount: sui_amount, - }; - - transfer::transfer(delegation, delegator); - } - - /// Withdraw `withdraw_pool_token_amount` worth of delegated stake from a staking pool. A proportional amount of principal - /// in SUI will be withdrawn and transferred to the delegator. The rewards portion is withdrawn at the end of the epoch. + /// Request to withdraw `withdraw_pool_token_amount` worth of delegated stake from a staking pool. + /// A proportional amount of principal in SUI is withdrawn and transferred to the delegator. + /// The rewards portion will be withdrawn at the end of the epoch, after the rewards have come in so we + /// can use the new exchange rate to calculate the rewards. /// Returns the amount of SUI withdrawn. - public(friend) fun request_withdraw_stake( + public(friend) fun request_withdraw_delegation( pool: &mut StakingPool, delegation: &mut Delegation, staked_sui: &mut StakedSui, @@ -172,7 +148,7 @@ module sui::staking_pool { ctx: &mut TxContext ) : u64 { let (withdrawn_pool_tokens, principal_withdraw, time_lock) = - withdraw_principal(pool, delegation, staked_sui, withdraw_pool_token_amount); + withdraw_from_principal(pool, delegation, staked_sui, withdraw_pool_token_amount); let principal_withdraw_amount = balance::value(&principal_withdraw); @@ -190,13 +166,20 @@ module sui::staking_pool { principal_withdraw_amount } - /// Withdraw a proportional amount of the principal SUI stored in the StakedSui object. - public(friend) fun withdraw_principal( + /// Withdraw a proportional amount of the principal SUI stored in the StakedSui object, as + /// well as the requested amount of pool tokens from the delegation object. + /// For example, suppose the delegation object contains 15 pool tokens and the principal SUI + /// amount is 21. Then if `withdraw_pool_token_amount` is 5, 5 pool tokens and 7 SUI tokens will + /// be withdrawn. + /// Returns values are withdrawn pool tokens, withdrawn principal portion of SUI, and its + /// time lock if applicable. + public(friend) fun withdraw_from_principal( pool: &mut StakingPool, delegation: &mut Delegation, staked_sui: &mut StakedSui, withdraw_pool_token_amount: u64, ) : (Balance, Balance, Option) { + // Check that the delegation information matches the pool. assert!( delegation.validator_address == pool.validator_address && delegation.pool_starting_epoch == pool.starting_epoch, @@ -213,7 +196,7 @@ module sui::staking_pool { let sui_withdraw_from_principal = (delegation.principal_sui_amount as u128) * (withdraw_pool_token_amount as u128) / (pool_token_balance as u128); - let (principal_withdraw, time_lock) = withdraw_from_principal(delegation, staked_sui, (sui_withdraw_from_principal as u64)); + let (principal_withdraw, time_lock) = withdraw_from_principal_impl(delegation, staked_sui, (sui_withdraw_from_principal as u64)); ( balance::split(&mut delegation.pool_tokens, withdraw_pool_token_amount), @@ -223,12 +206,18 @@ module sui::staking_pool { } - // == functions called at epoch boundaries == + // ==== functions called at epoch boundaries === - /// Called at epoch advancement times to add rewards (in SUI) to the staking pool, and process pending withdraws. - public(friend) fun distribute_rewards(pool: &mut StakingPool, rewards: Balance, ctx: &mut TxContext): u64 { + /// Called at epoch advancement times to add rewards (in SUI) to the staking pool. + public(friend) fun deposit_rewards(pool: &mut StakingPool, rewards: Balance) { pool.sui_balance = pool.sui_balance + balance::value(&rewards); balance::join(&mut pool.rewards_pool, rewards); + } + + /// Called at epoch boundaries to process pending delegation withdraws requested during the epoch. + /// For each pending withdraw entry, we withdraw the rewards from the pool at the new exchange rate and burn the pool + /// tokens. + public(friend) fun process_pending_delegation_withdraws(pool: &mut StakingPool, ctx: &mut TxContext) : u64 { let total_reward_withdraw = 0; while (!vector::is_empty(&pool.pending_withdraws)) { @@ -241,18 +230,25 @@ module sui::staking_pool { } /// Called at epoch boundaries to mint new pool tokens to new delegators at the new exchange rate. - public(friend) fun process_pending_delegations(pool: &mut StakingPool, ctx: &mut TxContext) : u64 { - let before_sui_balance = pool.sui_balance; + /// New delegators include both entirely new delegations and delegations switched to this staking pool + /// during the previous epoch. + public(friend) fun process_pending_delegations(pool: &mut StakingPool, ctx: &mut TxContext) { while (!vector::is_empty(&pool.pending_delegations)) { let PendingDelegationEntry { delegator, sui_amount } = vector::pop_back(&mut pool.pending_delegations); mint_delegation_tokens_to_delegator(pool, delegator, sui_amount, ctx); pool.sui_balance = pool.sui_balance + sui_amount; }; - pool.sui_balance - before_sui_balance } /// Called by validator_set at epoch boundaries for delegation switches. - public(friend) fun batch_rewards_withdraws( + /// This function goes through the provided vector of pending withdraw entries, + /// and for each entry, calls `withdraw_rewards_and_burn_pool_tokens` to withdraw + /// the rewards portion of the delegation and burn the pool tokens. We then aggregate + /// the delegator addresses and their rewards into vectors, as well as calculate + /// the total amount of rewards SUI withdrawn. These three return values are then + /// used in `validator_set`'s delegation switching code to deposit the rewards part + /// into the new validator's staking pool. + public(friend) fun batch_withdraw_rewards_and_burn_pool_tokens( pool: &mut StakingPool, entries: vector, ) : (vector
, vector>, u64) { @@ -269,7 +265,17 @@ module sui::staking_pool { (delegators, rewards, total_rewards_withdraw_amount) } - public(friend) fun withdraw_rewards_and_burn_pool_tokens( + /// This function does the following: + /// 1. Calculates the total amount of SUI (including principal and rewards) that the provided pool tokens represent + /// at the current exchange rate. + /// 2. Using the above number and the given `principal_withdraw_amount`, calculates the rewards portion of the + /// delegation we should withdraw. + /// 3. Withdraws the rewards portion from the rewards pool at the current exchange rate. We only withdraw the rewards + /// portion because the principal portion was already taken out of the delegator's self custodied StakedSui at request + /// time in `request_withdraw_stake`. + /// 4. Since SUI tokens are withdrawn, we need to burn the corresponding pool tokens to keep the exchange rate the same. + /// 5. Updates the SUI balance amount of the pool. + fun withdraw_rewards_and_burn_pool_tokens( pool: &mut StakingPool, principal_withdraw_amount: u64, withdrawn_pool_tokens: Balance, @@ -286,7 +292,32 @@ module sui::staking_pool { balance::split(&mut pool.rewards_pool, reward_withdraw_amount) } - // == inactive pool related == + /// Given the `sui_amount`, mint the corresponding amount of pool tokens at the current exchange + /// rate, puts the pool tokens in a delegation object, and gives the delegation object to the delegator. + fun mint_delegation_tokens_to_delegator( + pool: &mut StakingPool, + delegator: address, + sui_amount: u64, + ctx: &mut TxContext + ) { + let new_pool_token_amount = get_token_amount(pool, sui_amount); + + // Mint new pool tokens at the current exchange rate. + let pool_tokens = balance::increase_supply(&mut pool.delegation_token_supply, new_pool_token_amount); + + let delegation = Delegation { + id: object::new(ctx), + validator_address: pool.validator_address, + pool_starting_epoch: pool.starting_epoch, + pool_tokens, + principal_sui_amount: sui_amount, + }; + + transfer::transfer(delegation, delegator); + } + + + // ==== inactive pool related ==== /// Deactivate a staking pool by wrapping it in an `InactiveStakingPool` and sharing this newly created object. /// After this pool deactivation, the pool stops earning rewards. Only delegation withdraws can be made to the pool. @@ -295,7 +326,9 @@ module sui::staking_pool { transfer::share_object(inactive_pool); } - /// Withdraw delegation from an inactive pool. + /// Withdraw delegation from an inactive pool. Since no epoch rewards will be added to an inactive pool, + /// the exchange rate between pool tokens and SUI tokens stay the same. Therefore, unlike withdrawing + /// from an active pool, we can handle both principal and rewards withdraws directly here. public entry fun withdraw_from_inactive_pool( inactive_pool: &mut InactiveStakingPool, staked_sui: &mut StakedSui, @@ -305,7 +338,7 @@ module sui::staking_pool { ) { let pool = &mut inactive_pool.pool; let (withdrawn_pool_tokens, principal_withdraw, time_lock) = - withdraw_principal(pool, delegation, staked_sui, withdraw_pool_token_amount); + withdraw_from_principal(pool, delegation, staked_sui, withdraw_pool_token_amount); let principal_withdraw_amount = balance::value(&principal_withdraw); let rewards_withdraw = withdraw_rewards_and_burn_pool_tokens(pool, principal_withdraw_amount, withdrawn_pool_tokens); let total_withdraw_amount = principal_withdraw_amount + balance::value(&rewards_withdraw); @@ -323,6 +356,9 @@ module sui::staking_pool { }; } + + // ==== destroyers ==== + /// Destroy an empty delegation that no longer contains any SUI or pool tokens. public entry fun destroy_empty_delegation(delegation: Delegation) { let Delegation { @@ -353,7 +389,7 @@ module sui::staking_pool { } - // == getters and misc utility functions == + // ==== getters and misc utility functions ==== public fun sui_balance(pool: &StakingPool) : u64 { pool.sui_balance } @@ -363,6 +399,7 @@ module sui::staking_pool { public fun delegation_token_amount(delegation: &Delegation): u64 { balance::value(&delegation.pool_tokens) } + /// Create a new pending withdraw entry. public(friend) fun new_pending_withdraw_entry( delegator: address, principal_withdraw_amount: u64, @@ -371,16 +408,18 @@ module sui::staking_pool { PendingWithdrawEntry { delegator, principal_withdraw_amount, withdrawn_pool_tokens } } - /// Withdraw `withdraw_amount` of SUI tokens from the delegation and give it back to the delegator - /// in the original state of the tokens. - fun withdraw_from_principal( + /// Withdraw `withdraw_sui_amount` of SUI tokens from the principal stored in the staked_sui together with its time lock + /// if applicable, and also decrement the `principal_sui_amount` field of the delegation object. + fun withdraw_from_principal_impl( delegation: &mut Delegation, staked_sui: &mut StakedSui, - withdraw_amount: u64, + withdraw_sui_amount: u64, ) : (Balance, Option) { - assert!(balance::value(&staked_sui.principal) >= withdraw_amount, EINSUFFICIENT_SUI_TOKEN_BALANCE); - delegation.principal_sui_amount = delegation.principal_sui_amount - withdraw_amount; - let principal_withdraw = balance::split(&mut staked_sui.principal, withdraw_amount); + assert!(balance::value(&staked_sui.principal) >= withdraw_sui_amount, EINSUFFICIENT_SUI_TOKEN_BALANCE); + // Decrement the principal sui value stored in delegation object. + delegation.principal_sui_amount = delegation.principal_sui_amount - withdraw_sui_amount; + // Withdraw the SUI balance from the staked sui object. Return it and its time lock. + let principal_withdraw = balance::split(&mut staked_sui.principal, withdraw_sui_amount); if (option::is_some(&staked_sui.sui_token_lock)) { let time_lock = if (balance::value(&staked_sui.principal) == 0) {option::extract(&mut staked_sui.sui_token_lock)} diff --git a/crates/sui-framework/sources/governance/sui_system.move b/crates/sui-framework/sources/governance/sui_system.move index f0c195abfabaf..6c3b0af91326b 100644 --- a/crates/sui-framework/sources/governance/sui_system.move +++ b/crates/sui-framework/sources/governance/sui_system.move @@ -68,10 +68,10 @@ module sui::sui_system { const ECANNOT_REPORT_ONESELF: u64 = 3; const EREPORT_RECORD_NOT_FOUND: u64 = 4; - // ==== functions that can only be called by Genesis ==== + // ==== functions that can only be called by genesis ==== /// Create a new SuiSystemState object and make it shared. - /// This function will be called only once in Genesis. + /// This function will be called only once in genesis. public(friend) fun create( validators: vector, sui_supply: Supply, @@ -236,6 +236,7 @@ module sui::sui_system { ) } + /// Add delegated stake to a validator's staking pool. public entry fun request_add_delegation( self: &mut SuiSystemState, delegate_stake: Coin, @@ -251,6 +252,7 @@ module sui::sui_system { ); } + /// Add delegated stake to a validator's staking pool using a locked SUI coin. public entry fun request_add_delegation_with_locked_coin( self: &mut SuiSystemState, delegate_stake: LockedCoin, @@ -261,6 +263,7 @@ module sui::sui_system { validator_set::request_add_delegation(&mut self.validators, validator_address, balance, option::some(lock), ctx); } + /// Withdraw some portion of a delegation from a validator's staking pool. public entry fun request_withdraw_delegation( self: &mut SuiSystemState, delegation: &mut Delegation, diff --git a/crates/sui-framework/sources/governance/validator.move b/crates/sui-framework/sources/governance/validator.move index 5fb32606aa894..404b0fc59cebe 100644 --- a/crates/sui-framework/sources/governance/validator.move +++ b/crates/sui-framework/sources/governance/validator.move @@ -183,7 +183,7 @@ module sui::validator { stake::withdraw_stake(stake, withdraw_amount, ctx); } - /// Process pending stake and pending withdraws. + /// Process pending stake and pending withdraws, and update the gas price. public(friend) fun adjust_stake_and_gas_price(self: &mut Validator) { self.stake_amount = self.stake_amount + self.pending_stake - self.pending_withdraw; self.pending_stake = 0; @@ -193,6 +193,7 @@ module sui::validator { assert!(self.stake_amount == self.metadata.next_epoch_stake, 0); } + /// Request to add delegation to the validator's staking pool, processed at the end of the epoch. public(friend) fun request_add_delegation( self: &mut Validator, delegated_stake: Balance, @@ -203,14 +204,10 @@ module sui::validator { let delegate_amount = balance::value(&delegated_stake); assert!(delegate_amount > 0, 0); staking_pool::request_add_delegation(&mut self.delegation_staking_pool, delegated_stake, locking_period, delegator, ctx); - - increase_next_epoch_delegation(self, delegate_amount); - } - - public(friend) fun increase_next_epoch_delegation(self: &mut Validator, amount: u64) { - self.metadata.next_epoch_delegation = self.metadata.next_epoch_delegation + amount; + self.metadata.next_epoch_delegation = self.metadata.next_epoch_delegation + delegate_amount; } + /// Request to withdraw delegation from the validator's staking pool, processed at the end of the epoch. public(friend) fun request_withdraw_delegation( self: &mut Validator, delegation: &mut Delegation, @@ -218,15 +215,17 @@ module sui::validator { withdraw_pool_token_amount: u64, ctx: &mut TxContext, ) { - let withdraw_sui_amount = staking_pool::request_withdraw_stake( + let withdraw_sui_amount = staking_pool::request_withdraw_delegation( &mut self.delegation_staking_pool, delegation, staked_sui, withdraw_pool_token_amount, ctx); decrease_next_epoch_delegation(self, withdraw_sui_amount); } + /// Decrement the delegation amount for next epoch. Also called by `validator_set` when handling delegation switches. public(friend) fun decrease_next_epoch_delegation(self: &mut Validator, amount: u64) { self.metadata.next_epoch_delegation = self.metadata.next_epoch_delegation - amount; } + /// Request to set new gas price for the next epoch. public(friend) fun request_set_gas_price(self: &mut Validator, new_price: u64) { self.metadata.next_epoch_gas_price = new_price; } @@ -235,17 +234,22 @@ module sui::validator { self.metadata.next_epoch_commission_rate = new_commission_rate; } - public(friend) fun distribute_rewards(self: &mut Validator, reward: Balance, ctx: &mut TxContext) { + /// Deposit delegations rewards into the validator's staking pool, called at the end of the epoch. + public(friend) fun deposit_delegation_rewards(self: &mut Validator, reward: Balance) { self.metadata.next_epoch_delegation = self.metadata.next_epoch_delegation + balance::value(&reward); - let reward_withdraw = staking_pool::distribute_rewards(&mut self.delegation_staking_pool, reward, ctx); - self.metadata.next_epoch_delegation = self.metadata.next_epoch_delegation - reward_withdraw; + staking_pool::deposit_rewards(&mut self.delegation_staking_pool, reward); } - public(friend) fun process_pending_delegations(self: &mut Validator, ctx: &mut TxContext) { - let _sui_deposit = staking_pool::process_pending_delegations(&mut self.delegation_staking_pool, ctx); + /// Process pending delegations and withdraws, called at the end of the epoch. + public(friend) fun process_pending_delegations_and_withdraws(self: &mut Validator, ctx: &mut TxContext) { + staking_pool::process_pending_delegations(&mut self.delegation_staking_pool, ctx); + let reward_withdraw_amount = staking_pool::process_pending_delegation_withdraws( + &mut self.delegation_staking_pool, ctx); + self.metadata.next_epoch_delegation = self.metadata.next_epoch_delegation - reward_withdraw_amount; assert!(delegate_amount(self) == self.metadata.next_epoch_delegation, 0); } + /// Called by `validator_set` for handling delegation switches. public(friend) fun get_staking_pool_mut_ref(self: &mut Validator) : &mut StakingPool { &mut self.delegation_staking_pool } diff --git a/crates/sui-framework/sources/governance/validator_set.move b/crates/sui-framework/sources/governance/validator_set.move index 4b3462b94328d..c05ce392c3005 100644 --- a/crates/sui-framework/sources/governance/validator_set.move +++ b/crates/sui-framework/sources/governance/validator_set.move @@ -61,6 +61,8 @@ module sui::validator_set { const BASIS_POINT_DENOMINATOR: u128 = 10000; + // ==== initialization at genesis ==== + public(friend) fun new(init_active_validators: vector): ValidatorSet { let (total_validator_stake, total_delegation_stake, quorum_stake_threshold) = calculate_total_stake_and_quorum_threshold(&init_active_validators); let validators = ValidatorSet { @@ -77,12 +79,10 @@ module sui::validator_set { validators } - /// Get the total number of validators in the next epoch. - public(friend) fun next_epoch_validator_count(self: &ValidatorSet): u64 { - vector::length(&self.next_epoch_validators) - } - /// Called by `SuiSystem`, add a new validator to `pending_validators`, which will be + // ==== functions to add or remove validators ==== + + /// Called by `sui_system`, add a new validator to `pending_validators`, which will be /// processed at the end of epoch. public(friend) fun request_add_validator(self: &mut ValidatorSet, validator: Validator) { assert!( @@ -94,7 +94,7 @@ module sui::validator_set { self.next_epoch_validators = derive_next_epoch_validators(self); } - /// Called by `SuiSystem`, to remove a validator. + /// Called by `sui_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. @@ -114,10 +114,13 @@ module sui::validator_set { self.next_epoch_validators = derive_next_epoch_validators(self); } - /// Called by `SuiSystem`, to add more stake to a validator. + + // ==== staking related functions ==== + + /// Called by `sui_system`, to add more stake to a validator. /// The new stake will be added to the validator's pending stake, which will be processed /// at the end of epoch. - /// The total stake of the validator cannot exceed `max_validator_stake` with the `new_stake`. + /// TODO: impl max stake requirement. public(friend) fun request_add_stake( self: &mut ValidatorSet, new_stake: Balance, @@ -130,7 +133,7 @@ module sui::validator_set { self.next_epoch_validators = derive_next_epoch_validators(self); } - /// Called by `SuiSystem`, to withdraw stake from a validator. + /// Called by `sui_system`, to withdraw stake from a validator. /// We send a withdraw request to the validator which will be processed at the end of epoch. /// The remaining stake of the validator cannot be lower than `min_validator_stake`. public(friend) fun request_withdraw_stake( @@ -146,13 +149,10 @@ module sui::validator_set { self.next_epoch_validators = derive_next_epoch_validators(self); } - public(friend) fun is_active_validator( - self: &ValidatorSet, - validator_address: address, - ): bool { - option::is_some(&find_validator(&self.active_validators, validator_address)) - } - + /// Called by `sui_system`, to add a new delegation to the validator. + /// This request is added to the validator's staking pool's pending delegation entries, processed at the end + /// of the epoch. + /// TODO: impl max stake requirement. public(friend) fun request_add_delegation( self: &mut ValidatorSet, validator_address: address, @@ -164,27 +164,11 @@ module sui::validator_set { validator::request_add_delegation(validator, delegated_stake, locking_period, tx_context::sender(ctx), ctx); self.next_epoch_validators = derive_next_epoch_validators(self); } - - public(friend) fun request_set_gas_price( - self: &mut ValidatorSet, - new_gas_price: u64, - ctx: &mut TxContext, - ) { - let validator_address = tx_context::sender(ctx); - let validator = get_validator_mut(&mut self.active_validators, validator_address); - validator::request_set_gas_price(validator, new_gas_price); - } - - public(friend) fun request_set_commission_rate( - self: &mut ValidatorSet, - new_commission_rate: u64, - ctx: &mut TxContext, - ) { - let validator_address = tx_context::sender(ctx); - let validator = get_validator_mut(&mut self.active_validators, validator_address); - validator::request_set_commission_rate(validator, new_commission_rate); - } + /// Called by `sui_system`, to withdraw some share of a delegation from the validator. The share to withdraw + /// is denoted by `withdraw_pool_token_amount`. + /// This request is added to the validator's staking pool's pending delegation withdraw entries, processed at the end + /// of the epoch. public(friend) fun request_withdraw_delegation( self: &mut ValidatorSet, delegation: &mut Delegation, @@ -203,6 +187,14 @@ module sui::validator_set { self.next_epoch_validators = derive_next_epoch_validators(self); } + /// Called by `sui_system`, to switch some share of a delegation from one validator to another. + /// The amount to switch is denoted by `switch_pool_token_amount`. + /// Both the principal and reward portions of the withdrawn delegation should be added to the + /// new validator's staking pool. We do that in two parts in this function. We first withdraw the + /// principal portion from the current staking pool and call `request_add_delegation` to add the + /// principal SUI to the new staking pool. The amount of rewards to switch is only known at the + /// end of the epoch, so we bookkeep the switch requests in `pending_delegation_switches`, and + /// process them in `advance_epoch` by calling `process_pending_delegation_switches` at epoch changes. public(friend) fun request_switch_delegation( self: &mut ValidatorSet, delegation: &mut Delegation, @@ -216,14 +208,11 @@ module sui::validator_set { // check that the validators are not the same and they are both active. assert!(current_validator_address != new_validator_address, 0); assert!(is_active_validator(self, new_validator_address), 0); - let current_validator_index_opt = find_validator(&self.active_validators, current_validator_address); - assert!(option::is_some(¤t_validator_index_opt), 0); // withdraw principal from the current validator's pool - let current_validator_index = option::extract(&mut current_validator_index_opt); - let current_validator = vector::borrow_mut(&mut self.active_validators, current_validator_index); + let current_validator = get_validator_mut(&mut self.active_validators, current_validator_address); let (current_validator_pool_token, principal_stake, time_lock) = - staking_pool::withdraw_principal(validator::get_staking_pool_mut_ref(current_validator), delegation, staked_sui, switch_pool_token_amount); + staking_pool::withdraw_from_principal(validator::get_staking_pool_mut_ref(current_validator), delegation, staked_sui, switch_pool_token_amount); let principal_sui_amount = balance::value(&principal_stake); validator::decrease_next_epoch_delegation(current_validator, principal_sui_amount); @@ -245,51 +234,38 @@ module sui::validator_set { self.next_epoch_validators = derive_next_epoch_validators(self); } - fun process_delegation_switches(self: &mut ValidatorSet, ctx: &mut TxContext) { - // for each pair of (from, to) validators, complete the delegation switch - while (!vec_map::is_empty(&self.pending_delegation_switches)) { - let (ValidatorPair { from, to }, entries) = vec_map::pop(&mut self.pending_delegation_switches); - let from_validator = get_validator_mut(&mut self.active_validators, from); - let from_pool = validator::get_staking_pool_mut_ref(from_validator); - // withdraw rewards from the old validator's pool - let (delegators, rewards, rewards_withdraw_amount) = staking_pool::batch_rewards_withdraws(from_pool, entries); - validator::decrease_next_epoch_delegation(from_validator, rewards_withdraw_amount); + // ==== validator config setting functions ==== - assert!(vector::length(&delegators) == vector::length(&rewards), 0); - - let to_validator = get_validator_mut(&mut self.active_validators, to); - // add delegations to the new validator - while (!vector::is_empty(&rewards)) { - let delegator = vector::pop_back(&mut delegators); - let new_stake = vector::pop_back(&mut rewards); - validator::request_add_delegation( - to_validator, - new_stake, - option::none(), // no time lock for rewards - delegator, - ctx - ); - }; - vector::destroy_empty(rewards); - }; + public(friend) fun request_set_gas_price( + self: &mut ValidatorSet, + new_gas_price: u64, + ctx: &mut TxContext, + ) { + let validator_address = tx_context::sender(ctx); + let validator = get_validator_mut(&mut self.active_validators, validator_address); + validator::request_set_gas_price(validator, new_gas_price); } - fun process_pending_delegations(validators: &mut vector, ctx: &mut TxContext) { - let length = vector::length(validators); - let i = 0; - while (i < length) { - let validator = vector::borrow_mut(validators, i); - validator::process_pending_delegations(validator, ctx); - i = i + 1; - } + public(friend) fun request_set_commission_rate( + self: &mut ValidatorSet, + new_commission_rate: u64, + ctx: &mut TxContext, + ) { + let validator_address = tx_context::sender(ctx); + let validator = get_validator_mut(&mut self.active_validators, validator_address); + validator::request_set_commission_rate(validator, 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 validator application and withdraws. - /// 4. At the end, we calculate the total stake for the new epoch. + /// 3. Process pending delegation switches, deposits, and withdraws. + /// 4. Process pending validator application and withdraws. + /// 5. At the end, we calculate the total stake for the new epoch. public(friend) fun advance_epoch( self: &mut ValidatorSet, validator_reward: &mut Balance, @@ -322,9 +298,12 @@ module sui::validator_set { ctx ); - process_delegation_switches(self, ctx); + // Delegation switches must be processed before delgation deposits and withdraws so that the + // rewards portion of the delegation switch can be added to the new validator's pool when we + // process pending delegations. + process_pending_delegation_switches(self, ctx); - process_pending_delegations(&mut self.active_validators, ctx); + process_pending_delegations_and_withdraws(&mut self.active_validators, ctx); process_pending_validators(&mut self.active_validators, &mut self.pending_validators); @@ -338,6 +317,7 @@ module sui::validator_set { self.quorum_stake_threshold = quorum_stake_threshold; } + /// Called by `sui_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. @@ -368,6 +348,8 @@ module sui::validator_set { result } + // ==== getter functions ==== + public fun total_validator_stake(self: &ValidatorSet): u64 { self.total_validator_stake } @@ -386,6 +368,22 @@ module sui::validator_set { validator::delegate_amount(validator) } + /// Get the total number of validators in the next epoch. + public(friend) fun next_epoch_validator_count(self: &ValidatorSet): u64 { + vector::length(&self.next_epoch_validators) + } + + /// Returns true iff `validator_address` is a member of the active validators. + public(friend) fun is_active_validator( + self: &ValidatorSet, + validator_address: address, + ): bool { + option::is_some(&find_validator(&self.active_validators, validator_address)) + } + + + // ==== private helpers ==== + /// Checks whether a duplicate of `new_validator` is already in `validators`. /// Two validators duplicate if they share the same sui_address or same IP or same name. fun contains_duplicate_validator(validators: &vector, new_validator: &Validator): bool { @@ -481,6 +479,49 @@ module sui::validator_set { }; } + /// Go through all the delegation switches, withdraws the rewards portion of the switched stake from + /// the `from` validator's pool, and deposits it into the `to` validator's pool. + fun process_pending_delegation_switches(self: &mut ValidatorSet, ctx: &mut TxContext) { + // for each pair of (from, to) validators, complete the delegation switch + while (!vec_map::is_empty(&self.pending_delegation_switches)) { + let (ValidatorPair { from, to }, entries) = vec_map::pop(&mut self.pending_delegation_switches); + let from_validator = get_validator_mut(&mut self.active_validators, from); + let from_pool = validator::get_staking_pool_mut_ref(from_validator); + // withdraw rewards from the old validator's pool + let (delegators, rewards, rewards_withdraw_amount) = + staking_pool::batch_withdraw_rewards_and_burn_pool_tokens(from_pool, entries); + validator::decrease_next_epoch_delegation(from_validator, rewards_withdraw_amount); + + assert!(vector::length(&delegators) == vector::length(&rewards), 0); + + let to_validator = get_validator_mut(&mut self.active_validators, to); + // add delegations to the new validator + while (!vector::is_empty(&rewards)) { + let delegator = vector::pop_back(&mut delegators); + let new_stake = vector::pop_back(&mut rewards); + validator::request_add_delegation( + to_validator, + new_stake, + option::none(), // no time lock for rewards + delegator, + ctx + ); + }; + vector::destroy_empty(rewards); + }; + } + + /// Process all active validators' pending delegation deposits and withdraws. + fun process_pending_delegations_and_withdraws(validators: &mut vector, ctx: &mut TxContext) { + let length = vector::length(validators); + let i = 0; + while (i < length) { + let validator = vector::borrow_mut(validators, i); + validator::process_pending_delegations_and_withdraws(validator, ctx); + i = i + 1; + } + } + /// Calculate the total active stake, and the amount of stake to reach quorum. fun calculate_total_stake_and_quorum_threshold(validators: &vector): (u64, u64, u64) { let validator_state = 0; @@ -577,7 +618,7 @@ module sui::validator_set { // Add rewards to the validator. Because reward goes to pending stake, it's the same as calling `request_add_stake`. validator::request_add_stake(validator, validator_reward, option::none(), ctx); // Add rewards to delegation staking pool to auto compound for delegators. - validator::distribute_rewards(validator, delegator_reward, ctx); + validator::deposit_delegation_rewards(validator, delegator_reward); i = i + 1; } }