Transaction Hash:
Block:
18499733 at Nov-04-2023 04:02:23 PM +UTC
Transaction Fee:
0.059424112479587946 ETH
$137.45
Gas Used:
1,502,558 Gas / 39.548631387 Gwei
Emitted Events:
| 202 |
TransparentUpgradeableProxy.0x2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f( 0x2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f, 0x0000000000000000000000000000000000000000000000000000000000003005, 0xb38a3171f45b61b5826e95bc264475058d457bfedad227bfdcde7ebcd0c64365 )
|
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
|
0x95222290...5CC4BAfe5
Miner
| (beaverbuild) | 12.476741646305801239 Eth | 12.476756671885801239 Eth | 0.00001502558 | |
| 0xa13BAF47...6DAc1E556 | (Scroll: L1 Scroll Chain Proxy) | ||||
| 0xcF289822...E0b4Cfc8f | (Scroll: Old Batch Committer) |
19.815282564966198167 Eth
Nonce: 12293
|
19.755858452486610221 Eth
Nonce: 12294
| 0.059424112479587946 |
Execution Trace
TransparentUpgradeableProxy.1325aca0( )
-
ScrollChain.commitBatch( _version=0, _parentBatchHeader=0x0000000000000030040000000000000000000000000000D6876E4F5D5C9F080F8E35E09A7186EB6048C1AB7449EC8532AA88A118524FC00621DE59C9CA5E31D0DAEB3BC6720BBDDDBFF8B9013F246F766699268E520636798F, _chunks=[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V4Bj4pgsIRRhAIxXW1+A/Vs0gBVhAE1XX4D9W1BhAFZhAMhWWwBbNIAVYQBjV1+A/VtQYQBsYQFPVltgQFFhAHmRkGECClZbYEBRgJEDkPNbYQCKYQFyVlsAWzSAFWEAl1dfgP1bUGEAsmAEgDYDgQGQYQCtkZBhAlFWW2EBtlZbYEBRYQC/kZBhApRWW2BAUYCRA5DzW1+AX5BUkGEBAAqQBHP//////////////////////////xaQUF8wkFCBc///////////////////////////FmEI/IJz//////////////////////////8WMZCBFQKQYEBRX2BAUYCDA4GFiIjxk1BQUFAVgBVhAUpXPV+APj1f/VtQUFBWW1+AVJBhAQAKkARz//////////////////////////8WgVZbNGABXzNz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABXyCBkFVQVltgAWAgUoBfUmBAXyBfkVCQUFSBVltfc///////////////////////////ghaQUJGQUFZbX2EB9IJhActWW5BQkZBQVlthAgSBYQHqVluCUlBQVltfYCCCAZBQYQIdX4MBhGEB+1ZbkpFQUFZbX4D9W2ECMIFhAepWW4EUYQI6V1+A/VtQVltfgTWQUGECS4FhAidWW5KRUFBWW19gIIKEAxIVYQJmV2ECZWECI1ZbW19hAnOEgoUBYQI9VluRUFCSkVBQVltfgZBQkZBQVlthAo6BYQJ8VluCUlBQVltfYCCCAZBQYQKnX4MBhGEChVZbkpFQUFb+omRpcGZzWCISIIsAaL6NdiHZZ1kZ8BgxGpB0hH3Teg/UFj/J3T/mXYFrZHNvbGNDAAgWADODEE7DoKTAVKlfhDEyHunmTa0KBV7rAP6UtkmzGmUbdHouCm1RoA33lCo8n8DLpOcC6ZMFo8ihMlRwxaGQyEFj/7WmW3gr, AQAAAAAACC+PAAAAAGVGan8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJaAACMAAAAAAI74jIK5wYQjw0YAgqTylFMAAAAAAAAAAAAAAAAAAAAAAAACgKS+3jm1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVAOIMWDEE7EoP66y1RF1L/WazHPnQA3h2WyQRxjjzqXiXk507IAJNNDoAH57ZvCH4JXwjVy/GM9U8ehwqMJqBvf+guB6JhhWfucAAACc/kCcIMBYj6EKupUAIMbJNCUy1ZuO2k0+ncljWjqGOkx+nXhqqqAuQIEbEWaKAAAAAAAAAAAAAAAADjecRJPekR6AdZ5RaUe3On/SRJRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZUa+twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIRwQxblAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5/OA+x+0EingnmS9Oqejm64NVozT82/GwWxCa0yFLzxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUfzgPsftBIp4J5kvTqno5uuDVaM0/NvxsFsQmtMhS88QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIIU2jeMhjFFj/Ejv5M1FgtepAbQPRU7lyNwaE5gYUShrzZSLihjqI5Ra9PHd5ZusyQRQdTMVF/O6NUR4fdpTUuTG3fC6X1TxloPiUNVTZuux6MJd0ZnEUs9KbBT2JRcwjNVZJgh6ytUVj3DiLVis+5LPofIuYTEcm85++DrqVvlHKIbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgxBOxKAhYaOoqkFED35SgG8MOBL72sjmp2yRYxLtTWlvM+kY2qAIirfAHetntZU82tYvS7Qrlq/Rts4K+AMKnR8uCU3JYgAAAnP5AnCDAWI/hCrqVACDGyTQlMtWbjtpNPp3JY1o6hjpMfp14aqqgLkCBGxFmigAAAAAAAAAAAAAAAA4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Tkh7cWDgG2AAUmARYARSYCRgAP1bUJKRUFBW/qJkaXBmc1giEiBmbIfsUBJogXKVpMofxuOFn68kHzjdaI8UUTWXCSAAkmRzb2xjQwAIEgAzgxBOxKAFvtdnDWIuG/edLyin8cHtp2A0WKC/+FFY+70wvL7MzqBafMNn+o+yg2NJGs7XLtft5u9wQYvYosE7UDDRfc05gAAAGnb5GnOAhCPDRgCDDq7ZgIC5Gh5ggGBAUjSAFWIAABBXX4D9W1BgQFFiABneOAOAYgAZ3oM5gYEBYEBSgQGQYgAANpGQYgAFSVZbYEBRgGBAAWBAUoBgDoFSYCABf0RlbWNoaWNrIHRva2VuAAAAAAAAAAAAAAAAAAAAAAAAgVJQYEBRgGBAAWBAUoBgAoFSYCABf0RUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJQgWADkIFiAACzkZBiAAfPVltQgGAEkIFiAADFkZBiAAfPVltQUFBiAAEHM2IAAN1iAAEOYCAbYCAcVltgCmIAAOuRkGIACjxWW2IPQkBiAAD7kZBiAAqMVltiAAEWYCAbYCAcVltQYgAL1VZbX2ASkFCQVltfc///////////////////////////FoJz//////////////////////////8WA2IAAYlXX2BAUX/sRC8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYgABgJGQYgALGVZbYEBRgJEDkP1bYgABnF+Dg2IAAaBgIBtgIBxWW1BQVltfc///////////////////////////FoNz//////////////////////////8WA2IAAfRXgGACX4KCVGIAAeeRkGIACzRWW5JQUIGQVVBiAALFVltfgF+Fc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAV8gVJBQgYEQFWIAAoBXg4GDYEBRf+RQ04wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFiAAJ3k5KRkGIAC39WW2BAUYCRA5D9W4GBA1+AhnP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFfIIGQVVBQW19z//////////////////////////8WgnP//////////////////////////xYDYgADDleAYAJfgoJUA5JQUIGQVVBiAANYVluAX4CEc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAV8gX4KCVAGSUFCBkFVQW4Fz//////////////////////////8Wg3P//////////////////////////xZ/3fJSrRviyJtpwrBo/DeNqpUrp/FjxKEWKPVaTfUjs++DYEBRYgADt5GQYgALulZbYEBRgJEDkKNQUFBWW19gQFGQUJBWW1+A/VtfgP1bX4D9W1+A/VtfYB8ZYB+DARaQUJGQUFZbf05Ie3EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX1JgQWAEUmAkX/1bYgAEJYJiAAPdVluBAYGBEGf//////////4IRFxViAARHV2IABEZiAAPtVltbgGBAUlBQUFZbX2IABFtiAAPEVluQUGIABGmCgmIABBpWW5GQUFZbX2f//////////4IRFWIABItXYgAEimIAA+1WW1tiAASWgmIAA91WW5BQYCCBAZBQkZBQVltfW4OBEBViAATCV4CCAVGBhAFSYCCBAZBQYgAEpVZbX4SEAVJQUFBQVltfYgAE42IABN2EYgAEblZbYgAEUFZbkFCCgVJgIIEBhISEAREVYgAFAldiAAUBYgAD2VZbW2IABQ+EgoViAASjVltQk5JQUFBWW1+CYB+DARJiAAUuV2IABS1iAAPVVltbgVFiAAVAhIJgIIYBYgAEzVZbkVBQkpFQUFZbX2AggoQDEhViAAVhV2IABWBiAAPNVltbX4IBUWf//////////4ERFWIABYFXYgAFgGIAA9FWW1tiAAWPhIKFAWIABRdWW5FQUJKRUFBWW1+BUZBQkZBQVlt/Tkh7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfUmAiYARSYCRf/VtfYAKCBJBQYAGCFoBiAAXnV2B/ghaRUFtgIIIQgQNiAAX9V2IABfxiAAWiVltbUJGQUFZbX4GQUIFfUmAgXyCQUJGQUFZbX2AgYB+DAQSQUJGQUFZbX4KCG5BQkpFQUFZbX2AIgwJiAAZhf///////////////////////////////////////////gmIABiRWW2IABm2Gg2IABiRWW5VQgBmEFpNQgIYWhBeSUFBQk5JQUFBWW1+BkFCRkFBWW1+BkFCRkFBWW19iAAa3YgAGsWIABquEYgAGhVZbYgAGjlZbYgAGhVZbkFCRkFBWW1+BkFCRkFBWW2IABtKDYgAGl1ZbYgAG6mIABuGCYgAGvlZbhIRUYgAGMFZbglVQUFBQVltfkFZbYgAHAGIABvJWW2IABw2BhIRiAAbHVltQUFBWW1uBgRAVYgAHNFdiAAcoX4JiAAb2VltgAYEBkFBiAAcTVltQUFZbYB+CERViAAeDV2IAB02BYgAGA1ZbYgAHWIRiAAYVVluBAWAghRAVYgAHaFeBkFBbYgAHgGIAB3eFYgAGFVZbgwGCYgAHElZbUFBbUFBQVltfgoIckFCSkVBQVltfYgAHpV8ZhGAIAmIAB4hWWxmAgxaRUFCSkVBQVltfYgAHv4ODYgAHlFZbkVCCYAICgheQUJKRUFBWW2IAB9qCYgAFmFZbZ///////////gREVYgAH9ldiAAf1YgAD7VZbW2IACAKCVGIABc9WW2IACA+CgoViAAc4VltfYCCQUGAfgxFgAYEUYgAIRVdfhBViAAgwV4KHAVGQUFtiAAg8hYJiAAeyVluGVVBiAAirVltgHxmEFmIACFWGYgAGA1ZbX1uCgRAVYgAIfleEiQFRglVgAYIBkVBgIIUBlFBgIIEBkFBiAAhXVluGgxAVYgAInleEiQFRYgAImmAfiRaCYgAHlFZbg1VQW2ABYAKIAgGIVVBQUFtQUFBQUFBWW39OSHtxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF9SYBFgBFJgJF/9W1+BYAEckFCRkFBWW1+AgpFQg5BQW2ABhREVYgAJPVeAhgSBERViAAkVV2IACRRiAAizVltbYAGFFhViAAklV4CCApFQW4CBApBQYgAJNYViAAjgVluUUGIACPVWW5RQlJJQUFBWW1+CYgAJV1dgAZBQYgAKKVZbgWIACWZXX5BQYgAKKVZbgWABgRRiAAl/V2ACgRRiAAmKV2IACcBWW2ABkVBQYgAKKVZbYP+EERViAAmfV2IACZ5iAAizVltbg2ACCpFQhIIRFWIACblXYgAJuGIACLNWW1tQYgAKKVZbUGAggxBhATODEBZgToQQYAuEEBYXFWIACfpXgoIKkFCDgREVYgAJ9FdiAAnzYgAIs1ZbW2IACilWW2IACgmEhIRgAWIACOxWW5JQkFCBhASBERViAAojV2IACiJiAAizVltbgYECkFBbk5JQUFBWW19g/4IWkFCRkFBWW19iAApIgmIABoVWW5FQYgAKVYNiAAowVluSUGIACoR///////////////////////////////////////////+EhGIACUZWW5BQkpFQUFZbX2IACpiCYgAGhVZbkVBiAAqlg2IABoVWW5JQgoICYgAKtYFiAAaFVluRUIKCBIQUgxUXYgAKz1diAArOYgAIs1ZbW1CSkVBQVltfc///////////////////////////ghaQUJGQUFZbX2IACwGCYgAK1lZbkFCRkFBWW2IACxOBYgAK9VZbglJQUFZbX2AgggGQUGIACy5fgwGEYgALCFZbkpFQUFZbX2IAC0CCYgAGhVZbkVBiAAtNg2IABoVWW5JQgoIBkFCAghEVYgALaFdiAAtnYgAIs1ZbW5KRUFBWW2IAC3mBYgAGhVZbglJQUFZbX2BgggGQUGIAC5RfgwGGYgALCFZbYgALo2AggwGFYgALblZbYgALsmBAgwGEYgALblZblJNQUFBQVltfYCCCAZBQYgALz1+DAYRiAAtuVluSkVBQVlthDfuAYgAL4185X/P+YIBgQFI0gBVhAA9XX4D9W1BgBDYQYQCRV181YOAcgGMxPOVnEWEAZFeAYzE85WcUYQExV4BjcKCCMRRhAU9XgGOV2JtBFGEBf1eAY6kFnLsUYQGdV4Bj3WLtPhRhAc1XYQCRVluAYwb93gMUYQCVV4BjCV6nsxRhALNXgGMYFg3dFGEA41eAYyO4ct0UYQEBV1tfgP1bYQCdYQH9VltgQFFhAKqRkGEKdFZbYEBRgJEDkPNbYQDNYASANgOBAZBhAMiRkGELJVZbYQKNVltgQFFhANqRkGELfVZbYEBRgJEDkPNbYQDrYQKvVltgQFFhAPiRkGELpVZbYEBRgJEDkPNbYQEbYASANgOBAZBhARaRkGELvlZbYQK4VltgQFFhASiRkGELfVZbYEBRgJEDkPNbYQE5YQLmVltgQFFhAUaRkGEMKVZbYEBRgJEDkPNbYQFpYASANgOBAZBhAWSRkGEMQlZbYQLuVltgQFFhAXaRkGELpVZbYEBRgJEDkPNbYQGHYQMzVltgQFFhAZSRkGEKdFZbYEBRgJEDkPNbYQG3YASANgOBAZBhAbKRkGELJVZbYQPDVltgQFFhAcSRkGELfVZbYEBRgJEDkPNbYQHnYASANgOBAZBhAeKRkGEMbVZbYQPlVltgQFFhAfSRkGELpVZbYEBRgJEDkPNbYGBgA4BUYQIMkGEM2FZbgGAfAWAggJEEAmAgAWBAUZCBAWBAUoCSkZCBgVJgIAGCgFRhAjiQYQzYVluAFWECg1eAYB8QYQJaV2EBAICDVAQCg1KRYCABkWECg1ZbggGRkF9SYCBfIJBbgVSBUpBgAQGQYCABgIMRYQJmV4KQA2AfFoIBkVtQUFBQUJBQkFZbX4BhApdhBGdWW5BQYQKkgYWFYQRuVltgAZFQUJKRUFBWW19gAlSQUJBWW1+AYQLCYQRnVluQUGECz4WChWEEgFZbYQLahYWFYQUSVltgAZFQUJOSUFBQVltfYBKQUJBWW1+AX4Nz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABXyBUkFCRkFBWW2BgYASAVGEDQpBhDNhWW4BgHwFgIICRBAJgIAFgQFGQgQFgQFKAkpGQgYFSYCABgoBUYQNukGEM2FZbgBVhA7lXgGAfEGEDkFdhAQCAg1QEAoNSkWAgAZFhA7lWW4IBkZBfUmAgXyCQW4FUgVKQYAEBkGAgAYCDEWEDnFeCkANgHxaCAZFbUFBQUFCQUJBWW1+AYQPNYQRnVluQUGED2oGFhWEFElZbYAGRUFCSkVBQVltfYAFfhHP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFfIF+Dc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAV8gVJBQkpFQUFZbXzOQUJBWW2EEe4ODg2ABYQYCVltQUFBWW19hBIuEhGED5VZbkFB///////////////////////////////////////////+BFGEFDFeBgRAVYQT9V4KBg2BAUX/7j0GyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQT0k5KRkGENF1ZbYEBRgJEDkP1bYQULhISEhANfYQYCVltbUFBQUFZbX3P//////////////////////////xaDc///////////////////////////FgNhBYJXX2BAUX+Wxv0eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQV5kZBhDUxWW2BAUYCRA5D9W19z//////////////////////////8WgnP//////////////////////////xYDYQXyV19gQFF/7EQvBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEF6ZGQYQ1MVltgQFGAkQOQ/VthBf2Dg4NhB9FWW1BQUFZbX3P//////////////////////////xaEc///////////////////////////FgNhBnJXX2BAUX/mAt8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQZpkZBhDUxWW2BAUYCRA5D9W19z//////////////////////////8Wg3P//////////////////////////xYDYQbiV19gQFF/lCgNYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEG2ZGQYQ1MVltgQFGAkQOQ/VuBYAFfhnP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFfIF+Fc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAV8ggZBVUIAVYQfLV4Jz//////////////////////////8WhHP//////////////////////////xZ/jFvh5evsfVvRT3FCfR6E890DFMD3sikeWyAKyMfDuSWEYEBRYQfCkZBhC6VWW2BAUYCRA5CjW1BQUFBWW19z//////////////////////////8Wg3P//////////////////////////xYDYQghV4BgAl+CglRhCBWRkGENklZbklBQgZBVUGEI71ZbX4BfhXP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFfIFSQUIGBEBVhCKpXg4GDYEBRf+RQ04wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhCKGTkpGQYQ0XVltgQFGAkQOQ/VuBgQNfgIZz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABXyCBkFVQUFtfc///////////////////////////FoJz//////////////////////////8WA2EJNleAYAJfgoJUA5JQUIGQVVBhCYBWW4BfgIRz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABXyBfgoJUAZJQUIGQVVBbgXP//////////////////////////xaDc///////////////////////////Fn/d8lKtG+LIm2nCsGj8N42qlSun8WPEoRYo9VpN9SOz74NgQFFhCd2RkGELpVZbYEBRgJEDkKNQUFBWW1+BUZBQkZBQVltfgoJSYCCCAZBQkpFQUFZbX1uDgRAVYQohV4CCAVGBhAFSYCCBAZBQYQoGVltfhIQBUlBQUFBWW19gHxlgH4MBFpBQkZBQVltfYQpGgmEJ6lZbYQpQgYVhCfRWW5NQYQpggYVgIIYBYQoEVlthCmmBYQosVluEAZFQUJKRUFBWW19gIIIBkFCBgQNfgwFSYQqMgYRhCjxWW5BQkpFQUFZbX4D9W19z//////////////////////////+CFpBQkZBQVltfYQrBgmEKmFZbkFCRkFBWW2EK0YFhCrdWW4EUYQrbV1+A/VtQVltfgTWQUGEK7IFhCshWW5KRUFBWW1+BkFCRkFBWW2ELBIFhCvJWW4EUYQsOV1+A/VtQVltfgTWQUGELH4FhCvtWW5KRUFBWW1+AYECDhQMSFWELO1dhCzphCpRWW1tfYQtIhYKGAWEK3lZbklBQYCBhC1mFgoYBYQsRVluRUFCSUJKQUFZbX4EVFZBQkZBQVlthC3eBYQtjVluCUlBQVltfYCCCAZBQYQuQX4MBhGELblZbkpFQUFZbYQufgWEK8lZbglJQUFZbX2AgggGQUGELuF+DAYRhC5ZWW5KRUFBWW1+AX2BghIYDEhVhC9VXYQvUYQqUVltbX2EL4oaChwFhCt5WW5NQUGAgYQvzhoKHAWEK3lZbklBQYEBhDASGgocBYQsRVluRUFCSUJJQ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AAAAEEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOawAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAILgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAORwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHawAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD20AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACi0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIxwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIawAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEvEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAilAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADXYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSAAAAAAAAAA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AAK6VlthA+hiAACYkZBiAAMLVltgAYGQVVAzc///////////////////////////FmAAc///////////////////////////Fn/d8lKtG+LIm2nCsGj8N42qlSun8WPEoRYo9VpN9SOz72ASYP8WYApiAAEBkZBiAAK6VlthA+hiAAEQkZBiAAMLVltgQFFiAAEfkZBiAANnVltgQFGAkQOQo2IAA4RWW39OSHtxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAUmARYARSYCRgAP1bYACBYAEckFCRkFBWW2AAgIKRUIOQUFtgAYURFWIAAbtXgIYEgREVYgABk1diAAGSYgABLVZbW2ABhRYVYgABo1eAggKRUFuAgQKQUGIAAbOFYgABXFZblFBiAAFzVluUUJSSUFBQVltgAIJiAAHWV2ABkFBiAAKpVluBYgAB5ldgAJBQYgACqVZbgWABgRRiAAH/V2ACgRRiAAIKV2IAAkBWW2ABkVBQYgACqVZbYP+EERViAAIfV2IAAh5iAAEtVltbg2ACCpFQhIIRFWIAAjlXYgACOGIAAS1WW1tQYgACqVZbUGAggxBhATODEBZgToQQYAuEEBYXFWIAAnpXgoIKkFCDgREVYgACdFdiAAJzYgABLVZbW2IAAqlWW2IAAomEhIRgAWIAAWlWW5JQkFCBhASBERViAAKjV2IAAqJiAAEtVltbgYECkFBbk5JQUFBWW2AAgZBQkZBQVltgAGIAAseCYgACsFZbkVBiAALUg2IAArBWW5JQYgADA3///////////////////////////////////////////4SEYgABxFZbkFCSkVBQVltgAGIAAxiCYgACsFZbkVBiAAMlg2IAArBWW5JQgoICYgADNYFiAAKwVluRUIKCBIQUgxUXYgADT1diAANOYgABLVZbW1CSkVBQVltiAANhgWIAArBWW4JSUFBWW2AAYCCCAZBQYgADfmAAgwGEYgADVlZbkpFQUFZbYQoggGIAA5RgADlgAPP+YIBgQFI0gBVhABBXYACA/VtQYAQ2EGEAfVdgADVg4ByAY2HgEu4RYQBbV4BjYeAS7hRhANxXgGNwoIIxFGEA+leAY5XYm0EUYQEqV4BjqQWcuxRhAUhXYQB9VluAYwb93gMUYQCCV4BjMTzlZxRhAKBXgGMyy2sMFGEAvldbYACA/VthAIphAXhWW2BAUWEAl5GQYQT8VltgQFGAkQOQ81thAKhhAbFWW2BAUWEAtZGQYQU6VltgQFGAkQOQ81thAMZhAbZWW2BAUWEA05GQYQVuVltgQFGAkQOQ81thAORhAddWW2BAUWEA8ZGQYQVuVltgQFGAkQOQ81thARRgBIA2A4EBkGEBD5GQYQXsVlthAeFWW2BAUWEBIZGQYQVuVltgQFGAkQOQ81thATJhAilWW2BAUWEBP5GQYQT8VltgQFGAkQOQ81thAWJgBIA2A4EBkGEBXZGQYQZFVlthAmJWW2BAUWEBb5GQYQagVltgQFGAkQOQ81tgQFGAYEABYEBSgGAIgVJgIAF/d2ViM2Vhc3kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUlCBVltgEoFWW2ASYP8WYAphAceRkGEIHVZbYQPoYQHUkZBhCGhWW4FWW2AAYAFUkFCQVltgAIBgAINz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgVJBQkZBQVltgQFGAYEABYEBSgGADgVJgIAF/VzNFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUlCBVltgAIBz//////////////////////////8Wg3P//////////////////////////xYDYQLSV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQLJkGEI9lZbYEBRgJEDkP1bYACAM3P//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFgACBUghEVYQNTV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQNKkGEJYlZbYEBRgJEDkP1bgWAAgDNz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACCglRhA6GRkGEJglZbklBQgZBVUIFgAICFc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAgoJUYQP2kZBhCbZWW5JQUIGQVVCCc///////////////////////////FjNz//////////////////////////8Wf93yUq0b4sibacKwaPw3jaqVK6fxY8ShFij1Wk31I7PvhGBAUWEEWpGQYQVuVltgQFGAkQOQo2ABkFCSkVBQVltgAIFRkFCRkFBWW2AAgoJSYCCCAZBQkpFQUFZbYABbg4EQFWEEpleAggFRgYQBUmAggQGQUGEEi1ZbYACEhAFSUFBQUFZbYABgHxlgH4MBFpBQkZBQVltgAGEEzoJhBGxWW2EE2IGFYQR3VluTUGEE6IGFYCCGAWEEiFZbYQTxgWEEslZbhAGRUFCSkVBQVltgAGAgggGQUIGBA2AAgwFSYQUWgYRhBMNWW5BQkpFQUFZbYABg/4IWkFCRkFBWW2EFNIFhBR5WW4JSUFBWW2AAYCCCAZBQYQVPYACDAYRhBStWW5KRUFBWW2AAgZBQkZBQVlthBWiBYQVVVluCUlBQVltgAGAgggGQUGEFg2AAgwGEYQVfVluSkVBQVltgAID9W2AAc///////////////////////////ghaQUJGQUFZbYABhBbmCYQWOVluQUJGQUFZbYQXJgWEFrlZbgRRhBdRXYACA/VtQVltgAIE1kFBhBeaBYQXAVluSkVBQVltgAGAggoQDEhVhBgJXYQYBYQWJVltbYABhBhCEgoUBYQXXVluRUFCSkVBQVlthBiKBYQVVVluBFGEGLVdgAID9W1BWW2AAgTWQUGEGP4FhBhlWW5KRUFBWW2AAgGBAg4UDEhVhBlxXYQZbYQWJVltbYABhBmqFgoYBYQXXVluSUFBgIGEGe4WChgFhBjBWW5FQUJJQkpBQVltgAIEVFZBQkZBQVlthBpqBYQaFVluCUlBQVltgAGAgggGQUGEGtWAAgwGEYQaRVluSkVBQVlt/Tkh7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAFJgEWAEUmAkYAD9W2AAgWABHJBQkZBQVltgAICCkVCDkFBbYAGFERVhB0FXgIYEgREVYQcdV2EHHGEGu1ZbW2ABhRYVYQcsV4CCApFQW4CBApBQYQc6hWEG6lZblFBhBwFWW5RQlJJQUFBWW2AAgmEHWldgAZBQYQgWVluBYQdoV2AAkFBhCBZWW4FgAYEUYQd+V2ACgRRhB4hXYQe3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], _skippedL1MessageBitmap=0x )
commitBatch[ScrollChain (ln:124)]
_loadBatchHeader[ScrollChain (ln:148)]loadAndValidate[ScrollChain (ln:339)]l1MessagePopped[BatchHeaderV0Codec (ln:870)]
computeBatchHash[ScrollChain (ln:341)]
batchIndex[ScrollChain (ln:149)]totalL1MessagePopped[ScrollChain (ln:150)]_commitChunk[ScrollChain (ln:162)]validateChunkLength[ScrollChain (ln:367)]numBlocks[ChunkCodec (ln:1039)]
copyBlockContext[ScrollChain (ln:372)]numTransactions[ScrollChain (ln:373)]l2TxPtr[ScrollChain (ln:390)]numL1Messages[ScrollChain (ln:393)]_loadL1MessageHashes[ScrollChain (ln:394)]getCrossDomainMessage[ScrollChain (ln:461)]
numTransactions[ScrollChain (ln:402)]loadL2TxHash[ScrollChain (ln:406)]
storeVersion[ScrollChain (ln:191)]storeBatchIndex[ScrollChain (ln:192)]storeL1MessagePopped[ScrollChain (ln:193)]storeTotalL1MessagePopped[ScrollChain (ln:194)]storeDataHash[ScrollChain (ln:195)]storeParentBatchHash[ScrollChain (ln:196)]storeSkippedBitmap[ScrollChain (ln:197)]computeBatchHash[ScrollChain (ln:199)]CommitBatch[ScrollChain (ln:201)]
File 1 of 2: TransparentUpgradeableProxy
File 2 of 2: ScrollChain
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol)
pragma solidity ^0.8.0;
import "../ERC1967/ERC1967Proxy.sol";
/**
* @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}
* does not implement this interface directly, and some of its functions are implemented by an internal dispatch
* mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not
* include them in the ABI so this interface must be used to interact with it.
*/
interface ITransparentUpgradeableProxy is IERC1967 {
function admin() external view returns (address);
function implementation() external view returns (address);
function changeAdmin(address) external;
function upgradeTo(address) external;
function upgradeToAndCall(address, bytes memory) external payable;
}
/**
* @dev This contract implements a proxy that is upgradeable by an admin.
*
* To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector
* clashing], which can potentially be used in an attack, this contract uses the
* https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
* things that go hand in hand:
*
* 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if
* that call matches one of the admin functions exposed by the proxy itself.
* 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the
* implementation. If the admin tries to call a function on the implementation it will fail with an error that says
* "admin cannot fallback to proxy target".
*
* These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing
* the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due
* to sudden errors when trying to call a function from the proxy implementation.
*
* Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,
* you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.
*
* NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not
* inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch
* mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to
* fully implement transparency without decoding reverts caused by selector clashes between the proxy and the
* implementation.
*
* WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler
* will not check that there are no selector conflicts, due to the note above. A selector clash between any new function
* and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could
* render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised.
*/
contract TransparentUpgradeableProxy is ERC1967Proxy {
/**
* @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
* optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.
*/
constructor(address _logic, address admin_, bytes memory _data) payable ERC1967Proxy(_logic, _data) {
_changeAdmin(admin_);
}
/**
* @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
*
* CAUTION: This modifier is deprecated, as it could cause issues if the modified function has arguments, and the
* implementation provides a function with the same selector.
*/
modifier ifAdmin() {
if (msg.sender == _getAdmin()) {
_;
} else {
_fallback();
}
}
/**
* @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior
*/
function _fallback() internal virtual override {
if (msg.sender == _getAdmin()) {
bytes memory ret;
bytes4 selector = msg.sig;
if (selector == ITransparentUpgradeableProxy.upgradeTo.selector) {
ret = _dispatchUpgradeTo();
} else if (selector == ITransparentUpgradeableProxy.upgradeToAndCall.selector) {
ret = _dispatchUpgradeToAndCall();
} else if (selector == ITransparentUpgradeableProxy.changeAdmin.selector) {
ret = _dispatchChangeAdmin();
} else if (selector == ITransparentUpgradeableProxy.admin.selector) {
ret = _dispatchAdmin();
} else if (selector == ITransparentUpgradeableProxy.implementation.selector) {
ret = _dispatchImplementation();
} else {
revert("TransparentUpgradeableProxy: admin cannot fallback to proxy target");
}
assembly {
return(add(ret, 0x20), mload(ret))
}
} else {
super._fallback();
}
}
/**
* @dev Returns the current admin.
*
* TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
* https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
* `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
*/
function _dispatchAdmin() private returns (bytes memory) {
_requireZeroValue();
address admin = _getAdmin();
return abi.encode(admin);
}
/**
* @dev Returns the current implementation.
*
* TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
* https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
* `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
*/
function _dispatchImplementation() private returns (bytes memory) {
_requireZeroValue();
address implementation = _implementation();
return abi.encode(implementation);
}
/**
* @dev Changes the admin of the proxy.
*
* Emits an {AdminChanged} event.
*/
function _dispatchChangeAdmin() private returns (bytes memory) {
_requireZeroValue();
address newAdmin = abi.decode(msg.data[4:], (address));
_changeAdmin(newAdmin);
return "";
}
/**
* @dev Upgrade the implementation of the proxy.
*/
function _dispatchUpgradeTo() private returns (bytes memory) {
_requireZeroValue();
address newImplementation = abi.decode(msg.data[4:], (address));
_upgradeToAndCall(newImplementation, bytes(""), false);
return "";
}
/**
* @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
* by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
* proxied contract.
*/
function _dispatchUpgradeToAndCall() private returns (bytes memory) {
(address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));
_upgradeToAndCall(newImplementation, data, true);
return "";
}
/**
* @dev Returns the current admin.
*
* CAUTION: This function is deprecated. Use {ERC1967Upgrade-_getAdmin} instead.
*/
function _admin() internal view virtual returns (address) {
return _getAdmin();
}
/**
* @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to
* emulate some proxy functions being non-payable while still allowing value to pass through.
*/
function _requireZeroValue() private {
require(msg.value == 0);
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)
pragma solidity ^0.8.0;
import "../Proxy.sol";
import "./ERC1967Upgrade.sol";
/**
* @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
* implementation address that can be changed. This address is stored in storage in the location specified by
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
* implementation behind the proxy.
*/
contract ERC1967Proxy is Proxy, ERC1967Upgrade {
/**
* @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.
*
* If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
* function call, and allows initializing the storage of the proxy like a Solidity constructor.
*/
constructor(address _logic, bytes memory _data) payable {
_upgradeToAndCall(_logic, _data, false);
}
/**
* @dev Returns the current implementation address.
*/
function _implementation() internal view virtual override returns (address impl) {
return ERC1967Upgrade._getImplementation();
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)
pragma solidity ^0.8.0;
/**
* @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
* instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
* be specified by overriding the virtual {_implementation} function.
*
* Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
* different contract through the {_delegate} function.
*
* The success and return data of the delegated call will be returned back to the caller of the proxy.
*/
abstract contract Proxy {
/**
* @dev Delegates the current call to `implementation`.
*
* This function does not return to its internal call site, it will return directly to the external caller.
*/
function _delegate(address implementation) internal virtual {
assembly {
// Copy msg.data. We take full control of memory in this inline assembly
// block because it will not return to Solidity code. We overwrite the
// Solidity scratch pad at memory position 0.
calldatacopy(0, 0, calldatasize())
// Call the implementation.
// out and outsize are 0 because we don't know the size yet.
let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
// Copy the returned data.
returndatacopy(0, 0, returndatasize())
switch result
// delegatecall returns 0 on error.
case 0 {
revert(0, returndatasize())
}
default {
return(0, returndatasize())
}
}
}
/**
* @dev This is a virtual function that should be overridden so it returns the address to which the fallback function
* and {_fallback} should delegate.
*/
function _implementation() internal view virtual returns (address);
/**
* @dev Delegates the current call to the address returned by `_implementation()`.
*
* This function does not return to its internal call site, it will return directly to the external caller.
*/
function _fallback() internal virtual {
_beforeFallback();
_delegate(_implementation());
}
/**
* @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
* function in the contract matches the call data.
*/
fallback() external payable virtual {
_fallback();
}
/**
* @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
* is empty.
*/
receive() external payable virtual {
_fallback();
}
/**
* @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
* call, or as part of the Solidity `fallback` or `receive` functions.
*
* If overridden should call `super._beforeFallback()`.
*/
function _beforeFallback() internal virtual {}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)
pragma solidity ^0.8.2;
import "../beacon/IBeacon.sol";
import "../../interfaces/IERC1967.sol";
import "../../interfaces/draft-IERC1822.sol";
import "../../utils/Address.sol";
import "../../utils/StorageSlot.sol";
/**
* @dev This abstract contract provides getters and event emitting update functions for
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
*
* _Available since v4.1._
*/
abstract contract ERC1967Upgrade is IERC1967 {
// This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @dev Returns the current implementation address.
*/
function _getImplementation() internal view returns (address) {
return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/
function _setImplementation(address newImplementation) private {
require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
}
/**
* @dev Perform implementation upgrade
*
* Emits an {Upgraded} event.
*/
function _upgradeTo(address newImplementation) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
/**
* @dev Perform implementation upgrade with additional setup call.
*
* Emits an {Upgraded} event.
*/
function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {
_upgradeTo(newImplementation);
if (data.length > 0 || forceCall) {
Address.functionDelegateCall(newImplementation, data);
}
}
/**
* @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
*
* Emits an {Upgraded} event.
*/
function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {
// Upgrades from old implementations will perform a rollback test. This test requires the new
// implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
// this special case will break upgrade paths from old UUPS implementation to new ones.
if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
_setImplementation(newImplementation);
} else {
try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
} catch {
revert("ERC1967Upgrade: new implementation is not UUPS");
}
_upgradeToAndCall(newImplementation, data, forceCall);
}
}
/**
* @dev Storage slot with the admin of the contract.
* This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
/**
* @dev Returns the current admin.
*/
function _getAdmin() internal view returns (address) {
return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 admin slot.
*/
function _setAdmin(address newAdmin) private {
require(newAdmin != address(0), "ERC1967: new admin is the zero address");
StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
}
/**
* @dev Changes the admin of the proxy.
*
* Emits an {AdminChanged} event.
*/
function _changeAdmin(address newAdmin) internal {
emit AdminChanged(_getAdmin(), newAdmin);
_setAdmin(newAdmin);
}
/**
* @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
* This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
*/
bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
/**
* @dev Returns the current beacon.
*/
function _getBeacon() internal view returns (address) {
return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
}
/**
* @dev Stores a new beacon in the EIP1967 beacon slot.
*/
function _setBeacon(address newBeacon) private {
require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
require(
Address.isContract(IBeacon(newBeacon).implementation()),
"ERC1967: beacon implementation is not a contract"
);
StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
}
/**
* @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
* not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
*
* Emits a {BeaconUpgraded} event.
*/
function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {
_setBeacon(newBeacon);
emit BeaconUpgraded(newBeacon);
if (data.length > 0 || forceCall) {
Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
}
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
pragma solidity ^0.8.0;
/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/
interface IBeacon {
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {BeaconProxy} will check that this address is a contract.
*/
function implementation() external view returns (address);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.
*
* _Available since v4.8.3._
*/
interface IERC1967 {
/**
* @dev Emitted when the implementation is upgraded.
*/
event Upgraded(address indexed implementation);
/**
* @dev Emitted when the admin account has changed.
*/
event AdminChanged(address previousAdmin, address newAdmin);
/**
* @dev Emitted when the beacon is changed.
*/
event BeaconUpgraded(address indexed beacon);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
* proxy whose upgrades are fully controlled by the current implementation.
*/
interface IERC1822Proxiable {
/**
* @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
* address.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy.
*/
function proxiableUUID() external view returns (bytes32);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
pragma solidity ^0.8.0;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```solidity
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*
* _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._
* _Available since v4.9 for `string`, `bytes`._
*/
library StorageSlot {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
struct StringSlot {
string value;
}
struct BytesSlot {
bytes value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` with member `value` located at `slot`.
*/
function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` representation of the string storage pointer `store`.
*/
function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
/**
* @dev Returns an `BytesSlot` with member `value` located at `slot`.
*/
function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
*/
function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
}
File 2 of 2: ScrollChain
// SPDX-License-Identifier: MIT
pragma solidity =0.8.16;
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import {IL1MessageQueue} from "./IL1MessageQueue.sol";
import {IScrollChain} from "./IScrollChain.sol";
import {BatchHeaderV0Codec} from "../../libraries/codec/BatchHeaderV0Codec.sol";
import {ChunkCodec} from "../../libraries/codec/ChunkCodec.sol";
import {IRollupVerifier} from "../../libraries/verifier/IRollupVerifier.sol";
// solhint-disable no-inline-assembly
// solhint-disable reason-string
/// @title ScrollChain
/// @notice This contract maintains data for the Scroll rollup.
contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain {
/**********
* Events *
**********/
/// @notice Emitted when owner updates the status of sequencer.
/// @param account The address of account updated.
/// @param status The status of the account updated.
event UpdateSequencer(address indexed account, bool status);
/// @notice Emitted when owner updates the status of prover.
/// @param account The address of account updated.
/// @param status The status of the account updated.
event UpdateProver(address indexed account, bool status);
/// @notice Emitted when the address of rollup verifier is updated.
/// @param oldVerifier The address of old rollup verifier.
/// @param newVerifier The address of new rollup verifier.
event UpdateVerifier(address indexed oldVerifier, address indexed newVerifier);
/// @notice Emitted when the value of `maxNumTxInChunk` is updated.
/// @param oldMaxNumTxInChunk The old value of `maxNumTxInChunk`.
/// @param newMaxNumTxInChunk The new value of `maxNumTxInChunk`.
event UpdateMaxNumTxInChunk(uint256 oldMaxNumTxInChunk, uint256 newMaxNumTxInChunk);
/*************
* Constants *
*************/
/// @notice The chain id of the corresponding layer 2 chain.
uint64 public immutable layer2ChainId;
/*************
* Variables *
*************/
/// @notice The maximum number of transactions allowed in each chunk.
uint256 public maxNumTxInChunk;
/// @notice The address of L1MessageQueue.
address public messageQueue;
/// @notice The address of RollupVerifier.
address public verifier;
/// @notice Whether an account is a sequencer.
mapping(address => bool) public isSequencer;
/// @notice Whether an account is a prover.
mapping(address => bool) public isProver;
/// @inheritdoc IScrollChain
uint256 public override lastFinalizedBatchIndex;
/// @inheritdoc IScrollChain
mapping(uint256 => bytes32) public override committedBatches;
/// @inheritdoc IScrollChain
mapping(uint256 => bytes32) public override finalizedStateRoots;
/// @inheritdoc IScrollChain
mapping(uint256 => bytes32) public override withdrawRoots;
/**********************
* Function Modifiers *
**********************/
modifier OnlySequencer() {
// @note In the decentralized mode, it should be only called by a list of validator.
require(isSequencer[_msgSender()], "caller not sequencer");
_;
}
modifier OnlyProver() {
require(isProver[_msgSender()], "caller not prover");
_;
}
/***************
* Constructor *
***************/
constructor(uint64 _chainId) {
_disableInitializers();
layer2ChainId = _chainId;
}
function initialize(
address _messageQueue,
address _verifier,
uint256 _maxNumTxInChunk
) public initializer {
OwnableUpgradeable.__Ownable_init();
messageQueue = _messageQueue;
verifier = _verifier;
maxNumTxInChunk = _maxNumTxInChunk;
emit UpdateVerifier(address(0), _verifier);
emit UpdateMaxNumTxInChunk(0, _maxNumTxInChunk);
}
/*************************
* Public View Functions *
*************************/
/// @inheritdoc IScrollChain
function isBatchFinalized(uint256 _batchIndex) external view override returns (bool) {
return _batchIndex <= lastFinalizedBatchIndex;
}
/*****************************
* Public Mutating Functions *
*****************************/
/// @notice Import layer 2 genesis block
function importGenesisBatch(bytes calldata _batchHeader, bytes32 _stateRoot) external {
// check genesis batch header length
require(_stateRoot != bytes32(0), "zero state root");
// check whether the genesis batch is imported
require(finalizedStateRoots[0] == bytes32(0), "Genesis batch imported");
(uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader);
// check all fields except `dataHash` and `lastBlockHash` are zero
unchecked {
uint256 sum = BatchHeaderV0Codec.version(memPtr) +
BatchHeaderV0Codec.batchIndex(memPtr) +
BatchHeaderV0Codec.l1MessagePopped(memPtr) +
BatchHeaderV0Codec.totalL1MessagePopped(memPtr);
require(sum == 0, "not all fields are zero");
}
require(BatchHeaderV0Codec.dataHash(memPtr) != bytes32(0), "zero data hash");
require(BatchHeaderV0Codec.parentBatchHash(memPtr) == bytes32(0), "nonzero parent batch hash");
committedBatches[0] = _batchHash;
finalizedStateRoots[0] = _stateRoot;
emit CommitBatch(0, _batchHash);
emit FinalizeBatch(0, _batchHash, _stateRoot, bytes32(0));
}
/// @inheritdoc IScrollChain
function commitBatch(
uint8 _version,
bytes calldata _parentBatchHeader,
bytes[] memory _chunks,
bytes calldata _skippedL1MessageBitmap
) external override OnlySequencer whenNotPaused {
require(_version == 0, "invalid version");
// check whether the batch is empty
uint256 _chunksLength = _chunks.length;
require(_chunksLength > 0, "batch is empty");
// The overall memory layout in this function is organized as follows
// +---------------------+-------------------+------------------+
// | parent batch header | chunk data hashes | new batch header |
// +---------------------+-------------------+------------------+
// ^ ^ ^
// batchPtr dataPtr newBatchPtr (re-use var batchPtr)
//
// 1. We copy the parent batch header from calldata to memory starting at batchPtr
// 2. We store `_chunksLength` number of Keccak hashes starting at `dataPtr`. Each Keccak
// hash corresponds to the data hash of a chunk. So we reserve the memory region from
// `dataPtr` to `dataPtr + _chunkLength * 32` for the chunk data hashes.
// 3. The memory starting at `newBatchPtr` is used to store the new batch header and compute
// the batch hash.
// the variable `batchPtr` will be reused later for the current batch
(uint256 batchPtr, bytes32 _parentBatchHash) = _loadBatchHeader(_parentBatchHeader);
uint256 _batchIndex = BatchHeaderV0Codec.batchIndex(batchPtr);
uint256 _totalL1MessagesPoppedOverall = BatchHeaderV0Codec.totalL1MessagePopped(batchPtr);
require(committedBatches[_batchIndex] == _parentBatchHash, "incorrect parent batch hash");
require(committedBatches[_batchIndex + 1] == 0, "batch already committed");
// load `dataPtr` and reserve the memory region for chunk data hashes
uint256 dataPtr;
assembly {
dataPtr := mload(0x40)
mstore(0x40, add(dataPtr, mul(_chunksLength, 32)))
}
// compute the data hash for each chunk
uint256 _totalL1MessagesPoppedInBatch;
for (uint256 i = 0; i < _chunksLength; i++) {
uint256 _totalNumL1MessagesInChunk = _commitChunk(
dataPtr,
_chunks[i],
_totalL1MessagesPoppedInBatch,
_totalL1MessagesPoppedOverall,
_skippedL1MessageBitmap
);
unchecked {
_totalL1MessagesPoppedInBatch += _totalNumL1MessagesInChunk;
_totalL1MessagesPoppedOverall += _totalNumL1MessagesInChunk;
dataPtr += 32;
}
}
// check the length of bitmap
unchecked {
require(
((_totalL1MessagesPoppedInBatch + 255) / 256) * 32 == _skippedL1MessageBitmap.length,
"wrong bitmap length"
);
}
// compute the data hash for current batch
bytes32 _dataHash;
assembly {
let dataLen := mul(_chunksLength, 0x20)
_dataHash := keccak256(sub(dataPtr, dataLen), dataLen)
batchPtr := mload(0x40) // reset batchPtr
_batchIndex := add(_batchIndex, 1) // increase batch index
}
// store entries, the order matters
BatchHeaderV0Codec.storeVersion(batchPtr, _version);
BatchHeaderV0Codec.storeBatchIndex(batchPtr, _batchIndex);
BatchHeaderV0Codec.storeL1MessagePopped(batchPtr, _totalL1MessagesPoppedInBatch);
BatchHeaderV0Codec.storeTotalL1MessagePopped(batchPtr, _totalL1MessagesPoppedOverall);
BatchHeaderV0Codec.storeDataHash(batchPtr, _dataHash);
BatchHeaderV0Codec.storeParentBatchHash(batchPtr, _parentBatchHash);
BatchHeaderV0Codec.storeSkippedBitmap(batchPtr, _skippedL1MessageBitmap);
// compute batch hash
bytes32 _batchHash = BatchHeaderV0Codec.computeBatchHash(batchPtr, 89 + _skippedL1MessageBitmap.length);
committedBatches[_batchIndex] = _batchHash;
emit CommitBatch(_batchIndex, _batchHash);
}
/// @inheritdoc IScrollChain
/// @dev If the owner want to revert a sequence of batches by sending multiple transactions,
/// make sure to revert recent batches first.
function revertBatch(bytes calldata _batchHeader, uint256 _count) external onlyOwner {
require(_count > 0, "count must be nonzero");
(uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader);
// check batch hash
uint256 _batchIndex = BatchHeaderV0Codec.batchIndex(memPtr);
require(committedBatches[_batchIndex] == _batchHash, "incorrect batch hash");
// make sure no gap is left when reverting from the ending to the beginning.
require(committedBatches[_batchIndex + _count] == bytes32(0), "reverting must start from the ending");
// check finalization
require(_batchIndex > lastFinalizedBatchIndex, "can only revert unfinalized batch");
while (_count > 0) {
committedBatches[_batchIndex] = bytes32(0);
emit RevertBatch(_batchIndex, _batchHash);
unchecked {
_batchIndex += 1;
_count -= 1;
}
_batchHash = committedBatches[_batchIndex];
if (_batchHash == bytes32(0)) break;
}
}
/// @inheritdoc IScrollChain
function finalizeBatchWithProof(
bytes calldata _batchHeader,
bytes32 _prevStateRoot,
bytes32 _postStateRoot,
bytes32 _withdrawRoot,
bytes calldata _aggrProof
) external override OnlyProver whenNotPaused {
require(_prevStateRoot != bytes32(0), "previous state root is zero");
require(_postStateRoot != bytes32(0), "new state root is zero");
// compute batch hash and verify
(uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader);
bytes32 _dataHash = BatchHeaderV0Codec.dataHash(memPtr);
uint256 _batchIndex = BatchHeaderV0Codec.batchIndex(memPtr);
require(committedBatches[_batchIndex] == _batchHash, "incorrect batch hash");
// verify previous state root.
require(finalizedStateRoots[_batchIndex - 1] == _prevStateRoot, "incorrect previous state root");
// avoid duplicated verification
require(finalizedStateRoots[_batchIndex] == bytes32(0), "batch already verified");
// compute public input hash
bytes32 _publicInputHash = keccak256(
abi.encodePacked(layer2ChainId, _prevStateRoot, _postStateRoot, _withdrawRoot, _dataHash)
);
// verify batch
IRollupVerifier(verifier).verifyAggregateProof(_batchIndex, _aggrProof, _publicInputHash);
// check and update lastFinalizedBatchIndex
unchecked {
require(lastFinalizedBatchIndex + 1 == _batchIndex, "incorrect batch index");
lastFinalizedBatchIndex = _batchIndex;
}
// record state root and withdraw root
finalizedStateRoots[_batchIndex] = _postStateRoot;
withdrawRoots[_batchIndex] = _withdrawRoot;
// Pop finalized and non-skipped message from L1MessageQueue.
uint256 _l1MessagePopped = BatchHeaderV0Codec.l1MessagePopped(memPtr);
if (_l1MessagePopped > 0) {
IL1MessageQueue _queue = IL1MessageQueue(messageQueue);
unchecked {
uint256 _startIndex = BatchHeaderV0Codec.totalL1MessagePopped(memPtr) - _l1MessagePopped;
for (uint256 i = 0; i < _l1MessagePopped; i += 256) {
uint256 _count = 256;
if (_l1MessagePopped - i < _count) {
_count = _l1MessagePopped - i;
}
uint256 _skippedBitmap = BatchHeaderV0Codec.skippedBitmap(memPtr, i / 256);
_queue.popCrossDomainMessage(_startIndex, _count, _skippedBitmap);
_startIndex += 256;
}
}
}
emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot);
}
/************************
* Restricted Functions *
************************/
/// @notice Add an account to the sequencer list.
/// @param _account The address of account to add.
function addSequencer(address _account) external onlyOwner {
isSequencer[_account] = true;
emit UpdateSequencer(_account, true);
}
/// @notice Remove an account from the sequencer list.
/// @param _account The address of account to remove.
function removeSequencer(address _account) external onlyOwner {
isSequencer[_account] = false;
emit UpdateSequencer(_account, false);
}
/// @notice Add an account to the prover list.
/// @param _account The address of account to add.
function addProver(address _account) external onlyOwner {
isProver[_account] = true;
emit UpdateProver(_account, true);
}
/// @notice Add an account from the prover list.
/// @param _account The address of account to remove.
function removeProver(address _account) external onlyOwner {
isProver[_account] = false;
emit UpdateProver(_account, false);
}
/// @notice Update the address verifier contract.
/// @param _newVerifier The address of new verifier contract.
function updateVerifier(address _newVerifier) external onlyOwner {
address _oldVerifier = verifier;
verifier = _newVerifier;
emit UpdateVerifier(_oldVerifier, _newVerifier);
}
/// @notice Update the value of `maxNumTxInChunk`.
/// @param _maxNumTxInChunk The new value of `maxNumTxInChunk`.
function updateMaxNumTxInChunk(uint256 _maxNumTxInChunk) external onlyOwner {
uint256 _oldMaxNumTxInChunk = maxNumTxInChunk;
maxNumTxInChunk = _maxNumTxInChunk;
emit UpdateMaxNumTxInChunk(_oldMaxNumTxInChunk, _maxNumTxInChunk);
}
/// @notice Pause the contract
/// @param _status The pause status to update.
function setPause(bool _status) external onlyOwner {
if (_status) {
_pause();
} else {
_unpause();
}
}
/**********************
* Internal Functions *
**********************/
/// @dev Internal function to load batch header from calldata to memory.
/// @param _batchHeader The batch header in calldata.
/// @return memPtr The start memory offset of loaded batch header.
/// @return _batchHash The hash of the loaded batch header.
function _loadBatchHeader(bytes calldata _batchHeader) internal pure returns (uint256 memPtr, bytes32 _batchHash) {
// load to memory
uint256 _length;
(memPtr, _length) = BatchHeaderV0Codec.loadAndValidate(_batchHeader);
// compute batch hash
_batchHash = BatchHeaderV0Codec.computeBatchHash(memPtr, _length);
}
/// @dev Internal function to commit a chunk.
/// @param memPtr The start memory offset to store list of `dataHash`.
/// @param _chunk The encoded chunk to commit.
/// @param _totalL1MessagesPoppedInBatch The total number of L1 messages popped in current batch.
/// @param _totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including current batch.
/// @param _skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not.
/// @return _totalNumL1MessagesInChunk The total number of L1 message popped in current chunk
function _commitChunk(
uint256 memPtr,
bytes memory _chunk,
uint256 _totalL1MessagesPoppedInBatch,
uint256 _totalL1MessagesPoppedOverall,
bytes calldata _skippedL1MessageBitmap
) internal view returns (uint256 _totalNumL1MessagesInChunk) {
uint256 chunkPtr;
uint256 startDataPtr;
uint256 dataPtr;
uint256 blockPtr;
assembly {
dataPtr := mload(0x40)
startDataPtr := dataPtr
chunkPtr := add(_chunk, 0x20) // skip chunkLength
blockPtr := add(chunkPtr, 1) // skip numBlocks
}
uint256 _numBlocks = ChunkCodec.validateChunkLength(chunkPtr, _chunk.length);
// concatenate block contexts, use scope to avoid stack too deep
{
uint256 _totalTransactionsInChunk;
for (uint256 i = 0; i < _numBlocks; i++) {
dataPtr = ChunkCodec.copyBlockContext(chunkPtr, dataPtr, i);
uint256 _numTransactionsInBlock = ChunkCodec.numTransactions(blockPtr);
unchecked {
_totalTransactionsInChunk += _numTransactionsInBlock;
blockPtr += ChunkCodec.BLOCK_CONTEXT_LENGTH;
}
}
assembly {
mstore(0x40, add(dataPtr, mul(_totalTransactionsInChunk, 0x20))) // reserve memory for tx hashes
}
}
// It is used to compute the actual number of transactions in chunk.
uint256 txHashStartDataPtr;
assembly {
txHashStartDataPtr := dataPtr
blockPtr := add(chunkPtr, 1) // reset block ptr
}
// concatenate tx hashes
uint256 l2TxPtr = ChunkCodec.l2TxPtr(chunkPtr, _numBlocks);
while (_numBlocks > 0) {
// concatenate l1 message hashes
uint256 _numL1MessagesInBlock = ChunkCodec.numL1Messages(blockPtr);
dataPtr = _loadL1MessageHashes(
dataPtr,
_numL1MessagesInBlock,
_totalL1MessagesPoppedInBatch,
_totalL1MessagesPoppedOverall,
_skippedL1MessageBitmap
);
// concatenate l2 transaction hashes
uint256 _numTransactionsInBlock = ChunkCodec.numTransactions(blockPtr);
require(_numTransactionsInBlock >= _numL1MessagesInBlock, "num txs less than num L1 msgs");
for (uint256 j = _numL1MessagesInBlock; j < _numTransactionsInBlock; j++) {
bytes32 txHash;
(txHash, l2TxPtr) = ChunkCodec.loadL2TxHash(l2TxPtr);
assembly {
mstore(dataPtr, txHash)
dataPtr := add(dataPtr, 0x20)
}
}
unchecked {
_totalNumL1MessagesInChunk += _numL1MessagesInBlock;
_totalL1MessagesPoppedInBatch += _numL1MessagesInBlock;
_totalL1MessagesPoppedOverall += _numL1MessagesInBlock;
_numBlocks -= 1;
blockPtr += ChunkCodec.BLOCK_CONTEXT_LENGTH;
}
}
// check the actual number of transactions in the chunk
require((dataPtr - txHashStartDataPtr) / 32 <= maxNumTxInChunk, "too many txs in one chunk");
// check chunk has correct length
require(l2TxPtr - chunkPtr == _chunk.length, "incomplete l2 transaction data");
// compute data hash and store to memory
assembly {
let dataHash := keccak256(startDataPtr, sub(dataPtr, startDataPtr))
mstore(memPtr, dataHash)
}
return _totalNumL1MessagesInChunk;
}
/// @dev Internal function to load L1 message hashes from the message queue.
/// @param _ptr The memory offset to store the transaction hash.
/// @param _numL1Messages The number of L1 messages to load.
/// @param _totalL1MessagesPoppedInBatch The total number of L1 messages popped in current batch.
/// @param _totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including current batch.
/// @param _skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not.
/// @return uint256 The new memory offset after loading.
function _loadL1MessageHashes(
uint256 _ptr,
uint256 _numL1Messages,
uint256 _totalL1MessagesPoppedInBatch,
uint256 _totalL1MessagesPoppedOverall,
bytes calldata _skippedL1MessageBitmap
) internal view returns (uint256) {
if (_numL1Messages == 0) return _ptr;
IL1MessageQueue _messageQueue = IL1MessageQueue(messageQueue);
unchecked {
uint256 _bitmap;
uint256 rem;
for (uint256 i = 0; i < _numL1Messages; i++) {
uint256 quo = _totalL1MessagesPoppedInBatch >> 8;
rem = _totalL1MessagesPoppedInBatch & 0xff;
// load bitmap every 256 bits
if (i == 0 || rem == 0) {
assembly {
_bitmap := calldataload(add(_skippedL1MessageBitmap.offset, mul(0x20, quo)))
}
}
if (((_bitmap >> rem) & 1) == 0) {
// message not skipped
bytes32 _hash = _messageQueue.getCrossDomainMessage(_totalL1MessagesPoppedOverall);
assembly {
mstore(_ptr, _hash)
_ptr := add(_ptr, 0x20)
}
}
_totalL1MessagesPoppedInBatch += 1;
_totalL1MessagesPoppedOverall += 1;
}
// check last L1 message is not skipped, _totalL1MessagesPoppedInBatch must > 0
rem = (_totalL1MessagesPoppedInBatch - 1) & 0xff;
require(((_bitmap >> rem) & 1) == 0, "cannot skip last L1 message");
}
return _ptr;
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
function __Pausable_init() internal onlyInitializing {
__Pausable_init_unchained();
}
function __Pausable_init_unchained() internal onlyInitializing {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;
interface IL1MessageQueue {
/**********
* Events *
**********/
/// @notice Emitted when a new L1 => L2 transaction is appended to the queue.
/// @param sender The address of account who initiates the transaction.
/// @param target The address of account who will receive the transaction.
/// @param value The value passed with the transaction.
/// @param queueIndex The index of this transaction in the queue.
/// @param gasLimit Gas limit required to complete the message relay on L2.
/// @param data The calldata of the transaction.
event QueueTransaction(
address indexed sender,
address indexed target,
uint256 value,
uint64 queueIndex,
uint256 gasLimit,
bytes data
);
/// @notice Emitted when some L1 => L2 transactions are included in L1.
/// @param startIndex The start index of messages popped.
/// @param count The number of messages popped.
/// @param skippedBitmap A bitmap indicates whether a message is skipped.
event DequeueTransaction(uint256 startIndex, uint256 count, uint256 skippedBitmap);
/// @notice Emitted when a message is dropped from L1.
/// @param index The index of message dropped.
event DropTransaction(uint256 index);
/*************************
* Public View Functions *
*************************/
/// @notice The start index of all pending inclusion messages.
function pendingQueueIndex() external view returns (uint256);
/// @notice Return the index of next appended message.
/// @dev Also the total number of appended messages.
function nextCrossDomainMessageIndex() external view returns (uint256);
/// @notice Return the message of in `queueIndex`.
/// @param queueIndex The index to query.
function getCrossDomainMessage(uint256 queueIndex) external view returns (bytes32);
/// @notice Return the amount of ETH should pay for cross domain message.
/// @param gasLimit Gas limit required to complete the message relay on L2.
function estimateCrossDomainMessageFee(uint256 gasLimit) external view returns (uint256);
/// @notice Return the amount of intrinsic gas fee should pay for cross domain message.
/// @param _calldata The calldata of L1-initiated transaction.
function calculateIntrinsicGasFee(bytes memory _calldata) external view returns (uint256);
/// @notice Return the hash of a L1 message.
/// @param sender The address of sender.
/// @param queueIndex The queue index of this message.
/// @param value The amount of Ether transfer to target.
/// @param target The address of target.
/// @param gasLimit The gas limit provided.
/// @param data The calldata passed to target address.
function computeTransactionHash(
address sender,
uint256 queueIndex,
uint256 value,
address target,
uint256 gasLimit,
bytes calldata data
) external view returns (bytes32);
/// @notice Return whether the message is skipped.
/// @param queueIndex The queue index of the message to check.
function isMessageSkipped(uint256 queueIndex) external view returns (bool);
/// @notice Return whether the message is dropped.
/// @param queueIndex The queue index of the message to check.
function isMessageDropped(uint256 queueIndex) external view returns (bool);
/*****************************
* Public Mutating Functions *
*****************************/
/// @notice Append a L1 to L2 message into this contract.
/// @param target The address of target contract to call in L2.
/// @param gasLimit The maximum gas should be used for relay this message in L2.
/// @param data The calldata passed to target contract.
function appendCrossDomainMessage(
address target,
uint256 gasLimit,
bytes calldata data
) external;
/// @notice Append an enforced transaction to this contract.
/// @dev The address of sender should be an EOA.
/// @param sender The address of sender who will initiate this transaction in L2.
/// @param target The address of target contract to call in L2.
/// @param value The value passed
/// @param gasLimit The maximum gas should be used for this transaction in L2.
/// @param data The calldata passed to target contract.
function appendEnforcedTransaction(
address sender,
address target,
uint256 value,
uint256 gasLimit,
bytes calldata data
) external;
/// @notice Pop finalized messages from queue.
///
/// @dev We can pop at most 256 messages each time. And if the message is not skipped,
/// the corresponding entry will be cleared.
///
/// @param startIndex The start index to pop.
/// @param count The number of messages to pop.
/// @param skippedBitmap A bitmap indicates whether a message is skipped.
function popCrossDomainMessage(
uint256 startIndex,
uint256 count,
uint256 skippedBitmap
) external;
/// @notice Drop a skipped message from the queue.
function dropCrossDomainMessage(uint256 index) external;
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;
interface IScrollChain {
/**********
* Events *
**********/
/// @notice Emitted when a new batch is committed.
/// @param batchIndex The index of the batch.
/// @param batchHash The hash of the batch.
event CommitBatch(uint256 indexed batchIndex, bytes32 indexed batchHash);
/// @notice revert a pending batch.
/// @param batchIndex The index of the batch.
/// @param batchHash The hash of the batch
event RevertBatch(uint256 indexed batchIndex, bytes32 indexed batchHash);
/// @notice Emitted when a batch is finalized.
/// @param batchIndex The index of the batch.
/// @param batchHash The hash of the batch
/// @param stateRoot The state root on layer 2 after this batch.
/// @param withdrawRoot The merkle root on layer2 after this batch.
event FinalizeBatch(uint256 indexed batchIndex, bytes32 indexed batchHash, bytes32 stateRoot, bytes32 withdrawRoot);
/*************************
* Public View Functions *
*************************/
/// @notice The latest finalized batch index.
function lastFinalizedBatchIndex() external view returns (uint256);
/// @notice Return the batch hash of a committed batch.
/// @param batchIndex The index of the batch.
function committedBatches(uint256 batchIndex) external view returns (bytes32);
/// @notice Return the state root of a committed batch.
/// @param batchIndex The index of the batch.
function finalizedStateRoots(uint256 batchIndex) external view returns (bytes32);
/// @notice Return the message root of a committed batch.
/// @param batchIndex The index of the batch.
function withdrawRoots(uint256 batchIndex) external view returns (bytes32);
/// @notice Return whether the batch is finalized by batch index.
/// @param batchIndex The index of the batch.
function isBatchFinalized(uint256 batchIndex) external view returns (bool);
/*****************************
* Public Mutating Functions *
*****************************/
/// @notice Commit a batch of transactions on layer 1.
///
/// @param version The version of current batch.
/// @param parentBatchHeader The header of parent batch, see the comments of `BatchHeaderV0Codec`.
/// @param chunks The list of encoded chunks, see the comments of `ChunkCodec`.
/// @param skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not.
function commitBatch(
uint8 version,
bytes calldata parentBatchHeader,
bytes[] memory chunks,
bytes calldata skippedL1MessageBitmap
) external;
/// @notice Revert a pending batch.
/// @dev one can only revert unfinalized batches.
/// @param batchHeader The header of current batch, see the encoding in comments of `commitBatch`.
/// @param count The number of subsequent batches to revert, including current batch.
function revertBatch(bytes calldata batchHeader, uint256 count) external;
/// @notice Finalize a committed batch on layer 1.
/// @param batchHeader The header of current batch, see the encoding in comments of `commitBatch.
/// @param prevStateRoot The state root of parent batch.
/// @param postStateRoot The state root of current batch.
/// @param withdrawRoot The withdraw trie root of current batch.
/// @param aggrProof The aggregation proof for current batch.
function finalizeBatchWithProof(
bytes calldata batchHeader,
bytes32 prevStateRoot,
bytes32 postStateRoot,
bytes32 withdrawRoot,
bytes calldata aggrProof
) external;
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;
// solhint-disable no-inline-assembly
/// @dev Below is the encoding for `BatchHeader` V0, total 89 + ceil(l1MessagePopped / 256) * 32 bytes.
/// ```text
/// * Field Bytes Type Index Comments
/// * version 1 uint8 0 The batch version
/// * batchIndex 8 uint64 1 The index of the batch
/// * l1MessagePopped 8 uint64 9 Number of L1 messages popped in the batch
/// * totalL1MessagePopped 8 uint64 17 Number of total L1 message popped after the batch
/// * dataHash 32 bytes32 25 The data hash of the batch
/// * parentBatchHash 32 bytes32 57 The parent batch hash
/// * skippedL1MessageBitmap dynamic uint256[] 89 A bitmap to indicate which L1 messages are skipped in the batch
/// ```
library BatchHeaderV0Codec {
/// @notice Load batch header in calldata to memory.
/// @param _batchHeader The encoded batch header bytes in calldata.
/// @return batchPtr The start memory offset of the batch header in memory.
/// @return length The length in bytes of the batch header.
function loadAndValidate(bytes calldata _batchHeader) internal pure returns (uint256 batchPtr, uint256 length) {
length = _batchHeader.length;
require(length >= 89, "batch header length too small");
// copy batch header to memory.
assembly {
batchPtr := mload(0x40)
calldatacopy(batchPtr, _batchHeader.offset, length)
mstore(0x40, add(batchPtr, length))
}
// check batch header length
uint256 _l1MessagePopped = BatchHeaderV0Codec.l1MessagePopped(batchPtr);
unchecked {
require(length == 89 + ((_l1MessagePopped + 255) / 256) * 32, "wrong bitmap length");
}
}
/// @notice Get the version of the batch header.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @return _version The version of the batch header.
function version(uint256 batchPtr) internal pure returns (uint256 _version) {
assembly {
_version := shr(248, mload(batchPtr))
}
}
/// @notice Get the batch index of the batch.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @return _batchIndex The batch index of the batch.
function batchIndex(uint256 batchPtr) internal pure returns (uint256 _batchIndex) {
assembly {
_batchIndex := shr(192, mload(add(batchPtr, 1)))
}
}
/// @notice Get the number of L1 messages of the batch.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @return _l1MessagePopped The number of L1 messages of the batch.
function l1MessagePopped(uint256 batchPtr) internal pure returns (uint256 _l1MessagePopped) {
assembly {
_l1MessagePopped := shr(192, mload(add(batchPtr, 9)))
}
}
/// @notice Get the number of L1 messages popped before this batch.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @return _totalL1MessagePopped The the number of L1 messages popped before this batch.
function totalL1MessagePopped(uint256 batchPtr) internal pure returns (uint256 _totalL1MessagePopped) {
assembly {
_totalL1MessagePopped := shr(192, mload(add(batchPtr, 17)))
}
}
/// @notice Get the data hash of the batch header.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @return _dataHash The data hash of the batch header.
function dataHash(uint256 batchPtr) internal pure returns (bytes32 _dataHash) {
assembly {
_dataHash := mload(add(batchPtr, 25))
}
}
/// @notice Get the parent batch hash of the batch header.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @return _parentBatchHash The parent batch hash of the batch header.
function parentBatchHash(uint256 batchPtr) internal pure returns (bytes32 _parentBatchHash) {
assembly {
_parentBatchHash := mload(add(batchPtr, 57))
}
}
/// @notice Get the skipped L1 messages bitmap.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @param index The index of bitmap to load.
/// @return _bitmap The bitmap from bits `index * 256` to `index * 256 + 255`.
function skippedBitmap(uint256 batchPtr, uint256 index) internal pure returns (uint256 _bitmap) {
assembly {
batchPtr := add(batchPtr, 89)
_bitmap := mload(add(batchPtr, mul(index, 32)))
}
}
/// @notice Store the version of batch header.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @param _version The version of batch header.
function storeVersion(uint256 batchPtr, uint256 _version) internal pure {
assembly {
mstore8(batchPtr, _version)
}
}
/// @notice Store the batch index of batch header.
/// @dev Because this function can overwrite the subsequent fields, it must be called before
/// `storeL1MessagePopped`, `storeTotalL1MessagePopped`, and `storeDataHash`.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @param _batchIndex The batch index.
function storeBatchIndex(uint256 batchPtr, uint256 _batchIndex) internal pure {
assembly {
mstore(add(batchPtr, 1), shl(192, _batchIndex))
}
}
/// @notice Store the number of L1 messages popped in current batch to batch header.
/// @dev Because this function can overwrite the subsequent fields, it must be called before
/// `storeTotalL1MessagePopped` and `storeDataHash`.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @param _l1MessagePopped The number of L1 messages popped in current batch.
function storeL1MessagePopped(uint256 batchPtr, uint256 _l1MessagePopped) internal pure {
assembly {
mstore(add(batchPtr, 9), shl(192, _l1MessagePopped))
}
}
/// @notice Store the total number of L1 messages popped after current batch to batch header.
/// @dev Because this function can overwrite the subsequent fields, it must be called before
/// `storeDataHash`.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @param _totalL1MessagePopped The total number of L1 messages popped after current batch.
function storeTotalL1MessagePopped(uint256 batchPtr, uint256 _totalL1MessagePopped) internal pure {
assembly {
mstore(add(batchPtr, 17), shl(192, _totalL1MessagePopped))
}
}
/// @notice Store the data hash of batch header.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @param _dataHash The data hash.
function storeDataHash(uint256 batchPtr, bytes32 _dataHash) internal pure {
assembly {
mstore(add(batchPtr, 25), _dataHash)
}
}
/// @notice Store the parent batch hash of batch header.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @param _parentBatchHash The parent batch hash.
function storeParentBatchHash(uint256 batchPtr, bytes32 _parentBatchHash) internal pure {
assembly {
mstore(add(batchPtr, 57), _parentBatchHash)
}
}
/// @notice Store the skipped L1 message bitmap of batch header.
/// @param batchPtr The start memory offset of the batch header in memory.
/// @param _skippedL1MessageBitmap The skipped L1 message bitmap.
function storeSkippedBitmap(uint256 batchPtr, bytes calldata _skippedL1MessageBitmap) internal pure {
assembly {
calldatacopy(add(batchPtr, 89), _skippedL1MessageBitmap.offset, _skippedL1MessageBitmap.length)
}
}
/// @notice Compute the batch hash.
/// @dev Caller should make sure that the encoded batch header is correct.
///
/// @param batchPtr The memory offset of the encoded batch header.
/// @param length The length of the batch.
/// @return _batchHash The hash of the corresponding batch.
function computeBatchHash(uint256 batchPtr, uint256 length) internal pure returns (bytes32 _batchHash) {
// in the current version, the hash is: keccak(BatchHeader without timestamp)
assembly {
_batchHash := keccak256(batchPtr, length)
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;
/// @dev Below is the encoding for `Chunk`, total 60*n+1+m bytes.
/// ```text
/// * Field Bytes Type Index Comments
/// * numBlocks 1 uint8 0 The number of blocks in this chunk
/// * block[0] 60 BlockContext 1 The first block in this chunk
/// * ......
/// * block[i] 60 BlockContext 60*i+1 The (i+1)'th block in this chunk
/// * ......
/// * block[n-1] 60 BlockContext 60*n-59 The last block in this chunk
/// * l2Transactions dynamic bytes 60*n+1
/// ```
///
/// @dev Below is the encoding for `BlockContext`, total 60 bytes.
/// ```text
/// * Field Bytes Type Index Comments
/// * blockNumber 8 uint64 0 The height of this block.
/// * timestamp 8 uint64 8 The timestamp of this block.
/// * baseFee 32 uint256 16 The base fee of this block. Currently, it is always 0, because we disable EIP-1559.
/// * gasLimit 8 uint64 48 The gas limit of this block.
/// * numTransactions 2 uint16 56 The number of transactions in this block, both L1 & L2 txs.
/// * numL1Messages 2 uint16 58 The number of l1 messages in this block.
/// ```
library ChunkCodec {
uint256 internal constant BLOCK_CONTEXT_LENGTH = 60;
/// @notice Validate the length of chunk.
/// @param chunkPtr The start memory offset of the chunk in memory.
/// @param _length The length of the chunk.
/// @return _numBlocks The number of blocks in current chunk.
function validateChunkLength(uint256 chunkPtr, uint256 _length) internal pure returns (uint256 _numBlocks) {
_numBlocks = numBlocks(chunkPtr);
// should contain at least one block
require(_numBlocks > 0, "no block in chunk");
// should contain at least the number of the blocks and block contexts
require(_length >= 1 + _numBlocks * BLOCK_CONTEXT_LENGTH, "invalid chunk length");
}
/// @notice Return the start memory offset of `l2Transactions`.
/// @dev The caller should make sure `_numBlocks` is correct.
/// @param chunkPtr The start memory offset of the chunk in memory.
/// @param _numBlocks The number of blocks in current chunk.
/// @return _l2TxPtr the start memory offset of `l2Transactions`.
function l2TxPtr(uint256 chunkPtr, uint256 _numBlocks) internal pure returns (uint256 _l2TxPtr) {
unchecked {
_l2TxPtr = chunkPtr + 1 + _numBlocks * BLOCK_CONTEXT_LENGTH;
}
}
/// @notice Return the number of blocks in current chunk.
/// @param chunkPtr The start memory offset of the chunk in memory.
/// @return _numBlocks The number of blocks in current chunk.
function numBlocks(uint256 chunkPtr) internal pure returns (uint256 _numBlocks) {
assembly {
_numBlocks := shr(248, mload(chunkPtr))
}
}
/// @notice Copy the block context to another memory.
/// @param chunkPtr The start memory offset of the chunk in memory.
/// @param dstPtr The destination memory offset to store the block context.
/// @param index The index of block context to copy.
/// @return uint256 The new destination memory offset after copy.
function copyBlockContext(
uint256 chunkPtr,
uint256 dstPtr,
uint256 index
) internal pure returns (uint256) {
// only first 58 bytes is needed.
assembly {
chunkPtr := add(chunkPtr, add(1, mul(BLOCK_CONTEXT_LENGTH, index)))
mstore(dstPtr, mload(chunkPtr)) // first 32 bytes
mstore(
add(dstPtr, 0x20),
and(mload(add(chunkPtr, 0x20)), 0xffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000)
) // next 26 bytes
dstPtr := add(dstPtr, 58)
}
return dstPtr;
}
/// @notice Return the number of transactions in current block.
/// @param blockPtr The start memory offset of the block context in memory.
/// @return _numTransactions The number of transactions in current block.
function numTransactions(uint256 blockPtr) internal pure returns (uint256 _numTransactions) {
assembly {
_numTransactions := shr(240, mload(add(blockPtr, 56)))
}
}
/// @notice Return the number of L1 messages in current block.
/// @param blockPtr The start memory offset of the block context in memory.
/// @return _numL1Messages The number of L1 messages in current block.
function numL1Messages(uint256 blockPtr) internal pure returns (uint256 _numL1Messages) {
assembly {
_numL1Messages := shr(240, mload(add(blockPtr, 58)))
}
}
/// @notice Compute and load the transaction hash.
/// @param _l2TxPtr The start memory offset of the transaction in memory.
/// @return bytes32 The transaction hash of the transaction.
/// @return uint256 The start memory offset of the next transaction in memory.
function loadL2TxHash(uint256 _l2TxPtr) internal pure returns (bytes32, uint256) {
bytes32 txHash;
assembly {
// first 4 bytes indicate the length
let txPayloadLength := shr(224, mload(_l2TxPtr))
_l2TxPtr := add(_l2TxPtr, 4)
txHash := keccak256(_l2TxPtr, txPayloadLength)
_l2TxPtr := add(_l2TxPtr, txPayloadLength)
}
return (txHash, _l2TxPtr);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;
interface IRollupVerifier {
/// @notice Verify aggregate zk proof.
/// @param batchIndex The batch index to verify.
/// @param aggrProof The aggregated proof.
/// @param publicInputHash The public input hash.
function verifyAggregateProof(
uint256 batchIndex,
bytes calldata aggrProof,
bytes32 publicInputHash
) external view;
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized != type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}