diff --git a/hardhat.config.ts b/hardhat.config.ts index 9cb337ec..76fb4115 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -204,7 +204,7 @@ module.exports = { : [], }, custom: { - url: process.env['CUSTOM_RPC_URL'] || 'N/A' + url: process.env['CUSTOM_RPC_URL'] || 'N/A', }, geth: { url: 'http://localhost:8545', @@ -245,8 +245,8 @@ module.exports = { urls: { apiURL: process.env['CUSTOM_ETHERSCAN_API_URL'], browserURL: process.env['CUSTOM_ETHERSCAN_BROWSER_URL'], - } - } + }, + }, ], }, mocha: { diff --git a/package.json b/package.json index 781e82be..60c78c27 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arbitrum/nitro-contracts", - "version": "3.0.1-beta.0", + "version": "3.0.1", "description": "Layer 2 precompiles and rollup for Arbitrum Nitro", "author": "Offchain Labs, Inc.", "license": "BUSL-1.1", @@ -65,7 +65,7 @@ }, "private": false, "devDependencies": { - "@arbitrum/sdk": "^3.7.2", + "@arbitrum/sdk": "^3.7.3", "@ethersproject/providers": "^5.8.0", "@nomicfoundation/hardhat-chai-matchers": "^1.0.6", "@nomicfoundation/hardhat-verify": "^2.0.13", diff --git a/scripts/boldUpgradeFunctions.ts b/scripts/boldUpgradeFunctions.ts index 1d1b7620..ded5ddee 100644 --- a/scripts/boldUpgradeFunctions.ts +++ b/scripts/boldUpgradeFunctions.ts @@ -49,7 +49,9 @@ export const deployDependencies = async ( isUsingFeeToken ? 'ERC20Bridge' : 'Bridge', bridge.address, [], - isUsingFeeToken ? 'src/bridge/ERC20Bridge.sol:ERC20Bridge' : 'src/bridge/Bridge.sol:Bridge' + isUsingFeeToken + ? 'src/bridge/ERC20Bridge.sol:ERC20Bridge' + : 'src/bridge/Bridge.sol:Bridge' ) } @@ -59,7 +61,7 @@ export const deployDependencies = async ( signer ) - let reader4844Addr = ethers.constants.AddressZero; + let reader4844Addr = ethers.constants.AddressZero if (isUsing4844Reader) { const reader4844 = await contractFactory.deploy() await reader4844.deployed() @@ -100,7 +102,7 @@ export const deployDependencies = async ( await verifyContract('RollupEventInbox', rei.address, []) } - const outboxFac = isUsingFeeToken + const outboxFac = isUsingFeeToken ? new ERC20Outbox__factory(signer) : new Outbox__factory(signer) const outbox = await outboxFac.deploy() @@ -110,7 +112,11 @@ export const deployDependencies = async ( } if (verify) { await outbox.deployTransaction.wait(5) - await verifyContract(isUsingFeeToken ? 'ERC20Outbox' : 'Outbox', outbox.address, []) + await verifyContract( + isUsingFeeToken ? 'ERC20Outbox' : 'Outbox', + outbox.address, + [] + ) } const inboxFac = isUsingFeeToken @@ -252,7 +258,8 @@ export const deployBoldUpgrade = async ( wallet ) const isUsingFeeToken = await sequencerInbox.isUsingFeeToken() - const has4844Reader = await sequencerInbox.reader4844() != ethers.constants.AddressZero + const has4844Reader = + (await sequencerInbox.reader4844()) != ethers.constants.AddressZero const deployed = await deployDependencies( wallet, config.settings.maxDataSize, diff --git a/scripts/executeBoldUpgrade.ts b/scripts/executeBoldUpgrade.ts index 6860637a..ed7ae3fd 100644 --- a/scripts/executeBoldUpgrade.ts +++ b/scripts/executeBoldUpgrade.ts @@ -67,10 +67,7 @@ async function getPreUpgradeState(l1Rpc: JsonRpcProvider, config: Config) { l1Rpc ) - const bridge = IERC20Bridge__factory.connect( - config.contracts.bridge, - l1Rpc - ) + const bridge = IERC20Bridge__factory.connect(config.contracts.bridge, l1Rpc) const stakerCount = await oldRollupContract.stakerCount() @@ -85,13 +82,15 @@ async function getPreUpgradeState(l1Rpc: JsonRpcProvider, config: Config) { const wasmModuleRoot = await oldRollupContract.wasmModuleRoot() - const feeToken = await seqInbox.isUsingFeeToken() ? await bridge.nativeToken() : null + const feeToken = (await seqInbox.isUsingFeeToken()) + ? await bridge.nativeToken() + : null return { stakers, wasmModuleRoot, ...boxes, - feeToken + feeToken, } } @@ -138,7 +137,10 @@ async function perform( boldActionPerformData, ]) - const signerCanExecute = await upExec.hasRole('0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63', await timelockSigner.getAddress()) + const signerCanExecute = await upExec.hasRole( + '0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63', + await timelockSigner.getAddress() + ) console.log('upgrade executor:', config.contracts.upgradeExecutor) console.log('execute(...) call to upgrade executor:', performCallData) @@ -280,7 +282,8 @@ async function checkSequencerInbox( // make sure fee token-ness is correct if ( - await seqInboxContract.isUsingFeeToken() !== (preUpgradeState.feeToken !== null) + (await seqInboxContract.isUsingFeeToken()) !== + (preUpgradeState.feeToken !== null) ) { throw new Error('SequencerInbox isUsingFeeToken does not match') } @@ -327,7 +330,10 @@ async function checkInbox(params: VerificationParams) { config.contracts.inbox, l1Rpc ) - const submissionFee = await inboxContract.calculateRetryableSubmissionFee(100, 100) + const submissionFee = await inboxContract.calculateRetryableSubmissionFee( + 100, + 100 + ) if (preUpgradeState.feeToken && !submissionFee.eq(0)) { throw new Error('Inbox is not an ERC20Inbox') } @@ -387,8 +393,7 @@ async function checkOutbox( // will revert if not an ERC20Outbox const withdrawalAmt = await erc20Outbox.l2ToL1WithdrawalAmount() feeTokenValid = preUpgradeState.feeToken !== null - } - catch (e: any) { + } catch (e: any) { if (e.code !== 'CALL_EXCEPTION') throw e feeTokenValid = preUpgradeState.feeToken === null } @@ -429,8 +434,7 @@ async function checkBridge( if (feeToken !== preUpgradeState.feeToken) { feeTokenValid = false } - } - catch (e: any) { + } catch (e: any) { if (e.code !== 'CALL_EXCEPTION') throw e feeTokenValid = preUpgradeState.feeToken === null } diff --git a/scripts/local-deployment/deployCreatorAndCreateRollup.ts b/scripts/local-deployment/deployCreatorAndCreateRollup.ts index 9894dec1..860d8dcd 100644 --- a/scripts/local-deployment/deployCreatorAndCreateRollup.ts +++ b/scripts/local-deployment/deployCreatorAndCreateRollup.ts @@ -46,7 +46,9 @@ async function main() { let stakeToken = process.env.STAKE_TOKEN_ADDRESS as string if (!stakeToken) { console.log('Deploying WETH') - const wethFactory = (await ethers.getContractFactory('TestWETH9')).connect(deployerWallet) + const wethFactory = (await ethers.getContractFactory('TestWETH9')).connect( + deployerWallet + ) const weth = await wethFactory.deploy('Wrapped Ether', 'WETH') await weth.deployTransaction.wait() await weth.deployed() diff --git a/scripts/rollupCreation.ts b/scripts/rollupCreation.ts index f4b4db92..32619f75 100644 --- a/scripts/rollupCreation.ts +++ b/scripts/rollupCreation.ts @@ -8,7 +8,11 @@ import { ERC20, ERC20__factory, IERC20__factory } from '../build/types' import { sleep } from './testSetup' import { promises as fs } from 'fs' import { _isRunningOnArbitrum, verifyContract } from './deploymentUtils' -import { AssertionStateStruct, ConfigStruct, RollupCreator } from '../build/types/src/rollup/RollupCreator' +import { + AssertionStateStruct, + ConfigStruct, + RollupCreator, +} from '../build/types/src/rollup/RollupCreator' // 1 gwei const MAX_FER_PER_GAS = BigNumber.from('1000000000') @@ -306,7 +310,7 @@ async function _getDevRollupConfig( } const config: ConfigStruct = { - confirmPeriodBlocks: ethers.BigNumber.from('20'), + confirmPeriodBlocks: ethers.BigNumber.from('1'), // was 20 stakeToken: stakeToken, baseStake: 8, wasmModuleRoot: wasmModuleRoot, @@ -314,15 +318,11 @@ async function _getDevRollupConfig( loserStakeEscrow: ownerAddress, chainId: JSON.parse(chainConfig)['chainId'], chainConfig: chainConfig, - minimumAssertionPeriod: 5, + minimumAssertionPeriod: 1, // was 5 validatorAfkBlocks: 201600, genesisAssertionState: genesisAssertionState, genesisInboxCount: 0, - miniStakeValues: [ - 4, - 2, - 1, - ], + miniStakeValues: [4, 2, 1], layerZeroBlockEdgeHeight: 2 ** 26, layerZeroBigStepEdgeHeight: 2 ** 19, layerZeroSmallStepEdgeHeight: 2 ** 23, @@ -335,7 +335,7 @@ async function _getDevRollupConfig( delaySeconds: ethers.BigNumber.from('86400'), futureSeconds: ethers.BigNumber.from('3600'), }, - anyTrustFastConfirmer: ethers.constants.AddressZero + anyTrustFastConfirmer: ethers.constants.AddressZero, } return { diff --git a/src/stylus/StylusDeployer.sol b/src/stylus/StylusDeployer.sol deleted file mode 100644 index e78b5069..00000000 --- a/src/stylus/StylusDeployer.sol +++ /dev/null @@ -1,164 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.17; - -import {ArbWasm} from "../precompiles/ArbWasm.sol"; - -/// @title A Stylus contract deployer, activator and initializer -/// @author The name of the author -/// @notice Stylus contracts do not support constructors. Instead, Stylus devs can use this contract to deploy and -/// initialize their contracts atomically -contract StylusDeployer { - ArbWasm constant ARB_WASM = ArbWasm(0x0000000000000000000000000000000000000071); - - event ContractDeployed(address deployedContract); - - error ContractDeploymentError(bytes bytecode); - error ContractInitializationError(address newContract); - error RefundExcessValueError(uint256 excessValue); - error EmptyBytecode(); - error InitValueButNotInitData(); - - /// @notice Deploy, activate and initialize a stylus contract - /// In order to call a stylus contract, and therefore initialize it, it must first be activated. - /// This contract provides an atomic way of deploying, activating and initializing a stylus contract. - /// - /// Initialisation will be called if initData is supplied, other initialization is skipped - /// Activation is not always necessary. If a contract has the same code has as another recently activated - /// contract then activation will be skipped. - /// If additional value remains in the contract after activation it will be transferred to the msg.sender - /// to that end the caller must ensure that they can receive eth. - /// - /// The caller should do the following before calling this contract: - /// 1. Check whether the contract will require activation, and if so what the cost will be. - /// This can be done by spoofing an address with the contract code, then calling ArbWasm.programVersion to compare the - /// the returned result against ArbWasm.stylusVersion. If activation is required ArbWasm.activateProgram can then be called - /// to find the returned dataFee. - /// 2. Next this deploy function can be called. The value of the call must be set to the previously ascertained dataFee + initValue - /// If activation is not require, the value of the call should be set to initValue - /// - /// Note: Stylus contract caching is not done by the deployer, and will have to be done separately after deployment. - /// See https://docs.arbitrum.io/stylus/how-tos/caching-contracts for more details on caching - /// @param bytecode The bytecode of the stylus contract to be deployed - /// @param initData Initialisation call data. After deployment the contract will be called with this data - /// If no initialisation data is provided then the newly deployed contract will not be called. - /// This means that the receive or dataless fallback function cannot be called from this contract. - /// @param initValue Initialisation value. After deployment, the contract will be called with the init data and this value. - /// At least as much eth as init value must be provided with this call. Init value is specified here separately - /// rather than using the msg.value since the msg.value may need to be greater than the init value to accomodate activation data fee. - /// See the @notice block above for more details. - /// @param salt If a non zero salt is provided the contract will be created using CREATE2 instead of CREATE - /// The supplied salt will be hashed with the initData so that wherever the address is observed - /// it was initialised with the same variables. - /// @return The address of the deployed conract - function deploy( - bytes calldata bytecode, - bytes calldata initData, - uint256 initValue, - bytes32 salt - ) public payable returns (address) { - if (salt != 0) { - // if a salt was supplied, hash the salt with the init data. This guarantees that - // anywhere the address of this contract is seen the same init data was used - salt = initSalt(salt, initData); - } - - address newContractAddress = deployContract(bytecode, salt); - bool shouldActivate = requiresActivation(newContractAddress); - uint256 dataFee = 0; - if (shouldActivate) { - // ensure there will be enough left over for init - // activateProgram will return unused value back to this contract without an EVM call - uint256 activationValue = msg.value - initValue; - (, dataFee) = ARB_WASM.activateProgram{value: activationValue}(newContractAddress); - } - - // initialize - this will fail if the program wasn't activated by this point - // we check if initData exists to avoid calling contracts unnecessarily - if (initData.length != 0) { - (bool success,) = address(newContractAddress).call{value: initValue}(initData); - if (!success) { - revert ContractInitializationError(newContractAddress); - } - } else if (initValue != 0) { - // if initValue exists init data should too - revert InitValueButNotInitData(); - } - - // refund any remaining value - uint256 bal = msg.value - dataFee - initValue; - if (bal != 0) { - // the caller must be payable - (bool sent,) = payable(msg.sender).call{value: bal}(""); - if (!sent) { - revert RefundExcessValueError(bal); - } - } - - // activation already emits the following event: - // event ProgramActivated(bytes32 indexed codehash, bytes32 moduleHash, address program, uint256 dataFee, uint16 version); - emit ContractDeployed(newContractAddress); - - return newContractAddress; - } - - /// @notice When using CREATE2 the deployer includes the init data and value in the salt so that callers - /// can be sure that wherever they encourter this address it was initialized with the same data and value - /// @param salt A user supplied salt - /// @param initData The init data that will be used to init the deployed contract - function initSalt(bytes32 salt, bytes calldata initData) public pure returns (bytes32) { - return keccak256(abi.encodePacked(salt, initData)); - } - - /// @notice Checks whether a contract requires activation - function requiresActivation( - address addr - ) public view returns (bool) { - // currently codeHashVersion returns an error when codeHashVersion != stylus version - // so we do a try/catch to to check it - uint16 codeHashVersion; - try ARB_WASM.codehashVersion(addr.codehash) returns (uint16 version) { - codeHashVersion = version; - } catch { - // stylus version is always >= 1 - codeHashVersion = 0; - } - - // due to the bug in ARB_WASM.codeHashVersion we know that codeHashVersion will either be 0 or the current - // version. We still check that is not equal to the stylusVersion - return codeHashVersion != ARB_WASM.stylusVersion(); - } - - /// @notice Deploy the a contract with the supplied bytecode. - /// Will create2 if the supplied salt is non zero - function deployContract(bytes memory bytecode, bytes32 salt) internal returns (address) { - if (bytecode.length == 0) { - revert EmptyBytecode(); - } - - address newContractAddress; - if (salt != 0) { - assembly { - newContractAddress := create2(0, add(bytecode, 0x20), mload(bytecode), salt) - } - } else { - assembly { - newContractAddress := create(0, add(bytecode, 0x20), mload(bytecode)) - } - } - - // bubble up the revert if there was one - assembly { - if and(iszero(newContractAddress), not(iszero(returndatasize()))) { - let p := mload(0x40) - returndatacopy(p, 0, returndatasize()) - revert(p, returndatasize()) - } - } - - if (newContractAddress == address(0)) { - revert ContractDeploymentError(bytecode); - } - - return newContractAddress; - } -} diff --git a/src/test-helpers/NoReceiveForwarder.sol b/src/test-helpers/NoReceiveForwarder.sol deleted file mode 100644 index ca007b5d..00000000 --- a/src/test-helpers/NoReceiveForwarder.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/// @notice A call forward that doesnt implement the receive or fallback functions, so cant receive value -contract NoReceiveForwarder { - function forward(address to, bytes calldata data) public payable { - (bool success,) = address(to).call{value: msg.value}(data); - require(success, "call forward failed"); - } -} - -/// @notice A call forward that does implement the receive or fallback functions, so cant receive value -contract ReceivingForwarder { - function forward(address to, bytes calldata data) public payable { - (bool success,) = address(to).call{value: msg.value}(data); - require(success, "call forward failed"); - } - - receive() external payable {} -} - -/// @notice Errors upon construction -contract ConstructorError { - constructor() { - require(false, "test error in constructor"); - } -} - -/// @notice Errors upon construction -contract ConstructorFine { - constructor() { - require(true, "test error in constructor"); - } - - function number() public pure returns (uint256) { - return 0; - } -} diff --git a/test/e2e/orbitChain.ts b/test/e2e/orbitChain.ts index 98b4adb8..19ce3987 100644 --- a/test/e2e/orbitChain.ts +++ b/test/e2e/orbitChain.ts @@ -20,6 +20,7 @@ import { IInbox__factory, Inbox__factory, RollupCore__factory, + RollupCreator, RollupCreator__factory, } from '../../build/types' import { AssertionStateStruct } from '../../build/types/src/challengeV2/IAssertionChain' @@ -30,6 +31,7 @@ import { l1Networks, l2Networks, } from '@arbitrum/sdk/dist/lib/dataEntities/networks' +import { ConfigStruct } from '../../build/types/src/rollup/RollupCreator' const LOCALHOST_L2_RPC = 'http://127.0.0.1:8547' const LOCALHOST_L3_RPC = 'http://127.0.0.1:3347' @@ -56,6 +58,7 @@ describe('Orbit Chain', () => { ) l2Network = { ...coreL2Network, + isBold: true, tokenBridge: { l1CustomGateway: '', l1ERC20Gateway: '', @@ -822,15 +825,15 @@ describe('Orbit Chain', () => { } /// deploy params - const config = { + const ownerAddr = '0x72f7EEedF02C522242a4D3Bdc8aE6A8583aD7c5e' + const config: ConfigStruct = { confirmPeriodBlocks: ethers.BigNumber.from('150'), - extraChallengeTimeBlocks: ethers.BigNumber.from('200'), - stakeToken: ethers.constants.AddressZero, + stakeToken: '0x000000000000000000000000000000000000dead', baseStake: ethers.utils.parseEther('1'), wasmModuleRoot: '0xda4e3ad5e7feacb817c21c8d0220da7650fe9051ece68a3f0b1c5d38bbb27b21', - owner: '0x72f7EEedF02C522242a4D3Bdc8aE6A8583aD7c5e', - loserStakeEscrow: ethers.constants.AddressZero, + owner: ownerAddr, + loserStakeEscrow: ownerAddr, chainId: ethers.BigNumber.from('433333'), chainConfig: '{"chainId":433333,"homesteadBlock":0,"daoForkBlock":null,"daoForkSupport":true,"eip150Block":0,"eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000","eip155Block":0,"eip158Block":0,"byzantiumBlock":0,"constantinopleBlock":0,"petersburgBlock":0,"istanbulBlock":0,"muirGlacierBlock":0,"berlinBlock":0,"londonBlock":0,"clique":{"period":0,"epoch":0},"arbitrum":{"EnableArbOS":true,"AllowDebugPrecompiles":false,"DataAvailabilityCommittee":false,"InitialArbOSVersion":10,"InitialChainOwner":"0x72f7EEedF02C522242a4D3Bdc8aE6A8583aD7c5e","GenesisBlockNum":0}}', @@ -867,7 +870,7 @@ describe('Orbit Chain', () => { const deployFactoriesToL2 = true const maxFeePerGasForRetryables = BigNumber.from('100000000') // 0.1 gwei - const deployParams = { + const deployParams: RollupCreator.RollupDeploymentParamsStruct = { config, batchPosters, batchPosterManager, @@ -884,6 +887,7 @@ describe('Orbit Chain', () => { value: nativeToken ? BigNumber.from(0) : fee, }) ).wait() + const l1TxReceipt = new L1TransactionReceipt(receipt) // 1 init message + 8 msgs for deploying factories @@ -1195,7 +1199,7 @@ async function _getRollupCreatorFromLogs( const filter: Filter = { topics: [ ethers.utils.id( - 'RollupCreated(address,address,address,address,address,address,address,address,address,address,address,address)' + 'RollupCreated(address,address,address,address,address,address,address,address,address,address,address)' ), ], } diff --git a/test/e2e/stylusDeployer.ts b/test/e2e/stylusDeployer.ts deleted file mode 100644 index c4d7169b..00000000 --- a/test/e2e/stylusDeployer.ts +++ /dev/null @@ -1,487 +0,0 @@ -import { JsonRpcProvider } from '@ethersproject/providers' -import { expect } from 'chai' -import { - ArbWasm__factory, - ConstructorError__factory, - NoReceiveForwarder__factory, - ReceivingForwarder__factory, - StylusDeployer, - StylusDeployer__factory, -} from '../../build/types' -import { BigNumber, Wallet, constants, ethers } from 'ethers' -import fs from 'fs' -import { keccak256, parseEther } from 'ethers/lib/utils' -import { ProgramActivatedEventObject } from '../../build/types/src/precompiles/ArbWasm' -import { ContractDeployedEventObject } from '../../build/types/src/stylus/StylusDeployer' - -const LOCALHOST_L2_RPC = 'http://127.0.0.1:8547' -export const l1mnemonic = - 'indoor dish desk flag debris potato excuse depart ticket judge file exit' -const iArbWasm = ArbWasm__factory.createInterface() -const arbWasmAddr = '0x0000000000000000000000000000000000000071' -const counterInterface = new ethers.utils.Interface([ - 'function number() view returns (uint256)', - 'function setNumber(uint256 newNumber)', - 'function addNumber(uint256 newNumber)', - 'function mulNumber(uint256 newNumber)', - 'function increment()', -]) - -const getConnectedL2Wallet = async () => { - const l2Provider = new JsonRpcProvider(LOCALHOST_L2_RPC) - const admin = ethers.Wallet.fromMnemonic( - l1mnemonic, - "m/44'/60'/0'/0/0" - ).connect(l2Provider) - - const randWallet = Wallet.createRandom().connect(l2Provider) - await admin.sendTransaction({ - to: randWallet.address, - value: constants.WeiPerEther.mul(10), - }) - return randWallet -} - -const getProgramActivatedEvent = (rec: ethers.ContractReceipt) => { - return rec.events - ?.filter(e => e.address === arbWasmAddr) - .map(e => - iArbWasm.decodeEventLog( - iArbWasm.events[ - 'ProgramActivated(bytes32,bytes32,address,uint256,uint16)' - ], - e.data, - e.topics - ) - )[0] as unknown as ProgramActivatedEventObject -} - -const getContractDeployedEvent = ( - rec: ethers.ContractReceipt, - deployer: StylusDeployer -) => { - return rec.events - ?.filter(e => e.address === deployer.address) - .map(e => - iArbWasm.decodeEventLog( - deployer.interface.events['ContractDeployed(address)'], - e.data, - e.topics - ) - )[0] as unknown as ContractDeployedEventObject -} - -const getBytecode = (increment: number) => { - const fileLocation = - increment === 0 - ? './test/e2e/counter.txt' - : `./test/e2e/stylusTestFiles/counter${increment}.txt` - return fs.readFileSync(fileLocation).toString() -} - -const estimateActivationCost = async (bytecode: string, wallet: Wallet) => { - // deploy a contract but dont activate it, use that to estimate activation - const res = await wallet.sendTransaction({ - data: bytecode, - }) - const rec = await res.wait() - const arbWasm = await ArbWasm__factory.connect(arbWasmAddr, wallet.provider) - try { - const fee = await arbWasm.callStatic.activateProgram(rec.contractAddress, { - from: wallet.address, - value: await wallet.getBalance(), - }) - return fee.dataFee - } catch (err) { - // if we errored we may be on the correct code hash - try { - const version = await arbWasm.callStatic.programVersion( - rec.contractAddress - ) - if (version == (await arbWasm.callStatic.stylusVersion())) { - return BigNumber.from(0) - } else { - throw err - } - } catch { - // rethrow the original error - throw err - } - } -} - -const deploy = async (args: { - wallet: Wallet - deployer: StylusDeployer - bytecode: string - initData: string - initVal: BigNumber - expectActivation: boolean - expectedInitCounter: BigNumber - salt: string - expectRevert?: boolean - notEnoughForActivation?: boolean - forwarder?: ethers.Contract - overrideValue?: BigNumber -}) => { - let activationFee = BigNumber.from(0) - if (args.expectActivation) { - activationFee = await estimateActivationCost(args.bytecode, args.wallet) - expect( - args.expectActivation ? !activationFee.eq(0) : activationFee.eq(0), - 'activation zero' - ).to.be.true - } - - let bufferedActivationFee = activationFee.mul(11).div(10) - if (args.notEnoughForActivation === true) { - bufferedActivationFee = bufferedActivationFee.div(2) - } - - let rec - let errorOccurred = false - const txVal = args.overrideValue || bufferedActivationFee.add(args.initVal) - try { - if (args.forwarder) { - const forwardData = args.deployer.interface.encodeFunctionData('deploy', [ - args.bytecode, - args.initData, - args.initVal, - args.salt, - ]) - const res = await args.forwarder.forward( - args.deployer.address, - forwardData, - { value: txVal } - ) - rec = await res.wait() - } else { - const res = await args.deployer.deploy( - args.bytecode, - args.initData, - args.initVal, - args.salt, - { value: txVal } - ) - rec = await res.wait() - } - } catch (err) { - errorOccurred = true - if (args.expectRevert === true) { - return - } else { - throw err - } - } - - if (args.expectRevert === true && errorOccurred === false) { - throw new Error('Expected revert but not found') - } - - expect(rec.events?.length, 'Deploy events').eq(args.expectActivation ? 2 : 1) - const contractDeployed = getContractDeployedEvent(rec, args.deployer) - if (args.salt !== constants.HashZero) { - const initSalt = await args.deployer.callStatic.initSalt( - args.salt, - args.initData - ) - // calculate the epected address - const address = ethers.utils.getCreate2Address( - args.deployer.address, - initSalt, - ethers.utils.keccak256(args.bytecode) - ) - expect(contractDeployed.deployedContract, 'Create 2 address').to.eq(address) - } - - let dataFee = BigNumber.from(0) - if (args.expectActivation) { - const programActivated = getProgramActivatedEvent(rec) - expect( - programActivated.dataFee.eq(activationFee), - 'incorrect activation fee' - ).to.be.true - dataFee = programActivated.dataFee - expect(programActivated.program, 'invalid contract address').to.eq( - contractDeployed.deployedContract - ) - } - expect(contractDeployed).to.not.be.undefined - expect(contractDeployed).to.not.eq(constants.AddressZero) - - const contract = new ethers.Contract( - contractDeployed.deployedContract, - counterInterface, - args.wallet.provider - ) - const counter = (await contract.callStatic['number']()) as BigNumber - expect(counter.eq(args.expectedInitCounter), 'unexpected init counter').to.be - .true - const bal = await args.wallet.provider.getBalance( - contractDeployed.deployedContract - ) - expect(bal.eq(args.initVal), 'unexpected init val').to.be.true - - if (args.forwarder) { - if (args.expectActivation) { - const remainder = txVal.sub(dataFee).sub(args.initVal) - const currentBalance = await args.wallet.provider.getBalance( - args.forwarder.address - ) - expect(remainder.eq(currentBalance), 'remaining balance').to.be.true - } else if (!txVal.eq(args.initVal)) { - const remainder = txVal.sub(args.initVal) - const currentBalance = await args.wallet.provider.getBalance( - args.forwarder.address - ) - expect(remainder.eq(currentBalance), 'remaining balance').to.be.true - } - } -} - -describe('Stylus deployer', () => { - it('create2 deploy, activate, init', async () => { - const wall = await getConnectedL2Wallet() - const deployer = await new StylusDeployer__factory(wall).deploy() - const bytecode = getBytecode(1) - - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: true, - initData: counterInterface.encodeFunctionData('setNumber', [ - BigNumber.from(12), - ]), - initVal: BigNumber.from(parseEther('0.0133')), - expectedInitCounter: BigNumber.from(12), - salt: keccak256('0x20'), - }) - - // cant deploy again with same salt - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: false, - initData: counterInterface.encodeFunctionData('setNumber', [ - BigNumber.from(12), - ]), - initVal: BigNumber.from(parseEther('0.0133')), - expectedInitCounter: BigNumber.from(12), - salt: keccak256('0x20'), - expectRevert: true, - }) - - // deploy again with different salt - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: false, - initData: counterInterface.encodeFunctionData('setNumber', [ - BigNumber.from(12), - ]), - initVal: BigNumber.from(parseEther('0.0133')), - expectedInitCounter: BigNumber.from(12), - salt: keccak256('0x21'), - }) - - // deploy again with different init data - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: false, - initData: counterInterface.encodeFunctionData('setNumber', [ - BigNumber.from(11), - ]), - initVal: BigNumber.from(parseEther('0.0133')), - expectedInitCounter: BigNumber.from(11), - salt: keccak256('0x20'), - }) - - // deploy again, this time we expect no activate - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: false, - initData: '0x', - initVal: BigNumber.from(0), - expectedInitCounter: BigNumber.from(0), - salt: keccak256('0x20'), - }) - - // deploy with different args, this time we expect no activate, but we do expect init - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: false, - initData: counterInterface.encodeFunctionData('setNumber', [ - BigNumber.from(13), - ]), - initVal: BigNumber.from(parseEther('0.0137')), - expectedInitCounter: BigNumber.from(13), - salt: keccak256('0x20'), - }) - }) - - it('create1 deploy, activate, init', async function () { - const wall = await getConnectedL2Wallet() - const deployer = await new StylusDeployer__factory(wall).deploy() - const bytecode = getBytecode(5) - - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: true, - initData: counterInterface.encodeFunctionData('setNumber', [ - BigNumber.from(12), - ]), - initVal: BigNumber.from(parseEther('0.0133')), - expectedInitCounter: BigNumber.from(12), - salt: constants.HashZero, - }) - - // deploy again, this time we expect no activate - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: false, - initData: '0x', - initVal: BigNumber.from(0), - expectedInitCounter: BigNumber.from(0), - salt: constants.HashZero, - }) - - // deploy with different args, this time we expect no activate, but we do expect init - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: false, - initData: counterInterface.encodeFunctionData('setNumber', [ - BigNumber.from(13), - ]), - initVal: BigNumber.from(parseEther('0.0137')), - expectedInitCounter: BigNumber.from(13), - salt: constants.HashZero, - }) - }) - - it('errors', async () => { - const wall = await getConnectedL2Wallet() - const deployer = await new StylusDeployer__factory(wall).deploy() - const bytecode = getBytecode(3) - const noReceiveForwarder = await new NoReceiveForwarder__factory( - wall - ).deploy() - const constructorErrorBytecode = new ConstructorError__factory().bytecode - - // deploy a contract that will error upon construction - await deploy({ - wallet: wall, - bytecode: constructorErrorBytecode, - deployer, - expectActivation: false, - initData: '0x', - initVal: BigNumber.from(0), - expectedInitCounter: BigNumber.from(0), - salt: constants.HashZero, - expectRevert: true, - }) - await deploy({ - wallet: wall, - bytecode: constructorErrorBytecode, - deployer, - expectActivation: false, - initData: '0x', - initVal: BigNumber.from(0), - expectedInitCounter: BigNumber.from(0), - salt: keccak256('0x56'), - expectRevert: true, - }) - - // init value without init data - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: true, - initData: '0x', - initVal: BigNumber.from(parseEther('0.0133')), - expectedInitCounter: BigNumber.from(0), - salt: keccak256('0x20'), - expectRevert: true, - }) - - // insufficent activatin value - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: true, - initData: '0x', - initVal: BigNumber.from(0), - expectedInitCounter: BigNumber.from(0), - salt: keccak256('0x20'), - notEnoughForActivation: true, - expectRevert: true, - }) - - // this forwarder cant receive value - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: true, - initData: '0x', - initVal: BigNumber.from(0), - expectedInitCounter: BigNumber.from(0), - salt: keccak256('0x20'), - expectRevert: true, - forwarder: noReceiveForwarder, - }) - }) - - it('refund checks', async () => { - const wall = await getConnectedL2Wallet() - const deployer = await new StylusDeployer__factory(wall).deploy() - const bytecode = getBytecode(8) - const forwarder1 = await new ReceivingForwarder__factory(wall).deploy() - const forwarder2 = await new ReceivingForwarder__factory(wall).deploy() - - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: true, - initData: counterInterface.encodeFunctionData('setNumber', [ - BigNumber.from(12), - ]), - initVal: BigNumber.from(parseEther('0.0133')), - expectedInitCounter: BigNumber.from(12), - salt: keccak256('0x20'), - forwarder: forwarder1, - }) - - await deploy({ - wallet: wall, - bytecode, - deployer, - expectActivation: false, - initData: counterInterface.encodeFunctionData('setNumber', [ - BigNumber.from(12), - ]), - initVal: BigNumber.from(parseEther('0.0133')), - expectedInitCounter: BigNumber.from(12), - salt: keccak256('0x21'), - forwarder: forwarder2, - overrideValue: parseEther('1'), - }) - }) -}) diff --git a/test/e2e/stylusTestFiles/counter1.txt b/test/e2e/stylusTestFiles/counter1.txt deleted file mode 100644 index 8592c5d0..00000000 --- a/test/e2e/stylusTestFiles/counter1.txt +++ /dev/null @@ -1 +0,0 @@ -0x7f0000000000000000000000000000000000000000000000000000000000001b6f80602b6000396000f300eff000001bb84a23924f5a5914e56a340ea897036e0c917f6465052a264bf9bf77edba8e30575d1b0457c98751305166fbd602f7583a9a3a77635247281e8730fde228ede3c2111afb24d7aa65ebee99cda424a716a5ae901891827b85ba628512fcb5f67bdf4cf7d00e8d46687bea7bf7a579230552643ad34901486b41a9966c7b66772bf500de3d01e1c1090037316c9b3bf42a08a2dbf8cda7d7bf33dd7def9d6fef24c5dbc69d28bcba92c22a3997b0c2fc59c05754aa71c93deba08e4acc4e81d005c28384df3b81ca195d955cd772d3a56b1955f5513ceb11aaf0ff94b3fcaab2bac7dd4f9aae700f1fd5903a0476c2bace9003085210ed00d192564c9f79090854c1899b390e48e94b58aa9b0c738631b4de10fd3f55cbf6ffc100e43952744a744c454750720a956b3f3795387f00083303720542e22e884d24b5412b6e10a9d50beb3349e9dd917288a10ab9e5ca21863a1795bbab6db7955b378d7b17956d2e3122558ca12500c75e33196c9949ac80a19f07aec34cb5cba5dcb3550a603ee31772fb5ef1428c0000bee79eb3d6c2330bcf8e8875cc75a87a4abb2a40ac935a3768e25a9915a9575a4015acc23ff3a3e99fb5fe1a58b62c8d640c22615780d95f3c4d48992c41d6be06304394fcc5313324a2d3cd6170d19aa063b774608e9f20cde08652d89f8659a3729b285cf19f17b3474f204f1451abd050abefb7754a1ba2ee1399f4e702da8f1c245c002512cab9289154e253293b6a3215481454546abda2fd2d35a93929a70d5285924bf226799600939bf3c88f0d6627e68987c0d5553282f9c616b7eca4b1b05df215c40bbbe5a1a3759006d11c43614f49e1e6d47b347646f28835b81b4ff3748f6dec52c7435cebd319e12055d41fff6f434d0df64ee86cb2e8f4dfb98b52c4fabd759eeaf8fe471f9ef35f0cd9b833ba8732dde215c06a2a5bdf3ec2c42dddec90386f6f2ab19e422e6fe5e6d1e5914fa1203041e09d5aea4d9d86a6e7e6d22c456a3533f3bab9d48b03ecbd6e1e11bfe6324708b1476c4c11912592f99e0ccbb7d6af9c6e5be3f43276284703786e3f52e72e4cd606537f5671ad3aa87453d67a0a754466a127a2aa4de542f6c9c8d874a81f2f46aa9c7e1f7eea28fb5f27a57438a24a4ae879a23206e8d265d953677f8add75dc379b2eb8ead523ba75f31f7d47ffbdadbfc7fca037a8edcfb2e5ca0a3353c56e6aacf7a03837bc84cd09d773a8c27ed1be35a284652bdc82115d9e3d75f6ab17a2677b7ff09fd6537af9d60f7f63ecc1672ab63fed861629071f83c2eb08f5fee9a7446de16d6e2a4ecb63c7c15b12ea648de8507853b4d2722fe1a1a14d2cfe13fca0e9388397ceb802238d2c7562707857af4143b74d2e16d8699ad2e82c24325e9e430ef9854db62bd98d921f0f70a20dc1f75ce11a2bb3535009b34b54e3d8f1977888d3ee651663d9ef62925f360e01b3e2e764641d834e3e571ad078bb41fc4dd4d3b824d8d79efc38bf105e86aaf3ad0ad7e39d9f42972daf3e859d59da966840c5aeaa58a5ccc4d7e001de0b0efa9254fe9a5f8df855758e543867fcb9aefde760f559a12177eec670c16a2a8373504703fd3514667f9de242315db9b1a07bd82df3dd62aba4af75cddba15bbd92aa6ae66d2ea4b9d02f79139b15b760ead9666a417fb21fe7fbf15580af13ef13c78ded6008f9feddf7b9cf559207bab1e7cc11b1deed25004ce121917489ae2a5b41b6a281695eefa8de180933147c6720f744170de2deafdaa74eef806e0e648b5ca84315e71da160a0af3fece1e027c6cba106b464055e13bf7921861863e1bd486571e96f5867cd0a7f40c4327e13399a7b9bd8d43329879716d9fae099d0bd5122542f26193816164318dc662ae2f9fe3367b6bfe8b4b6b154dc968adb45e45ae2586354a918d8bb29e0b8c7af53249a7ecd66849a3d6e6fa8e55a245a7cb05ceb3bd08c515d3dfee7c4c2dc747f82e811e3db3b4a8ea6217699ccd8cd4823a2cea2253f06d96ab6c1062e4d495cc0b409d87b086784e82fa8c588fb26388d89e31b8f86082dd97588d944fcadb61195ed9ed04395604cd8cb59e7f48678daccf9b9c26c9c4e73d83aab73cc210ab2c5001b93a5337673f0371706332fe9436862e2510a34be8ad350dbc0958982a07f7739a0cfddaad94084c61c637f56824ebd36cc8d9f09ec8a43405325a1743d4f8904f40b499cf5845847cdc654c234c19b4198299b68682b5d2ef86febe74c08633f42362430007b962cf7d8320eacadd33d543d90b29890396a103ead41413a1b591f09bb0bb683db833af63873cdf45b3e5065bd163fa103b37b12eb74b59dca8a8ba86220241726190532cf0f1c0c49ca5c043d0609cba0ef4a8ea6abd711d94d6b2f420319c4a95f94edd10b5c26c965b40cd2f4f0b41cc6e3ba6fb663cdf02a0a4921b03f8e81c0beb0b5a8c14c40af1cc0ca2e2fae6492da71a8cd7a2a8100e7c6071253ca1e2fcbe60a6c934dd48dc603011000bdb3f20fa63514a2618d80968dadbe06ead8a899e673a01708b71bc2801657f096a4943ce439764224b5a4422b13b29fe03446396ae2dcb59136f6ac36856a68d67b64a671d10c73d1945d6d9128a595f40b7ec8262042de0a91f600ee9197027817c86269e0c1433eea0e6a91a4d60204efab0460d145170c2432701834fa50589a9232df2773bafdc90f2a591cb7c571bb10e480c6048a5441c160c57a45d50ff89775f32f21771cf22d8a801c39d218dbeb35002102dde00b664764ce75d3f8e996bc704c6b45d92c754a51129be2d876b57f04eb347bee92a1bda651d01ddd2f91f661e279001846a718eb8b929e3237e8e86d1bf2b4935b6564a5ae524c96b2b87811cf1c7fdf84ed673f57e6881babe5cd8cc8cbbc47b3ba4570b6cfad1d3acbd6f2f5f6080b2a65af4484973e373c8de8f644a9c60d1e2ad738b974767808ab42d0c6ec689fd5b0401945951d20738ad14d3da84bd27be98c2b30d288de670a6cf7c41e10b937f14bc83dab1f8515955789d0d6587f75acaf7a103f7512d6510e610de5365d3f098806112791c214e68aea4ccbb124c5918e837f980652492ed5156b0590a8e4e0fff4acb45784674e60469919656694f93438d7c8ca5590e0b0b8c410b025ff8168452b805b4509012a96d8f8bee710b685a1e75a9962f033daa33d7f5d563263178f43bc4d249da7b7c1d26cda626f422b4fe2bc8ce5bbfb4e08dedc09feae415cfa1783bf0317283f10c16b1645416639248225492061814a95849ddd59971a64ffebde4158bf257a3cfb5feba3fd9cc591ff577189547cac509e589de013acc8c330fe5f9fc73bf33ee353c1a68075f85cf0c3052b21af856c056b53b213fc649b388db81bbfa625f1b7998a27c324b188dbfe9ba9780aec811026b11758e4cda24205df637169603e0bcef875f0e0211ff5042a0605aca744f62fa0b5d60ae2e2124a791a5d283410628224eedcc079b61e5758fbc7d4bac0a442d037517eb0dea08ef3c6142e6e261cea46cda9602facded13d5320e0e5675b1ca53b7a433c2b7dcc77cce9c03b0362a19971f4d9dc0b2063ad5892ae48591341b74a68ac3d99488641ba62a6830af1b82110fb0511505540ca71e56bcfa654c5c5049768fae5ea8cc116256c537047201e577432179dfd5fa909ab1f20aa0f9184bc340b6f7e1cc86eefb2193d0b1f967058857a871ccd06f09797e26687c4a5999941b24ba76a8fd1d8944dd9b8a77cca273765c352318053cb3e8d7efbe965ec90431f146ac282c7da75f463887642ddaf2a45e2170cbe0fed406dff2f21ff981b0a97f5ff42b20d5020926b35acba78c66aba314f8adba2b87def95562350945f4da41b3907bc2cd3fe9f837ddfe93ec8799073dff313593b4e20dd0cb904b9047141be975df831e290e2790c3d757c28fd31371887df1dafa44cfe1a10fad5f16a23ef04314ece65329ddd8b9a493cb2dfe2217bc9d306ada78e0f214b9927c6aa6caccac6ca9ea998e7f8eb72577b5ff6aad85f0e6a3382dadf52d452d52c9b74282eb193d9196c8d692833d66a822374e50919cc17d2b558c929d24d158373991192f75ca9c54d61f79f1362c7cc21f5f7eb44c67e8a98ad8731b96372c764a71503b9a21936a2c843e4b0c5c5545114a6e5a0302d078543e530c4ae1027319241dfe73ccb9df2be00286e3982b3d50a756ac1e4e7995eeb092320408643f9c2850eb6dd648ba43bf6af937161496cd6bf9614c0dfd2dc1b54f57e0f250c0993cd5bbdef8c0581555008fdef66a90ad8076512c45bbded96eae5892a7f3d6971babc91dd132cd45102a15d5178e8a92601723141d1af8cbab80f84f85e04baa569d87f685cb3e5caf145a8a1da3c0f41f1d78086d604e21e7c63a9363162ab80a04244d273df68496f5082e57a606b1109d65f20a86298345a2bb5dd774e4f4bddc27a1588d6409607aee94581b1f40767d380da367b46e73016730e7dd778658599f39852acc58229977b37590713f69a9bb82baba298a2681ef54d2baf42a814966d9dabaced2b857cebb22af8e4dbbf4eb69f7c1b3e8c9780a9c0b276fa2a85b9b099ceab10d3356147c032ed6c517bc499f3825a52b0272148eaa67be26617c41d0ed4d603e236f1d71388543096b1b2e62c33d64ae4db0751f5bae89714d0da3479dac5042974753cf64d7be988a5d2a962d20e08ed8d52b1b96eca9db946dc269432a29608613595d30ab9825cc9670bd2508dfaa624358058b5e6ff0d5bc7afcf9cd0f92dae65bff3b23fe6cb5b22dfeef8af258d71e0d8e1c1a2857c8073ee3087c31cea0ea4036f04099fffe2acb21b3bacf5a4b10043c9cba4a898f484fa527de8fddaa6921a4b2da2a24c0cabbd508099bde8eb1dde0dc8c3027fa32dcaee2411731eb6b6bdd62bd5017f6e2fcc8365961c0d9b63f5b53c3328c7dab45bb88a2028f1be32b136a559c5627a33615985e9080281fb19c8391306c736b0a742c8a6bf7f564010940e872d34bb31d142c8de42d14d6b5669f4add631c54677cdeca6e15069e1bca11de79dba74856d6a52cbaefd87769883afbfd18ba3f9cc92fc850278ae4e11117daef6cba3657dd5ddac947b63b8d2e7c93535f5d23bad3265d2b2b01e236c9904509a39713733632add02ce2c2fd36a328028638c1a59cfe6c160b25856d01b4beecd104796a92d6566352a5de6bd0a076f078439a57971e3f92f8131ca5650105aba1e5162a26747fb3c1357bff6b6f77e44022b1402315b841747b3f1016d1726d482923389346133eed38324b02a102a89abd6c4bca82008b739dc78615685cb9111a418cb25dd3ab5d8ad0ac6d7402159ea7003ebc465978a2d6fc6603d7d832434f8eebe1bdffada31dffded932dd0af39f8b3e7dc0f1ffdc3138fdf3bee0f0cb01bdfbaf4d99b5ffdc9cbef578fdd67bef9fe399f39fbae7bec98ba8340a1a3b004971a76d852884161bc4f4190514cf4d99022cbe22246f3408e0df681cbeec4da5ae5f3adae4e9e17cad0d028f3873750f76a5448e9c5a6583f3498ee68b1b4ec82e07cd324c87a290b8c6858a6454687de1c2534396ece1dd20575fcbe12674ccdd41c801c437d78cca3d0c9144cfd36b06f281f1c106fb03d6538f42c8c9a9b8c2c638d2c83a8de633392f370bce461e6fe5b56faa39543c107b1e64fb8ef3d456c02e6c1f2c6431edeac4896435dc1d78aa76e3c7a52010d0b0da45c754b33d25221f3afb8afc08a19c7f635b65c4bbc04496ad3e45549f56caba038ac49b30655f4d85dcedcad2b02e7b3b8ab07f853f25e566d3ea14993b410fcf52d45a8fd8776442411c55e172ca34b6d12644ac1c1414a76403c90c72b4a20d8aae3f3ebf94e98b79be7fb8ba930e171dee77ac431321d2fc4a7c081b92b705e568bc30a71df179427d534da6fbc6accd56b06837682af220fa4113d8a3f6ce6ef900814d7804f0136cfa17860f315ef9803de4412a7ca61784e797b7e70bea3bb0a140612049174127029c8282ea7cf634da99f40832ee8b14d018d84ec8bda065d9c8d293e069ccd516e105ec16be0cdd96e154460e9b7c29f489d2752a678fc561d01741313390bc01d1afb63a91b0752c71a6bd77df7b508433e34f5f5cfba8aa79139466d3b0c957af49c4b7844278356c482a98e85309d7178e61ed24d45bb47652978429ce29a78760d6ceb4d8600e330d72c85a50ddc67967f3ff11270de0aa1b3b02ec9dc38ecfaa44e7e8c1ee630d9a5064071ecfff3dca05b52858946dc237f138e6b90a709ab14b2584096b4e79e986ab22ab8134f2dde506d3134e21922f2162e3132487e5f00c8b425f00254f4493df669bb8137657fa4506f6e6c78d5a40099d8e59360db5940b6e755b221e59b82558304eb21ab5f46dcbd32d131bf8bee42fc05f9e83b2ef7f70b2c9f0fc60f48d26172bb27785bc62f0f4fc0299dd844ba43de74e0ade3be954b1a84452e5932b45f00e859d096f60c3ba02cb1f18060be141c5f10c8659b499a3687244b9bcc96eb9cd7631b27639e40bf562c8e8d39c87a9b2fa20fa8e03d73433e38eec78491fa181c61f2e26195680d657da3e09c3123dc5185e66b4bb45eb1bd4996cb4d70cf622b4806dc54d83785ddb56490ecaec5b4c631bd5bb1820baed3621b8707e4db6b6d936a366307854c10cb055f600f128f75c0a6a3f9e33ffd0bbd1f0375c02dfdc9d2e24503b8d271cefa44009282dcf8c7ba8bf42b2281c42d722546a23b9f92eb4dd472b78078c22e85981a3d85dbed7181b3b317c826908c70c722698c84c8d207448de38a19281321aa1290367f07c30b4524eabd4230cae76dd2d633b4d9bb7dd24f8e7575c02942e52684384e5aa8a35a36f66a1ab490a721ef2fa6b489fc68daa9c330eaf43acfe07dd95a2e1d5222f3288a01d539da757972b9e287705d8dd0148cb3abf53659c6a3661373da09b5d881588bb25d170e318acc1a11666d93b3b00d76590f73842e16f9b08e52c0b7282d793759548a406495e67479779b8ae7e06c25dfa8e33684b2acf43f4a66301923780ef7410b5b2c9d64a013b33c53204e02805bebd44ea78e747a85f3fab8d64768135c2aa76f9ad0ac8c65d723cacce4c1ea53f3e481d6674686d14a1dec1639d07d346daf3c8b6693b601ff641fd705a34bf3c737b5b0925c2afb99b4cd3499c6692cf39fe26c59cda6a3134dfecbc85acf2cc3a9c48d32b7d693098b8669319394a14f1025c4213a889d24da0bbfd2f4b0d885712d50db04b46f3bef6d5bd26fb30ce01472bc6f5234a225ca6c0538f49077fafcc4f336f3093f5d63d692f4646d9d976c0c13047ebf3386006e0332920125cf8b1a311b4d5c00a28d46219d958db9af0a924ea70c52cdb6dfc4988cd594fda8818b966476bc05f50b456c50086ae366c5601b85b1ed8dbb9bba1a1d916d94b94223d18215d22c66bda73c98e1b5418bad6a4973a00b13338e93ddb27584e877a4331570019a0876bd017109798f788686ada5e9ad138c9fabc3e552d110e68d1e4330b056ad31fa1af33bde056f8c749a0fe60fc995afe1abb802f92a59994d180c234c0f13de1e17642af72b1d17a83678f99b7bed8e3e3c274adc8d259aae9703a61d75e5b01236254476b3833db0c55caf6aa88621dc09b2101d3094ba1d1ab17a5e27580085536d9e77005d10fa70c915b9bf200c7d8102355071b4f5401e42cb07cc0bda07849e809b57e78d573988d725676f2c2e8bc689ffbe3171967d163220ad63028be86599867b02f9944ce2a4ca5413913967c2b1c2c8625d2748d659f045622f8179729feb737daeef61f0f2f087dd8279f0bb0f7c45f88a1f97dd2e3083f4eeec1711621a922e9df47186189d2bb36e0514cd27da02ce07a98cf360ff03556291ae48314bf10aada4a8acb8b00d10f4add97e3454c43fe7890bd569d58ea447a8ad5e9d16757e8c4f91b44be34ea8e3eb327ffc71b4c4b6f2c972cb5830b24e39728f1c68879547e32f2f747353926536f78281617078e34787f56ebf8447ae7c8485e62398138bc923fd93744442aa31ac79f48619165b1e5f2d352881b6bcf6eb027619e11b2169db6a82514bf4fe52a2b4645e5949ab73cc798601a3751ddb01169436695b47d590048d9b1b4d577f856b31bd4e99925daee053373684d9da02aa4a62de1886541eabb6ee6f700a5c27d2e42eeb7f9c2ba56ad2896e50a03725d5d4c5bdc8c8293bac1b25650c64030647e7068eaeef440dbc680f87760c868429d75029a226f4bbb38345ebc7d6e42e814cd40d8042177e2f37ae1ddad68a6f5ca88c76f7dcd2bd387341dd0565f3bb6537c6bb21ac0b481ca8d0b1ced686507247892aedeffeb735b1af674dedceb2f3ca151f4b4a2fd9cc2e46ff6252954eb84d9b328830cce2f61573874f340168ab7b75932b3933e8ded2309e0762e68c02b87548ae3a60652aa06a2da9d5513a08e770e1c2c5c30ec1e52e0823f739503ce0e2ecb1dd126dad62d6956e02677ae229caa8b49c9c0843eee56e6ea9efeb50016840085c3f37b71c3f1cde4119fbb8e52b2ab8b36045edbec1ba74ca0be08648a359e491297c64c1ba1a46556b01a617d0979df396ec9d38cbfd34fd531c61dac7f2d05ccbed21c7a8cb7a39fa144ce7382053bf83be59eadffce68447967d8b12d8f8edd627a06c4caf7cc8be94d465a9b768baf15748ad443634d5ceb9a3754c0b78a40dabd695a28d2be2b4e0eed770eba6ed3fd56a9fdc3a711ed97ef7c8d09e156900da834d0b2ecff77a8f6d564949ccd586c4b96915f5cd2bbb2f9817462132309daf2bf6a686e862f196b917254f871b0fefaaa6b76bdf84fb06f5ebe633718038dcaedf35a85696695ce796ebe2f975865951308ae0d1be5975ca3ea5d44566f1dcfb7b6983a2b63ae1ff05c8a2d60274a0cc0e5a349bc866ec2c79fbd31c3dbcd6684cfd3b84f659398dcb1e83ec6fc4da47bff6081778909a9132f293985b4218399b8340a6cd51a5d6b56b163ac35748c74b435d368c432a12d36cdc6d327407640b20e264dde5f62f417aa821dd03211eeb6c3beaac21d0686d1895b824b31bf205bb4bc162fe38081f416909396754c6f40f7d9e900821faf48e88b81ca28ee6268af57d29d6e6f587fc93df2ff3e02afc3ec3a42ef6df6443786d433d798ad3c3f938863ccd2bde3f804b004e002ac02f0034210dc7b7bb3d345aedd2915b96bec18de9df50cf3e103f256a04d021a2d2acf0eb4127ff56180850550472fea706f93364ed3b367c4a7d1bc1e3100acf62faeb3d3cdb4fbd19c6e5e457bd416e8e6df8ccd21eb08e7485455c222ccc11f10881cf2804b4433902e8a78d2c9333efe2fc0cb6e447e07b152398c8f0f0bb8ec9fc10231299a66bf83a8edd8be1797fa68e3414f52b050fc7e63efe7f60dea3e7b5cc27be67ea812d4ff6fe588e17c430401a00c218c128c6247ee16b323ab499ee63ddc8b1991767fef98a95f08330d3221edfcec47876eb12b986f9840be81fd187718428be3c2c9186494c611a3398c53c86a35c1c0b58f471d17cfca80d80bf5e1ab247fae471668f49d886ff588eeae5c64514b06168a2d567fa3663fa5d58dff4af5354a190c3feefaa5c53a9ad4301201a82310816c72248364573182eafabd1ec6eb57b3abd7d2a41544bb246d1ea5c86e9b66c8fe3f54d0d86d3a3f1cc64762e1584e928ce24d9dcd662b9bd5aef6c76f7ae0e772e9eced71a5e9ae0a208f2915e6ca2fe00de34915c1a9c4c024526e97b5d875d1f87927ab11ef152c2cfda649e46c2494a51dea1395f8c6041b877c3b853e3c813fbee5be1ddc755be7fc300fd91f63b939ac343145801 \ No newline at end of file diff --git a/test/e2e/stylusTestFiles/counter2.txt b/test/e2e/stylusTestFiles/counter2.txt deleted file mode 100644 index f155b216..00000000 --- a/test/e2e/stylusTestFiles/counter2.txt +++ /dev/null @@ -1 +0,0 @@ -0x7f0000000000000000000000000000000000000000000000000000000000001b6f80602b6000396000f300eff000001bb84a23924f5a5914e56a340ea897036e0c917f6465052a264bf9bf77edba8e30575d1b0457c98751305166fbd602f7583a9a3a77635247281e8730fde228ede3c2111afb24d7aa65ebee99cda424a716a5ae901891827b85ba628512fcb5f67bdf4cf7d00e8d46687bea7bf7a579230552643ad34901486b41a9966c7b66772bf500de3d01e1c1090037316c9b3bf42a08a2dbf8cda7d7bf33dd7def9d6fef24c5dbc69d28bcba92c22a3997b0c2fc59c05754aa71c93deba08e4acc4e81d005c28384df3b81ca195d955cd772d3a56b1955f5513ceb11aaf0ff94b3fcaab2bac7dd4f9aae700f1fd5903a0476c2bace9003085210ed00d192564c9f79090854c1899b390e48e94b58aa9b0c738631b4de10fd3f55cbf6ffc100e43952744a744c454750720a956b3f3795387f00083303720542e22e884d24b5412b6e10a9d50beb3349e9dd917288a10ab9e5ca21863a1795bbab6db7955b378d7b17956d2e3122558ca12500c75e33196c9949ac80a19f07aec34cb5cba5dcb3550a603ee31772fb5ef1428c0000bee79eb3d6c2330bcf8e8875cc75a87a4abb2a40ac935a3768e25a9915a9575a4015acc23ff3a3e99fb5fe1a58b62c8d640c22615780d95f3c4d48992c41d6be06304394fcc5313324a2d3cd6170d19aa063b774608e9f20cde08652d89f8659a3729b285cf19f17b3474f204f1451abd050abefb7754a1ba2ee1399f4e702da8f1c245c002512cab9289154e253293b6a3215481454546abda2fd2d35a93929a70d5285924bf226799600939bf3c88f0d6627e68987c0d5553282f9c616b7eca4b1b05df215c40bbbe5a1a3759006d11c43614f49e1e6d47b347646f28835b81b4ff3748f6dec52c7435cebd319e12055d41fff6f434d0df64ee86cb2e8f4dfb98b52c4fabd759eeaf8fe471f9ef35f0cd9b833ba8732dde215c06a2a5bdf3ec2c42dddec90386f6f2ab19e422e6fe5e6d1e5914fa1203041e09d5aea4d9d86a6e7e6d22c456a3533f3bab9d48b03ecbd6e1e11bfe6324708b1476c4c11912592f99e0ccbb7d6af9c6e5be3f43276284703786e3f52e72e4cd606537f5671ad3aa87453d67a0a754466a127a2aa4de542f6c9c8d874a81f2f46aa9c7e1f7eea28fb5f27a57438a24a4ae879a23206e8d265d953677f8add75dc379b2eb8ead523ba75f31f7d47ffbdadbfc7fca037a8edcfb2e5ca0a3353c56e6aacf7a03837bc84cd09d773a8c27ed1be35a284652bdc82115d9e3d75f6ab17a2677b7ff09fd6537af9d60f7f63ecc1672ab63fed861629071f83c2eb08f5fee9a7446de16d6e2a4ecb63c7c15b12ea648de8507853b4d2722fe1a1a14d2cfe13fca0e9388397ceb802238d2c7562707857af4143b74d2e16d8699ad2e82c24325e9e430ef9854db62bd98d921f0f70a20dc1f75ce11a2bb3535009b34b54e3d8f1977888d3ee651663d9ef62925f360e01b3e2e764641d834e3e571ad078bb41fc4dd4d3b824d8d79efc38bf105e86aaf3ad0ad7e39d9f42972daf3e859d59da966840c5aeaa58a5ccc4d7e001de0b0efa9254fe9a5f8df855758e543867fcb9aefde760f559a12177eec670c16a2a8373504703fd3514667f9de242315db9b1a07bd82df3dd62aba4af75cddba15bbd92aa6ae66d2ea4b9d02f79139b15b760ead9666a417fb21fe7fbf15580af13ef13c78ded6008f9feddf7b9cf559207bab1e7cc11b1deed25004ce121917489ae2a5b41b6a281695eefa8de180933147c6720f744170de2deafdaa74eef806e0e648b5ca84315e71da160a0af3fece1e027c6cba106b464055e13bf7921861863e1bd486571e96f5867cd0a7f40c4327e13399a7b9bd8d43329879716d9fae099d0bd5122542f26193816164318dc662ae2f9fe3367b6bfe8b4b6b154dc968adb45e45ae2586354a918d8bb29e0b8c7af53249a7ecd66849a3d6e6fa8e55a245a7cb05ceb3bd08c515d3dfee7c4c2dc747f82e811e3db3b4a8ea6217699ccd8cd4823a2cea2253f06d96ab6c1062e4d495cc0b409d87b086784e82fa8c588fb26388d89e31b8f86082dd97588d944fcadb61195ed9ed04395604cd8cb59e7f48678daccf9b9c26c9c4e73d83aab73cc210ab2c5001b93a5337673f0371706332fe9436862e2510a34be8ad350dbc0958982a07f7739a0cfddaad94084c61c637f56824ebd36cc8d9f09ec8a43405325a1743d4f8904f40b499cf5845847cdc654c234c19b4198299b68682b5d2ef86febe74c08633f42362430007b962cf7d8320eacadd33d543d90b29890396a103ead41413a1b591f09bb0bb683db833af63873cdf45b3e5065bd163fa103b37b12eb74b59dca8a8ba86220241726190532cf0f1c0c49ca5c043d0609cba0ef4a8ea6abd711d94d6b2f420319c4a95f94edd10b5c26c965b40cd2f4f0b41cc6e3ba6fb663cdf02a0a4921b03f8e81c0beb0b5a8c14c40af1cc0ca2e2fae6492da71a8cd7a2a8100e7c6071253ca1e2fcbe60a6c934dd48dc603011000bdb3f20fa63514a2618d80968dadbe06ead8a899e673a01708b71bc2801657f096a4943ce439764224b5a4422b13b29fe03446396ae2dcb59136f6ac36856a68d67b64a671d10c73d1945d6d9128a595f40b7ec8262042de0a91f600ee9197027817c86269e0c1433eea0e6a91a4d60204efab0460d145170c2432701834fa50589a9232df2773bafdc90f2a591cb7c571bb10e480c6048a5441c160c57a45d50ff89775f32f21771cf22d8a801c39d218dbeb35002102dde00b664764ce75d3f8e996bc704c6b45d92c754a51129be2d876b57f04eb347bee92a1bda651d01ddd2f91f661e279001846a718eb8b929e3237e8e86d1bf2b4935b6564a5ae524c96b2b87811cf1c7fdf84ed673f57e6881babe5cd8cc8cbbc47b3ba4570b6cfad1d3acbd6f2f5f6080b2a65af4484973e373c8de8f644a9c60d1e2ad738b974767808ab42d0c6ec689fd5b0401945951d20738ad14d3da84bd27be98c2b30d288de670a6cf7c41e10b937f14bc83dab1f8515955789d0d6587f75acaf7a103f7512d6510e610de5365d3f098806112791c214e68aea4ccbb124c5918e837f980652492ed5156b0590a8e4e0fff4acb45784674e60469919656694f93438d7c8ca5590e0b0b8c410544bfe03d18a5600b78a1202542cb1f17dcf216c0b43cfb532c5e067b4477bfebaac64c62e1e87789b483a4f6f83a5d9b4c5de84569ec47919cb77f79d10bcb913fc5d83b8f42f067f072e507e2082d72c8a82cc7248044b9240c202952a093bbbb32e35c8fed7bd83b07e4bf478f6bfd647fb398b23ffafe212a9f858a13cb13ac12758918761fcbf3e8f77e67dc6a7824d01ebf0b9e0870b56425e0bd90ad6a66427f8c936711a71377e4d4be26f33154f86496211b7fd3753f114d803214c622fb0c89b45850abec7e2d2c07c169cf1ebe0c1433eea09540c0a584f89ec5f406bad15c4c52594f234ba506820c40449dcb981f36c3daeb0f68fa975814985a06fa2fc60bd411de78d295cdc4c38d48d9a53c15e58bda37ba640c0cbcfb6384a77f4867856fa98ef98d3817706c44233e3e8b3b91740c65ab1245d91b226826e95d0587b32910c8374c54c0715e2714320f60b22a0aa8094e3cad79e4da98a8b092ed1f4cbd519832d4ad8a6e08e403caee8642e3afbbf5213563f40541f2209796916defc3890ddde65337a163e2ce1b00af50e399a0de02f2fc5cd0e894b33338364974ed51ea3b1299bb2714ff9944f6eca86a56200a7967d1afdf6d3cbd821873e28d484058fb5ebe8c710ed84ba5f558ac42f187c1fda81dafe5f42fe3137142eebff85641ba04024d76a5875f18cd574639e14b74571fbde2bad46a028bf9a4837720e7859a6fd3f07fbbed37d90f320e7bee727b2769c40ba1972097209e2827c2fbbf063c421c5f3187aeaf850fa636e300ebf3b5e4999fc3520f4abe3d546de09629c9ccb643abb1735937864bfc543f692a70d5a4f1d1f4296324f8c55d958958d953d5331cff1d7e5aef6beec55b1bf1cd46604b5bfa5a8a5aa5936e9505c6227b333d81ad35066acd50447e8ca1332982fa46bb19253a49b2a06e7322324efb9528b9bc2ee3f27c48e9943eaefd7898cfd14315b0f6372c7e48ec94e2b067245336c449187c8618b8ba9a2284ccb41615a0e0a87ca61885d214e622483becf79963be57d0150dc720467ab15ead482c9cf33bdd6134640800c87f2850b1d6cbbc9164977ec5f27e3c292d8ac7f2d2980bfa5b937a8eafd1e4a1812269bb77adf190b02aba010fadfcd5215b00fca2488b77adb2dd5cb1355fe7ad2e2747923bb2758a8a30442bba2f0d0534d02e46282a25f1975711f08f1bd08744bd3b0ffd0b866cb95e38b5043b5791e82e2af010dad09c43df8c6526d62c45601418588a4e7bed192dea004cbf5c0d62212acbf4050c53069b4566abbef9c9e96ba85f52a10ad812c0f5cd38b0263e90fcea601b56df68cce612ce61cfaaef1ca0a33e731a5588b05532ef76eb20e26ec3537715756453145d13cea9b565e8550292cdb3a5759db570af9d66555f0c9b77f9d6c3ff9367c182f01538165edf4550a7361339d5721a66bc28e8065dad9a2f68833e705b5a4604f4290d44df7c4cd2e883b1ca8ad07c46de2af2710a9602c6365cd5966ac95c8b70fa2ea75d12f29a0b569f2b48b0952e8ea78ec9bf6d2114ba553c5a41d10da1ba56273dd943b738db84d2865442d11c26a2aa7157205b992cf16a4a11af54d496a00b16acdff1bb68e5f9f39a1f35b5ccb7ee7657fcc97b744beddf15f4b1ae3c0b1c383450bf900e7dc610e8739d41d4807de08123effc55965377658eb496301869297495131e909f5a5fad0fbb54d2535965a44459918567ba100337bd1d73bbc1b908705fe465b94dd4922e63c6c6d7bad57aa03fedc5e9807cb2c391a36c7ea6b7966508eb569b770154150e27d65626d4ab38ac5f466c2b20ad3110402f7339073260c8e6d604f85904d7fffac8020281d0e5b687663a28590bd85a29bd6acd2e85bad638a8dee9ad94dc3a1d2c279433bce3b75e90adbd4a4965dfb0fed30075f7fa31747f39925f90b05f05c9d2222fa5ced9747cbfaaabb5929f7c670a5cf936b6aeaa5775a65caa465613d46d83209a03473e26e66c654ba059c595ea6d5640051c61835b29ecd83c164b1aca03796dc9b218e2c535bcacc6a54bacc7b150ede0e08734af3e2c6f35f026394ada020b4743da2c444cf8ef67926ae7eed6deffd880456280462b6082f8e66e303da2e4ca80525671269c266dca70749605520541257ad89795141106e73b8f1c2ac0a9723234831964bba756ab15b158caf8142b2d4e106d689cb2e155bde8cc17afa064968f0dd7d37bef5b563befbdb275ba05f73f067cfb91f3efa87271ebf77dc1f186037be75e9b337bffa9397dfaf1ebbcf7cf3fd733e73f65df7d831750781424761092e35ecb0a51083c2789f8220a398e8b3214596c5458ce6811c1bec0397dd89b5b5cae75b5d9d3c2f94a1a151e60f6fa0eed5a890d28b4db17e6830ddd16269d905c1f9a64990f5521618d1b04c8b8c0ebd394a6872dc9c3ba40beaf87d25ce989aa939003986faf09847a1932998fa6d60df503e3820de607bca70e8591835371959c61a590651bdc76624e7e178c9c3ccfdb7acf4472b87820f62cd9f70df7b8ad804cc83e58d873cbc59912c87ba82af154fdd78f4a4021a161a48b9ea9666a4a542e65f715f8115338eed6b6cb996780992d4a6c9ab92ead95641715893660daae8b1bb9cb95b5704ce6771570ff0a7e4bdacda7c4293266921f8eb5b8a50fb0fed8848228abd2e584697da24c89482838394ec8078208f579440b055c7e7d7f39d306f37cff7175361c2e3bccff58863643a5e884f81037357e0bcac168715e2be2f284faa69b4df78d598abd70c06ed045f451e48237a147fd8ccdf211128ae019f026c9e43f1c0e62bde3107bc89244e95c3f09cf2f6fce07c477715280c240822e924e05290515c4e9fc79a523f81065dd0639b021a09d917b50dba381b537c0c389ba3dc20bc82d7c09bb3dd2a88c0d26f853f913a4fa44cf1f8ad3a02e826267216803b34f6c752370ea48e35d6aefbee6b11867c68eaeb9f75154f23738cda76182af5e83997f0884e06ad8805531d0b613ae3f0cc3da49b8a768fca52f08438c535f1ec1ad8d69b0c01c661ae590a4b1bb8cf2cff7ee225e0bc154267615d92b971d8f5499dfc183dcc61b24b0d80e2d8ffe7b941b7a40a138db847fe261cd7204f13562964b1802c69cf3d31d5645570279e5abca1da6268c43344e42d5c626490fcbe0090694be005a8e8937aecd376036fcafe48a1dedcd8f0aa490132b1cb27c1b6b3806ccfab6443ca3705ab0609d64356bf8cb87b65a2637e17dd85f80bf2d1775ceeef17583e1f8c1f90a4c3e4764ff0b68c5f1e9e80533ab1897487bce9c05bc77d2b9734088b5cb26468bf00d0b3a02ded1976405962e301c17c2938be2090cb3693346d0e499636992dd739afc7364ec63c817ead581c1b7390f5365f441f50c17be6867c70dc8f0923f53138c2e4c5c32ad11acafa46c1396346b8a30acdd79668bd627b932c979be09ec556900cb8a9b06f0abb6bc920d95d8b698d637ab76205175ca7c5360e0fc8b7d7da26d56cc60e0a9920960bbec01e241eeb804d47f3c77ffa177a3f06ea805bfa93a5c58b0670a5e39cf589002405b9f18f7517e9574402895be44a8c44773e25d79ba8e56e01f1845d0a31357a0ab7dbe30267672f904d2019e18e45d2180991a50f881ac715335026425425206dfe0e86178a48d47b856094cfdba4ad6768b377fba49f1cebea805384ca4d08719cb45047b56cecd53468214f43de5f4c6913f9d1b4538761d4e9759ec1fbb2b55c3aa444e6511403aa73b4ebf2e472c50fe1ba1aa129186757eb6db28c47cd26e6b4136ab103b11665bb2e1c6214993522ccda2667611becb21ee6085d2cf2611da5806f515af26eb2a81481c82acde9f2ee3615cfc1d94abe51c76d086559e97f94cc603246f01cee8316b6583ac940276679a6409c0400b7d6a99d4e1de9f40ae7f571ad8fd026b8544edf34a15919cbae479499c983d5a7e6c903adcf8c0ca3953ad82d72a0fb68da5e7916cd266d03fec93eae0b4697e68f6f6a6125b954f633699b69328dd358e63fc5d9b29a4d47279afc9791b59e598653891b656ead2713160dd3622629439f204a884374103b49b4177ea5e961b10be35aa0b60968df76dedbb6a4df6619c029e478dfa468444b94d90a70e821eff4f989e76de6137ebac6ac25e9c9da3a2fd9182608fc7e670c01dc066424034a9e173562369ab800441b8d423a2b1b735f15249d4e19a49a6dbf893119ab29fb5103172dc9ec780bea178ad8a010d4c6cd8ac1360a63db1b773775353a22db28738546a2052ba459cc7a4f7930c36b83165bd592e6401726661c27bb65eb08d1ef48672ae0023411ec7a03e212f21ef10c0d5b4bd35b27183f5787cba5a221cc1b3d866060ad5a63f435e677bc0bde18e9341fcc1f922b5fc3577105f255b2329b301846981e26bc3d2ec854ee573a2e506df0f237f7da1d7d784e94b81b4b345d2f074c3beaca61256c4a88ec66077b608bb95ed5500d43b81364213a6028753b3462f5bc4eb0000aa7da3cef00ba20f4e1922b727f4118fa02056aa0e268eb813c84960f9817b40f083d0137afce1baf7210af4bcede585c168d13ff7d63e22cfb2c64405ac70416d1cb320df704f22999c44995a9262273ce84638591c5ba4e90acb3e08bc45e02f3e43ed7e7fa5cdfc3e0e5e10fbb05f3e0771ff88af0153f2ebb5d6006e9ddd92f22c434245d3ae9e30c313a5766dd0a289a4fb4059c0f5219e7c1fe07aac4225d916296e2155a49515971611b20e85bb3fd68a8887fce1317aad3aa1d498f505bbd3a2deafc189f226997c69d50c7d765fef8e368896de593e596b160649d72e41e39d00e2b8fc65f5ee8e6a624cb6cee0503c3e0f0c68f0eebdd7e098f5cf9080bcd473027169347fa27e98884546358f3e80d332cb63cbe5a6a50026d79edd705ec32c23742d2b6d504a396e8fda54469c9bcb29256e798f30c0346eb3ab6032c286dd2b68eaa21091a37379aaefe0ad7627a9d3225bb5cc1a76e6c08b3b5055495c4bc310ca93c566ddddfe014b84ea4c95dd6ff38574ad5a413dda0406f4aaaa98b7b9191537658374aca18c8060c8ece0d1c5ddf891a78d11e0eed180c0953aea152444de87767078bd68fadc95d0299a81b00852efc5e6e5c3bb4ad15dfb85019edeeb9a57b71e682ba0bcae677cb6e8c77435817903850a1639dad0da1e48e1255dadffd6f6b625fcf9ada9d65e7952b3e96945eb2995d8cfec5a42a9d709b3665106198c5ed2be60e9f6802d056f7ea26577266d0bda5613c0fc4cc190570eb905c75c0ca5440d55a52aba37410cee1c2858b871d82cb5d1046ee73a078c0c5d963bb25da5ac5ac2bdd04cef4c45394516939391186dccbdddc52dfd7a102d08010b87e6e6e397e38bc8332f671cb57547067c18ada7d8375e99417c00d9146b3c82353f8c88275358caad6024c2fa02f3be72dd93b7196fb69faa738c2b48fe5a1b996db438e5197f572f42998ce7140a67e077db3d4bff9cd098f2cfb1625b0f1dbad4f40d9985ef9907d29a9cb526fd174e3af905a896c68aa9d7347eb9816f0481b56ad2b451b57c469c1ddafe1d64ddb7faad53eb975e23cb2fdee91a13d2bd200b4079b165c9eeff51edbac929298ab0d8973d32aea9b57765f302f8c4264603a5f57ec4d0dd1c5e22d732f4a9e0e371ede554d6fd7be09f70dead7cd67e20071b85dbf6b50ad2cd3b8ce2dd7c5f3eb0cb3a26014c1a37db3ea947d4aa98bcce2b9f7f7d206456d75c2ff0b9045ad05e840991db4683691cdd859f2f6a7397a78add198fa7708edb3721a973d06d9df88b58f7eed112ef020352365e42731b78430723607814c9ba34aad6bd72c7486af908e9786ba6c18875424a6d9b8db64e80ec81640c4c9bacbed5f82f45043ba07423cd6d976d45943a0d1da302a71496637e40b769782c5fc71103e82d21272cea88ce91ffa3c211142f4e91d117139441dcd4d14ebfb52accdeb0ff927bf5fe6c155f87d86495decbfc986f0da867af214a787f3710c799a57bc7f0097009c0054805f0068421a8e6f777b68b4daa523b72c7d831bd3bfa19e7d207e4ad408a04344a559e1d7834efead3010a0aa08e4fc4f0df267c8da776cf894fa3682c721149ec5f4d77b78b69f7a338ccbc9af7a83dc1cdbf099a53d601de90a8bb844589823e211029f510868877204d04f1b592667dec5f9196cc98fc0f72a463091e1e1771d93f9214624324dd7f0751cbb17c3f3fe4c1d6928ea570a1e8ecd7dfcffc0bc47cf6b994f7ccfd4035b9eecfdb11c2f8861803400843182518c49fcc2d764746833ddc7ba9163332fcefcf3152be10761a6453cbe9d89f1ecd625720df30917d03fa20fe308517c7958220d9398c23466308b790c47b93816b0e8e3a2f9f8511b007fbd34648ff4c9e3cc1e93b00dffb11cd5cb8d8b2860c3d044abcff46dc6f4bbb0bee95fa7a8422187fddf55b9a6525b870240340463102c8e45906c8ae6305c5e57a3d9dd6af7747afb5482a896648da2d5b90cd36dd91ec7eb9b1a0ca747e399c9ec5c2a08d3519c49b2b9adc5727bb5ded9ecee5d1dee5c3c9daf35bc34c14511e423bdd844fd01bc6922b9343899048a4cd2f7ba0ebb3e0e25f5623de2a5849fb5c93c8d849394a2bc4373be18c18270ef8671a7c69127f6ddb7c2bb8fab7cff8601fa23ed772635878728b002 \ No newline at end of file diff --git a/test/e2e/stylusTestFiles/counter3.txt b/test/e2e/stylusTestFiles/counter3.txt deleted file mode 100644 index f886859a..00000000 --- a/test/e2e/stylusTestFiles/counter3.txt +++ /dev/null @@ -1 +0,0 @@ -0x7f0000000000000000000000000000000000000000000000000000000000001b6f80602b6000396000f300eff000001bb84a23924f5a5914e56a340ea897036e0c917f6465052a264bf9bf77edba8e30575d1b0457c98751305166fbd602f7583a9a3a77635247281e8730fde228ede3c2111afb24d7aa65ebee99cda424a716a5ae901891827b85ba628512fcb5f67bdf4cf7d00e8d46687bea7bf7a579230552643ad34901486b41a9966c7b66772bf500de3d01e1c1090037316c9b3bf42a08a2dbf8cda7d7bf33dd7def9d6fef24c5dbc69d28bcba92c22a3997b0c2fc59c05754aa71c93deba08e4acc4e81d005c28384df3b81ca195d955cd772d3a56b1955f5513ceb11aaf0ff94b3fcaab2bac7dd4f9aae700f1fd5903a0476c2bace9003085210ed00d192564c9f79090854c1899b390e48e94b58aa9b0c738631b4de10fd3f55cbf6ffc100e43952744a744c454750720a956b3f3795387f00083303720542e22e884d24b5412b6e10a9d50beb3349e9dd917288a10ab9e5ca21863a1795bbab6db7955b378d7b17956d2e3122558ca12500c75e33196c9949ac80a19f07aec34cb5cba5dcb3550a603ee31772fb5ef1428c0000bee79eb3d6c2330bcf8e8875cc75a87a4abb2a40ac935a3768e25a9915a9575a4015acc23ff3a3e99fb5fe1a58b62c8d640c22615780d95f3c4d48992c41d6be06304394fcc5313324a2d3cd6170d19aa063b774608e9f20cde08652d89f8659a3729b285cf19f17b3474f204f1451abd050abefb7754a1ba2ee1399f4e702da8f1c245c002512cab9289154e253293b6a3215481454546abda2fd2d35a93929a70d5285924bf226799600939bf3c88f0d6627e68987c0d5553282f9c616b7eca4b1b05df215c40bbbe5a1a3759006d11c43614f49e1e6d47b347646f28835b81b4ff3748f6dec52c7435cebd319e12055d41fff6f434d0df64ee86cb2e8f4dfb98b52c4fabd759eeaf8fe471f9ef35f0cd9b833ba8732dde215c06a2a5bdf3ec2c42dddec90386f6f2ab19e422e6fe5e6d1e5914fa1203041e09d5aea4d9d86a6e7e6d22c456a3533f3bab9d48b03ecbd6e1e11bfe6324708b1476c4c11912592f99e0ccbb7d6af9c6e5be3f43276284703786e3f52e72e4cd606537f5671ad3aa87453d67a0a754466a127a2aa4de542f6c9c8d874a81f2f46aa9c7e1f7eea28fb5f27a57438a24a4ae879a23206e8d265d953677f8add75dc379b2eb8ead523ba75f31f7d47ffbdadbfc7fca037a8edcfb2e5ca0a3353c56e6aacf7a03837bc84cd09d773a8c27ed1be35a284652bdc82115d9e3d75f6ab17a2677b7ff09fd6537af9d60f7f63ecc1672ab63fed861629071f83c2eb08f5fee9a7446de16d6e2a4ecb63c7c15b12ea648de8507853b4d2722fe1a1a14d2cfe13fca0e9388397ceb802238d2c7562707857af4143b74d2e16d8699ad2e82c24325e9e430ef9854db62bd98d921f0f70a20dc1f75ce11a2bb3535009b34b54e3d8f1977888d3ee651663d9ef62925f360e01b3e2e764641d834e3e571ad078bb41fc4dd4d3b824d8d79efc38bf105e86aaf3ad0ad7e39d9f42972daf3e859d59da966840c5aeaa58a5ccc4d7e001de0b0efa9254fe9a5f8df855758e543867fcb9aefde760f559a12177eec670c16a2a8373504703fd3514667f9de242315db9b1a07bd82df3dd62aba4af75cddba15bbd92aa6ae66d2ea4b9d02f79139b15b760ead9666a417fb21fe7fbf15580af13ef13c78ded6008f9feddf7b9cf559207bab1e7cc11b1deed25004ce121917489ae2a5b41b6a281695eefa8de180933147c6720f744170de2deafdaa74eef806e0e648b5ca84315e71da160a0af3fece1e027c6cba106b464055e13bf7921861863e1bd486571e96f5867cd0a7f40c4327e13399a7b9bd8d43329879716d9fae099d0bd5122542f26193816164318dc662ae2f9fe3367b6bfe8b4b6b154dc968adb45e45ae2586354a918d8bb29e0b8c7af53249a7ecd66849a3d6e6fa8e55a245a7cb05ceb3bd08c515d3dfee7c4c2dc747f82e811e3db3b4a8ea6217699ccd8cd4823a2cea2253f06d96ab6c1062e4d495cc0b409d87b086784e82fa8c588fb26388d89e31b8f86082dd97588d944fcadb61195ed9ed04395604cd8cb59e7f48678daccf9b9c26c9c4e73d83aab73cc210ab2c5001b93a5337673f0371706332fe9436862e2510a34be8ad350dbc0958982a07f7739a0cfddaad94084c61c637f56824ebd36cc8d9f09ec8a43405325a1743d4f8904f40b499cf5845847cdc654c234c19b4198299b68682b5d2ef86febe74c08633f42362430007b962cf7d8320eacadd33d543d90b29890396a103ead41413a1b591f09bb0bb683db833af63873cdf45b3e5065bd163fa103b37b12eb74b59dca8a8ba86220241726190532cf0f1c0c49ca5c043d0609cba0ef4a8ea6abd711d94d6b2f420319c4a95f94edd10b5c26c965b40cd2f4f0b41cc6e3ba6fb663cdf02a0a4921b03f8e81c0beb0b5a8c14c40af1cc0ca2e2fae6492da71a8cd7a2a8100e7c6071253ca1e2fcbe60a6c934dd48dc603011000bdb3f20fa63514a2618d80968dadbe06ead8a899e673a01708b71bc2801657f096a4943ce439764224b5a4422b13b29fe03446396ae2dcb59136f6ac36856a68d67b64a671d10c73d1945d6d9128a595f40b7ec8262042de0a91f600ee9197027817c86269e0c1433eea0e6a91a4d60204efab0460d145170c2432701834fa50589a9232df2773bafdc90f2a591cb7c571bb10e480c6048a5441c160c57a45d50ff89775f32f21771cf22d8a801c39d218dbeb35002102dde00b664764ce75d3f8e996bc704c6b45d92c754a51129be2d876b57f04eb347bee92a1bda651d01ddd2f91f661e279001846a718eb8b929e3237e8e86d1bf2b4935b6564a5ae524c96b2b87811cf1c7fdf84ed673f57e6881babe5cd8cc8cbbc47b3ba4570b6cfad1d3acbd6f2f5f6080b2a65af4484973e373c8de8f644a9c60d1e2ad738b974767808ab42d0c6ec689fd5b0401945951d20738ad14d3da84bd27be98c2b30d288de670a6cf7c41e10b937f14bc83dab1f8515955789d0d6587f75acaf7a103f7512d6510e610de5365d3f098806112791c214e68aea4ccbb124c5918e837f980652492ed5156b0590a8e4e0fff4acb45784674e60469919656694f93438d7c8ca5590e0b0b8c410744bfe03d18a5600b78a1202542cb1f17dcf216c0b43cfb532c5e067b4477bfebaac64c62e1e87789b483a4f6f83a5d9b4c5de84569ec47919cb77f79d10bcb913fc5d83b8f42f067f072e507e2082d72c8a82cc7248044b9240c202952a093bbbb32e35c8fed7bd83b07e4bf478f6bfd647fb398b23ffafe212a9f858a13cb13ac12758918761fcbf3e8f77e67dc6a7824d01ebf0b9e0870b56425e0bd90ad6a66427f8c936711a71377e4d4be26f33154f86496211b7fd3753f114d803214c622fb0c89b45850abec7e2d2c07c169cf1ebe0c1433eea09540c0a584f89ec5f406bad15c4c52594f234ba506820c40449dcb981f36c3daeb0f68fa975814985a06fa2fc60bd411de78d295cdc4c38d48d9a53c15e58bda37ba640c0cbcfb6384a77f4867856fa98ef98d3817706c44233e3e8b3b91740c65ab1245d91b226826e95d0587b32910c8374c54c0715e2714320f60b22a0aa8094e3cad79e4da98a8b092ed1f4cbd519832d4ad8a6e08e403caee8642e3afbbf5213563f40541f2209796916defc3890ddde65337a163e2ce1b00af50e399a0de02f2fc5cd0e894b33338364974ed51ea3b1299bb2714ff9944f6eca86a56200a7967d1afdf6d3cbd821873e28d484058fb5ebe8c710ed84ba5f558ac42f187c1fda81dafe5f42fe3137142eebff85641ba04024d76a5875f18cd574639e14b74571fbde2bad46a028bf9a4837720e7859a6fd3f07fbbed37d90f320e7bee727b2769c40ba1972097209e2827c2fbbf063c421c5f3187aeaf850fa636e300ebf3b5e4999fc3520f4abe3d546de09629c9ccb643abb1735937864bfc543f692a70d5a4f1d1f4296324f8c55d958958d953d5331cff1d7e5aef6beec55b1bf1cd46604b5bfa5a8a5aa5936e9505c6227b333d81ad35066acd50447e8ca1332982fa46bb19253a49b2a06e7322324efb9528b9bc2ee3f27c48e9943eaefd7898cfd14315b0f6372c7e48ec94e2b067245336c449187c8618b8ba9a2284ccb41615a0e0a87ca61885d214e622483becf79963be57d0150dc720467ab15ead482c9cf33bdd6134640800c87f2850b1d6cbbc9164977ec5f27e3c292d8ac7f2d2980bfa5b937a8eafd1e4a1812269bb77adf190b02aba010fadfcd5215b00fca2488b77adb2dd5cb1355fe7ad2e2747923bb2758a8a30442bba2f0d0534d02e46282a25f1975711f08f1bd08744bd3b0ffd0b866cb95e38b5043b5791e82e2af010dad09c43df8c6526d62c45601418588a4e7bed192dea004cbf5c0d62212acbf4050c53069b4566abbef9c9e96ba85f52a10ad812c0f5cd38b0263e90fcea601b56df68cce612ce61cfaaef1ca0a33e731a5588b05532ef76eb20e26ec3537715756453145d13cea9b565e8550292cdb3a5759db570af9d66555f0c9b77f9d6c3ff9367c182f01538165edf4550a7361339d5721a66bc28e8065dad9a2f68833e705b5a4604f4290d44df7c4cd2e883b1ca8ad07c46de2af2710a9602c6365cd5966ac95c8b70fa2ea75d12f29a0b569f2b48b0952e8ea78ec9bf6d2114ba553c5a41d10da1ba56273dd943b738db84d2865442d11c26a2aa7157205b992cf16a4a11af54d496a00b16acdff1bb68e5f9f39a1f35b5ccb7ee7657fcc97b744beddf15f4b1ae3c0b1c383450bf900e7dc610e8739d41d4807de08123effc55965377658eb496301869297495131e909f5a5fad0fbb54d2535965a44459918567ba100337bd1d73bbc1b908705fe465b94dd4922e63c6c6d7bad57aa03fedc5e9807cb2c391a36c7ea6b7966508eb569b770154150e27d65626d4ab38ac5f466c2b20ad3110402f7339073260c8e6d604f85904d7fffac8020281d0e5b687663a28590bd85a29bd6acd2e85bad638a8dee9ad94dc3a1d2c279433bce3b75e90adbd4a4965dfb0fed30075f7fa31747f39925f90b05f05c9d2222fa5ced9747cbfaaabb5929f7c670a5cf936b6aeaa5775a65caa465613d46d83209a03473e26e66c654ba059c595ea6d5640051c61835b29ecd83c164b1aca03796dc9b218e2c535bcacc6a54bacc7b150ede0e08734af3e2c6f35f026394ada020b4743da2c444cf8ef67926ae7eed6deffd880456280462b6082f8e66e303da2e4ca80525671269c266dca70749605520541257ad89795141106e73b8f1c2ac0a9723234831964bba756ab15b158caf8142b2d4e106d689cb2e155bde8cc17afa064968f0dd7d37bef5b563befbdb275ba05f73f067cfb91f3efa87271ebf77dc1f186037be75e9b337bffa9397dfaf1ebbcf7cf3fd733e73f65df7d831750781424761092e35ecb0a51083c2789f8220a398e8b3214596c5458ce6811c1bec0397dd89b5b5cae75b5d9d3c2f94a1a151e60f6fa0eed5a890d28b4db17e6830ddd16269d905c1f9a64990f5521618d1b04c8b8c0ebd394a6872dc9c3ba40beaf87d25ce989aa939003986faf09847a1932998fa6d60df503e3820de607bca70e8591835371959c61a590651bdc76624e7e178c9c3ccfdb7acf4472b87820f62cd9f70df7b8ad804cc83e58d873cbc59912c87ba82af154fdd78f4a4021a161a48b9ea9666a4a542e65f715f8115338eed6b6cb996780992d4a6c9ab92ead95641715893660daae8b1bb9cb95b5704ce6771570ff0a7e4bdacda7c4293266921f8eb5b8a50fb0fed8848228abd2e584697da24c89482838394ec8078208f579440b055c7e7d7f39d306f37cff7175361c2e3bccff58863643a5e884f81037357e0bcac168715e2be2f284faa69b4df78d598abd70c06ed045f451e48237a147fd8ccdf211128ae019f026c9e43f1c0e62bde3107bc89244e95c3f09cf2f6fce07c477715280c240822e924e05290515c4e9fc79a523f81065dd0639b021a09d917b50dba381b537c0c389ba3dc20bc82d7c09bb3dd2a88c0d26f853f913a4fa44cf1f8ad3a02e826267216803b34f6c752370ea48e35d6aefbee6b11867c68eaeb9f75154f23738cda76182af5e83997f0884e06ad8805531d0b613ae3f0cc3da49b8a768fca52f08438c535f1ec1ad8d69b0c01c661ae590a4b1bb8cf2cff7ee225e0bc154267615d92b971d8f5499dfc183dcc61b24b0d80e2d8ffe7b941b7a40a138db847fe261cd7204f13562964b1802c69cf3d31d5645570279e5abca1da6268c43344e42d5c626490fcbe0090694be005a8e8937aecd376036fcafe48a1dedcd8f0aa490132b1cb27c1b6b3806ccfab6443ca3705ab0609d64356bf8cb87b65a2637e17dd85f80bf2d1775ceeef17583e1f8c1f90a4c3e4764ff0b68c5f1e9e80533ab1897487bce9c05bc77d2b9734088b5cb26468bf00d0b3a02ded1976405962e301c17c2938be2090cb3693346d0e499636992dd739afc7364ec63c817ead581c1b7390f5365f441f50c17be6867c70dc8f0923f53138c2e4c5c32ad11acafa46c1396346b8a30acdd79668bd627b932c979be09ec556900cb8a9b06f0abb6bc920d95d8b698d637ab76205175ca7c5360e0fc8b7d7da26d56cc60e0a9920960bbec01e241eeb804d47f3c77ffa177a3f06ea805bfa93a5c58b0670a5e39cf589002405b9f18f7517e9574402895be44a8c44773e25d79ba8e56e01f1845d0a31357a0ab7dbe30267672f904d2019e18e45d2180991a50f881ac715335026425425206dfe0e86178a48d47b856094cfdba4ad6768b377fba49f1cebea805384ca4d08719cb45047b56cecd53468214f43de5f4c6913f9d1b4538761d4e9759ec1fbb2b55c3aa444e6511403aa73b4ebf2e472c50fe1ba1aa129186757eb6db28c47cd26e6b4136ab103b11665bb2e1c6214993522ccda2667611becb21ee6085d2cf2611da5806f515af26eb2a81481c82acde9f2ee3615cfc1d94abe51c76d086559e97f94cc603246f01cee8316b6583ac940276679a6409c0400b7d6a99d4e1de9f40ae7f571ad8fd026b8544edf34a15919cbae479499c983d5a7e6c903adcf8c0ca3953ad82d72a0fb68da5e7916cd266d03fec93eae0b4697e68f6f6a6125b954f633699b69328dd358e63fc5d9b29a4d47279afc9791b59e598653891b656ead2713160dd3622629439f204a884374103b49b4177ea5e961b10be35aa0b60968df76dedbb6a4df6619c029e478dfa468444b94d90a70e821eff4f989e76de6137ebac6ac25e9c9da3a2fd9182608fc7e670c01dc066424034a9e173562369ab800441b8d423a2b1b735f15249d4e19a49a6dbf893119ab29fb5103172dc9ec780bea178ad8a010d4c6cd8ac1360a63db1b773775353a22db28738546a2052ba459cc7a4f7930c36b83165bd592e6401726661c27bb65eb08d1ef48672ae0023411ec7a03e212f21ef10c0d5b4bd35b27183f5787cba5a221cc1b3d866060ad5a63f435e677bc0bde18e9341fcc1f922b5fc3577105f255b2329b301846981e26bc3d2ec854ee573a2e506df0f237f7da1d7d784e94b81b4b345d2f074c3beaca61256c4a88ec66077b608bb95ed5500d43b81364213a6028753b3462f5bc4eb0000aa7da3cef00ba20f4e1922b727f4118fa02056aa0e268eb813c84960f9817b40f083d0137afce1baf7210af4bcede585c168d13ff7d63e22cfb2c64405ac70416d1cb320df704f22999c44995a9262273ce84638591c5ba4e90acb3e08bc45e02f3e43ed7e7fa5cdfc3e0e5e10fbb05f3e0771ff88af0153f2ebb5d6006e9ddd92f22c434245d3ae9e30c313a5766dd0a289a4fb4059c0f5219e7c1fe07aac4225d916296e2155a49515971611b20e85bb3fd68a8887fce1317aad3aa1d498f505bbd3a2deafc189f226997c69d50c7d765fef8e368896de593e596b160649d72e41e39d00e2b8fc65f5ee8e6a624cb6cee0503c3e0f0c68f0eebdd7e098f5cf9080bcd473027169347fa27e98884546358f3e80d332cb63cbe5a6a50026d79edd705ec32c23742d2b6d504a396e8fda54469c9bcb29256e798f30c0346eb3ab6032c286dd2b68eaa21091a37379aaefe0ad7627a9d3225bb5cc1a76e6c08b3b5055495c4bc310ca93c566ddddfe014b84ea4c95dd6ff38574ad5a413dda0406f4aaaa98b7b9191537658374aca18c8060c8ece0d1c5ddf891a78d11e0eed180c0953aea152444de87767078bd68fadc95d0299a81b00852efc5e6e5c3bb4ad15dfb85019edeeb9a57b71e682ba0bcae677cb6e8c77435817903850a1639dad0da1e48e1255dadffd6f6b625fcf9ada9d65e7952b3e96945eb2995d8cfec5a42a9d709b3665106198c5ed2be60e9f6802d056f7ea26577266d0bda5613c0fc4cc190570eb905c75c0ca5440d55a52aba37410cee1c2858b871d82cb5d1046ee73a078c0c5d963bb25da5ac5ac2bdd04cef4c45394516939391186dccbdddc52dfd7a102d08010b87e6e6e397e38bc8332f671cb57547067c18ada7d8375e99417c00d9146b3c82353f8c88275358caad6024c2fa02f3be72dd93b7196fb69faa738c2b48fe5a1b996db438e5197f572f42998ce7140a67e077db3d4bff9cd098f2cfb1625b0f1dbad4f40d9985ef9907d29a9cb526fd174e3af905a896c68aa9d7347eb9816f0481b56ad2b451b57c469c1ddafe1d64ddb7faad53eb975e23cb2fdee91a13d2bd200b4079b165c9eeff51edbac929298ab0d8973d32aea9b57765f302f8c4264603a5f57ec4d0dd1c5e22d732f4a9e0e371ede554d6fd7be09f70dead7cd67e20071b85dbf6b50ad2cd3b8ce2dd7c5f3eb0cb3a26014c1a37db3ea947d4aa98bcce2b9f7f7d206456d75c2ff0b9045ad05e840991db4683691cdd859f2f6a7397a78add198fa7708edb3721a973d06d9df88b58f7eed112ef020352365e42731b78430723607814c9ba34aad6bd72c7486af908e9786ba6c18875424a6d9b8db64e80ec81640c4c9bacbed5f82f45043ba07423cd6d976d45943a0d1da302a71496637e40b769782c5fc71103e82d21272cea88ce91ffa3c211142f4e91d117139441dcd4d14ebfb52accdeb0ff927bf5fe6c155f87d86495decbfc986f0da867af214a787f3710c799a57bc7f0097009c0054805f0068421a8e6f777b68b4daa523b72c7d831bd3bfa19e7d207e4ad408a04344a559e1d7834efead3010a0aa08e4fc4f0df267c8da776cf894fa3682c721149ec5f4d77b78b69f7a338ccbc9af7a83dc1cdbf099a53d601de90a8bb844589823e211029f510868877204d04f1b592667dec5f9196cc98fc0f72a463091e1e1771d93f9214624324dd7f0751cbb17c3f3fe4c1d6928ea570a1e8ecd7dfcffc0bc47cf6b994f7ccfd4035b9eecfdb11c2f8861803400843182518c49fcc2d764746833ddc7ba9163332fcefcf3152be10761a6453cbe9d89f1ecd625720df30917d03fa20fe308517c7958220d9398c23466308b790c47b93816b0e8e3a2f9f8511b007fbd34648ff4c9e3cc1e93b00dffb11cd5cb8d8b2860c3d044abcff46dc6f4bbb0bee95fa7a8422187fddf55b9a6525b870240340463102c8e45906c8ae6305c5e57a3d9dd6af7747afb5482a896648da2d5b90cd36dd91ec7eb9b1a0ca747e399c9ec5c2a08d3519c49b2b9adc5727bb5ded9ecee5d1dee5c3c9daf35bc34c14511e423bdd844fd01bc6922b9343899048a4cd2f7ba0ebb3e0e25f5623de2a5849fb5c93c8d849394a2bc4373be18c18270ef8671a7c69127f6ddb7c2bb8fab7cff8601fa23ed772635878728b002 \ No newline at end of file diff --git a/test/e2e/stylusTestFiles/counter4.txt b/test/e2e/stylusTestFiles/counter4.txt deleted file mode 100644 index 5a7cd7ad..00000000 --- a/test/e2e/stylusTestFiles/counter4.txt +++ /dev/null @@ -1 +0,0 @@ -0x7f0000000000000000000000000000000000000000000000000000000000001b6f80602b6000396000f300eff000001bb84a23924f5a5914e56a340ea897036e0c917f6465052a264bf9bf77edba8e30575d1b0457c98751305166fbd602f7583a9a3a77635247281e8730fde228ede3c2111afb24d7aa65ebee99cda424a716a5ae901891827b85ba628512fcb5f67bdf4cf7d00e8d46687bea7bf7a579230552643ad34901486b41a9966c7b66772bf500de3d01e1c1090037316c9b3bf42a08a2dbf8cda7d7bf33dd7def9d6fef24c5dbc69d28bcba92c22a3997b0c2fc59c05754aa71c93deba08e4acc4e81d005c28384df3b81ca195d955cd772d3a56b1955f5513ceb11aaf0ff94b3fcaab2bac7dd4f9aae700f1fd5903a0476c2bace9003085210ed00d192564c9f79090854c1899b390e48e94b58aa9b0c738631b4de10fd3f55cbf6ffc100e43952744a744c454750720a956b3f3795387f00083303720542e22e884d24b5412b6e10a9d50beb3349e9dd917288a10ab9e5ca21863a1795bbab6db7955b378d7b17956d2e3122558ca12500c75e33196c9949ac80a19f07aec34cb5cba5dcb3550a603ee31772fb5ef1428c0000bee79eb3d6c2330bcf8e8875cc75a87a4abb2a40ac935a3768e25a9915a9575a4015acc23ff3a3e99fb5fe1a58b62c8d640c22615780d95f3c4d48992c41d6be06304394fcc5313324a2d3cd6170d19aa063b774608e9f20cde08652d89f8659a3729b285cf19f17b3474f204f1451abd050abefb7754a1ba2ee1399f4e702da8f1c245c002512cab9289154e253293b6a3215481454546abda2fd2d35a93929a70d5285924bf226799600939bf3c88f0d6627e68987c0d5553282f9c616b7eca4b1b05df215c40bbbe5a1a3759006d11c43614f49e1e6d47b347646f28835b81b4ff3748f6dec52c7435cebd319e12055d41fff6f434d0df64ee86cb2e8f4dfb98b52c4fabd759eeaf8fe471f9ef35f0cd9b833ba8732dde215c06a2a5bdf3ec2c42dddec90386f6f2ab19e422e6fe5e6d1e5914fa1203041e09d5aea4d9d86a6e7e6d22c456a3533f3bab9d48b03ecbd6e1e11bfe6324708b1476c4c11912592f99e0ccbb7d6af9c6e5be3f43276284703786e3f52e72e4cd606537f5671ad3aa87453d67a0a754466a127a2aa4de542f6c9c8d874a81f2f46aa9c7e1f7eea28fb5f27a57438a24a4ae879a23206e8d265d953677f8add75dc379b2eb8ead523ba75f31f7d47ffbdadbfc7fca037a8edcfb2e5ca0a3353c56e6aacf7a03837bc84cd09d773a8c27ed1be35a284652bdc82115d9e3d75f6ab17a2677b7ff09fd6537af9d60f7f63ecc1672ab63fed861629071f83c2eb08f5fee9a7446de16d6e2a4ecb63c7c15b12ea648de8507853b4d2722fe1a1a14d2cfe13fca0e9388397ceb802238d2c7562707857af4143b74d2e16d8699ad2e82c24325e9e430ef9854db62bd98d921f0f70a20dc1f75ce11a2bb3535009b34b54e3d8f1977888d3ee651663d9ef62925f360e01b3e2e764641d834e3e571ad078bb41fc4dd4d3b824d8d79efc38bf105e86aaf3ad0ad7e39d9f42972daf3e859d59da966840c5aeaa58a5ccc4d7e001de0b0efa9254fe9a5f8df855758e543867fcb9aefde760f559a12177eec670c16a2a8373504703fd3514667f9de242315db9b1a07bd82df3dd62aba4af75cddba15bbd92aa6ae66d2ea4b9d02f79139b15b760ead9666a417fb21fe7fbf15580af13ef13c78ded6008f9feddf7b9cf559207bab1e7cc11b1deed25004ce121917489ae2a5b41b6a281695eefa8de180933147c6720f744170de2deafdaa74eef806e0e648b5ca84315e71da160a0af3fece1e027c6cba106b464055e13bf7921861863e1bd486571e96f5867cd0a7f40c4327e13399a7b9bd8d43329879716d9fae099d0bd5122542f26193816164318dc662ae2f9fe3367b6bfe8b4b6b154dc968adb45e45ae2586354a918d8bb29e0b8c7af53249a7ecd66849a3d6e6fa8e55a245a7cb05ceb3bd08c515d3dfee7c4c2dc747f82e811e3db3b4a8ea6217699ccd8cd4823a2cea2253f06d96ab6c1062e4d495cc0b409d87b086784e82fa8c588fb26388d89e31b8f86082dd97588d944fcadb61195ed9ed04395604cd8cb59e7f48678daccf9b9c26c9c4e73d83aab73cc210ab2c5001b93a5337673f0371706332fe9436862e2510a34be8ad350dbc0958982a07f7739a0cfddaad94084c61c637f56824ebd36cc8d9f09ec8a43405325a1743d4f8904f40b499cf5845847cdc654c234c19b4198299b68682b5d2ef86febe74c08633f42362430007b962cf7d8320eacadd33d543d90b29890396a103ead41413a1b591f09bb0bb683db833af63873cdf45b3e5065bd163fa103b37b12eb74b59dca8a8ba86220241726190532cf0f1c0c49ca5c043d0609cba0ef4a8ea6abd711d94d6b2f420319c4a95f94edd10b5c26c965b40cd2f4f0b41cc6e3ba6fb663cdf02a0a4921b03f8e81c0beb0b5a8c14c40af1cc0ca2e2fae6492da71a8cd7a2a8100e7c6071253ca1e2fcbe60a6c934dd48dc603011000bdb3f20fa63514a2618d80968dadbe06ead8a899e673a01708b71bc2801657f096a4943ce439764224b5a4422b13b29fe03446396ae2dcb59136f6ac36856a68d67b64a671d10c73d1945d6d9128a595f40b7ec8262042de0a91f600ee9197027817c86269e0c1433eea0e6a91a4d60204efab0460d145170c2432701834fa50589a9232df2773bafdc90f2a591cb7c571bb10e480c6048a5441c160c57a45d50ff89775f32f21771cf22d8a801c39d218dbeb35002102dde00b664764ce75d3f8e996bc704c6b45d92c754a51129be2d876b57f04eb347bee92a1bda651d01ddd2f91f661e279001846a718eb8b929e3237e8e86d1bf2b4935b6564a5ae524c96b2b87811cf1c7fdf84ed673f57e6881babe5cd8cc8cbbc47b3ba4570b6cfad1d3acbd6f2f5f6080b2a65af4484973e373c8de8f644a9c60d1e2ad738b974767808ab42d0c6ec689fd5b0401945951d20738ad14d3da84bd27be98c2b30d288de670a6cf7c41e10b937f14bc83dab1f8515955789d0d6587f75acaf7a103f7512d6510e610de5365d3f098806112791c214e68aea4ccbb124c5918e837f980652492ed5156b0590a8e4e0fff4acb45784674e60469919656694f93438d7c8ca5590e0b0b8c4104c4bfe03d18a5600b78a1202542cb1f17dcf216c0b43cfb532c5e067b4477bfebaac64c62e1e87789b483a4f6f83a5d9b4c5de84569ec47919cb77f79d10bcb913fc5d83b8f42f067f072e507e2082d72c8a82cc7248044b9240c202952a093bbbb32e35c8fed7bd83b07e4bf478f6bfd647fb398b23ffafe212a9f858a13cb13ac12758918761fcbf3e8f77e67dc6a7824d01ebf0b9e0870b56425e0bd90ad6a66427f8c936711a71377e4d4be26f33154f86496211b7fd3753f114d803214c622fb0c89b45850abec7e2d2c07c169cf1ebe0c1433eea09540c0a584f89ec5f406bad15c4c52594f234ba506820c40449dcb981f36c3daeb0f68fa975814985a06fa2fc60bd411de78d295cdc4c38d48d9a53c15e58bda37ba640c0cbcfb6384a77f4867856fa98ef98d3817706c44233e3e8b3b91740c65ab1245d91b226826e95d0587b32910c8374c54c0715e2714320f60b22a0aa8094e3cad79e4da98a8b092ed1f4cbd519832d4ad8a6e08e403caee8642e3afbbf5213563f40541f2209796916defc3890ddde65337a163e2ce1b00af50e399a0de02f2fc5cd0e894b33338364974ed51ea3b1299bb2714ff9944f6eca86a56200a7967d1afdf6d3cbd821873e28d484058fb5ebe8c710ed84ba5f558ac42f187c1fda81dafe5f42fe3137142eebff85641ba04024d76a5875f18cd574639e14b74571fbde2bad46a028bf9a4837720e7859a6fd3f07fbbed37d90f320e7bee727b2769c40ba1972097209e2827c2fbbf063c421c5f3187aeaf850fa636e300ebf3b5e4999fc3520f4abe3d546de09629c9ccb643abb1735937864bfc543f692a70d5a4f1d1f4296324f8c55d958958d953d5331cff1d7e5aef6beec55b1bf1cd46604b5bfa5a8a5aa5936e9505c6227b333d81ad35066acd50447e8ca1332982fa46bb19253a49b2a06e7322324efb9528b9bc2ee3f27c48e9943eaefd7898cfd14315b0f6372c7e48ec94e2b067245336c449187c8618b8ba9a2284ccb41615a0e0a87ca61885d214e622483becf79963be57d0150dc720467ab15ead482c9cf33bdd6134640800c87f2850b1d6cbbc9164977ec5f27e3c292d8ac7f2d2980bfa5b937a8eafd1e4a1812269bb77adf190b02aba010fadfcd5215b00fca2488b77adb2dd5cb1355fe7ad2e2747923bb2758a8a30442bba2f0d0534d02e46282a25f1975711f08f1bd08744bd3b0ffd0b866cb95e38b5043b5791e82e2af010dad09c43df8c6526d62c45601418588a4e7bed192dea004cbf5c0d62212acbf4050c53069b4566abbef9c9e96ba85f52a10ad812c0f5cd38b0263e90fcea601b56df68cce612ce61cfaaef1ca0a33e731a5588b05532ef76eb20e26ec3537715756453145d13cea9b565e8550292cdb3a5759db570af9d66555f0c9b77f9d6c3ff9367c182f01538165edf4550a7361339d5721a66bc28e8065dad9a2f68833e705b5a4604f4290d44df7c4cd2e883b1ca8ad07c46de2af2710a9602c6365cd5966ac95c8b70fa2ea75d12f29a0b569f2b48b0952e8ea78ec9bf6d2114ba553c5a41d10da1ba56273dd943b738db84d2865442d11c26a2aa7157205b992cf16a4a11af54d496a00b16acdff1bb68e5f9f39a1f35b5ccb7ee7657fcc97b744beddf15f4b1ae3c0b1c383450bf900e7dc610e8739d41d4807de08123effc55965377658eb496301869297495131e909f5a5fad0fbb54d2535965a44459918567ba100337bd1d73bbc1b908705fe465b94dd4922e63c6c6d7bad57aa03fedc5e9807cb2c391a36c7ea6b7966508eb569b770154150e27d65626d4ab38ac5f466c2b20ad3110402f7339073260c8e6d604f85904d7fffac8020281d0e5b687663a28590bd85a29bd6acd2e85bad638a8dee9ad94dc3a1d2c279433bce3b75e90adbd4a4965dfb0fed30075f7fa31747f39925f90b05f05c9d2222fa5ced9747cbfaaabb5929f7c670a5cf936b6aeaa5775a65caa465613d46d83209a03473e26e66c654ba059c595ea6d5640051c61835b29ecd83c164b1aca03796dc9b218e2c535bcacc6a54bacc7b150ede0e08734af3e2c6f35f026394ada020b4743da2c444cf8ef67926ae7eed6deffd880456280462b6082f8e66e303da2e4ca80525671269c266dca70749605520541257ad89795141106e73b8f1c2ac0a9723234831964bba756ab15b158caf8142b2d4e106d689cb2e155bde8cc17afa064968f0dd7d37bef5b563befbdb275ba05f73f067cfb91f3efa87271ebf77dc1f186037be75e9b337bffa9397dfaf1ebbcf7cf3fd733e73f65df7d831750781424761092e35ecb0a51083c2789f8220a398e8b3214596c5458ce6811c1bec0397dd89b5b5cae75b5d9d3c2f94a1a151e60f6fa0eed5a890d28b4db17e6830ddd16269d905c1f9a64990f5521618d1b04c8b8c0ebd394a6872dc9c3ba40beaf87d25ce989aa939003986faf09847a1932998fa6d60df503e3820de607bca70e8591835371959c61a590651bdc76624e7e178c9c3ccfdb7acf4472b87820f62cd9f70df7b8ad804cc83e58d873cbc59912c87ba82af154fdd78f4a4021a161a48b9ea9666a4a542e65f715f8115338eed6b6cb996780992d4a6c9ab92ead95641715893660daae8b1bb9cb95b5704ce6771570ff0a7e4bdacda7c4293266921f8eb5b8a50fb0fed8848228abd2e584697da24c89482838394ec8078208f579440b055c7e7d7f39d306f37cff7175361c2e3bccff58863643a5e884f81037357e0bcac168715e2be2f284faa69b4df78d598abd70c06ed045f451e48237a147fd8ccdf211128ae019f026c9e43f1c0e62bde3107bc89244e95c3f09cf2f6fce07c477715280c240822e924e05290515c4e9fc79a523f81065dd0639b021a09d917b50dba381b537c0c389ba3dc20bc82d7c09bb3dd2a88c0d26f853f913a4fa44cf1f8ad3a02e826267216803b34f6c752370ea48e35d6aefbee6b11867c68eaeb9f75154f23738cda76182af5e83997f0884e06ad8805531d0b613ae3f0cc3da49b8a768fca52f08438c535f1ec1ad8d69b0c01c661ae590a4b1bb8cf2cff7ee225e0bc154267615d92b971d8f5499dfc183dcc61b24b0d80e2d8ffe7b941b7a40a138db847fe261cd7204f13562964b1802c69cf3d31d5645570279e5abca1da6268c43344e42d5c626490fcbe0090694be005a8e8937aecd376036fcafe48a1dedcd8f0aa490132b1cb27c1b6b3806ccfab6443ca3705ab0609d64356bf8cb87b65a2637e17dd85f80bf2d1775ceeef17583e1f8c1f90a4c3e4764ff0b68c5f1e9e80533ab1897487bce9c05bc77d2b9734088b5cb26468bf00d0b3a02ded1976405962e301c17c2938be2090cb3693346d0e499636992dd739afc7364ec63c817ead581c1b7390f5365f441f50c17be6867c70dc8f0923f53138c2e4c5c32ad11acafa46c1396346b8a30acdd79668bd627b932c979be09ec556900cb8a9b06f0abb6bc920d95d8b698d637ab76205175ca7c5360e0fc8b7d7da26d56cc60e0a9920960bbec01e241eeb804d47f3c77ffa177a3f06ea805bfa93a5c58b0670a5e39cf589002405b9f18f7517e9574402895be44a8c44773e25d79ba8e56e01f1845d0a31357a0ab7dbe30267672f904d2019e18e45d2180991a50f881ac715335026425425206dfe0e86178a48d47b856094cfdba4ad6768b377fba49f1cebea805384ca4d08719cb45047b56cecd53468214f43de5f4c6913f9d1b4538761d4e9759ec1fbb2b55c3aa444e6511403aa73b4ebf2e472c50fe1ba1aa129186757eb6db28c47cd26e6b4136ab103b11665bb2e1c6214993522ccda2667611becb21ee6085d2cf2611da5806f515af26eb2a81481c82acde9f2ee3615cfc1d94abe51c76d086559e97f94cc603246f01cee8316b6583ac940276679a6409c0400b7d6a99d4e1de9f40ae7f571ad8fd026b8544edf34a15919cbae479499c983d5a7e6c903adcf8c0ca3953ad82d72a0fb68da5e7916cd266d03fec93eae0b4697e68f6f6a6125b954f633699b69328dd358e63fc5d9b29a4d47279afc9791b59e598653891b656ead2713160dd3622629439f204a884374103b49b4177ea5e961b10be35aa0b60968df76dedbb6a4df6619c029e478dfa468444b94d90a70e821eff4f989e76de6137ebac6ac25e9c9da3a2fd9182608fc7e670c01dc066424034a9e173562369ab800441b8d423a2b1b735f15249d4e19a49a6dbf893119ab29fb5103172dc9ec780bea178ad8a010d4c6cd8ac1360a63db1b773775353a22db28738546a2052ba459cc7a4f7930c36b83165bd592e6401726661c27bb65eb08d1ef48672ae0023411ec7a03e212f21ef10c0d5b4bd35b27183f5787cba5a221cc1b3d866060ad5a63f435e677bc0bde18e9341fcc1f922b5fc3577105f255b2329b301846981e26bc3d2ec854ee573a2e506df0f237f7da1d7d784e94b81b4b345d2f074c3beaca61256c4a88ec66077b608bb95ed5500d43b81364213a6028753b3462f5bc4eb0000aa7da3cef00ba20f4e1922b727f4118fa02056aa0e268eb813c84960f9817b40f083d0137afce1baf7210af4bcede585c168d13ff7d63e22cfb2c64405ac70416d1cb320df704f22999c44995a9262273ce84638591c5ba4e90acb3e08bc45e02f3e43ed7e7fa5cdfc3e0e5e10fbb05f3e0771ff88af0153f2ebb5d6006e9ddd92f22c434245d3ae9e30c313a5766dd0a289a4fb4059c0f5219e7c1fe07aac4225d916296e2155a49515971611b20e85bb3fd68a8887fce1317aad3aa1d498f505bbd3a2deafc189f226997c69d50c7d765fef8e368896de593e596b160649d72e41e39d00e2b8fc65f5ee8e6a624cb6cee0503c3e0f0c68f0eebdd7e098f5cf9080bcd473027169347fa27e98884546358f3e80d332cb63cbe5a6a50026d79edd705ec32c23742d2b6d504a396e8fda54469c9bcb29256e798f30c0346eb3ab6032c286dd2b68eaa21091a37379aaefe0ad7627a9d3225bb5cc1a76e6c08b3b5055495c4bc310ca93c566ddddfe014b84ea4c95dd6ff38574ad5a413dda0406f4aaaa98b7b9191537658374aca18c8060c8ece0d1c5ddf891a78d11e0eed180c0953aea152444de87767078bd68fadc95d0299a81b00852efc5e6e5c3bb4ad15dfb85019edeeb9a57b71e682ba0bcae677cb6e8c77435817903850a1639dad0da1e48e1255dadffd6f6b625fcf9ada9d65e7952b3e96945eb2995d8cfec5a42a9d709b3665106198c5ed2be60e9f6802d056f7ea26577266d0bda5613c0fc4cc190570eb905c75c0ca5440d55a52aba37410cee1c2858b871d82cb5d1046ee73a078c0c5d963bb25da5ac5ac2bdd04cef4c45394516939391186dccbdddc52dfd7a102d08010b87e6e6e397e38bc8332f671cb57547067c18ada7d8375e99417c00d9146b3c82353f8c88275358caad6024c2fa02f3be72dd93b7196fb69faa738c2b48fe5a1b996db438e5197f572f42998ce7140a67e077db3d4bff9cd098f2cfb1625b0f1dbad4f40d9985ef9907d29a9cb526fd174e3af905a896c68aa9d7347eb9816f0481b56ad2b451b57c469c1ddafe1d64ddb7faad53eb975e23cb2fdee91a13d2bd200b4079b165c9eeff51edbac929298ab0d8973d32aea9b57765f302f8c4264603a5f57ec4d0dd1c5e22d732f4a9e0e371ede554d6fd7be09f70dead7cd67e20071b85dbf6b50ad2cd3b8ce2dd7c5f3eb0cb3a26014c1a37db3ea947d4aa98bcce2b9f7f7d206456d75c2ff0b9045ad05e840991db4683691cdd859f2f6a7397a78add198fa7708edb3721a973d06d9df88b58f7eed112ef020352365e42731b78430723607814c9ba34aad6bd72c7486af908e9786ba6c18875424a6d9b8db64e80ec81640c4c9bacbed5f82f45043ba07423cd6d976d45943a0d1da302a71496637e40b769782c5fc71103e82d21272cea88ce91ffa3c211142f4e91d117139441dcd4d14ebfb52accdeb0ff927bf5fe6c155f87d86495decbfc986f0da867af214a787f3710c799a57bc7f0097009c0054805f0068421a8e6f777b68b4daa523b72c7d831bd3bfa19e7d207e4ad408a04344a559e1d7834efead3010a0aa08e4fc4f0df267c8da776cf894fa3682c721149ec5f4d77b78b69f7a338ccbc9af7a83dc1cdbf099a53d601de90a8bb844589823e211029f510868877204d04f1b592667dec5f9196cc98fc0f72a463091e1e1771d93f9214624324dd7f0751cbb17c3f3fe4c1d6928ea570a1e8ecd7dfcffc0bc47cf6b994f7ccfd4035b9eecfdb11c2f8861803400843182518c49fcc2d764746833ddc7ba9163332fcefcf3152be10761a6453cbe9d89f1ecd625720df30917d03fa20fe308517c7958220d9398c23466308b790c47b93816b0e8e3a2f9f8511b007fbd34648ff4c9e3cc1e93b00dffb11cd5cb8d8b2860c3d044abcff46dc6f4bbb0bee95fa7a8422187fddf55b9a6525b870240340463102c8e45906c8ae6305c5e57a3d9dd6af7747afb5482a896648da2d5b90cd36dd91ec7eb9b1a0ca747e399c9ec5c2a08d3519c49b2b9adc5727bb5ded9ecee5d1dee5c3c9daf35bc34c14511e423bdd844fd01bc6922b9343899048a4cd2f7ba0ebb3e0e25f5623de2a5849fb5c93c8d849394a2bc4373be18c18270ef8671a7c69127f6ddb7c2bb8fab7cff8601fa23ed772635878728b002 \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b79c08ff..4f89f0ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@arbitrum/sdk@^3.7.2": - version "3.7.2" - resolved "https://registry.yarnpkg.com/@arbitrum/sdk/-/sdk-3.7.2.tgz#748b81dd0e365dcd3808e7b2d6ea2ac733964b5e" - integrity sha512-oW2sg/a2MUc8HfvVFkasl6TY539xJ8HBjVnVEC9v31Sxnz+5Kpqpauct7zFTE4HepXUy5S7GPX8K9lq52du+Fw== +"@arbitrum/sdk@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@arbitrum/sdk/-/sdk-3.7.3.tgz#329f07bd1006c36abc138979406a5dc465a5370d" + integrity sha512-7nyPm7032+RyjfIFpJf7EKN6EQTtjEzGGemz6NgFzEFLmKj1q+QMRVj9yYKVjIM2lPMKh7Qv+DX6emsxy/5FdQ== dependencies: "@ethersproject/address" "^5.0.8" "@ethersproject/bignumber" "^5.1.1"