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 a990d4652fd57..b0900c5de01ed 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 @@ -1,6 +1,7 @@ --- source: crates/sui-config/tests/snapshot_tests.rs +assertion_line: 57 expression: genesis --- -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CQEAAB8LAQAAIAIDAAAhAgwAAS4QEQADLxMDAQAFMBQBAAUxFQEAEBIBBwgAAAEGCAABAwEIAAIGCAAGCAABAQEGCAEHBQoCCgIKAgsCAQgDCwQBCAUHCAYCBwgAAwQHCAALAgEIAwsEAQgFBwgGBQcIAAcIBwMDBwgGAQUCAQEDAQEDAQIBCgIBCAgBCAMBBgsCAQkABAsCAQgDBQsEAQgFBwgGAwcIBwMHCAYHZ2VuZXNpcwpzdWlfc3lzdGVtDXZhbGlkYXRvcl9zZXQJdmFsaWRhdG9yBWFzY2lpBm9wdGlvbgdiYWxhbmNlD2Vwb2NoX3RpbWVfbG9jawVzdGFrZQNzdWkKdHhfY29udGV4dAlWYWxpZGF0b3IRVmFsaWRhdG9yTWV0YWRhdGEMYWRqdXN0X3N0YWtlD2RlbGVnYXRlX2Ftb3VudA9kZWxlZ2F0b3JfY291bnQHZGVzdHJveQxpc19kdXBsaWNhdGUIbWV0YWRhdGEHQmFsYW5jZQNTVUkGT3B0aW9uDUVwb2NoVGltZUxvY2sJVHhDb250ZXh0A25ldxRwZW5kaW5nX3N0YWtlX2Ftb3VudBBwZW5kaW5nX3dpdGhkcmF3FnJlcXVlc3RfYWRkX2RlbGVnYXRpb24RcmVxdWVzdF9hZGRfc3Rha2UZcmVxdWVzdF9yZW1vdmVfZGVsZWdhdGlvbgVTdGFrZRZyZXF1ZXN0X3dpdGhkcmF3X3N0YWtlDHN0YWtlX2Ftb3VudAtzdWlfYWRkcmVzcwpkZWxlZ2F0aW9uDXBlbmRpbmdfc3Rha2UScGVuZGluZ19kZWxlZ2F0aW9uG3BlbmRpbmdfZGVsZWdhdGlvbl93aXRoZHJhdxdwZW5kaW5nX2RlbGVnYXRvcl9jb3VudCBwZW5kaW5nX2RlbGVnYXRvcl93aXRoZHJhd19jb3VudAxwdWJrZXlfYnl0ZXMEbmFtZQtuZXRfYWRkcmVzcxBuZXh0X2Vwb2NoX3N0YWtlFW5leHRfZXBvY2hfZGVsZWdhdGlvbgZTdHJpbmcGc3RyaW5nBXZhbHVlBmNyZWF0ZQ53aXRoZHJhd19zdGFrZQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgoSCAEgAyIDIwMaAyQDJQMPAyYDJwMBAgYhBSgKAikKAioK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CQABBgsBAQkAAwgIBQsBAQgCAQsEAQgCBAsBAQkACAgFBwgDCnN1aV9zeXN0ZW0KZGVsZWdhdGlvbgZvcHRpb24HYmFsYW5jZQRjb2luD2Vwb2NoX3RpbWVfbG9jawtsb2NrZWRfY29pbgZvYmplY3QDc3VpCHRyYW5zZmVyCnR4X2NvbnRleHQKRGVsZWdhdGlvbgRidXJuEGNhbl9jbGFpbV9yZXdhcmQHQmFsYW5jZQNTVUkJVHhDb250ZXh0DGNsYWltX3Jld2FyZARDb2luBmNyZWF0ZQpMb2NrZWRDb2luF2NyZWF0ZV9mcm9tX2xvY2tlZF9jb2luD2RlbGVnYXRlX2Ftb3VudAlpc19hY3RpdmURc3dpdGNoX2RlbGVnYXRpb24KdW5kZWxlZ2F0ZQl2YWxpZGF0b3ICaWQDVUlEEWFjdGl2ZV9kZWxlZ2F0aW9uBk9wdGlvbgxlbmRpbmdfZXBvY2gbbmV4dF9yZXdhcmRfdW5jbGFpbWVkX2Vwb2NoF2NvaW5fbG9ja2VkX3VudGlsX2Vwb2NoDUVwb2NoVGltZUxvY2sRdmFsaWRhdG9yX2FkZHJlc3MGZGVsZXRlDGRlc3Ryb3lfbm9uZQZib3Jyb3cGc2VuZGVyDGZyb21fYmFsYW5jZQV2YWx1ZQNuZXcMaW50b19iYWxhbmNlBHNvbWUEbm9uZQdpc19zb21lB2lzX25vbmUFZXBvY2gHZXh0cmFjdBBuZXdfZnJvbV9iYWxhbmNlAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQACBxsIBh0LBwELAQEIAh8LBwEDFgMgAyELBwEICCMFAAEEAA0gDgARBiADBgYAAAAAAAAAACcLABMAAQwCDAYBDAMMAQwFCwURCwsBOAALAjgBDgM4AhQMBAsGCwQhAx8GAAAAAAAAAAAnAgEBAAAUKQsCCgAQABQiAwcFCggMAwUQCgAQARQKASQMAwsDAxMFFwsAAQkCCgARBiADHAUlCwAQAjgCFAwECwQLASQCCwABCAICAwAADBIKAi4RDgwDCwELAjgDCwM4BAoAEAEUBgEAAAAAAAAAFgsADwEVAgMDAAAaFQ4COAUMBAoDERILAjgGOAc4CAsECwA4CQsBEgAMBQsFCwMuEQ44CgIEAwAAIBkOAjgLDAULAjgMDAcMBAoDERILBDgHOAgLBQsACwc4DQsBEgAMBgsGCwMuEQ44CgIFAQAAAQQLABADFAIGAQAAAxAKABAEOA4DBQUKCwAQAjgPDAEFDgsAAQkMAQsBAgcDAAAkPAoALhEGAwoLAAELAgEGAAAAAAAAAAAnCgIuERsMBQoADwQ4EAwEDgQ4EQwGCgAQBTgSAxoFIAoADwU4EzgNDAMFIjgJDAMLAwwICgU4FAsADwIVCgIREgsEOAc4CAsGCwUGAQAAAAAAAAAWCwgLARIADAcLBwsCLhEOOAoCCAEEAAEECwALATgKAgkDAAAnOAoALhEGAwoLAAELAgEGAAAAAAAAAAAnCgEKABABFCYDFgsAAQsCAQYAAAAAAAAAACcKAA8EOBAMBQoCLhEODAQKABAFOBUDIwUpCwULAjgDCwQ4FgUyCgAPBTgTDAMLBQsDCwQLAjgXCwE4FAsADwIVAgoBAAABBAsAEAAUAgAGAAQAAgADAAEABQAAAApkZXZuZXRfbmZ0uQWhHOsLBQAAAAoBAA4CDhwDKk0EdwQFe1sH1gHzAQjJAxQK3QMaDPcDiwENggUIAAAAAQACAAMABAAFAAYABwwAAAgDAAQJAgAGCwcABRAHAAISBAACFAcAAAoAAQAADAIDAAANBAEAAA4CAwAAAwUBAAAPBgEAAAUCBwACFggBAAIXCggABhgLDAAFGQsNAAQaDg8AAhsQEQABHBMBAQMDAxUBAQgNEg4UAggABwgCAAEGCAABBggDBAoCCgIKAgcIAgMIAAUHCAIDBwgACgIHCAIBBggEAQgFAggABQEHCAIBCgIBCAMBCAQBBggCAQUBBggFAQgGAQgBAQkAAQgAAgkABQpkZXZuZXRfbmZ0BWV2ZW50Bm9iamVjdAh0cmFuc2Zlcgp0eF9jb250ZXh0A3VybAR1dGY4CURldk5ldE5GVAxNaW50TkZURXZlbnQJVHhDb250ZXh0BGJ1cm4GU3RyaW5nC2Rlc2NyaXB0aW9uBG1pbnQEbmFtZRJ1cGRhdGVfZGVzY3JpcHRpb24DVXJsAmlkA1VJRAlvYmplY3RfaWQCSUQHY3JlYXRvcgZkZWxldGUDbmV3DXN0cmluZ191bnNhZmUVbmV3X3Vuc2FmZV9mcm9tX2J5dGVzBnNlbmRlcgx1aWRfdG9faW5uZXIEZW1pdAAAAAAAAAAAAAAAAAAAAAAAAAACAAIEEQgFDggDDAgDBQgEAQIDEwgGFQUOCAMAAQQACAkLABMAAQEBDAILAhEHAgEBAAABAwsAEAACAgEEAAkbCgMRCAsAEQkLAREJCwIRChIADAQLAy4RCwwFDgQQAREMCgUOBBACFBIBOAALBAsFOAECAwEAAAEDCwAQAgIEAQQAAQQLAAsBOAECBQEEAAEGCwERCQsADwAVAgYBAAABAwsAEAMCAAIAAAABAAMACnN1aV9zeXN0ZW2QF6Ec6wsFAAAADAEAHgIeSgNonwIEhwMYBZ8D9wMHlgfBCAjXDygG/w8WCpUQKQy+EIUGDcMWEA/TFgIAAQECAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAgAABEEAAwSAgAEFAgABRUIAA0XBAACGAQBAAEKGQIAAhoEAQABAx0MAQABBx8MAQABCScIAAgsBAAOLgQABkcEAAFIBwEAAAATAAEAABYCAQAAGwMBAAAcBAUAAB4GAQAAIAcBAAAhCAEAACIJAQAAIwoBAAAkCwEAACUMAQAAJg0BAAAoDgEAACkPBQAAKg8FAAw2ERIAAjcUFQEADjgWBQAOORYFAAI6FwUBAAI7GBUBAAI8GQUBAA49GgEADhMbAQAFHB0FAAUOHRIABD4eHwAEPyAFAAVAIQUABEAiAQAIQQEkAA5CJSYAAkMBFQEAC0QnAQEIAzopBQEADh4qAQAEGysBAAc6LAUBAARFLQEAA0YuFQEAAUkBMAEADiExAQAHRjM0AQABSicwAQAOSxYFAA1CNjcADiM4AQAEDiASAA4kKgEABEw5AQAOJTsBAARNPQEADig+AQAOKT8FAA4qPwUAEBMTExQTFRMgEyEjIhMlEycTKC8qEysvBQcIAAMDAwcIAgAEBwgABwgDBwgEBwgCBgoIBQsGAQgHCwgBCAcDAwMBBggAAQMEBwgACwkBCAcFBwgCBAcIAAsKAQgHBQcIAgMHCAALCQEIBwcIAgMHCAALCgEIBwcIAgYHCAAKAgoCCgILCQEIBwcIAgMHCAAHCAMHCAICBwgABwgCBAcIAAcIAwUHCAIEBwgABwgLAwcIAgIGCAAFCAsIAQgHAwsIAQgHAwMLCAEIBwMDAQYIAgEFAQgHAgcLBgEJAAMBCwgBCQABBggNAQYLCAEJAAIHCwgBCQADAgcLCAEJAAsIAQkABQYIDQMDAwcIAgMHCA0HCwgBCAcHCAIHBwgDAwUDCwgBCAcDBQEGCAQDBggDAwUBAQEGCAMCBwgEAwMHCAMLCAEIBwcIAgEIAAEIDAEKCAUBCA0BCQACAwMBBgsJAQkAAwcIDQUDBAMFCwkBCAcHCAIBBgsKAQkABAMFCwoBCAcHCAIBCwkBCQABCA4BCw8BCQAEBwgNCwgBCAcLDwEIDgcIAgILCAEIBwgOAQsKAQkAAgsIAQkACA4CAwgFBwUKAgoCCgILCAEIBwsPAQgOBwgCAQgFAgcIDQgFAwcIAwMHCAICBwgNBwgCAgcIDQYIAgIDBQMHCAMFBwgCBQcIDQcICwMDBwgCAgYIDQUHZ2VuZXNpcwpzdWlfc3lzdGVtBm9wdGlvbgdiYWxhbmNlBGNvaW4KZGVsZWdhdGlvbhNlcG9jaF9yZXdhcmRfcmVjb3JkD2Vwb2NoX3RpbWVfbG9jawtsb2NrZWRfY29pbgZvYmplY3QFc3Rha2UDc3VpCHRyYW5zZmVyCnR4X2NvbnRleHQJdmFsaWRhdG9yDXZhbGlkYXRvcl9zZXQOU3VpU3lzdGVtU3RhdGUQU3lzdGVtUGFyYW1ldGVycwlUeENvbnRleHQNYWR2YW5jZV9lcG9jaApEZWxlZ2F0aW9uEUVwb2NoUmV3YXJkUmVjb3JkF2NsYWltX2RlbGVnYXRpb25fcmV3YXJkCVZhbGlkYXRvcgZTdXBwbHkDU1VJB0JhbGFuY2UGY3JlYXRlBWVwb2NoBENvaW4WcmVxdWVzdF9hZGRfZGVsZWdhdGlvbgpMb2NrZWRDb2luJ3JlcXVlc3RfYWRkX2RlbGVnYXRpb25fd2l0aF9sb2NrZWRfY29pbhFyZXF1ZXN0X2FkZF9zdGFrZSJyZXF1ZXN0X2FkZF9zdGFrZV93aXRoX2xvY2tlZF9jb2luFXJlcXVlc3RfYWRkX3ZhbGlkYXRvchlyZXF1ZXN0X3JlbW92ZV9kZWxlZ2F0aW9uGHJlcXVlc3RfcmVtb3ZlX3ZhbGlkYXRvchlyZXF1ZXN0X3N3aXRjaF9kZWxlZ2F0aW9uBVN0YWtlFnJlcXVlc3Rfd2l0aGRyYXdfc3Rha2UZdmFsaWRhdG9yX2RlbGVnYXRlX2Ftb3VudBl2YWxpZGF0b3JfZGVsZWdhdG9yX2NvdW50Amlk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FiwWLSAsIDIWAQcKCAEAAwcIAAcLAgEIAwcIBAEGCggBAQIDAwMDAwYKCAEDAwEKAwIGCggBBggBAQEFBggAAwMDBwgEAQYIAAEKCAUEBwoIAQYKAwcLAgEIAwcIBAIGCggBBQELBgEDAgcKCAEFAQcIAQEGCAECBggABQEKCAEBCAABAwIHCggBBwoDAgcKCAEHCggBAwcIAAUDBAcIAAsCAQgDCwYBCAcHCAQCBwgACAECBwgABggEBQcIAAcICAMDBwgEAQcKAwMDAwcIAQEIAQQDAwoDAwEIAwEGCwIBCQACAwMGAwMDAwYIAQMGAwMKAwQEBggBAwMDBggBAgYIAQYIAQEFBgMDAwMFBwgECAMDBggFBggFAwMDCggFAQgFAQYIBQUDAwsCAQgDAwcIAQIHCwIBCQADAQsCAQkAAQgHAQsGAQkABAcIAQsCAQgDCwYBCAcHCAQBCQAEBwoIAQUDCwYBAwEGCwYBCQABBwsGAQkAAgMLBgEDBAMDAwgAAgMIAQEGCgkAAgcKCQADAgcIAQMCBwgBBQEGCAQDBwgBAwsGAQMDBQMLBgEDAgYKCQAGCQAFBwgBBwgIAwMHCAQIBwoDAwcKAwMDAwMDCnN1aV9zeXN0ZW0NdmFsaWRhdG9yX3NldAZvcHRpb24GdmVjdG9yB2JhbGFuY2UTZXBvY2hfcmV3YXJkX3JlY29yZA9lcG9jaF90aW1lX2xvY2sFc3Rha2UDc3VpCnR4X2NvbnRleHQJdmFsaWRhdG9yDFZhbGlkYXRvclNldAlWYWxpZGF0b3IMYWRqdXN0X3N0YWtlB0JhbGFuY2UDU1VJCVR4Q29udGV4dA1hZHZhbmNlX2Vwb2NoGmNhbGN1bGF0ZV9xdW9ydW1fdGhyZXNob2xkKmNhbGN1bGF0ZV90b3RhbF9zdGFrZV9hbmRfcXVvcnVtX3RocmVzaG9sZBtjb21wdXRlX3Jld2FyZF9kaXN0cmlidXRpb24cY29udGFpbnNfZHVwbGljYXRlX3ZhbGlkYXRvchRjcmVhdGVfZXBvY2hfcmVjb3JkcxFWYWxpZGF0b3JNZXRhZGF0YRxkZXJpdmVfbmV4dF9lcG9jaF92YWxpZGF0b3JzEWRpc3RyaWJ1dGVfcmV3YXJkBk9wdGlvbg5maW5kX3ZhbGlkYXRvchFnZXRfdmFsaWRhdG9yX211dBFnZXRfdmFsaWRhdG9yX3JlZhNpc19hY3RpdmVfdmFsaWRhdG9yA25ldxpuZXh0X2Vwb2NoX3ZhbGlkYXRvcl9jb3VudBhwcm9jZXNzX3BlbmRpbmdfcmVtb3ZhbHMacHJvY2Vzc19wZW5kaW5nX3ZhbGlkYXRvcnMWcmVxdWVzdF9hZGRfZGVsZWdhdGlvbg1FcG9jaFRpbWVMb2NrEXJlcXVlc3RfYWRkX3N0YWtlFXJlcXVlc3RfYWRkX3ZhbGlkYXRvchlyZXF1ZXN0X3JlbW92ZV9kZWxlZ2F0aW9uGHJlcXVlc3RfcmVtb3ZlX3ZhbGlkYXRvcgVTdGFrZRZyZXF1ZXN0X3dpdGhkcmF3X3N0YWtlEXNvcnRfcmVtb3ZhbF9saXN0FnRvdGFsX2RlbGVnYXRpb25fc3Rha2UVdG90YWxfdmFsaWRhdG9yX3N0YWtlGXZhbGlkYXRvcl9kZWxlZ2F0ZV9hbW91bnQZdmFsaWRhdG9yX2RlbGVnYXRvcl9jb3VudBZ2YWxpZGF0b3Jfc3Rha2VfYW1vdW50FnF1b3J1bV9zdGFrZV90aHJlc2hvbGQRYWN0aXZlX3ZhbGlkYXRvcnMScGVuZGluZ192YWxpZGF0b3JzEHBlbmRpbmdfcmVtb3ZhbHMVbmV4dF9lcG9jaF92YWxpZGF0b3JzBXZhbHVlDHN0YWtlX2Ftb3VudA9kZWxlZ2F0ZV9hbW91bnQMaXNfZHVwbGljYXRlD2RlbGVnYXRvcl9jb3VudAtzdWlfYWRkcmVzcwZjcmVhdGUIbWV0YWRhdGEFc3BsaXQEbm9uZQRzb21lB2lzX3NvbWUHZXh0cmFjdAhpc19lbXB0eQZyZW1vdmUHZGVzdHJveQZzZW5kZXIIY29udGFpbnMAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAIHLQMsAzEDMgoIATMKCAE0CgM1CggFAAAAAB8ZCgAuQSAMAgYAAAAAAAAAAAwBCgEKAiMDCwUWCgAKAUMgDAMLAxEdCwEGAQAAAAAAAAAWDAEFBgsAAQIBAwAAITYKABAACgAQARQKAS44ABEEDAUKAA8AEQAKAA8ADgULAQsCEQgKAA8ACgAPAhEQCgAPAAoADwMRDwoALhEHCgAPBBUKABAAEQMMBAwDDAYLBgoA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Pjg8GAAMBBAEFAAYABwAIAAkACgALBAAADAcAAxMEAQABBhQCAAIVBwEAAAQWBAAHFwIABR4IAAEtBwAADQABAAAOAgMAAA8CAwAAEAQBAAARBQYAABICBwAAGAgEAAAZAgMAABoCAwAAGwkBAAAcCgEAAB0JAQAAHwsBAAAgAgMAACECDAABLhARAAMvEwMBAAUwFAEABTEVAQAQEgEHCAAAAQYIAAEDAQgAAgYIAAYIAAEBAQYIAQcFCgIKAgoCCwIBCAMLBAEIBQcIBgIHCAADBAcIAAsCAQgDCwQBCAUHCAYFBwgABwgHAwMHCAYBBQIBAQMBAQMBAgEKAgEICAEIAwEGCwIBCQAECwIBCAMFCwQBCAUHCAYDBwgHAwcIBgdnZW5lc2lzCnN1aV9zeXN0ZW0NdmFsaWRhdG9yX3NldAl2YWxpZGF0b3IFYXNjaWkGb3B0aW9uB2JhbGFuY2UPZXBvY2hfdGltZV9sb2NrBXN0YWtlA3N1aQp0eF9jb250ZXh0CVZhbGlkYXRvchFWYWxpZGF0b3JNZXRhZGF0YQxhZGp1c3Rfc3Rha2UPZGVsZWdhdGVfYW1vdW50D2RlbGVnYXRvcl9jb3VudAdkZXN0cm95DGlzX2R1cGxpY2F0ZQhtZXRhZGF0YQdCYWxhbmNlA1NVSQZPcHRpb24NRXBvY2hUaW1lTG9jawlUeENvbnRleHQDbmV3FHBlbmRpbmdfc3Rha2VfYW1vdW50EHBlbmRpbmdfd2l0aGRyYXcWcmVxdWVzdF9hZGRfZGVsZWdhdGlvbhFyZXF1ZXN0X2FkZF9zdGFrZRlyZXF1ZXN0X3JlbW92ZV9kZWxlZ2F0aW9uBVN0YWtlFnJlcXVlc3Rfd2l0aGRyYXdfc3Rha2UMc3Rha2VfYW1vdW50C3N1aV9hZGRyZXNzCmRlbGVnYXRpb24NcGVuZGluZ19zdGFrZRJwZW5kaW5nX2RlbGVnYXRpb24bcGVuZGluZ19kZWxlZ2F0aW9uX3dpdGhkcmF3F3BlbmRpbmdfZGVsZWdhdG9yX2NvdW50IHBlbmRpbmdfZGVsZWdhdG9yX3dpdGhkcmF3X2NvdW50DHB1YmtleV9ieXRlcwRuYW1lC25ldF9hZGRyZXNzEG5leHRfZXBvY2hfc3Rha2UVbmV4dF9lcG9jaF9kZWxlZ2F0aW9uBlN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CAQMBBggDAQgCAgsBAQkABwgDAQsEAQkAAgsEAQkABQIDCAABBgsEAQkAAQcIAwELAQEJAAEJAAIJAAUECwEBCAIDCAAICAEGCwUBCQABCwUBCQACCwEBCQAICAYLBwEICAsBAQgCAwMIAAsHAQgIAQcLBwEJAAEGCwEBCQADCAgFCwEBCAIBCwQBCAIECwEBCQAICAUHCAMKc3VpX3N5c3RlbQpkZWxlZ2F0aW9uBm9wdGlvbgdiYWxhbmNlBGNvaW4PZXBvY2hfdGltZV9sb2NrC2xvY2tlZF9jb2luBm9iamVjdANzdWkIdHJhbnNmZXIKdHhfY29udGV4dApEZWxlZ2F0aW9uBGJ1cm4QY2FuX2NsYWltX3Jld2FyZAdCYWxhbmNlA1NVSQlUeENvbnRleHQMY2xhaW1fcmV3YXJkBENvaW4GY3JlYXRlCkxvY2tlZENvaW4XY3JlYXRlX2Zyb21fbG9ja2VkX2NvaW4PZGVsZWdhdGVfYW1vdW50CWlzX2FjdGl2ZRFzd2l0Y2hfZGVsZWdhdGlvbgp1bmRlbGVnYXRlCXZhbGlkYXRvcgJpZANVSUQRYWN0aXZlX2RlbGVnYXRpb24GT3B0aW9uDGVuZGluZ19lcG9jaBtuZXh0X3Jld2FyZF91bmNsYWltZWRfZXBvY2gXY29pbl9sb2NrZWRfdW50aWxfZXBvY2gNRXBvY2hUaW1lTG9jaxF2YWxpZGF0b3JfYWRkcmVzcwZkZWxldGUMZGVzdHJveV9ub25lBmJvcnJvdwZzZW5kZXIMZnJvbV9iYWxhbmNlBXZhbHVlA25ldwxpbnRvX2JhbGFuY2UEc29tZQRub25lB2lzX3NvbWUHaXNfbm9uZQVlcG9jaAdleHRyYWN0EG5ld19mcm9tX2JhbGFuY2UAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAIHGwgGHQsHAQsBAQgCHwsHAQMWAyADIQsHAQgIIwUAAQQADSAOABEGIAMGBgAAAAAAAAAAJwsAEwABDAIMBgEMAwwBDAULBRELCwE4AAsCOAEOAzgCFAwECwYLBCEDHwYAAAAAAAAAACcCAQEAABQpCwIKABAAFCIDBwUKCAwDBRAKABABFAoBJAwDCwMDEwUXCwABCQIKABEGIAMcBSULABACOAIUDAQ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HBwgCAwcIAAcIAwcIAgIHCAAHCAIEBwgABwgDBQcIAgQHCAAHCAsDBwgCAgYIAAUICwgBCAcDCwgBCAcDAwsIAQgHAwMBBggCAQUBCAcCBwsGAQkAAwELCAEJAAEGCA0BBgsIAQkAAgcLCAEJAAMCBwsIAQkACwgBCQAFBggNAwMDBwgCAwcIDQcLCAEIBwcIAgcHCAMDBQMLCAEIBwMFAQYIBAMGCAMDBQEBAQYIAwIHCAQDAwcIAwsIAQgHBwgCAQgAAQgMAQoIBQEIDQEJAAIDAwEGCwkBCQADBwgNBQMEAwULCQEIBwcIAgEGCwoBCQAEAwULCgEIBwcIAgELCQEJAAEIDgELDwEJAAQHCA0LCAEIBwsPAQgOBwgCAgsIAQgHCA4BCwoBCQACCwgBCQAIDgIDCAUHBQoCCgIKAgsIAQgHCw8BCA4HCAIBCAUCBwgNCAUDBwgDAwcIAgIHCA0HCAICBwgNBggCAgMFAwcIAwUHCAIFBwgNBwgLAwMHCAICBggNBQdnZW5lc2lzCnN1aV9zeXN0ZW0Gb3B0aW9uB2JhbGFuY2UEY29pbgpkZWxlZ2F0aW9uE2Vwb2NoX3Jld2FyZF9yZWNvcmQPZXBvY2hfdGltZV9sb2NrC2xvY2tlZF9jb2luBm9iamVjdAVzdGFrZQNzdWkIdHJhbnNmZXIKdHhfY29udGV4dAl2YWxpZGF0b3INdmFsaWRhdG9yX3NldA5TdWlTeXN0ZW1TdGF0ZRBTeXN0ZW1QYXJhbWV0ZXJzCVR4Q29udGV4dA1hZHZhbmNlX2Vwb2NoCkRlbGVnYXRpb24RRXBvY2hSZXdhcmRSZWNvcmQXY2xhaW1fZGVsZWdhdGlvbl9yZXdhcmQJVmFsaWRhdG9yBlN1cHBseQNTVUkHQmFsYW5jZQZjcmVhdGUFZXBvY2gEQ29pbhZyZXF1ZXN0X2FkZF9kZWxlZ2F0aW9uCkxvY2tlZENvaW4ncmVxdWVzdF9hZGRfZGVsZWdhdGlvbl93aXRoX2xvY2tlZF9jb2luEXJlcXVlc3RfYWRkX3N0YWtlInJlcXVlc3RfYWRkX3N0YWtlX3dpdGhfbG9ja2VkX2NvaW4VcmVxdWVzdF9hZGRfdmFsaWRhdG9yGXJlcXVlc3RfcmVtb3ZlX2RlbGVnYXRpb24YcmVxdWVzdF9yZW1vdmVfdmFsaWRhdG9yGXJlcXVlc3Rfc3dpdGNoX2RlbGVnYXRpb24FU3Rha2UWcmVxdWVzdF93aXRoZHJhd19zdGFrZRl2YWxpZGF0b3JfZGVsZWdhdGVfYW1vdW50GXZhbGlkYXRvcl9kZWxlZ2F0b3JfY291bnQCaWQDVUlECnZhbGlkYXRvcnMMVmFsaWRhdG9yU2V0CnN1aV9zdXBwbHkMc3RvcmFnZV9mdW5kCnBhcmFtZXRlcnMRZGVsZWdhdGlvbl9yZXdhcmQTbWluX3ZhbGlkYXRvcl9zdGFrZR1tYXhfdmFsaWRhdG9yX2NhbmRpZGF0ZV9jb3VudBFzdG9yYWdlX2dhc19wcmljZQZzZW5kZXIPaW5jcmVhc2Vfc3VwcGx5FnRvdGFsX2RlbGVnYXRpb25fc3Rha2UVdG90YWxfdmFsaWRhdG9yX3N0YWtlBXZhbHVlBXNwbGl0BGpvaW4UY3JlYXRlX2Vwb2NoX3JlY29yZHMQY2FuX2NsYWltX3Jld2FyZA9kZWxlZ2F0ZV9hbW91bnQMY2xhaW1fcmV3YXJkEHN1aV9zeXN0ZW1fc3RhdGUDbmV3BHplcm8Mc2hhcmVfb2JqZWN0F2NyZWF0ZV9mcm9tX2xvY2tlZF9jb2luDGludG9fYmFsYW5jZQ1FcG9jaFRpbWVMb2NrBk9wdGlvbgRub25lBHNvbWUabmV4dF9lcG9jaF92YWxpZGF0b3JfY291bnQKdW5kZWxlZ2F0ZRFzd2l0Y2hfZGVsZWdhdGlvbgAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIHKwgMHAMtCA0vCwYBCAcwCwgBCAcxCAEyCwgBCAcBAgMzAzQDNQMAAQQAEGQKBC4RDwcAIQMMCwABCwQBBgAAAAAAAAAAJwoADwALAjgADAoKAA8ACgM4AAwFCgAQARERDAYKABABERIMDAoAEAI4AQwJCgYLDBYLCRYMCwsGCgMYCgsaDAgNBQsIOAIMBwoADwILCjgDAQoADwMLBzgDAQoAEAEKABAEFAsDCwsKBBEWCgAQBBQGAQAAAAAAAAAWCgAPBBULAQoAEAQUIQNZCwABCwQBBgAAAAAAAAAAJwoADwENBQsEERcLAA8CCwU4AwECAQEEABwuCgIuERg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0ZV9lcG9jaF9yZWNvcmRzEVZhbGlkYXRvck1ldGFkYXRhHGRlcml2ZV9uZXh0X2Vwb2NoX3ZhbGlkYXRvcnMRZGlzdHJpYnV0ZV9yZXdhcmQGT3B0aW9uDmZpbmRfdmFsaWRhdG9yEWdldF92YWxpZGF0b3JfbXV0EWdldF92YWxpZGF0b3JfcmVmE2lzX2FjdGl2ZV92YWxpZGF0b3IDbmV3Gm5leHRfZXBvY2hfdmFsaWRhdG9yX2NvdW50GHByb2Nlc3NfcGVuZGluZ19yZW1vdmFscxpwcm9jZXNzX3BlbmRpbmdfdmFsaWRhdG9ycxZyZXF1ZXN0X2FkZF9kZWxlZ2F0aW9uDUVwb2NoVGltZUxvY2sRcmVxdWVzdF9hZGRfc3Rha2UVcmVxdWVzdF9hZGRfdmFsaWRhdG9yGXJlcXVlc3RfcmVtb3ZlX2RlbGVnYXRpb24YcmVxdWVzdF9yZW1vdmVfdmFsaWRhdG9yBVN0YWtlFnJlcXVlc3Rfd2l0aGRyYXdfc3Rha2URc29ydF9yZW1vdmFsX2xpc3QWdG90YWxfZGVsZWdhdGlvbl9zdGFrZRV0b3RhbF92YWxpZGF0b3Jfc3Rha2UZdmFsaWRhdG9yX2RlbGVnYXRlX2Ftb3VudBl2YWxpZGF0b3JfZGVsZWdhdG9yX2NvdW50FnZhbGlkYXRvcl9zdGFrZV9hbW91bnQWcXVvcnVtX3N0YWtlX3RocmVzaG9sZBFhY3RpdmVfdmFsaWRhdG9ycxJwZW5kaW5nX3ZhbGlkYXRvcnMQcGVuZGluZ19yZW1vdmFscxVuZXh0X2Vwb2NoX3ZhbGlkYXRvcnMFdmFsdWUMc3Rha2VfYW1vdW50D2RlbGVnYXRlX2Ftb3VudAxpc19kdXBsaWNhdGUPZGVsZWdhdG9yX2NvdW50C3N1aV9hZGRyZXNzBmNyZWF0ZQhtZXRhZGF0YQVzcGxpdARub25lBHNvbWUHaXNfc29tZQdleHRyYWN0CGlzX2VtcHR5BnJlbW92ZQdkZXN0cm95BnNlbmRlcghjb250YWlucwAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgctAywDMQMyCggBMwoIATQKAzUKCAUAAAAAHxkKAC5BIAwCBgAAAAAAAAAADAEKAQoCIwMLBRYKAAo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 diff --git a/crates/sui-core/src/unit_tests/gas_tests.rs b/crates/sui-core/src/unit_tests/gas_tests.rs index 6af66e06644bc..fba239993a84b 100644 --- a/crates/sui-core/src/unit_tests/gas_tests.rs +++ b/crates/sui-core/src/unit_tests/gas_tests.rs @@ -406,7 +406,9 @@ async fn test_move_call_gas() -> SuiResult { expected_gas_balance, ); - // Mimic the gas charge behavior and cross check the result with above. + // Mimic the gas charge behavior and cross check the result with above. Do not include + // computation cost calculation as it would require hard-coding a constant representing VM + // execution cost which is quite fragile. let mut gas_status = SuiGasStatus::new_with_budget(GAS_VALUE_FOR_TESTING, 1, 1); gas_status.charge_min_tx_gas()?; let package_object = authority_state @@ -417,11 +419,6 @@ async fn test_move_call_gas() -> SuiResult { package_object.object_size_for_gas_metering() + gas_object.object_size_for_gas_metering(), )?; let gas_used_before_vm_exec = gas_status.summary(true).gas_used(); - // The gas cost to execute the function in Move VM. - // Hard code it here since it's difficult to mock that in test. - // If a new native move module/function is modified, this value may need to be increased due to the increase of sui framework package - const MOVE_VM_EXEC_COST: u64 = 16006; - gas_status.charge_vm_exec_test_only(MOVE_VM_EXEC_COST)?; let created_object = authority_state .get_object(&effects.created[0].0 .0) .await? @@ -434,7 +431,6 @@ async fn test_move_call_gas() -> SuiResult { )?; let new_cost = gas_status.summary(true); - assert_eq!(gas_cost.computation_cost, new_cost.computation_cost,); assert_eq!(gas_cost.storage_cost, new_cost.storage_cost); // This is the total amount of storage cost paid. We will use this // to check if we get back the same amount of rebate latter. diff --git a/crates/sui-framework/sources/balance.move b/crates/sui-framework/sources/balance.move index b81f8665ca6e3..6678ae59a2685 100644 --- a/crates/sui-framework/sources/balance.move +++ b/crates/sui-framework/sources/balance.move @@ -39,7 +39,7 @@ module sui::balance { } /// Create a new supply for type T. - public fun create_supply(_witness: T): Supply { + public fun create_supply(_: T): Supply { Supply { value: 0 } } diff --git a/crates/sui-framework/sources/coin.move b/crates/sui-framework/sources/coin.move index 0a5980d4bb773..299cd5b894a0b 100644 --- a/crates/sui-framework/sources/coin.move +++ b/crates/sui-framework/sources/coin.move @@ -8,6 +8,9 @@ module sui::coin { use sui::tx_context::{Self, TxContext}; use std::vector; + /// For when a type passed to create_supply is not a one-time witness. + const EBadWitness: u64 = 0; + /// A coin of type `T` worth `value`. Transferable and storable struct Coin has key, store { id: UID, @@ -28,11 +31,6 @@ module sui::coin { balance::supply_value(&cap.total_supply) } - /// Wrap a `Supply` into a transferable `TreasuryCap`. - public fun treasury_from_supply(total_supply: Supply, ctx: &mut TxContext): TreasuryCap { - TreasuryCap { id: object::new(ctx), total_supply } - } - /// Unwrap `TreasuryCap` getting the `Supply`. public fun treasury_into_supply(treasury: TreasuryCap): Supply { let TreasuryCap { id, total_supply } = treasury; @@ -153,6 +151,9 @@ module sui::coin { witness: T, ctx: &mut TxContext ): TreasuryCap { + // Make sure there's only one instance of the type T + assert!(sui::types::is_one_time_witness(&witness), EBadWitness); + TreasuryCap { id: object::new(ctx), total_supply: balance::create_supply(witness) diff --git a/crates/sui-framework/sources/types.move b/crates/sui-framework/sources/types.move new file mode 100644 index 0000000000000..bd1ccc4b248c1 --- /dev/null +++ b/crates/sui-framework/sources/types.move @@ -0,0 +1,11 @@ +// Copyright (c) 2022, Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// Sui types helpers and utilities +module sui::types { + // === one-time witness === + + /// Tests if the argument type is a one-time witness, that is a type with only one instantiation + /// across the entire code base. + public native fun is_one_time_witness(_: &T): bool; +} diff --git a/crates/sui-framework/src/natives/mod.rs b/crates/sui-framework/src/natives/mod.rs index ee09da6f4d518..62c8891766fd7 100644 --- a/crates/sui-framework/src/natives/mod.rs +++ b/crates/sui-framework/src/natives/mod.rs @@ -7,6 +7,7 @@ mod object; mod test_scenario; mod transfer; mod tx_context; +mod types; use move_binary_format::errors::PartialVMError; use move_core_types::{account_address::AccountAddress, identifier::Identifier}; @@ -64,6 +65,7 @@ pub fn all_natives( "new_signer_from_address", tx_context::new_signer_from_address, ), + ("types", "is_one_time_witness", types::is_one_time_witness), ]; SUI_NATIVES .iter() diff --git a/crates/sui-framework/src/natives/types.rs b/crates/sui-framework/src/natives/types.rs new file mode 100644 index 0000000000000..b3163a62d6daa --- /dev/null +++ b/crates/sui-framework/src/natives/types.rs @@ -0,0 +1,40 @@ +// Copyright (c) 2022, Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +use move_binary_format::errors::PartialVMResult; +use move_core_types::language_storage::TypeTag; +use move_vm_runtime::native_functions::NativeContext; +use move_vm_types::{ + gas_schedule::NativeCostIndex, + loaded_data::runtime_types::Type, + natives::function::{native_gas, NativeResult}, + values::Value, +}; +use smallvec::smallvec; +use std::collections::VecDeque; + +pub fn is_one_time_witness( + context: &mut NativeContext, + mut ty_args: Vec, + args: VecDeque, +) -> PartialVMResult { + debug_assert!(ty_args.len() == 1); + debug_assert!(args.len() == 1); + + // unwrap safe because the interface of native function guarantees it. + let type_tag = context.type_to_type_tag(&ty_args.pop().unwrap())?; + + // TODO: what should the cost of this be? + let cost = native_gas(context.cost_table(), NativeCostIndex::LENGTH, 1); + + // If a struct type has the same name as the module that defines it but capitalized, it means + // that it's a characteristic type (which is one way of implementing a one-time witness + // type). This is checked in the char_type validator pass (a type with this type of name that + // does not have all properties required of a characteristic type will cause a validator error). + Ok(NativeResult::ok( + cost, + smallvec![Value::bool( + matches!(type_tag, TypeTag::Struct(struct_tag) if struct_tag.name.to_string() == struct_tag.module.to_string().to_ascii_uppercase()) + )], + )) +} diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_name.move b/crates/sui-verifier-transactional-tests/tests/char_type/wrong_name.move deleted file mode 100644 index 7f6cf86a588b6..0000000000000 --- a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_name.move +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2022, Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -// invalid, wrong characteristic type name - -//# init --addresses test=0x0 - -//# publish -module test::m { - - struct CharType has drop { } - - fun init(_: CharType, _ctx: &mut sui::tx_context::TxContext) { - } -} diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/bool_field.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/bool_field.exp similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/bool_field.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/bool_field.exp diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/bool_field.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/bool_field.move similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/bool_field.move rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/bool_field.move diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/instantiate.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/instantiate.exp similarity index 60% rename from crates/sui-verifier-transactional-tests/tests/char_type/instantiate.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/instantiate.exp index 8b24573b6e884..10cb1d51b5aca 100644 --- a/crates/sui-verifier-transactional-tests/tests/char_type/instantiate.exp +++ b/crates/sui-verifier-transactional-tests/tests/one_time_witness/instantiate.exp @@ -2,4 +2,4 @@ processed 2 tasks task 1 'publish'. lines 8-20: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("characteristic type _::m::M is instantiated in the _::m::pack function and must never be") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("one-time witness type _::m::M is instantiated in the _::m::pack function and must never be") } } diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/instantiate.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/instantiate.move similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/instantiate.move rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/instantiate.move diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/more_abilities.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/more_abilities.exp similarity index 63% rename from crates/sui-verifier-transactional-tests/tests/char_type/more_abilities.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/more_abilities.exp index 93c2866a6e5e5..6bac908144ad6 100644 --- a/crates/sui-verifier-transactional-tests/tests/char_type/more_abilities.exp +++ b/crates/sui-verifier-transactional-tests/tests/one_time_witness/more_abilities.exp @@ -2,4 +2,4 @@ processed 2 tasks task 1 'publish'. lines 8-20: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("characteristic type candidate _::m::M must have a single ability: drop") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("one-time witness type candidate _::m::M must have a single ability: drop") } } diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/more_abilities.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/more_abilities.move similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/more_abilities.move rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/more_abilities.move diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/no_drop.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/no_drop.exp similarity index 63% rename from crates/sui-verifier-transactional-tests/tests/char_type/no_drop.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/no_drop.exp index 65e5a5a60060c..0d79418ee6ca1 100644 --- a/crates/sui-verifier-transactional-tests/tests/char_type/no_drop.exp +++ b/crates/sui-verifier-transactional-tests/tests/one_time_witness/no_drop.exp @@ -2,4 +2,4 @@ processed 2 tasks task 1 'publish'. lines 8-16: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("characteristic type candidate _::m::M must have a single ability: drop") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("one-time witness type candidate _::m::M must have a single ability: drop") } } diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/no_drop.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/no_drop.move similarity index 82% rename from crates/sui-verifier-transactional-tests/tests/char_type/no_drop.move rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/no_drop.move index fdc8ff95bc523..234e19e7409b8 100644 --- a/crates/sui-verifier-transactional-tests/tests/char_type/no_drop.move +++ b/crates/sui-verifier-transactional-tests/tests/one_time_witness/no_drop.move @@ -1,7 +1,7 @@ // Copyright (c) 2022, Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 -// invalid, char type has no drop ability +// invalid, one-time witness type has no drop ability //# init --addresses test=0x0 diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/no_field.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/no_field.exp similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/no_field.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/no_field.exp diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/no_field.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/no_field.move similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/no_field.move rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/no_field.move diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/no_init_arg.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/no_init_arg.exp similarity index 72% rename from crates/sui-verifier-transactional-tests/tests/char_type/no_init_arg.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/no_init_arg.exp index 568cca09eec24..23a4af306e864 100644 --- a/crates/sui-verifier-transactional-tests/tests/char_type/no_init_arg.exp +++ b/crates/sui-verifier-transactional-tests/tests/one_time_witness/no_init_arg.exp @@ -2,4 +2,4 @@ processed 2 tasks task 1 'publish'. lines 8-15: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("init function of a module containing characteristic type candidate must have _::m::M as the first parameter") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("init function of a module containing one-time witness type candidate must have _::m::M as the first parameter") } } diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/no_init_arg.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/no_init_arg.move similarity index 81% rename from crates/sui-verifier-transactional-tests/tests/char_type/no_init_arg.move rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/no_init_arg.move index 5c5de61509393..cec3a11e41d64 100644 --- a/crates/sui-verifier-transactional-tests/tests/char_type/no_init_arg.move +++ b/crates/sui-verifier-transactional-tests/tests/one_time_witness/no_init_arg.move @@ -1,7 +1,7 @@ // Copyright (c) 2022, Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 -// invalid, no char type parameter in init +// invalid, no one-time witness type parameter in init //# init --addresses test=0x0 diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/other_mod_def.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/other_mod_def.exp similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/other_mod_def.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/other_mod_def.exp diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/other_mod_def.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/other_mod_def.move similarity index 80% rename from crates/sui-verifier-transactional-tests/tests/char_type/other_mod_def.move rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/other_mod_def.move index c6ab36ad4ebd7..b30c2290efbff 100644 --- a/crates/sui-verifier-transactional-tests/tests/char_type/other_mod_def.move +++ b/crates/sui-verifier-transactional-tests/tests/one_time_witness/other_mod_def.move @@ -1,7 +1,7 @@ // Copyright (c) 2022, Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 -// invalid, characteristic type candidate used in a different module +// invalid, one-time witness type candidate used in a different module //# init --addresses test1=0x0 test2=0x0 diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/type_param.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/type_param.exp similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/type_param.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/type_param.exp diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/type_param.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/type_param.move similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/type_param.move rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/type_param.move diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_field_type.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_field_type.exp similarity index 60% rename from crates/sui-verifier-transactional-tests/tests/char_type/wrong_field_type.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_field_type.exp index 79174bdb32100..8025c75211ac5 100644 --- a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_field_type.exp +++ b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_field_type.exp @@ -2,4 +2,4 @@ processed 2 tasks task 1 'publish'. lines 8-15: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("characteristic type candidate _::m::M must have a single bool field only (or no fields)") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("one-time witness type candidate _::m::M must have a single bool field only (or no fields)") } } diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_field_type.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_field_type.move similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/wrong_field_type.move rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_field_type.move diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_init_type.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_init_type.exp similarity index 72% rename from crates/sui-verifier-transactional-tests/tests/char_type/wrong_init_type.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_init_type.exp index 38c7563efa9ff..4d67e541bfab2 100644 --- a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_init_type.exp +++ b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_init_type.exp @@ -2,4 +2,4 @@ processed 2 tasks task 1 'publish'. lines 8-17: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("init function of a module containing characteristic type candidate must have _::m::M as the first parameter") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("init function of a module containing one-time witness type candidate must have _::m::M as the first parameter") } } diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_init_type.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_init_type.move similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/wrong_init_type.move rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_init_type.move diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_name.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_name.exp similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/wrong_name.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_name.exp diff --git a/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_name.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_name.move new file mode 100644 index 0000000000000..18c8c6ee4962b --- /dev/null +++ b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_name.move @@ -0,0 +1,15 @@ +// Copyright (c) 2022, Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +// invalid, wrong one-time witness type name + +//# init --addresses test=0x0 + +//# publish +module test::m { + + struct OneTimeWitness has drop { } + + fun init(_: OneTimeWitness, _ctx: &mut sui::tx_context::TxContext) { + } +} diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_name_format.exp b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_name_format.exp similarity index 100% rename from crates/sui-verifier-transactional-tests/tests/char_type/wrong_name_format.exp rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_name_format.exp diff --git a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_name_format.move b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_name_format.move similarity index 82% rename from crates/sui-verifier-transactional-tests/tests/char_type/wrong_name_format.move rename to crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_name_format.move index 1d46ccca8e139..2b47ab211ff9a 100644 --- a/crates/sui-verifier-transactional-tests/tests/char_type/wrong_name_format.move +++ b/crates/sui-verifier-transactional-tests/tests/one_time_witness/wrong_name_format.move @@ -1,7 +1,7 @@ // Copyright (c) 2022, Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 -// invalid, wrong characteristic type name format +// invalid, wrong one-time witness type name format //# init --addresses test=0x0 diff --git a/crates/sui-verifier/src/entry_points_verifier.rs b/crates/sui-verifier/src/entry_points_verifier.rs index a0a0f9ca73a3b..7c37c0e4e3a49 100644 --- a/crates/sui-verifier/src/entry_points_verifier.rs +++ b/crates/sui-verifier/src/entry_points_verifier.rs @@ -28,7 +28,7 @@ use crate::{format_signature_token, resolve_struct, verification_failure, INIT_F /// - The function must have `Visibility::Private` /// - The function can have at most two parameters: /// - mandatory &mut TxContext (see `is_tx_context`) in the last position -/// - optional characteristic type (see char_type verifier pass) passed by value in the first +/// - optional one-time witness type (see one_time_witness verifier pass) passed by value in the first /// position /// /// For transaction entry points @@ -132,9 +132,9 @@ fn verify_init_function(module: &CompiledModule, fdef: &FunctionDefinition) -> R } // Checking only the last (and possibly the only) parameter here. If there are two parameters, - // then the first parameter must be of a characteristic type and must be passed by value. This - // is checked by the verifier pass handling characteristic types (char_type) - please see the - // description of this pass for additional details. + // then the first parameter must be of a one-time witness type and must be passed by value. This + // is checked by the verifier for pass one-time witness value (one_time_witness_verifier) - + // please see the description of this pass for additional details. if is_tx_context(view, ¶meters[parameters.len() - 1]) { Ok(()) } else { diff --git a/crates/sui-verifier/src/lib.rs b/crates/sui-verifier/src/lib.rs index 28c88cfea1390..aae3f7b5d8cc8 100644 --- a/crates/sui-verifier/src/lib.rs +++ b/crates/sui-verifier/src/lib.rs @@ -3,10 +3,10 @@ pub mod verifier; -pub mod char_type_verifier; pub mod entry_points_verifier; pub mod global_storage_access_verifier; pub mod id_leak_verifier; +pub mod one_time_witness_verifier; pub mod private_generics; pub mod struct_with_key_verifier; diff --git a/crates/sui-verifier/src/char_type_verifier.rs b/crates/sui-verifier/src/one_time_witness_verifier.rs similarity index 68% rename from crates/sui-verifier/src/char_type_verifier.rs rename to crates/sui-verifier/src/one_time_witness_verifier.rs index 10a50e9591728..cddf9c598c83e 100644 --- a/crates/sui-verifier/src/char_type_verifier.rs +++ b/crates/sui-verifier/src/one_time_witness_verifier.rs @@ -1,9 +1,9 @@ // Copyright (c) 2022, Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 -//! A module can define a "characteristic type", that is a type that is instantiated only once, and -//! this property is enforced by the system. We define a characteristic type as a struct type that -//! has the same name as the module that defines it but with all the letter capitalized, and +//! A module can define a one-time witness type, that is a type that is instantiated only once, and +//! this property is enforced by the system. We define a one-time witness type as a struct type that +//! has the same name as the module that defines it but with all the letters capitalized, and //! possessing certain special properties specified below (please note that by convention, "regular" //! struct type names are expressed in camel case). In other words, if a module defines a struct //! type whose name is the same as the module name, this type MUST possess these special properties, @@ -15,11 +15,6 @@ //! - its definition does not involve type parameters //! - its only instance in existence is passed as an argument to the module initializer //! - it is never instantiated anywhere in its defining module -//! -//! A characteristic type is one way of implementing a one-time witness pattern, where we want to -//! restrict the number of times a given type (instance) is used. Another way could be to have a set -//! data structure that can store types and use it to guarantee uniqueness. - use move_binary_format::{ access::ModuleAccess, binary_views::BinaryIndexedView, @@ -38,10 +33,11 @@ use sui_types::{ use crate::{verification_failure, INIT_FN_NAME}; pub fn verify_module(module: &CompiledModule) -> Result<(), ExecutionError> { - // In Sui's framework code there is an exception to the characteristic type rule - we have a SUI - // type in the sui module but it is instantiated and the module has no initializer (the reason - // for it is that the SUI coin is only instantiated during genesis). It is easiest to simply - // special-case this module particularly that this is framework code and thus deemed correct. + // In Sui's framework code there is an exception to the one-time witness type rule - we have a + // SUI type in the sui module but it is instantiated outside of the module initializer (in fact, + // the module has no initializer). The reason for it is that the SUI coin is only instantiated + // during genesis. It is easiest to simply special-case this module particularly that this is + // framework code and thus deemed correct. if ModuleId::new(SUI_FRAMEWORK_ADDRESS, ident_str!("sui").to_owned()) == module.self_id() { return Ok(()); } @@ -50,18 +46,18 @@ pub fn verify_module(module: &CompiledModule) -> Result<(), ExecutionError> { let mod_handle = view.module_handle_at(module.self_module_handle_idx); let mod_name = view.identifier_at(mod_handle.name).as_str(); let struct_defs = &module.struct_defs; - let mut char_type_candidate = None; - // find structs that can potentially represent a characteristic type + let mut one_time_witness_candidate = None; + // find structs that can potentially represent a one-time witness type for def in struct_defs { let struct_handle = module.struct_handle_at(def.struct_handle); let struct_name = view.identifier_at(struct_handle.name).as_str(); if mod_name.to_ascii_uppercase() == struct_name { - verify_char_type(module, struct_name, struct_handle, def) + verify_one_time_witness(module, struct_name, struct_handle, def) .map_err(verification_failure)?; - // if we reached this point, it means we have a legitimate characteristic type candidate - // and we have to make sure that both the init function's signature reflects this and - // that this type is not instantiated in any function of the module - char_type_candidate = Some((struct_name, struct_handle, def)); + // if we reached this point, it means we have a legitimate one-time witness type + // candidate and we have to make sure that both the init function's signature reflects + // this and that this type is not instantiated in any function of the module + one_time_witness_candidate = Some((struct_name, struct_handle, def)); break; // no reason to look any further } } @@ -69,21 +65,20 @@ pub fn verify_module(module: &CompiledModule) -> Result<(), ExecutionError> { let fn_handle = module.function_handle_at(fn_def.function); let fn_name = module.identifier_at(fn_handle.name); if fn_name == INIT_FN_NAME { - if let Some((candidate_name, candidate_handle, _)) = char_type_candidate { - // only verify if init function conforms to characteristic types requirements if we - // have a characteristic type candidate - verify_init_function_char_type(module, fn_handle, candidate_name, candidate_handle) + if let Some((candidate_name, candidate_handle, _)) = one_time_witness_candidate { + // only verify if init function conforms to one-time witness type requirements if we + // have a one-time witness type candidate + verify_init_one_time_witness(module, fn_handle, candidate_name, candidate_handle) .map_err(verification_failure)?; } else { - // if there is no characteristic type candidate than the init function should have + // if there is no one-time witness type candidate than the init function should have // only one parameter of TxContext type - verify_init_function_single_param(module, fn_handle) - .map_err(verification_failure)?; + verify_init_single_param(module, fn_handle).map_err(verification_failure)?; } } - if let Some((candidate_name, _, def)) = char_type_candidate { - // only verify lack of characteristic types instantiations if we have a - // characteristic type candidate + if let Some((candidate_name, _, def)) = one_time_witness_candidate { + // only verify lack of one-time witness type instantiations if we have a one-time + // witness type candidate verify_no_instantiations(module, fn_def, candidate_name, def) .map_err(verification_failure)?; } @@ -92,9 +87,9 @@ pub fn verify_module(module: &CompiledModule) -> Result<(), ExecutionError> { Ok(()) } -// Verifies all required properties of a characteristic type candidate (that is a type whose name is -// the same as the name of a -fn verify_char_type( +// Verifies all required properties of a one-time witness type candidate (that is a type whose name +// is the same as the name of a +fn verify_one_time_witness( module: &CompiledModule, candidate_name: &str, candidate_handle: &StructHandle, @@ -105,14 +100,14 @@ fn verify_char_type( let abilities = candidate_handle.abilities; if abilities != drop_set { return Err(format!( - "characteristic type candidate {}::{} must have a single ability: drop", + "one-time witness type candidate {}::{} must have a single ability: drop", module.self_id(), candidate_name, )); } let field_count = candidate_def.declared_field_count().map_err(|_| { format!( - "characteristic type candidate {}::{} cannot be a native structure", + "one-time witness type candidate {}::{} cannot be a native structure", module.self_id(), candidate_name ) @@ -122,7 +117,7 @@ fn verify_char_type( // successful if field_count != 1 || candidate_def.field(0).unwrap().signature.0 != SignatureToken::Bool { return Err(format!( - "characteristic type candidate {}::{} must have a single bool field only (or no fields)", + "one-time witness type candidate {}::{} must have a single bool field only (or no fields)", module.self_id(), candidate_name, )); @@ -130,7 +125,7 @@ fn verify_char_type( if !candidate_handle.type_parameters.is_empty() { return Err(format!( - "characteristic type candidate {}::{} cannot have type parameters", + "one-time witness type candidate {}::{} cannot have type parameters", module.self_id(), candidate_name, )); @@ -138,8 +133,8 @@ fn verify_char_type( Ok(()) } -/// Checks if this module's `init` function conformant with the characteristic type -fn verify_init_function_char_type( +/// Checks if this module's `init` function conformant with the one-time witness type +fn verify_init_one_time_witness( module: &CompiledModule, fn_handle: &FunctionHandle, candidate_name: &str, @@ -147,11 +142,11 @@ fn verify_init_function_char_type( ) -> Result<(), String> { let view = &BinaryIndexedView::Module(module); let fn_sig = view.signature_at(fn_handle.parameters); - if fn_sig.len() != 2 || !is_char_type(view, &fn_sig.0[0], candidate_handle) { + if fn_sig.len() != 2 || !is_one_time_witness(view, &fn_sig.0[0], candidate_handle) { // check only the first parameter - the other one is checked in entry_points verification // pass return Err(format!( - "init function of a module containing characteristic type candidate must have {}::{} as the first parameter", + "init function of a module containing one-time witness type candidate must have {}::{} as the first parameter", module.self_id(), candidate_name, )); @@ -160,8 +155,8 @@ fn verify_init_function_char_type( Ok(()) } -// Checks if a given SignatureToken represents a characteristic type struct -fn is_char_type( +// Checks if a given SignatureToken represents a one-time witness type struct +fn is_one_time_witness( view: &BinaryIndexedView, tok: &SignatureToken, candidate_handle: &StructHandle, @@ -170,7 +165,7 @@ fn is_char_type( } /// Checks if this module's `init` function has a single parameter of TxContext type only -fn verify_init_function_single_param( +fn verify_init_single_param( module: &CompiledModule, fn_handle: &FunctionHandle, ) -> Result<(), String> { @@ -190,7 +185,7 @@ fn verify_init_function_single_param( Ok(()) } -/// Checks if this module function does not contain instantiation of the characteristic type +/// Checks if this module function does not contain instantiation of the one-time witness type fn verify_no_instantiations( module: &CompiledModule, fn_def: &FunctionDefinition, @@ -212,7 +207,7 @@ fn verify_no_instantiations( let fn_handle = module.function_handle_at(fn_def.function); let fn_name = module.identifier_at(fn_handle.name); return Err(format!( - "characteristic type {}::{} is instantiated \ + "one-time witness type {}::{} is instantiated \ in the {}::{} function and must never be", module.self_id(), struct_name, diff --git a/crates/sui-verifier/src/verifier.rs b/crates/sui-verifier/src/verifier.rs index 4245e75574e36..a68ba8b7284bd 100644 --- a/crates/sui-verifier/src/verifier.rs +++ b/crates/sui-verifier/src/verifier.rs @@ -7,8 +7,8 @@ use move_binary_format::file_format::CompiledModule; use sui_types::error::ExecutionError; use crate::{ - char_type_verifier, entry_points_verifier, global_storage_access_verifier, id_leak_verifier, - private_generics, struct_with_key_verifier, + entry_points_verifier, global_storage_access_verifier, id_leak_verifier, + one_time_witness_verifier, private_generics, struct_with_key_verifier, }; /// Helper for a "canonical" verification of a module. @@ -18,5 +18,5 @@ pub fn verify_module(module: &CompiledModule) -> Result<(), ExecutionError> { id_leak_verifier::verify_module(module)?; private_generics::verify_module(module)?; entry_points_verifier::verify_module(module)?; - char_type_verifier::verify_module(module) + one_time_witness_verifier::verify_module(module) } diff --git a/crates/sui/src/unit_tests/data/dummy_modules_publish/sources/trusted_coin.move b/crates/sui/src/unit_tests/data/dummy_modules_publish/sources/trusted_coin.move index d55625af0d7bc..637127919778b 100644 --- a/crates/sui/src/unit_tests/data/dummy_modules_publish/sources/trusted_coin.move +++ b/crates/sui/src/unit_tests/data/dummy_modules_publish/sources/trusted_coin.move @@ -8,30 +8,30 @@ module examples::trusted_coin { use sui::tx_context::{Self, TxContext}; /// Name of the coin - struct EXAMPLE has drop {} + struct TRUSTED_COIN has drop {} /// Register the trusted currency to acquire its `TreasuryCap`. Because /// this is a module initializer, it ensures the currency only gets /// registered once. - fun init(ctx: &mut TxContext) { + fun init(witness: TRUSTED_COIN, ctx: &mut TxContext) { // Get a treasury cap for the coin and give it to the transaction // sender - let treasury_cap = coin::create_currency(EXAMPLE{}, ctx); + let treasury_cap = coin::create_currency(witness, ctx); transfer::transfer(treasury_cap, tx_context::sender(ctx)) } - public entry fun mint(treasury_cap: &mut TreasuryCap, amount: u64, ctx: &mut TxContext) { - let coin = coin::mint(treasury_cap, amount, ctx); + public entry fun mint(treasury_cap: &mut TreasuryCap, amount: u64, ctx: &mut TxContext) { + let coin = coin::mint(treasury_cap, amount, ctx); coin::transfer(coin, tx_context::sender(ctx)); } - public entry fun transfer(treasury_cap: TreasuryCap, recipient: address) { - coin::transfer_cap(treasury_cap, recipient); + public entry fun transfer(treasury_cap: TreasuryCap, recipient: address) { + coin::transfer_cap(treasury_cap, recipient); } #[test_only] /// Wrapper of module initializer for testing public fun test_init(ctx: &mut TxContext) { - init(ctx) + init(TRUSTED_COIN {}, ctx) } } diff --git a/sui_programmability/examples/defi/sources/pool.move b/sui_programmability/examples/defi/sources/pool.move index cd4165573e8d0..a75757e015683 100644 --- a/sui_programmability/examples/defi/sources/pool.move +++ b/sui_programmability/examples/defi/sources/pool.move @@ -13,8 +13,8 @@ /// https://github.com/move-language/move/blob/main/language/documentation/examples/experimental/coin-swap/sources/CoinSwap.move module defi::pool { use sui::object::{Self, UID}; - use sui::coin::{Self, Coin, TreasuryCap}; - use sui::balance::{Self, Balance}; + use sui::coin::{Self, Coin}; + use sui::balance::{Self, Supply, Balance}; use sui::sui::SUI; use sui::transfer; use sui::math; @@ -59,7 +59,7 @@ module defi::pool { id: UID, sui: Balance, token: Balance, - lsp_treasury: TreasuryCap>, + lsp_supply: Supply>, /// Fee Percent is denominated in basis points. fee_percent: u64 } @@ -104,18 +104,18 @@ module defi::pool { // Initial share of LSP is the sqrt(a) * sqrt(b) let share = math::sqrt(sui_amt) * math::sqrt(tok_amt); - let lsp_treasury = coin::create_currency(LSP {}, ctx); - let lsp = coin::mint(&mut lsp_treasury, share, ctx); + let lsp_supply = balance::create_supply(LSP {}); + let lsp = balance::increase_supply(&mut lsp_supply, share); transfer::share_object(Pool { id: object::new(ctx), token: coin::into_balance(token), sui: coin::into_balance(sui), - lsp_treasury, + lsp_supply, fee_percent }); - lsp + coin::from_balance(lsp, ctx) } @@ -227,7 +227,8 @@ module defi::pool { assert!(sui_amt < MAX_POOL_VALUE, EPoolFull); assert!(tok_amt < MAX_POOL_VALUE, EPoolFull); - coin::mint(&mut pool.lsp_treasury, share_minted, ctx) + let balance = balance::increase_supply(&mut pool.lsp_supply, share_minted); + coin::from_balance(balance, ctx) } /// Entrypoint for the `remove_liquidity` method. Transfers @@ -260,7 +261,7 @@ module defi::pool { let sui_removed = (sui_amt * lsp_amount) / lsp_supply; let tok_removed = (tok_amt * lsp_amount) / lsp_supply; - coin::burn(&mut pool.lsp_treasury, lsp); + balance::decrease_supply(&mut pool.lsp_supply, coin::into_balance(lsp)); ( coin::take(&mut pool.sui, sui_removed, ctx), @@ -291,7 +292,7 @@ module defi::pool { ( balance::value(&pool.sui), balance::value(&pool.token), - coin::total_supply(&pool.lsp_treasury) + balance::supply_value(&pool.lsp_supply) ) } diff --git a/sui_programmability/examples/fungible_tokens/sources/regulated_coin.move b/sui_programmability/examples/fungible_tokens/sources/regulated_coin.move index d7a83c3553b00..a857c80e4dc53 100644 --- a/sui_programmability/examples/fungible_tokens/sources/regulated_coin.move +++ b/sui_programmability/examples/fungible_tokens/sources/regulated_coin.move @@ -92,9 +92,9 @@ module rc::regulated_coin { module abc::abc { use rc::regulated_coin::{Self as rcoin, RegulatedCoin as RCoin}; use sui::tx_context::{Self, TxContext}; - use sui::balance::{Self, Balance}; - use sui::coin::{Self, Coin, TreasuryCap}; + use sui::balance::{Self, Supply, Balance}; use sui::object::{Self, UID}; + use sui::coin::{Self, Coin}; use sui::transfer; use std::vector; @@ -115,19 +115,28 @@ module abc::abc { swapped_amount: u64, } + /// A AbcTreasuryCap for the balance::Supply. + struct AbcTreasuryCap has key, store { + id: UID, + supply: Supply + } + /// For when an attempting to interact with another account's RegulatedCoin. const ENotOwner: u64 = 1; /// For when address has been banned and someone is trying to access the balance const EAddressBanned: u64 = 2; - /// Create the Abc currency and send the TreasuryCap to the creator + /// Create the Abc currency and send the AbcTreasuryCap to the creator /// as well as the first (and empty) balance of the RegulatedCoin. /// /// Also creates a shared Registry which holds banned addresses. fun init(ctx: &mut TxContext) { - let treasury_cap = coin::create_currency(Abc {}, ctx); let sender = tx_context::sender(ctx); + let treasury_cap = AbcTreasuryCap { + id: object::new(ctx), + supply: balance::create_supply(Abc {}) + }; transfer::transfer(zero(sender, ctx), sender); transfer::transfer(treasury_cap, sender); @@ -153,27 +162,30 @@ module abc::abc { // === Admin actions: creating balances, minting coins and banning addresses === - /// Create an empty `RCoin` instance for account `for`. TreasuryCap is passed for + /// Create an empty `RCoin` instance for account `for`. AbcTreasuryCap is passed for /// authentification purposes - only admin can create new accounts. - public entry fun create(_: &TreasuryCap, for: address, ctx: &mut TxContext) { + public entry fun create(_: &AbcTreasuryCap, for: address, ctx: &mut TxContext) { transfer::transfer(zero(for, ctx), for) } - /// Mint more Abc. Requires TreasuryCap for authorization, so can only be done by admins. - public entry fun mint(treasury: &mut TreasuryCap, owned: &mut RCoin, value: u64) { - balance::join(borrow_mut(owned), coin::mint_balance(treasury, value)); + /// Mint more Abc. Requires AbcTreasuryCap for authorization, so can only be done by admins. + public entry fun mint(treasury: &mut AbcTreasuryCap, owned: &mut RCoin, value: u64) { + balance::join(borrow_mut(owned), balance::increase_supply(&mut treasury.supply, value)); } - /// Burn `value` amount of `RCoin`. Requires TreasuryCap for authorization, so can only be done by admins. + /// Burn `value` amount of `RCoin`. Requires AbcTreasuryCap for authorization, so can only be done by admins. /// - /// TODO: Make TreasuryCap a part of Balance module instead of Coin. - public entry fun burn(treasury: &mut TreasuryCap, owned: &mut RCoin, value: u64, ctx: &mut TxContext) { - coin::burn(treasury, coin::take(borrow_mut(owned), value, ctx)); + /// TODO: Make AbcTreasuryCap a part of Balance module instead of Coin. + public entry fun burn(treasury: &mut AbcTreasuryCap, owned: &mut RCoin, value: u64) { + balance::decrease_supply( + &mut treasury.supply, + balance::split(borrow_mut(owned), value) + ); } /// Ban some address and forbid making any transactions from or to this address. - /// Only owner of the TreasuryCap can perform this action. - public entry fun ban(_cap: &TreasuryCap, registry: &mut Registry, to_ban: address) { + /// Only owner of the AbcTreasuryCap can perform this action. + public entry fun ban(_cap: &AbcTreasuryCap, registry: &mut Registry, to_ban: address) { vector::push_back(&mut registry.banned, to_ban) } @@ -283,10 +295,10 @@ module abc::abc { /// | +-- test_not_owned_balance_fail /// ``` module abc::tests { - use abc::abc::{Self, Abc, Registry}; + use abc::abc::{Self, Abc, AbcTreasuryCap, Registry}; use rc::regulated_coin::{Self as rcoin, RegulatedCoin as RCoin}; - use sui::coin::{Coin, TreasuryCap}; + use sui::coin::{Coin}; use sui::test_scenario::{Self, Scenario, next_tx, ctx}; // === Test handlers; this trick helps reusing scenarios == @@ -319,8 +331,8 @@ module abc::tests { // === Helpers and basic test organization === - fun scenario(): Scenario { test_scenario::begin(&@0xABC) } - fun people(): (address, address, address) { (@0xABC, @0xE05, @0xFACE) } + fun scenario(): Scenario { test_scenario::begin(&@0xAbc) } + fun people(): (address, address, address) { (@0xAbc, @0xE05, @0xFACE) } // Admin creates a regulated coin Abc and mints 1,000,000 of it. fun test_minting_(test: &mut Scenario) { @@ -331,7 +343,7 @@ module abc::tests { }; next_tx(test, &admin); { - let cap = test_scenario::take_owned>(test); + let cap = test_scenario::take_owned(test); let coin = test_scenario::take_owned>(test); abc::mint(&mut cap, &mut coin, 1000000); @@ -350,7 +362,7 @@ module abc::tests { test_minting_(test); next_tx(test, &admin); { - let cap = test_scenario::take_owned>(test); + let cap = test_scenario::take_owned(test); abc::create(&cap, user1, ctx(test)); @@ -408,9 +420,9 @@ module abc::tests { next_tx(test, &admin); { let coin = test_scenario::take_owned>(test); - let treasury_cap = test_scenario::take_owned>(test); + let treasury_cap = test_scenario::take_owned(test); - abc::burn(&mut treasury_cap, &mut coin, 100000, ctx(test)); + abc::burn(&mut treasury_cap, &mut coin, 100000); assert!(rcoin::value(&coin) == 400000, 4); @@ -478,7 +490,7 @@ module abc::tests { test_transfer_(test); next_tx(test, &admin); { - let cap = test_scenario::take_owned>(test); + let cap = test_scenario::take_owned(test); let reg = test_scenario::take_shared(test); let reg_ref = test_scenario::borrow_mut(&mut reg);