From 43eb98aa4ac4f6ba6db0bfbf1cfae6a7450e8b14 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Mon, 19 Jun 2023 12:23:20 +0000 Subject: [PATCH 1/4] Skip dataAvailabilityMode in program output --- packages/backend/src/Application.ts | 3 ++- .../src/core/PerpetualValidiumSyncService.ts | 3 ++- .../PerpetualCairoOutputCollector.ts | 22 ++++++++++++++++--- .../decoding/decodePerpetualCairoOutput.ts | 9 +++++++- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/packages/backend/src/Application.ts b/packages/backend/src/Application.ts index 734081257..b004fe8b9 100644 --- a/packages/backend/src/Application.ts +++ b/packages/backend/src/Application.ts @@ -255,7 +255,8 @@ export class Application { : undefined const perpetualCairoOutputCollector = new PerpetualCairoOutputCollector( - ethereumClient + ethereumClient, + config.starkex ) const rollupStateRepository = new MerkleTreeRepository( database, diff --git a/packages/backend/src/core/PerpetualValidiumSyncService.ts b/packages/backend/src/core/PerpetualValidiumSyncService.ts index 67c9f6ce1..36076edc0 100644 --- a/packages/backend/src/core/PerpetualValidiumSyncService.ts +++ b/packages/backend/src/core/PerpetualValidiumSyncService.ts @@ -56,7 +56,8 @@ export class PerpetualValidiumSyncService implements IDataSyncService { for (const stateTransition of stateTransitions) { const [perpetualCairoOutput, batch] = await Promise.all([ this.perpetualCairoOutputCollector.collect( - stateTransition.transactionHash + stateTransition.transactionHash, + stateTransition.blockNumber ), this.availabilityGatewayClient.getPerpetualBatchData( stateTransition.batchId diff --git a/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts b/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts index 8eb265891..45b6c5a26 100644 --- a/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts +++ b/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts @@ -5,6 +5,7 @@ import { import { Hash256 } from '@explorer/types' import { BigNumber, utils } from 'ethers' +import { StarkexConfig } from '../../config/starkex/StarkexConfig' import { EthereumClient } from '../../peripherals/ethereum/EthereumClient' import { toHexData } from '../../utils/toHexData' @@ -13,9 +14,15 @@ const ABI = new utils.Interface([ ]) export class PerpetualCairoOutputCollector { - constructor(private readonly ethereumClient: EthereumClient) {} + constructor( + private readonly ethereumClient: EthereumClient, + private readonly starkexConfig: StarkexConfig + ) {} - async collect(transactionHash: Hash256): Promise { + async collect( + transactionHash: Hash256, + blockNumber: number + ): Promise { const tx = await this.ethereumClient.getTransaction(transactionHash) if (!tx) { throw new Error('Invalid transaction') @@ -23,6 +30,15 @@ export class PerpetualCairoOutputCollector { const decoded = ABI.decodeFunctionData('updateState', tx.data) const programOutputValues = decoded.programOutput as BigNumber[] const hexData = toHexData(programOutputValues) - return decodePerpetualCairoOutput(hexData) + + // This is a fix for Apex Goerli testnet, which switches + // to a different program output (one more field) at block 8056029. + // See: https://github.com/starkware-libs/stark-perpetual/blob/eaa284683deec190407fece98b96546d10f6ad67/src/services/perpetual/cairo/output/program_output.cairo#L36 + const skipDataAvailabilityModeField = + this.starkexConfig.instanceName === 'ApeX' && + this.starkexConfig.blockchain.chainId === 5 && // it's goerli + blockNumber >= 8056029 + + return decodePerpetualCairoOutput(hexData, skipDataAvailabilityModeField) } } diff --git a/packages/encoding/src/decoding/decodePerpetualCairoOutput.ts b/packages/encoding/src/decoding/decodePerpetualCairoOutput.ts index 7dbbc881e..c4e20aa5b 100644 --- a/packages/encoding/src/decoding/decodePerpetualCairoOutput.ts +++ b/packages/encoding/src/decoding/decodePerpetualCairoOutput.ts @@ -8,9 +8,16 @@ import { readForcedActions } from './readForcedActions' import { readModifications } from './readModifications' import { readState } from './readState' -export function decodePerpetualCairoOutput(data: string): PerpetualCairoOutput { +export function decodePerpetualCairoOutput( + data: string, + skipDataAvailabilityModeField?: boolean +): PerpetualCairoOutput { const reader = new ByteReader(data) + if (skipDataAvailabilityModeField) { + const _dataAvailabilityMode = reader.readBigInt(32) + } + const configurationHash = Hash256(reader.readHex(32)) const assetConfigHashes = readAssetConfigHashes(reader) const oldState = readState(reader) From 3411435d0a8b7efa205f77f716593470618b898b Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Tue, 20 Jun 2023 13:09:38 +0000 Subject: [PATCH 2/4] Add test for skipDataAvailabilityMode field --- .../decodePerpetualCairoOutput.test.ts | 16 + .../data/decoded-with-dataavail-field.json | 440 ++++++++++++++++++ .../data/encoded-with-dataavail-field.json | 1 + 3 files changed, 457 insertions(+) create mode 100644 packages/encoding/src/decoding/decodePerpetualCairoOutput.test.ts create mode 100644 packages/encoding/src/test/data/decoded-with-dataavail-field.json create mode 100644 packages/encoding/src/test/data/encoded-with-dataavail-field.json diff --git a/packages/encoding/src/decoding/decodePerpetualCairoOutput.test.ts b/packages/encoding/src/decoding/decodePerpetualCairoOutput.test.ts new file mode 100644 index 000000000..370815d85 --- /dev/null +++ b/packages/encoding/src/decoding/decodePerpetualCairoOutput.test.ts @@ -0,0 +1,16 @@ +import { expect } from 'earl' + +import DECODED_EXAMPLE from '../test/data/decoded-with-dataavail-field.json' +import ENCODED_EXAMPLE from '../test/data/encoded-with-dataavail-field.json' +import { decodePerpetualCairoOutput } from './decodePerpetualCairoOutput' + +describe('decodePerpetualCairoOutput', () => { + it('decodes data with skipDataAvailabilityModeField', () => { + // passing true to skipDataAvailabilityModeField + const decoded = decodePerpetualCairoOutput(ENCODED_EXAMPLE, true) + const noBigInt = JSON.parse( + JSON.stringify(decoded, (k, v) => (typeof v === 'bigint' ? Number(v) : v)) + ) + expect(noBigInt).toEqual(DECODED_EXAMPLE) + }) +}) diff --git a/packages/encoding/src/test/data/decoded-with-dataavail-field.json b/packages/encoding/src/test/data/decoded-with-dataavail-field.json new file mode 100644 index 000000000..e53bb1de9 --- /dev/null +++ b/packages/encoding/src/test/data/decoded-with-dataavail-field.json @@ -0,0 +1,440 @@ +{ + "configurationHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "assetConfigHashes": [ + { + "assetId": "1INCH-5", + "hash": "022f1e30537bc1799a0bdf000b3de4a386ba82f7543703e549ea8b1847650ecf" + }, + { + "assetId": "ADA-5", + "hash": "0102c8fa9019cea5c5c94055f6919d18f97cd293a0750f6cf7724c68198b3eab" + }, + { + "assetId": "ALGO-5", + "hash": "010ca1c758280c1f1a5a610d17ba73671e09aa804027f45da957604e84376cd3" + }, + { + "assetId": "APE-6", + "hash": "06eb16bed522ae6e9e9d3c1cb5b7a8811c6ea14e9eeab40899ba572ae5e63f02" + }, + { + "assetId": "APT-6", + "hash": "016568b339b324863dfe2ba8070ee7bbf0435763dec6c7685edfd4b5696e8dcc" + }, + { + "assetId": "ATOM-7", + "hash": "079af1de66e0f52d9bf523427eb3291d18b37c59eba2ed245e52b3bf1d72a825" + }, + { + "assetId": "AVAX-7", + "hash": "05d9d9c10d034f24f404f240dfdce9576d94460cd30cfe5fb5dec3c58bdb2872" + }, + { + "assetId": "AXS-7", + "hash": "04d33ff813d2dff82b8c90a4444cf461a22d6576db1472f43fe7a98ea7c98b15" + }, + { + "assetId": "BCH-8", + "hash": "051d9a0c4fa479418a530c7f7ac9b6761948d050e27faa71fe098a3a1558d1bf" + }, + { + "assetId": "BNB-8", + "hash": "04a71858480c036f5fd2ccc575d9ff6ec0f42668e1439dba2b72b56e2c81000c" + }, + { + "assetId": "BTC-10", + "hash": "03887cc593699c636091ef65133cfe5153de50ca103c6cbc75269054c1ff1116" + }, + { + "assetId": "CHZ-5", + "hash": "043b15cc35bcfb57558c9f31aae847acf32c6d8a61040619693d3b7363375c19" + }, + { + "assetId": "CRV-5", + "hash": "01a41a81ede64a810349af6938ded87aa98f8c75761267ec7b695a5d0d1b3a3b" + }, + { + "assetId": "DOGE-5", + "hash": "067596f3e90a607e0c6a9ecbf1e1c84e7aecb64ee777821daafb596baa23c54d" + }, + { + "assetId": "DOT-6", + "hash": "04459cc5c7e30f88c147313f33710d108163b4c1e4dcca5447e18da9313ccf89" + }, + { + "assetId": "ENJ-5", + "hash": "035327f807b7d10828ec12969036cf74db46b46bc64b79c3e2dede6cc1aac525" + }, + { + "assetId": "ETC-7", + "hash": "06066f6f44e278ff8a0886d0a729a9e23a90d0db5e689adeb8e50d02e393165d" + }, + { + "assetId": "ETH-9", + "hash": "011ad16a1827de9bd742112d7512bc0ca98bf5f9127e2b32e4bc63cd24708cf3" + }, + { + "assetId": "FIL-6", + "hash": "02e0cddbfc11ec6584a858a0951434cad8dc146f4ed9786692719711b8079b4d" + }, + { + "assetId": "GMT-5", + "hash": "0193bfb01ff0d83a966c077bf4b5c824906cc76269729b44310632bc65545fa2" + }, + { + "assetId": "LINK-7", + "hash": "02ec256004f6bddef46df3b1f8002f5ca22b8777b21a305b6a5a44ca3645fdda" + }, + { + "assetId": "LTC-7", + "hash": "023b19ac1053463f519da8052ec3320d42728459108fde51c06673a64e3c90d5" + }, + { + "assetId": "MATIC-6", + "hash": "02509fce9099db46e6d9d79868fc20d016ec1d3d71d3978d5e8954e7b603b91d" + }, + { + "assetId": "NEAR-6", + "hash": "028f6cf36b99beec3fab92d2c5f134741aae4fa9fe34065a5cb0415ac7fd1638" + }, + { + "assetId": "OP-6", + "hash": "0583c8a526f5cdd3404f44351564e948e62bccd3a083150f56dafba2bee025c4" + }, + { + "assetId": "SOL-7", + "hash": "069c0fa754df552cbdf4495c9e2784fcd9004a1d9f5e209920e5b2aaa924a4ce" + }, + { + "assetId": "SUSHI-6", + "hash": "022b892cb916d0ee9a43a07b84a37f56afa119901ffe2df9db4f40ab224dea30" + }, + { + "assetId": "UNI-6", + "hash": "017723326254a52f2fcdcb77e5f3f5407ec4f879bad939baae7ec38957da99e9" + }, + { + "assetId": "XRP-6", + "hash": "05d321c440bca697358b86af0b8108d57daabbad5516c6346b980b20a7a00001" + } + ], + "oldState": { + "positionRoot": "0492b38972b931853172ee4cb9b4475dc9d077e5220714544db754804dd6a452", + "positionHeight": 64, + "orderRoot": "01c3b9f8e4623bd784e477601176ec5e6dac5759f450addf29db022dfcfdf60a", + "orderHeight": 64, + "indices": [ + { + "assetId": "ADA-5", + "value": 51173697 + }, + { + "assetId": "APT-6", + "value": 717784504 + }, + { + "assetId": "ATOM-7", + "value": 1139694040 + }, + { + "assetId": "AVAX-7", + "value": 213530564 + }, + { + "assetId": "BNB-8", + "value": 430246272 + }, + { + "assetId": "BTC-10", + "value": -457283798 + }, + { + "assetId": "DOGE-5", + "value": 2486842237 + }, + { + "assetId": "DOT-6", + "value": 2583927287 + }, + { + "assetId": "ETC-7", + "value": 1471855602 + }, + { + "assetId": "ETH-9", + "value": -4207427334 + }, + { + "assetId": "LINK-7", + "value": -277915376 + }, + { + "assetId": "MATIC-6", + "value": -6049659 + }, + { + "assetId": "XRP-6", + "value": 217597790 + } + ], + "timestamp": 1671602400000, + "oraclePrices": [ + { + "assetId": "ADA-5", + "price": 10823317586 + }, + { + "assetId": "APT-6", + "price": 16313037409 + }, + { + "assetId": "ATOM-7", + "price": 3840237634 + }, + { + "assetId": "AVAX-7", + "price": 5068061409 + }, + { + "assetId": "BNB-8", + "price": 10688026116 + }, + { + "assetId": "BTC-10", + "price": 7237588977 + }, + { + "assetId": "DOGE-5", + "price": 3124373959 + }, + { + "assetId": "DOT-6", + "price": 19381576794 + }, + { + "assetId": "ETC-7", + "price": 6760278524 + }, + { + "assetId": "ETH-9", + "price": 52077122709 + }, + { + "assetId": "LINK-7", + "price": 2555714384 + }, + { + "assetId": "MATIC-6", + "price": 3410848278 + }, + { + "assetId": "XRP-6", + "price": 1470596802 + } + ], + "systemTime": 1671604661000 + }, + "newState": { + "positionRoot": "05be559f50e6d4fcfa267c3e88ebe7cf10f2fda3ec1d4ca11a896b879269a2b1", + "positionHeight": 64, + "orderRoot": "0366adcd6fb53c63d8b013debea460d6d7392cb7462e075cde587f23ded47ecc", + "orderHeight": 64, + "indices": [ + { + "assetId": "ADA-5", + "value": 51308666 + }, + { + "assetId": "APT-6", + "value": 718270280 + }, + { + "assetId": "ATOM-7", + "value": 1139741880 + }, + { + "assetId": "AVAX-7", + "value": 218281268 + }, + { + "assetId": "BNB-8", + "value": 430379885 + }, + { + "assetId": "BTC-10", + "value": -457193420 + }, + { + "assetId": "DOGE-5", + "value": 2487907777 + }, + { + "assetId": "DOT-6", + "value": 2584169469 + }, + { + "assetId": "ETC-7", + "value": 1471939783 + }, + { + "assetId": "ETH-9", + "value": -4206777236 + }, + { + "assetId": "LINK-7", + "value": -277883481 + }, + { + "assetId": "MATIC-6", + "value": -6007107 + }, + { + "assetId": "XRP-6", + "value": 217616218 + } + ], + "timestamp": 1671606000000, + "oraclePrices": [ + { + "assetId": "ADA-5", + "price": 10836202488 + }, + { + "assetId": "APT-6", + "price": 16250438261 + }, + { + "assetId": "ATOM-7", + "price": 3834332054 + }, + { + "assetId": "AVAX-7", + "price": 5064840184 + }, + { + "assetId": "BNB-8", + "price": 10670846247 + }, + { + "assetId": "BTC-10", + "price": 7228528743 + }, + { + "assetId": "DOGE-5", + "price": 3122441224 + }, + { + "assetId": "DOT-6", + "price": 19403803250 + }, + { + "assetId": "ETC-7", + "price": 6768868458 + }, + { + "assetId": "ETH-9", + "price": 52040615487 + }, + { + "assetId": "LINK-7", + "price": 2555505541 + }, + { + "assetId": "MATIC-6", + "price": 3412244142 + }, + { + "assetId": "XRP-6", + "price": 1462436364 + } + ], + "systemTime": 1671608332000 + }, + "minimumExpirationTimestamp": 464671, + "modifications": [ + { + "starkKey": "0x05352fb2daff0bfa2a0602d5e08d0f0bc87270b4afa8d97ea2cf46853d6d94ec", + "positionId": 393290825267675800, + "difference": 10000000000 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x007a3406cdb257b67950dfcdb317625086e28f904349a70b2ad8246810af9154", + "positionId": 393294832111452740, + "difference": 1000000000 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + }, + { + "starkKey": "0x05d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a095100", + "positionId": 10240000, + "difference": 0 + } + ], + "forcedActions": [], + "conditions": [ + "00df9c498ba32715a4e3f9162377876e8b7e476dd84fb69c3f8fa044078b7689" + ] +} diff --git a/packages/encoding/src/test/data/encoded-with-dataavail-field.json b/packages/encoding/src/test/data/encoded-with-dataavail-field.json new file mode 100644 index 000000000..5ce4e4d35 --- /dev/null +++ b/packages/encoding/src/test/data/encoded-with-dataavail-field.json @@ -0,0 +1 @@ +"06845b5b85918abc6335f0d4ead5f9c27eb7194ae8637b07ecc414d7fb4f41ea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000031494e43482d350000000000000000022f1e30537bc1799a0bdf000b3de4a386ba82f7543703e549ea8b1847650ecf00000000000000000000000000000000004144412d35000000000000000000000102c8fa9019cea5c5c94055f6919d18f97cd293a0750f6cf7724c68198b3eab0000000000000000000000000000000000414c474f2d35000000000000000000010ca1c758280c1f1a5a610d17ba73671e09aa804027f45da957604e84376cd300000000000000000000000000000000004150452d360000000000000000000006eb16bed522ae6e9e9d3c1cb5b7a8811c6ea14e9eeab40899ba572ae5e63f0200000000000000000000000000000000004150542d3600000000000000000000016568b339b324863dfe2ba8070ee7bbf0435763dec6c7685edfd4b5696e8dcc000000000000000000000000000000000041544f4d2d37000000000000000000079af1de66e0f52d9bf523427eb3291d18b37c59eba2ed245e52b3bf1d72a8250000000000000000000000000000000000415641582d3700000000000000000005d9d9c10d034f24f404f240dfdce9576d94460cd30cfe5fb5dec3c58bdb287200000000000000000000000000000000004158532d370000000000000000000004d33ff813d2dff82b8c90a4444cf461a22d6576db1472f43fe7a98ea7c98b1500000000000000000000000000000000004243482d3800000000000000000000051d9a0c4fa479418a530c7f7ac9b6761948d050e27faa71fe098a3a1558d1bf0000000000000000000000000000000000424e422d380000000000000000000004a71858480c036f5fd2ccc575d9ff6ec0f42668e1439dba2b72b56e2c81000c00000000000000000000000000000000004254432d313000000000000000000003887cc593699c636091ef65133cfe5153de50ca103c6cbc75269054c1ff1116000000000000000000000000000000000043485a2d3500000000000000000000043b15cc35bcfb57558c9f31aae847acf32c6d8a61040619693d3b7363375c1900000000000000000000000000000000004352562d350000000000000000000001a41a81ede64a810349af6938ded87aa98f8c75761267ec7b695a5d0d1b3a3b0000000000000000000000000000000000444f47452d35000000000000000000067596f3e90a607e0c6a9ecbf1e1c84e7aecb64ee777821daafb596baa23c54d0000000000000000000000000000000000444f542d360000000000000000000004459cc5c7e30f88c147313f33710d108163b4c1e4dcca5447e18da9313ccf890000000000000000000000000000000000454e4a2d3500000000000000000000035327f807b7d10828ec12969036cf74db46b46bc64b79c3e2dede6cc1aac52500000000000000000000000000000000004554432d370000000000000000000006066f6f44e278ff8a0886d0a729a9e23a90d0db5e689adeb8e50d02e393165d00000000000000000000000000000000004554482d3900000000000000000000011ad16a1827de9bd742112d7512bc0ca98bf5f9127e2b32e4bc63cd24708cf3000000000000000000000000000000000046494c2d360000000000000000000002e0cddbfc11ec6584a858a0951434cad8dc146f4ed9786692719711b8079b4d0000000000000000000000000000000000474d542d35000000000000000000000193bfb01ff0d83a966c077bf4b5c824906cc76269729b44310632bc65545fa200000000000000000000000000000000004c494e4b2d3700000000000000000002ec256004f6bddef46df3b1f8002f5ca22b8777b21a305b6a5a44ca3645fdda00000000000000000000000000000000004c54432d3700000000000000000000023b19ac1053463f519da8052ec3320d42728459108fde51c06673a64e3c90d500000000000000000000000000000000004d415449432d36000000000000000002509fce9099db46e6d9d79868fc20d016ec1d3d71d3978d5e8954e7b603b91d00000000000000000000000000000000004e4541522d36000000000000000000028f6cf36b99beec3fab92d2c5f134741aae4fa9fe34065a5cb0415ac7fd163800000000000000000000000000000000004f502d3600000000000000000000000583c8a526f5cdd3404f44351564e948e62bccd3a083150f56dafba2bee025c40000000000000000000000000000000000534f4c2d3700000000000000000000069c0fa754df552cbdf4495c9e2784fcd9004a1d9f5e209920e5b2aaa924a4ce000000000000000000000000000000000053555348492d360000000000000000022b892cb916d0ee9a43a07b84a37f56afa119901ffe2df9db4f40ab224dea300000000000000000000000000000000000554e492d3600000000000000000000017723326254a52f2fcdcb77e5f3f5407ec4f879bad939baae7ec38957da99e900000000000000000000000000000000005852502d360000000000000000000005d321c440bca697358b86af0b8108d57daabbad5516c6346b980b20a7a00001000000000000000000000000000000000000000000000000000000000000003c0492b38972b931853172ee4cb9b4475dc9d077e5220714544db754804dd6a452000000000000000000000000000000000000000000000000000000000000004001c3b9f8e4623bd784e477601176ec5e6dac5759f450addf29db022dfcfdf60a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000004144412d350000000000000000000000000000000000000000000000000000000000000000000080000000030cd94100000000000000000000000000000000004150542d3600000000000000000000000000000000000000000000000000000000000000000000800000002ac885b8000000000000000000000000000000000041544f4d2d370000000000000000000000000000000000000000000000000000000000000000008000000043ee59d80000000000000000000000000000000000415641582d37000000000000000000000000000000000000000000000000000000000000000000800000000cba37c40000000000000000000000000000000000424e422d38000000000000000000000000000000000000000000000000000000000000000000008000000019a5098000000000000000000000000000000000004254432d31300000000000000000000000000000000000000000000000000000000000000000007fffffffe4be672a0000000000000000000000000000000000444f47452d3500000000000000000000000000000000000000000000000000000000000000000080000000943a337d0000000000000000000000000000000000444f542d3600000000000000000000000000000000000000000000000000000000000000000000800000009a0399f700000000000000000000000000000000004554432d37000000000000000000000000000000000000000000000000000000000000000000008000000057babbf200000000000000000000000000000000004554482d39000000000000000000000000000000000000000000000000000000000000000000007fffffff0537c0fa00000000000000000000000000000000004c494e4b2d370000000000000000000000000000000000000000000000000000000000000000007fffffffef6f591000000000000000000000000000000000004d415449432d3600000000000000000000000000000000000000000000000000000000000000007fffffffffa3b08500000000000000000000000000000000005852502d3600000000000000000000000000000000000000000000000000000000000000000000800000000cf8475e0000000000000000000000000000000000000000000000000000000063a2a0e0000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000004144412d350000000000000000000000000000000000000000000000000000000000000000000000000002851eb85200000000000000000000000000000000004150542d360000000000000000000000000000000000000000000000000000000000000000000000000003cc553261000000000000000000000000000000000041544f4d2d3700000000000000000000000000000000000000000000000000000000000000000000000000e4e560420000000000000000000000000000000000415641582d37000000000000000000000000000000000000000000000000000000000000000000000000012e147ae10000000000000000000000000000000000424e422d3800000000000000000000000000000000000000000000000000000000000000000000000000027d0e560400000000000000000000000000000000004254432d313000000000000000000000000000000000000000000000000000000000000000000000000001af64d7f10000000000000000000000000000000000444f47452d3500000000000000000000000000000000000000000000000000000000000000000000000000ba3a29c70000000000000000000000000000000000444f542d360000000000000000000000000000000000000000000000000000000000000000000000000004833b645a00000000000000000000000000000000004554432d37000000000000000000000000000000000000000000000000000000000000000000000000000192f1a9fc00000000000000000000000000000000004554482d39000000000000000000000000000000000000000000000000000000000000000000000000000c2009d49500000000000000000000000000000000004c494e4b2d370000000000000000000000000000000000000000000000000000000000000000000000000098551b5000000000000000000000000000000000004d415449432d36000000000000000000000000000000000000000000000000000000000000000000000000cb4d6a1600000000000000000000000000000000005852502d36000000000000000000000000000000000000000000000000000000000000000000000000000057a786c20000000000000000000000000000000000000000000000000000000063a2a9b5000000000000000000000000000000000000000000000000000000000000003c05be559f50e6d4fcfa267c3e88ebe7cf10f2fda3ec1d4ca11a896b879269a2b100000000000000000000000000000000000000000000000000000000000000400366adcd6fb53c63d8b013debea460d6d7392cb7462e075cde587f23ded47ecc0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000004144412d350000000000000000000000000000000000000000000000000000000000000000000080000000030ee87a00000000000000000000000000000000004150542d3600000000000000000000000000000000000000000000000000000000000000000000800000002acfef48000000000000000000000000000000000041544f4d2d370000000000000000000000000000000000000000000000000000000000000000008000000043ef14b80000000000000000000000000000000000415641582d37000000000000000000000000000000000000000000000000000000000000000000800000000d02b5340000000000000000000000000000000000424e422d38000000000000000000000000000000000000000000000000000000000000000000008000000019a7136d00000000000000000000000000000000004254432d31300000000000000000000000000000000000000000000000000000000000000000007fffffffe4bfc8340000000000000000000000000000000000444f47452d3500000000000000000000000000000000000000000000000000000000000000000080000000944a75c10000000000000000000000000000000000444f542d3600000000000000000000000000000000000000000000000000000000000000000000800000009a074bfd00000000000000000000000000000000004554432d37000000000000000000000000000000000000000000000000000000000000000000008000000057bc04c700000000000000000000000000000000004554482d39000000000000000000000000000000000000000000000000000000000000000000007fffffff0541ac6c00000000000000000000000000000000004c494e4b2d370000000000000000000000000000000000000000000000000000000000000000007fffffffef6fd5a700000000000000000000000000000000004d415449432d3600000000000000000000000000000000000000000000000000000000000000007fffffffffa456bd00000000000000000000000000000000005852502d3600000000000000000000000000000000000000000000000000000000000000000000800000000cf88f5a0000000000000000000000000000000000000000000000000000000063a2aef0000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000004144412d35000000000000000000000000000000000000000000000000000000000000000000000000000285e353f800000000000000000000000000000000004150542d360000000000000000000000000000000000000000000000000000000000000000000000000003c89a0275000000000000000000000000000000000041544f4d2d3700000000000000000000000000000000000000000000000000000000000000000000000000e48b43960000000000000000000000000000000000415641582d37000000000000000000000000000000000000000000000000000000000000000000000000012de353f80000000000000000000000000000000000424e422d3800000000000000000000000000000000000000000000000000000000000000000000000000027c08312700000000000000000000000000000000004254432d313000000000000000000000000000000000000000000000000000000000000000000000000001aeda98670000000000000000000000000000000000444f47452d3500000000000000000000000000000000000000000000000000000000000000000000000000ba1cac080000000000000000000000000000000000444f542d360000000000000000000000000000000000000000000000000000000000000000000000000004848e8a7200000000000000000000000000000000004554432d3700000000000000000000000000000000000000000000000000000000000000000000000000019374bc6a00000000000000000000000000000000004554482d39000000000000000000000000000000000000000000000000000000000000000000000000000c1ddcc63f00000000000000000000000000000000004c494e4b2d37000000000000000000000000000000000000000000000000000000000000000000000000009851eb8500000000000000000000000000000000004d415449432d36000000000000000000000000000000000000000000000000000000000000000000000000cb62b6ae00000000000000000000000000000000005852502d360000000000000000000000000000000000000000000000000000000000000000000000000000572b020c0000000000000000000000000000000000000000000000000000000063a2b80c000000000000000000000000000000000000000000000000000000000007171f000000000000000000000000000000000000000000000000000000000000001005352fb2daff0bfa2a0602d5e08d0f0bc87270b4afa8d97ea2cf46853d6d94ec00000000000000000000000000000000000000000000000005753febfd80026c00000000000000000000000000000000000000000000000100000002540be40005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c40000000000000000000000000000000000000000000000000010000000000000000007a3406cdb257b67950dfcdb317625086e28f904349a70b2ad8246810af915400000000000000000000000000000000000000000000000005754390e8000254000000000000000000000000000000000000000000000001000000003b9aca0005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000005d08ae9202f9e19ffa0211676536ba3e4c5f1e433a4c01d60fceae00a09510000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100df9c498ba32715a4e3f9162377876e8b7e476dd84fb69c3f8fa044078b7689" From 05da64b0e69083ff356cdab59e2b1ded32df2563 Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Tue, 20 Jun 2023 13:35:10 +0000 Subject: [PATCH 3/4] Move logic to a separate function --- .../PerpetualCairoOutputCollector.ts | 12 +++++------ ...houldSkipDataAvailabilityModeField.test.ts | 21 +++++++++++++++++++ .../shouldSkipDataAvailabilityModeField.ts | 15 +++++++++++++ 3 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.test.ts create mode 100644 packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.ts diff --git a/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts b/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts index 45b6c5a26..2d4b16fa9 100644 --- a/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts +++ b/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts @@ -8,6 +8,7 @@ import { BigNumber, utils } from 'ethers' import { StarkexConfig } from '../../config/starkex/StarkexConfig' import { EthereumClient } from '../../peripherals/ethereum/EthereumClient' import { toHexData } from '../../utils/toHexData' +import { shouldSkipDataAvailabilityModeField } from './shouldSkipDataAvailabilityModeField' const ABI = new utils.Interface([ 'function updateState(uint256[] calldata programOutput, uint256[] calldata applicationData)', @@ -31,13 +32,10 @@ export class PerpetualCairoOutputCollector { const programOutputValues = decoded.programOutput as BigNumber[] const hexData = toHexData(programOutputValues) - // This is a fix for Apex Goerli testnet, which switches - // to a different program output (one more field) at block 8056029. - // See: https://github.com/starkware-libs/stark-perpetual/blob/eaa284683deec190407fece98b96546d10f6ad67/src/services/perpetual/cairo/output/program_output.cairo#L36 - const skipDataAvailabilityModeField = - this.starkexConfig.instanceName === 'ApeX' && - this.starkexConfig.blockchain.chainId === 5 && // it's goerli - blockNumber >= 8056029 + const skipDataAvailabilityModeField = shouldSkipDataAvailabilityModeField( + blockNumber, + this.starkexConfig + ) return decodePerpetualCairoOutput(hexData, skipDataAvailabilityModeField) } diff --git a/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.test.ts b/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.test.ts new file mode 100644 index 000000000..03d0df33f --- /dev/null +++ b/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.test.ts @@ -0,0 +1,21 @@ +import { expect } from 'earl' + +import { getApexGoerliConfig } from '../../config/starkex/apex-goerli' +import { getDydxMainnetConfig } from '../../config/starkex/dydx-mainnet' +import { shouldSkipDataAvailabilityModeField } from './shouldSkipDataAvailabilityModeField' + +describe('shouldSkipDataAvailabilityModeField', () => { + it('should return true when instanceName is "ApeX", chainId is 5 and blockNumber is >= 8056029', () => { + const config = getApexGoerliConfig() + expect(shouldSkipDataAvailabilityModeField(8056028, config)).toEqual(false) + expect(shouldSkipDataAvailabilityModeField(8056029, config)).toEqual(true) + expect(shouldSkipDataAvailabilityModeField(9000000, config)).toEqual(true) + }) + + it('should return false when instanceName is "Dydx", chainId is 1 and blockNumber is >= 8056029', () => { + const config = getDydxMainnetConfig() + expect(shouldSkipDataAvailabilityModeField(8056028, config)).toEqual(false) + expect(shouldSkipDataAvailabilityModeField(8056029, config)).toEqual(false) + expect(shouldSkipDataAvailabilityModeField(9000000, config)).toEqual(false) + }) +}) diff --git a/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.ts b/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.ts new file mode 100644 index 000000000..765f7c24a --- /dev/null +++ b/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.ts @@ -0,0 +1,15 @@ +import { StarkexConfig } from '../../config/starkex/StarkexConfig' + +export function shouldSkipDataAvailabilityModeField( + blockNumber: number, + starkexConfig: StarkexConfig +) { + // This is a fix for Apex Goerli testnet, which switches + // to a different program output (one more field) at block 8056029. + // See: https://github.com/starkware-libs/stark-perpetual/blob/eaa284683deec190407fece98b96546d10f6ad67/src/services/perpetual/cairo/output/program_output.cairo#L36 + return ( + starkexConfig.instanceName === 'ApeX' && + starkexConfig.blockchain.chainId === 5 && // it's goerli + blockNumber >= 8056029 + ) +} From 07ea945b0c6a3556aaae5753f7c1df165f97ddcd Mon Sep 17 00:00:00 2001 From: Adrian Adamiak Date: Tue, 20 Jun 2023 13:44:02 +0000 Subject: [PATCH 4/4] Only pass required config fields. --- .../PerpetualCairoOutputCollector.ts | 3 +- ...houldSkipDataAvailabilityModeField.test.ts | 28 ++++++++++++------- .../shouldSkipDataAvailabilityModeField.ts | 9 +++--- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts b/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts index 2d4b16fa9..14b2fdaba 100644 --- a/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts +++ b/packages/backend/src/core/collectors/PerpetualCairoOutputCollector.ts @@ -34,7 +34,8 @@ export class PerpetualCairoOutputCollector { const skipDataAvailabilityModeField = shouldSkipDataAvailabilityModeField( blockNumber, - this.starkexConfig + this.starkexConfig.instanceName, + this.starkexConfig.blockchain.chainId ) return decodePerpetualCairoOutput(hexData, skipDataAvailabilityModeField) diff --git a/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.test.ts b/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.test.ts index 03d0df33f..a78004f79 100644 --- a/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.test.ts +++ b/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.test.ts @@ -1,21 +1,29 @@ import { expect } from 'earl' -import { getApexGoerliConfig } from '../../config/starkex/apex-goerli' -import { getDydxMainnetConfig } from '../../config/starkex/dydx-mainnet' import { shouldSkipDataAvailabilityModeField } from './shouldSkipDataAvailabilityModeField' describe('shouldSkipDataAvailabilityModeField', () => { it('should return true when instanceName is "ApeX", chainId is 5 and blockNumber is >= 8056029', () => { - const config = getApexGoerliConfig() - expect(shouldSkipDataAvailabilityModeField(8056028, config)).toEqual(false) - expect(shouldSkipDataAvailabilityModeField(8056029, config)).toEqual(true) - expect(shouldSkipDataAvailabilityModeField(9000000, config)).toEqual(true) + expect(shouldSkipDataAvailabilityModeField(8056028, 'ApeX', 5)).toEqual( + false + ) + expect(shouldSkipDataAvailabilityModeField(8056029, 'ApeX', 5)).toEqual( + true + ) + expect(shouldSkipDataAvailabilityModeField(9000000, 'ApeX', 5)).toEqual( + true + ) }) it('should return false when instanceName is "Dydx", chainId is 1 and blockNumber is >= 8056029', () => { - const config = getDydxMainnetConfig() - expect(shouldSkipDataAvailabilityModeField(8056028, config)).toEqual(false) - expect(shouldSkipDataAvailabilityModeField(8056029, config)).toEqual(false) - expect(shouldSkipDataAvailabilityModeField(9000000, config)).toEqual(false) + expect(shouldSkipDataAvailabilityModeField(8056028, 'dYdX', 1)).toEqual( + false + ) + expect(shouldSkipDataAvailabilityModeField(8056029, 'dYdX', 1)).toEqual( + false + ) + expect(shouldSkipDataAvailabilityModeField(9000000, 'dYdX', 1)).toEqual( + false + ) }) }) diff --git a/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.ts b/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.ts index 765f7c24a..ea164f4c6 100644 --- a/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.ts +++ b/packages/backend/src/core/collectors/shouldSkipDataAvailabilityModeField.ts @@ -1,15 +1,16 @@ -import { StarkexConfig } from '../../config/starkex/StarkexConfig' +import { InstanceName } from '@explorer/shared' export function shouldSkipDataAvailabilityModeField( blockNumber: number, - starkexConfig: StarkexConfig + instanceName: InstanceName, + chainId: number ) { // This is a fix for Apex Goerli testnet, which switches // to a different program output (one more field) at block 8056029. // See: https://github.com/starkware-libs/stark-perpetual/blob/eaa284683deec190407fece98b96546d10f6ad67/src/services/perpetual/cairo/output/program_output.cairo#L36 return ( - starkexConfig.instanceName === 'ApeX' && - starkexConfig.blockchain.chainId === 5 && // it's goerli + instanceName === 'ApeX' && + chainId === 5 && // it's goerli blockNumber >= 8056029 ) }