|
| 1 | +public enum BlockStatus: String, Codable { |
| 2 | + case preConfirmed = "PRE_CONFIRMED" |
| 3 | + case acceptedOnL1 = "ACCEPTED_ON_L1" |
| 4 | + case acceptedOnL2 = "ACCEPTED_ON_L2" |
| 5 | + case rejected = "REJECTED" |
| 6 | +} |
| 7 | + |
| 8 | +public protocol StarknetBlock: Codable { |
| 9 | + var timestamp: Int { get } |
| 10 | + var sequencerAddress: Felt { get } |
| 11 | + var blockNumber: Int { get } |
| 12 | + var l1GasPrice: StarknetResourcePrice { get } |
| 13 | + var l2GasPrice: StarknetResourcePrice { get } |
| 14 | + var l1DataGasPrice: StarknetResourcePrice { get } |
| 15 | + var l1DataAvailabilityMode: StarknetL1DAMode { get } |
| 16 | + var starknetVersion: String { get } |
| 17 | +} |
| 18 | + |
| 19 | +public protocol StarknetProcessedBlock: StarknetBlock { |
| 20 | + var status: BlockStatus { get } |
| 21 | + var blockHash: Felt { get } |
| 22 | + var parentHash: Felt { get } |
| 23 | + var newRoot: Felt { get } |
| 24 | +} |
| 25 | + |
| 26 | +public protocol StarknetPreConfirmedBlock: StarknetBlock {} |
| 27 | + |
| 28 | +public protocol StarknetBlockWithTxs: StarknetBlock { |
| 29 | + var transactions: [TransactionWrapper] { get } |
| 30 | +} |
| 31 | + |
| 32 | +public struct StarknetProcessedBlockWithTxs: StarknetProcessedBlock, StarknetBlockWithTxs, Encodable { |
| 33 | + public let status: BlockStatus |
| 34 | + public let transactions: [TransactionWrapper] |
| 35 | + public let blockHash: Felt |
| 36 | + public let parentHash: Felt |
| 37 | + public let blockNumber: Int |
| 38 | + public let newRoot: Felt |
| 39 | + public let timestamp: Int |
| 40 | + public let sequencerAddress: Felt |
| 41 | + public let l1GasPrice: StarknetResourcePrice |
| 42 | + public let l2GasPrice: StarknetResourcePrice |
| 43 | + public let l1DataGasPrice: StarknetResourcePrice |
| 44 | + public let l1DataAvailabilityMode: StarknetL1DAMode |
| 45 | + public let starknetVersion: String |
| 46 | + |
| 47 | + enum CodingKeys: String, CodingKey { |
| 48 | + case status |
| 49 | + case transactions |
| 50 | + case blockHash = "block_hash" |
| 51 | + case parentHash = "parent_hash" |
| 52 | + case blockNumber = "block_number" |
| 53 | + case newRoot = "new_root" |
| 54 | + case timestamp |
| 55 | + case sequencerAddress = "sequencer_address" |
| 56 | + case l1GasPrice = "l1_gas_price" |
| 57 | + case l2GasPrice = "l2_gas_price" |
| 58 | + case l1DataGasPrice = "l1_data_gas_price" |
| 59 | + case l1DataAvailabilityMode = "l1_da_mode" |
| 60 | + case starknetVersion = "starknet_version" |
| 61 | + } |
| 62 | +} |
| 63 | + |
| 64 | +public struct StarknetPreConfirmedBlockWithTxs: StarknetPreConfirmedBlock, StarknetBlockWithTxs, Codable { |
| 65 | + public let transactions: [TransactionWrapper] |
| 66 | + public let blockNumber: Int |
| 67 | + public let timestamp: Int |
| 68 | + public let sequencerAddress: Felt |
| 69 | + public let l1GasPrice: StarknetResourcePrice |
| 70 | + public let l2GasPrice: StarknetResourcePrice |
| 71 | + public let l1DataGasPrice: StarknetResourcePrice |
| 72 | + public let l1DataAvailabilityMode: StarknetL1DAMode |
| 73 | + public let starknetVersion: String |
| 74 | + |
| 75 | + enum CodingKeys: String, CodingKey { |
| 76 | + case transactions |
| 77 | + case blockNumber = "block_number" |
| 78 | + case timestamp |
| 79 | + case sequencerAddress = "sequencer_address" |
| 80 | + case l1GasPrice = "l1_gas_price" |
| 81 | + case l2GasPrice = "l2_gas_price" |
| 82 | + case l1DataGasPrice = "l1_data_gas_price" |
| 83 | + case l1DataAvailabilityMode = "l1_da_mode" |
| 84 | + case starknetVersion = "starknet_version" |
| 85 | + } |
| 86 | +} |
| 87 | + |
| 88 | +public enum StarknetBlockWithTxsWrapper: Codable { |
| 89 | + case processed(StarknetProcessedBlockWithTxs) |
| 90 | + case preConfirmed(StarknetPreConfirmedBlockWithTxs) |
| 91 | + |
| 92 | + public init(from decoder: Decoder) throws { |
| 93 | + let container = try decoder.container(keyedBy: CodingKeys.self) |
| 94 | + if container.contains(.parentHash) { |
| 95 | + let block = try StarknetProcessedBlockWithTxs(from: decoder) |
| 96 | + self = .processed(block) |
| 97 | + } else { |
| 98 | + let block = try StarknetPreConfirmedBlockWithTxs(from: decoder) |
| 99 | + self = .preConfirmed(block) |
| 100 | + } |
| 101 | + } |
| 102 | + |
| 103 | + public func encode(to encoder: Encoder) throws { |
| 104 | + switch self { |
| 105 | + case let .processed(block): try block.encode(to: encoder) |
| 106 | + case let .preConfirmed(block): try block.encode(to: encoder) |
| 107 | + } |
| 108 | + } |
| 109 | + |
| 110 | + private enum CodingKeys: String, CodingKey { |
| 111 | + case parentHash = "parent_hash" |
| 112 | + } |
| 113 | +} |
0 commit comments