From f88a4a84f74d668d16af51c8e5db709f1b5dd632 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Sat, 13 Dec 2025 16:53:52 +0400 Subject: [PATCH 01/26] wip on proxy agnostic --- script/Deploy.sol | 40 +------------------ src/abstract/ReceiptVault.sol | 31 ++++---------- .../vault/ERC20PriceOracleReceiptVault.sol | 30 +++++--------- .../vault/OffchainAssetReceiptVault.sol | 26 +++--------- .../ERC20PriceOracleReceiptVaultTest.sol | 6 +-- test/concrete/ConcreteReceiptVault.sol | 4 +- ...LibERC20PriceOracleReceiptVaultCreator.sol | 8 ++-- test/lib/LibOffchainAssetVaultCreator.sol | 8 ++-- test/src/abstract/ReceiptVault.decimals.t.sol | 4 +- ...VaultPaymentMintAuthorizerV1.deposit.t.sol | 12 +++--- ...C20PriceOracleReceiptVault.construct.t.sol | 6 +-- .../OffchainAssetReceiptVault.construct.t.sol | 18 ++++----- 12 files changed, 57 insertions(+), 136 deletions(-) diff --git a/script/Deploy.sol b/script/Deploy.sol index c3a768b4..8ce9a8c0 100644 --- a/script/Deploy.sol +++ b/script/Deploy.sol @@ -5,9 +5,9 @@ pragma solidity =0.8.25; import {Script} from "forge-std/Script.sol"; import { ERC20PriceOracleReceiptVault, - ERC20PriceOracleVaultConfig + ERC20PriceOracleReceiptVaultConfigV2 } from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; -import {VaultConfig} from "src/abstract/ReceiptVault.sol"; +import {ReceiptVaultConfigV2} from "src/abstract/ReceiptVault.sol"; import {ICloneableFactoryV2} from "rain.factory/interface/ICloneableFactoryV2.sol"; import { OffchainAssetReceiptVault, @@ -26,7 +26,6 @@ import {OffchainAssetReceiptVaultPaymentMintAuthorizerV1} from bytes32 constant DEPLOYMENT_SUITE_IMPLEMENTATIONS = keccak256("implementations"); bytes32 constant DEPLOYMENT_SUITE_OWNABLE_ORACLE_VAULT = keccak256("ownable-oracle-vault"); -bytes32 constant DEPLOYMENT_SUITE_STAKED_FLR_PRICE_VAULT = keccak256("sceptre-staked-flare-price-vault"); /// @title Deploy /// This is intended to be run on every commit by CI to a testnet such as mumbai, @@ -48,47 +47,12 @@ contract Deploy is Script { vm.stopBroadcast(); } - function deployStakedFlrPriceVault(uint256 deploymentKey) internal { - vm.startBroadcast(deploymentKey); - //forge-lint: disable-next-line(mixed-case-variable) - IPriceOracleV2 ftsoV2LTSFeedOracle = IPriceOracleV2( - new FtsoV2LTSFeedOracle( - FtsoV2LTSFeedOracleConfig({ - feedId: FLR_USD_FEED_ID, - // 30 mins. - staleAfter: 1800 - }) - ) - ); - IPriceOracleV2 stakedFlrOracle = new SceptreStakedFlrOracle(); - IPriceOracleV2 twoPriceOracle = IPriceOracleV2( - new TwoPriceOracleV2(TwoPriceOracleConfigV2({base: ftsoV2LTSFeedOracle, quote: stakedFlrOracle})) - ); - - ICloneableFactoryV2(vm.envAddress("CLONE_FACTORY")).clone( - vm.envAddress("ERC20_PRICE_ORACLE_VAULT_IMPLEMENTATION"), - abi.encode( - ERC20PriceOracleVaultConfig({ - priceOracle: twoPriceOracle, - vaultConfig: VaultConfig({ - asset: address(SFLR_CONTRACT), - name: vm.envString("RECEIPT_VAULT_NAME"), - symbol: vm.envString("RECEIPT_VAULT_SYMBOL") - }) - }) - ) - ); - vm.stopBroadcast(); - } - function run() external { uint256 deployerPrivateKey = vm.envUint("DEPLOYMENT_KEY"); bytes32 suite = keccak256(bytes(vm.envString("DEPLOYMENT_SUITE"))); if (suite == DEPLOYMENT_SUITE_IMPLEMENTATIONS) { deployImplementations(deployerPrivateKey); - } else if (suite == DEPLOYMENT_SUITE_STAKED_FLR_PRICE_VAULT) { - deployStakedFlrPriceVault(deployerPrivateKey); } else { revert("Unknown deployment suite"); } diff --git a/src/abstract/ReceiptVault.sol b/src/abstract/ReceiptVault.sol index 87ded345..4deafdbd 100644 --- a/src/abstract/ReceiptVault.sol +++ b/src/abstract/ReceiptVault.sol @@ -52,26 +52,17 @@ struct ReceiptVaultConstructionConfigV2 { IReceiptV3 receiptImplementation; } -/// All config required to initialize `ReceiptVault` except the receipt address. -/// Included as a field on `ReceiptVaultConfig` which is the full initialization -/// config struct. This is used by the `ReceiptVaultFactory` which will create a -/// new receipt in the same transaction and build the full `ReceiptVaultConfig`. +/// All config required to initialize `ReceiptVault`. +/// @param receipt The `Receipt` e.g. built by `ReceiptVaultFactory` that is +/// owned by the `ReceiptVault` as an `IReceiptOwnerV1`. /// @param asset As per ERC4626. /// @param name As per ERC20. /// @param symbol As per ERC20. -struct VaultConfig { +struct ReceiptVaultConfigV2 { address asset; string name; string symbol; -} - -/// All config required to initialize `ReceiptVault`. -/// @param receipt The `Receipt` e.g. built by `ReceiptVaultFactory` that is -/// owned by the `ReceiptVault` as an `IReceiptOwnerV1`. -/// @param vaultConfig all the vault configuration as `VaultConfig`. -struct ReceiptVaultConfig { address receipt; - VaultConfig vaultConfig; } /// @title ReceiptVault @@ -164,23 +155,15 @@ abstract contract ReceiptVault is // solhint-disable-next-line func-name-mixedcase // slither-disable-start naming-convention // forge-lint: disable-next-line(mixed-case-function) - function __ReceiptVault_init(VaultConfig memory config) internal virtual { + function __ReceiptVault_init(ReceiptVaultConfigV2 memory config) internal virtual { __Multicall_init(); __ERC20_init(config.name, config.symbol); - // Slither false positive here due to it being impossible to set the - // receipt before it has been deployed. - // slither-disable-next-line reentrancy-benign - IReceiptV3 managedReceipt = - IReceiptV3(I_FACTORY.clone(address(I_RECEIPT_IMPLEMENTATION), abi.encode(address(this)))); - ReceiptVaultV17201Storage storage s = getStorageReceiptVault(); s.asset = IERC20(config.asset); - s.receipt = managedReceipt; + s.receipt = IReceiptV3(config.receipt); - // Sanity check here. Should always be true as we cloned the receipt - // from the factory ourselves just above. - address receiptManager = managedReceipt.manager(); + address receiptManager = IReceiptV3(config.receipt).manager(); if (receiptManager != address(this)) { revert WrongManager(address(this), receiptManager); } diff --git a/src/concrete/vault/ERC20PriceOracleReceiptVault.sol b/src/concrete/vault/ERC20PriceOracleReceiptVault.sol index 7a56405f..16e92d38 100644 --- a/src/concrete/vault/ERC20PriceOracleReceiptVault.sol +++ b/src/concrete/vault/ERC20PriceOracleReceiptVault.sol @@ -3,8 +3,7 @@ pragma solidity =0.8.25; import { - ReceiptVaultConfig, - VaultConfig, + ReceiptVaultConfigV2, ReceiptVault, ShareAction, ICLONEABLE_V2_SUCCESS, @@ -19,24 +18,13 @@ string constant ERC20_PRICE_ORACLE_RECEIPT_VAULT_STORAGE_ID = "rain.storage.erc2 bytes32 constant ERC20_PRICE_ORACLE_RECEIPT_VAULT_STORAGE_LOCATION = 0x2c9a4f39bd2ddc349dc9f5c9e14a1013643d88625d35a2c983590afa580ee000; -/// All the same config as `ERC20PriceOracleReceiptVaultConfig` but without the -/// receipt. Typically the receipt will be deployed and manager set atomically -/// by a factory to build the full config. -/// @param priceOracle as per `ERC20PriceOracleReceiptVaultConfig`. -/// @param vaultConfig config for the underlying `ReceiptVault`. -//forge-lint: disable-next-line(pascal-case-struct) -struct ERC20PriceOracleVaultConfig { - IPriceOracleV2 priceOracle; - VaultConfig vaultConfig; -} - /// @param priceOracle The price oracle that will be permanently bound to the /// `ERC20PriceOracleVault` upon initialization. /// @param receiptVaultConfig All config for the underlying receipt vault. //forge-lint: disable-next-line(pascal-case-struct) -struct ERC20PriceOracleReceiptVaultConfig { +struct ERC20PriceOracleReceiptVaultConfigV2 { IPriceOracleV2 priceOracle; - ReceiptVaultConfig receiptVaultConfig; + ReceiptVaultConfigV2 receiptVaultConfig; } /// @title ERC20PriceOracleVault @@ -92,7 +80,7 @@ contract ERC20PriceOracleReceiptVault is ReceiptVault { /// Emitted when deployed and constructed. /// @param sender msg sender that deployed the contract. /// @param config All construction config. - event ERC20PriceOracleReceiptVaultInitialized(address sender, ERC20PriceOracleReceiptVaultConfig config); + event ERC20PriceOracleReceiptVaultInitializedV2(address sender, ERC20PriceOracleReceiptVaultConfigV2 config); /// @param priceOracle The price oracle used for all minting calculations. /// @custom:storage-location erc7201:rain.storage.erc20-price-oracle-receipt-vault.1 @@ -116,22 +104,22 @@ contract ERC20PriceOracleReceiptVault is ReceiptVault { /// Initialization of the underlying receipt vault and price oracle. function initialize(bytes memory data) public virtual override initializer returns (bytes32) { - ERC20PriceOracleVaultConfig memory config = abi.decode(data, (ERC20PriceOracleVaultConfig)); + ERC20PriceOracleReceiptVaultConfigV2 memory config = abi.decode(data, (ERC20PriceOracleReceiptVaultConfigV2)); ERC20PriceOracleReceiptVault7201Storage storage s = getStorageERC20PriceOracleReceiptVault(); s.priceOracle = IPriceOracleV2(config.priceOracle); - __ReceiptVault_init(config.vaultConfig); + __ReceiptVault_init(config.receiptVaultConfig); // Slither false positive due to needing receipt to be set so that the // event can be emitted with the correct data. // slither-disable-next-line reentrancy-events - emit ERC20PriceOracleReceiptVaultInitialized( + emit ERC20PriceOracleReceiptVaultInitializedV2( _msgSender(), - ERC20PriceOracleReceiptVaultConfig({ + ERC20PriceOracleReceiptVaultConfigV2({ priceOracle: config.priceOracle, - receiptVaultConfig: ReceiptVaultConfig({receipt: address(receipt()), vaultConfig: config.vaultConfig}) + receiptVaultConfig: config.receiptVaultConfig }) ); diff --git a/src/concrete/vault/OffchainAssetReceiptVault.sol b/src/concrete/vault/OffchainAssetReceiptVault.sol index 2191cf2f..2f567d4d 100644 --- a/src/concrete/vault/OffchainAssetReceiptVault.sol +++ b/src/concrete/vault/OffchainAssetReceiptVault.sol @@ -3,8 +3,7 @@ pragma solidity =0.8.25; import { - ReceiptVaultConfig, - VaultConfig, + ReceiptVaultConfigV2, ReceiptVault, ShareAction, InvalidId, @@ -37,19 +36,6 @@ string constant OFFCHAIN_ASSET_RECEIPT_VAULT_STORAGE_ID = "rain.storage.offchain bytes32 constant OFFCHAIN_ASSET_RECEIPT_VAULT_STORAGE_LOCATION = 0xba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00; -/// All data required to configure an offchain asset vault except the receipt. -/// Typically the factory should build a receipt contract and set management -/// to the vault atomically during initialization so there is no opportunity for -/// an attacker to corrupt the initialzation process. -/// @param initialAdmin as per `OffchainAssetReceiptVaultConfig`. -/// @param vaultConfig MUST be used by the factory to build a -/// `ReceiptVaultConfig` once the receipt address is known and management has -/// been set to the vault contract. -struct OffchainAssetVaultConfigV2 { - address initialAdmin; - VaultConfig vaultConfig; -} - /// All data required to construct `OffchainAssetReceiptVault`. /// @param initialAdmin The initial admin has ALL ROLES. It is up to the admin to /// appropriately delegate and renounce roles or to be a smart contract with @@ -59,7 +45,7 @@ struct OffchainAssetVaultConfigV2 { /// @param receiptVaultConfig Forwarded to ReceiptVault. struct OffchainAssetReceiptVaultConfigV2 { address initialAdmin; - ReceiptVaultConfig receiptVaultConfig; + ReceiptVaultConfigV2 receiptVaultConfig; } /// Represents a change in the certification state of the system. @@ -316,12 +302,12 @@ contract OffchainAssetReceiptVault is IAuthorizeV1, ReceiptVault, OwnerFreezable /// logic. /// @param data All config required to initialize abi encoded. function initialize(bytes memory data) public virtual override initializer returns (bytes32) { - OffchainAssetVaultConfigV2 memory config = abi.decode(data, (OffchainAssetVaultConfigV2)); + OffchainAssetReceiptVaultConfigV2 memory config = abi.decode(data, (OffchainAssetReceiptVaultConfigV2)); - __ReceiptVault_init(config.vaultConfig); + __ReceiptVault_init(config.receiptVaultConfig); // There is no asset, the asset is offchain. - if (config.vaultConfig.asset != address(0)) { + if (config.receiptVaultConfig.asset != address(0)) { revert NonZeroAsset(); } // The config admin MUST be set. @@ -337,7 +323,7 @@ contract OffchainAssetReceiptVault is IAuthorizeV1, ReceiptVault, OwnerFreezable _msgSender(), OffchainAssetReceiptVaultConfigV2({ initialAdmin: config.initialAdmin, - receiptVaultConfig: ReceiptVaultConfig({receipt: address(receipt()), vaultConfig: config.vaultConfig}) + receiptVaultConfig: config.receiptVaultConfig }) ); diff --git a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol index 2012cfac..07da6ad5 100644 --- a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol +++ b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol @@ -8,7 +8,7 @@ import {CloneFactory} from "rain.factory/concrete/CloneFactory.sol"; import { ERC20PriceOracleReceiptVault, ReceiptVaultConstructionConfigV2, - ERC20PriceOracleReceiptVaultConfig + ERC20PriceOracleReceiptVaultConfigV2 } from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; import {LibERC20PriceOracleReceiptVaultCreator} from "../lib/LibERC20PriceOracleReceiptVaultCreator.sol"; import {Receipt as ReceiptContract} from "../../src/concrete/receipt/Receipt.sol"; @@ -58,8 +58,8 @@ contract ERC20PriceOracleReceiptVaultTest is Test { for (uint256 i = 0; i < logs.length; i++) { if (logs[i].topics[0] == ERC20PriceOracleReceiptVault.ERC20PriceOracleReceiptVaultInitialized.selector) { // Decode the event data - (, ERC20PriceOracleReceiptVaultConfig memory config) = - abi.decode(logs[i].data, (address, ERC20PriceOracleReceiptVaultConfig)); + (, ERC20PriceOracleReceiptVaultConfigV2 memory config) = + abi.decode(logs[i].data, (address, ERC20PriceOracleReceiptVaultConfigV2)); receiptAddress = config.receiptVaultConfig.receipt; eventFound = true; // Set the flag to true since event log was found break; diff --git a/test/concrete/ConcreteReceiptVault.sol b/test/concrete/ConcreteReceiptVault.sol index b3c596f8..20a464d1 100644 --- a/test/concrete/ConcreteReceiptVault.sol +++ b/test/concrete/ConcreteReceiptVault.sol @@ -4,8 +4,8 @@ pragma solidity =0.8.25; import { ReceiptVault, - VaultConfig, ReceiptVaultConstructionConfigV2, + ReceiptVaultConfigV2, ICloneableFactoryV2 } from "../../src/abstract/ReceiptVault.sol"; import {CloneFactory} from "rain.factory/concrete/CloneFactory.sol"; @@ -18,7 +18,7 @@ contract ConcreteReceiptVault is ReceiptVault { {} function initialize(bytes calldata data) external virtual override initializer returns (bytes32) { - VaultConfig memory config = abi.decode(data, (VaultConfig)); + ReceiptVaultConfigV2 memory config = abi.decode(data, (ReceiptVaultConfigV2)); __ReceiptVault_init(config); return ICLONEABLE_V2_SUCCESS; } diff --git a/test/lib/LibERC20PriceOracleReceiptVaultCreator.sol b/test/lib/LibERC20PriceOracleReceiptVaultCreator.sol index 7518fd20..157a0a1d 100644 --- a/test/lib/LibERC20PriceOracleReceiptVaultCreator.sol +++ b/test/lib/LibERC20PriceOracleReceiptVaultCreator.sol @@ -5,9 +5,9 @@ pragma solidity ^0.8.25; import {ICloneableFactoryV2} from "rain.factory/interface/ICloneableFactoryV2.sol"; import { ERC20PriceOracleReceiptVault, - ERC20PriceOracleVaultConfig + ERC20PriceOracleReceiptVaultConfigV2 } from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; -import {VaultConfig} from "src/abstract/ReceiptVault.sol"; +import {ReceiptVaultConfigV2} from "src/abstract/ReceiptVault.sol"; import {IPriceOracleV2} from "src/interface/IPriceOracleV2.sol"; library LibERC20PriceOracleReceiptVaultCreator { @@ -20,9 +20,9 @@ library LibERC20PriceOracleReceiptVaultCreator { string memory name, string memory symbol ) internal returns (ERC20PriceOracleReceiptVault) { - ERC20PriceOracleVaultConfig memory erc20PriceOracleVault = ERC20PriceOracleVaultConfig({ + ERC20PriceOracleReceiptVaultConfigV2 memory erc20PriceOracleVault = ERC20PriceOracleReceiptVaultConfigV2({ priceOracle: priceOracle, - vaultConfig: VaultConfig({asset: asset, name: name, symbol: symbol}) + receiptVaultConfig: ReceiptVaultConfigV2({asset: asset, name: name, symbol: symbol}) }); // Use the factory to create the child contract diff --git a/test/lib/LibOffchainAssetVaultCreator.sol b/test/lib/LibOffchainAssetVaultCreator.sol index cbea5684..96eb8d2e 100644 --- a/test/lib/LibOffchainAssetVaultCreator.sol +++ b/test/lib/LibOffchainAssetVaultCreator.sol @@ -4,8 +4,8 @@ pragma solidity ^0.8.25; import {Vm} from "forge-std/Test.sol"; import {ICloneableFactoryV2} from "rain.factory/interface/ICloneableFactoryV2.sol"; -import {OffchainAssetReceiptVault, OffchainAssetVaultConfigV2} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; -import {VaultConfig} from "src/abstract/ReceiptVault.sol"; +import {OffchainAssetReceiptVault, OffchainAssetReceiptVaultConfigV2} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; +import {ReceiptVaultConfigV2} from "src/abstract/ReceiptVault.sol"; import { OffchainAssetReceiptVaultAuthorizerV1, OffchainAssetReceiptVaultAuthorizerV1Config @@ -22,9 +22,9 @@ library LibOffchainAssetVaultCreator { string memory name, string memory symbol ) internal returns (OffchainAssetReceiptVault) { - OffchainAssetVaultConfigV2 memory offchainAssetVaultConfig = OffchainAssetVaultConfigV2({ + OffchainAssetReceiptVaultConfigV2 memory offchainAssetVaultConfig = OffchainAssetReceiptVaultConfigV2({ initialAdmin: initialAdmin, - vaultConfig: VaultConfig({asset: address(0), name: name, symbol: symbol}) + receiptVaultConfig: ReceiptVaultConfigV2({asset: address(0), name: name, symbol: symbol}) }); // Use the factory to create the child contract diff --git a/test/src/abstract/ReceiptVault.decimals.t.sol b/test/src/abstract/ReceiptVault.decimals.t.sol index 0b90825e..2022c69d 100644 --- a/test/src/abstract/ReceiptVault.decimals.t.sol +++ b/test/src/abstract/ReceiptVault.decimals.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {ConcreteReceiptVault} from "test/concrete/ConcreteReceiptVault.sol"; import {TestErc20} from "test/concrete/TestErc20.sol"; -import {VaultConfig} from "src/abstract/ReceiptVault.sol"; +import {ReceiptVaultConfigV2} from "src/abstract/ReceiptVault.sol"; import {Test} from "forge-std/Test.sol"; @@ -23,7 +23,7 @@ contract ReceiptVaultDecimalsTest is Test { payable( receiptVaultImplementation.factory().clone( address(receiptVaultImplementation), - abi.encode(VaultConfig({asset: address(asset), name: "Test Vault", symbol: "TVLT"})) + abi.encode(ReceiptVaultConfigV2({asset: address(asset), name: "Test Vault", symbol: "TVLT"})) ) ) ); diff --git a/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol b/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol index c9412a9f..6003a9ec 100644 --- a/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol +++ b/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol @@ -18,8 +18,8 @@ import {Receipt as ReceiptContract} from "../../../../src/concrete/receipt/Recei import {OffchainAssetReceiptVault} from "../../../../src/concrete/vault/OffchainAssetReceiptVault.sol"; import { ReceiptVaultConstructionConfigV2, - OffchainAssetVaultConfigV2, - VaultConfig + ReceiptVaultConfigV2, + OffchainAssetReceiptVaultConfigV2 } from "../../../../src/concrete/vault/OffchainAssetReceiptVault.sol"; import {VerifyAlwaysApproved} from "rain.verify.interface/concrete/VerifyAlwaysApproved.sol"; import {LibFixedPointDecimalScale, FLAG_ROUND_UP} from "rain.math.fixedpoint/lib/LibFixedPointDecimalScale.sol"; @@ -85,9 +85,9 @@ contract OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest is Offchain (new CloneFactory()).clone( address(receiptVaultImplementation), abi.encode( - OffchainAssetVaultConfigV2({ + OffchainAssetReceiptVaultConfigV2({ initialAdmin: alice, - vaultConfig: VaultConfig({asset: address(0), name: "Test Vault", symbol: "TVLT"}) + receiptVaultConfig: ReceiptVaultConfigV2({asset: address(0), name: "Test Vault", symbol: "TVLT"}) }) ) ) @@ -408,9 +408,9 @@ contract OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest is Offchain vm.assume(alice.code.length == 0); vm.assume(uint160(alice) > type(uint160).max / 2); - OffchainAssetVaultConfigV2 memory offchainAssetVaultConfig = OffchainAssetVaultConfigV2({ + OffchainAssetReceiptVaultConfigV2 memory offchainAssetVaultConfig = OffchainAssetReceiptVaultConfigV2({ initialAdmin: bob, - vaultConfig: VaultConfig({asset: address(0), name: "foo", symbol: "bar"}) + receiptVaultConfig: ReceiptVaultConfigV2({asset: address(0), name: "foo", symbol: "bar"}) }); // Use the factory to create the child contract OffchainAssetReceiptVault receiptVault = OffchainAssetReceiptVault( diff --git a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol index 24177ba2..32d2fc40 100644 --- a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol +++ b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import { ERC20PriceOracleReceiptVault, - ERC20PriceOracleReceiptVaultConfig + ERC20PriceOracleReceiptVaultConfigV2 } from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; import {ERC20PriceOracleReceiptVaultTest, Vm} from "test/abstract/ERC20PriceOracleReceiptVaultTest.sol"; import {IPriceOracleV2} from "src/interface/IPriceOracleV2.sol"; @@ -30,7 +30,7 @@ contract ERC20PriceOracleReceiptVaultConstructionTest is ERC20PriceOracleReceipt // Find the OffchainAssetReceiptVaultInitialized event log address msgSender; - ERC20PriceOracleReceiptVaultConfig memory config; + ERC20PriceOracleReceiptVaultConfigV2 memory config; bool eventFound = false; // Flag to indicate whether the event log was found for (uint256 i = 0; i < logs.length; i++) { @@ -41,7 +41,7 @@ contract ERC20PriceOracleReceiptVaultConstructionTest is ERC20PriceOracleReceipt ) ) { // Decode the event data - (msgSender, config) = abi.decode(logs[i].data, (address, ERC20PriceOracleReceiptVaultConfig)); + (msgSender, config) = abi.decode(logs[i].data, (address, ERC20PriceOracleReceiptVaultConfigV2)); eventFound = true; // Set the flag to true since event log was found break; } diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol index 299f285d..c726a6d0 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol @@ -2,11 +2,11 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {VaultConfig} from "src/abstract/ReceiptVault.sol"; +import {ReceiptVaultConfigV2} from "src/abstract/ReceiptVault.sol"; import {OffchainAssetReceiptVaultTest, Vm} from "test/abstract/OffchainAssetReceiptVaultTest.sol"; import { OffchainAssetReceiptVault, - OffchainAssetVaultConfigV2, + OffchainAssetReceiptVaultConfigV2, OffchainAssetReceiptVaultConfigV2, ZeroInitialAdmin, NonZeroAsset @@ -16,12 +16,12 @@ import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenera contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { /// Test that admin is not address zero function testZeroInitialAdmin(string memory shareName, string memory shareSymbol) external { - VaultConfig memory vaultConfig = VaultConfig({asset: address(0), name: shareName, symbol: shareSymbol}); + ReceiptVaultConfigV2 memory vaultConfig = ReceiptVaultConfigV2({asset: address(0), name: shareName, symbol: shareSymbol}); vm.expectRevert(abi.encodeWithSelector(ZeroInitialAdmin.selector)); I_FACTORY.clone( address(I_IMPLEMENTATION), - abi.encode(OffchainAssetVaultConfigV2({initialAdmin: address(0), vaultConfig: vaultConfig})) + abi.encode(OffchainAssetReceiptVaultConfigV2({initialAdmin: address(0), receiptVaultConfig: vaultConfig})) ); } @@ -32,12 +32,12 @@ contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { address alice = LibUniqueAddressesGenerator.generateUniqueAddresses(vm, aliceSeed); vm.assume(asset != address(0)); - VaultConfig memory vaultConfig = VaultConfig({asset: asset, name: shareName, symbol: shareSymbol}); + ReceiptVaultConfigV2 memory vaultConfig = ReceiptVaultConfigV2({asset: asset, name: shareName, symbol: shareSymbol}); vm.expectRevert(abi.encodeWithSelector(NonZeroAsset.selector)); I_FACTORY.clone( address(I_IMPLEMENTATION), - abi.encode(OffchainAssetVaultConfigV2({initialAdmin: alice, vaultConfig: vaultConfig})) + abi.encode(OffchainAssetReceiptVaultConfigV2({initialAdmin: alice, vaultConfig: vaultConfig})) ); } @@ -47,12 +47,12 @@ contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { address asset = address(0); - VaultConfig memory vaultConfig = VaultConfig({asset: asset, name: shareName, symbol: shareSymbol}); + ReceiptVaultConfigV2 memory vaultConfig = ReceiptVaultConfigV2({asset: asset, name: shareName, symbol: shareSymbol}); // Simulate transaction from alice vm.prank(alice); - OffchainAssetVaultConfigV2 memory offchainAssetVaultConfig = - OffchainAssetVaultConfigV2({initialAdmin: alice, vaultConfig: vaultConfig}); + OffchainAssetReceiptVaultConfigV2 memory offchainAssetVaultConfig = + OffchainAssetReceiptVaultConfigV2({initialAdmin: alice, receiptVaultConfig: vaultConfig}); // Start recording logs vm.recordLogs(); From a1bae922a4a8c09dc777cca7d1dbe97602182824 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Sat, 13 Dec 2025 18:30:41 +0400 Subject: [PATCH 02/26] wip on proxy --- script/Deploy.sol | 60 ------------------- src/abstract/ReceiptVault.sol | 13 +--- ...hainAssetReceiptVaultBeaconSetDeployer.sol | 49 +++++++++++++++ .../vault/ERC20PriceOracleReceiptVault.sol | 2 - .../vault/OffchainAssetReceiptVault.sol | 2 - .../ERC20PriceOracleReceiptVaultTest.sol | 17 ++++-- .../OffchainAssetReceiptVaultTest.sol | 33 +++++++--- test/concrete/ConcreteReceiptVault.sol | 8 --- ...LibERC20PriceOracleReceiptVaultCreator.sol | 33 ---------- test/lib/LibOffchainAssetVaultCreator.sol | 47 --------------- ...C20PriceOracleReceiptVault.construct.t.sol | 10 ++-- .../OffchainAssetReceiptVault.construct.t.sol | 47 +++++++-------- .../OffchainAssetReceiptVault.mint.t.sol | 5 +- ...inAssetReceiptVault.ownerFreezeUntil.t.sol | 1 - 14 files changed, 114 insertions(+), 213 deletions(-) delete mode 100644 script/Deploy.sol create mode 100644 src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol delete mode 100644 test/lib/LibERC20PriceOracleReceiptVaultCreator.sol delete mode 100644 test/lib/LibOffchainAssetVaultCreator.sol diff --git a/script/Deploy.sol b/script/Deploy.sol deleted file mode 100644 index 8ce9a8c0..00000000 --- a/script/Deploy.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: LicenseRef-DCL-1.0 -// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity =0.8.25; - -import {Script} from "forge-std/Script.sol"; -import { - ERC20PriceOracleReceiptVault, - ERC20PriceOracleReceiptVaultConfigV2 -} from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; -import {ReceiptVaultConfigV2} from "src/abstract/ReceiptVault.sol"; -import {ICloneableFactoryV2} from "rain.factory/interface/ICloneableFactoryV2.sol"; -import { - OffchainAssetReceiptVault, - ReceiptVaultConstructionConfigV2 -} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; -import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; -import {SceptreStakedFlrOracle} from "src/concrete/oracle/SceptreStakedFlrOracle.sol"; -import {TwoPriceOracleV2, TwoPriceOracleConfigV2} from "src/concrete/oracle/TwoPriceOracleV2.sol"; -import {FtsoV2LTSFeedOracle, FtsoV2LTSFeedOracleConfig} from "src/concrete/oracle/FtsoV2LTSFeedOracle.sol"; -import {FLR_USD_FEED_ID} from "rain.flare/lib/lts/LibFtsoV2LTS.sol"; -import {IPriceOracleV2} from "src/interface/IPriceOracleV2.sol"; -import {SFLR_CONTRACT} from "rain.flare/lib/sflr/LibSceptreStakedFlare.sol"; -import {OffchainAssetReceiptVaultAuthorizerV1} from "src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; -import {OffchainAssetReceiptVaultPaymentMintAuthorizerV1} from - "src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.sol"; - -bytes32 constant DEPLOYMENT_SUITE_IMPLEMENTATIONS = keccak256("implementations"); -bytes32 constant DEPLOYMENT_SUITE_OWNABLE_ORACLE_VAULT = keccak256("ownable-oracle-vault"); - -/// @title Deploy -/// This is intended to be run on every commit by CI to a testnet such as mumbai, -/// then cross chain deployed to whatever mainnet is required, by users. -contract Deploy is Script { - function deployImplementations(uint256 deploymentKey) internal { - vm.startBroadcast(deploymentKey); - - ReceiptContract receipt = new ReceiptContract(); - ReceiptVaultConstructionConfigV2 memory receiptVaultConstructionConfig = ReceiptVaultConstructionConfigV2({ - factory: ICloneableFactoryV2(vm.envAddress("CLONE_FACTORY")), - receiptImplementation: receipt - }); - new OffchainAssetReceiptVault(receiptVaultConstructionConfig); - new ERC20PriceOracleReceiptVault(receiptVaultConstructionConfig); - new OffchainAssetReceiptVaultAuthorizerV1(); - new OffchainAssetReceiptVaultPaymentMintAuthorizerV1(); - - vm.stopBroadcast(); - } - - function run() external { - uint256 deployerPrivateKey = vm.envUint("DEPLOYMENT_KEY"); - bytes32 suite = keccak256(bytes(vm.envString("DEPLOYMENT_SUITE"))); - - if (suite == DEPLOYMENT_SUITE_IMPLEMENTATIONS) { - deployImplementations(deployerPrivateKey); - } else { - revert("Unknown deployment suite"); - } - } -} diff --git a/src/abstract/ReceiptVault.sol b/src/abstract/ReceiptVault.sol index 4deafdbd..ee8c8404 100644 --- a/src/abstract/ReceiptVault.sol +++ b/src/abstract/ReceiptVault.sol @@ -113,11 +113,6 @@ abstract contract ReceiptVault is using LibFixedPointDecimalArithmeticOpenZeppelin for uint256; using SafeERC20 for IERC20; - //slither-disable-next-line naming-convention - ICloneableFactoryV2 internal immutable I_FACTORY; - //slither-disable-next-line naming-convention - IReceiptV3 internal immutable I_RECEIPT_IMPLEMENTATION; - /// @param asset Underlying ERC4626 asset. /// @param receipt ERC1155 Receipt owned by this receipt vault for the /// purpose of tracking mints and enforcing integrity of subsequent burns. @@ -134,14 +129,8 @@ abstract contract ReceiptVault is } } - /// `ReceiptVault` is intended to be cloned and initialized by a - /// `ReceiptVaultFactory` so is an implementation contract that can't itself - /// be initialized. - constructor(ReceiptVaultConstructionConfigV2 memory config) { + constructor() { _disableInitializers(); - - I_FACTORY = config.factory; - I_RECEIPT_IMPLEMENTATION = config.receiptImplementation; } /// Deposits are payable so this allows refunds. diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol new file mode 100644 index 00000000..104434b4 --- /dev/null +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Receipt, ICLONEABLE_V2_SUCCESS} from "../receipt/Receipt.sol"; +import {OffchainAssetReceiptVault, OffchainAssetReceiptVaultConfigV2} from "../vault/OffchainAssetReceiptVault.sol"; +import {IBeacon, UpgradeableBeacon} from "openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {BeaconProxy} from "openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol"; + +struct OffchainAssetReceiptVaultBeaconSetDeployerConfig { + address initialOwner; + Receipt initialReceiptImplementation; + OffchainAssetReceiptVault initialOffchainAssetReceiptVaultImplementation; +} + +contract OffchainAssetReceiptVaultBeaconSetDeployer { + address immutable I_RECEIPT_BEACON; + address immutable I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON; + + constructor(OffchainAssetReceiptVaultBeaconSetDeployerConfig memory config) { + I_RECEIPT_BEACON = + address(new UpgradeableBeacon(address(config.initialReceiptImplementation), config.initialOwner)); + I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON = address( + new UpgradeableBeacon(address(config.initialOffchainAssetReceiptVaultImplementation), config.initialOwner) + ); + } + + function newOffchainAssetReceiptVault(OffchainAssetReceiptVaultConfigV2 memory config) + external + view + returns (OffchainAssetReceiptVault) + { + require(config.receiptVaultConfig.receipt == address(0), "Receipt address must be zero"); + + Receipt receipt = Receipt(address(new BeaconProxy(I_RECEIPT_BEACON, ""))); + OffchainAssetReceiptVault offchainAssetReceiptVault = + OffchainAssetReceiptVault(payable(address(new BeaconProxy(I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON, "")))); + + require( + receipt.initialize(abi.encode(offchainAssetReceiptVault)) == ICLONEABLE_V2_SUCCESS, "Failed to init receipt" + ); + + config.receiptVaultConfig.receipt = address(receipt); + require( + offchainAssetReceiptVault.initialize(abi.encode(config)) == ICLONEABLE_V2_SUCCESS, + "Failed to init offchain asset receipt vault" + ); + } +} diff --git a/src/concrete/vault/ERC20PriceOracleReceiptVault.sol b/src/concrete/vault/ERC20PriceOracleReceiptVault.sol index 16e92d38..3937e2e7 100644 --- a/src/concrete/vault/ERC20PriceOracleReceiptVault.sol +++ b/src/concrete/vault/ERC20PriceOracleReceiptVault.sol @@ -100,8 +100,6 @@ contract ERC20PriceOracleReceiptVault is ReceiptVault { } } - constructor(ReceiptVaultConstructionConfigV2 memory config) ReceiptVault(config) {} - /// Initialization of the underlying receipt vault and price oracle. function initialize(bytes memory data) public virtual override initializer returns (bytes32) { ERC20PriceOracleReceiptVaultConfigV2 memory config = abi.decode(data, (ERC20PriceOracleReceiptVaultConfigV2)); diff --git a/src/concrete/vault/OffchainAssetReceiptVault.sol b/src/concrete/vault/OffchainAssetReceiptVault.sol index 2f567d4d..9e2962a4 100644 --- a/src/concrete/vault/OffchainAssetReceiptVault.sol +++ b/src/concrete/vault/OffchainAssetReceiptVault.sol @@ -294,8 +294,6 @@ contract OffchainAssetReceiptVault is IAuthorizeV1, ReceiptVault, OwnerFreezable } } - constructor(ReceiptVaultConstructionConfigV2 memory config) ReceiptVault(config) {} - /// Initializes the initial admin and the underlying `ReceiptVault`. /// The admin provided will be admin of all roles and can reassign and revoke /// this as appropriate according to standard Open Zeppelin access control diff --git a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol index 07da6ad5..79575daf 100644 --- a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol +++ b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol @@ -10,7 +10,6 @@ import { ReceiptVaultConstructionConfigV2, ERC20PriceOracleReceiptVaultConfigV2 } from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; -import {LibERC20PriceOracleReceiptVaultCreator} from "../lib/LibERC20PriceOracleReceiptVaultCreator.sol"; import {Receipt as ReceiptContract} from "../../src/concrete/receipt/Receipt.sol"; import {IERC20} from "forge-std/interfaces/IERC20.sol"; import {IPriceOracleV2} from "../../src/interface/IPriceOracleV2.sol"; @@ -42,10 +41,18 @@ contract ERC20PriceOracleReceiptVaultTest is Test { internal returns (ERC20PriceOracleReceiptVault) { - ERC20PriceOracleReceiptVault vault = LibERC20PriceOracleReceiptVaultCreator.createVault( - I_FACTORY, I_IMPLEMENTATION, priceOracle, address(I_ASSET), name, symbol + return I_DEPLOYER.newERC20PriceOracleReceiptVault( + ERC20PriceOracleReceiptVaultConfigV2({ + initialAdmin: address(this), + receiptVaultConfig: ReceiptVaultConfigV2({ + asset: address(I_ASSET), + name: name, + symbol: symbol, + receipt: address(0) + }), + vaultPriceOracle: priceOracle + }) ); - return vault; } /// Get Receipt from event @@ -56,7 +63,7 @@ contract ERC20PriceOracleReceiptVaultTest is Test { address receiptAddress = address(0); bool eventFound = false; // Flag to indicate whether the event log was found for (uint256 i = 0; i < logs.length; i++) { - if (logs[i].topics[0] == ERC20PriceOracleReceiptVault.ERC20PriceOracleReceiptVaultInitialized.selector) { + if (logs[i].topics[0] == ERC20PriceOracleReceiptVault.ERC20PriceOracleReceiptVaultInitializedV2.selector) { // Decode the event data (, ERC20PriceOracleReceiptVaultConfigV2 memory config) = abi.decode(logs[i].data, (address, ERC20PriceOracleReceiptVaultConfigV2)); diff --git a/test/abstract/OffchainAssetReceiptVaultTest.sol b/test/abstract/OffchainAssetReceiptVaultTest.sol index 7e9be88b..647ffe65 100644 --- a/test/abstract/OffchainAssetReceiptVaultTest.sol +++ b/test/abstract/OffchainAssetReceiptVaultTest.sol @@ -8,34 +8,49 @@ import {CloneFactory} from "rain.factory/concrete/CloneFactory.sol"; import { OffchainAssetReceiptVaultConfigV2, OffchainAssetReceiptVault, - ReceiptVaultConstructionConfigV2 + ReceiptVaultConfigV2 } from "src/concrete/vault/OffchainAssetReceiptVault.sol"; -import {LibOffchainAssetVaultCreator} from "../lib/LibOffchainAssetVaultCreator.sol"; import {Receipt as ReceiptContract} from "../../src/concrete/receipt/Receipt.sol"; import {OffchainAssetReceiptVaultAuthorizerV1} from "../../src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; +import { + OffchainAssetReceiptVaultBeaconSetDeployer, + OffchainAssetReceiptVaultBeaconSetDeployerConfig +} from "../../src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol"; contract OffchainAssetReceiptVaultTest is Test { - ICloneableFactoryV2 internal immutable I_FACTORY; OffchainAssetReceiptVault internal immutable I_IMPLEMENTATION; OffchainAssetReceiptVaultAuthorizerV1 internal immutable I_AUTHORIZER_IMPLEMENTATION; ReceiptContract internal immutable I_RECEIPT_IMPLEMENTATION; + OffchainAssetReceiptVaultBeaconSetDeployer internal immutable I_DEPLOYER; constructor() { - I_FACTORY = new CloneFactory(); I_RECEIPT_IMPLEMENTATION = new ReceiptContract(); - I_IMPLEMENTATION = new OffchainAssetReceiptVault( - ReceiptVaultConstructionConfigV2({factory: I_FACTORY, receiptImplementation: I_RECEIPT_IMPLEMENTATION}) - ); + I_IMPLEMENTATION = new OffchainAssetReceiptVault(); I_AUTHORIZER_IMPLEMENTATION = new OffchainAssetReceiptVaultAuthorizerV1(); + I_DEPLOYER = new OffchainAssetReceiptVaultBeaconSetDeployer( + OffchainAssetReceiptVaultBeaconSetDeployerConfig({ + initialOwner: address(this), + initialReceiptImplementation: I_RECEIPT_IMPLEMENTATION, + initialOffchainAssetReceiptVaultImplementation: I_IMPLEMENTATION + }) + ); } function createVault(address admin, string memory shareName, string memory shareSymbol) internal returns (OffchainAssetReceiptVault) { - return LibOffchainAssetVaultCreator.createVault( - vm, I_FACTORY, I_IMPLEMENTATION, I_AUTHORIZER_IMPLEMENTATION, admin, shareName, shareSymbol + return I_DEPLOYER.newOffchainAssetReceiptVault( + OffchainAssetReceiptVaultConfigV2({ + initialAdmin: admin, + receiptVaultConfig: ReceiptVaultConfigV2({ + asset: address(0), + name: shareName, + symbol: shareSymbol, + receipt: address(0) + }) + }) ); } diff --git a/test/concrete/ConcreteReceiptVault.sol b/test/concrete/ConcreteReceiptVault.sol index 20a464d1..8b922879 100644 --- a/test/concrete/ConcreteReceiptVault.sol +++ b/test/concrete/ConcreteReceiptVault.sol @@ -13,17 +13,9 @@ import {Receipt} from "../../src/concrete/receipt/Receipt.sol"; import {ICLONEABLE_V2_SUCCESS} from "rain.factory/interface/ICloneableV2.sol"; contract ConcreteReceiptVault is ReceiptVault { - constructor() - ReceiptVault(ReceiptVaultConstructionConfigV2({factory: new CloneFactory(), receiptImplementation: new Receipt()})) - {} - function initialize(bytes calldata data) external virtual override initializer returns (bytes32) { ReceiptVaultConfigV2 memory config = abi.decode(data, (ReceiptVaultConfigV2)); __ReceiptVault_init(config); return ICLONEABLE_V2_SUCCESS; } - - function factory() external view returns (ICloneableFactoryV2) { - return I_FACTORY; - } } diff --git a/test/lib/LibERC20PriceOracleReceiptVaultCreator.sol b/test/lib/LibERC20PriceOracleReceiptVaultCreator.sol deleted file mode 100644 index 157a0a1d..00000000 --- a/test/lib/LibERC20PriceOracleReceiptVaultCreator.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: LicenseRef-DCL-1.0 -// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; - -import {ICloneableFactoryV2} from "rain.factory/interface/ICloneableFactoryV2.sol"; -import { - ERC20PriceOracleReceiptVault, - ERC20PriceOracleReceiptVaultConfigV2 -} from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; -import {ReceiptVaultConfigV2} from "src/abstract/ReceiptVault.sol"; -import {IPriceOracleV2} from "src/interface/IPriceOracleV2.sol"; - -library LibERC20PriceOracleReceiptVaultCreator { - /// Helper to create child erc20PriceOracleVault. - function createVault( - ICloneableFactoryV2 factory, - ERC20PriceOracleReceiptVault implementation, - IPriceOracleV2 priceOracle, - address asset, - string memory name, - string memory symbol - ) internal returns (ERC20PriceOracleReceiptVault) { - ERC20PriceOracleReceiptVaultConfigV2 memory erc20PriceOracleVault = ERC20PriceOracleReceiptVaultConfigV2({ - priceOracle: priceOracle, - receiptVaultConfig: ReceiptVaultConfigV2({asset: asset, name: name, symbol: symbol}) - }); - - // Use the factory to create the child contract - return ERC20PriceOracleReceiptVault( - payable(factory.clone(address(implementation), abi.encode(erc20PriceOracleVault))) - ); - } -} diff --git a/test/lib/LibOffchainAssetVaultCreator.sol b/test/lib/LibOffchainAssetVaultCreator.sol deleted file mode 100644 index 96eb8d2e..00000000 --- a/test/lib/LibOffchainAssetVaultCreator.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: LicenseRef-DCL-1.0 -// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; - -import {Vm} from "forge-std/Test.sol"; -import {ICloneableFactoryV2} from "rain.factory/interface/ICloneableFactoryV2.sol"; -import {OffchainAssetReceiptVault, OffchainAssetReceiptVaultConfigV2} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; -import {ReceiptVaultConfigV2} from "src/abstract/ReceiptVault.sol"; -import { - OffchainAssetReceiptVaultAuthorizerV1, - OffchainAssetReceiptVaultAuthorizerV1Config -} from "src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; - -library LibOffchainAssetVaultCreator { - /// Helper to create child offchainAssetReceiptVault. - function createVault( - Vm vm, - ICloneableFactoryV2 factory, - OffchainAssetReceiptVault implementation, - OffchainAssetReceiptVaultAuthorizerV1 authorizerImplementation, - address initialAdmin, - string memory name, - string memory symbol - ) internal returns (OffchainAssetReceiptVault) { - OffchainAssetReceiptVaultConfigV2 memory offchainAssetVaultConfig = OffchainAssetReceiptVaultConfigV2({ - initialAdmin: initialAdmin, - receiptVaultConfig: ReceiptVaultConfigV2({asset: address(0), name: name, symbol: symbol}) - }); - - // Use the factory to create the child contract - OffchainAssetReceiptVault vault = OffchainAssetReceiptVault( - payable(factory.clone(address(implementation), abi.encode(offchainAssetVaultConfig))) - ); - - OffchainAssetReceiptVaultAuthorizerV1 authorizer = OffchainAssetReceiptVaultAuthorizerV1( - factory.clone( - address(authorizerImplementation), - abi.encode(OffchainAssetReceiptVaultAuthorizerV1Config({initialAdmin: initialAdmin})) - ) - ); - - vm.prank(initialAdmin); - vault.setAuthorizer(authorizer); - - return vault; - } -} diff --git a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol index 32d2fc40..54fbc6af 100644 --- a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol +++ b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol @@ -52,13 +52,13 @@ contract ERC20PriceOracleReceiptVaultConstructionTest is ERC20PriceOracleReceipt assertEq(msgSender, address(I_FACTORY)); assert(address(vault) != address(0)); - assertEq(keccak256(bytes(vault.name())), keccak256(bytes(config.receiptVaultConfig.vaultConfig.name))); - assertEq(config.receiptVaultConfig.vaultConfig.name, shareName); + assertEq(keccak256(bytes(vault.name())), keccak256(bytes(config.receiptVaultConfig.name))); + assertEq(config.receiptVaultConfig.name, shareName); - assertEq(keccak256(bytes(vault.symbol())), keccak256(bytes(config.receiptVaultConfig.vaultConfig.symbol))); - assertEq(config.receiptVaultConfig.vaultConfig.symbol, shareSymbol); + assertEq(keccak256(bytes(vault.symbol())), keccak256(bytes(config.receiptVaultConfig.symbol))); + assertEq(config.receiptVaultConfig.symbol, shareSymbol); - assertEq(address(config.receiptVaultConfig.vaultConfig.asset), address(I_ASSET)); + assertEq(address(config.receiptVaultConfig.asset), address(I_ASSET)); assertTrue(address(config.receiptVaultConfig.receipt) != address(0)); assertEq(address(config.receiptVaultConfig.receipt), address(vault.receipt())); diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol index c726a6d0..56138071 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol @@ -3,7 +3,9 @@ pragma solidity =0.8.25; import {ReceiptVaultConfigV2} from "src/abstract/ReceiptVault.sol"; -import {OffchainAssetReceiptVaultTest, Vm} from "test/abstract/OffchainAssetReceiptVaultTest.sol"; +import { + OffchainAssetReceiptVaultTest, ReceiptVaultConfigV2, Vm +} from "test/abstract/OffchainAssetReceiptVaultTest.sol"; import { OffchainAssetReceiptVault, OffchainAssetReceiptVaultConfigV2, @@ -16,13 +18,8 @@ import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenera contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { /// Test that admin is not address zero function testZeroInitialAdmin(string memory shareName, string memory shareSymbol) external { - ReceiptVaultConfigV2 memory vaultConfig = ReceiptVaultConfigV2({asset: address(0), name: shareName, symbol: shareSymbol}); - vm.expectRevert(abi.encodeWithSelector(ZeroInitialAdmin.selector)); - I_FACTORY.clone( - address(I_IMPLEMENTATION), - abi.encode(OffchainAssetReceiptVaultConfigV2({initialAdmin: address(0), receiptVaultConfig: vaultConfig})) - ); + createVault(address(0), shareName, shareSymbol); } /// Test that asset is address zero @@ -32,33 +29,33 @@ contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { address alice = LibUniqueAddressesGenerator.generateUniqueAddresses(vm, aliceSeed); vm.assume(asset != address(0)); - ReceiptVaultConfigV2 memory vaultConfig = ReceiptVaultConfigV2({asset: asset, name: shareName, symbol: shareSymbol}); vm.expectRevert(abi.encodeWithSelector(NonZeroAsset.selector)); - I_FACTORY.clone( - address(I_IMPLEMENTATION), - abi.encode(OffchainAssetReceiptVaultConfigV2({initialAdmin: alice, vaultConfig: vaultConfig})) + I_DEPLOYER.newOffchainAssetReceiptVault( + OffchainAssetReceiptVaultConfigV2({ + initialAdmin: alice, + receiptVaultConfig: ReceiptVaultConfigV2({ + asset: asset, + name: shareName, + symbol: shareSymbol, + receipt: address(0) + }) + }) ); } - /// Test that offchainAssetReceiptVault constructs well - function testConstructionEvent(uint256 aliceSeed, string memory shareName, string memory shareSymbol) external { + /// Test that offchainAssetReceiptVault initializes well + function testInitializationEvent(uint256 aliceSeed, string memory shareName, string memory shareSymbol) external { address alice = LibUniqueAddressesGenerator.generateUniqueAddresses(vm, aliceSeed); address asset = address(0); - ReceiptVaultConfigV2 memory vaultConfig = ReceiptVaultConfigV2({asset: asset, name: shareName, symbol: shareSymbol}); - // Simulate transaction from alice vm.prank(alice); - OffchainAssetReceiptVaultConfigV2 memory offchainAssetVaultConfig = - OffchainAssetReceiptVaultConfigV2({initialAdmin: alice, receiptVaultConfig: vaultConfig}); // Start recording logs vm.recordLogs(); - OffchainAssetReceiptVault vault = OffchainAssetReceiptVault( - payable(I_FACTORY.clone(address(I_IMPLEMENTATION), abi.encode(offchainAssetVaultConfig))) - ); + OffchainAssetReceiptVault vault = createVault(alice, shareName, shareSymbol); // Get the logs Vm.Log[] memory logs = vm.getRecordedLogs(); @@ -92,24 +89,24 @@ contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { // Assert that the event log was found assertTrue(eventFound, "OffchainAssetReceiptVaultInitialized event log not found"); - assertEq(msgSender, address(I_FACTORY)); + assertEq(msgSender, address(0)); assertEq(config.initialAdmin, alice); assert(address(vault) != address(0)); - assertEq(config.receiptVaultConfig.vaultConfig.name, shareName); + assertEq(config.receiptVaultConfig.name, shareName); assertEq(keccak256(bytes(vault.name())), keccak256(bytes(shareName))); - assertEq(config.receiptVaultConfig.vaultConfig.symbol, shareSymbol); + assertEq(config.receiptVaultConfig.symbol, shareSymbol); assertEq(keccak256(bytes(vault.symbol())), keccak256(bytes(shareSymbol))); - assertEq(address(config.receiptVaultConfig.vaultConfig.asset), asset); + assertEq(address(config.receiptVaultConfig.asset), asset); assertTrue(address(config.receiptVaultConfig.receipt) != address(0)); assertEq(address(config.receiptVaultConfig.receipt), address(vault.receipt())); /// Check the authorizer set event assertTrue(authorizeSetEventFound, "AuthorizerSet event log not found"); - assertEq(authorizeSetMsgSender, address(I_FACTORY)); + assertEq(authorizeSetMsgSender, address(0)); assertEq(authorizeSetTo, address(vault)); assertTrue(address(vault) != address(0)); diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.mint.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.mint.t.sol index 2a20aa5f..03802cf5 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.mint.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.mint.t.sol @@ -15,7 +15,6 @@ import { Unauthorized } from "src/concrete/vault/OffchainAssetReceiptVault.sol"; import {OffchainAssetReceiptVaultTest} from "test/abstract/OffchainAssetReceiptVaultTest.sol"; -import {LibOffchainAssetVaultCreator} from "test/lib/LibOffchainAssetVaultCreator.sol"; import {IReceiptVaultV1} from "src/interface/IReceiptVaultV3.sol"; import {IReceiptV3} from "src/interface/IReceiptV3.sol"; import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenerator.sol"; @@ -142,9 +141,7 @@ contract OffchainAssetReceiptVaultDepositTest is OffchainAssetReceiptVaultTest { (address alice, address bob) = LibUniqueAddressesGenerator.generateUniqueAddresses(vm, aliceSeed, bobSeed); - OffchainAssetReceiptVault vault = LibOffchainAssetVaultCreator.createVault( - vm, I_FACTORY, I_IMPLEMENTATION, I_AUTHORIZER_IMPLEMENTATION, alice, shareName, shareSymbol - ); + OffchainAssetReceiptVault vault = createVault(alice, shareName, shareSymbol); checkMint(vault, bob, bob, shares, minShareRatio, receiptInformation, ""); } diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol index 546ad57f..8a700835 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol @@ -21,7 +21,6 @@ import { CONFISCATE_SHARES, CONFISCATE_RECEIPT } from "../../../../src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; -import {LibOffchainAssetVaultCreator} from "../../../lib/LibOffchainAssetVaultCreator.sol"; import {IAccessControl} from "openzeppelin-contracts/contracts/access/IAccessControl.sol"; contract OffchainAssetReceiptVaultOwnerFreezeUntilTest is OwnerFreezableOwnerFreezeUntilTest { From b0824152917b2c6317f82977805e32047fd05ebb Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Sun, 14 Dec 2025 23:34:45 +0400 Subject: [PATCH 03/26] wip agnostic proxy --- ...20PriceOracleReceiptVaultCloneDeployer.sol | 48 +++++++++++++++++++ .../ERC20PriceOracleReceiptVaultTest.sol | 20 +++++--- .../OwnerFreezableOwnerFreezeUntilTest.sol | 4 +- ...C20PriceOracleReceiptVault.construct.t.sol | 2 +- ...inAssetReceiptVault.ownerFreezeUntil.t.sol | 6 +-- 5 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol diff --git a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol new file mode 100644 index 00000000..e686116c --- /dev/null +++ b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Clones} from "openzeppelin-contracts/contracts/proxy/Clones.sol"; +import {Receipt, ICLONEABLE_V2_SUCCESS} from "../receipt/Receipt.sol"; +import { + ERC20PriceOracleReceiptVault, + ERC20PriceOracleReceiptVaultConfigV2 +} from "../vault/ERC20PriceOracleReceiptVault.sol"; + +struct ERC20PriceOracleReceiptVaultCloneDeployerConfig { + address receiptImplementation; + address erc20PriceOracleReceiptVaultImplementation; +} + +contract ERC20PriceOracleReceiptVaultCloneDeployer { + address immutable I_RECEIPT_IMPLEMENTATION; + address immutable I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION; + + constructor(ERC20PriceOracleReceiptVaultCloneDeployerConfig memory config) { + I_RECEIPT_IMPLEMENTATION = config.receiptImplementation; + I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION = config.erc20PriceOracleReceiptVaultImplementation; + } + + function newERC20PriceOracleReceiptVault(ERC20PriceOracleReceiptVaultConfigV2 memory config) + external + view + returns (address) + { + require(config.receiptVaultConfig.receipt == address(0), "Receipt address must be zero"); + + Receipt receipt = Receipt(Clones.clone(I_RECEIPT_IMPLEMENTATION)); + ERC20PriceOracleReceiptVault erc20PriceOracleReceiptVault = + ERC20PriceOracleReceiptVault(Clones.clone(I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION)); + + require( + receipt.initialize(abi.encode(erc20PriceOracleReceiptVault)) == ICLONEABLE_V2_SUCCESS, + "Failed to init receipt" + ); + + config.receiptVaultConfig.receipt = address(receipt); + require( + erc20PriceOracleReceiptVault.initialize(abi.encode(config)) == ICLONEABLE_V2_SUCCESS, + "Failed to init erc20 price oracle receipt vault" + ); + } +} diff --git a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol index 79575daf..7e65cfa4 100644 --- a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol +++ b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol @@ -8,27 +8,35 @@ import {CloneFactory} from "rain.factory/concrete/CloneFactory.sol"; import { ERC20PriceOracleReceiptVault, ReceiptVaultConstructionConfigV2, - ERC20PriceOracleReceiptVaultConfigV2 + ERC20PriceOracleReceiptVaultConfigV2, + ReceiptVaultConfigV2 } from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; import {Receipt as ReceiptContract} from "../../src/concrete/receipt/Receipt.sol"; import {IERC20} from "forge-std/interfaces/IERC20.sol"; import {IPriceOracleV2} from "../../src/interface/IPriceOracleV2.sol"; +import { + ERC20PriceOracleReceiptVaultCloneDeployer, + ERC20PriceOracleReceiptVaultCloneDeployerConfig +} from "../../src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol"; contract ERC20PriceOracleReceiptVaultTest is Test { - ICloneableFactoryV2 internal immutable I_FACTORY; ERC20PriceOracleReceiptVault internal immutable I_IMPLEMENTATION; ReceiptContract internal immutable I_RECEIPT_IMPLEMENTATION; IERC20 immutable I_ASSET; IPriceOracleV2 immutable I_VAULT_ORACLE; + ERC20PriceOracleReceiptVaultCloneDeployer internal immutable I_DEPLOYER; constructor() { - I_FACTORY = new CloneFactory(); I_RECEIPT_IMPLEMENTATION = new ReceiptContract(); - I_IMPLEMENTATION = new ERC20PriceOracleReceiptVault( - ReceiptVaultConstructionConfigV2({factory: I_FACTORY, receiptImplementation: I_RECEIPT_IMPLEMENTATION}) - ); + I_IMPLEMENTATION = new ERC20PriceOracleReceiptVault(ReceiptVaultConstructionConfigV2()); I_ASSET = IERC20(address(uint160(uint256(keccak256("asset.test"))))); I_VAULT_ORACLE = IPriceOracleV2(payable(address(uint160(uint256(keccak256("vault.oracle")))))); + I_DEPLOYER = new ERC20PriceOracleReceiptVaultCloneDeployer( + ERC20PriceOracleReceiptVaultCloneDeployerConfig({ + receiptImplementation: address(I_RECEIPT_IMPLEMENTATION), + erc20PriceOracleReceiptVaultImplementation: address(I_IMPLEMENTATION) + }) + ); } function setVaultOraclePrice(uint256 oraclePrice) internal { diff --git a/test/abstract/OwnerFreezableOwnerFreezeUntilTest.sol b/test/abstract/OwnerFreezableOwnerFreezeUntilTest.sol index aeffac42..9b61dbb4 100644 --- a/test/abstract/OwnerFreezableOwnerFreezeUntilTest.sol +++ b/test/abstract/OwnerFreezableOwnerFreezeUntilTest.sol @@ -2,12 +2,12 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.25; -import {Test} from "forge-std/Test.sol"; import {IOwnerFreezableV1} from "src/abstract/OwnerFreezable.sol"; import {Math} from "openzeppelin-contracts/contracts/utils/math/Math.sol"; import {OwnableUpgradeable as Ownable} from "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol"; +import {OffchainAssetReceiptVaultTest} from "./OffchainAssetReceiptVaultTest.sol"; -abstract contract OwnerFreezableOwnerFreezeUntilTest is Test { +abstract contract OwnerFreezableOwnerFreezeUntilTest is OffchainAssetReceiptVaultTest { using Math for uint256; IOwnerFreezableV1 internal sOwnerFreezable; diff --git a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol index 54fbc6af..c0a7babb 100644 --- a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol +++ b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol @@ -49,7 +49,7 @@ contract ERC20PriceOracleReceiptVaultConstructionTest is ERC20PriceOracleReceipt // Assert that the event log was found assertTrue(eventFound, "ERC20PriceOracleReceiptVaultInitialized event log not found"); - assertEq(msgSender, address(I_FACTORY)); + assertEq(msgSender, address(0)); assert(address(vault) != address(0)); assertEq(keccak256(bytes(vault.name())), keccak256(bytes(config.receiptVaultConfig.name))); diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol index 8a700835..4f87a2ac 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol @@ -40,11 +40,7 @@ contract OffchainAssetReceiptVaultOwnerFreezeUntilTest is OwnerFreezableOwnerFre sAlice = address(123456); sBob = address(949330); - sOwnerFreezable = IOwnerFreezableV1( - LibOffchainAssetVaultCreator.createVault( - vm, I_FACTORY, I_IMPLEMENTATION, I_AUTHORIZER_IMPLEMENTATION, sAlice, "vault", "VLT" - ) - ); + sOwnerFreezable = IOwnerFreezableV1(createVault(sAlice, "vault", "VLT")); } function setupTokenTransferTest() internal returns (OffchainAssetReceiptVault) { From 16c5aa665a7d1aa8451cb0ad9c6aafc51f4b38b3 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 15:20:56 +0400 Subject: [PATCH 04/26] compile proxy agnostic --- src/abstract/ReceiptVault.sol | 13 +----- ...20PriceOracleReceiptVaultCloneDeployer.sol | 8 ++-- ...hainAssetReceiptVaultBeaconSetDeployer.sol | 22 ++++----- .../vault/ERC20PriceOracleReceiptVault.sol | 8 +--- .../vault/OffchainAssetReceiptVault.sol | 3 +- .../ERC20PriceOracleReceiptVaultTest.sol | 8 +--- ...chainAssetReceiptVaultAuthorizerV1Test.sol | 5 +-- .../OffchainAssetReceiptVaultTest.sol | 2 - test/concrete/ConcreteReceiptVault.sol | 9 +--- test/src/abstract/ReceiptVault.decimals.t.sol | 22 ++++++--- ...VaultPaymentMintAuthorizerV1.deposit.t.sol | 45 +------------------ .../OffchainAssetReceiptVault.ierc165.t.sol | 16 +------ ...inAssetReceiptVault.ownerFreezeUntil.t.sol | 22 +-------- 13 files changed, 47 insertions(+), 136 deletions(-) diff --git a/src/abstract/ReceiptVault.sol b/src/abstract/ReceiptVault.sol index ee8c8404..6525c53f 100644 --- a/src/abstract/ReceiptVault.sol +++ b/src/abstract/ReceiptVault.sol @@ -13,8 +13,8 @@ import { LibFixedPointDecimalArithmeticOpenZeppelin, Math } from "rain.math.fixedpoint/lib/LibFixedPointDecimalArithmeticOpenZeppelin.sol"; -import {ICloneableFactoryV2} from "rain.factory/interface/ICloneableFactoryV2.sol"; -//forge-lint: disable-next-line(unused-import) +// Export ICLONEABLE_V2_SUCCESS for concrete implementations. +// forge-lint: disable-next-line(unused-import) import {ICloneableV2, ICLONEABLE_V2_SUCCESS} from "rain.factory/interface/ICloneableV2.sol"; import {Address} from "openzeppelin-contracts/contracts/utils/Address.sol"; import { @@ -43,15 +43,6 @@ enum ShareAction { Burn } -/// Config for the _implementation_ of the `ReceiptVault` contract. -/// @param factory The factory that will be used to clone the receipt vault. -/// @param receiptImplementation The receipt implementation that will be cloned -/// by the factory. -struct ReceiptVaultConstructionConfigV2 { - ICloneableFactoryV2 factory; - IReceiptV3 receiptImplementation; -} - /// All config required to initialize `ReceiptVault`. /// @param receipt The `Receipt` e.g. built by `ReceiptVaultFactory` that is /// owned by the `ReceiptVault` as an `IReceiptOwnerV1`. diff --git a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol index e686116c..57d863c3 100644 --- a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol +++ b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol @@ -9,6 +9,7 @@ import { ERC20PriceOracleReceiptVaultConfigV2 } from "../vault/ERC20PriceOracleReceiptVault.sol"; +//forge-lint: disable-next-line(pascal-case-struct) struct ERC20PriceOracleReceiptVaultCloneDeployerConfig { address receiptImplementation; address erc20PriceOracleReceiptVaultImplementation; @@ -25,14 +26,13 @@ contract ERC20PriceOracleReceiptVaultCloneDeployer { function newERC20PriceOracleReceiptVault(ERC20PriceOracleReceiptVaultConfigV2 memory config) external - view - returns (address) + returns (ERC20PriceOracleReceiptVault) { require(config.receiptVaultConfig.receipt == address(0), "Receipt address must be zero"); Receipt receipt = Receipt(Clones.clone(I_RECEIPT_IMPLEMENTATION)); ERC20PriceOracleReceiptVault erc20PriceOracleReceiptVault = - ERC20PriceOracleReceiptVault(Clones.clone(I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION)); + ERC20PriceOracleReceiptVault(payable(Clones.clone(I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION))); require( receipt.initialize(abi.encode(erc20PriceOracleReceiptVault)) == ICLONEABLE_V2_SUCCESS, @@ -44,5 +44,7 @@ contract ERC20PriceOracleReceiptVaultCloneDeployer { erc20PriceOracleReceiptVault.initialize(abi.encode(config)) == ICLONEABLE_V2_SUCCESS, "Failed to init erc20 price oracle receipt vault" ); + + return erc20PriceOracleReceiptVault; } } diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol index 104434b4..fb4ebf18 100644 --- a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -14,27 +14,25 @@ struct OffchainAssetReceiptVaultBeaconSetDeployerConfig { } contract OffchainAssetReceiptVaultBeaconSetDeployer { - address immutable I_RECEIPT_BEACON; - address immutable I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON; + IBeacon immutable I_RECEIPT_BEACON; + IBeacon immutable I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON; constructor(OffchainAssetReceiptVaultBeaconSetDeployerConfig memory config) { - I_RECEIPT_BEACON = - address(new UpgradeableBeacon(address(config.initialReceiptImplementation), config.initialOwner)); - I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON = address( - new UpgradeableBeacon(address(config.initialOffchainAssetReceiptVaultImplementation), config.initialOwner) - ); + I_RECEIPT_BEACON = new UpgradeableBeacon(address(config.initialReceiptImplementation), config.initialOwner); + I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON = + new UpgradeableBeacon(address(config.initialOffchainAssetReceiptVaultImplementation), config.initialOwner); } function newOffchainAssetReceiptVault(OffchainAssetReceiptVaultConfigV2 memory config) external - view returns (OffchainAssetReceiptVault) { require(config.receiptVaultConfig.receipt == address(0), "Receipt address must be zero"); - Receipt receipt = Receipt(address(new BeaconProxy(I_RECEIPT_BEACON, ""))); - OffchainAssetReceiptVault offchainAssetReceiptVault = - OffchainAssetReceiptVault(payable(address(new BeaconProxy(I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON, "")))); + Receipt receipt = Receipt(address(new BeaconProxy(address(I_RECEIPT_BEACON), ""))); + OffchainAssetReceiptVault offchainAssetReceiptVault = OffchainAssetReceiptVault( + payable(address(new BeaconProxy(address(I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON), ""))) + ); require( receipt.initialize(abi.encode(offchainAssetReceiptVault)) == ICLONEABLE_V2_SUCCESS, "Failed to init receipt" @@ -45,5 +43,7 @@ contract OffchainAssetReceiptVaultBeaconSetDeployer { offchainAssetReceiptVault.initialize(abi.encode(config)) == ICLONEABLE_V2_SUCCESS, "Failed to init offchain asset receipt vault" ); + + return offchainAssetReceiptVault; } } diff --git a/src/concrete/vault/ERC20PriceOracleReceiptVault.sol b/src/concrete/vault/ERC20PriceOracleReceiptVault.sol index 3937e2e7..d2bdeb06 100644 --- a/src/concrete/vault/ERC20PriceOracleReceiptVault.sol +++ b/src/concrete/vault/ERC20PriceOracleReceiptVault.sol @@ -2,13 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import { - ReceiptVaultConfigV2, - ReceiptVault, - ShareAction, - ICLONEABLE_V2_SUCCESS, - ReceiptVaultConstructionConfigV2 -} from "../../abstract/ReceiptVault.sol"; +import {ReceiptVaultConfigV2, ReceiptVault, ShareAction, ICLONEABLE_V2_SUCCESS} from "../../abstract/ReceiptVault.sol"; import {IPriceOracleV2} from "../../interface/IPriceOracleV2.sol"; /// @dev String ID for the ERC20PriceOracleReceiptVault storage location v1. diff --git a/src/concrete/vault/OffchainAssetReceiptVault.sol b/src/concrete/vault/OffchainAssetReceiptVault.sol index 9e2962a4..2ef759dd 100644 --- a/src/concrete/vault/OffchainAssetReceiptVault.sol +++ b/src/concrete/vault/OffchainAssetReceiptVault.sol @@ -7,8 +7,7 @@ import { ReceiptVault, ShareAction, InvalidId, - ICLONEABLE_V2_SUCCESS, - ReceiptVaultConstructionConfigV2 + ICLONEABLE_V2_SUCCESS } from "../../abstract/ReceiptVault.sol"; import {Math} from "openzeppelin-contracts/contracts/utils/math/Math.sol"; import {IAuthorizeV1, Unauthorized} from "../../interface/IAuthorizeV1.sol"; diff --git a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol index 7e65cfa4..9baa0f1f 100644 --- a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol +++ b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol @@ -3,11 +3,8 @@ pragma solidity =0.8.25; import {Test, Vm} from "forge-std/Test.sol"; -import {ICloneableFactoryV2} from "rain.factory/interface/ICloneableFactoryV2.sol"; -import {CloneFactory} from "rain.factory/concrete/CloneFactory.sol"; import { ERC20PriceOracleReceiptVault, - ReceiptVaultConstructionConfigV2, ERC20PriceOracleReceiptVaultConfigV2, ReceiptVaultConfigV2 } from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; @@ -28,7 +25,7 @@ contract ERC20PriceOracleReceiptVaultTest is Test { constructor() { I_RECEIPT_IMPLEMENTATION = new ReceiptContract(); - I_IMPLEMENTATION = new ERC20PriceOracleReceiptVault(ReceiptVaultConstructionConfigV2()); + I_IMPLEMENTATION = new ERC20PriceOracleReceiptVault(); I_ASSET = IERC20(address(uint160(uint256(keccak256("asset.test"))))); I_VAULT_ORACLE = IPriceOracleV2(payable(address(uint160(uint256(keccak256("vault.oracle")))))); I_DEPLOYER = new ERC20PriceOracleReceiptVaultCloneDeployer( @@ -51,14 +48,13 @@ contract ERC20PriceOracleReceiptVaultTest is Test { { return I_DEPLOYER.newERC20PriceOracleReceiptVault( ERC20PriceOracleReceiptVaultConfigV2({ - initialAdmin: address(this), receiptVaultConfig: ReceiptVaultConfigV2({ asset: address(I_ASSET), name: name, symbol: symbol, receipt: address(0) }), - vaultPriceOracle: priceOracle + priceOracle: priceOracle }) ); } diff --git a/test/abstract/OffchainAssetReceiptVaultAuthorizerV1Test.sol b/test/abstract/OffchainAssetReceiptVaultAuthorizerV1Test.sol index 669df251..b5e52db4 100644 --- a/test/abstract/OffchainAssetReceiptVaultAuthorizerV1Test.sol +++ b/test/abstract/OffchainAssetReceiptVaultAuthorizerV1Test.sol @@ -2,8 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.25; -import {Test} from "forge-std/Test.sol"; - +import {OffchainAssetReceiptVaultTest} from "./OffchainAssetReceiptVaultTest.sol"; import {IAuthorizeV1, Unauthorized} from "src/interface/IAuthorizeV1.sol"; import { TRANSFER_SHARES, @@ -13,7 +12,7 @@ import { import {IAccessControl} from "openzeppelin-contracts/contracts/access/IAccessControl.sol"; import {TransferSharesStateChange, TransferReceiptStateChange} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; -contract OffchainAssetReceiptVaultAuthorizerV1Test is Test { +contract OffchainAssetReceiptVaultAuthorizerV1Test is OffchainAssetReceiptVaultTest { function checkDefaultOffchainAssetReceiptVaultAuthorizerV1AuthorizeUnauthorized( IAuthorizeV1 authorizer, address sender, diff --git a/test/abstract/OffchainAssetReceiptVaultTest.sol b/test/abstract/OffchainAssetReceiptVaultTest.sol index 647ffe65..3b37dcc1 100644 --- a/test/abstract/OffchainAssetReceiptVaultTest.sol +++ b/test/abstract/OffchainAssetReceiptVaultTest.sol @@ -3,8 +3,6 @@ pragma solidity =0.8.25; import {Test, Vm} from "forge-std/Test.sol"; -import {ICloneableFactoryV2} from "rain.factory/interface/ICloneableFactoryV2.sol"; -import {CloneFactory} from "rain.factory/concrete/CloneFactory.sol"; import { OffchainAssetReceiptVaultConfigV2, OffchainAssetReceiptVault, diff --git a/test/concrete/ConcreteReceiptVault.sol b/test/concrete/ConcreteReceiptVault.sol index 8b922879..62ccc629 100644 --- a/test/concrete/ConcreteReceiptVault.sol +++ b/test/concrete/ConcreteReceiptVault.sol @@ -2,14 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import { - ReceiptVault, - ReceiptVaultConstructionConfigV2, - ReceiptVaultConfigV2, - ICloneableFactoryV2 -} from "../../src/abstract/ReceiptVault.sol"; -import {CloneFactory} from "rain.factory/concrete/CloneFactory.sol"; -import {Receipt} from "../../src/concrete/receipt/Receipt.sol"; +import {ReceiptVault, ReceiptVaultConfigV2} from "../../src/abstract/ReceiptVault.sol"; import {ICLONEABLE_V2_SUCCESS} from "rain.factory/interface/ICloneableV2.sol"; contract ConcreteReceiptVault is ReceiptVault { diff --git a/test/src/abstract/ReceiptVault.decimals.t.sol b/test/src/abstract/ReceiptVault.decimals.t.sol index 2022c69d..fd4c667f 100644 --- a/test/src/abstract/ReceiptVault.decimals.t.sol +++ b/test/src/abstract/ReceiptVault.decimals.t.sol @@ -5,6 +5,8 @@ pragma solidity =0.8.25; import {ConcreteReceiptVault} from "test/concrete/ConcreteReceiptVault.sol"; import {TestErc20} from "test/concrete/TestErc20.sol"; import {ReceiptVaultConfigV2} from "src/abstract/ReceiptVault.sol"; +import {Clones} from "openzeppelin-contracts/contracts/proxy/Clones.sol"; +import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; import {Test} from "forge-std/Test.sol"; @@ -16,17 +18,25 @@ contract ReceiptVaultDecimalsTest is Test { } function testDecimalsWithNonZeroAsset(uint8 assetDecimals) external { + ReceiptContract receiptImplementation = new ReceiptContract(); ConcreteReceiptVault receiptVaultImplementation = new ConcreteReceiptVault(); TestErc20 asset = new TestErc20(); - ConcreteReceiptVault receiptVault = ConcreteReceiptVault( - payable( - receiptVaultImplementation.factory().clone( - address(receiptVaultImplementation), - abi.encode(ReceiptVaultConfigV2({asset: address(asset), name: "Test Vault", symbol: "TVLT"})) - ) + ReceiptContract receipt = ReceiptContract(Clones.clone(address(receiptImplementation))); + ConcreteReceiptVault receiptVault = + ConcreteReceiptVault(payable(Clones.clone(address(receiptVaultImplementation)))); + receipt.initialize(abi.encode(address(receiptVault))); + receiptVault.initialize( + abi.encode( + ReceiptVaultConfigV2({ + asset: address(asset), + name: "Test Vault", + symbol: "TVLT", + receipt: address(receipt) + }) ) ); + asset.setDecimals(assetDecimals); assertEq(receiptVault.asset(), address(asset)); diff --git a/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol b/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol index 6003a9ec..a11f21fc 100644 --- a/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol +++ b/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol @@ -14,33 +14,14 @@ import {OffchainAssetReceiptVaultPaymentMintAuthorizerV1Config} from "src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.sol"; import {DepositStateChange, DEPOSIT, CERTIFY} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; import {IERC20} from "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; -import {Receipt as ReceiptContract} from "../../../../src/concrete/receipt/Receipt.sol"; import {OffchainAssetReceiptVault} from "../../../../src/concrete/vault/OffchainAssetReceiptVault.sol"; -import { - ReceiptVaultConstructionConfigV2, - ReceiptVaultConfigV2, - OffchainAssetReceiptVaultConfigV2 -} from "../../../../src/concrete/vault/OffchainAssetReceiptVault.sol"; import {VerifyAlwaysApproved} from "rain.verify.interface/concrete/VerifyAlwaysApproved.sol"; import {LibFixedPointDecimalScale, FLAG_ROUND_UP} from "rain.math.fixedpoint/lib/LibFixedPointDecimalScale.sol"; -import {ICloneableFactoryV2} from "rain.factory/interface/ICloneableFactoryV2.sol"; import {IERC20Errors} from "openzeppelin-contracts-upgradeable/contracts/token/ERC20/ERC20Upgradeable.sol"; import {TestErc20} from "test/concrete/TestErc20.sol"; contract OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest is OffchainAssetReceiptVaultAuthorizerV1Test { - ICloneableFactoryV2 internal immutable I_FACTORY; - ReceiptContract internal immutable I_RECEIPT_IMPLEMENTATION; - OffchainAssetReceiptVault internal immutable I_IMPLEMENTATION; - - constructor() { - I_FACTORY = new CloneFactory(); - I_RECEIPT_IMPLEMENTATION = new ReceiptContract(); - I_IMPLEMENTATION = new OffchainAssetReceiptVault( - ReceiptVaultConstructionConfigV2({factory: I_FACTORY, receiptImplementation: I_RECEIPT_IMPLEMENTATION}) - ); - } - function newAuthorizer(address receiptVault, address owner, address paymentToken, uint256 maxSharesSupply) internal returns (OffchainAssetReceiptVaultPaymentMintAuthorizerV1) @@ -77,22 +58,7 @@ contract OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest is Offchain firstShares = bound(firstShares, 1, maxShares - totalSupply - 1); uint256 paymentAmount = firstShares; - OffchainAssetReceiptVault receiptVaultImplementation = new OffchainAssetReceiptVault( - ReceiptVaultConstructionConfigV2({factory: new CloneFactory(), receiptImplementation: new ReceiptContract()}) - ); - OffchainAssetReceiptVault receiptVault = OffchainAssetReceiptVault( - payable( - (new CloneFactory()).clone( - address(receiptVaultImplementation), - abi.encode( - OffchainAssetReceiptVaultConfigV2({ - initialAdmin: alice, - receiptVaultConfig: ReceiptVaultConfigV2({asset: address(0), name: "Test Vault", symbol: "TVLT"}) - }) - ) - ) - ) - ); + OffchainAssetReceiptVault receiptVault = createVault(bob, "foo", "bar"); vm.mockCall(address(receiptVault), abi.encodeWithSelector(IERC20.totalSupply.selector), abi.encode(totalSupply)); @@ -408,14 +374,7 @@ contract OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest is Offchain vm.assume(alice.code.length == 0); vm.assume(uint160(alice) > type(uint160).max / 2); - OffchainAssetReceiptVaultConfigV2 memory offchainAssetVaultConfig = OffchainAssetReceiptVaultConfigV2({ - initialAdmin: bob, - receiptVaultConfig: ReceiptVaultConfigV2({asset: address(0), name: "foo", symbol: "bar"}) - }); - // Use the factory to create the child contract - OffchainAssetReceiptVault receiptVault = OffchainAssetReceiptVault( - payable(I_FACTORY.clone(address(I_IMPLEMENTATION), abi.encode(offchainAssetVaultConfig))) - ); + OffchainAssetReceiptVault receiptVault = createVault(bob, "foo", "bar"); vm.prank(alice); TestErc20 paymentToken = new TestErc20(); diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.ierc165.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.ierc165.t.sol index 2f7a137b..bb18fbdd 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.ierc165.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.ierc165.t.sol @@ -2,14 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import { - ReceiptVaultConstructionConfigV2, - IReceiptV3, - ICloneableFactoryV2, - IReceiptManagerV2, - IReceiptVaultV3, - ICloneableV2 -} from "src/abstract/ReceiptVault.sol"; +import {IReceiptManagerV2, IReceiptVaultV3, ICloneableV2} from "src/abstract/ReceiptVault.sol"; import {Test} from "forge-std/Test.sol"; import {OffchainAssetReceiptVault, IAuthorizeV1} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; @@ -17,12 +10,7 @@ import {IERC165} from "openzeppelin-contracts/contracts/utils/introspection/IERC contract OffchainAssetReceiptVaultIERC165Test is Test { function testOffchainAssetReceiptVaultIERC165(bytes4 badInterfaceId) external { - OffchainAssetReceiptVault receiptVault = new OffchainAssetReceiptVault( - ReceiptVaultConstructionConfigV2({ - factory: ICloneableFactoryV2(address(0)), - receiptImplementation: IReceiptV3(address(0)) - }) - ); + OffchainAssetReceiptVault receiptVault = new OffchainAssetReceiptVault(); vm.assume(badInterfaceId != type(IERC165).interfaceId); vm.assume(badInterfaceId != type(IReceiptManagerV2).interfaceId); vm.assume(badInterfaceId != type(IReceiptVaultV3).interfaceId); diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol index 4f87a2ac..6400bc3c 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol @@ -6,15 +6,9 @@ import {console2} from "forge-std/Test.sol"; import { OwnerFreezableOwnerFreezeUntilTest, IOwnerFreezableV1 } from "test/abstract/OwnerFreezableOwnerFreezeUntilTest.sol"; -import {ICloneableFactoryV2} from "rain.factory/interface/ICloneableFactoryV2.sol"; +import {OffchainAssetReceiptVault} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; +import {IReceiptV3} from "../../../../src/concrete/receipt/Receipt.sol"; import { - OffchainAssetReceiptVault, - ReceiptVaultConstructionConfigV2 -} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; -import {Receipt as ReceiptContract, IReceiptV3} from "../../../../src/concrete/receipt/Receipt.sol"; -import {CloneFactory} from "rain.factory/concrete/CloneFactory.sol"; -import { - OffchainAssetReceiptVaultAuthorizerV1, CERTIFY, DEPOSIT, WITHDRAW, @@ -24,19 +18,7 @@ import { import {IAccessControl} from "openzeppelin-contracts/contracts/access/IAccessControl.sol"; contract OffchainAssetReceiptVaultOwnerFreezeUntilTest is OwnerFreezableOwnerFreezeUntilTest { - ICloneableFactoryV2 internal immutable I_FACTORY; - OffchainAssetReceiptVault internal immutable I_IMPLEMENTATION; - ReceiptContract internal immutable I_RECEIPT_IMPLEMENTATION; - OffchainAssetReceiptVaultAuthorizerV1 internal immutable I_AUTHORIZER_IMPLEMENTATION; - constructor() { - I_FACTORY = new CloneFactory(); - I_RECEIPT_IMPLEMENTATION = new ReceiptContract(); - I_IMPLEMENTATION = new OffchainAssetReceiptVault( - ReceiptVaultConstructionConfigV2({factory: I_FACTORY, receiptImplementation: I_RECEIPT_IMPLEMENTATION}) - ); - I_AUTHORIZER_IMPLEMENTATION = new OffchainAssetReceiptVaultAuthorizerV1(); - sAlice = address(123456); sBob = address(949330); From c38275f3d08f241fd55bf10432230fe1afe9a2a0 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 15:53:01 +0400 Subject: [PATCH 05/26] fix tests --- test/abstract/OffchainAssetReceiptVaultTest.sol | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/test/abstract/OffchainAssetReceiptVaultTest.sol b/test/abstract/OffchainAssetReceiptVaultTest.sol index 3b37dcc1..880a4c90 100644 --- a/test/abstract/OffchainAssetReceiptVaultTest.sol +++ b/test/abstract/OffchainAssetReceiptVaultTest.sol @@ -9,12 +9,15 @@ import { ReceiptVaultConfigV2 } from "src/concrete/vault/OffchainAssetReceiptVault.sol"; import {Receipt as ReceiptContract} from "../../src/concrete/receipt/Receipt.sol"; -import {OffchainAssetReceiptVaultAuthorizerV1} from - "../../src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; +import { + OffchainAssetReceiptVaultAuthorizerV1, + OffchainAssetReceiptVaultAuthorizerV1Config +} from "../../src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; import { OffchainAssetReceiptVaultBeaconSetDeployer, OffchainAssetReceiptVaultBeaconSetDeployerConfig } from "../../src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol"; +import {Clones} from "openzeppelin-contracts/contracts/proxy/Clones.sol"; contract OffchainAssetReceiptVaultTest is Test { OffchainAssetReceiptVault internal immutable I_IMPLEMENTATION; @@ -39,7 +42,7 @@ contract OffchainAssetReceiptVaultTest is Test { internal returns (OffchainAssetReceiptVault) { - return I_DEPLOYER.newOffchainAssetReceiptVault( + OffchainAssetReceiptVault vault = I_DEPLOYER.newOffchainAssetReceiptVault( OffchainAssetReceiptVaultConfigV2({ initialAdmin: admin, receiptVaultConfig: ReceiptVaultConfigV2({ @@ -50,6 +53,12 @@ contract OffchainAssetReceiptVaultTest is Test { }) }) ); + OffchainAssetReceiptVaultAuthorizerV1 authorizer = + OffchainAssetReceiptVaultAuthorizerV1(Clones.clone(address(I_AUTHORIZER_IMPLEMENTATION))); + authorizer.initialize(abi.encode(OffchainAssetReceiptVaultAuthorizerV1Config({initialAdmin: admin}))); + vm.prank(admin); + vault.setAuthorizer(authorizer); + return vault; } function getReceipt(Vm.Log[] memory logs) internal pure returns (ReceiptContract) { From f5d0b6b25d0ed21c8387cdddca76ffed86ba930a Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 16:04:31 +0400 Subject: [PATCH 06/26] fix tests --- ...hainAssetReceiptVaultBeaconSetDeployer.sol | 4 ++-- .../OffchainAssetReceiptVault.construct.t.sol | 22 ++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol index fb4ebf18..cfcdc079 100644 --- a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -14,8 +14,8 @@ struct OffchainAssetReceiptVaultBeaconSetDeployerConfig { } contract OffchainAssetReceiptVaultBeaconSetDeployer { - IBeacon immutable I_RECEIPT_BEACON; - IBeacon immutable I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON; + IBeacon public immutable I_RECEIPT_BEACON; + IBeacon public immutable I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON; constructor(OffchainAssetReceiptVaultBeaconSetDeployerConfig memory config) { I_RECEIPT_BEACON = new UpgradeableBeacon(address(config.initialReceiptImplementation), config.initialOwner); diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol index 56138071..3cee0e19 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol @@ -13,13 +13,33 @@ import { ZeroInitialAdmin, NonZeroAsset } from "src/concrete/vault/OffchainAssetReceiptVault.sol"; +import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; +import {BeaconProxy} from "openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol"; import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenerator.sol"; contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { /// Test that admin is not address zero function testZeroInitialAdmin(string memory shareName, string memory shareSymbol) external { + ReceiptContract receipt = ReceiptContract(address(new BeaconProxy(address(I_DEPLOYER.I_RECEIPT_BEACON()), ""))); + OffchainAssetReceiptVault offchainAssetReceiptVault = OffchainAssetReceiptVault( + payable(address(new BeaconProxy(address(I_DEPLOYER.I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON()), ""))) + ); + receipt.initialize(abi.encode(offchainAssetReceiptVault)); + vm.expectRevert(abi.encodeWithSelector(ZeroInitialAdmin.selector)); - createVault(address(0), shareName, shareSymbol); + offchainAssetReceiptVault.initialize( + abi.encode( + OffchainAssetReceiptVaultConfigV2({ + initialAdmin: address(0), + receiptVaultConfig: ReceiptVaultConfigV2({ + asset: address(0), + name: shareName, + symbol: shareSymbol, + receipt: address(receipt) + }) + }) + ) + ); } /// Test that asset is address zero From 6de6b78c13f84c368d30f14bba9eab4c1b5a894b Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 16:40:59 +0400 Subject: [PATCH 07/26] fix tests --- .gas-snapshot | 468 +++++++++--------- .../OffchainAssetReceiptVaultTest.sol | 3 +- ...VaultPaymentMintAuthorizerV1.deposit.t.sol | 2 +- ...0PriceOracleReceiptVault.initialize.t.sol} | 25 +- ...ffchainAssetReceiptVault.initialize.t.sol} | 21 +- 5 files changed, 264 insertions(+), 255 deletions(-) rename test/src/concrete/vault/{ERC20PriceOracleReceiptVault.construct.t.sol => ERC20PriceOracleReceiptVault.initialize.t.sol} (85%) rename test/src/concrete/vault/{OffchainAssetReceiptVault.construct.t.sol => OffchainAssetReceiptVault.initialize.t.sol} (91%) diff --git a/.gas-snapshot b/.gas-snapshot index 1520c07f..d9c000fa 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,7 +1,7 @@ -ConfiscateReceiptTest:testConfiscateReceiptBasic(uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 251, μ: 1246167, ~: 1254115) -ConfiscateReceiptTest:testConfiscateReceiptOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256) (runs: 254, μ: 1003696, ~: 1004248) -ConfiscateSharesTest:testConfiscateSharesBasic(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 252, μ: 1194631, ~: 1201819) -ConfiscateSharesTest:testConfiscateSharesOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256,uint256) (runs: 253, μ: 1112500, ~: 1114908) +ConfiscateReceiptTest:testConfiscateReceiptBasic(uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 252, μ: 1402006, ~: 1410301) +ConfiscateReceiptTest:testConfiscateReceiptOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256) (runs: 255, μ: 1153887, ~: 1154437) +ConfiscateSharesTest:testConfiscateSharesBasic(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 253, μ: 1349905, ~: 1357279) +ConfiscateSharesTest:testConfiscateSharesOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256,uint256) (runs: 254, μ: 1266457, ~: 1268538) ERC20PriceOracleReceiptMetadataTest:testOverriddenMetadataWithImage(uint256,string,string,string,string,string,string,uint8) (runs: 242, μ: 3134470, ~: 3135563) ERC20PriceOracleReceiptMetadataTest:testOverriddenMetadataWithoutImage(uint256,string,string,string,string,string,uint8) (runs: 254, μ: 3063586, ~: 3069077) ERC20PriceOracleReceiptMetadataTest:testReceiptName() (gas: 770273) @@ -9,164 +9,164 @@ ERC20PriceOracleReceiptMetadataTest:testReceiptSymbol() (gas: 770295) ERC20PriceOracleReceiptMetadataTest:testReceiptURI(uint256) (runs: 248, μ: 822451, ~: 822688) ERC20PriceOracleReceiptMetadataTest:testReceiptURIZeroError() (gas: 769391) ERC20PriceOracleReceiptVault7201Test:testERC20PriceOracleReceiptVault7201StorageLocation() (gas: 671) -ERC20PriceOracleReceiptVaultAssetTest:testVaultAsset(string,string) (runs: 256, μ: 340136, ~: 339584) -ERC20PriceOracleReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 609739, ~: 610583) -ERC20PriceOracleReceiptVaultConstructionTest:testConstructionEvent(uint256,string,string) (runs: 256, μ: 418427, ~: 414141) -ERC20PriceOracleReceiptVaultConstructionTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 256, μ: 785948, ~: 787017) -ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 398842, ~: 399950) -ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 458655, ~: 455480) -ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 399352, ~: 400519) -ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 459023, ~: 455320) -ERC20PriceOracleReceiptVaultDepositTest:testDepositBasic(uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 529291, ~: 529158) -ERC20PriceOracleReceiptVaultDepositTest:testDepositMinShareRatio(uint256,string,string,bytes,uint256,uint256,uint256) (runs: 256, μ: 475924, ~: 473231) -ERC20PriceOracleReceiptVaultDepositTest:testDepositSomeoneElse(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 254, μ: 582680, ~: 585320) -ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,string,string,bytes,uint256,uint256) (runs: 256, μ: 492810, ~: 493588) -ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroReceiver(string,string,bytes,uint256,uint256,uint256) (runs: 256, μ: 386557, ~: 387024) -ERC20PriceOracleReceiptVaultDepositTest:testMultipleDeposits(uint256,string,string,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 256, μ: 999919, ~: 996738) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 256, μ: 430421, ~: 430417) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 256, μ: 406229, ~: 401944) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256) (runs: 256, μ: 513101, ~: 514253) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256) (runs: 256, μ: 527448, ~: 527260) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256) (runs: 181, μ: 575681, ~: 575259) -ERC20PriceOracleReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 256, μ: 398609, ~: 394349) -ERC20PriceOracleReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 256, μ: 398674, ~: 394414) -ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 156, μ: 580593, ~: 581267) -ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 159, μ: 586135, ~: 585942) -ERC20PriceOracleReceiptVaultMintTest:testMintBasic(string,string,uint256,uint256,bytes) (runs: 256, μ: 477536, ~: 476557) -ERC20PriceOracleReceiptVaultMintTest:testMintSomeoneElse(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 587899, ~: 583941) -ERC20PriceOracleReceiptVaultMintTest:testMintWithMinShareRatio(string,string,uint256,uint256,uint256,bytes) (runs: 256, μ: 365931, ~: 365525) -ERC20PriceOracleReceiptVaultMintTest:testMintWithZeroShares(string,string,uint256,uint256,bytes) (runs: 256, μ: 388849, ~: 388503) -ERC20PriceOracleReceiptVaultMintTest:testMultipleMints(string,string,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 256, μ: 543220, ~: 542676) -ERC20PriceOracleReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(string,string,uint256,uint256) (runs: 256, μ: 353747, ~: 351478) -ERC20PriceOracleReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(string,string,uint256,uint256) (runs: 256, μ: 353944, ~: 351573) -ERC20PriceOracleReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,string,string,uint256,uint256) (runs: 246, μ: 402003, ~: 402837) -ERC20PriceOracleReceiptVaultPreviewWithdrawTest:testPreviewWithdraw(uint256,string,string,uint256,uint256) (runs: 256, μ: 401861, ~: 402931) -ERC20PriceOracleReceiptVaultReceiptTest:testVaultAsset(string,string) (runs: 256, μ: 341049, ~: 340497) -ERC20PriceOracleReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 256, μ: 397125, ~: 399728) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemBasic(uint256,string,string,uint256,uint256,uint256) (runs: 239, μ: 550454, ~: 551725) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemFlareFork(uint256) (runs: 1, μ: 544963, ~: 544963) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemMoreThanBalance(uint256,string,string,uint256,uint256,uint256) (runs: 255, μ: 534402, ~: 535384) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroOwner(uint256,string,string,uint256,uint256,uint256) (runs: 239, μ: 527216, ~: 528487) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroReceiver(uint256,string,string,uint256,uint256,uint256) (runs: 239, μ: 531380, ~: 532651) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 528514, ~: 529674) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 233, μ: 631956, ~: 633475) -ERC20PriceOracleReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 256, μ: 403001, ~: 399630) -ERC20PriceOracleReceiptVaultWithdrawTest:testMultiplePricesAndHistoricalRedemptionsAndMint(uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 800942, ~: 801097) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 806843, ~: 811535) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawBasic(uint256,string,string,uint256,uint256) (runs: 256, μ: 543798, ~: 549851) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawFlareFork(uint256) (runs: 1, μ: 545150, ~: 545150) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawMoreThanAssets(uint256,string,string,uint256,uint256,uint256) (runs: 255, μ: 533917, ~: 534682) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 528325, ~: 529485) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroOwner(uint256,string,string,uint256,uint256) (runs: 256, μ: 526175, ~: 527334) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroReceiver(uint256,string,string,uint256,uint256) (runs: 255, μ: 529321, ~: 530754) +ERC20PriceOracleReceiptVaultAssetTest:testVaultAsset(string,string) (runs: 256, μ: 336842, ~: 336290) +ERC20PriceOracleReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 606337, ~: 607218) +ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 395569, ~: 396658) +ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 455375, ~: 452214) +ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 396077, ~: 397621) +ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 455748, ~: 452055) +ERC20PriceOracleReceiptVaultDepositTest:testDepositBasic(uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 525931, ~: 525675) +ERC20PriceOracleReceiptVaultDepositTest:testDepositMinShareRatio(uint256,string,string,bytes,uint256,uint256,uint256) (runs: 256, μ: 472549, ~: 469876) +ERC20PriceOracleReceiptVaultDepositTest:testDepositSomeoneElse(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 254, μ: 579327, ~: 581974) +ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,string,string,bytes,uint256,uint256) (runs: 256, μ: 489441, ~: 490211) +ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroReceiver(string,string,bytes,uint256,uint256,uint256) (runs: 256, μ: 383195, ~: 383788) +ERC20PriceOracleReceiptVaultDepositTest:testMultipleDeposits(uint256,string,string,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 256, μ: 993206, ~: 990045) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 256, μ: 427149, ~: 427145) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 256, μ: 402939, ~: 398653) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256) (runs: 256, μ: 509808, ~: 510967) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256) (runs: 256, μ: 524176, ~: 523996) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256) (runs: 177, μ: 572408, ~: 571996) +ERC20PriceOracleReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 256, μ: 779254, ~: 780323) +ERC20PriceOracleReceiptVaultInitializeTest:testERC20PriceOracleReceiptVaultInitializedV2Event(uint256,string,string) (runs: 257, μ: 411927, ~: 407483) +ERC20PriceOracleReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 256, μ: 395316, ~: 391055) +ERC20PriceOracleReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 256, μ: 395381, ~: 391120) +ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 154, μ: 576735, ~: 577948) +ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 148, μ: 582482, ~: 582722) +ERC20PriceOracleReceiptVaultMintTest:testMintBasic(string,string,uint256,uint256,bytes) (runs: 256, μ: 474185, ~: 473214) +ERC20PriceOracleReceiptVaultMintTest:testMintSomeoneElse(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 584551, ~: 580591) +ERC20PriceOracleReceiptVaultMintTest:testMintWithMinShareRatio(string,string,uint256,uint256,uint256,bytes) (runs: 256, μ: 362542, ~: 362170) +ERC20PriceOracleReceiptVaultMintTest:testMintWithZeroShares(string,string,uint256,uint256,bytes) (runs: 256, μ: 385481, ~: 385148) +ERC20PriceOracleReceiptVaultMintTest:testMultipleMints(string,string,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 256, μ: 539825, ~: 539254) +ERC20PriceOracleReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(string,string,uint256,uint256) (runs: 256, μ: 350413, ~: 348129) +ERC20PriceOracleReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(string,string,uint256,uint256) (runs: 256, μ: 350598, ~: 348381) +ERC20PriceOracleReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,string,string,uint256,uint256) (runs: 247, μ: 398519, ~: 399545) +ERC20PriceOracleReceiptVaultPreviewWithdrawTest:testPreviewWithdraw(uint256,string,string,uint256,uint256) (runs: 256, μ: 398568, ~: 399639) +ERC20PriceOracleReceiptVaultReceiptTest:testVaultAsset(string,string) (runs: 256, μ: 337697, ~: 337145) +ERC20PriceOracleReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 256, μ: 393830, ~: 396434) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemBasic(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 543805, ~: 545137) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemFlareFork(uint256) (runs: 1, μ: 544965, ~: 544965) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemMoreThanBalance(uint256,string,string,uint256,uint256,uint256) (runs: 255, μ: 527751, ~: 528744) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroOwner(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 520568, ~: 521900) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroReceiver(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 524678, ~: 526010) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 521888, ~: 523035) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 235, μ: 625549, ~: 626775) +ERC20PriceOracleReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 256, μ: 399712, ~: 396341) +ERC20PriceOracleReceiptVaultWithdrawTest:testMultiplePricesAndHistoricalRedemptionsAndMint(uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 794119, ~: 794277) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 803374, ~: 808141) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawBasic(uint256,string,string,uint256,uint256) (runs: 256, μ: 536753, ~: 543265) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawFlareFork(uint256) (runs: 1, μ: 545152, ~: 545152) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawMoreThanAssets(uint256,string,string,uint256,uint256,uint256) (runs: 255, μ: 527272, ~: 528044) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 521694, ~: 522846) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroOwner(uint256,string,string,uint256,uint256) (runs: 256, μ: 519596, ~: 520749) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroReceiver(uint256,string,string,uint256,uint256) (runs: 255, μ: 522687, ~: 524115) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOracle() (gas: 461762) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOraclePaid(uint128) (runs: 1, μ: 701707, ~: 701707) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOracleStale() (gas: 462499) -MulticallTest:testDepositMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1142435, ~: 1141389) -MulticallTest:testMintMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1142472, ~: 1141426) -MulticallTest:testRedeemMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 255, μ: 1149306, ~: 1149907) -MulticallTest:testWithdrawMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 255, μ: 1149483, ~: 1150084) -OffChainAssetReceiptVaultTest:testConstructionEvent(uint256,string,string) (runs: 256, μ: 429322, ~: 425034) -OffChainAssetReceiptVaultTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 256, μ: 1685587, ~: 1686656) -OffChainAssetReceiptVaultTest:testNonZeroAsset(uint256,address,string,string) (runs: 254, μ: 367826, ~: 365224) -OffChainAssetReceiptVaultTest:testZeroInitialAdmin(string,string) (runs: 256, μ: 293498, ~: 292946) +MulticallTest:testDepositMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296345, ~: 1295312) +MulticallTest:testMintMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296387, ~: 1295349) +MulticallTest:testRedeemMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1308259, ~: 1309070) +MulticallTest:testWithdrawMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1308610, ~: 1309247) +OffChainAssetReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 256, μ: 1976916, ~: 1977987) +OffChainAssetReceiptVaultInitializeTest:testNonZeroAsset(uint256,address,string,string) (runs: 256, μ: 515560, ~: 513151) +OffChainAssetReceiptVaultInitializeTest:testOffchainAssetReceiptVaultInitializedV2Event(uint256,string,string) (runs: 257, μ: 1054742, ~: 1050296) +OffChainAssetReceiptVaultInitializeTest:testZeroInitialAdmin(string,string) (runs: 256, μ: 440060, ~: 439508) OffchainAssetReceiptVault7201Test:testOffchainAssetReceiptVault7201StorageLocation() (gas: 671) -OffchainAssetReceiptVaultAssetTest:testVaultAsset(uint256,string,string) (runs: 256, μ: 846385, ~: 842125) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscator(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 255, μ: 1711933, ~: 1712563) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscatorTo(uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 1322182, ~: 1320474) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 1273169, ~: 1272725) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferRevertExpiredCertification(uint256,uint256,string,string,uint256,uint256,uint256,bytes,uint256[],uint256[]) (runs: 256, μ: 1185245, ~: 1189558) -OffchainAssetReceiptVaultAuthorizeTest:testAuthorizeContract(uint256,uint256,string,string) (runs: 256, μ: 930247, ~: 927889) -OffchainAssetReceiptVaultAuthorizeTest:testChangeAuthorizer(uint256,uint256,string,string) (runs: 256, μ: 1225437, ~: 1223079) +OffchainAssetReceiptVaultAssetTest:testVaultAsset(uint256,string,string) (runs: 256, μ: 993637, ~: 989378) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscator(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 1865342, ~: 1865950) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscatorTo(uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 1474093, ~: 1472109) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 1425556, ~: 1424363) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferRevertExpiredCertification(uint256,uint256,string,string,uint256,uint256,uint256,bytes,uint256[],uint256[]) (runs: 257, μ: 1336182, ~: 1340497) +OffchainAssetReceiptVaultAuthorizeTest:testAuthorizeContract(uint256,uint256,string,string) (runs: 257, μ: 1078131, ~: 1075783) +OffchainAssetReceiptVaultAuthorizeTest:testChangeAuthorizer(uint256,uint256,string,string) (runs: 257, μ: 1374845, ~: 1372497) OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeAuthorized(address,address,bytes,address) (runs: 256, μ: 2034189, ~: 2034063) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,address,uint256[],uint256[]) (runs: 255, μ: 1936858, ~: 1938766) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredBurn(address,address,address,uint256[],uint256[]) (runs: 255, μ: 2047609, ~: 2049163) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredMintBurn(address,address,address,uint256[],uint256[]) (runs: 255, μ: 2047567, ~: 2049121) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,address,address,uint256[],uint256[]) (runs: 255, μ: 1929450, ~: 1929829) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,address,uint256) (runs: 255, μ: 1865930, ~: 1865896) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,address,uint256[],uint256[]) (runs: 255, μ: 1936882, ~: 1938766) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredBurn(address,address,address,uint256[],uint256[]) (runs: 255, μ: 2048138, ~: 2049163) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredMintBurn(address,address,address,uint256[],uint256[]) (runs: 255, μ: 2048096, ~: 2049121) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,address,address,uint256[],uint256[]) (runs: 256, μ: 1929500, ~: 1929829) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,address,uint256) (runs: 255, μ: 1865913, ~: 1865896) OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredBurn(address,address,address,uint256) (runs: 252, μ: 1930696, ~: 1930696) OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredMintBurn(address,address,address,uint256) (runs: 252, μ: 1930677, ~: 1930677) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,address,address,uint256) (runs: 255, μ: 1862855, ~: 1862855) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeUnauthorized(address,address,address,bytes32,bytes) (runs: 253, μ: 1866286, ~: 1866268) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,address,address,uint256) (runs: 254, μ: 1862855, ~: 1862855) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeUnauthorized(address,address,address,bytes32,bytes) (runs: 254, μ: 1866286, ~: 1866268) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1Construct(address) (runs: 256, μ: 1190973, ~: 1190973) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1Initialize(address,bytes32) (runs: 255, μ: 1894380, ~: 1894380) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1InitializeZeroAdmin() (gas: 1492465) OffchainAssetReceiptVaultAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultAuthorizerV1IERC165(bytes4) (runs: 255, μ: 1194540, ~: 1194540) -OffchainAssetReceiptVaultCertifyTest:testCertify(uint256,uint256,string,string,uint256,bytes,uint256,bool) (runs: 255, μ: 959391, ~: 958427) -OffchainAssetReceiptVaultCertifyTest:testCertifyRevertOnZeroCertifyUntil(uint256,uint256,string,string,bytes,uint256,bool) (runs: 256, μ: 923046, ~: 924382) -OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrue(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 256, μ: 1211315, ~: 1209259) -OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrueRevertDeposit(uint256,uint256,string,string,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 255, μ: 1164194, ~: 1163137) -OffchainAssetReceiptVaultCertifyTest:testVaultGetsCertified(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool) (runs: 255, μ: 1136125, ~: 1135568) -OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 845908, ~: 846995) -OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 905994, ~: 902827) -OffchainAssetReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 846832, ~: 848341) -OffchainAssetReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 907312, ~: 903614) -OffchainAssetReceiptVaultDepositTest:testDepositBasic(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1093024, ~: 1098575) -OffchainAssetReceiptVaultDepositTest:testDepositMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 950164, ~: 946547) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 256, μ: 1068382, ~: 1064706) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 256, μ: 1007030, ~: 1005706) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 256, μ: 1131800, ~: 1130165) -OffchainAssetReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,uint256,string,string,bytes,uint256) (runs: 256, μ: 969004, ~: 968351) -OffchainAssetReceiptVaultDepositTest:testDepositWithZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 968795, ~: 965186) -OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 256, μ: 1127732, ~: 1127446) -OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 256, μ: 1128278, ~: 1127992) -OffchainAssetReceiptVaultDepositTest:testMintBasic(uint256,uint256,string,string,uint256,bytes,uint256) (runs: 255, μ: 1098932, ~: 1096522) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 256, μ: 1060378, ~: 1056705) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 256, μ: 999458, ~: 998121) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 256, μ: 1125692, ~: 1124040) -OffchainAssetReceiptVaultDepositTest:testMintWithMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 942545, ~: 938920) -OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 256, μ: 1127708, ~: 1127378) -OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 256, μ: 1129518, ~: 1129189) -OffchainAssetReceiptVaultDepositTest:testMultipleDeposit(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1186296, ~: 1184242) -OffchainAssetReceiptVaultDepositTest:testMultipleMints(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1179051, ~: 1177148) -OffchainAssetReceiptVaultDepositTest:testZeroAssetsAmount(uint256,uint256,string,string,bytes,uint256) (runs: 256, μ: 961415, ~: 960521) -OffchainAssetReceiptVaultDepositTest:testZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 965331, ~: 961659) -OffchainAssetReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 256, μ: 878956, ~: 878952) -OffchainAssetReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 256, μ: 851890, ~: 847605) -OffchainAssetReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 256, μ: 1078735, ~: 1077400) -OffchainAssetReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256,uint256,bytes) (runs: 255, μ: 1093800, ~: 1093928) -OffchainAssetReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256,uint256,bytes) (runs: 134, μ: 1143328, ~: 1143367) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscate(uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 251, μ: 1389797, ~: 1388003) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscatorOwner(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[],uint256) (runs: 254, μ: 1438765, ~: 1439245) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferHandlerReceiver(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 255, μ: 1385088, ~: 1386726) -OffchainAssetReceiptVaultIERC165Test:testOffchainAssetReceiptVaultIERC165(bytes4) (runs: 256, μ: 4390678, ~: 4390678) -OffchainAssetReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 256, μ: 846677, ~: 842417) -OffchainAssetReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 256, μ: 846742, ~: 842482) -OffchainAssetReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 254, μ: 1086109, ~: 1088332) -OffchainAssetReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 254, μ: 1089674, ~: 1091899) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 48694, ~: 48793) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 87804, ~: 87787) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 48808, ~: 48632) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1113534, ~: 1116686) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1106200, ~: 1109146) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 249, μ: 51674, ~: 51889) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 48834, ~: 48933) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 88012, ~: 87995) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 48929, ~: 48753) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1119024, ~: 1122189) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1111713, ~: 1114674) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 249, μ: 51682, ~: 51897) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 53071, ~: 52996) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingEmitsEvent(uint256) (runs: 256, μ: 42123, ~: 42749) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 53440, ~: 53383) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 931963, ~: 926182) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 940687, ~: 935195) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreeze(uint256) (runs: 256, μ: 52161, ~: 52787) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 49705, ~: 49705) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 49801, ~: 49801) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableZeroProtectUntilReverts(address) (runs: 256, μ: 16381, ~: 16381) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableZeroProtectUntilRevertsTo(address) (runs: 256, μ: 16401, ~: 16401) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerIsAlice() (gas: 12604) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptConfiscateFrozen(uint256) (runs: 256, μ: 416207, ~: 422923) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptTransferFroze(uint256) (runs: 256, μ: 361898, ~: 368615) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenConfiscateFrozen(uint256) (runs: 256, μ: 378176, ~: 384892) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenDepositFrozen(uint256) (runs: 256, μ: 384901, ~: 391608) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenMintFrozen(uint256) (runs: 256, μ: 384969, ~: 391676) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedeemFrozen(uint256) (runs: 256, μ: 342260, ~: 347634) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedepositFrozen(uint256) (runs: 256, μ: 458537, ~: 465244) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferFroze(uint256) (runs: 256, μ: 344760, ~: 351476) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferNotFroze() (gas: 276845) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenWithdrawFrozen(uint256) (runs: 256, μ: 342377, ~: 347751) +OffchainAssetReceiptVaultCertifyTest:testCertify(uint256,uint256,string,string,uint256,bytes,uint256,bool) (runs: 256, μ: 1107301, ~: 1106341) +OffchainAssetReceiptVaultCertifyTest:testCertifyRevertOnZeroCertifyUntil(uint256,uint256,string,string,bytes,uint256,bool) (runs: 256, μ: 1070965, ~: 1072301) +OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrue(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1365221, ~: 1363168) +OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrueRevertDeposit(uint256,uint256,string,string,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 256, μ: 1316619, ~: 1315543) +OffchainAssetReceiptVaultCertifyTest:testVaultGetsCertified(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool) (runs: 256, μ: 1286894, ~: 1286491) +OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 993163, ~: 994253) +OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 1054032, ~: 1050864) +OffchainAssetReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 994119, ~: 995656) +OffchainAssetReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 1055349, ~: 1051652) +OffchainAssetReceiptVaultDepositTest:testDepositBasic(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1251779, ~: 1256838) +OffchainAssetReceiptVaultDepositTest:testDepositMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1103388, ~: 1099769) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1223107, ~: 1219434) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1160266, ~: 1158929) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1291162, ~: 1289441) +OffchainAssetReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,uint256,string,string,bytes,uint256) (runs: 256, μ: 1122212, ~: 1121335) +OffchainAssetReceiptVaultDepositTest:testDepositWithZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1120505, ~: 1116821) +OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1277850, ~: 1277618) +OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1278211, ~: 1278164) +OffchainAssetReceiptVaultDepositTest:testMintBasic(uint256,uint256,string,string,uint256,bytes,uint256) (runs: 256, μ: 1255364, ~: 1252822) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1212809, ~: 1209168) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1150682, ~: 1149078) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1282691, ~: 1281051) +OffchainAssetReceiptVaultDepositTest:testMintWithMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1093499, ~: 1089877) +OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1278083, ~: 1277604) +OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1279529, ~: 1279296) +OffchainAssetReceiptVaultDepositTest:testMultipleDeposit(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1357078, ~: 1354937) +OffchainAssetReceiptVaultDepositTest:testMultipleMints(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1345130, ~: 1342992) +OffchainAssetReceiptVaultDepositTest:testZeroAssetsAmount(uint256,uint256,string,string,bytes,uint256) (runs: 256, μ: 1112369, ~: 1111231) +OffchainAssetReceiptVaultDepositTest:testZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1116291, ~: 1112594) +OffchainAssetReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 256, μ: 1026888, ~: 1026884) +OffchainAssetReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 256, μ: 1000576, ~: 996292) +OffchainAssetReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1231245, ~: 1229881) +OffchainAssetReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 1247024, ~: 1247121) +OffchainAssetReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256,uint256,bytes) (runs: 135, μ: 1298072, ~: 1298115) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscate(uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 252, μ: 1542854, ~: 1540449) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscatorOwner(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[],uint256) (runs: 255, μ: 1597307, ~: 1598226) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferHandlerReceiver(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 256, μ: 1538980, ~: 1540647) +OffchainAssetReceiptVaultIERC165Test:testOffchainAssetReceiptVaultIERC165(bytes4) (runs: 256, μ: 4330822, ~: 4330822) +OffchainAssetReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 256, μ: 993935, ~: 989676) +OffchainAssetReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 256, μ: 994000, ~: 989741) +OffchainAssetReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1241653, ~: 1243777) +OffchainAssetReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1245186, ~: 1247368) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 56523, ~: 56632) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 99854, ~: 99844) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 56633, ~: 56460) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1312158, ~: 1315851) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1304865, ~: 1308217) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 250, μ: 58442, ~: 58653) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 56663, ~: 56772) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 100062, ~: 100052) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 56754, ~: 56582) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1317648, ~: 1321355) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1310379, ~: 1313745) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 250, μ: 58450, ~: 58661) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 60601, ~: 60526) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingEmitsEvent(uint256) (runs: 256, μ: 48138, ~: 48764) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 60970, ~: 60913) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 1123984, ~: 1117080) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 1132743, ~: 1125934) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreeze(uint256) (runs: 256, μ: 64193, ~: 64819) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 61921, ~: 61921) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 62041, ~: 62041) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableZeroProtectUntilReverts(address) (runs: 256, μ: 21636, ~: 21636) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableZeroProtectUntilRevertsTo(address) (runs: 256, μ: 21656, ~: 21656) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerIsAlice() (gas: 17863) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptConfiscateFrozen(uint256) (runs: 257, μ: 439225, ~: 445447) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptTransferFroze(uint256) (runs: 257, μ: 383412, ~: 389635) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenConfiscateFrozen(uint256) (runs: 257, μ: 396696, ~: 402918) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenDepositFrozen(uint256) (runs: 257, μ: 404271, ~: 410369) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenMintFrozen(uint256) (runs: 257, μ: 404233, ~: 410437) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedeemFrozen(uint256) (runs: 257, μ: 358277, ~: 363255) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedepositFrozen(uint256) (runs: 257, μ: 480148, ~: 486246) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferFroze(uint256) (runs: 257, μ: 363282, ~: 369504) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferNotFroze() (gas: 291104) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenWithdrawFrozen(uint256) (runs: 257, μ: 358479, ~: 363372) OffchainAssetReceiptVaultPaymentMintAuthorizerV17201Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1StorageLocation() (gas: 661) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1Construct() (gas: 2221257) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1Initialize(address,address,uint8,uint256,bytes32) (runs: 251, μ: 3079905, ~: 3079905) @@ -175,53 +175,53 @@ OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetR OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroPaymentToken(address,address) (runs: 249, μ: 2584841, ~: 2584841) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroReceiptVault() (gas: 2583787) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroVerifyContract(address,address) (runs: 249, μ: 2523952, ~: 2523952) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMaxSharesSupplyExceeded(address,address,uint256,uint256,uint256,uint256) (runs: 77, μ: 4457299, ~: 4457349) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleMockedReceiptVault(address,address,address,uint256,uint256,uint256) (runs: 77, μ: 3830554, ~: 3830482) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleRealReceiptVault(address,address,uint256,uint256,uint256) (runs: 39, μ: 11661546, ~: 11661928) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTofuTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 80, μ: 3840383, ~: 3840317) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 80, μ: 3818516, ~: 3818694) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMaxSharesSupplyExceeded(address,address,uint256,uint256,uint256,uint256) (runs: 77, μ: 5056129, ~: 5056188) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleMockedReceiptVault(address,address,address,uint256,uint256,uint256) (runs: 76, μ: 3830555, ~: 3830482) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleRealReceiptVault(address,address,uint256,uint256,uint256) (runs: 40, μ: 5097924, ~: 5098330) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTofuTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 82, μ: 3840377, ~: 3840338) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 82, μ: 3818484, ~: 3818682) OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testZeroPaymentAmount(address,address) (runs: 40, μ: 3755963, ~: 3755963) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantDeposit(address,address,address,uint8,uint256,address) (runs: 72, μ: 3037784, ~: 3037784) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantWithdraw(address,address,address,uint8,uint256,address) (runs: 72, μ: 3037816, ~: 3037816) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 88, μ: 3110446, ~: 3111760) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 88, μ: 3107331, ~: 3108643) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 76, μ: 3042965, ~: 3042965) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 76, μ: 3039842, ~: 3039842) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantDeposit(address,address,address,uint8,uint256,address) (runs: 70, μ: 3037784, ~: 3037784) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantWithdraw(address,address,address,uint8,uint256,address) (runs: 70, μ: 3037816, ~: 3037816) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 87, μ: 3111331, ~: 3112828) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 87, μ: 3108216, ~: 3109711) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 79, μ: 3042965, ~: 3042965) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 79, μ: 3039842, ~: 3039842) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeUnauthorized(address,address,address,uint8,uint256,address,address,bytes32,bytes) (runs: 28, μ: 3040482, ~: 3040481) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165(bytes4) (runs: 256, μ: 2224742, ~: 2224742) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1RolesAuthorized(address,address,address,uint8,uint256,address,bytes) (runs: 75, μ: 3141907, ~: 3141900) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1UnauthorizedCaller(address,address,address,uint8,uint256,address,bytes32,bytes,address) (runs: 80, μ: 3039365, ~: 3039365) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testSendPaymentToOwner(address,address,address,address) (runs: 251, μ: 3823127, ~: 3823127) -OffchainAssetReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(uint256,uint256,string,string,uint256) (runs: 256, μ: 928297, ~: 925919) -OffchainAssetReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(uint256,uint256,string,string,uint256) (runs: 256, μ: 928285, ~: 925908) -OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,uint256,uint256,string,string,uint256) (runs: 255, μ: 930132, ~: 927332) -OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeemNoWithdrawer(uint256,uint256,string,string,uint256) (runs: 256, μ: 849373, ~: 846979) -OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawNoRole(uint256,uint256,string,string,uint256) (runs: 256, μ: 850218, ~: 847828) -OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawWithRole(uint256,uint256,uint256,string,string,uint256) (runs: 255, μ: 929953, ~: 926734) -OffchainAssetReceiptVaultReceiptTest:testVaultAsset(uint256,string,string) (runs: 256, μ: 847318, ~: 843058) -OffchainAssetReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 256, μ: 845170, ~: 847773) -OffchainAssetReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 256, μ: 1025204, ~: 1021739) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1RolesAuthorized(address,address,address,uint8,uint256,address,bytes) (runs: 76, μ: 3141905, ~: 3141900) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1UnauthorizedCaller(address,address,address,uint8,uint256,address,bytes32,bytes,address) (runs: 82, μ: 3039364, ~: 3039365) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testSendPaymentToOwner(address,address,address,address) (runs: 250, μ: 3823127, ~: 3823127) +OffchainAssetReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(uint256,uint256,string,string,uint256) (runs: 256, μ: 1076221, ~: 1073847) +OffchainAssetReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(uint256,uint256,string,string,uint256) (runs: 256, μ: 1076217, ~: 1073836) +OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,uint256,uint256,string,string,uint256) (runs: 255, μ: 1078057, ~: 1075259) +OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeemNoWithdrawer(uint256,uint256,string,string,uint256) (runs: 256, μ: 996531, ~: 994147) +OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawNoRole(uint256,uint256,string,string,uint256) (runs: 256, μ: 997381, ~: 994999) +OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawWithRole(uint256,uint256,uint256,string,string,uint256) (runs: 255, μ: 1077882, ~: 1074661) +OffchainAssetReceiptVaultReceiptTest:testVaultAsset(uint256,string,string) (runs: 256, μ: 995213, ~: 990954) +OffchainAssetReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 256, μ: 992383, ~: 994988) +OffchainAssetReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 257, μ: 1182000, ~: 1178717) OwnerFreezableERC7201Test:testOwnerFreezableStorageLocation() (gas: 611) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 45336, ~: 45406) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 242, μ: 83132, ~: 83116) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 45428, ~: 45245) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1049863, ~: 1052848) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1042624, ~: 1045187) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 249, μ: 48342, ~: 48531) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 45211, ~: 45280) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 242, μ: 82878, ~: 82863) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 45320, ~: 45137) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1041318, ~: 1044281) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1034058, ~: 1036598) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 249, μ: 48285, ~: 48474) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 49512, ~: 49429) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 45339, ~: 45426) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 83125, ~: 83116) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 45423, ~: 45247) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1049852, ~: 1052848) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1042590, ~: 1045281) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 245, μ: 48347, ~: 48562) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 45214, ~: 45301) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 82871, ~: 82863) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 45314, ~: 45138) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1041306, ~: 1044281) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1034024, ~: 1036693) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 245, μ: 48290, ~: 48505) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 49501, ~: 49429) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingEmitsEvent(uint256) (runs: 256, μ: 39094, ~: 39720) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 49887, ~: 49838) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 863936, ~: 858645) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 872701, ~: 867765) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 49898, ~: 49838) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 863948, ~: 858592) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 872705, ~: 867606) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreeze(uint256) (runs: 256, μ: 46090, ~: 46716) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 44350, ~: 44348) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 44250, ~: 44248) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 44349, ~: 44346) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 44249, ~: 44246) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableZeroProtectUntilReverts(address) (runs: 256, μ: 13647, ~: 13647) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableZeroProtectUntilRevertsTo(address) (runs: 256, μ: 13580, ~: 13580) OwnerFreezableTestOwnerFreezeUntil:testOwnerIsAlice() (gas: 9855) @@ -246,36 +246,36 @@ ReceiptTest:testSafeTransferFrom(uint256,uint256,uint256,uint256) (runs: 256, μ ReceiptTest:testSetApprovalForAllAndIsApprovedForAll(uint256,uint256) (runs: 256, μ: 221453, ~: 221453) ReceiptTest:testTransferManagerTransferFrom(uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 959510, ~: 959326) ReceiptTest:testUnauthorizedTransferManagerTransferFrom(uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 968071, ~: 967887) -ReceiptVaultDecimalsTest:testDecimalsWithNonZeroAsset(uint8) (runs: 256, μ: 6232891, ~: 6236623) -ReceiptVaultDecimalsTest:testDecimalsWithZeroAsset() (gas: 5264797) +ReceiptVaultDecimalsTest:testDecimalsWithNonZeroAsset(uint8) (runs: 256, μ: 5940575, ~: 5944307) +ReceiptVaultDecimalsTest:testDecimalsWithZeroAsset() (gas: 2661816) ReceiptVaultERC7201Test:testReceiptVaultStorageLocation() (gas: 676) -ReceiptVaultIERC165Test:testReceiptVaultIERC165(bytes4) (runs: 255, μ: 5270360, ~: 5270360) -RedeemTest:testOffchainAssetWithdrawWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 1242939, ~: 1244552) -RedeemTest:testRedeem(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1078989, ~: 1081486) -RedeemTest:testRedeemInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1106548, ~: 1109571) -RedeemTest:testRedeemOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 256, μ: 1172962, ~: 1171332) -RedeemTest:testRedeemOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 256, μ: 1201648, ~: 1197852) -RedeemTest:testRedeemOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 249, μ: 1338073, ~: 1337763) -RedeemTest:testRedeemRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1041488, ~: 1040799) -RedeemTest:testRedeemSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1142831, ~: 1142750) -RedeemTest:testRedeemToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1078921, ~: 1081418) -RedeemTest:testRedeemZeroAssetsAmount(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1106321, ~: 1109111) -RedeemTest:testRedeemZeroOwner(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1108139, ~: 1111161) -RedeemTest:testRedeemZeroReceiver(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1106372, ~: 1109394) -RedeemTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 133, μ: 1119589, ~: 1117651) -RedepositTest:testReDeposit(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 256, μ: 1170183, ~: 1170785) -RedepositTest:testReDepositOverSeveralIds(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 256, μ: 1384707, ~: 1385515) -RedepositTest:testReDepositRevertsWithZeroAssets(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 256, μ: 1141609, ~: 1136712) -RedepositTest:testReDepositToNonExistentReceipt(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 255, μ: 1141899, ~: 1140407) -RedepositTest:testReDepositToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 255, μ: 1142732, ~: 1144870) -RedepositTest:testReDepositToSomeoneElseReverts(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 256, μ: 1155090, ~: 1153667) -RedepositTest:testReDepositToSomeoneElseWhileCertified(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 256, μ: 1170207, ~: 1171074) -RedepositTest:testReDepositrevertsPastTopID(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 256, μ: 1193733, ~: 1193680) -RolesTest:testCertifyWithoutRole(uint256,string,string,uint256,bytes) (runs: 255, μ: 875975, ~: 875660) -RolesTest:testConfiscateReceiptWithoutRole(uint256,string,string,uint256,uint256,bytes) (runs: 254, μ: 877197, ~: 877372) -RolesTest:testConfiscateSharesWithoutRole(uint256,string,string,uint256,bytes) (runs: 255, μ: 876169, ~: 876002) -RolesTest:testDepositWithoutDepositorRole(uint256,uint256,string,string,uint256,bytes) (runs: 254, μ: 1128215, ~: 1124137) -RolesTest:testGrantAdminRoles(uint256,string,string) (runs: 256, μ: 878117, ~: 873858) +ReceiptVaultIERC165Test:testReceiptVaultIERC165(bytes4) (runs: 256, μ: 2667357, ~: 2667357) +RedeemTest:testOffchainAssetWithdrawWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1401827, ~: 1403675) +RedeemTest:testRedeem(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232917, ~: 1234849) +RedeemTest:testRedeemInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258976, ~: 1261429) +RedeemTest:testRedeemOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1326633, ~: 1325156) +RedeemTest:testRedeemOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1356597, ~: 1352550) +RedeemTest:testRedeemOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 249, μ: 1504203, ~: 1503685) +RedeemTest:testRedeemRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1193164, ~: 1192473) +RedeemTest:testRedeemSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296607, ~: 1296686) +RedeemTest:testRedeemToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232849, ~: 1234781) +RedeemTest:testRedeemZeroAssetsAmount(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258933, ~: 1261251) +RedeemTest:testRedeemZeroOwner(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260569, ~: 1263020) +RedeemTest:testRedeemZeroReceiver(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258628, ~: 1261253) +RedeemTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 132, μ: 1270075, ~: 1270084) +RedepositTest:testReDeposit(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1324902, ~: 1325467) +RedepositTest:testReDepositOverSeveralIds(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1547582, ~: 1548431) +RedepositTest:testReDepositRevertsWithZeroAssets(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1293246, ~: 1288260) +RedepositTest:testReDepositToNonExistentReceipt(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 255, μ: 1293738, ~: 1292075) +RedepositTest:testReDepositToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1296864, ~: 1298851) +RedepositTest:testReDepositToSomeoneElseReverts(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1306544, ~: 1305335) +RedepositTest:testReDepositToSomeoneElseWhileCertified(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1325096, ~: 1325758) +RedepositTest:testReDepositrevertsPastTopID(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1347523, ~: 1347588) +RolesTest:testCertifyWithoutRole(uint256,string,string,uint256,bytes) (runs: 255, μ: 1023109, ~: 1022795) +RolesTest:testConfiscateReceiptWithoutRole(uint256,string,string,uint256,uint256,bytes) (runs: 254, μ: 1025074, ~: 1025249) +RolesTest:testConfiscateSharesWithoutRole(uint256,string,string,uint256,bytes) (runs: 255, μ: 1023292, ~: 1023126) +RolesTest:testDepositWithoutDepositorRole(uint256,uint256,string,string,uint256,bytes) (runs: 255, μ: 1278328, ~: 1274261) +RolesTest:testGrantAdminRoles(uint256,string,string) (runs: 257, μ: 1032251, ~: 1027835) SceptreStakedFlrOracleTest:testSceptreStakedFlrOracle() (gas: 150235) SceptreStakedFlrOracleTest:testSceptreStakedFlrOracleRefund(uint128,uint128) (runs: 256, μ: 162917, ~: 162255) TwoPriceOracleTest:testNotOracle(address,address) (runs: 254, μ: 4137988, ~: 41982) @@ -284,16 +284,16 @@ TwoPriceOracleTest:testSameBaseQuote(address) (runs: 253, μ: 37371, ~: 37371) TwoPriceOracleTest:testZeroAddressBase(address) (runs: 253, μ: 4153749, ~: 41541) TwoPriceOracleTest:testZeroAddressBoth() (gas: 36561) TwoPriceOracleTest:testZeroAddressQuote(address) (runs: 253, μ: 39043, ~: 39043) -WithdrawTest:testOffchainAssetWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 1422862, ~: 1422563) -WithdrawTest:testWithdraw(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1078992, ~: 1081496) -WithdrawTest:testWithdrawInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1106636, ~: 1109664) -WithdrawTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 136, μ: 1117796, ~: 1117691) -WithdrawTest:testWithdrawOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 256, μ: 1175066, ~: 1171281) -WithdrawTest:testWithdrawOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 256, μ: 1202052, ~: 1198268) -WithdrawTest:testWithdrawOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 252, μ: 1338802, ~: 1337926) -WithdrawTest:testWithdrawRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1155613, ~: 1154508) -WithdrawTest:testWithdrawSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1142892, ~: 1142835) -WithdrawTest:testWithdrawToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1079036, ~: 1081540) -WithdrawTest:testWithdrawZeroAssetsAmount(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1111631, ~: 1110369) -WithdrawTest:testWithdrawZeroOwner(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1113759, ~: 1112439) -WithdrawTest:testWithdrawZeroReceiver(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1111757, ~: 1110437) \ No newline at end of file +WithdrawTest:testOffchainAssetWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1600658, ~: 1600352) +WithdrawTest:testWithdraw(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232933, ~: 1234884) +WithdrawTest:testWithdrawInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258829, ~: 1261549) +WithdrawTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 132, μ: 1272101, ~: 1270124) +WithdrawTest:testWithdrawOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1329174, ~: 1325221) +WithdrawTest:testWithdrawOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1356920, ~: 1352966) +WithdrawTest:testWithdrawOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 253, μ: 1504651, ~: 1503848) +WithdrawTest:testWithdrawRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1312543, ~: 1311431) +WithdrawTest:testWithdrawSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296857, ~: 1296771) +WithdrawTest:testWithdrawToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1233246, ~: 1235450) +WithdrawTest:testWithdrawZeroAssetsAmount(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1264213, ~: 1262802) +WithdrawTest:testWithdrawZeroOwner(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1266345, ~: 1264872) +WithdrawTest:testWithdrawZeroReceiver(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1264164, ~: 1262870) \ No newline at end of file diff --git a/test/abstract/OffchainAssetReceiptVaultTest.sol b/test/abstract/OffchainAssetReceiptVaultTest.sol index 880a4c90..8392420b 100644 --- a/test/abstract/OffchainAssetReceiptVaultTest.sol +++ b/test/abstract/OffchainAssetReceiptVaultTest.sol @@ -55,9 +55,10 @@ contract OffchainAssetReceiptVaultTest is Test { ); OffchainAssetReceiptVaultAuthorizerV1 authorizer = OffchainAssetReceiptVaultAuthorizerV1(Clones.clone(address(I_AUTHORIZER_IMPLEMENTATION))); + vm.startPrank(admin); authorizer.initialize(abi.encode(OffchainAssetReceiptVaultAuthorizerV1Config({initialAdmin: admin}))); - vm.prank(admin); vault.setAuthorizer(authorizer); + vm.stopPrank(); return vault; } diff --git a/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol b/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol index a11f21fc..9b29279f 100644 --- a/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol +++ b/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol @@ -58,7 +58,7 @@ contract OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest is Offchain firstShares = bound(firstShares, 1, maxShares - totalSupply - 1); uint256 paymentAmount = firstShares; - OffchainAssetReceiptVault receiptVault = createVault(bob, "foo", "bar"); + OffchainAssetReceiptVault receiptVault = createVault(alice, "foo", "bar"); vm.mockCall(address(receiptVault), abi.encodeWithSelector(IERC20.totalSupply.selector), abi.encode(totalSupply)); diff --git a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.initialize.t.sol similarity index 85% rename from test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol rename to test/src/concrete/vault/ERC20PriceOracleReceiptVault.initialize.t.sol index c0a7babb..55ef9e83 100644 --- a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol +++ b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.initialize.t.sol @@ -10,10 +10,18 @@ import {ERC20PriceOracleReceiptVaultTest, Vm} from "test/abstract/ERC20PriceOrac import {IPriceOracleV2} from "src/interface/IPriceOracleV2.sol"; import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenerator.sol"; -contract ERC20PriceOracleReceiptVaultConstructionTest is ERC20PriceOracleReceiptVaultTest { - /// Test ERC20PriceOracleReceiptVault is constructed - function testConstructionEvent(uint256 aliceSeed, string memory shareName, string memory shareSymbol) external { +import {console2} from "forge-std/console2.sol"; + +contract ERC20PriceOracleReceiptVaultInitializeTest is ERC20PriceOracleReceiptVaultTest { + /// Test ERC20PriceOracleReceiptVault is initialized + function testERC20PriceOracleReceiptVaultInitializedV2Event( + uint256 aliceSeed, + string memory shareName, + string memory shareSymbol + ) external { address alice = LibUniqueAddressesGenerator.generateUniqueAddresses(vm, aliceSeed); + bytes32 eventTopic = + keccak256("ERC20PriceOracleReceiptVaultInitializedV2(address,(address,(address,string,string,address)))"); IPriceOracleV2 vaultPriceOracle = IPriceOracleV2(payable(address(uint160(uint256(keccak256("twoPriceOracle")))))); @@ -34,12 +42,7 @@ contract ERC20PriceOracleReceiptVaultConstructionTest is ERC20PriceOracleReceipt bool eventFound = false; // Flag to indicate whether the event log was found for (uint256 i = 0; i < logs.length; i++) { - if ( - logs[i].topics[0] - == keccak256( - "ERC20PriceOracleReceiptVaultInitialized(address,(address,(address,(address,string,string))))" - ) - ) { + if (logs[i].topics[0] == eventTopic) { // Decode the event data (msgSender, config) = abi.decode(logs[i].data, (address, ERC20PriceOracleReceiptVaultConfigV2)); eventFound = true; // Set the flag to true since event log was found @@ -47,9 +50,9 @@ contract ERC20PriceOracleReceiptVaultConstructionTest is ERC20PriceOracleReceipt } } // Assert that the event log was found - assertTrue(eventFound, "ERC20PriceOracleReceiptVaultInitialized event log not found"); + assertTrue(eventFound, "ERC20PriceOracleReceiptVaultInitializedV2 event log not found"); - assertEq(msgSender, address(0)); + assertEq(msgSender, address(I_DEPLOYER)); assert(address(vault) != address(0)); assertEq(keccak256(bytes(vault.name())), keccak256(bytes(config.receiptVaultConfig.name))); diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol similarity index 91% rename from test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol rename to test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol index 3cee0e19..04eb2b18 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol @@ -17,7 +17,7 @@ import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; import {BeaconProxy} from "openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol"; import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenerator.sol"; -contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { +contract OffChainAssetReceiptVaultInitializeTest is OffchainAssetReceiptVaultTest { /// Test that admin is not address zero function testZeroInitialAdmin(string memory shareName, string memory shareSymbol) external { ReceiptContract receipt = ReceiptContract(address(new BeaconProxy(address(I_DEPLOYER.I_RECEIPT_BEACON()), ""))); @@ -64,8 +64,13 @@ contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { ); } - /// Test that offchainAssetReceiptVault initializes well - function testInitializationEvent(uint256 aliceSeed, string memory shareName, string memory shareSymbol) external { + /// Test that OffchainAssetReceiptVaultInitializedV2 event is emitted upon + /// initialization + function testOffchainAssetReceiptVaultInitializedV2Event( + uint256 aliceSeed, + string memory shareName, + string memory shareSymbol + ) external { address alice = LibUniqueAddressesGenerator.generateUniqueAddresses(vm, aliceSeed); address asset = address(0); @@ -93,7 +98,7 @@ contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { if ( logs[i].topics[0] == keccak256( - "OffchainAssetReceiptVaultInitializedV2(address,(address,(address,(address,string,string))))" + "OffchainAssetReceiptVaultInitializedV2(address,(address,(address,string,string,address)))" ) ) { // Decode the event data @@ -107,9 +112,9 @@ contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { } // Assert that the event log was found - assertTrue(eventFound, "OffchainAssetReceiptVaultInitialized event log not found"); + assertTrue(eventFound, "OffchainAssetReceiptVaultInitializedV2 event log not found"); - assertEq(msgSender, address(0)); + assertEq(msgSender, address(I_DEPLOYER)); assertEq(config.initialAdmin, alice); assert(address(vault) != address(0)); @@ -126,8 +131,8 @@ contract OffChainAssetReceiptVaultTest is OffchainAssetReceiptVaultTest { /// Check the authorizer set event assertTrue(authorizeSetEventFound, "AuthorizerSet event log not found"); - assertEq(authorizeSetMsgSender, address(0)); - assertEq(authorizeSetTo, address(vault)); + assertEq(authorizeSetMsgSender, address(alice)); + assertEq(authorizeSetTo, address(vault.authorizer())); assertTrue(address(vault) != address(0)); // Check the receipt manager is the vault. From c2dc4b1dcfa32ceb00359b6b82bd1d6691ba4da5 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 15 Dec 2025 16:43:53 +0400 Subject: [PATCH 08/26] Update src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol index 57d863c3..dd7830f7 100644 --- a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol +++ b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol @@ -20,6 +20,8 @@ contract ERC20PriceOracleReceiptVaultCloneDeployer { address immutable I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION; constructor(ERC20PriceOracleReceiptVaultCloneDeployerConfig memory config) { + require(config.receiptImplementation != address(0), "Zero receipt implementation"); + require(config.erc20PriceOracleReceiptVaultImplementation != address(0), "Zero vault implementation"); I_RECEIPT_IMPLEMENTATION = config.receiptImplementation; I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION = config.erc20PriceOracleReceiptVaultImplementation; } From 70b89cc24a58b510b7f9f7e98d9401448d953de2 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 17:52:46 +0400 Subject: [PATCH 09/26] custom errors for deployers --- .gas-snapshot | 412 +++++++++--------- ...20PriceOracleReceiptVaultCloneDeployer.sol | 29 +- ...hainAssetReceiptVaultBeaconSetDeployer.sol | 31 +- src/error/ErrDeployer.sol | 19 + ...20PriceOracleReceiptVault.initialize.t.sol | 2 - 5 files changed, 266 insertions(+), 227 deletions(-) create mode 100644 src/error/ErrDeployer.sol diff --git a/.gas-snapshot b/.gas-snapshot index d9c000fa..5202ae27 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,7 +1,7 @@ -ConfiscateReceiptTest:testConfiscateReceiptBasic(uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 252, μ: 1402006, ~: 1410301) +ConfiscateReceiptTest:testConfiscateReceiptBasic(uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 252, μ: 1402238, ~: 1410301) ConfiscateReceiptTest:testConfiscateReceiptOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256) (runs: 255, μ: 1153887, ~: 1154437) -ConfiscateSharesTest:testConfiscateSharesBasic(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 253, μ: 1349905, ~: 1357279) -ConfiscateSharesTest:testConfiscateSharesOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256,uint256) (runs: 254, μ: 1266457, ~: 1268538) +ConfiscateSharesTest:testConfiscateSharesBasic(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 253, μ: 1350220, ~: 1357279) +ConfiscateSharesTest:testConfiscateSharesOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256,uint256) (runs: 254, μ: 1266464, ~: 1268538) ERC20PriceOracleReceiptMetadataTest:testOverriddenMetadataWithImage(uint256,string,string,string,string,string,string,uint8) (runs: 242, μ: 3134470, ~: 3135563) ERC20PriceOracleReceiptMetadataTest:testOverriddenMetadataWithoutImage(uint256,string,string,string,string,string,uint8) (runs: 254, μ: 3063586, ~: 3069077) ERC20PriceOracleReceiptMetadataTest:testReceiptName() (gas: 770273) @@ -9,164 +9,164 @@ ERC20PriceOracleReceiptMetadataTest:testReceiptSymbol() (gas: 770295) ERC20PriceOracleReceiptMetadataTest:testReceiptURI(uint256) (runs: 248, μ: 822451, ~: 822688) ERC20PriceOracleReceiptMetadataTest:testReceiptURIZeroError() (gas: 769391) ERC20PriceOracleReceiptVault7201Test:testERC20PriceOracleReceiptVault7201StorageLocation() (gas: 671) -ERC20PriceOracleReceiptVaultAssetTest:testVaultAsset(string,string) (runs: 256, μ: 336842, ~: 336290) -ERC20PriceOracleReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 606337, ~: 607218) -ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 395569, ~: 396658) -ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 455375, ~: 452214) -ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 396077, ~: 397621) -ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 455748, ~: 452055) -ERC20PriceOracleReceiptVaultDepositTest:testDepositBasic(uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 525931, ~: 525675) -ERC20PriceOracleReceiptVaultDepositTest:testDepositMinShareRatio(uint256,string,string,bytes,uint256,uint256,uint256) (runs: 256, μ: 472549, ~: 469876) -ERC20PriceOracleReceiptVaultDepositTest:testDepositSomeoneElse(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 254, μ: 579327, ~: 581974) -ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,string,string,bytes,uint256,uint256) (runs: 256, μ: 489441, ~: 490211) -ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroReceiver(string,string,bytes,uint256,uint256,uint256) (runs: 256, μ: 383195, ~: 383788) -ERC20PriceOracleReceiptVaultDepositTest:testMultipleDeposits(uint256,string,string,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 256, μ: 993206, ~: 990045) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 256, μ: 427149, ~: 427145) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 256, μ: 402939, ~: 398653) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256) (runs: 256, μ: 509808, ~: 510967) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256) (runs: 256, μ: 524176, ~: 523996) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256) (runs: 177, μ: 572408, ~: 571996) -ERC20PriceOracleReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 256, μ: 779254, ~: 780323) +ERC20PriceOracleReceiptVaultAssetTest:testVaultAsset(string,string) (runs: 257, μ: 336666, ~: 336290) +ERC20PriceOracleReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 606242, ~: 607218) +ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 395832, ~: 396658) +ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 455456, ~: 452214) +ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 396160, ~: 397504) +ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 455733, ~: 452055) +ERC20PriceOracleReceiptVaultDepositTest:testDepositBasic(uint256,string,string,uint256,uint256,bytes) (runs: 257, μ: 526106, ~: 525814) +ERC20PriceOracleReceiptVaultDepositTest:testDepositMinShareRatio(uint256,string,string,bytes,uint256,uint256,uint256) (runs: 257, μ: 472503, ~: 469876) +ERC20PriceOracleReceiptVaultDepositTest:testDepositSomeoneElse(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 579345, ~: 581974) +ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,string,string,bytes,uint256,uint256) (runs: 257, μ: 489719, ~: 490211) +ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroReceiver(string,string,bytes,uint256,uint256,uint256) (runs: 257, μ: 383189, ~: 383848) +ERC20PriceOracleReceiptVaultDepositTest:testMultipleDeposits(uint256,string,string,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 257, μ: 992827, ~: 989988) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 257, μ: 427149, ~: 427145) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 257, μ: 402747, ~: 398653) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256) (runs: 257, μ: 509643, ~: 510967) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256) (runs: 257, μ: 524173, ~: 523996) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256) (runs: 173, μ: 572410, ~: 571996) +ERC20PriceOracleReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 257, μ: 779258, ~: 780323) ERC20PriceOracleReceiptVaultInitializeTest:testERC20PriceOracleReceiptVaultInitializedV2Event(uint256,string,string) (runs: 257, μ: 411927, ~: 407483) -ERC20PriceOracleReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 256, μ: 395316, ~: 391055) -ERC20PriceOracleReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 256, μ: 395381, ~: 391120) -ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 154, μ: 576735, ~: 577948) -ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 148, μ: 582482, ~: 582722) -ERC20PriceOracleReceiptVaultMintTest:testMintBasic(string,string,uint256,uint256,bytes) (runs: 256, μ: 474185, ~: 473214) -ERC20PriceOracleReceiptVaultMintTest:testMintSomeoneElse(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 584551, ~: 580591) -ERC20PriceOracleReceiptVaultMintTest:testMintWithMinShareRatio(string,string,uint256,uint256,uint256,bytes) (runs: 256, μ: 362542, ~: 362170) -ERC20PriceOracleReceiptVaultMintTest:testMintWithZeroShares(string,string,uint256,uint256,bytes) (runs: 256, μ: 385481, ~: 385148) -ERC20PriceOracleReceiptVaultMintTest:testMultipleMints(string,string,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 256, μ: 539825, ~: 539254) -ERC20PriceOracleReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(string,string,uint256,uint256) (runs: 256, μ: 350413, ~: 348129) -ERC20PriceOracleReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(string,string,uint256,uint256) (runs: 256, μ: 350598, ~: 348381) -ERC20PriceOracleReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,string,string,uint256,uint256) (runs: 247, μ: 398519, ~: 399545) -ERC20PriceOracleReceiptVaultPreviewWithdrawTest:testPreviewWithdraw(uint256,string,string,uint256,uint256) (runs: 256, μ: 398568, ~: 399639) -ERC20PriceOracleReceiptVaultReceiptTest:testVaultAsset(string,string) (runs: 256, μ: 337697, ~: 337145) -ERC20PriceOracleReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 256, μ: 393830, ~: 396434) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemBasic(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 543805, ~: 545137) +ERC20PriceOracleReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 257, μ: 395299, ~: 391055) +ERC20PriceOracleReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 257, μ: 395190, ~: 391120) +ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 156, μ: 578310, ~: 578010) +ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 159, μ: 583358, ~: 582800) +ERC20PriceOracleReceiptVaultMintTest:testMintBasic(string,string,uint256,uint256,bytes) (runs: 257, μ: 474224, ~: 473214) +ERC20PriceOracleReceiptVaultMintTest:testMintSomeoneElse(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 584692, ~: 580571) +ERC20PriceOracleReceiptVaultMintTest:testMintWithMinShareRatio(string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 362623, ~: 362170) +ERC20PriceOracleReceiptVaultMintTest:testMintWithZeroShares(string,string,uint256,uint256,bytes) (runs: 257, μ: 385489, ~: 385148) +ERC20PriceOracleReceiptVaultMintTest:testMultipleMints(string,string,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 257, μ: 539828, ~: 539254) +ERC20PriceOracleReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(string,string,uint256,uint256) (runs: 257, μ: 350406, ~: 348129) +ERC20PriceOracleReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(string,string,uint256,uint256) (runs: 257, μ: 350586, ~: 348500) +ERC20PriceOracleReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,string,string,uint256,uint256) (runs: 248, μ: 398706, ~: 399545) +ERC20PriceOracleReceiptVaultPreviewWithdrawTest:testPreviewWithdraw(uint256,string,string,uint256,uint256) (runs: 257, μ: 398575, ~: 399639) +ERC20PriceOracleReceiptVaultReceiptTest:testVaultAsset(string,string) (runs: 257, μ: 337616, ~: 337145) +ERC20PriceOracleReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 257, μ: 393841, ~: 396434) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemBasic(uint256,string,string,uint256,uint256,uint256) (runs: 241, μ: 543920, ~: 545137) ERC20PriceOracleReceiptVaultRedeemTest:testRedeemFlareFork(uint256) (runs: 1, μ: 544965, ~: 544965) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemMoreThanBalance(uint256,string,string,uint256,uint256,uint256) (runs: 255, μ: 527751, ~: 528744) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroOwner(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 520568, ~: 521900) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroReceiver(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 524678, ~: 526010) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 521888, ~: 523035) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 235, μ: 625549, ~: 626775) -ERC20PriceOracleReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 256, μ: 399712, ~: 396341) -ERC20PriceOracleReceiptVaultWithdrawTest:testMultiplePricesAndHistoricalRedemptionsAndMint(uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 794119, ~: 794277) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 803374, ~: 808141) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawBasic(uint256,string,string,uint256,uint256) (runs: 256, μ: 536753, ~: 543265) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemMoreThanBalance(uint256,string,string,uint256,uint256,uint256) (runs: 256, μ: 527943, ~: 528744) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroOwner(uint256,string,string,uint256,uint256,uint256) (runs: 241, μ: 520405, ~: 521900) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroReceiver(uint256,string,string,uint256,uint256,uint256) (runs: 241, μ: 524698, ~: 526010) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 521888, ~: 523035) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 235, μ: 625521, ~: 626657) +ERC20PriceOracleReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 257, μ: 399525, ~: 396341) +ERC20PriceOracleReceiptVaultWithdrawTest:testMultiplePricesAndHistoricalRedemptionsAndMint(uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 794124, ~: 794277) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 803471, ~: 808141) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawBasic(uint256,string,string,uint256,uint256) (runs: 257, μ: 536821, ~: 543265) ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawFlareFork(uint256) (runs: 1, μ: 545152, ~: 545152) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawMoreThanAssets(uint256,string,string,uint256,uint256,uint256) (runs: 255, μ: 527272, ~: 528044) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 521694, ~: 522846) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroOwner(uint256,string,string,uint256,uint256) (runs: 256, μ: 519596, ~: 520749) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroReceiver(uint256,string,string,uint256,uint256) (runs: 255, μ: 522687, ~: 524115) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawMoreThanAssets(uint256,string,string,uint256,uint256,uint256) (runs: 256, μ: 527085, ~: 528042) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 521508, ~: 522846) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroOwner(uint256,string,string,uint256,uint256) (runs: 257, μ: 519585, ~: 520749) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroReceiver(uint256,string,string,uint256,uint256) (runs: 256, μ: 522425, ~: 524115) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOracle() (gas: 461762) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOraclePaid(uint128) (runs: 1, μ: 701707, ~: 701707) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOracleStale() (gas: 462499) MulticallTest:testDepositMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296345, ~: 1295312) MulticallTest:testMintMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296387, ~: 1295349) -MulticallTest:testRedeemMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1308259, ~: 1309070) -MulticallTest:testWithdrawMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1308610, ~: 1309247) -OffChainAssetReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 256, μ: 1976916, ~: 1977987) +MulticallTest:testRedeemMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1308291, ~: 1309070) +MulticallTest:testWithdrawMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1308642, ~: 1309247) +OffChainAssetReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 257, μ: 1976921, ~: 1977987) OffChainAssetReceiptVaultInitializeTest:testNonZeroAsset(uint256,address,string,string) (runs: 256, μ: 515560, ~: 513151) OffChainAssetReceiptVaultInitializeTest:testOffchainAssetReceiptVaultInitializedV2Event(uint256,string,string) (runs: 257, μ: 1054742, ~: 1050296) OffChainAssetReceiptVaultInitializeTest:testZeroInitialAdmin(string,string) (runs: 256, μ: 440060, ~: 439508) OffchainAssetReceiptVault7201Test:testOffchainAssetReceiptVault7201StorageLocation() (gas: 671) -OffchainAssetReceiptVaultAssetTest:testVaultAsset(uint256,string,string) (runs: 256, μ: 993637, ~: 989378) +OffchainAssetReceiptVaultAssetTest:testVaultAsset(uint256,string,string) (runs: 257, μ: 993708, ~: 989378) OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscator(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 1865342, ~: 1865950) OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscatorTo(uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 1474093, ~: 1472109) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 1425556, ~: 1424363) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferRevertExpiredCertification(uint256,uint256,string,string,uint256,uint256,uint256,bytes,uint256[],uint256[]) (runs: 257, μ: 1336182, ~: 1340497) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 1425553, ~: 1424363) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferRevertExpiredCertification(uint256,uint256,string,string,uint256,uint256,uint256,bytes,uint256[],uint256[]) (runs: 257, μ: 1336169, ~: 1340497) OffchainAssetReceiptVaultAuthorizeTest:testAuthorizeContract(uint256,uint256,string,string) (runs: 257, μ: 1078131, ~: 1075783) OffchainAssetReceiptVaultAuthorizeTest:testChangeAuthorizer(uint256,uint256,string,string) (runs: 257, μ: 1374845, ~: 1372497) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeAuthorized(address,address,bytes,address) (runs: 256, μ: 2034189, ~: 2034063) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,address,uint256[],uint256[]) (runs: 255, μ: 1936882, ~: 1938766) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredBurn(address,address,address,uint256[],uint256[]) (runs: 255, μ: 2048138, ~: 2049163) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredMintBurn(address,address,address,uint256[],uint256[]) (runs: 255, μ: 2048096, ~: 2049121) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeAuthorized(address,address,bytes,address) (runs: 253, μ: 2034191, ~: 2034063) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,address,uint256[],uint256[]) (runs: 256, μ: 1936918, ~: 1938766) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredBurn(address,address,address,uint256[],uint256[]) (runs: 253, μ: 2047499, ~: 2049163) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredMintBurn(address,address,address,uint256[],uint256[]) (runs: 253, μ: 2047457, ~: 2049121) OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,address,address,uint256[],uint256[]) (runs: 256, μ: 1929500, ~: 1929829) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,address,uint256) (runs: 255, μ: 1865913, ~: 1865896) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredBurn(address,address,address,uint256) (runs: 252, μ: 1930696, ~: 1930696) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredMintBurn(address,address,address,uint256) (runs: 252, μ: 1930677, ~: 1930677) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,address,address,uint256) (runs: 254, μ: 1862855, ~: 1862855) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeUnauthorized(address,address,address,bytes32,bytes) (runs: 254, μ: 1866286, ~: 1866268) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,address,uint256) (runs: 254, μ: 1865921, ~: 1865896) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredBurn(address,address,address,uint256) (runs: 253, μ: 1930696, ~: 1930696) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredMintBurn(address,address,address,uint256) (runs: 253, μ: 1930677, ~: 1930677) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,address,address,uint256) (runs: 253, μ: 1862855, ~: 1862855) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeUnauthorized(address,address,address,bytes32,bytes) (runs: 253, μ: 1866286, ~: 1866268) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1Construct(address) (runs: 256, μ: 1190973, ~: 1190973) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1Initialize(address,bytes32) (runs: 255, μ: 1894380, ~: 1894380) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1InitializeZeroAdmin() (gas: 1492465) OffchainAssetReceiptVaultAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultAuthorizerV1IERC165(bytes4) (runs: 255, μ: 1194540, ~: 1194540) -OffchainAssetReceiptVaultCertifyTest:testCertify(uint256,uint256,string,string,uint256,bytes,uint256,bool) (runs: 256, μ: 1107301, ~: 1106341) -OffchainAssetReceiptVaultCertifyTest:testCertifyRevertOnZeroCertifyUntil(uint256,uint256,string,string,bytes,uint256,bool) (runs: 256, μ: 1070965, ~: 1072301) -OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrue(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1365221, ~: 1363168) -OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrueRevertDeposit(uint256,uint256,string,string,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 256, μ: 1316619, ~: 1315543) -OffchainAssetReceiptVaultCertifyTest:testVaultGetsCertified(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool) (runs: 256, μ: 1286894, ~: 1286491) -OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 993163, ~: 994253) -OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 1054032, ~: 1050864) -OffchainAssetReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 994119, ~: 995656) -OffchainAssetReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 1055349, ~: 1051652) -OffchainAssetReceiptVaultDepositTest:testDepositBasic(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1251779, ~: 1256838) -OffchainAssetReceiptVaultDepositTest:testDepositMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1103388, ~: 1099769) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1223107, ~: 1219434) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1160266, ~: 1158929) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1291162, ~: 1289441) -OffchainAssetReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,uint256,string,string,bytes,uint256) (runs: 256, μ: 1122212, ~: 1121335) -OffchainAssetReceiptVaultDepositTest:testDepositWithZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1120505, ~: 1116821) -OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1277850, ~: 1277618) -OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1278211, ~: 1278164) -OffchainAssetReceiptVaultDepositTest:testMintBasic(uint256,uint256,string,string,uint256,bytes,uint256) (runs: 256, μ: 1255364, ~: 1252822) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1212809, ~: 1209168) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1150682, ~: 1149078) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1282691, ~: 1281051) -OffchainAssetReceiptVaultDepositTest:testMintWithMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1093499, ~: 1089877) -OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1278083, ~: 1277604) -OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1279529, ~: 1279296) -OffchainAssetReceiptVaultDepositTest:testMultipleDeposit(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1357078, ~: 1354937) -OffchainAssetReceiptVaultDepositTest:testMultipleMints(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1345130, ~: 1342992) -OffchainAssetReceiptVaultDepositTest:testZeroAssetsAmount(uint256,uint256,string,string,bytes,uint256) (runs: 256, μ: 1112369, ~: 1111231) -OffchainAssetReceiptVaultDepositTest:testZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1116291, ~: 1112594) -OffchainAssetReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 256, μ: 1026888, ~: 1026884) -OffchainAssetReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 256, μ: 1000576, ~: 996292) -OffchainAssetReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1231245, ~: 1229881) -OffchainAssetReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 1247024, ~: 1247121) -OffchainAssetReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256,uint256,bytes) (runs: 135, μ: 1298072, ~: 1298115) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscate(uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 252, μ: 1542854, ~: 1540449) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscatorOwner(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[],uint256) (runs: 255, μ: 1597307, ~: 1598226) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferHandlerReceiver(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 256, μ: 1538980, ~: 1540647) +OffchainAssetReceiptVaultCertifyTest:testCertify(uint256,uint256,string,string,uint256,bytes,uint256,bool) (runs: 256, μ: 1107298, ~: 1106341) +OffchainAssetReceiptVaultCertifyTest:testCertifyRevertOnZeroCertifyUntil(uint256,uint256,string,string,bytes,uint256,bool) (runs: 257, μ: 1070970, ~: 1072301) +OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrue(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1365213, ~: 1363168) +OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrueRevertDeposit(uint256,uint256,string,string,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 256, μ: 1316608, ~: 1315543) +OffchainAssetReceiptVaultCertifyTest:testVaultGetsCertified(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool) (runs: 256, μ: 1286885, ~: 1286491) +OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 993429, ~: 994253) +OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 1054190, ~: 1050864) +OffchainAssetReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 994119, ~: 995656) +OffchainAssetReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 1055340, ~: 1051652) +OffchainAssetReceiptVaultDepositTest:testDepositBasic(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1251777, ~: 1256798) +OffchainAssetReceiptVaultDepositTest:testDepositMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1103449, ~: 1099769) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1223126, ~: 1219434) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1160251, ~: 1158929) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1291168, ~: 1289441) +OffchainAssetReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,uint256,string,string,bytes,uint256) (runs: 257, μ: 1122226, ~: 1121574) +OffchainAssetReceiptVaultDepositTest:testDepositWithZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1120500, ~: 1116897) +OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1277858, ~: 1277510) +OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1278219, ~: 1278056) +OffchainAssetReceiptVaultDepositTest:testMintBasic(uint256,uint256,string,string,uint256,bytes,uint256) (runs: 256, μ: 1255371, ~: 1252822) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1212823, ~: 1209168) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1150677, ~: 1149078) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1282686, ~: 1281051) +OffchainAssetReceiptVaultDepositTest:testMintWithMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1093486, ~: 1089877) +OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1278092, ~: 1277604) +OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1279538, ~: 1279296) +OffchainAssetReceiptVaultDepositTest:testMultipleDeposit(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1357067, ~: 1354937) +OffchainAssetReceiptVaultDepositTest:testMultipleMints(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1345139, ~: 1342992) +OffchainAssetReceiptVaultDepositTest:testZeroAssetsAmount(uint256,uint256,string,string,bytes,uint256) (runs: 257, μ: 1112357, ~: 1111222) +OffchainAssetReceiptVaultDepositTest:testZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1116276, ~: 1112594) +OffchainAssetReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 257, μ: 1026888, ~: 1026884) +OffchainAssetReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 257, μ: 1000384, ~: 996292) +OffchainAssetReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1231202, ~: 1229881) +OffchainAssetReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 1247022, ~: 1247085) +OffchainAssetReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256,uint256,bytes) (runs: 139, μ: 1298088, ~: 1298115) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscate(uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 252, μ: 1542850, ~: 1540098) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscatorOwner(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[],uint256) (runs: 255, μ: 1597378, ~: 1598226) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferHandlerReceiver(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 256, μ: 1538987, ~: 1540647) OffchainAssetReceiptVaultIERC165Test:testOffchainAssetReceiptVaultIERC165(bytes4) (runs: 256, μ: 4330822, ~: 4330822) -OffchainAssetReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 256, μ: 993935, ~: 989676) -OffchainAssetReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 256, μ: 994000, ~: 989741) -OffchainAssetReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1241653, ~: 1243777) -OffchainAssetReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1245186, ~: 1247368) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 56523, ~: 56632) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 99854, ~: 99844) +OffchainAssetReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 257, μ: 994006, ~: 989676) +OffchainAssetReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 257, μ: 994158, ~: 989741) +OffchainAssetReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1241669, ~: 1243777) +OffchainAssetReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1245202, ~: 1247368) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 56524, ~: 56632) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 99861, ~: 99844) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 56633, ~: 56460) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1312158, ~: 1315851) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1304865, ~: 1308217) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 250, μ: 58442, ~: 58653) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 56663, ~: 56772) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 100062, ~: 100052) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1312170, ~: 1315851) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1304856, ~: 1308312) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 246, μ: 58445, ~: 58653) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 56664, ~: 56772) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 100069, ~: 100052) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 56754, ~: 56582) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1317648, ~: 1321355) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1310379, ~: 1313745) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 250, μ: 58450, ~: 58661) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 60601, ~: 60526) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1317659, ~: 1321355) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1310369, ~: 1313839) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 246, μ: 58453, ~: 58661) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 60617, ~: 60526) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingEmitsEvent(uint256) (runs: 256, μ: 48138, ~: 48764) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 60970, ~: 60913) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 1123984, ~: 1117080) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 1132743, ~: 1125934) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 60954, ~: 60807) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 1123987, ~: 1117239) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 1132739, ~: 1126093) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreeze(uint256) (runs: 256, μ: 64193, ~: 64819) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 61921, ~: 61921) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 62041, ~: 62041) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableZeroProtectUntilReverts(address) (runs: 256, μ: 21636, ~: 21636) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableZeroProtectUntilRevertsTo(address) (runs: 256, μ: 21656, ~: 21656) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerIsAlice() (gas: 17863) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptConfiscateFrozen(uint256) (runs: 257, μ: 439225, ~: 445447) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptTransferFroze(uint256) (runs: 257, μ: 383412, ~: 389635) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenConfiscateFrozen(uint256) (runs: 257, μ: 396696, ~: 402918) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenDepositFrozen(uint256) (runs: 257, μ: 404271, ~: 410369) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenMintFrozen(uint256) (runs: 257, μ: 404233, ~: 410437) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedeemFrozen(uint256) (runs: 257, μ: 358277, ~: 363255) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedepositFrozen(uint256) (runs: 257, μ: 480148, ~: 486246) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferFroze(uint256) (runs: 257, μ: 363282, ~: 369504) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptConfiscateFrozen(uint256) (runs: 257, μ: 437957, ~: 445447) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptTransferFroze(uint256) (runs: 257, μ: 382143, ~: 389635) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenConfiscateFrozen(uint256) (runs: 257, μ: 395428, ~: 402918) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenDepositFrozen(uint256) (runs: 257, μ: 402986, ~: 410369) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenMintFrozen(uint256) (runs: 257, μ: 402948, ~: 410437) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedeemFrozen(uint256) (runs: 257, μ: 357249, ~: 363243) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedepositFrozen(uint256) (runs: 257, μ: 478863, ~: 486246) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferFroze(uint256) (runs: 257, μ: 362014, ~: 369504) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferNotFroze() (gas: 291104) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenWithdrawFrozen(uint256) (runs: 257, μ: 358479, ~: 363372) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenWithdrawFrozen(uint256) (runs: 257, μ: 357451, ~: 363360) OffchainAssetReceiptVaultPaymentMintAuthorizerV17201Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1StorageLocation() (gas: 661) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1Construct() (gas: 2221257) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1Initialize(address,address,uint8,uint256,bytes32) (runs: 251, μ: 3079905, ~: 3079905) @@ -175,53 +175,53 @@ OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetR OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroPaymentToken(address,address) (runs: 249, μ: 2584841, ~: 2584841) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroReceiptVault() (gas: 2583787) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroVerifyContract(address,address) (runs: 249, μ: 2523952, ~: 2523952) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMaxSharesSupplyExceeded(address,address,uint256,uint256,uint256,uint256) (runs: 77, μ: 5056129, ~: 5056188) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleMockedReceiptVault(address,address,address,uint256,uint256,uint256) (runs: 76, μ: 3830555, ~: 3830482) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMaxSharesSupplyExceeded(address,address,uint256,uint256,uint256,uint256) (runs: 77, μ: 5056147, ~: 5056188) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleMockedReceiptVault(address,address,address,uint256,uint256,uint256) (runs: 77, μ: 3830554, ~: 3830482) OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleRealReceiptVault(address,address,uint256,uint256,uint256) (runs: 40, μ: 5097924, ~: 5098330) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTofuTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 82, μ: 3840377, ~: 3840338) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 82, μ: 3818484, ~: 3818682) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTofuTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 77, μ: 3840424, ~: 3840338) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 77, μ: 3818515, ~: 3818682) OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testZeroPaymentAmount(address,address) (runs: 40, μ: 3755963, ~: 3755963) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantDeposit(address,address,address,uint8,uint256,address) (runs: 70, μ: 3037784, ~: 3037784) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantWithdraw(address,address,address,uint8,uint256,address) (runs: 70, μ: 3037816, ~: 3037816) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 87, μ: 3111331, ~: 3112828) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 87, μ: 3108216, ~: 3109711) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 79, μ: 3042965, ~: 3042965) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 79, μ: 3039842, ~: 3039842) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantDeposit(address,address,address,uint8,uint256,address) (runs: 72, μ: 3037784, ~: 3037784) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantWithdraw(address,address,address,uint8,uint256,address) (runs: 72, μ: 3037816, ~: 3037816) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 88, μ: 3112401, ~: 3115906) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 88, μ: 3109286, ~: 3112788) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 78, μ: 3042965, ~: 3042965) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 78, μ: 3039842, ~: 3039842) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeUnauthorized(address,address,address,uint8,uint256,address,address,bytes32,bytes) (runs: 28, μ: 3040482, ~: 3040481) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165(bytes4) (runs: 256, μ: 2224742, ~: 2224742) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1RolesAuthorized(address,address,address,uint8,uint256,address,bytes) (runs: 76, μ: 3141905, ~: 3141900) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1UnauthorizedCaller(address,address,address,uint8,uint256,address,bytes32,bytes,address) (runs: 82, μ: 3039364, ~: 3039365) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testSendPaymentToOwner(address,address,address,address) (runs: 250, μ: 3823127, ~: 3823127) -OffchainAssetReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(uint256,uint256,string,string,uint256) (runs: 256, μ: 1076221, ~: 1073847) -OffchainAssetReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(uint256,uint256,string,string,uint256) (runs: 256, μ: 1076217, ~: 1073836) -OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,uint256,uint256,string,string,uint256) (runs: 255, μ: 1078057, ~: 1075259) -OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeemNoWithdrawer(uint256,uint256,string,string,uint256) (runs: 256, μ: 996531, ~: 994147) -OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawNoRole(uint256,uint256,string,string,uint256) (runs: 256, μ: 997381, ~: 994999) -OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawWithRole(uint256,uint256,uint256,string,string,uint256) (runs: 255, μ: 1077882, ~: 1074661) -OffchainAssetReceiptVaultReceiptTest:testVaultAsset(uint256,string,string) (runs: 256, μ: 995213, ~: 990954) -OffchainAssetReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 256, μ: 992383, ~: 994988) -OffchainAssetReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 257, μ: 1182000, ~: 1178717) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1RolesAuthorized(address,address,address,uint8,uint256,address,bytes) (runs: 78, μ: 3141902, ~: 3141900) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1UnauthorizedCaller(address,address,address,uint8,uint256,address,bytes32,bytes,address) (runs: 80, μ: 3039365, ~: 3039365) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testSendPaymentToOwner(address,address,address,address) (runs: 252, μ: 3823127, ~: 3823127) +OffchainAssetReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(uint256,uint256,string,string,uint256) (runs: 257, μ: 1076303, ~: 1073847) +OffchainAssetReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(uint256,uint256,string,string,uint256) (runs: 257, μ: 1076203, ~: 1073836) +OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,uint256,uint256,string,string,uint256) (runs: 256, μ: 1078131, ~: 1075259) +OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeemNoWithdrawer(uint256,uint256,string,string,uint256) (runs: 257, μ: 996275, ~: 994147) +OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawNoRole(uint256,uint256,string,string,uint256) (runs: 257, μ: 997209, ~: 994999) +OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawWithRole(uint256,uint256,uint256,string,string,uint256) (runs: 256, μ: 1077956, ~: 1074661) +OffchainAssetReceiptVaultReceiptTest:testVaultAsset(uint256,string,string) (runs: 257, μ: 995023, ~: 990954) +OffchainAssetReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 257, μ: 992393, ~: 994988) +OffchainAssetReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 257, μ: 1182005, ~: 1178717) OwnerFreezableERC7201Test:testOwnerFreezableStorageLocation() (gas: 611) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 45339, ~: 45426) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 83125, ~: 83116) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 45423, ~: 45247) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1049852, ~: 1052848) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1042590, ~: 1045281) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 245, μ: 48347, ~: 48562) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 45214, ~: 45301) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 82871, ~: 82863) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 45314, ~: 45138) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1041306, ~: 1044281) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1034024, ~: 1036693) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 245, μ: 48290, ~: 48505) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 49501, ~: 49429) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 45328, ~: 45290) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 242, μ: 83132, ~: 83128) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 45433, ~: 45247) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1049863, ~: 1052848) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1042591, ~: 1045376) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 250, μ: 48332, ~: 48000) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 45202, ~: 45164) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 242, μ: 82878, ~: 82875) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 45324, ~: 45138) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1041317, ~: 1044281) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1034025, ~: 1036787) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 250, μ: 48275, ~: 47943) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 49490, ~: 49429) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingEmitsEvent(uint256) (runs: 256, μ: 39094, ~: 39720) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 49898, ~: 49838) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 863948, ~: 858592) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 872705, ~: 867606) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 49908, ~: 49995) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 863939, ~: 858592) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 872694, ~: 867606) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreeze(uint256) (runs: 256, μ: 46090, ~: 46716) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 44349, ~: 44346) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 44249, ~: 44246) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 44350, ~: 44346) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 44250, ~: 44246) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableZeroProtectUntilReverts(address) (runs: 256, μ: 13647, ~: 13647) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableZeroProtectUntilRevertsTo(address) (runs: 256, μ: 13580, ~: 13580) OwnerFreezableTestOwnerFreezeUntil:testOwnerIsAlice() (gas: 9855) @@ -250,31 +250,31 @@ ReceiptVaultDecimalsTest:testDecimalsWithNonZeroAsset(uint8) (runs: 256, μ: 594 ReceiptVaultDecimalsTest:testDecimalsWithZeroAsset() (gas: 2661816) ReceiptVaultERC7201Test:testReceiptVaultStorageLocation() (gas: 676) ReceiptVaultIERC165Test:testReceiptVaultIERC165(bytes4) (runs: 256, μ: 2667357, ~: 2667357) -RedeemTest:testOffchainAssetWithdrawWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1401827, ~: 1403675) -RedeemTest:testRedeem(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232917, ~: 1234849) -RedeemTest:testRedeemInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258976, ~: 1261429) -RedeemTest:testRedeemOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1326633, ~: 1325156) +RedeemTest:testOffchainAssetWithdrawWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1402063, ~: 1403675) +RedeemTest:testRedeem(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232929, ~: 1234889) +RedeemTest:testRedeemInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258988, ~: 1261469) +RedeemTest:testRedeemOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1326585, ~: 1325156) RedeemTest:testRedeemOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1356597, ~: 1352550) -RedeemTest:testRedeemOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 249, μ: 1504203, ~: 1503685) -RedeemTest:testRedeemRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1193164, ~: 1192473) -RedeemTest:testRedeemSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296607, ~: 1296686) -RedeemTest:testRedeemToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232849, ~: 1234781) -RedeemTest:testRedeemZeroAssetsAmount(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258933, ~: 1261251) -RedeemTest:testRedeemZeroOwner(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260569, ~: 1263020) -RedeemTest:testRedeemZeroReceiver(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258628, ~: 1261253) -RedeemTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 132, μ: 1270075, ~: 1270084) -RedepositTest:testReDeposit(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1324902, ~: 1325467) -RedepositTest:testReDepositOverSeveralIds(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1547582, ~: 1548431) -RedepositTest:testReDepositRevertsWithZeroAssets(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1293246, ~: 1288260) -RedepositTest:testReDepositToNonExistentReceipt(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 255, μ: 1293738, ~: 1292075) -RedepositTest:testReDepositToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1296864, ~: 1298851) -RedepositTest:testReDepositToSomeoneElseReverts(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1306544, ~: 1305335) -RedepositTest:testReDepositToSomeoneElseWhileCertified(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1325096, ~: 1325758) -RedepositTest:testReDepositrevertsPastTopID(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1347523, ~: 1347588) -RolesTest:testCertifyWithoutRole(uint256,string,string,uint256,bytes) (runs: 255, μ: 1023109, ~: 1022795) -RolesTest:testConfiscateReceiptWithoutRole(uint256,string,string,uint256,uint256,bytes) (runs: 254, μ: 1025074, ~: 1025249) -RolesTest:testConfiscateSharesWithoutRole(uint256,string,string,uint256,bytes) (runs: 255, μ: 1023292, ~: 1023126) -RolesTest:testDepositWithoutDepositorRole(uint256,uint256,string,string,uint256,bytes) (runs: 255, μ: 1278328, ~: 1274261) +RedeemTest:testRedeemOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 250, μ: 1504201, ~: 1503685) +RedeemTest:testRedeemRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1193162, ~: 1192473) +RedeemTest:testRedeemSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296358, ~: 1296686) +RedeemTest:testRedeemToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232861, ~: 1234821) +RedeemTest:testRedeemZeroAssetsAmount(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258942, ~: 1261545) +RedeemTest:testRedeemZeroOwner(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260581, ~: 1263582) +RedeemTest:testRedeemZeroReceiver(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258640, ~: 1261293) +RedeemTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 137, μ: 1269244, ~: 1270084) +RedepositTest:testReDeposit(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1324877, ~: 1325467) +RedepositTest:testReDepositOverSeveralIds(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1547567, ~: 1548431) +RedepositTest:testReDepositRevertsWithZeroAssets(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1293264, ~: 1288380) +RedepositTest:testReDepositToNonExistentReceipt(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 256, μ: 1293726, ~: 1292075) +RedepositTest:testReDepositToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1296870, ~: 1298897) +RedepositTest:testReDepositToSomeoneElseReverts(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1306550, ~: 1305335) +RedepositTest:testReDepositToSomeoneElseWhileCertified(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1325061, ~: 1325758) +RedepositTest:testReDepositrevertsPastTopID(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1347496, ~: 1347588) +RolesTest:testCertifyWithoutRole(uint256,string,string,uint256,bytes) (runs: 256, μ: 1023107, ~: 1022795) +RolesTest:testConfiscateReceiptWithoutRole(uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1025075, ~: 1025249) +RolesTest:testConfiscateSharesWithoutRole(uint256,string,string,uint256,bytes) (runs: 256, μ: 1023466, ~: 1023126) +RolesTest:testDepositWithoutDepositorRole(uint256,uint256,string,string,uint256,bytes) (runs: 255, μ: 1278322, ~: 1274261) RolesTest:testGrantAdminRoles(uint256,string,string) (runs: 257, μ: 1032251, ~: 1027835) SceptreStakedFlrOracleTest:testSceptreStakedFlrOracle() (gas: 150235) SceptreStakedFlrOracleTest:testSceptreStakedFlrOracleRefund(uint128,uint128) (runs: 256, μ: 162917, ~: 162255) @@ -284,16 +284,16 @@ TwoPriceOracleTest:testSameBaseQuote(address) (runs: 253, μ: 37371, ~: 37371) TwoPriceOracleTest:testZeroAddressBase(address) (runs: 253, μ: 4153749, ~: 41541) TwoPriceOracleTest:testZeroAddressBoth() (gas: 36561) TwoPriceOracleTest:testZeroAddressQuote(address) (runs: 253, μ: 39043, ~: 39043) -WithdrawTest:testOffchainAssetWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1600658, ~: 1600352) -WithdrawTest:testWithdraw(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232933, ~: 1234884) -WithdrawTest:testWithdrawInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258829, ~: 1261549) -WithdrawTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 132, μ: 1272101, ~: 1270124) -WithdrawTest:testWithdrawOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1329174, ~: 1325221) -WithdrawTest:testWithdrawOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1356920, ~: 1352966) -WithdrawTest:testWithdrawOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 253, μ: 1504651, ~: 1503848) -WithdrawTest:testWithdrawRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1312543, ~: 1311431) -WithdrawTest:testWithdrawSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296857, ~: 1296771) -WithdrawTest:testWithdrawToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1233246, ~: 1235450) -WithdrawTest:testWithdrawZeroAssetsAmount(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1264213, ~: 1262802) -WithdrawTest:testWithdrawZeroOwner(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1266345, ~: 1264872) -WithdrawTest:testWithdrawZeroReceiver(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1264164, ~: 1262870) \ No newline at end of file +WithdrawTest:testOffchainAssetWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1600671, ~: 1600352) +WithdrawTest:testWithdraw(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232940, ~: 1235523) +WithdrawTest:testWithdrawInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258836, ~: 1262103) +WithdrawTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 136, μ: 1270567, ~: 1270124) +WithdrawTest:testWithdrawOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1329172, ~: 1325221) +WithdrawTest:testWithdrawOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1356917, ~: 1352966) +WithdrawTest:testWithdrawOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 253, μ: 1504588, ~: 1503848) +WithdrawTest:testWithdrawRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1312538, ~: 1311431) +WithdrawTest:testWithdrawSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296840, ~: 1296771) +WithdrawTest:testWithdrawToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1233254, ~: 1235567) +WithdrawTest:testWithdrawZeroAssetsAmount(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1264226, ~: 1262802) +WithdrawTest:testWithdrawZeroOwner(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1266364, ~: 1264872) +WithdrawTest:testWithdrawZeroReceiver(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1264184, ~: 1262870) \ No newline at end of file diff --git a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol index dd7830f7..69984cf3 100644 --- a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol +++ b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol @@ -2,6 +2,13 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; +import { + ZeroReceiptImplementation, + ZeroVaultImplementation, + InitializeNonZeroReceipt, + InitializeReceiptFailed, + InitializeVaultFailed +} from "../../error/ErrDeployer.sol"; import {Clones} from "openzeppelin-contracts/contracts/proxy/Clones.sol"; import {Receipt, ICLONEABLE_V2_SUCCESS} from "../receipt/Receipt.sol"; import { @@ -20,8 +27,8 @@ contract ERC20PriceOracleReceiptVaultCloneDeployer { address immutable I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION; constructor(ERC20PriceOracleReceiptVaultCloneDeployerConfig memory config) { - require(config.receiptImplementation != address(0), "Zero receipt implementation"); - require(config.erc20PriceOracleReceiptVaultImplementation != address(0), "Zero vault implementation"); + if (config.receiptImplementation == address(0)) revert ZeroReceiptImplementation(); + if (config.erc20PriceOracleReceiptVaultImplementation == address(0)) revert ZeroVaultImplementation(); I_RECEIPT_IMPLEMENTATION = config.receiptImplementation; I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION = config.erc20PriceOracleReceiptVaultImplementation; } @@ -30,22 +37,22 @@ contract ERC20PriceOracleReceiptVaultCloneDeployer { external returns (ERC20PriceOracleReceiptVault) { - require(config.receiptVaultConfig.receipt == address(0), "Receipt address must be zero"); + if (config.receiptVaultConfig.receipt != address(0)) { + revert InitializeNonZeroReceipt(config.receiptVaultConfig.receipt); + } Receipt receipt = Receipt(Clones.clone(I_RECEIPT_IMPLEMENTATION)); ERC20PriceOracleReceiptVault erc20PriceOracleReceiptVault = ERC20PriceOracleReceiptVault(payable(Clones.clone(I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION))); - require( - receipt.initialize(abi.encode(erc20PriceOracleReceiptVault)) == ICLONEABLE_V2_SUCCESS, - "Failed to init receipt" - ); + if (receipt.initialize(abi.encode(erc20PriceOracleReceiptVault)) != ICLONEABLE_V2_SUCCESS) { + revert InitializeReceiptFailed(); + } config.receiptVaultConfig.receipt = address(receipt); - require( - erc20PriceOracleReceiptVault.initialize(abi.encode(config)) == ICLONEABLE_V2_SUCCESS, - "Failed to init erc20 price oracle receipt vault" - ); + if (erc20PriceOracleReceiptVault.initialize(abi.encode(config)) != ICLONEABLE_V2_SUCCESS) { + revert InitializeVaultFailed(); + } return erc20PriceOracleReceiptVault; } diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol index cfcdc079..6aeb4e54 100644 --- a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -6,6 +6,13 @@ import {Receipt, ICLONEABLE_V2_SUCCESS} from "../receipt/Receipt.sol"; import {OffchainAssetReceiptVault, OffchainAssetReceiptVaultConfigV2} from "../vault/OffchainAssetReceiptVault.sol"; import {IBeacon, UpgradeableBeacon} from "openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; import {BeaconProxy} from "openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol"; +import { + ZeroReceiptImplementation, + ZeroVaultImplementation, + InitializeNonZeroReceipt, + InitializeReceiptFailed, + InitializeVaultFailed +} from "../../error/ErrDeployer.sol"; struct OffchainAssetReceiptVaultBeaconSetDeployerConfig { address initialOwner; @@ -18,6 +25,13 @@ contract OffchainAssetReceiptVaultBeaconSetDeployer { IBeacon public immutable I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON; constructor(OffchainAssetReceiptVaultBeaconSetDeployerConfig memory config) { + if (address(config.initialReceiptImplementation) == address(0)) { + revert ZeroReceiptImplementation(); + } + if (address(config.initialOffchainAssetReceiptVaultImplementation) == address(0)) { + revert ZeroVaultImplementation(); + } + I_RECEIPT_BEACON = new UpgradeableBeacon(address(config.initialReceiptImplementation), config.initialOwner); I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON = new UpgradeableBeacon(address(config.initialOffchainAssetReceiptVaultImplementation), config.initialOwner); @@ -27,22 +41,23 @@ contract OffchainAssetReceiptVaultBeaconSetDeployer { external returns (OffchainAssetReceiptVault) { - require(config.receiptVaultConfig.receipt == address(0), "Receipt address must be zero"); + if (config.receiptVaultConfig.receipt != address(0)) { + revert InitializeNonZeroReceipt(config.receiptVaultConfig.receipt); + } Receipt receipt = Receipt(address(new BeaconProxy(address(I_RECEIPT_BEACON), ""))); OffchainAssetReceiptVault offchainAssetReceiptVault = OffchainAssetReceiptVault( payable(address(new BeaconProxy(address(I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON), ""))) ); - require( - receipt.initialize(abi.encode(offchainAssetReceiptVault)) == ICLONEABLE_V2_SUCCESS, "Failed to init receipt" - ); + if (receipt.initialize(abi.encode(offchainAssetReceiptVault)) != ICLONEABLE_V2_SUCCESS) { + revert InitializeReceiptFailed(); + } config.receiptVaultConfig.receipt = address(receipt); - require( - offchainAssetReceiptVault.initialize(abi.encode(config)) == ICLONEABLE_V2_SUCCESS, - "Failed to init offchain asset receipt vault" - ); + if (offchainAssetReceiptVault.initialize(abi.encode(config)) != ICLONEABLE_V2_SUCCESS) { + revert InitializeVaultFailed(); + } return offchainAssetReceiptVault; } diff --git a/src/error/ErrDeployer.sol b/src/error/ErrDeployer.sol new file mode 100644 index 00000000..0ca48626 --- /dev/null +++ b/src/error/ErrDeployer.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity ^0.8.25; + +/// Thrown when constructing a deployer with a zero receipt implementation +/// address. +error ZeroReceiptImplementation(); + +/// Thrown when constructing a deployer with a zero vault implementation address. +error ZeroVaultImplementation(); + +/// Thrown when attempting to initialize with a non-zero receipt address. +/// @param receipt The receipt address that is not zero in the initialization +/// config. +error InitializeNonZeroReceipt(address receipt); + +error InitializeReceiptFailed(); + +error InitializeVaultFailed(); diff --git a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.initialize.t.sol b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.initialize.t.sol index 55ef9e83..7ff7f696 100644 --- a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.initialize.t.sol +++ b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.initialize.t.sol @@ -10,8 +10,6 @@ import {ERC20PriceOracleReceiptVaultTest, Vm} from "test/abstract/ERC20PriceOrac import {IPriceOracleV2} from "src/interface/IPriceOracleV2.sol"; import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenerator.sol"; -import {console2} from "forge-std/console2.sol"; - contract ERC20PriceOracleReceiptVaultInitializeTest is ERC20PriceOracleReceiptVaultTest { /// Test ERC20PriceOracleReceiptVault is initialized function testERC20PriceOracleReceiptVaultInitializedV2Event( From 474b2805a2bf72350b1bb805c4fcb3176cf0b483 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 17:55:08 +0400 Subject: [PATCH 10/26] public immutables on deployer --- .../deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol index 69984cf3..a2245b9b 100644 --- a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol +++ b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol @@ -23,8 +23,8 @@ struct ERC20PriceOracleReceiptVaultCloneDeployerConfig { } contract ERC20PriceOracleReceiptVaultCloneDeployer { - address immutable I_RECEIPT_IMPLEMENTATION; - address immutable I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION; + address public immutable I_RECEIPT_IMPLEMENTATION; + address public immutable I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION; constructor(ERC20PriceOracleReceiptVaultCloneDeployerConfig memory config) { if (config.receiptImplementation == address(0)) revert ZeroReceiptImplementation(); From 45f15bfeda30a167eca7e4600c58e80ecba8fcce Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 18:01:32 +0400 Subject: [PATCH 11/26] lint --- .../deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol index 6aeb4e54..d0fa8d2f 100644 --- a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -4,7 +4,8 @@ pragma solidity =0.8.25; import {Receipt, ICLONEABLE_V2_SUCCESS} from "../receipt/Receipt.sol"; import {OffchainAssetReceiptVault, OffchainAssetReceiptVaultConfigV2} from "../vault/OffchainAssetReceiptVault.sol"; -import {IBeacon, UpgradeableBeacon} from "openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {IBeacon} from "openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol"; +import {UpgradeableBeacon} from "openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; import {BeaconProxy} from "openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol"; import { ZeroReceiptImplementation, From df77477a95db8e79471a91db33029c372e082c41 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 18:06:00 +0400 Subject: [PATCH 12/26] deployment event --- .../deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol | 4 ++++ .../deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol index a2245b9b..1f65fbb9 100644 --- a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol +++ b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol @@ -23,6 +23,8 @@ struct ERC20PriceOracleReceiptVaultCloneDeployerConfig { } contract ERC20PriceOracleReceiptVaultCloneDeployer { + event Deployment(address sender, address receipt, address erc20PriceOracleReceiptVault); + address public immutable I_RECEIPT_IMPLEMENTATION; address public immutable I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION; @@ -54,6 +56,8 @@ contract ERC20PriceOracleReceiptVaultCloneDeployer { revert InitializeVaultFailed(); } + emit Deployment(msg.sender, address(receipt), address(erc20PriceOracleReceiptVault)); + return erc20PriceOracleReceiptVault; } } diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol index d0fa8d2f..2eeb7f3f 100644 --- a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -22,6 +22,8 @@ struct OffchainAssetReceiptVaultBeaconSetDeployerConfig { } contract OffchainAssetReceiptVaultBeaconSetDeployer { + event Deployment(address sender, address receiptBeacon, address offchainAssetReceiptVaultBeacon); + IBeacon public immutable I_RECEIPT_BEACON; IBeacon public immutable I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON; @@ -60,6 +62,8 @@ contract OffchainAssetReceiptVaultBeaconSetDeployer { revert InitializeVaultFailed(); } + emit Deployment(msg.sender, address(receipt), address(offchainAssetReceiptVault)); + return offchainAssetReceiptVault; } } From dc77811125fc2c9602537e55009634e56a67baf0 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 18:07:24 +0400 Subject: [PATCH 13/26] lint comments for errors --- src/error/ErrDeployer.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/error/ErrDeployer.sol b/src/error/ErrDeployer.sol index 0ca48626..0365af7f 100644 --- a/src/error/ErrDeployer.sol +++ b/src/error/ErrDeployer.sol @@ -14,6 +14,8 @@ error ZeroVaultImplementation(); /// config. error InitializeNonZeroReceipt(address receipt); +/// Thrown when receipt initialization fails. error InitializeReceiptFailed(); +/// Thrown when vault initialization fails. error InitializeVaultFailed(); From 6784a38007a503f7aebf095b802b941250e33c06 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 18:13:35 +0400 Subject: [PATCH 14/26] lint --- .../concrete/vault/OffchainAssetReceiptVault.initialize.t.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol index 04eb2b18..c26705ee 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol @@ -2,7 +2,6 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {ReceiptVaultConfigV2} from "src/abstract/ReceiptVault.sol"; import { OffchainAssetReceiptVaultTest, ReceiptVaultConfigV2, Vm } from "test/abstract/OffchainAssetReceiptVaultTest.sol"; From d8b81e0e3b800598e69b62faab950443977b53b3 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 18:17:16 +0400 Subject: [PATCH 15/26] test import paths --- .gas-snapshot | 436 +++++++++--------- ...VaultPaymentMintAuthorizerV1.deposit.t.sol | 2 +- .../concrete/receipt/Receipt.metadata.t.sol | 2 +- test/src/concrete/receipt/Receipt.t.sol | 4 +- .../ERC20PriceOracleReceiptVault.mint.t.sol | 8 +- .../ERC20PriceOracleReceiptVault.redeem.t.sol | 8 +- ...RC20PriceOracleReceiptVault.withdraw.t.sol | 8 +- ...nAssetReceiptVault.confiscateReceipt.t.sol | 7 +- .../OffchainAssetReceiptVault.handler.t.sol | 6 +- ...inAssetReceiptVault.ownerFreezeUntil.t.sol | 4 +- 10 files changed, 242 insertions(+), 243 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index 5202ae27..08900262 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,7 +1,7 @@ -ConfiscateReceiptTest:testConfiscateReceiptBasic(uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 252, μ: 1402238, ~: 1410301) -ConfiscateReceiptTest:testConfiscateReceiptOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256) (runs: 255, μ: 1153887, ~: 1154437) -ConfiscateSharesTest:testConfiscateSharesBasic(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 253, μ: 1350220, ~: 1357279) -ConfiscateSharesTest:testConfiscateSharesOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256,uint256) (runs: 254, μ: 1266464, ~: 1268538) +ConfiscateReceiptTest:testConfiscateReceiptBasic(uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 252, μ: 1404979, ~: 1413280) +ConfiscateReceiptTest:testConfiscateReceiptOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256) (runs: 255, μ: 1156864, ~: 1157415) +ConfiscateSharesTest:testConfiscateSharesBasic(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 253, μ: 1351593, ~: 1358886) +ConfiscateSharesTest:testConfiscateSharesOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256,uint256) (runs: 254, μ: 1268071, ~: 1270145) ERC20PriceOracleReceiptMetadataTest:testOverriddenMetadataWithImage(uint256,string,string,string,string,string,string,uint8) (runs: 242, μ: 3134470, ~: 3135563) ERC20PriceOracleReceiptMetadataTest:testOverriddenMetadataWithoutImage(uint256,string,string,string,string,string,uint8) (runs: 254, μ: 3063586, ~: 3069077) ERC20PriceOracleReceiptMetadataTest:testReceiptName() (gas: 770273) @@ -9,164 +9,164 @@ ERC20PriceOracleReceiptMetadataTest:testReceiptSymbol() (gas: 770295) ERC20PriceOracleReceiptMetadataTest:testReceiptURI(uint256) (runs: 248, μ: 822451, ~: 822688) ERC20PriceOracleReceiptMetadataTest:testReceiptURIZeroError() (gas: 769391) ERC20PriceOracleReceiptVault7201Test:testERC20PriceOracleReceiptVault7201StorageLocation() (gas: 671) -ERC20PriceOracleReceiptVaultAssetTest:testVaultAsset(string,string) (runs: 257, μ: 336666, ~: 336290) -ERC20PriceOracleReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 606242, ~: 607218) -ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 395832, ~: 396658) -ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 455456, ~: 452214) -ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 396160, ~: 397504) -ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 455733, ~: 452055) -ERC20PriceOracleReceiptVaultDepositTest:testDepositBasic(uint256,string,string,uint256,uint256,bytes) (runs: 257, μ: 526106, ~: 525814) -ERC20PriceOracleReceiptVaultDepositTest:testDepositMinShareRatio(uint256,string,string,bytes,uint256,uint256,uint256) (runs: 257, μ: 472503, ~: 469876) -ERC20PriceOracleReceiptVaultDepositTest:testDepositSomeoneElse(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 579345, ~: 581974) -ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,string,string,bytes,uint256,uint256) (runs: 257, μ: 489719, ~: 490211) -ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroReceiver(string,string,bytes,uint256,uint256,uint256) (runs: 257, μ: 383189, ~: 383848) -ERC20PriceOracleReceiptVaultDepositTest:testMultipleDeposits(uint256,string,string,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 257, μ: 992827, ~: 989988) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 257, μ: 427149, ~: 427145) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 257, μ: 402747, ~: 398653) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256) (runs: 257, μ: 509643, ~: 510967) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256) (runs: 257, μ: 524173, ~: 523996) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256) (runs: 173, μ: 572410, ~: 571996) -ERC20PriceOracleReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 257, μ: 779258, ~: 780323) -ERC20PriceOracleReceiptVaultInitializeTest:testERC20PriceOracleReceiptVaultInitializedV2Event(uint256,string,string) (runs: 257, μ: 411927, ~: 407483) -ERC20PriceOracleReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 257, μ: 395299, ~: 391055) -ERC20PriceOracleReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 257, μ: 395190, ~: 391120) -ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 156, μ: 578310, ~: 578010) -ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 159, μ: 583358, ~: 582800) -ERC20PriceOracleReceiptVaultMintTest:testMintBasic(string,string,uint256,uint256,bytes) (runs: 257, μ: 474224, ~: 473214) -ERC20PriceOracleReceiptVaultMintTest:testMintSomeoneElse(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 584692, ~: 580571) -ERC20PriceOracleReceiptVaultMintTest:testMintWithMinShareRatio(string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 362623, ~: 362170) -ERC20PriceOracleReceiptVaultMintTest:testMintWithZeroShares(string,string,uint256,uint256,bytes) (runs: 257, μ: 385489, ~: 385148) -ERC20PriceOracleReceiptVaultMintTest:testMultipleMints(string,string,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 257, μ: 539828, ~: 539254) -ERC20PriceOracleReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(string,string,uint256,uint256) (runs: 257, μ: 350406, ~: 348129) -ERC20PriceOracleReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(string,string,uint256,uint256) (runs: 257, μ: 350586, ~: 348500) -ERC20PriceOracleReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,string,string,uint256,uint256) (runs: 248, μ: 398706, ~: 399545) -ERC20PriceOracleReceiptVaultPreviewWithdrawTest:testPreviewWithdraw(uint256,string,string,uint256,uint256) (runs: 257, μ: 398575, ~: 399639) -ERC20PriceOracleReceiptVaultReceiptTest:testVaultAsset(string,string) (runs: 257, μ: 337616, ~: 337145) -ERC20PriceOracleReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 257, μ: 393841, ~: 396434) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemBasic(uint256,string,string,uint256,uint256,uint256) (runs: 241, μ: 543920, ~: 545137) +ERC20PriceOracleReceiptVaultAssetTest:testVaultAsset(string,string) (runs: 257, μ: 338295, ~: 337919) +ERC20PriceOracleReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 607876, ~: 608847) +ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 397448, ~: 398287) +ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 457090, ~: 453843) +ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 397787, ~: 399133) +ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 457368, ~: 453684) +ERC20PriceOracleReceiptVaultDepositTest:testDepositBasic(uint256,string,string,uint256,uint256,bytes) (runs: 257, μ: 527740, ~: 527166) +ERC20PriceOracleReceiptVaultDepositTest:testDepositMinShareRatio(uint256,string,string,bytes,uint256,uint256,uint256) (runs: 257, μ: 474173, ~: 471505) +ERC20PriceOracleReceiptVaultDepositTest:testDepositSomeoneElse(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 580971, ~: 583603) +ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,string,string,bytes,uint256,uint256) (runs: 257, μ: 491338, ~: 491840) +ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroReceiver(string,string,bytes,uint256,uint256,uint256) (runs: 257, μ: 384817, ~: 385477) +ERC20PriceOracleReceiptVaultDepositTest:testMultipleDeposits(uint256,string,string,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 257, μ: 996088, ~: 993246) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 257, μ: 428778, ~: 428774) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 257, μ: 404376, ~: 400282) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256) (runs: 257, μ: 511265, ~: 512596) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256) (runs: 257, μ: 525823, ~: 525625) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256) (runs: 180, μ: 574034, ~: 573625) +ERC20PriceOracleReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 257, μ: 782516, ~: 783581) +ERC20PriceOracleReceiptVaultInitializeTest:testERC20PriceOracleReceiptVaultInitializedV2Event(uint256,string,string) (runs: 257, μ: 414896, ~: 410451) +ERC20PriceOracleReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 257, μ: 396928, ~: 392684) +ERC20PriceOracleReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 257, μ: 396819, ~: 392749) +ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 157, μ: 579112, ~: 579702) +ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 158, μ: 584246, ~: 584351) +ERC20PriceOracleReceiptVaultMintTest:testMintBasic(string,string,uint256,uint256,bytes) (runs: 257, μ: 475865, ~: 474843) +ERC20PriceOracleReceiptVaultMintTest:testMintSomeoneElse(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 586324, ~: 582180) +ERC20PriceOracleReceiptVaultMintTest:testMintWithMinShareRatio(string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 364260, ~: 363799) +ERC20PriceOracleReceiptVaultMintTest:testMintWithZeroShares(string,string,uint256,uint256,bytes) (runs: 257, μ: 387132, ~: 386777) +ERC20PriceOracleReceiptVaultMintTest:testMultipleMints(string,string,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 257, μ: 541399, ~: 540883) +ERC20PriceOracleReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(string,string,uint256,uint256) (runs: 257, μ: 352019, ~: 349756) +ERC20PriceOracleReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(string,string,uint256,uint256) (runs: 257, μ: 352220, ~: 350129) +ERC20PriceOracleReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,string,string,uint256,uint256) (runs: 245, μ: 400513, ~: 401174) +ERC20PriceOracleReceiptVaultPreviewWithdrawTest:testPreviewWithdraw(uint256,string,string,uint256,uint256) (runs: 257, μ: 400212, ~: 401268) +ERC20PriceOracleReceiptVaultReceiptTest:testVaultAsset(string,string) (runs: 257, μ: 339245, ~: 338774) +ERC20PriceOracleReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 257, μ: 395470, ~: 398063) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemBasic(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 546902, ~: 548118) ERC20PriceOracleReceiptVaultRedeemTest:testRedeemFlareFork(uint256) (runs: 1, μ: 544965, ~: 544965) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemMoreThanBalance(uint256,string,string,uint256,uint256,uint256) (runs: 256, μ: 527943, ~: 528744) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroOwner(uint256,string,string,uint256,uint256,uint256) (runs: 241, μ: 520405, ~: 521900) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroReceiver(uint256,string,string,uint256,uint256,uint256) (runs: 241, μ: 524698, ~: 526010) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 521888, ~: 523035) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 235, μ: 625521, ~: 626657) -ERC20PriceOracleReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 257, μ: 399525, ~: 396341) -ERC20PriceOracleReceiptVaultWithdrawTest:testMultiplePricesAndHistoricalRedemptionsAndMint(uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 794124, ~: 794277) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 803471, ~: 808141) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawBasic(uint256,string,string,uint256,uint256) (runs: 257, μ: 536821, ~: 543265) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemMoreThanBalance(uint256,string,string,uint256,uint256,uint256) (runs: 256, μ: 530940, ~: 531744) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroOwner(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 523386, ~: 524881) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroReceiver(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 527699, ~: 529011) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 524898, ~: 526035) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 236, μ: 628558, ~: 629678) +ERC20PriceOracleReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 257, μ: 401154, ~: 397970) +ERC20PriceOracleReceiptVaultWithdrawTest:testMultiplePricesAndHistoricalRedemptionsAndMint(uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 797184, ~: 797344) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 804865, ~: 809770) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawBasic(uint256,string,string,uint256,uint256) (runs: 257, μ: 539804, ~: 546246) ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawFlareFork(uint256) (runs: 1, μ: 545152, ~: 545152) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawMoreThanAssets(uint256,string,string,uint256,uint256,uint256) (runs: 256, μ: 527085, ~: 528042) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 521508, ~: 522846) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroOwner(uint256,string,string,uint256,uint256) (runs: 257, μ: 519585, ~: 520749) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroReceiver(uint256,string,string,uint256,uint256) (runs: 256, μ: 522425, ~: 524115) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawMoreThanAssets(uint256,string,string,uint256,uint256,uint256) (runs: 256, μ: 530063, ~: 531042) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 524511, ~: 525846) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroOwner(uint256,string,string,uint256,uint256) (runs: 257, μ: 522568, ~: 523729) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroReceiver(uint256,string,string,uint256,uint256) (runs: 256, μ: 525428, ~: 527115) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOracle() (gas: 461762) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOraclePaid(uint128) (runs: 1, μ: 701707, ~: 701707) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOracleStale() (gas: 462499) -MulticallTest:testDepositMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296345, ~: 1295312) -MulticallTest:testMintMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296387, ~: 1295349) -MulticallTest:testRedeemMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1308291, ~: 1309070) -MulticallTest:testWithdrawMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1308642, ~: 1309247) -OffChainAssetReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 257, μ: 1976921, ~: 1977987) -OffChainAssetReceiptVaultInitializeTest:testNonZeroAsset(uint256,address,string,string) (runs: 256, μ: 515560, ~: 513151) -OffChainAssetReceiptVaultInitializeTest:testOffchainAssetReceiptVaultInitializedV2Event(uint256,string,string) (runs: 257, μ: 1054742, ~: 1050296) +MulticallTest:testDepositMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1297963, ~: 1296919) +MulticallTest:testMintMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1298005, ~: 1296956) +MulticallTest:testRedeemMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1309882, ~: 1310677) +MulticallTest:testWithdrawMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1310233, ~: 1310854) +OffChainAssetReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 257, μ: 1980135, ~: 1981201) +OffChainAssetReceiptVaultInitializeTest:testNonZeroAsset(uint256,address,string,string) (runs: 254, μ: 515570, ~: 513151) +OffChainAssetReceiptVaultInitializeTest:testOffchainAssetReceiptVaultInitializedV2Event(uint256,string,string) (runs: 257, μ: 1058022, ~: 1053576) OffChainAssetReceiptVaultInitializeTest:testZeroInitialAdmin(string,string) (runs: 256, μ: 440060, ~: 439508) OffchainAssetReceiptVault7201Test:testOffchainAssetReceiptVault7201StorageLocation() (gas: 671) -OffchainAssetReceiptVaultAssetTest:testVaultAsset(uint256,string,string) (runs: 257, μ: 993708, ~: 989378) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscator(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 1865342, ~: 1865950) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscatorTo(uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 1474093, ~: 1472109) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 1425553, ~: 1424363) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferRevertExpiredCertification(uint256,uint256,string,string,uint256,uint256,uint256,bytes,uint256[],uint256[]) (runs: 257, μ: 1336169, ~: 1340497) -OffchainAssetReceiptVaultAuthorizeTest:testAuthorizeContract(uint256,uint256,string,string) (runs: 257, μ: 1078131, ~: 1075783) -OffchainAssetReceiptVaultAuthorizeTest:testChangeAuthorizer(uint256,uint256,string,string) (runs: 257, μ: 1374845, ~: 1372497) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeAuthorized(address,address,bytes,address) (runs: 253, μ: 2034191, ~: 2034063) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,address,uint256[],uint256[]) (runs: 256, μ: 1936918, ~: 1938766) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredBurn(address,address,address,uint256[],uint256[]) (runs: 253, μ: 2047499, ~: 2049163) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredMintBurn(address,address,address,uint256[],uint256[]) (runs: 253, μ: 2047457, ~: 2049121) +OffchainAssetReceiptVaultAssetTest:testVaultAsset(uint256,string,string) (runs: 257, μ: 995315, ~: 990985) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscator(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 1866949, ~: 1867557) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscatorTo(uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 1475700, ~: 1473716) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 1427173, ~: 1425970) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferRevertExpiredCertification(uint256,uint256,string,string,uint256,uint256,uint256,bytes,uint256[],uint256[]) (runs: 257, μ: 1337794, ~: 1342104) +OffchainAssetReceiptVaultAuthorizeTest:testAuthorizeContract(uint256,uint256,string,string) (runs: 257, μ: 1079738, ~: 1077390) +OffchainAssetReceiptVaultAuthorizeTest:testChangeAuthorizer(uint256,uint256,string,string) (runs: 257, μ: 1376452, ~: 1374104) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeAuthorized(address,address,bytes,address) (runs: 255, μ: 2034190, ~: 2034063) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,address,uint256[],uint256[]) (runs: 255, μ: 1937041, ~: 1938766) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredBurn(address,address,address,uint256[],uint256[]) (runs: 250, μ: 2047577, ~: 2049163) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredMintBurn(address,address,address,uint256[],uint256[]) (runs: 250, μ: 2047535, ~: 2049121) OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,address,address,uint256[],uint256[]) (runs: 256, μ: 1929500, ~: 1929829) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,address,uint256) (runs: 254, μ: 1865921, ~: 1865896) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredBurn(address,address,address,uint256) (runs: 253, μ: 1930696, ~: 1930696) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredMintBurn(address,address,address,uint256) (runs: 253, μ: 1930677, ~: 1930677) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,address,address,uint256) (runs: 253, μ: 1862855, ~: 1862855) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeUnauthorized(address,address,address,bytes32,bytes) (runs: 253, μ: 1866286, ~: 1866268) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,address,uint256) (runs: 255, μ: 1865930, ~: 1865896) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredBurn(address,address,address,uint256) (runs: 252, μ: 1930696, ~: 1930696) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredMintBurn(address,address,address,uint256) (runs: 252, μ: 1930677, ~: 1930677) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,address,address,uint256) (runs: 254, μ: 1862855, ~: 1862855) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeUnauthorized(address,address,address,bytes32,bytes) (runs: 255, μ: 1866286, ~: 1866268) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1Construct(address) (runs: 256, μ: 1190973, ~: 1190973) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1Initialize(address,bytes32) (runs: 255, μ: 1894380, ~: 1894380) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1InitializeZeroAdmin() (gas: 1492465) OffchainAssetReceiptVaultAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultAuthorizerV1IERC165(bytes4) (runs: 255, μ: 1194540, ~: 1194540) -OffchainAssetReceiptVaultCertifyTest:testCertify(uint256,uint256,string,string,uint256,bytes,uint256,bool) (runs: 256, μ: 1107298, ~: 1106341) -OffchainAssetReceiptVaultCertifyTest:testCertifyRevertOnZeroCertifyUntil(uint256,uint256,string,string,bytes,uint256,bool) (runs: 257, μ: 1070970, ~: 1072301) -OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrue(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1365213, ~: 1363168) -OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrueRevertDeposit(uint256,uint256,string,string,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 256, μ: 1316608, ~: 1315543) -OffchainAssetReceiptVaultCertifyTest:testVaultGetsCertified(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool) (runs: 256, μ: 1286885, ~: 1286491) -OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 993429, ~: 994253) -OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 1054190, ~: 1050864) -OffchainAssetReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 994119, ~: 995656) -OffchainAssetReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 1055340, ~: 1051652) -OffchainAssetReceiptVaultDepositTest:testDepositBasic(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1251777, ~: 1256798) -OffchainAssetReceiptVaultDepositTest:testDepositMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1103449, ~: 1099769) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1223126, ~: 1219434) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1160251, ~: 1158929) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1291168, ~: 1289441) -OffchainAssetReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,uint256,string,string,bytes,uint256) (runs: 257, μ: 1122226, ~: 1121574) -OffchainAssetReceiptVaultDepositTest:testDepositWithZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1120500, ~: 1116897) -OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1277858, ~: 1277510) -OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1278219, ~: 1278056) -OffchainAssetReceiptVaultDepositTest:testMintBasic(uint256,uint256,string,string,uint256,bytes,uint256) (runs: 256, μ: 1255371, ~: 1252822) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1212823, ~: 1209168) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1150677, ~: 1149078) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1282686, ~: 1281051) -OffchainAssetReceiptVaultDepositTest:testMintWithMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1093486, ~: 1089877) -OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1278092, ~: 1277604) -OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1279538, ~: 1279296) -OffchainAssetReceiptVaultDepositTest:testMultipleDeposit(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1357067, ~: 1354937) -OffchainAssetReceiptVaultDepositTest:testMultipleMints(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1345139, ~: 1342992) -OffchainAssetReceiptVaultDepositTest:testZeroAssetsAmount(uint256,uint256,string,string,bytes,uint256) (runs: 257, μ: 1112357, ~: 1111222) -OffchainAssetReceiptVaultDepositTest:testZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1116276, ~: 1112594) -OffchainAssetReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 257, μ: 1026888, ~: 1026884) -OffchainAssetReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 257, μ: 1000384, ~: 996292) -OffchainAssetReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1231202, ~: 1229881) -OffchainAssetReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 1247022, ~: 1247085) -OffchainAssetReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256,uint256,bytes) (runs: 139, μ: 1298088, ~: 1298115) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscate(uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 252, μ: 1542850, ~: 1540098) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscatorOwner(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[],uint256) (runs: 255, μ: 1597378, ~: 1598226) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferHandlerReceiver(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 256, μ: 1538987, ~: 1540647) +OffchainAssetReceiptVaultCertifyTest:testCertify(uint256,uint256,string,string,uint256,bytes,uint256,bool) (runs: 256, μ: 1108905, ~: 1107948) +OffchainAssetReceiptVaultCertifyTest:testCertifyRevertOnZeroCertifyUntil(uint256,uint256,string,string,bytes,uint256,bool) (runs: 257, μ: 1072577, ~: 1073908) +OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrue(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1366810, ~: 1364775) +OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrueRevertDeposit(uint256,uint256,string,string,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 256, μ: 1318234, ~: 1317150) +OffchainAssetReceiptVaultCertifyTest:testVaultGetsCertified(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool) (runs: 256, μ: 1288485, ~: 1288098) +OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 995036, ~: 995860) +OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 1055797, ~: 1052471) +OffchainAssetReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 995731, ~: 997263) +OffchainAssetReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 1056944, ~: 1053259) +OffchainAssetReceiptVaultDepositTest:testDepositBasic(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1253383, ~: 1258405) +OffchainAssetReceiptVaultDepositTest:testDepositMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1105058, ~: 1101376) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1224733, ~: 1221041) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1161870, ~: 1160536) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1292778, ~: 1291048) +OffchainAssetReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,uint256,string,string,bytes,uint256) (runs: 257, μ: 1123849, ~: 1123226) +OffchainAssetReceiptVaultDepositTest:testDepositWithZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1122108, ~: 1118504) +OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1279448, ~: 1279225) +OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1279810, ~: 1279771) +OffchainAssetReceiptVaultDepositTest:testMintBasic(uint256,uint256,string,string,uint256,bytes,uint256) (runs: 256, μ: 1256974, ~: 1254429) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1214444, ~: 1210775) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1152288, ~: 1150685) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1284288, ~: 1282658) +OffchainAssetReceiptVaultDepositTest:testMintWithMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1095090, ~: 1091484) +OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1279689, ~: 1279211) +OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1281136, ~: 1280903) +OffchainAssetReceiptVaultDepositTest:testMultipleDeposit(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1358679, ~: 1356544) +OffchainAssetReceiptVaultDepositTest:testMultipleMints(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1346741, ~: 1344599) +OffchainAssetReceiptVaultDepositTest:testZeroAssetsAmount(uint256,uint256,string,string,bytes,uint256) (runs: 257, μ: 1113969, ~: 1112829) +OffchainAssetReceiptVaultDepositTest:testZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1117887, ~: 1114212) +OffchainAssetReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 257, μ: 1028495, ~: 1028491) +OffchainAssetReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 257, μ: 1001991, ~: 997899) +OffchainAssetReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1232852, ~: 1231488) +OffchainAssetReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 1248631, ~: 1248728) +OffchainAssetReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256,uint256,bytes) (runs: 136, μ: 1299695, ~: 1299722) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscate(uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 252, μ: 1545860, ~: 1543120) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscatorOwner(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[],uint256) (runs: 255, μ: 1600362, ~: 1601245) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferHandlerReceiver(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 256, μ: 1542010, ~: 1543678) OffchainAssetReceiptVaultIERC165Test:testOffchainAssetReceiptVaultIERC165(bytes4) (runs: 256, μ: 4330822, ~: 4330822) -OffchainAssetReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 257, μ: 994006, ~: 989676) -OffchainAssetReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 257, μ: 994158, ~: 989741) -OffchainAssetReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1241669, ~: 1243777) -OffchainAssetReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1245202, ~: 1247368) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 56524, ~: 56632) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 99861, ~: 99844) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 56633, ~: 56460) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1312170, ~: 1315851) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1304856, ~: 1308312) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 246, μ: 58445, ~: 58653) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 56664, ~: 56772) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 100069, ~: 100052) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 56754, ~: 56582) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1317659, ~: 1321355) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1310369, ~: 1313839) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 246, μ: 58453, ~: 58661) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 60617, ~: 60526) +OffchainAssetReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 257, μ: 995613, ~: 991283) +OffchainAssetReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 257, μ: 995765, ~: 991348) +OffchainAssetReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1243284, ~: 1245384) +OffchainAssetReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1246798, ~: 1248975) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 56520, ~: 56607) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 99851, ~: 99844) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 56637, ~: 56460) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1312177, ~: 1315851) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1304856, ~: 1308217) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 247, μ: 58438, ~: 58653) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 56660, ~: 56747) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 100059, ~: 100052) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 56759, ~: 56582) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1317666, ~: 1321355) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1310369, ~: 1313745) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 247, μ: 58446, ~: 58661) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 60595, ~: 60526) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingEmitsEvent(uint256) (runs: 256, μ: 48138, ~: 48764) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 60954, ~: 60807) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 1123987, ~: 1117239) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 1132739, ~: 1126093) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 60975, ~: 60913) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 1123979, ~: 1117133) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 1132744, ~: 1126146) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreeze(uint256) (runs: 256, μ: 64193, ~: 64819) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 61921, ~: 61921) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 62041, ~: 62041) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableZeroProtectUntilReverts(address) (runs: 256, μ: 21636, ~: 21636) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableZeroProtectUntilRevertsTo(address) (runs: 256, μ: 21656, ~: 21656) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerIsAlice() (gas: 17863) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptConfiscateFrozen(uint256) (runs: 257, μ: 437957, ~: 445447) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptTransferFroze(uint256) (runs: 257, μ: 382143, ~: 389635) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenConfiscateFrozen(uint256) (runs: 257, μ: 395428, ~: 402918) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenDepositFrozen(uint256) (runs: 257, μ: 402986, ~: 410369) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenMintFrozen(uint256) (runs: 257, μ: 402948, ~: 410437) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedeemFrozen(uint256) (runs: 257, μ: 357249, ~: 363243) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedepositFrozen(uint256) (runs: 257, μ: 478863, ~: 486246) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferFroze(uint256) (runs: 257, μ: 362014, ~: 369504) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptConfiscateFrozen(uint256) (runs: 257, μ: 438609, ~: 445447) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptTransferFroze(uint256) (runs: 257, μ: 382795, ~: 389635) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenConfiscateFrozen(uint256) (runs: 257, μ: 396080, ~: 402918) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenDepositFrozen(uint256) (runs: 257, μ: 403644, ~: 410369) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenMintFrozen(uint256) (runs: 257, μ: 403605, ~: 410437) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedeemFrozen(uint256) (runs: 257, μ: 357775, ~: 363248) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedepositFrozen(uint256) (runs: 257, μ: 479521, ~: 486246) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferFroze(uint256) (runs: 257, μ: 362666, ~: 369504) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferNotFroze() (gas: 291104) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenWithdrawFrozen(uint256) (runs: 257, μ: 357451, ~: 363360) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenWithdrawFrozen(uint256) (runs: 257, μ: 357977, ~: 363364) OffchainAssetReceiptVaultPaymentMintAuthorizerV17201Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1StorageLocation() (gas: 661) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1Construct() (gas: 2221257) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1Initialize(address,address,uint8,uint256,bytes32) (runs: 251, μ: 3079905, ~: 3079905) @@ -175,53 +175,53 @@ OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetR OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroPaymentToken(address,address) (runs: 249, μ: 2584841, ~: 2584841) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroReceiptVault() (gas: 2583787) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroVerifyContract(address,address) (runs: 249, μ: 2523952, ~: 2523952) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMaxSharesSupplyExceeded(address,address,uint256,uint256,uint256,uint256) (runs: 77, μ: 5056147, ~: 5056188) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleMockedReceiptVault(address,address,address,uint256,uint256,uint256) (runs: 77, μ: 3830554, ~: 3830482) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleRealReceiptVault(address,address,uint256,uint256,uint256) (runs: 40, μ: 5097924, ~: 5098330) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTofuTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 77, μ: 3840424, ~: 3840338) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 77, μ: 3818515, ~: 3818682) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMaxSharesSupplyExceeded(address,address,uint256,uint256,uint256,uint256) (runs: 78, μ: 5057746, ~: 5057795) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleMockedReceiptVault(address,address,address,uint256,uint256,uint256) (runs: 76, μ: 3830564, ~: 3830482) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleRealReceiptVault(address,address,uint256,uint256,uint256) (runs: 40, μ: 5099531, ~: 5099937) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTofuTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 78, μ: 3840414, ~: 3840338) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 78, μ: 3818509, ~: 3818682) OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testZeroPaymentAmount(address,address) (runs: 40, μ: 3755963, ~: 3755963) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantDeposit(address,address,address,uint8,uint256,address) (runs: 72, μ: 3037784, ~: 3037784) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantWithdraw(address,address,address,uint8,uint256,address) (runs: 72, μ: 3037816, ~: 3037816) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 88, μ: 3112401, ~: 3115906) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 88, μ: 3109286, ~: 3112788) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 78, μ: 3042965, ~: 3042965) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 78, μ: 3039842, ~: 3039842) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 87, μ: 3109838, ~: 3112027) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 87, μ: 3106724, ~: 3108910) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 76, μ: 3042965, ~: 3042965) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 76, μ: 3039842, ~: 3039842) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeUnauthorized(address,address,address,uint8,uint256,address,address,bytes32,bytes) (runs: 28, μ: 3040482, ~: 3040481) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165(bytes4) (runs: 256, μ: 2224742, ~: 2224742) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1RolesAuthorized(address,address,address,uint8,uint256,address,bytes) (runs: 78, μ: 3141902, ~: 3141900) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1RolesAuthorized(address,address,address,uint8,uint256,address,bytes) (runs: 77, μ: 3141904, ~: 3141900) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1UnauthorizedCaller(address,address,address,uint8,uint256,address,bytes32,bytes,address) (runs: 80, μ: 3039365, ~: 3039365) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testSendPaymentToOwner(address,address,address,address) (runs: 252, μ: 3823127, ~: 3823127) -OffchainAssetReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(uint256,uint256,string,string,uint256) (runs: 257, μ: 1076303, ~: 1073847) -OffchainAssetReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(uint256,uint256,string,string,uint256) (runs: 257, μ: 1076203, ~: 1073836) -OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,uint256,uint256,string,string,uint256) (runs: 256, μ: 1078131, ~: 1075259) -OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeemNoWithdrawer(uint256,uint256,string,string,uint256) (runs: 257, μ: 996275, ~: 994147) -OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawNoRole(uint256,uint256,string,string,uint256) (runs: 257, μ: 997209, ~: 994999) -OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawWithRole(uint256,uint256,uint256,string,string,uint256) (runs: 256, μ: 1077956, ~: 1074661) -OffchainAssetReceiptVaultReceiptTest:testVaultAsset(uint256,string,string) (runs: 257, μ: 995023, ~: 990954) -OffchainAssetReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 257, μ: 992393, ~: 994988) -OffchainAssetReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 257, μ: 1182005, ~: 1178717) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testSendPaymentToOwner(address,address,address,address) (runs: 254, μ: 3823127, ~: 3823127) +OffchainAssetReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(uint256,uint256,string,string,uint256) (runs: 257, μ: 1077907, ~: 1075454) +OffchainAssetReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(uint256,uint256,string,string,uint256) (runs: 257, μ: 1077815, ~: 1075443) +OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,uint256,uint256,string,string,uint256) (runs: 256, μ: 1079749, ~: 1076866) +OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeemNoWithdrawer(uint256,uint256,string,string,uint256) (runs: 257, μ: 997882, ~: 995754) +OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawNoRole(uint256,uint256,string,string,uint256) (runs: 257, μ: 998816, ~: 996606) +OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawWithRole(uint256,uint256,uint256,string,string,uint256) (runs: 256, μ: 1079565, ~: 1076268) +OffchainAssetReceiptVaultReceiptTest:testVaultAsset(uint256,string,string) (runs: 257, μ: 996630, ~: 992561) +OffchainAssetReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 257, μ: 994000, ~: 996595) +OffchainAssetReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 257, μ: 1183612, ~: 1180324) OwnerFreezableERC7201Test:testOwnerFreezableStorageLocation() (gas: 611) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 45328, ~: 45290) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 242, μ: 83132, ~: 83128) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 45433, ~: 45247) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1049863, ~: 1052848) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1042591, ~: 1045376) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 250, μ: 48332, ~: 48000) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 45202, ~: 45164) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 242, μ: 82878, ~: 82875) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 45324, ~: 45138) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1041317, ~: 1044281) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1034025, ~: 1036787) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 250, μ: 48275, ~: 47943) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 49490, ~: 49429) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 45336, ~: 45418) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 83128, ~: 83116) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 45424, ~: 45245) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1049866, ~: 1052848) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1042584, ~: 1045187) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 248, μ: 48343, ~: 48531) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 45211, ~: 45292) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 82874, ~: 82863) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 45315, ~: 45137) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1041321, ~: 1044281) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1034017, ~: 1036598) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 248, μ: 48286, ~: 48474) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 49498, ~: 49429) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingEmitsEvent(uint256) (runs: 256, μ: 39094, ~: 39720) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 49908, ~: 49995) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 863939, ~: 858592) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 872694, ~: 867606) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 49900, ~: 49838) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 863938, ~: 858592) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 872692, ~: 867500) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreeze(uint256) (runs: 256, μ: 46090, ~: 46716) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 44350, ~: 44346) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 44250, ~: 44246) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 44350, ~: 44351) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 44250, ~: 44251) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableZeroProtectUntilReverts(address) (runs: 256, μ: 13647, ~: 13647) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableZeroProtectUntilRevertsTo(address) (runs: 256, μ: 13580, ~: 13580) OwnerFreezableTestOwnerFreezeUntil:testOwnerIsAlice() (gas: 9855) @@ -250,32 +250,32 @@ ReceiptVaultDecimalsTest:testDecimalsWithNonZeroAsset(uint8) (runs: 256, μ: 594 ReceiptVaultDecimalsTest:testDecimalsWithZeroAsset() (gas: 2661816) ReceiptVaultERC7201Test:testReceiptVaultStorageLocation() (gas: 676) ReceiptVaultIERC165Test:testReceiptVaultIERC165(bytes4) (runs: 256, μ: 2667357, ~: 2667357) -RedeemTest:testOffchainAssetWithdrawWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1402063, ~: 1403675) -RedeemTest:testRedeem(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232929, ~: 1234889) -RedeemTest:testRedeemInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258988, ~: 1261469) -RedeemTest:testRedeemOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1326585, ~: 1325156) -RedeemTest:testRedeemOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1356597, ~: 1352550) -RedeemTest:testRedeemOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 250, μ: 1504201, ~: 1503685) -RedeemTest:testRedeemRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1193162, ~: 1192473) -RedeemTest:testRedeemSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296358, ~: 1296686) -RedeemTest:testRedeemToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232861, ~: 1234821) -RedeemTest:testRedeemZeroAssetsAmount(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258942, ~: 1261545) -RedeemTest:testRedeemZeroOwner(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260581, ~: 1263582) -RedeemTest:testRedeemZeroReceiver(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258640, ~: 1261293) -RedeemTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 137, μ: 1269244, ~: 1270084) -RedepositTest:testReDeposit(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1324877, ~: 1325467) -RedepositTest:testReDepositOverSeveralIds(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1547567, ~: 1548431) -RedepositTest:testReDepositRevertsWithZeroAssets(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1293264, ~: 1288380) -RedepositTest:testReDepositToNonExistentReceipt(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 256, μ: 1293726, ~: 1292075) -RedepositTest:testReDepositToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1296870, ~: 1298897) -RedepositTest:testReDepositToSomeoneElseReverts(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1306550, ~: 1305335) -RedepositTest:testReDepositToSomeoneElseWhileCertified(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1325061, ~: 1325758) -RedepositTest:testReDepositrevertsPastTopID(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1347496, ~: 1347588) -RolesTest:testCertifyWithoutRole(uint256,string,string,uint256,bytes) (runs: 256, μ: 1023107, ~: 1022795) -RolesTest:testConfiscateReceiptWithoutRole(uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1025075, ~: 1025249) -RolesTest:testConfiscateSharesWithoutRole(uint256,string,string,uint256,bytes) (runs: 256, μ: 1023466, ~: 1023126) -RolesTest:testDepositWithoutDepositorRole(uint256,uint256,string,string,uint256,bytes) (runs: 255, μ: 1278322, ~: 1274261) -RolesTest:testGrantAdminRoles(uint256,string,string) (runs: 257, μ: 1032251, ~: 1027835) +RedeemTest:testOffchainAssetWithdrawWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1405084, ~: 1406694) +RedeemTest:testRedeem(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1234531, ~: 1237018) +RedeemTest:testRedeemInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260589, ~: 1263598) +RedeemTest:testRedeemOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1328190, ~: 1326763) +RedeemTest:testRedeemOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1358201, ~: 1354157) +RedeemTest:testRedeemOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 250, μ: 1505640, ~: 1505292) +RedeemTest:testRedeemRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1194763, ~: 1194080) +RedeemTest:testRedeemSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1297962, ~: 1298293) +RedeemTest:testRedeemToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1234463, ~: 1236950) +RedeemTest:testRedeemZeroAssetsAmount(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260542, ~: 1263152) +RedeemTest:testRedeemZeroOwner(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1262183, ~: 1265215) +RedeemTest:testRedeemZeroReceiver(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260241, ~: 1263422) +RedeemTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 128, μ: 1272378, ~: 1271691) +RedepositTest:testReDeposit(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1326493, ~: 1327074) +RedepositTest:testReDepositOverSeveralIds(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 256, μ: 1549080, ~: 1550038) +RedepositTest:testReDepositRevertsWithZeroAssets(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1294852, ~: 1289867) +RedepositTest:testReDepositToNonExistentReceipt(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 255, μ: 1295356, ~: 1293682) +RedepositTest:testReDepositToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1298481, ~: 1300504) +RedepositTest:testReDepositToSomeoneElseReverts(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1308168, ~: 1306942) +RedepositTest:testReDepositToSomeoneElseWhileCertified(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1326683, ~: 1327391) +RedepositTest:testReDepositrevertsPastTopID(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1349132, ~: 1349195) +RolesTest:testCertifyWithoutRole(uint256,string,string,uint256,bytes) (runs: 256, μ: 1024714, ~: 1024402) +RolesTest:testConfiscateReceiptWithoutRole(uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1026682, ~: 1026856) +RolesTest:testConfiscateSharesWithoutRole(uint256,string,string,uint256,bytes) (runs: 256, μ: 1025073, ~: 1024733) +RolesTest:testDepositWithoutDepositorRole(uint256,uint256,string,string,uint256,bytes) (runs: 255, μ: 1279934, ~: 1275868) +RolesTest:testGrantAdminRoles(uint256,string,string) (runs: 257, μ: 1033858, ~: 1029442) SceptreStakedFlrOracleTest:testSceptreStakedFlrOracle() (gas: 150235) SceptreStakedFlrOracleTest:testSceptreStakedFlrOracleRefund(uint128,uint128) (runs: 256, μ: 162917, ~: 162255) TwoPriceOracleTest:testNotOracle(address,address) (runs: 254, μ: 4137988, ~: 41982) @@ -284,16 +284,16 @@ TwoPriceOracleTest:testSameBaseQuote(address) (runs: 253, μ: 37371, ~: 37371) TwoPriceOracleTest:testZeroAddressBase(address) (runs: 253, μ: 4153749, ~: 41541) TwoPriceOracleTest:testZeroAddressBoth() (gas: 36561) TwoPriceOracleTest:testZeroAddressQuote(address) (runs: 253, μ: 39043, ~: 39043) -WithdrawTest:testOffchainAssetWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1600671, ~: 1600352) -WithdrawTest:testWithdraw(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1232940, ~: 1235523) -WithdrawTest:testWithdrawInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1258836, ~: 1262103) -WithdrawTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 136, μ: 1270567, ~: 1270124) -WithdrawTest:testWithdrawOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1329172, ~: 1325221) -WithdrawTest:testWithdrawOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1356917, ~: 1352966) -WithdrawTest:testWithdrawOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 253, μ: 1504588, ~: 1503848) -WithdrawTest:testWithdrawRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1312538, ~: 1311431) -WithdrawTest:testWithdrawSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1296840, ~: 1296771) -WithdrawTest:testWithdrawToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1233254, ~: 1235567) -WithdrawTest:testWithdrawZeroAssetsAmount(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1264226, ~: 1262802) -WithdrawTest:testWithdrawZeroOwner(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1266364, ~: 1264872) -WithdrawTest:testWithdrawZeroReceiver(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1264184, ~: 1262870) \ No newline at end of file +WithdrawTest:testOffchainAssetWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1603739, ~: 1603414) +WithdrawTest:testWithdraw(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1234537, ~: 1236491) +WithdrawTest:testWithdrawInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260433, ~: 1263156) +WithdrawTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 134, μ: 1272839, ~: 1271731) +WithdrawTest:testWithdrawOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1330780, ~: 1326828) +WithdrawTest:testWithdrawOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1358526, ~: 1354573) +WithdrawTest:testWithdrawOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 253, μ: 1506264, ~: 1505455) +WithdrawTest:testWithdrawRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1314145, ~: 1313038) +WithdrawTest:testWithdrawSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1298462, ~: 1298378) +WithdrawTest:testWithdrawToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1234850, ~: 1237057) +WithdrawTest:testWithdrawZeroAssetsAmount(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1265825, ~: 1264409) +WithdrawTest:testWithdrawZeroOwner(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1267955, ~: 1266479) +WithdrawTest:testWithdrawZeroReceiver(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1265775, ~: 1264477) \ No newline at end of file diff --git a/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol b/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol index 9b29279f..df78fce3 100644 --- a/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol +++ b/test/src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.deposit.t.sol @@ -14,7 +14,7 @@ import {OffchainAssetReceiptVaultPaymentMintAuthorizerV1Config} from "src/concrete/authorize/OffchainAssetReceiptVaultPaymentMintAuthorizerV1.sol"; import {DepositStateChange, DEPOSIT, CERTIFY} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; import {IERC20} from "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; -import {OffchainAssetReceiptVault} from "../../../../src/concrete/vault/OffchainAssetReceiptVault.sol"; +import {OffchainAssetReceiptVault} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; import {VerifyAlwaysApproved} from "rain.verify.interface/concrete/VerifyAlwaysApproved.sol"; import {LibFixedPointDecimalScale, FLAG_ROUND_UP} from "rain.math.fixedpoint/lib/LibFixedPointDecimalScale.sol"; import {IERC20Errors} from "openzeppelin-contracts-upgradeable/contracts/token/ERC20/ERC20Upgradeable.sol"; diff --git a/test/src/concrete/receipt/Receipt.metadata.t.sol b/test/src/concrete/receipt/Receipt.metadata.t.sol index 2dd8ce7d..e4ee05f5 100644 --- a/test/src/concrete/receipt/Receipt.metadata.t.sol +++ b/test/src/concrete/receipt/Receipt.metadata.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {ReceiptFactoryTest} from "test/abstract/ReceiptFactoryTest.sol"; import {TestReceiptManager} from "test/concrete/TestReceiptManager.sol"; -import {Receipt as ReceiptContract} from "../../../../src/concrete/receipt/Receipt.sol"; +import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; contract ReceiptMetadataTest is ReceiptFactoryTest { function testReceiptURI(uint256 id, uint8 decimalsB) external { diff --git a/test/src/concrete/receipt/Receipt.t.sol b/test/src/concrete/receipt/Receipt.t.sol index 386543f9..e331f611 100644 --- a/test/src/concrete/receipt/Receipt.t.sol +++ b/test/src/concrete/receipt/Receipt.t.sol @@ -2,11 +2,11 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {Receipt as ReceiptContract, IReceiptV3} from "../../../../src/concrete/receipt/Receipt.sol"; +import {Receipt as ReceiptContract, IReceiptV3} from "src/concrete/receipt/Receipt.sol"; import {TestReceiptManager, UnauthorizedTransfer} from "test/concrete/TestReceiptManager.sol"; import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenerator.sol"; import {ReceiptFactoryTest} from "test/abstract/ReceiptFactoryTest.sol"; -import {OnlyManager} from "../../../../src/error/ErrReceipt.sol"; +import {OnlyManager} from "src/error/ErrReceipt.sol"; import {IERC1155Errors} from "openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol"; contract ReceiptTest is ReceiptFactoryTest { diff --git a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.mint.t.sol b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.mint.t.sol index be1ecc79..6bc7866c 100644 --- a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.mint.t.sol +++ b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.mint.t.sol @@ -2,8 +2,8 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {MinShareRatio, ZeroAssetsAmount} from "../../../../src/abstract/ReceiptVault.sol"; -import {ERC20PriceOracleReceiptVault} from "../../../../src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; +import {MinShareRatio, ZeroAssetsAmount} from "src/abstract/ReceiptVault.sol"; +import {ERC20PriceOracleReceiptVault} from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; import {ERC20PriceOracleReceiptVaultTest} from "test/abstract/ERC20PriceOracleReceiptVaultTest.sol"; import { LibFixedPointDecimalArithmeticOpenZeppelin, @@ -11,8 +11,8 @@ import { } from "rain.math.fixedpoint/lib/LibFixedPointDecimalArithmeticOpenZeppelin.sol"; import {IERC20} from "forge-std/interfaces/IERC20.sol"; import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenerator.sol"; -import {IReceiptV3} from "../../../../src/concrete/receipt/Receipt.sol"; -import {IReceiptVaultV1} from "../../../../src/interface/IReceiptVaultV3.sol"; +import {IReceiptV3} from "src/concrete/receipt/Receipt.sol"; +import {IReceiptVaultV1} from "src/interface/IReceiptVaultV3.sol"; contract ERC20PriceOracleReceiptVaultMintTest is ERC20PriceOracleReceiptVaultTest { using LibFixedPointDecimalArithmeticOpenZeppelin for uint256; diff --git a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.redeem.t.sol b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.redeem.t.sol index 6376dd53..73a6f6d5 100644 --- a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.redeem.t.sol +++ b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.redeem.t.sol @@ -2,16 +2,16 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {ERC20PriceOracleReceiptVault} from "../../../../src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; +import {ERC20PriceOracleReceiptVault} from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; import {ERC20PriceOracleReceiptVaultTest} from "test/abstract/ERC20PriceOracleReceiptVaultTest.sol"; import { LibFixedPointDecimalArithmeticOpenZeppelin, Math } from "rain.math.fixedpoint/lib/LibFixedPointDecimalArithmeticOpenZeppelin.sol"; import {IERC20} from "forge-std/interfaces/IERC20.sol"; -import {Receipt as ReceiptContract} from "../../../../src/concrete/receipt/Receipt.sol"; -import {ZeroAssetsAmount, ZeroReceiver, ZeroOwner} from "../../../../src/abstract/ReceiptVault.sol"; -import {IReceiptVaultV1} from "../../../../src/interface/IReceiptVaultV3.sol"; +import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; +import {ZeroAssetsAmount, ZeroReceiver, ZeroOwner} from "src/abstract/ReceiptVault.sol"; +import {IReceiptVaultV1} from "src/interface/IReceiptVaultV3.sol"; import {SFLR_CONTRACT} from "rain.flare/lib/sflr/LibSceptreStakedFlare.sol"; import {LibERC20PriceOracleReceiptVaultFork} from "../../../lib/LibERC20PriceOracleReceiptVaultFork.sol"; import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenerator.sol"; diff --git a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.withdraw.t.sol b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.withdraw.t.sol index 0a9d57cb..07676f58 100644 --- a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.withdraw.t.sol +++ b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.withdraw.t.sol @@ -2,16 +2,16 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {ERC20PriceOracleReceiptVault} from "../../../../src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; +import {ERC20PriceOracleReceiptVault} from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; import {ERC20PriceOracleReceiptVaultTest} from "test/abstract/ERC20PriceOracleReceiptVaultTest.sol"; import { LibFixedPointDecimalArithmeticOpenZeppelin, Math } from "rain.math.fixedpoint/lib/LibFixedPointDecimalArithmeticOpenZeppelin.sol"; import {IERC20} from "forge-std/interfaces/IERC20.sol"; -import {Receipt as ReceiptContract} from "../../../../src/concrete/receipt/Receipt.sol"; -import {ZeroAssetsAmount, ZeroReceiver, ZeroOwner} from "../../../../src/abstract/ReceiptVault.sol"; -import {IReceiptVaultV1} from "../../../../src/interface/IReceiptVaultV3.sol"; +import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; +import {ZeroAssetsAmount, ZeroReceiver, ZeroOwner} from "src/abstract/ReceiptVault.sol"; +import {IReceiptVaultV1} from "src/interface/IReceiptVaultV3.sol"; import {SFLR_CONTRACT} from "rain.flare/lib/sflr/LibSceptreStakedFlare.sol"; import {LibERC20PriceOracleReceiptVaultFork} from "../../../lib/LibERC20PriceOracleReceiptVaultFork.sol"; import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenerator.sol"; diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.confiscateReceipt.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.confiscateReceipt.t.sol index 2c0c8cdf..c5c974f8 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.confiscateReceipt.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.confiscateReceipt.t.sol @@ -7,12 +7,11 @@ import { CONFISCATE_RECEIPT, DEPOSIT, CERTIFY -} from "../../../../src/concrete/vault/OffchainAssetReceiptVault.sol"; +} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; import {OffchainAssetReceiptVaultTest, Vm} from "test/abstract/OffchainAssetReceiptVaultTest.sol"; -import {Receipt as ReceiptContract} from "../../../../src/concrete/receipt/Receipt.sol"; +import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenerator.sol"; -import {OffchainAssetReceiptVaultAuthorizerV1} from - "../../../../src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; +import {OffchainAssetReceiptVaultAuthorizerV1} from "src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; import {Math} from "openzeppelin-contracts/contracts/utils/math/Math.sol"; contract ConfiscateReceiptTest is OffchainAssetReceiptVaultTest { diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.handler.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.handler.t.sol index 71c65366..6fb86746 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.handler.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.handler.t.sol @@ -7,13 +7,13 @@ import { DEPOSIT, CERTIFY, CONFISCATE_RECEIPT -} from "../../../../src/concrete/vault/OffchainAssetReceiptVault.sol"; +} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; import {OffchainAssetReceiptVaultTest, Vm} from "test/abstract/OffchainAssetReceiptVaultTest.sol"; -import {Receipt as ReceiptContract} from "../../../../src/concrete/receipt/Receipt.sol"; +import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; import { OffchainAssetReceiptVaultAuthorizerV1, CertificationExpired -} from "../../../../src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; +} from "src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; import {LibUniqueAddressesGenerator} from "../../../lib/LibUniqueAddressesGenerator.sol"; import {IERC1155Errors} from "openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol"; diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol index 6400bc3c..d7e3ac07 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol @@ -7,14 +7,14 @@ import { OwnerFreezableOwnerFreezeUntilTest, IOwnerFreezableV1 } from "test/abstract/OwnerFreezableOwnerFreezeUntilTest.sol"; import {OffchainAssetReceiptVault} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; -import {IReceiptV3} from "../../../../src/concrete/receipt/Receipt.sol"; +import {IReceiptV3} from "src/concrete/receipt/Receipt.sol"; import { CERTIFY, DEPOSIT, WITHDRAW, CONFISCATE_SHARES, CONFISCATE_RECEIPT -} from "../../../../src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; +} from "src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; import {IAccessControl} from "openzeppelin-contracts/contracts/access/IAccessControl.sol"; contract OffchainAssetReceiptVaultOwnerFreezeUntilTest is OwnerFreezableOwnerFreezeUntilTest { From 9978d7ab6d99c0ed8aa69b57057edf69423004a2 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 18:21:45 +0400 Subject: [PATCH 16/26] error for zero beacon owner --- .../deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol | 3 +++ src/error/ErrDeployer.sol | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol index 2eeb7f3f..e37ee4ae 100644 --- a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -10,6 +10,7 @@ import {BeaconProxy} from "openzeppelin-contracts/contracts/proxy/beacon/BeaconP import { ZeroReceiptImplementation, ZeroVaultImplementation, + ZeroBeaconOwner, InitializeNonZeroReceipt, InitializeReceiptFailed, InitializeVaultFailed @@ -48,6 +49,8 @@ contract OffchainAssetReceiptVaultBeaconSetDeployer { revert InitializeNonZeroReceipt(config.receiptVaultConfig.receipt); } + if (config.initialAdmin == address(0)) revert ZeroBeaconOwner(); + Receipt receipt = Receipt(address(new BeaconProxy(address(I_RECEIPT_BEACON), ""))); OffchainAssetReceiptVault offchainAssetReceiptVault = OffchainAssetReceiptVault( payable(address(new BeaconProxy(address(I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON), ""))) diff --git a/src/error/ErrDeployer.sol b/src/error/ErrDeployer.sol index 0365af7f..c4784637 100644 --- a/src/error/ErrDeployer.sol +++ b/src/error/ErrDeployer.sol @@ -9,6 +9,9 @@ error ZeroReceiptImplementation(); /// Thrown when constructing a deployer with a zero vault implementation address. error ZeroVaultImplementation(); +/// Thrown when the beacon owner is set to the zero address. +error ZeroBeaconOwner(); + /// Thrown when attempting to initialize with a non-zero receipt address. /// @param receipt The receipt address that is not zero in the initialization /// config. From fecae323e5966ba3942b4c023e504f2fd7a190f4 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 18:28:52 +0400 Subject: [PATCH 17/26] lint --- test/abstract/ERC20PriceOracleReceiptVaultTest.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol index 9baa0f1f..b52749fd 100644 --- a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol +++ b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol @@ -63,7 +63,7 @@ contract ERC20PriceOracleReceiptVaultTest is Test { function getReceipt() internal view returns (ReceiptContract) { Vm.Log[] memory logs = vm.getRecordedLogs(); - // Find the ERC20PriceOracleReceiptVaultInitialized event log + // Find the event log address receiptAddress = address(0); bool eventFound = false; // Flag to indicate whether the event log was found for (uint256 i = 0; i < logs.length; i++) { @@ -77,7 +77,7 @@ contract ERC20PriceOracleReceiptVaultTest is Test { } } // Assert that the event log was found - assertTrue(eventFound, "ERC20PriceOracleReceiptVaultInitialized event log not found"); + assertTrue(eventFound, "ERC20PriceOracleReceiptVaultInitializedV2 event log not found"); // Return an receipt contract return ReceiptContract(receiptAddress); } From b0bbef5bc5099f9325d399cf2b4a897aec80c2f1 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 18:30:09 +0400 Subject: [PATCH 18/26] lint --- .../deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol index e37ee4ae..76c3d113 100644 --- a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -23,7 +23,7 @@ struct OffchainAssetReceiptVaultBeaconSetDeployerConfig { } contract OffchainAssetReceiptVaultBeaconSetDeployer { - event Deployment(address sender, address receiptBeacon, address offchainAssetReceiptVaultBeacon); + event Deployment(address sender, address receipt, address offchainAssetReceiptVault); IBeacon public immutable I_RECEIPT_BEACON; IBeacon public immutable I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON; From 36a63ee653663c53c912b71d02f99f8856a3f466 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 18:31:45 +0400 Subject: [PATCH 19/26] lint --- .../concrete/vault/OffchainAssetReceiptVault.initialize.t.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol index c26705ee..7b6a0d94 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol @@ -8,7 +8,6 @@ import { import { OffchainAssetReceiptVault, OffchainAssetReceiptVaultConfigV2, - OffchainAssetReceiptVaultConfigV2, ZeroInitialAdmin, NonZeroAsset } from "src/concrete/vault/OffchainAssetReceiptVault.sol"; From 84fc44017c1611bc2b2273b8ba4712fc92fefa6a Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 15 Dec 2025 18:34:19 +0400 Subject: [PATCH 20/26] lint errors --- .../deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol | 6 +++++- src/error/ErrDeployer.sol | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol index 76c3d113..a610817b 100644 --- a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -11,6 +11,7 @@ import { ZeroReceiptImplementation, ZeroVaultImplementation, ZeroBeaconOwner, + ZeroInitialAdmin, InitializeNonZeroReceipt, InitializeReceiptFailed, InitializeVaultFailed @@ -35,6 +36,9 @@ contract OffchainAssetReceiptVaultBeaconSetDeployer { if (address(config.initialOffchainAssetReceiptVaultImplementation) == address(0)) { revert ZeroVaultImplementation(); } + if (config.initialOwner == address(0)) { + revert ZeroBeaconOwner(); + } I_RECEIPT_BEACON = new UpgradeableBeacon(address(config.initialReceiptImplementation), config.initialOwner); I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON = @@ -49,7 +53,7 @@ contract OffchainAssetReceiptVaultBeaconSetDeployer { revert InitializeNonZeroReceipt(config.receiptVaultConfig.receipt); } - if (config.initialAdmin == address(0)) revert ZeroBeaconOwner(); + if (config.initialAdmin == address(0)) revert ZeroInitialAdmin(); Receipt receipt = Receipt(address(new BeaconProxy(address(I_RECEIPT_BEACON), ""))); OffchainAssetReceiptVault offchainAssetReceiptVault = OffchainAssetReceiptVault( diff --git a/src/error/ErrDeployer.sol b/src/error/ErrDeployer.sol index c4784637..04dcacf3 100644 --- a/src/error/ErrDeployer.sol +++ b/src/error/ErrDeployer.sol @@ -12,6 +12,9 @@ error ZeroVaultImplementation(); /// Thrown when the beacon owner is set to the zero address. error ZeroBeaconOwner(); +/// Thrown when the initial admin is the zero address. +error ZeroInitialAdmin(); + /// Thrown when attempting to initialize with a non-zero receipt address. /// @param receipt The receipt address that is not zero in the initialization /// config. From e90fa1f09d7993ab5dfcad970cd51e4f762d5eac Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Tue, 16 Dec 2025 21:13:54 +0400 Subject: [PATCH 21/26] construct tests for proxy deploys --- ...hainAssetReceiptVaultBeaconSetDeployer.sol | 4 +- .../OffchainAssetReceiptVaultTest.sol | 4 +- ...eReceiptVaultCloneDeployer.construct.t.sol | 54 ++++++++++++ ...eiptVaultBeaconSetDeployer.construct.t.sol | 83 +++++++++++++++++++ 4 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.construct.t.sol create mode 100644 test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.construct.t.sol diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol index a610817b..b06502af 100644 --- a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -19,8 +19,8 @@ import { struct OffchainAssetReceiptVaultBeaconSetDeployerConfig { address initialOwner; - Receipt initialReceiptImplementation; - OffchainAssetReceiptVault initialOffchainAssetReceiptVaultImplementation; + address initialReceiptImplementation; + address initialOffchainAssetReceiptVaultImplementation; } contract OffchainAssetReceiptVaultBeaconSetDeployer { diff --git a/test/abstract/OffchainAssetReceiptVaultTest.sol b/test/abstract/OffchainAssetReceiptVaultTest.sol index 8392420b..61e3a5ab 100644 --- a/test/abstract/OffchainAssetReceiptVaultTest.sol +++ b/test/abstract/OffchainAssetReceiptVaultTest.sol @@ -32,8 +32,8 @@ contract OffchainAssetReceiptVaultTest is Test { I_DEPLOYER = new OffchainAssetReceiptVaultBeaconSetDeployer( OffchainAssetReceiptVaultBeaconSetDeployerConfig({ initialOwner: address(this), - initialReceiptImplementation: I_RECEIPT_IMPLEMENTATION, - initialOffchainAssetReceiptVaultImplementation: I_IMPLEMENTATION + initialReceiptImplementation: address(I_RECEIPT_IMPLEMENTATION), + initialOffchainAssetReceiptVaultImplementation: address(I_IMPLEMENTATION) }) ); } diff --git a/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.construct.t.sol b/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.construct.t.sol new file mode 100644 index 00000000..640d1e3b --- /dev/null +++ b/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.construct.t.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Test} from "forge-std/Test.sol"; + +import { + ERC20PriceOracleReceiptVaultCloneDeployer, + ERC20PriceOracleReceiptVaultCloneDeployerConfig +} from "src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol"; +import {ZeroReceiptImplementation, ZeroVaultImplementation} from "src/error/ErrDeployer.sol"; + +contract ERC20PriceOracleReceiptVaultCloneDeployerConstructTest is Test { + function testERC20PriceOracleReceiptVaultCloneDeployerConstructZeroReceiptImplementation( + address erc20PriceOracleReceiptVaultImplementation + ) external { + vm.assume(erc20PriceOracleReceiptVaultImplementation != address(0)); + vm.expectRevert(abi.encodeWithSelector(ZeroReceiptImplementation.selector)); + new ERC20PriceOracleReceiptVaultCloneDeployer( + ERC20PriceOracleReceiptVaultCloneDeployerConfig({ + receiptImplementation: address(0), + erc20PriceOracleReceiptVaultImplementation: erc20PriceOracleReceiptVaultImplementation + }) + ); + } + + function testERC20PriceOracleReceiptVaultCloneDeployerConstructZeroVaultImplementation( + address receiptImplementation + ) external { + vm.assume(receiptImplementation != address(0)); + vm.expectRevert(abi.encodeWithSelector(ZeroVaultImplementation.selector)); + new ERC20PriceOracleReceiptVaultCloneDeployer( + ERC20PriceOracleReceiptVaultCloneDeployerConfig({ + receiptImplementation: receiptImplementation, + erc20PriceOracleReceiptVaultImplementation: address(0) + }) + ); + } + + function testERC20PriceOracleReceiptVaultCloneDeployerConstruct( + ERC20PriceOracleReceiptVaultCloneDeployerConfig memory config + ) external { + vm.assume(config.receiptImplementation != address(0)); + vm.assume(config.erc20PriceOracleReceiptVaultImplementation != address(0)); + + ERC20PriceOracleReceiptVaultCloneDeployer deployer = new ERC20PriceOracleReceiptVaultCloneDeployer(config); + + vm.assertEq(deployer.I_RECEIPT_IMPLEMENTATION(), config.receiptImplementation); + vm.assertEq( + deployer.I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION(), + config.erc20PriceOracleReceiptVaultImplementation + ); + } +} diff --git a/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.construct.t.sol b/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.construct.t.sol new file mode 100644 index 00000000..b061b7ba --- /dev/null +++ b/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.construct.t.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Test} from "forge-std/Test.sol"; + +import { + OffchainAssetReceiptVaultBeaconSetDeployer, + OffchainAssetReceiptVaultBeaconSetDeployerConfig +} from "src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol"; +import {ZeroReceiptImplementation, ZeroVaultImplementation, ZeroBeaconOwner} from "src/error/ErrDeployer.sol"; +import {OffchainAssetReceiptVault} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; +import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; + +contract OffchainAssetReceiptVaultBeaconSetDeployerConstructTest is Test { + function testOffchainAssetReceiptVaultBeaconSetDeployerConstructZeroReceiptImplementation( + address initialOffchainAssetReceiptVaultImplementation, + address initialOwner + ) external { + vm.assume(initialOffchainAssetReceiptVaultImplementation != address(0)); + vm.assume(initialOwner != address(0)); + vm.expectRevert(abi.encodeWithSelector(ZeroReceiptImplementation.selector)); + new OffchainAssetReceiptVaultBeaconSetDeployer( + OffchainAssetReceiptVaultBeaconSetDeployerConfig({ + initialOwner: initialOwner, + initialReceiptImplementation: address(0), + initialOffchainAssetReceiptVaultImplementation: initialOffchainAssetReceiptVaultImplementation + }) + ); + } + + function testOffchainAssetReceiptVaultBeaconSetDeployerConstructZeroVaultImplementation( + address initialReceiptImplementation, + address initialOwner + ) external { + vm.assume(initialReceiptImplementation != address(0)); + vm.assume(initialOwner != address(0)); + vm.expectRevert(abi.encodeWithSelector(ZeroVaultImplementation.selector)); + new OffchainAssetReceiptVaultBeaconSetDeployer( + OffchainAssetReceiptVaultBeaconSetDeployerConfig({ + initialOwner: initialOwner, + initialReceiptImplementation: initialReceiptImplementation, + initialOffchainAssetReceiptVaultImplementation: address(0) + }) + ); + } + + function testOffchainAssetReceiptVaultBeaconSetDeployerConstructZeroBeaconOwner( + address initialReceiptImplementation, + address initialOffchainAssetReceiptVaultImplementation + ) external { + vm.assume(initialReceiptImplementation != address(0)); + vm.assume(initialOffchainAssetReceiptVaultImplementation != address(0)); + vm.expectRevert(abi.encodeWithSelector(ZeroBeaconOwner.selector)); + new OffchainAssetReceiptVaultBeaconSetDeployer( + OffchainAssetReceiptVaultBeaconSetDeployerConfig({ + initialOwner: address(0), + initialReceiptImplementation: initialReceiptImplementation, + initialOffchainAssetReceiptVaultImplementation: initialOffchainAssetReceiptVaultImplementation + }) + ); + } + + function testOffchainAssetReceiptVaultBeaconSetDeployerConstructSuccess(address initialOwner) external { + vm.assume(initialOwner != address(0)); + ReceiptContract initialReceiptImplementation = new ReceiptContract(); + OffchainAssetReceiptVault initialOffchainAssetReceiptVaultImplementation = new OffchainAssetReceiptVault(); + + OffchainAssetReceiptVaultBeaconSetDeployer deployer = new OffchainAssetReceiptVaultBeaconSetDeployer( + OffchainAssetReceiptVaultBeaconSetDeployerConfig({ + initialOwner: initialOwner, + initialReceiptImplementation: address(initialReceiptImplementation), + initialOffchainAssetReceiptVaultImplementation: address(initialOffchainAssetReceiptVaultImplementation) + }) + ); + + vm.assertEq(address(deployer.I_RECEIPT_BEACON().implementation()), address(initialReceiptImplementation)); + vm.assertEq( + address(deployer.I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON().implementation()), + address(initialOffchainAssetReceiptVaultImplementation) + ); + } +} From d7763b4d29116dca1a5ae8114cd5756cc239cbcc Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Tue, 16 Dec 2025 21:56:12 +0400 Subject: [PATCH 22/26] new vault test --- ...20PriceOracleReceiptVaultCloneDeployer.sol | 4 +- ...hainAssetReceiptVaultBeaconSetDeployer.sol | 4 +- ...oyer.newERC20PriceOracleReceiptVault.t.sol | 76 +++++++++++++++++++ 3 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newERC20PriceOracleReceiptVault.t.sol diff --git a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol index 1f65fbb9..b5b21da8 100644 --- a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol +++ b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol @@ -23,7 +23,7 @@ struct ERC20PriceOracleReceiptVaultCloneDeployerConfig { } contract ERC20PriceOracleReceiptVaultCloneDeployer { - event Deployment(address sender, address receipt, address erc20PriceOracleReceiptVault); + event Deployment(address sender, address erc20PriceOracleReceiptVault, address receipt); address public immutable I_RECEIPT_IMPLEMENTATION; address public immutable I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION; @@ -56,7 +56,7 @@ contract ERC20PriceOracleReceiptVaultCloneDeployer { revert InitializeVaultFailed(); } - emit Deployment(msg.sender, address(receipt), address(erc20PriceOracleReceiptVault)); + emit Deployment(msg.sender, address(erc20PriceOracleReceiptVault), address(receipt)); return erc20PriceOracleReceiptVault; } diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol index b06502af..a5117ee9 100644 --- a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -24,7 +24,7 @@ struct OffchainAssetReceiptVaultBeaconSetDeployerConfig { } contract OffchainAssetReceiptVaultBeaconSetDeployer { - event Deployment(address sender, address receipt, address offchainAssetReceiptVault); + event Deployment(address sender, address offchainAssetReceiptVault, address receipt); IBeacon public immutable I_RECEIPT_BEACON; IBeacon public immutable I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON; @@ -69,7 +69,7 @@ contract OffchainAssetReceiptVaultBeaconSetDeployer { revert InitializeVaultFailed(); } - emit Deployment(msg.sender, address(receipt), address(offchainAssetReceiptVault)); + emit Deployment(msg.sender, address(offchainAssetReceiptVault), address(receipt)); return offchainAssetReceiptVault; } diff --git a/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newERC20PriceOracleReceiptVault.t.sol b/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newERC20PriceOracleReceiptVault.t.sol new file mode 100644 index 00000000..6c069fe7 --- /dev/null +++ b/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newERC20PriceOracleReceiptVault.t.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Test} from "forge-std/Test.sol"; + +import { + OffchainAssetReceiptVaultBeaconSetDeployer, + OffchainAssetReceiptVaultBeaconSetDeployerConfig, + OffchainAssetReceiptVaultConfigV2 +} from "src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol"; +import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; +import {OffchainAssetReceiptVault, ReceiptVaultConfigV2} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; +import {InitializeNonZeroReceipt, ZeroInitialAdmin} from "src/error/ErrDeployer.sol"; + +contract OffchainAssetReceiptVaultBeaconSetDeployerNewERC20PriceOracleReceiptVaultTest is Test { + function testNewOffchainAssetReceiptVaultNonZeroReceipt(OffchainAssetReceiptVaultConfigV2 memory config) external { + vm.assume(config.receiptVaultConfig.receipt != address(0)); + vm.assume(config.initialAdmin != address(0)); + + ReceiptContract receiptImplementation = new ReceiptContract(); + OffchainAssetReceiptVault offchainAssetReceiptVaultImplementation = new OffchainAssetReceiptVault(); + OffchainAssetReceiptVaultBeaconSetDeployer deployer = new OffchainAssetReceiptVaultBeaconSetDeployer( + OffchainAssetReceiptVaultBeaconSetDeployerConfig({ + initialOwner: address(this), + initialReceiptImplementation: address(receiptImplementation), + initialOffchainAssetReceiptVaultImplementation: address(offchainAssetReceiptVaultImplementation) + }) + ); + vm.expectRevert(abi.encodeWithSelector(InitializeNonZeroReceipt.selector, config.receiptVaultConfig.receipt)); + deployer.newOffchainAssetReceiptVault(config); + } + + function testNewOffchainAssetReceiptVaultZeroInitialAdmin(OffchainAssetReceiptVaultConfigV2 memory config) + external + { + vm.assume(config.receiptVaultConfig.receipt == address(0)); + vm.assume(config.initialAdmin == address(0)); + + ReceiptContract receiptImplementation = new ReceiptContract(); + OffchainAssetReceiptVault offchainAssetReceiptVaultImplementation = new OffchainAssetReceiptVault(); + OffchainAssetReceiptVaultBeaconSetDeployer deployer = new OffchainAssetReceiptVaultBeaconSetDeployer( + OffchainAssetReceiptVaultBeaconSetDeployerConfig({ + initialOwner: address(this), + initialReceiptImplementation: address(receiptImplementation), + initialOffchainAssetReceiptVaultImplementation: address(offchainAssetReceiptVaultImplementation) + }) + ); + vm.expectRevert(abi.encodeWithSelector(ZeroInitialAdmin.selector)); + deployer.newOffchainAssetReceiptVault(config); + } + + function testNewOffchainAssetReceiptVault(OffchainAssetReceiptVaultConfigV2 memory config) external { + vm.assume(config.receiptVaultConfig.receipt == address(0)); + vm.assume(config.initialAdmin != address(0)); + vm.assume(config.receiptVaultConfig.asset == address(0)); + + ReceiptContract receiptImplementation = new ReceiptContract(); + OffchainAssetReceiptVault offchainAssetReceiptVaultImplementation = new OffchainAssetReceiptVault(); + OffchainAssetReceiptVaultBeaconSetDeployer deployer = new OffchainAssetReceiptVaultBeaconSetDeployer( + OffchainAssetReceiptVaultBeaconSetDeployerConfig({ + initialOwner: address(this), + initialReceiptImplementation: address(receiptImplementation), + initialOffchainAssetReceiptVaultImplementation: address(offchainAssetReceiptVaultImplementation) + }) + ); + + // expectEmit + OffchainAssetReceiptVault offchainAssetReceiptVault = deployer.newOffchainAssetReceiptVault(config); + + assertEq( + address(OffchainAssetReceiptVault(payable(offchainAssetReceiptVault)).receipt().manager()), + address(offchainAssetReceiptVault) + ); + } +} From 8ef04640cfceea400e89b83fe461fd30452bd26a Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Tue, 16 Dec 2025 22:16:00 +0400 Subject: [PATCH 23/26] tests --- .gas-snapshot | 444 +++++++++--------- ...oyer.newERC20PriceOracleReceiptVault.t.sol | 51 ++ ...ployer.newOffchainAssetReceiptVault.t.sol} | 2 +- 3 files changed, 280 insertions(+), 217 deletions(-) create mode 100644 test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.newERC20PriceOracleReceiptVault.t.sol rename test/src/concrete/deploy/{OffchainAssetReceiptVaultBeaconSetDeployer.newERC20PriceOracleReceiptVault.t.sol => OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.t.sol} (97%) diff --git a/.gas-snapshot b/.gas-snapshot index 08900262..d2370fc0 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,7 +1,7 @@ -ConfiscateReceiptTest:testConfiscateReceiptBasic(uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 252, μ: 1404979, ~: 1413280) -ConfiscateReceiptTest:testConfiscateReceiptOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256) (runs: 255, μ: 1156864, ~: 1157415) -ConfiscateSharesTest:testConfiscateSharesBasic(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 253, μ: 1351593, ~: 1358886) -ConfiscateSharesTest:testConfiscateSharesOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256,uint256) (runs: 254, μ: 1268071, ~: 1270145) +ConfiscateReceiptTest:testConfiscateReceiptBasic(uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 251, μ: 1404721, ~: 1413306) +ConfiscateReceiptTest:testConfiscateReceiptOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256) (runs: 254, μ: 1156888, ~: 1157441) +ConfiscateSharesTest:testConfiscateSharesBasic(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool,uint256) (runs: 252, μ: 1351757, ~: 1358912) +ConfiscateSharesTest:testConfiscateSharesOnZeroBalance(uint256,uint256,string,string,bytes,uint256,uint256,uint256) (runs: 253, μ: 1268095, ~: 1270171) ERC20PriceOracleReceiptMetadataTest:testOverriddenMetadataWithImage(uint256,string,string,string,string,string,string,uint8) (runs: 242, μ: 3134470, ~: 3135563) ERC20PriceOracleReceiptMetadataTest:testOverriddenMetadataWithoutImage(uint256,string,string,string,string,string,uint8) (runs: 254, μ: 3063586, ~: 3069077) ERC20PriceOracleReceiptMetadataTest:testReceiptName() (gas: 770273) @@ -9,164 +9,176 @@ ERC20PriceOracleReceiptMetadataTest:testReceiptSymbol() (gas: 770295) ERC20PriceOracleReceiptMetadataTest:testReceiptURI(uint256) (runs: 248, μ: 822451, ~: 822688) ERC20PriceOracleReceiptMetadataTest:testReceiptURIZeroError() (gas: 769391) ERC20PriceOracleReceiptVault7201Test:testERC20PriceOracleReceiptVault7201StorageLocation() (gas: 671) -ERC20PriceOracleReceiptVaultAssetTest:testVaultAsset(string,string) (runs: 257, μ: 338295, ~: 337919) -ERC20PriceOracleReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 607876, ~: 608847) -ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 397448, ~: 398287) -ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 457090, ~: 453843) -ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 397787, ~: 399133) -ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 457368, ~: 453684) -ERC20PriceOracleReceiptVaultDepositTest:testDepositBasic(uint256,string,string,uint256,uint256,bytes) (runs: 257, μ: 527740, ~: 527166) -ERC20PriceOracleReceiptVaultDepositTest:testDepositMinShareRatio(uint256,string,string,bytes,uint256,uint256,uint256) (runs: 257, μ: 474173, ~: 471505) -ERC20PriceOracleReceiptVaultDepositTest:testDepositSomeoneElse(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 580971, ~: 583603) -ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,string,string,bytes,uint256,uint256) (runs: 257, μ: 491338, ~: 491840) -ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroReceiver(string,string,bytes,uint256,uint256,uint256) (runs: 257, μ: 384817, ~: 385477) -ERC20PriceOracleReceiptVaultDepositTest:testMultipleDeposits(uint256,string,string,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 257, μ: 996088, ~: 993246) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 257, μ: 428778, ~: 428774) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 257, μ: 404376, ~: 400282) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256) (runs: 257, μ: 511265, ~: 512596) -ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256) (runs: 257, μ: 525823, ~: 525625) +ERC20PriceOracleReceiptVaultAssetTest:testVaultAsset(string,string) (runs: 256, μ: 338471, ~: 337919) +ERC20PriceOracleReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 607990, ~: 608847) +ERC20PriceOracleReceiptVaultCloneDeployerConstructTest:testERC20PriceOracleReceiptVaultCloneDeployerConstruct((address,address)) (runs: 246, μ: 467748, ~: 467748) +ERC20PriceOracleReceiptVaultCloneDeployerConstructTest:testERC20PriceOracleReceiptVaultCloneDeployerConstructZeroReceiptImplementation(address) (runs: 254, μ: 37221, ~: 37221) +ERC20PriceOracleReceiptVaultCloneDeployerConstructTest:testERC20PriceOracleReceiptVaultCloneDeployerConstructZeroVaultImplementation(address) (runs: 254, μ: 37221, ~: 37221) +ERC20PriceOracleReceiptVaultCloneDeployerNewERC20PriceOracleReceiptVaultTest:testNewERC20PriceOracleReceiptVaultNonZeroReceipt((address,(address,string,string,address))) (runs: 256, μ: 5587754, ~: 5587754) +ERC20PriceOracleReceiptVaultCloneDeployerNewERC20PriceOracleReceiptVaultTest:testNewERC20PriceOracleReceiptVaultSuccess((address,(address,string,string,address))) (runs: 0, μ: 0, ~: 0) +ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 397182, ~: 398287) +ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 457014, ~: 453843) +ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 397694, ~: 399131) +ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 457382, ~: 453684) +ERC20PriceOracleReceiptVaultDepositTest:testDepositBasic(uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 527568, ~: 527166) +ERC20PriceOracleReceiptVaultDepositTest:testDepositMinShareRatio(uint256,string,string,bytes,uint256,uint256,uint256) (runs: 256, μ: 474181, ~: 471505) +ERC20PriceOracleReceiptVaultDepositTest:testDepositSomeoneElse(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 254, μ: 580962, ~: 583604) +ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,string,string,bytes,uint256,uint256) (runs: 256, μ: 491073, ~: 491840) +ERC20PriceOracleReceiptVaultDepositTest:testDepositWithZeroReceiver(string,string,bytes,uint256,uint256,uint256) (runs: 256, μ: 384811, ~: 385417) +ERC20PriceOracleReceiptVaultDepositTest:testMultipleDeposits(uint256,string,string,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 256, μ: 996458, ~: 993303) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 256, μ: 428778, ~: 428774) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 256, μ: 404568, ~: 400282) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256) (runs: 256, μ: 511431, ~: 512596) +ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256) (runs: 256, μ: 525824, ~: 525625) ERC20PriceOracleReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256) (runs: 180, μ: 574034, ~: 573625) -ERC20PriceOracleReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 257, μ: 782516, ~: 783581) -ERC20PriceOracleReceiptVaultInitializeTest:testERC20PriceOracleReceiptVaultInitializedV2Event(uint256,string,string) (runs: 257, μ: 414896, ~: 410451) -ERC20PriceOracleReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 257, μ: 396928, ~: 392684) -ERC20PriceOracleReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 257, μ: 396819, ~: 392749) -ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 157, μ: 579112, ~: 579702) -ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 158, μ: 584246, ~: 584351) -ERC20PriceOracleReceiptVaultMintTest:testMintBasic(string,string,uint256,uint256,bytes) (runs: 257, μ: 475865, ~: 474843) -ERC20PriceOracleReceiptVaultMintTest:testMintSomeoneElse(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 586324, ~: 582180) -ERC20PriceOracleReceiptVaultMintTest:testMintWithMinShareRatio(string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 364260, ~: 363799) -ERC20PriceOracleReceiptVaultMintTest:testMintWithZeroShares(string,string,uint256,uint256,bytes) (runs: 257, μ: 387132, ~: 386777) -ERC20PriceOracleReceiptVaultMintTest:testMultipleMints(string,string,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 257, μ: 541399, ~: 540883) -ERC20PriceOracleReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(string,string,uint256,uint256) (runs: 257, μ: 352019, ~: 349756) -ERC20PriceOracleReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(string,string,uint256,uint256) (runs: 257, μ: 352220, ~: 350129) -ERC20PriceOracleReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,string,string,uint256,uint256) (runs: 245, μ: 400513, ~: 401174) -ERC20PriceOracleReceiptVaultPreviewWithdrawTest:testPreviewWithdraw(uint256,string,string,uint256,uint256) (runs: 257, μ: 400212, ~: 401268) -ERC20PriceOracleReceiptVaultReceiptTest:testVaultAsset(string,string) (runs: 257, μ: 339245, ~: 338774) -ERC20PriceOracleReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 257, μ: 395470, ~: 398063) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemBasic(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 546902, ~: 548118) +ERC20PriceOracleReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 256, μ: 782512, ~: 783581) +ERC20PriceOracleReceiptVaultInitializeTest:testERC20PriceOracleReceiptVaultInitializedV2Event(uint256,string,string) (runs: 256, μ: 414737, ~: 410451) +ERC20PriceOracleReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 256, μ: 396945, ~: 392684) +ERC20PriceOracleReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 256, μ: 397010, ~: 392749) +ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 156, μ: 578819, ~: 579639) +ERC20PriceOracleReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,uint256,bytes) (runs: 157, μ: 584238, ~: 584274) +ERC20PriceOracleReceiptVaultMintTest:testMintBasic(string,string,uint256,uint256,bytes) (runs: 256, μ: 475864, ~: 474843) +ERC20PriceOracleReceiptVaultMintTest:testMintSomeoneElse(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 586170, ~: 582180) +ERC20PriceOracleReceiptVaultMintTest:testMintWithMinShareRatio(string,string,uint256,uint256,uint256,bytes) (runs: 256, μ: 364176, ~: 363799) +ERC20PriceOracleReceiptVaultMintTest:testMintWithZeroShares(string,string,uint256,uint256,bytes) (runs: 256, μ: 387133, ~: 386777) +ERC20PriceOracleReceiptVaultMintTest:testMultipleMints(string,string,uint256,uint256,uint256,uint256,bytes,bytes) (runs: 256, μ: 541409, ~: 540883) +ERC20PriceOracleReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(string,string,uint256,uint256) (runs: 256, μ: 352028, ~: 349756) +ERC20PriceOracleReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(string,string,uint256,uint256) (runs: 256, μ: 352227, ~: 350129) +ERC20PriceOracleReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,string,string,uint256,uint256) (runs: 244, μ: 400324, ~: 401174) +ERC20PriceOracleReceiptVaultPreviewWithdrawTest:testPreviewWithdraw(uint256,string,string,uint256,uint256) (runs: 256, μ: 400205, ~: 401268) +ERC20PriceOracleReceiptVaultReceiptTest:testVaultAsset(string,string) (runs: 256, μ: 339326, ~: 338774) +ERC20PriceOracleReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 256, μ: 395459, ~: 398063) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemBasic(uint256,string,string,uint256,uint256,uint256) (runs: 239, μ: 546803, ~: 548118) ERC20PriceOracleReceiptVaultRedeemTest:testRedeemFlareFork(uint256) (runs: 1, μ: 544965, ~: 544965) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemMoreThanBalance(uint256,string,string,uint256,uint256,uint256) (runs: 256, μ: 530940, ~: 531744) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroOwner(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 523386, ~: 524881) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroReceiver(uint256,string,string,uint256,uint256,uint256) (runs: 240, μ: 527699, ~: 529011) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 524898, ~: 526035) -ERC20PriceOracleReceiptVaultRedeemTest:testRedeemWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 236, μ: 628558, ~: 629678) -ERC20PriceOracleReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 257, μ: 401154, ~: 397970) -ERC20PriceOracleReceiptVaultWithdrawTest:testMultiplePricesAndHistoricalRedemptionsAndMint(uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 797184, ~: 797344) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 804865, ~: 809770) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawBasic(uint256,string,string,uint256,uint256) (runs: 257, μ: 539804, ~: 546246) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemMoreThanBalance(uint256,string,string,uint256,uint256,uint256) (runs: 255, μ: 530766, ~: 531744) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroOwner(uint256,string,string,uint256,uint256,uint256) (runs: 239, μ: 523566, ~: 524881) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroReceiver(uint256,string,string,uint256,uint256,uint256) (runs: 239, μ: 527696, ~: 529011) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemRevertsOnZeroShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 524891, ~: 526035) +ERC20PriceOracleReceiptVaultRedeemTest:testRedeemWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 235, μ: 628555, ~: 629678) +ERC20PriceOracleReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 256, μ: 401341, ~: 397970) +ERC20PriceOracleReceiptVaultWithdrawTest:testMultiplePricesAndHistoricalRedemptionsAndMint(uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 797183, ~: 797344) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 804848, ~: 809770) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawBasic(uint256,string,string,uint256,uint256) (runs: 256, μ: 539954, ~: 546246) ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawFlareFork(uint256) (runs: 1, μ: 545152, ~: 545152) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawMoreThanAssets(uint256,string,string,uint256,uint256,uint256) (runs: 256, μ: 530063, ~: 531042) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 524511, ~: 525846) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroOwner(uint256,string,string,uint256,uint256) (runs: 257, μ: 522568, ~: 523729) -ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroReceiver(uint256,string,string,uint256,uint256) (runs: 256, μ: 525428, ~: 527115) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawMoreThanAssets(uint256,string,string,uint256,uint256,uint256) (runs: 255, μ: 530232, ~: 531042) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 524680, ~: 525846) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroOwner(uint256,string,string,uint256,uint256) (runs: 256, μ: 522563, ~: 523729) +ERC20PriceOracleReceiptVaultWithdrawTest:testWithdrawRevertsOnZeroReceiver(uint256,string,string,uint256,uint256) (runs: 255, μ: 525676, ~: 527115) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOracle() (gas: 461762) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOraclePaid(uint128) (runs: 1, μ: 701707, ~: 701707) FtsoV2LTSFeedOracleTest:testFtsoV2LTSFeedOracleStale() (gas: 462499) -MulticallTest:testDepositMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1297963, ~: 1296919) -MulticallTest:testMintMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1298005, ~: 1296956) -MulticallTest:testRedeemMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1309882, ~: 1310677) -MulticallTest:testWithdrawMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1310233, ~: 1310854) -OffChainAssetReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 257, μ: 1980135, ~: 1981201) -OffChainAssetReceiptVaultInitializeTest:testNonZeroAsset(uint256,address,string,string) (runs: 254, μ: 515570, ~: 513151) -OffChainAssetReceiptVaultInitializeTest:testOffchainAssetReceiptVaultInitializedV2Event(uint256,string,string) (runs: 257, μ: 1058022, ~: 1053576) +MulticallTest:testDepositMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1297998, ~: 1296945) +MulticallTest:testMintMulticall(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1298035, ~: 1296982) +MulticallTest:testRedeemMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 255, μ: 1310077, ~: 1310703) +MulticallTest:testWithdrawMulticall(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 255, μ: 1310254, ~: 1310880) +OffChainAssetReceiptVaultInitializeTest:testCreatingSeveralVaults(uint256,uint256,string,string,string,string) (runs: 256, μ: 1980182, ~: 1981253) +OffChainAssetReceiptVaultInitializeTest:testNonZeroAsset(uint256,address,string,string) (runs: 255, μ: 515769, ~: 513177) +OffChainAssetReceiptVaultInitializeTest:testOffchainAssetReceiptVaultInitializedV2Event(uint256,string,string) (runs: 256, μ: 1057890, ~: 1053602) OffChainAssetReceiptVaultInitializeTest:testZeroInitialAdmin(string,string) (runs: 256, μ: 440060, ~: 439508) OffchainAssetReceiptVault7201Test:testOffchainAssetReceiptVault7201StorageLocation() (gas: 671) -OffchainAssetReceiptVaultAssetTest:testVaultAsset(uint256,string,string) (runs: 257, μ: 995315, ~: 990985) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscator(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 1866949, ~: 1867557) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscatorTo(uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 1475700, ~: 1473716) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 257, μ: 1427173, ~: 1425970) -OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferRevertExpiredCertification(uint256,uint256,string,string,uint256,uint256,uint256,bytes,uint256[],uint256[]) (runs: 257, μ: 1337794, ~: 1342104) -OffchainAssetReceiptVaultAuthorizeTest:testAuthorizeContract(uint256,uint256,string,string) (runs: 257, μ: 1079738, ~: 1077390) -OffchainAssetReceiptVaultAuthorizeTest:testChangeAuthorizer(uint256,uint256,string,string) (runs: 257, μ: 1376452, ~: 1374104) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeAuthorized(address,address,bytes,address) (runs: 255, μ: 2034190, ~: 2034063) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,address,uint256[],uint256[]) (runs: 255, μ: 1937041, ~: 1938766) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredBurn(address,address,address,uint256[],uint256[]) (runs: 250, μ: 2047577, ~: 2049163) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredMintBurn(address,address,address,uint256[],uint256[]) (runs: 250, μ: 2047535, ~: 2049121) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,address,address,uint256[],uint256[]) (runs: 256, μ: 1929500, ~: 1929829) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,address,uint256) (runs: 255, μ: 1865930, ~: 1865896) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredBurn(address,address,address,uint256) (runs: 252, μ: 1930696, ~: 1930696) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredMintBurn(address,address,address,uint256) (runs: 252, μ: 1930677, ~: 1930677) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,address,address,uint256) (runs: 254, μ: 1862855, ~: 1862855) +OffchainAssetReceiptVaultAssetTest:testVaultAsset(uint256,string,string) (runs: 256, μ: 995270, ~: 991011) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscator(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 255, μ: 1868227, ~: 1868857) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferForConfiscatorTo(uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 1474716, ~: 1473009) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferNotManaged(uint256,uint256,uint256,string,string,uint256[],uint256[]) (runs: 256, μ: 1427208, ~: 1426770) +OffchainAssetReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTransferRevertExpiredCertification(uint256,uint256,string,string,uint256,uint256,uint256,bytes,uint256[],uint256[]) (runs: 256, μ: 1337786, ~: 1342105) +OffchainAssetReceiptVaultAuthorizeTest:testAuthorizeContract(uint256,uint256,string,string) (runs: 256, μ: 1079773, ~: 1077416) +OffchainAssetReceiptVaultAuthorizeTest:testChangeAuthorizer(uint256,uint256,string,string) (runs: 256, μ: 1376487, ~: 1374130) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeAuthorized(address,address,bytes,address) (runs: 256, μ: 2034189, ~: 2034063) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,address,uint256[],uint256[]) (runs: 255, μ: 1936865, ~: 1938766) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredBurn(address,address,address,uint256[],uint256[]) (runs: 256, μ: 2047879, ~: 2049163) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyExpiredMintBurn(address,address,address,uint256[],uint256[]) (runs: 256, μ: 2047837, ~: 2049121) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,address,address,uint256[],uint256[]) (runs: 255, μ: 1929508, ~: 1929829) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,address,uint256) (runs: 255, μ: 1865913, ~: 1865896) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredBurn(address,address,address,uint256) (runs: 253, μ: 1930696, ~: 1930696) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredMintBurn(address,address,address,uint256) (runs: 253, μ: 1930677, ~: 1930677) +OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,address,address,uint256) (runs: 255, μ: 1862855, ~: 1862855) OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeUnauthorized(address,address,address,bytes32,bytes) (runs: 255, μ: 1866286, ~: 1866268) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1Construct(address) (runs: 256, μ: 1190973, ~: 1190973) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1Initialize(address,bytes32) (runs: 255, μ: 1894380, ~: 1894380) OffchainAssetReceiptVaultAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultAuthorizerV1InitializeZeroAdmin() (gas: 1492465) OffchainAssetReceiptVaultAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultAuthorizerV1IERC165(bytes4) (runs: 255, μ: 1194540, ~: 1194540) -OffchainAssetReceiptVaultCertifyTest:testCertify(uint256,uint256,string,string,uint256,bytes,uint256,bool) (runs: 256, μ: 1108905, ~: 1107948) -OffchainAssetReceiptVaultCertifyTest:testCertifyRevertOnZeroCertifyUntil(uint256,uint256,string,string,bytes,uint256,bool) (runs: 257, μ: 1072577, ~: 1073908) -OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrue(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1366810, ~: 1364775) -OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrueRevertDeposit(uint256,uint256,string,string,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 256, μ: 1318234, ~: 1317150) -OffchainAssetReceiptVaultCertifyTest:testVaultGetsCertified(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool) (runs: 256, μ: 1288485, ~: 1288098) -OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 257, μ: 995036, ~: 995860) -OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 1055797, ~: 1052471) -OffchainAssetReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 257, μ: 995731, ~: 997263) -OffchainAssetReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 257, μ: 1056944, ~: 1053259) -OffchainAssetReceiptVaultDepositTest:testDepositBasic(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1253383, ~: 1258405) -OffchainAssetReceiptVaultDepositTest:testDepositMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1105058, ~: 1101376) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1224733, ~: 1221041) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1161870, ~: 1160536) -OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1292778, ~: 1291048) -OffchainAssetReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,uint256,string,string,bytes,uint256) (runs: 257, μ: 1123849, ~: 1123226) -OffchainAssetReceiptVaultDepositTest:testDepositWithZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1122108, ~: 1118504) -OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1279448, ~: 1279225) -OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1279810, ~: 1279771) -OffchainAssetReceiptVaultDepositTest:testMintBasic(uint256,uint256,string,string,uint256,bytes,uint256) (runs: 256, μ: 1256974, ~: 1254429) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 257, μ: 1214444, ~: 1210775) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 257, μ: 1152288, ~: 1150685) -OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1284288, ~: 1282658) -OffchainAssetReceiptVaultDepositTest:testMintWithMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1095090, ~: 1091484) -OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1279689, ~: 1279211) -OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 257, μ: 1281136, ~: 1280903) -OffchainAssetReceiptVaultDepositTest:testMultipleDeposit(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1358679, ~: 1356544) -OffchainAssetReceiptVaultDepositTest:testMultipleMints(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1346741, ~: 1344599) -OffchainAssetReceiptVaultDepositTest:testZeroAssetsAmount(uint256,uint256,string,string,bytes,uint256) (runs: 257, μ: 1113969, ~: 1112829) -OffchainAssetReceiptVaultDepositTest:testZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 256, μ: 1117887, ~: 1114212) -OffchainAssetReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 257, μ: 1028495, ~: 1028491) -OffchainAssetReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 257, μ: 1001991, ~: 997899) -OffchainAssetReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 257, μ: 1232852, ~: 1231488) -OffchainAssetReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 1248631, ~: 1248728) -OffchainAssetReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256,uint256,bytes) (runs: 136, μ: 1299695, ~: 1299722) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscate(uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 252, μ: 1545860, ~: 1543120) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscatorOwner(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[],uint256) (runs: 255, μ: 1600362, ~: 1601245) -OffchainAssetReceiptVaultHandlerTest:testReceiptTransferHandlerReceiver(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 256, μ: 1542010, ~: 1543678) +OffchainAssetReceiptVaultBeaconSetDeployerConstructTest:testOffchainAssetReceiptVaultBeaconSetDeployerConstructSuccess(address) (runs: 253, μ: 7875094, ~: 7875094) +OffchainAssetReceiptVaultBeaconSetDeployerConstructTest:testOffchainAssetReceiptVaultBeaconSetDeployerConstructZeroBeaconOwner(address,address) (runs: 252, μ: 38613, ~: 38613) +OffchainAssetReceiptVaultBeaconSetDeployerConstructTest:testOffchainAssetReceiptVaultBeaconSetDeployerConstructZeroReceiptImplementation(address,address) (runs: 252, μ: 38530, ~: 38530) +OffchainAssetReceiptVaultBeaconSetDeployerConstructTest:testOffchainAssetReceiptVaultBeaconSetDeployerConstructZeroVaultImplementation(address,address) (runs: 252, μ: 38552, ~: 38552) +OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultTest:testNewOffchainAssetReceiptVault((address,(address,string,string,address))) (runs: 0, μ: 0, ~: 0) +OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultTest:testNewOffchainAssetReceiptVaultNonZeroReceipt((address,(address,string,string,address))) (runs: 253, μ: 7876816, ~: 7876816) +OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultTest:testNewOffchainAssetReceiptVaultZeroInitialAdmin((address,(address,string,string,address))) (runs: 0, μ: 0, ~: 0) +OffchainAssetReceiptVaultCertifyTest:testCertify(uint256,uint256,string,string,uint256,bytes,uint256,bool) (runs: 255, μ: 1108924, ~: 1107974) +OffchainAssetReceiptVaultCertifyTest:testCertifyRevertOnZeroCertifyUntil(uint256,uint256,string,string,bytes,uint256,bool) (runs: 256, μ: 1072598, ~: 1073934) +OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrue(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 256, μ: 1366835, ~: 1364801) +OffchainAssetReceiptVaultCertifyTest:testCertifyWithForceUntilTrueRevertDeposit(uint256,uint256,string,string,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 255, μ: 1318242, ~: 1317175) +OffchainAssetReceiptVaultCertifyTest:testVaultGetsCertified(uint256,uint256,uint256,uint256,string,string,bytes,uint256,uint256,bool) (runs: 255, μ: 1288682, ~: 1288126) +OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 994783, ~: 995886) +OffchainAssetReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 1055659, ~: 1052497) +OffchainAssetReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 995738, ~: 997153) +OffchainAssetReceiptVaultConvertToSharesTest:testConvertToSharesDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 1056995, ~: 1053285) +OffchainAssetReceiptVaultDepositTest:testDepositBasic(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1253034, ~: 1258431) +OffchainAssetReceiptVaultDepositTest:testDepositMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1105013, ~: 1101402) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 256, μ: 1224776, ~: 1221067) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 256, μ: 1161912, ~: 1160562) +OffchainAssetReceiptVaultDepositTest:testDepositToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 256, μ: 1292730, ~: 1291074) +OffchainAssetReceiptVaultDepositTest:testDepositWithZeroAssets(uint256,uint256,string,string,bytes,uint256) (runs: 256, μ: 1123864, ~: 1123278) +OffchainAssetReceiptVaultDepositTest:testDepositWithZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1122144, ~: 1118530) +OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 256, μ: 1279557, ~: 1279251) +OffchainAssetReceiptVaultDepositTest:testDepositWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 256, μ: 1280103, ~: 1279797) +OffchainAssetReceiptVaultDepositTest:testMintBasic(uint256,uint256,string,string,uint256,bytes,uint256) (runs: 255, μ: 1256844, ~: 1254455) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseExpiredCertification(uint256,string,string,uint256,uint256,uint256,bytes,uint256,uint256,uint256) (runs: 256, μ: 1214460, ~: 1210801) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseNotCertified(uint256,string,string,uint256,uint256,uint256,bytes,uint256) (runs: 256, μ: 1152079, ~: 1150711) +OffchainAssetReceiptVaultDepositTest:testMintToSomeoneElseWithDepositorRole(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 256, μ: 1284334, ~: 1282684) +OffchainAssetReceiptVaultDepositTest:testMintWithMinShareRatio(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1095122, ~: 1091510) +OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRole(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 256, μ: 1279526, ~: 1279183) +OffchainAssetReceiptVaultDepositTest:testMintWithoutDepositorRoleForAdmin(uint256,uint256,uint256,uint256,bytes,string,string,uint256) (runs: 256, μ: 1281325, ~: 1280983) +OffchainAssetReceiptVaultDepositTest:testMultipleDeposit(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1358557, ~: 1356483) +OffchainAssetReceiptVaultDepositTest:testMultipleMints(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1346784, ~: 1344712) +OffchainAssetReceiptVaultDepositTest:testZeroAssetsAmount(uint256,uint256,string,string,bytes,uint256) (runs: 256, μ: 1114005, ~: 1113362) +OffchainAssetReceiptVaultDepositTest:testZeroReceiver(uint256,uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1117938, ~: 1114325) +OffchainAssetReceiptVaultERC20StandardTest:testERC20AllowanceAndApprove(uint256,uint256,uint256) (runs: 256, μ: 1028521, ~: 1028517) +OffchainAssetReceiptVaultERC20StandardTest:testERC20NameSymbolDecimals(uint256,string,string) (runs: 256, μ: 1002209, ~: 997925) +OffchainAssetReceiptVaultERC20StandardTest:testERC20TotalSupplyAndBalanceOf(uint256,string,string,uint256,uint256,uint256,bytes) (runs: 256, μ: 1232872, ~: 1231514) +OffchainAssetReceiptVaultERC20StandardTest:testERC20Transfer(uint256,uint256,uint256,uint256,uint256,bytes) (runs: 255, μ: 1248655, ~: 1248791) +OffchainAssetReceiptVaultERC20StandardTest:testERC20TransferFrom(uint256,uint256,uint256,uint256,uint256,uint256,bytes) (runs: 131, μ: 1299751, ~: 1299748) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscate(uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 251, μ: 1545909, ~: 1543505) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferConfiscatorOwner(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[],uint256) (runs: 254, μ: 1600085, ~: 1600910) +OffchainAssetReceiptVaultHandlerTest:testReceiptTransferHandlerReceiver(uint256,uint256,uint256,string,string,uint256,uint256,bool,uint256,uint256[],uint256[]) (runs: 255, μ: 1541982, ~: 1543618) OffchainAssetReceiptVaultIERC165Test:testOffchainAssetReceiptVaultIERC165(bytes4) (runs: 256, μ: 4330822, ~: 4330822) -OffchainAssetReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 257, μ: 995613, ~: 991283) -OffchainAssetReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 257, μ: 995765, ~: 991348) -OffchainAssetReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1243284, ~: 1245384) -OffchainAssetReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 255, μ: 1246798, ~: 1248975) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 56520, ~: 56607) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 99851, ~: 99844) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 56637, ~: 56460) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1312177, ~: 1315851) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1304856, ~: 1308217) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 247, μ: 58438, ~: 58653) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 56660, ~: 56747) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 100059, ~: 100052) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 56759, ~: 56582) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1317666, ~: 1321355) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1310369, ~: 1313745) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 247, μ: 58446, ~: 58661) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 60595, ~: 60526) +OffchainAssetReceiptVaultMaxDepositTest:testMaxDeposit(uint256,string,string) (runs: 256, μ: 995568, ~: 991309) +OffchainAssetReceiptVaultMaxMintTest:testMaxMint(uint256,string,string) (runs: 256, μ: 995633, ~: 991374) +OffchainAssetReceiptVaultMaxRedeemTest:testMaxRedeem(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 254, μ: 1243201, ~: 1245410) +OffchainAssetReceiptVaultMaxRedeemTest:testMaxWithdraw(uint256,uint256,string,string,uint256,uint256,uint256,bytes) (runs: 254, μ: 1246816, ~: 1249001) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 56527, ~: 56636) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 99861, ~: 99856) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 56632, ~: 56460) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1312139, ~: 1315851) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1304856, ~: 1308312) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 249, μ: 58444, ~: 58653) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 56667, ~: 56776) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 100069, ~: 100064) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 56754, ~: 56582) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1317628, ~: 1321355) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1310369, ~: 1313839) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 249, μ: 58452, ~: 58661) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 60614, ~: 60526) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingEmitsEvent(uint256) (runs: 256, μ: 48138, ~: 48764) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 60975, ~: 60913) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 1123979, ~: 1117133) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 1132744, ~: 1126146) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 60957, ~: 60807) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 1123989, ~: 1117133) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 1132748, ~: 1126146) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreeze(uint256) (runs: 256, μ: 64193, ~: 64819) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 61921, ~: 61921) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 62041, ~: 62041) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableZeroProtectUntilReverts(address) (runs: 256, μ: 21636, ~: 21636) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerFreezableZeroProtectUntilRevertsTo(address) (runs: 256, μ: 21656, ~: 21656) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testOwnerIsAlice() (gas: 17863) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptConfiscateFrozen(uint256) (runs: 257, μ: 438609, ~: 445447) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptTransferFroze(uint256) (runs: 257, μ: 382795, ~: 389635) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenConfiscateFrozen(uint256) (runs: 257, μ: 396080, ~: 402918) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenDepositFrozen(uint256) (runs: 257, μ: 403644, ~: 410369) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenMintFrozen(uint256) (runs: 257, μ: 403605, ~: 410437) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedeemFrozen(uint256) (runs: 257, μ: 357775, ~: 363248) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedepositFrozen(uint256) (runs: 257, μ: 479521, ~: 486246) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferFroze(uint256) (runs: 257, μ: 362666, ~: 369504) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptConfiscateFrozen(uint256) (runs: 256, μ: 439122, ~: 445447) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testReceiptTransferFroze(uint256) (runs: 256, μ: 383308, ~: 389635) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenConfiscateFrozen(uint256) (runs: 256, μ: 396593, ~: 402918) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenDepositFrozen(uint256) (runs: 256, μ: 404055, ~: 410369) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenMintFrozen(uint256) (runs: 256, μ: 404123, ~: 410437) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedeemFrozen(uint256) (runs: 256, μ: 358188, ~: 363255) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedepositFrozen(uint256) (runs: 256, μ: 479932, ~: 486246) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferFroze(uint256) (runs: 256, μ: 363179, ~: 369504) OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferNotFroze() (gas: 291104) -OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenWithdrawFrozen(uint256) (runs: 257, μ: 357977, ~: 363364) +OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenWithdrawFrozen(uint256) (runs: 256, μ: 358305, ~: 363372) OffchainAssetReceiptVaultPaymentMintAuthorizerV17201Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1StorageLocation() (gas: 661) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1Construct() (gas: 2221257) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1Initialize(address,address,uint8,uint256,bytes32) (runs: 251, μ: 3079905, ~: 3079905) @@ -175,53 +187,53 @@ OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetR OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroPaymentToken(address,address) (runs: 249, μ: 2584841, ~: 2584841) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroReceiptVault() (gas: 2583787) OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1ZeroVerifyContract(address,address) (runs: 249, μ: 2523952, ~: 2523952) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMaxSharesSupplyExceeded(address,address,uint256,uint256,uint256,uint256) (runs: 78, μ: 5057746, ~: 5057795) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMaxSharesSupplyExceeded(address,address,uint256,uint256,uint256,uint256) (runs: 78, μ: 5057754, ~: 5057821) OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleMockedReceiptVault(address,address,address,uint256,uint256,uint256) (runs: 76, μ: 3830564, ~: 3830482) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleRealReceiptVault(address,address,uint256,uint256,uint256) (runs: 40, μ: 5099531, ~: 5099937) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTofuTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 78, μ: 3840414, ~: 3840338) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 78, μ: 3818509, ~: 3818682) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleRealReceiptVault(address,address,uint256,uint256,uint256) (runs: 39, μ: 5099581, ~: 5099963) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTofuTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 83, μ: 3840393, ~: 3840338) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testTokenDecimals(address,address,address,uint8,uint256,uint256,uint256) (runs: 83, μ: 3818494, ~: 3818682) OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testZeroPaymentAmount(address,address) (runs: 40, μ: 3755963, ~: 3755963) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantDeposit(address,address,address,uint8,uint256,address) (runs: 72, μ: 3037784, ~: 3037784) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantWithdraw(address,address,address,uint8,uint256,address) (runs: 72, μ: 3037816, ~: 3037816) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 87, μ: 3109838, ~: 3112027) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 87, μ: 3106724, ~: 3108910) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 76, μ: 3042965, ~: 3042965) -OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 76, μ: 3039842, ~: 3039842) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantDeposit(address,address,address,uint8,uint256,address) (runs: 73, μ: 3037784, ~: 3037784) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AdminCannotGrantWithdraw(address,address,address,uint8,uint256,address) (runs: 73, μ: 3037816, ~: 3037816) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 86, μ: 3111486, ~: 3114300) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferReceiptCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256[],uint256[]) (runs: 86, μ: 3108372, ~: 3111182) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 82, μ: 3042965, ~: 3042965) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeTransferSharesCertifyNotExpired(address,address,address,uint8,uint256,address,address,address,uint256) (runs: 82, μ: 3039842, ~: 3039842) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1AuthorizeUnauthorized(address,address,address,uint8,uint256,address,address,bytes32,bytes) (runs: 28, μ: 3040482, ~: 3040481) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165(bytes4) (runs: 256, μ: 2224742, ~: 2224742) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1RolesAuthorized(address,address,address,uint8,uint256,address,bytes) (runs: 77, μ: 3141904, ~: 3141900) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1UnauthorizedCaller(address,address,address,uint8,uint256,address,bytes32,bytes,address) (runs: 80, μ: 3039365, ~: 3039365) OffchainAssetReceiptVaultPaymentMintAuthorizerV1IERC165Test:testSendPaymentToOwner(address,address,address,address) (runs: 254, μ: 3823127, ~: 3823127) -OffchainAssetReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(uint256,uint256,string,string,uint256) (runs: 257, μ: 1077907, ~: 1075454) -OffchainAssetReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(uint256,uint256,string,string,uint256) (runs: 257, μ: 1077815, ~: 1075443) -OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,uint256,uint256,string,string,uint256) (runs: 256, μ: 1079749, ~: 1076866) -OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeemNoWithdrawer(uint256,uint256,string,string,uint256) (runs: 257, μ: 997882, ~: 995754) -OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawNoRole(uint256,uint256,string,string,uint256) (runs: 257, μ: 998816, ~: 996606) -OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawWithRole(uint256,uint256,uint256,string,string,uint256) (runs: 256, μ: 1079565, ~: 1076268) -OffchainAssetReceiptVaultReceiptTest:testVaultAsset(uint256,string,string) (runs: 257, μ: 996630, ~: 992561) -OffchainAssetReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 257, μ: 994000, ~: 996595) -OffchainAssetReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 257, μ: 1183612, ~: 1180324) +OffchainAssetReceiptVaultPreviewDepositTest:testPreviewDepositReturnedShares(uint256,uint256,string,string,uint256) (runs: 256, μ: 1077859, ~: 1075480) +OffchainAssetReceiptVaultPreviewMintTest:testPreviewMintReturnedAssets(uint256,uint256,string,string,uint256) (runs: 256, μ: 1077856, ~: 1075469) +OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeem(uint256,uint256,uint256,string,string,uint256) (runs: 255, μ: 1079687, ~: 1076892) +OffchainAssetReceiptVaultPreviewRedeemTest:testPreviewRedeemNoWithdrawer(uint256,uint256,string,string,uint256) (runs: 256, μ: 998163, ~: 995780) +OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawNoRole(uint256,uint256,string,string,uint256) (runs: 256, μ: 999024, ~: 996632) +OffchainAssetReceiptVaultPreviewWithdrawTest:testPreviewWithdrawWithRole(uint256,uint256,uint256,string,string,uint256) (runs: 255, μ: 1079519, ~: 1076294) +OffchainAssetReceiptVaultReceiptTest:testVaultAsset(uint256,string,string) (runs: 256, μ: 996846, ~: 992587) +OffchainAssetReceiptVaultReceiptVaultInformationTest:testReceiptVaultInformation(uint256,string,string,bytes) (runs: 256, μ: 994016, ~: 996621) +OffchainAssetReceiptVaultTotalAssetsTest:testTotalAssets(uint256,string,string,uint256) (runs: 256, μ: 1183828, ~: 1180350) OwnerFreezableERC7201Test:testOwnerFreezableStorageLocation() (gas: 611) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 45336, ~: 45418) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 83128, ~: 83116) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 45424, ~: 45245) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1049866, ~: 1052848) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1042584, ~: 1045187) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 248, μ: 48343, ~: 48531) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 45211, ~: 45292) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 82874, ~: 82863) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 45315, ~: 45137) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1041321, ~: 1044281) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1034017, ~: 1036598) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 248, μ: 48286, ~: 48474) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 49498, ~: 49429) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDecrement(address,uint256,uint256) (runs: 250, μ: 45351, ~: 45468) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromDifferentFrom(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 83128, ~: 83119) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromIncrement(address,uint256,uint256) (runs: 250, μ: 45409, ~: 45244) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromMany(address,uint256[]) (runs: 256, μ: 1049864, ~: 1052848) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromManyIncreasing(address,uint32[]) (runs: 256, μ: 1042591, ~: 1044998) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowFromProtectedReverts(address,uint256,uint256) (runs: 249, μ: 48361, ~: 48562) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDecrement(address,uint256,uint256) (runs: 250, μ: 45226, ~: 45342) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToDifferentTo(address,address,uint256,uint256,uint256,uint256) (runs: 243, μ: 82874, ~: 82865) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToIncrement(address,uint256,uint256) (runs: 250, μ: 45300, ~: 45136) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToMany(address,uint256[]) (runs: 256, μ: 1041319, ~: 1044281) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToManyIncreasing(address,uint32[]) (runs: 256, μ: 1034025, ~: 1036409) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableAlwaysAllowToProtectedReverts(address,uint256,uint256) (runs: 249, μ: 48304, ~: 48505) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingDecrement(uint256,uint256) (runs: 256, μ: 49504, ~: 49429) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingEmitsEvent(uint256) (runs: 256, μ: 39094, ~: 39720) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 49900, ~: 49838) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 863938, ~: 858592) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 872692, ~: 867500) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingIncrement(uint256,uint256) (runs: 256, μ: 49895, ~: 49838) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 863943, ~: 858592) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 872709, ~: 867659) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreeze(uint256) (runs: 256, μ: 46090, ~: 46716) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 44350, ~: 44351) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 44250, ~: 44251) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowFrom(address,uint256) (runs: 255, μ: 44351, ~: 44351) +OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 44251, ~: 44251) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableZeroProtectUntilReverts(address) (runs: 256, μ: 13647, ~: 13647) OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableZeroProtectUntilRevertsTo(address) (runs: 256, μ: 13580, ~: 13580) OwnerFreezableTestOwnerFreezeUntil:testOwnerIsAlice() (gas: 9855) @@ -250,32 +262,32 @@ ReceiptVaultDecimalsTest:testDecimalsWithNonZeroAsset(uint8) (runs: 256, μ: 594 ReceiptVaultDecimalsTest:testDecimalsWithZeroAsset() (gas: 2661816) ReceiptVaultERC7201Test:testReceiptVaultStorageLocation() (gas: 676) ReceiptVaultIERC165Test:testReceiptVaultIERC165(bytes4) (runs: 256, μ: 2667357, ~: 2667357) -RedeemTest:testOffchainAssetWithdrawWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1405084, ~: 1406694) -RedeemTest:testRedeem(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1234531, ~: 1237018) -RedeemTest:testRedeemInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260589, ~: 1263598) -RedeemTest:testRedeemOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1328190, ~: 1326763) -RedeemTest:testRedeemOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1358201, ~: 1354157) -RedeemTest:testRedeemOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 250, μ: 1505640, ~: 1505292) -RedeemTest:testRedeemRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1194763, ~: 1194080) -RedeemTest:testRedeemSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1297962, ~: 1298293) -RedeemTest:testRedeemToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1234463, ~: 1236950) -RedeemTest:testRedeemZeroAssetsAmount(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260542, ~: 1263152) -RedeemTest:testRedeemZeroOwner(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1262183, ~: 1265215) -RedeemTest:testRedeemZeroReceiver(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260241, ~: 1263422) -RedeemTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 128, μ: 1272378, ~: 1271691) -RedepositTest:testReDeposit(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1326493, ~: 1327074) -RedepositTest:testReDepositOverSeveralIds(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 256, μ: 1549080, ~: 1550038) -RedepositTest:testReDepositRevertsWithZeroAssets(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1294852, ~: 1289867) -RedepositTest:testReDepositToNonExistentReceipt(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 255, μ: 1295356, ~: 1293682) -RedepositTest:testReDepositToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1298481, ~: 1300504) -RedepositTest:testReDepositToSomeoneElseReverts(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1308168, ~: 1306942) -RedepositTest:testReDepositToSomeoneElseWhileCertified(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 257, μ: 1326683, ~: 1327391) -RedepositTest:testReDepositrevertsPastTopID(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 257, μ: 1349132, ~: 1349195) -RolesTest:testCertifyWithoutRole(uint256,string,string,uint256,bytes) (runs: 256, μ: 1024714, ~: 1024402) -RolesTest:testConfiscateReceiptWithoutRole(uint256,string,string,uint256,uint256,bytes) (runs: 255, μ: 1026682, ~: 1026856) -RolesTest:testConfiscateSharesWithoutRole(uint256,string,string,uint256,bytes) (runs: 256, μ: 1025073, ~: 1024733) -RolesTest:testDepositWithoutDepositorRole(uint256,uint256,string,string,uint256,bytes) (runs: 255, μ: 1279934, ~: 1275868) -RolesTest:testGrantAdminRoles(uint256,string,string) (runs: 257, μ: 1033858, ~: 1029442) +RedeemTest:testOffchainAssetWithdrawWithERC20Approval(uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 1404632, ~: 1406720) +RedeemTest:testRedeem(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1234552, ~: 1236783) +RedeemTest:testRedeemInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1260608, ~: 1263363) +RedeemTest:testRedeemOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 256, μ: 1328555, ~: 1326905) +RedeemTest:testRedeemOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 256, μ: 1357988, ~: 1354183) +RedeemTest:testRedeemOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 249, μ: 1505711, ~: 1505318) +RedeemTest:testRedeemRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1194781, ~: 1194106) +RedeemTest:testRedeemSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1298174, ~: 1298319) +RedeemTest:testRedeemToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1234484, ~: 1236715) +RedeemTest:testRedeemZeroAssetsAmount(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1260378, ~: 1263051) +RedeemTest:testRedeemZeroOwner(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1262199, ~: 1264954) +RedeemTest:testRedeemZeroReceiver(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1260432, ~: 1263187) +RedeemTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 134, μ: 1272993, ~: 1271717) +RedepositTest:testReDeposit(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 256, μ: 1326517, ~: 1327100) +RedepositTest:testReDepositOverSeveralIds(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 255, μ: 1549190, ~: 1550064) +RedepositTest:testReDepositRevertsWithZeroAssets(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 256, μ: 1294901, ~: 1289953) +RedepositTest:testReDepositToNonExistentReceipt(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 255, μ: 1295193, ~: 1293708) +RedepositTest:testReDepositToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 255, μ: 1298300, ~: 1300413) +RedepositTest:testReDepositToSomeoneElseReverts(uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 256, μ: 1308394, ~: 1306968) +RedepositTest:testReDepositToSomeoneElseWhileCertified(uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256) (runs: 256, μ: 1326539, ~: 1327404) +RedepositTest:testReDepositrevertsPastTopID(uint256,uint256,uint256,uint256,uint256,bytes,string,string,uint256,uint256,uint256,uint256) (runs: 256, μ: 1349329, ~: 1349221) +RolesTest:testCertifyWithoutRole(uint256,string,string,uint256,bytes) (runs: 255, μ: 1024742, ~: 1024428) +RolesTest:testConfiscateReceiptWithoutRole(uint256,string,string,uint256,uint256,bytes) (runs: 254, μ: 1026707, ~: 1026882) +RolesTest:testConfiscateSharesWithoutRole(uint256,string,string,uint256,bytes) (runs: 255, μ: 1024925, ~: 1024759) +RolesTest:testDepositWithoutDepositorRole(uint256,uint256,string,string,uint256,bytes) (runs: 254, μ: 1279968, ~: 1275894) +RolesTest:testGrantAdminRoles(uint256,string,string) (runs: 256, μ: 1033726, ~: 1029468) SceptreStakedFlrOracleTest:testSceptreStakedFlrOracle() (gas: 150235) SceptreStakedFlrOracleTest:testSceptreStakedFlrOracleRefund(uint128,uint128) (runs: 256, μ: 162917, ~: 162255) TwoPriceOracleTest:testNotOracle(address,address) (runs: 254, μ: 4137988, ~: 41982) @@ -284,16 +296,16 @@ TwoPriceOracleTest:testSameBaseQuote(address) (runs: 253, μ: 37371, ~: 37371) TwoPriceOracleTest:testZeroAddressBase(address) (runs: 253, μ: 4153749, ~: 41541) TwoPriceOracleTest:testZeroAddressBoth() (gas: 36561) TwoPriceOracleTest:testZeroAddressQuote(address) (runs: 253, μ: 39043, ~: 39043) -WithdrawTest:testOffchainAssetWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 257, μ: 1603739, ~: 1603414) -WithdrawTest:testWithdraw(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1234537, ~: 1236491) -WithdrawTest:testWithdrawInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1260433, ~: 1263156) -WithdrawTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 134, μ: 1272839, ~: 1271731) -WithdrawTest:testWithdrawOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1330780, ~: 1326828) -WithdrawTest:testWithdrawOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 257, μ: 1358526, ~: 1354573) -WithdrawTest:testWithdrawOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 253, μ: 1506264, ~: 1505455) -WithdrawTest:testWithdrawRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1314145, ~: 1313038) -WithdrawTest:testWithdrawSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1298462, ~: 1298378) -WithdrawTest:testWithdrawToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1234850, ~: 1237057) -WithdrawTest:testWithdrawZeroAssetsAmount(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1265825, ~: 1264409) -WithdrawTest:testWithdrawZeroOwner(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1267955, ~: 1266479) -WithdrawTest:testWithdrawZeroReceiver(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 257, μ: 1265775, ~: 1264477) \ No newline at end of file +WithdrawTest:testOffchainAssetWithdrawAliceBurnBob(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 1603718, ~: 1603440) +WithdrawTest:testWithdraw(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1234545, ~: 1236497) +WithdrawTest:testWithdrawInvalidId(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1260687, ~: 1263162) +WithdrawTest:testWithdrawMoreThanBalance(uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 136, μ: 1273135, ~: 1271697) +WithdrawTest:testWithdrawOfSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 256, μ: 1330646, ~: 1326854) +WithdrawTest:testWithdrawOthersAssetsReverts(uint256,uint256,uint256,uint256,bytes,string,string,uint256,bool) (runs: 256, μ: 1358391, ~: 1354599) +WithdrawTest:testWithdrawOverSeveralIds(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 252, μ: 1506371, ~: 1505481) +WithdrawTest:testWithdrawRevertsWithoutRole(uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1314175, ~: 1313064) +WithdrawTest:testWithdrawSomePartOfAssetsDeposited(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1298496, ~: 1298404) +WithdrawTest:testWithdrawToSomeoneElse(uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1234589, ~: 1236541) +WithdrawTest:testWithdrawZeroAssetsAmount(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1265687, ~: 1264435) +WithdrawTest:testWithdrawZeroOwner(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1267812, ~: 1266505) +WithdrawTest:testWithdrawZeroReceiver(uint256,uint256,uint256,uint256,uint256,bytes,string,string) (runs: 256, μ: 1265810, ~: 1264503) \ No newline at end of file diff --git a/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.newERC20PriceOracleReceiptVault.t.sol b/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.newERC20PriceOracleReceiptVault.t.sol new file mode 100644 index 00000000..bf2f59f5 --- /dev/null +++ b/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.newERC20PriceOracleReceiptVault.t.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Test} from "forge-std/Test.sol"; + +import { + ERC20PriceOracleReceiptVaultCloneDeployer, + ERC20PriceOracleReceiptVaultCloneDeployerConfig, + ERC20PriceOracleReceiptVaultConfigV2 +} from "src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol"; +import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; +import { + ERC20PriceOracleReceiptVault, + ReceiptVaultConfigV2, + IPriceOracleV2 +} from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; +import {InitializeNonZeroReceipt} from "src/error/ErrDeployer.sol"; + +contract ERC20PriceOracleReceiptVaultCloneDeployerNewERC20PriceOracleReceiptVaultTest is Test { + function testNewERC20PriceOracleReceiptVaultNonZeroReceipt(ERC20PriceOracleReceiptVaultConfigV2 memory config) + external + { + vm.assume(config.receiptVaultConfig.receipt != address(0)); + ReceiptContract receiptImplementation = new ReceiptContract(); + ERC20PriceOracleReceiptVault erc20PriceOracleReceiptVaultImplementation = new ERC20PriceOracleReceiptVault(); + ERC20PriceOracleReceiptVaultCloneDeployer deployer = new ERC20PriceOracleReceiptVaultCloneDeployer( + ERC20PriceOracleReceiptVaultCloneDeployerConfig({ + receiptImplementation: address(receiptImplementation), + erc20PriceOracleReceiptVaultImplementation: address(erc20PriceOracleReceiptVaultImplementation) + }) + ); + vm.expectRevert(abi.encodeWithSelector(InitializeNonZeroReceipt.selector, config.receiptVaultConfig.receipt)); + deployer.newERC20PriceOracleReceiptVault(config); + } + + function testNewERC20PriceOracleReceiptVaultSuccess(ERC20PriceOracleReceiptVaultConfigV2 memory config) external { + vm.assume(config.receiptVaultConfig.receipt == address(0)); + ReceiptContract receiptImplementation = new ReceiptContract(); + ERC20PriceOracleReceiptVault erc20PriceOracleReceiptVaultImplementation = new ERC20PriceOracleReceiptVault(); + ERC20PriceOracleReceiptVaultCloneDeployer deployer = new ERC20PriceOracleReceiptVaultCloneDeployer( + ERC20PriceOracleReceiptVaultCloneDeployerConfig({ + receiptImplementation: address(receiptImplementation), + erc20PriceOracleReceiptVaultImplementation: address(erc20PriceOracleReceiptVaultImplementation) + }) + ); + ERC20PriceOracleReceiptVault vault = deployer.newERC20PriceOracleReceiptVault(config); + assert(address(vault) != address(0)); + assert(vault.asset() == config.receiptVaultConfig.asset); + } +} diff --git a/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newERC20PriceOracleReceiptVault.t.sol b/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.t.sol similarity index 97% rename from test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newERC20PriceOracleReceiptVault.t.sol rename to test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.t.sol index 6c069fe7..91d4005b 100644 --- a/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newERC20PriceOracleReceiptVault.t.sol +++ b/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.t.sol @@ -13,7 +13,7 @@ import {Receipt as ReceiptContract} from "src/concrete/receipt/Receipt.sol"; import {OffchainAssetReceiptVault, ReceiptVaultConfigV2} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; import {InitializeNonZeroReceipt, ZeroInitialAdmin} from "src/error/ErrDeployer.sol"; -contract OffchainAssetReceiptVaultBeaconSetDeployerNewERC20PriceOracleReceiptVaultTest is Test { +contract OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultTest is Test { function testNewOffchainAssetReceiptVaultNonZeroReceipt(OffchainAssetReceiptVaultConfigV2 memory config) external { vm.assume(config.receiptVaultConfig.receipt != address(0)); vm.assume(config.initialAdmin != address(0)); From da21dde4a72d6cc65b34aeb738cdd4299ef99523 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Wed, 17 Dec 2025 19:21:51 +0400 Subject: [PATCH 24/26] tests --- ...20PriceOracleReceiptVaultCloneDeployer.sol | 8 +++-- ...oyer.newERC20PriceOracleReceiptVault.t.sol | 30 +++++++++++++++++-- ...eployer.newOffchainAssetReceiptVault.t.sol | 29 ++++++++++++++++-- 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol index b5b21da8..8829ba07 100644 --- a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol +++ b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol @@ -23,7 +23,9 @@ struct ERC20PriceOracleReceiptVaultCloneDeployerConfig { } contract ERC20PriceOracleReceiptVaultCloneDeployer { - event Deployment(address sender, address erc20PriceOracleReceiptVault, address receipt); + event ERC20PriceOracleReceiptVaultCloneDeployerDeployment( + address sender, address erc20PriceOracleReceiptVault, address receipt + ); address public immutable I_RECEIPT_IMPLEMENTATION; address public immutable I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION; @@ -56,7 +58,9 @@ contract ERC20PriceOracleReceiptVaultCloneDeployer { revert InitializeVaultFailed(); } - emit Deployment(msg.sender, address(erc20PriceOracleReceiptVault), address(receipt)); + emit ERC20PriceOracleReceiptVaultCloneDeployerDeployment( + msg.sender, address(erc20PriceOracleReceiptVault), address(receipt) + ); return erc20PriceOracleReceiptVault; } diff --git a/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.newERC20PriceOracleReceiptVault.t.sol b/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.newERC20PriceOracleReceiptVault.t.sol index bf2f59f5..7c4eaf3e 100644 --- a/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.newERC20PriceOracleReceiptVault.t.sol +++ b/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.newERC20PriceOracleReceiptVault.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {Test} from "forge-std/Test.sol"; +import {Test, Vm} from "forge-std/Test.sol"; import { ERC20PriceOracleReceiptVaultCloneDeployer, @@ -34,7 +34,11 @@ contract ERC20PriceOracleReceiptVaultCloneDeployerNewERC20PriceOracleReceiptVaul deployer.newERC20PriceOracleReceiptVault(config); } - function testNewERC20PriceOracleReceiptVaultSuccess(ERC20PriceOracleReceiptVaultConfigV2 memory config) external { + function testNewERC20PriceOracleReceiptVaultSuccess( + address alice, + ERC20PriceOracleReceiptVaultConfigV2 memory config + ) external { + vm.assume(alice.code.length == 0); vm.assume(config.receiptVaultConfig.receipt == address(0)); ReceiptContract receiptImplementation = new ReceiptContract(); ERC20PriceOracleReceiptVault erc20PriceOracleReceiptVaultImplementation = new ERC20PriceOracleReceiptVault(); @@ -44,7 +48,29 @@ contract ERC20PriceOracleReceiptVaultCloneDeployerNewERC20PriceOracleReceiptVaul erc20PriceOracleReceiptVaultImplementation: address(erc20PriceOracleReceiptVaultImplementation) }) ); + vm.startPrank(alice); + vm.recordLogs(); ERC20PriceOracleReceiptVault vault = deployer.newERC20PriceOracleReceiptVault(config); + Vm.Log[] memory logs = vm.getRecordedLogs(); + vm.stopPrank(); + + bool eventFound = false; + bytes32 eventTopic = keccak256("ERC20PriceOracleReceiptVaultCloneDeployerDeployment(address,address,address)"); + address eventSender; + address eventVault; + address eventReceipt; + for (uint256 i = 0; i < logs.length; i++) { + if (logs[i].topics[0] == eventTopic) { + (eventSender, eventVault, eventReceipt) = abi.decode(logs[i].data, (address, address, address)); + eventFound = true; + break; + } + } + assertTrue(eventFound, "ERC20PriceOracleReceiptVaultCloneDeployerDeployment event log not found"); + assertEq(eventSender, alice); + assertEq(eventVault, address(vault)); + assertEq(eventReceipt, address(vault.receipt())); + assert(address(vault) != address(0)); assert(vault.asset() == config.receiptVaultConfig.asset); } diff --git a/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.t.sol b/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.t.sol index 91d4005b..7a9b8e8e 100644 --- a/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.t.sol +++ b/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {Test} from "forge-std/Test.sol"; +import {Test, Vm} from "forge-std/Test.sol"; import { OffchainAssetReceiptVaultBeaconSetDeployer, @@ -50,7 +50,10 @@ contract OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultT deployer.newOffchainAssetReceiptVault(config); } - function testNewOffchainAssetReceiptVault(OffchainAssetReceiptVaultConfigV2 memory config) external { + function testNewOffchainAssetReceiptVault(address alice, OffchainAssetReceiptVaultConfigV2 memory config) + external + { + vm.assume(alice.code.length == 0); vm.assume(config.receiptVaultConfig.receipt == address(0)); vm.assume(config.initialAdmin != address(0)); vm.assume(config.receiptVaultConfig.asset == address(0)); @@ -65,8 +68,28 @@ contract OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultT }) ); - // expectEmit + vm.startPrank(alice); + vm.recordLogs(); OffchainAssetReceiptVault offchainAssetReceiptVault = deployer.newOffchainAssetReceiptVault(config); + Vm.Log[] memory logs = vm.getRecordedLogs(); + vm.stopPrank(); + + bool eventFound = false; + bytes32 eventTopic = keccak256("OffchainAssetReceiptVaultBeaconSetDeployerDeployment(address,address,address)"); + address eventSender; + address eventVault; + address eventReceipt; + for (uint256 i = 0; i < logs.length; i++) { + if (logs[i].topics[0] == eventTopic) { + (eventSender, eventVault, eventReceipt) = abi.decode(logs[i].data, (address, address, address)); + eventFound = true; + break; + } + } + assertTrue(eventFound, "OffchainAssetReceiptVaultBeaconSetDeployerDeployment event log not found"); + assertEq(eventSender, alice); + assertEq(eventVault, address(offchainAssetReceiptVault)); + assertEq(eventReceipt, address(offchainAssetReceiptVault.receipt())); assertEq( address(OffchainAssetReceiptVault(payable(offchainAssetReceiptVault)).receipt().manager()), From e1bd791c0161b10b32d4e6211a2e0c00a181d752 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Wed, 17 Dec 2025 19:36:40 +0400 Subject: [PATCH 25/26] comments --- .gas-snapshot | 8 +++--- ...20PriceOracleReceiptVaultCloneDeployer.sol | 23 +++++++++++++++++ ...hainAssetReceiptVaultBeaconSetDeployer.sol | 25 +++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index d2370fc0..d9abc0e1 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -14,8 +14,8 @@ ERC20PriceOracleReceiptVaultAuthorizeReceiptTransferTest:testAuthorizeReceiptTra ERC20PriceOracleReceiptVaultCloneDeployerConstructTest:testERC20PriceOracleReceiptVaultCloneDeployerConstruct((address,address)) (runs: 246, μ: 467748, ~: 467748) ERC20PriceOracleReceiptVaultCloneDeployerConstructTest:testERC20PriceOracleReceiptVaultCloneDeployerConstructZeroReceiptImplementation(address) (runs: 254, μ: 37221, ~: 37221) ERC20PriceOracleReceiptVaultCloneDeployerConstructTest:testERC20PriceOracleReceiptVaultCloneDeployerConstructZeroVaultImplementation(address) (runs: 254, μ: 37221, ~: 37221) -ERC20PriceOracleReceiptVaultCloneDeployerNewERC20PriceOracleReceiptVaultTest:testNewERC20PriceOracleReceiptVaultNonZeroReceipt((address,(address,string,string,address))) (runs: 256, μ: 5587754, ~: 5587754) -ERC20PriceOracleReceiptVaultCloneDeployerNewERC20PriceOracleReceiptVaultTest:testNewERC20PriceOracleReceiptVaultSuccess((address,(address,string,string,address))) (runs: 0, μ: 0, ~: 0) +ERC20PriceOracleReceiptVaultCloneDeployerNewERC20PriceOracleReceiptVaultTest:testNewERC20PriceOracleReceiptVaultNonZeroReceipt((address,(address,string,string,address))) (runs: 255, μ: 5587895, ~: 5587895) +ERC20PriceOracleReceiptVaultCloneDeployerNewERC20PriceOracleReceiptVaultTest:testNewERC20PriceOracleReceiptVaultSuccess(address,(address,(address,string,string,address))) (runs: 1, μ: 5926009, ~: 5926009) ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssets(uint256,string,string,uint256,uint256) (runs: 256, μ: 397182, ~: 398287) ERC20PriceOracleReceiptVaultConvertToAssetsTest:testConvertToAssetsDifferentCaller(uint256,uint256,string,string,uint256,uint256) (runs: 256, μ: 457014, ~: 453843) ERC20PriceOracleReceiptVaultConvertToSharesTest:testConvertToShares(uint256,string,string,uint256,uint256) (runs: 256, μ: 397694, ~: 399131) @@ -101,8 +101,8 @@ OffchainAssetReceiptVaultBeaconSetDeployerConstructTest:testOffchainAssetReceipt OffchainAssetReceiptVaultBeaconSetDeployerConstructTest:testOffchainAssetReceiptVaultBeaconSetDeployerConstructZeroBeaconOwner(address,address) (runs: 252, μ: 38613, ~: 38613) OffchainAssetReceiptVaultBeaconSetDeployerConstructTest:testOffchainAssetReceiptVaultBeaconSetDeployerConstructZeroReceiptImplementation(address,address) (runs: 252, μ: 38530, ~: 38530) OffchainAssetReceiptVaultBeaconSetDeployerConstructTest:testOffchainAssetReceiptVaultBeaconSetDeployerConstructZeroVaultImplementation(address,address) (runs: 252, μ: 38552, ~: 38552) -OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultTest:testNewOffchainAssetReceiptVault((address,(address,string,string,address))) (runs: 0, μ: 0, ~: 0) -OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultTest:testNewOffchainAssetReceiptVaultNonZeroReceipt((address,(address,string,string,address))) (runs: 253, μ: 7876816, ~: 7876816) +OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultTest:testNewOffchainAssetReceiptVault(address,(address,(address,string,string,address))) (runs: 0, μ: 0, ~: 0) +OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultTest:testNewOffchainAssetReceiptVaultNonZeroReceipt((address,(address,string,string,address))) (runs: 254, μ: 7876957, ~: 7876957) OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultTest:testNewOffchainAssetReceiptVaultZeroInitialAdmin((address,(address,string,string,address))) (runs: 0, μ: 0, ~: 0) OffchainAssetReceiptVaultCertifyTest:testCertify(uint256,uint256,string,string,uint256,bytes,uint256,bool) (runs: 255, μ: 1108924, ~: 1107974) OffchainAssetReceiptVaultCertifyTest:testCertifyRevertOnZeroCertifyUntil(uint256,uint256,string,string,bytes,uint256,bool) (runs: 256, μ: 1072598, ~: 1073934) diff --git a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol index 8829ba07..7b0dd813 100644 --- a/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol +++ b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol @@ -16,20 +16,38 @@ import { ERC20PriceOracleReceiptVaultConfigV2 } from "../vault/ERC20PriceOracleReceiptVault.sol"; +/// Configuration for the ERC20PriceOracleReceiptVaultCloneDeployer construction. +/// @param receiptImplementation The address of the Receipt implementation +/// contract to clone from. +/// @param erc20PriceOracleReceiptVaultImplementation The address of the +/// ERC20PriceOracleReceiptVault implementation contract to clone from. //forge-lint: disable-next-line(pascal-case-struct) struct ERC20PriceOracleReceiptVaultCloneDeployerConfig { address receiptImplementation; address erc20PriceOracleReceiptVaultImplementation; } +/// @title ERC20PriceOracleReceiptVaultCloneDeployer +/// Deploys ERC20PriceOracleReceiptVault contracts as minimal proxy contracts +/// and handles the necessary initialization atomically. contract ERC20PriceOracleReceiptVaultCloneDeployer { + /// Emitted when a new deployment is successfully initialized. + /// @param sender The address that initiated the deployment. + /// @param erc20PriceOracleReceiptVault The address of the deployed + /// ERC20PriceOracleReceiptVault contract. + /// @param receipt The address of the deployed Receipt contract. event ERC20PriceOracleReceiptVaultCloneDeployerDeployment( address sender, address erc20PriceOracleReceiptVault, address receipt ); + /// The address of the Receipt implementation contract to clone from. address public immutable I_RECEIPT_IMPLEMENTATION; + + /// The address of the ERC20PriceOracleReceiptVault implementation contract + /// to clone from. address public immutable I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION; + /// @param config The configuration for the deployer. constructor(ERC20PriceOracleReceiptVaultCloneDeployerConfig memory config) { if (config.receiptImplementation == address(0)) revert ZeroReceiptImplementation(); if (config.erc20PriceOracleReceiptVaultImplementation == address(0)) revert ZeroVaultImplementation(); @@ -37,6 +55,11 @@ contract ERC20PriceOracleReceiptVaultCloneDeployer { I_ERC20_PRICE_ORACLE_RECEIPT_VAULT_IMPLEMENTATION = config.erc20PriceOracleReceiptVaultImplementation; } + /// Deploys and initializes a new ERC20PriceOracleReceiptVault contract + /// along with its associated Receipt contract. + /// @param config The configuration for the ERC20PriceOracleReceiptVault. + /// @return The address of the newly deployed ERC20PriceOracleReceiptVault + /// contract. function newERC20PriceOracleReceiptVault(ERC20PriceOracleReceiptVaultConfigV2 memory config) external returns (ERC20PriceOracleReceiptVault) diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol index a5117ee9..d695b435 100644 --- a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -17,18 +17,37 @@ import { InitializeVaultFailed } from "../../error/ErrDeployer.sol"; +/// Configuration for the OffchainAssetReceiptVaultBeaconSetDeployer +/// construction. +/// @param initialOwner The initial owner of the beacons. +/// @param initialReceiptImplementation The address of the initial Receipt +/// implementation contract. +/// @param initialOffchainAssetReceiptVaultImplementation The address of the +/// initial OffchainAssetReceiptVault implementation contract. struct OffchainAssetReceiptVaultBeaconSetDeployerConfig { address initialOwner; address initialReceiptImplementation; address initialOffchainAssetReceiptVaultImplementation; } +/// @title OffchainAssetReceiptVaultBeaconSetDeployer +/// Deploys OffchainAssetReceiptVault contracts using beacon proxies and +/// handles the necessary initialization atomically. contract OffchainAssetReceiptVaultBeaconSetDeployer { + /// Emitted when a new deployment is successfully initialized. + /// @param sender The address that initiated the deployment. + /// @param offchainAssetReceiptVault The address of the deployed + /// OffchainAssetReceiptVault contract. + /// @param receipt The address of the deployed Receipt contract. event Deployment(address sender, address offchainAssetReceiptVault, address receipt); + /// The beacon for the Receipt implementation contracts. IBeacon public immutable I_RECEIPT_BEACON; + + /// The beacon for the OffchainAssetReceiptVault implementation contracts. IBeacon public immutable I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON; + /// @param config The configuration for the deployer. constructor(OffchainAssetReceiptVaultBeaconSetDeployerConfig memory config) { if (address(config.initialReceiptImplementation) == address(0)) { revert ZeroReceiptImplementation(); @@ -45,6 +64,12 @@ contract OffchainAssetReceiptVaultBeaconSetDeployer { new UpgradeableBeacon(address(config.initialOffchainAssetReceiptVaultImplementation), config.initialOwner); } + /// Deploys and initializes a new OffchainAssetReceiptVault contract along + /// with its associated Receipt contract. Both are beacon proxies pointing + /// to the respective immutable beacons. + /// @param config The configuration for the OffchainAssetReceiptVault. + /// @return The address of the newly deployed OffchainAssetReceiptVault + /// contract. function newOffchainAssetReceiptVault(OffchainAssetReceiptVaultConfigV2 memory config) external returns (OffchainAssetReceiptVault) From 2009cea9981cb33567c47d7577329afb8a917da2 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Wed, 17 Dec 2025 19:43:12 +0400 Subject: [PATCH 26/26] lint comments --- src/abstract/ReceiptVault.sol | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/abstract/ReceiptVault.sol b/src/abstract/ReceiptVault.sol index 6525c53f..e82dfefc 100644 --- a/src/abstract/ReceiptVault.sol +++ b/src/abstract/ReceiptVault.sol @@ -86,12 +86,13 @@ struct ReceiptVaultConfigV2 { /// with the shares' mint event DO NOT MOVE (whatever that means) until/unless /// those shares are burned. /// -/// Each vault is deployed from a factory as a clone from a reference -/// implementation, allowing for the model to cheaply and freedomly scale -/// horizontally. This allows for some trust/permissioned concessions to be made -/// per-vault as new competing vaults can always be deployed and traded against -/// each other in parallel, allowing trust to be "policed" at the liquidity and -/// free market layer. +/// Each vault is designed to be an implementation for proxies, either clones, +/// beacons or transparent proxies, allowing for the model to cheaply and freely +/// scale horizontally. The deployer is responsible for correctly initializing +/// the proxies either way. This allows for some trust/permissioned concessions +/// to be made per-vault as new competing vaults can always be deployed and +/// traded against each other in parallel, allowing trust to be "policed" at the +/// liquidity and free market layer. abstract contract ReceiptVault is IReceiptManagerV2, IReceiptVaultV3,