|
| 1 | +use std::time::Duration; |
| 2 | + |
| 3 | +use url::Url; |
| 4 | + |
| 5 | +use crate::ethereum_base_layer_contract::{EthereumBaseLayerConfig, EthereumBaseLayerContract}; |
| 6 | +use crate::BaseLayerContract; |
| 7 | + |
| 8 | +#[tokio::test] |
| 9 | +#[ignore = "This test uses external dependencies, like Infura. But still it is a good \ |
| 10 | + reference/sanity check."] |
| 11 | +async fn fusaka_blob_fee_sanity_check() { |
| 12 | + let config = EthereumBaseLayerConfig { |
| 13 | + fusaka_no_bpo_start_block_number: 0, |
| 14 | + bpo1_start_block_number: 0, |
| 15 | + bpo2_start_block_number: 0, |
| 16 | + timeout_millis: Duration::from_millis(5000), |
| 17 | + ..Default::default() |
| 18 | + }; |
| 19 | + |
| 20 | + // Timeline: Sepolia went on Fusaka on epoch 272640 (slot 8724480) which is about block 9408577 |
| 21 | + // It went on BPO1 on epoch 274176 (slot 8773632) which is about block 9456501 |
| 22 | + // It went on BPO2 on epoch 275712 (slot 8822784) which is about block 9504747 |
| 23 | + let infura_api_key = std::env::var("INFURA_API_KEY") |
| 24 | + .expect("expected infura api key to be set in INFURA_API_KEY environment variable"); |
| 25 | + let url = Url::parse(&format!("https://sepolia.infura.io/v3/{}", infura_api_key)) |
| 26 | + .expect("expected infura url to be valid"); |
| 27 | + let mut base_layer = EthereumBaseLayerContract::new(config.clone(), url); |
| 28 | + |
| 29 | + // This is a known time when the data gas price was relatively high: |
| 30 | + // https://sepolia.blobscan.com/block/9716185 |
| 31 | + // The blob fee here is 0.010629722 wei. |
| 32 | + let block_number = 9716185; |
| 33 | + let base_fee_from_blobscan = 10629722; |
| 34 | + let block_header = base_layer |
| 35 | + .get_block_header(block_number) |
| 36 | + .await |
| 37 | + .expect("expected call to get block header to succeed") |
| 38 | + .expect("expected block header to be found"); |
| 39 | + |
| 40 | + assert_eq!(block_header.blob_fee, base_fee_from_blobscan); |
| 41 | + |
| 42 | + // Now try to unset the fusaka configuration, to see if we get a massively bigger blob fee. |
| 43 | + base_layer.config.fusaka_no_bpo_start_block_number = 100000000; |
| 44 | + base_layer.config.bpo1_start_block_number = 1000000000; |
| 45 | + base_layer.config.bpo2_start_block_number = 1000000000; |
| 46 | + let block_header = base_layer |
| 47 | + .get_block_header(block_number) |
| 48 | + .await |
| 49 | + .expect("expected call to get block header to succeed") |
| 50 | + .expect("expected block header to be found"); |
| 51 | + |
| 52 | + assert!(block_header.blob_fee > 1000 * base_fee_from_blobscan); |
| 53 | + |
| 54 | + // Choose a mainnet block number that is not yet on Fusaka (but has non-zero blob fee). |
| 55 | + // https://blobscan.com/block/23824000 |
| 56 | + // The blob fee here is 31.042082881 Gwei. |
| 57 | + let url = Url::parse(&format!("https://mainnet.infura.io/v3/{}", infura_api_key)) |
| 58 | + .expect("expected infura url to be valid"); |
| 59 | + let mut base_layer = EthereumBaseLayerContract::new(config, url); |
| 60 | + base_layer.config.fusaka_no_bpo_start_block_number = 100000000; |
| 61 | + base_layer.config.bpo1_start_block_number = 1000000000; |
| 62 | + base_layer.config.bpo2_start_block_number = 1000000000; |
| 63 | + let block_number = 23824000; |
| 64 | + let base_fee_from_blobscan = 31042082881; |
| 65 | + let block_header = base_layer |
| 66 | + .get_block_header(block_number) |
| 67 | + .await |
| 68 | + .expect("expected call to get block header to succeed") |
| 69 | + .expect("expected block header to be found"); |
| 70 | + assert_eq!(block_header.blob_fee, base_fee_from_blobscan); |
| 71 | + |
| 72 | + // But if we set the fusaka update to have already happened, we should get a much lower fee. |
| 73 | + base_layer.config.fusaka_no_bpo_start_block_number = 0; |
| 74 | + base_layer.config.bpo1_start_block_number = 0; |
| 75 | + base_layer.config.bpo2_start_block_number = 0; |
| 76 | + let block_header = base_layer |
| 77 | + .get_block_header(block_number) |
| 78 | + .await |
| 79 | + .expect("expected call to get block header to succeed") |
| 80 | + .expect("expected block header to be found"); |
| 81 | + assert!(block_header.blob_fee * 1000 < base_fee_from_blobscan); |
| 82 | +} |
0 commit comments