diff --git a/.gas-snapshot b/.gas-snapshot index 1520c07f..d9abc0e1 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: 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: 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, μ: 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: 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) +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: 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: 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: 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: 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: 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: 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, μ: 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, μ: 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:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredBurn(address,address,address,uint256) (runs: 252, μ: 1930696, ~: 1930696) -OffchainAssetReceiptVaultAuthorizerV1AuthorizeTest:testOffchainAssetReceiptVaultAuthorizerV1AuthorizeTransferSharesCertifyExpiredMintBurn(address,address,address,uint256) (runs: 252, μ: 1930677, ~: 1930677) +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: 253, μ: 1866286, ~: 1866268) +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: 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) +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,(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) +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: 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, μ: 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: 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: 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: 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: 78, μ: 5057754, ~: 5057821) +OffchainAssetReceiptVaultPaymentMintAuthorizerV1DepositTest:testMintSimpleMockedReceiptVault(address,address,address,uint256,uint256,uint256) (runs: 76, μ: 3830564, ~: 3830482) +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: 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: 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: 75, μ: 3141907, ~: 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: 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:testSendPaymentToOwner(address,address,address,address) (runs: 254, μ: 3823127, ~: 3823127) +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, ~: 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, μ: 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, μ: 49887, ~: 49838) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingMany(uint256[]) (runs: 256, μ: 863936, ~: 858645) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableFreezingManyIncreasing(uint32[]) (runs: 256, μ: 872701, ~: 867765) +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, ~: 44348) -OwnerFreezableTestOwnerFreezeUntil:testOwnerFreezableOnlyOwnerCanFreezeAlwaysAllowTo(address,uint256) (runs: 255, μ: 44250, ~: 44248) +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) @@ -246,36 +258,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: 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: 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: 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/script/Deploy.sol b/script/Deploy.sol deleted file mode 100644 index c3a768b4..00000000 --- a/script/Deploy.sol +++ /dev/null @@ -1,96 +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, - ERC20PriceOracleVaultConfig -} from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; -import {VaultConfig} 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"); -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, -/// 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 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..e82dfefc 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,35 +43,17 @@ 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` 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 @@ -104,12 +86,13 @@ struct ReceiptVaultConfig { /// 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, @@ -122,11 +105,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. @@ -143,14 +121,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. @@ -164,23 +136,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/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol new file mode 100644 index 00000000..7b0dd813 --- /dev/null +++ b/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// 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 { + ERC20PriceOracleReceiptVault, + 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(); + I_RECEIPT_IMPLEMENTATION = config.receiptImplementation; + 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) + { + 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))); + + if (receipt.initialize(abi.encode(erc20PriceOracleReceiptVault)) != ICLONEABLE_V2_SUCCESS) { + revert InitializeReceiptFailed(); + } + + config.receiptVaultConfig.receipt = address(receipt); + if (erc20PriceOracleReceiptVault.initialize(abi.encode(config)) != ICLONEABLE_V2_SUCCESS) { + revert InitializeVaultFailed(); + } + + emit ERC20PriceOracleReceiptVaultCloneDeployerDeployment( + msg.sender, address(erc20PriceOracleReceiptVault), address(receipt) + ); + + return erc20PriceOracleReceiptVault; + } +} diff --git a/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol new file mode 100644 index 00000000..d695b435 --- /dev/null +++ b/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -0,0 +1,101 @@ +// 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} 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, + ZeroVaultImplementation, + ZeroBeaconOwner, + ZeroInitialAdmin, + InitializeNonZeroReceipt, + InitializeReceiptFailed, + 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(); + } + 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 = + 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) + { + if (config.receiptVaultConfig.receipt != address(0)) { + revert InitializeNonZeroReceipt(config.receiptVaultConfig.receipt); + } + + if (config.initialAdmin == address(0)) revert ZeroInitialAdmin(); + + Receipt receipt = Receipt(address(new BeaconProxy(address(I_RECEIPT_BEACON), ""))); + OffchainAssetReceiptVault offchainAssetReceiptVault = OffchainAssetReceiptVault( + payable(address(new BeaconProxy(address(I_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON), ""))) + ); + + if (receipt.initialize(abi.encode(offchainAssetReceiptVault)) != ICLONEABLE_V2_SUCCESS) { + revert InitializeReceiptFailed(); + } + + config.receiptVaultConfig.receipt = address(receipt); + if (offchainAssetReceiptVault.initialize(abi.encode(config)) != ICLONEABLE_V2_SUCCESS) { + revert InitializeVaultFailed(); + } + + emit Deployment(msg.sender, address(offchainAssetReceiptVault), address(receipt)); + + return offchainAssetReceiptVault; + } +} diff --git a/src/concrete/vault/ERC20PriceOracleReceiptVault.sol b/src/concrete/vault/ERC20PriceOracleReceiptVault.sol index 7a56405f..d2bdeb06 100644 --- a/src/concrete/vault/ERC20PriceOracleReceiptVault.sol +++ b/src/concrete/vault/ERC20PriceOracleReceiptVault.sol @@ -2,14 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import { - ReceiptVaultConfig, - VaultConfig, - 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. @@ -19,24 +12,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 +74,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 @@ -112,26 +94,24 @@ 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) { - 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..2ef759dd 100644 --- a/src/concrete/vault/OffchainAssetReceiptVault.sol +++ b/src/concrete/vault/OffchainAssetReceiptVault.sol @@ -3,13 +3,11 @@ pragma solidity =0.8.25; import { - ReceiptVaultConfig, - VaultConfig, + ReceiptVaultConfigV2, 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"; @@ -37,19 +35,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 +44,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. @@ -308,20 +293,18 @@ 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 /// 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 +320,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/src/error/ErrDeployer.sol b/src/error/ErrDeployer.sol new file mode 100644 index 00000000..04dcacf3 --- /dev/null +++ b/src/error/ErrDeployer.sol @@ -0,0 +1,27 @@ +// 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 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. +error InitializeNonZeroReceipt(address receipt); + +/// Thrown when receipt initialization fails. +error InitializeReceiptFailed(); + +/// Thrown when vault initialization fails. +error InitializeVaultFailed(); diff --git a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol index 2012cfac..b52749fd 100644 --- a/test/abstract/ERC20PriceOracleReceiptVaultTest.sol +++ b/test/abstract/ERC20PriceOracleReceiptVaultTest.sol @@ -3,33 +3,37 @@ 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, - ERC20PriceOracleReceiptVaultConfig + ERC20PriceOracleReceiptVaultConfigV2, + ReceiptVaultConfigV2 } 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"; +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(); 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 { @@ -42,31 +46,38 @@ 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({ + receiptVaultConfig: ReceiptVaultConfigV2({ + asset: address(I_ASSET), + name: name, + symbol: symbol, + receipt: address(0) + }), + priceOracle: priceOracle + }) ); - return vault; } /// Get Receipt from event 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++) { - if (logs[i].topics[0] == ERC20PriceOracleReceiptVault.ERC20PriceOracleReceiptVaultInitialized.selector) { + if (logs[i].topics[0] == ERC20PriceOracleReceiptVault.ERC20PriceOracleReceiptVaultInitializedV2.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; } } // 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); } 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 7e9be88b..61e3a5ab 100644 --- a/test/abstract/OffchainAssetReceiptVaultTest.sol +++ b/test/abstract/OffchainAssetReceiptVaultTest.sol @@ -3,40 +3,63 @@ 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, - 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 { + 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 { - 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: address(I_RECEIPT_IMPLEMENTATION), + initialOffchainAssetReceiptVaultImplementation: address(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 + OffchainAssetReceiptVault vault = I_DEPLOYER.newOffchainAssetReceiptVault( + OffchainAssetReceiptVaultConfigV2({ + initialAdmin: admin, + receiptVaultConfig: ReceiptVaultConfigV2({ + asset: address(0), + name: shareName, + symbol: shareSymbol, + receipt: address(0) + }) + }) ); + OffchainAssetReceiptVaultAuthorizerV1 authorizer = + OffchainAssetReceiptVaultAuthorizerV1(Clones.clone(address(I_AUTHORIZER_IMPLEMENTATION))); + vm.startPrank(admin); + authorizer.initialize(abi.encode(OffchainAssetReceiptVaultAuthorizerV1Config({initialAdmin: admin}))); + vault.setAuthorizer(authorizer); + vm.stopPrank(); + return vault; } function getReceipt(Vm.Log[] memory logs) internal pure returns (ReceiptContract) { 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/concrete/ConcreteReceiptVault.sol b/test/concrete/ConcreteReceiptVault.sol index b3c596f8..62ccc629 100644 --- a/test/concrete/ConcreteReceiptVault.sol +++ b/test/concrete/ConcreteReceiptVault.sol @@ -2,28 +2,13 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import { - ReceiptVault, - VaultConfig, - ReceiptVaultConstructionConfigV2, - 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 { - constructor() - ReceiptVault(ReceiptVaultConstructionConfigV2({factory: new CloneFactory(), receiptImplementation: new Receipt()})) - {} - 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; } - - 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 7518fd20..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, - ERC20PriceOracleVaultConfig -} from "src/concrete/vault/ERC20PriceOracleReceiptVault.sol"; -import {VaultConfig} 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) { - ERC20PriceOracleVaultConfig memory erc20PriceOracleVault = ERC20PriceOracleVaultConfig({ - priceOracle: priceOracle, - vaultConfig: VaultConfig({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 cbea5684..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, OffchainAssetVaultConfigV2} from "src/concrete/vault/OffchainAssetReceiptVault.sol"; -import {VaultConfig} 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) { - OffchainAssetVaultConfigV2 memory offchainAssetVaultConfig = OffchainAssetVaultConfigV2({ - initialAdmin: initialAdmin, - vaultConfig: VaultConfig({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/abstract/ReceiptVault.decimals.t.sol b/test/src/abstract/ReceiptVault.decimals.t.sol index 0b90825e..fd4c667f 100644 --- a/test/src/abstract/ReceiptVault.decimals.t.sol +++ b/test/src/abstract/ReceiptVault.decimals.t.sol @@ -4,7 +4,9 @@ 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 {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(VaultConfig({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 c9412a9f..df78fce3 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, - OffchainAssetVaultConfigV2, - VaultConfig -} 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 {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( - OffchainAssetVaultConfigV2({ - initialAdmin: alice, - vaultConfig: VaultConfig({asset: address(0), name: "Test Vault", symbol: "TVLT"}) - }) - ) - ) - ) - ); + OffchainAssetReceiptVault receiptVault = createVault(alice, "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); - OffchainAssetVaultConfigV2 memory offchainAssetVaultConfig = OffchainAssetVaultConfigV2({ - initialAdmin: bob, - vaultConfig: VaultConfig({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/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/ERC20PriceOracleReceiptVaultCloneDeployer.newERC20PriceOracleReceiptVault.t.sol b/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.newERC20PriceOracleReceiptVault.t.sol new file mode 100644 index 00000000..7c4eaf3e --- /dev/null +++ b/test/src/concrete/deploy/ERC20PriceOracleReceiptVaultCloneDeployer.newERC20PriceOracleReceiptVault.t.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Test, Vm} 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( + 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(); + ERC20PriceOracleReceiptVaultCloneDeployer deployer = new ERC20PriceOracleReceiptVaultCloneDeployer( + ERC20PriceOracleReceiptVaultCloneDeployerConfig({ + receiptImplementation: address(receiptImplementation), + 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.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) + ); + } +} diff --git a/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.t.sol b/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.t.sol new file mode 100644 index 00000000..7a9b8e8e --- /dev/null +++ b/test/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.t.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Test, Vm} 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 OffchainAssetReceiptVaultBeaconSetDeployerNewOffchainAssetReceiptVaultTest 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(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)); + + ReceiptContract receiptImplementation = new ReceiptContract(); + OffchainAssetReceiptVault offchainAssetReceiptVaultImplementation = new OffchainAssetReceiptVault(); + OffchainAssetReceiptVaultBeaconSetDeployer deployer = new OffchainAssetReceiptVaultBeaconSetDeployer( + OffchainAssetReceiptVaultBeaconSetDeployerConfig({ + initialOwner: address(this), + initialReceiptImplementation: address(receiptImplementation), + initialOffchainAssetReceiptVaultImplementation: address(offchainAssetReceiptVaultImplementation) + }) + ); + + 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()), + address(offchainAssetReceiptVault) + ); + } +} 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.construct.t.sol b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.initialize.t.sol similarity index 76% rename from test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol rename to test/src/concrete/vault/ERC20PriceOracleReceiptVault.initialize.t.sol index 24177ba2..7ff7f696 100644 --- a/test/src/concrete/vault/ERC20PriceOracleReceiptVault.construct.t.sol +++ b/test/src/concrete/vault/ERC20PriceOracleReceiptVault.initialize.t.sol @@ -4,16 +4,22 @@ 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"; 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 { +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")))))); @@ -30,35 +36,30 @@ 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++) { - 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, ERC20PriceOracleReceiptVaultConfig)); + (msgSender, config) = abi.decode(logs[i].data, (address, ERC20PriceOracleReceiptVaultConfigV2)); eventFound = true; // Set the flag to true since event log was found break; } } // Assert that the event log was found - assertTrue(eventFound, "ERC20PriceOracleReceiptVaultInitialized event log not found"); + assertTrue(eventFound, "ERC20PriceOracleReceiptVaultInitializedV2 event log not found"); - assertEq(msgSender, address(I_FACTORY)); + assertEq(msgSender, address(I_DEPLOYER)); 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/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.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.construct.t.sol b/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol similarity index 66% rename from test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol rename to test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol index 299f285d..7b6a0d94 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.construct.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.initialize.t.sol @@ -2,26 +2,41 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {VaultConfig} from "src/abstract/ReceiptVault.sol"; -import {OffchainAssetReceiptVaultTest, Vm} from "test/abstract/OffchainAssetReceiptVaultTest.sol"; +import { + OffchainAssetReceiptVaultTest, ReceiptVaultConfigV2, Vm +} from "test/abstract/OffchainAssetReceiptVaultTest.sol"; import { OffchainAssetReceiptVault, - OffchainAssetVaultConfigV2, OffchainAssetReceiptVaultConfigV2, 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 { +contract OffChainAssetReceiptVaultInitializeTest 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}); + 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)); - I_FACTORY.clone( - address(I_IMPLEMENTATION), - abi.encode(OffchainAssetVaultConfigV2({initialAdmin: address(0), vaultConfig: vaultConfig})) + offchainAssetReceiptVault.initialize( + abi.encode( + OffchainAssetReceiptVaultConfigV2({ + initialAdmin: address(0), + receiptVaultConfig: ReceiptVaultConfigV2({ + asset: address(0), + name: shareName, + symbol: shareSymbol, + receipt: address(receipt) + }) + }) + ) ); } @@ -32,33 +47,38 @@ 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}); vm.expectRevert(abi.encodeWithSelector(NonZeroAsset.selector)); - I_FACTORY.clone( - address(I_IMPLEMENTATION), - abi.encode(OffchainAssetVaultConfigV2({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 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); - VaultConfig memory vaultConfig = VaultConfig({asset: asset, name: shareName, symbol: shareSymbol}); - // Simulate transaction from alice vm.prank(alice); - OffchainAssetVaultConfigV2 memory offchainAssetVaultConfig = - OffchainAssetVaultConfigV2({initialAdmin: alice, vaultConfig: 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(); @@ -76,7 +96,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 @@ -90,27 +110,27 @@ 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(I_FACTORY)); + assertEq(msgSender, address(I_DEPLOYER)); 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(authorizeSetTo, address(vault)); + assertEq(authorizeSetMsgSender, address(alice)); + assertEq(authorizeSetTo, address(vault.authorizer())); assertTrue(address(vault) != address(0)); // Check the receipt manager is the vault. 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..d7e3ac07 100644 --- a/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol +++ b/test/src/concrete/vault/OffchainAssetReceiptVault.ownerFreezeUntil.t.sol @@ -6,46 +6,23 @@ 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, CONFISCATE_SHARES, CONFISCATE_RECEIPT -} from "../../../../src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; -import {LibOffchainAssetVaultCreator} from "../../../lib/LibOffchainAssetVaultCreator.sol"; +} from "src/concrete/authorize/OffchainAssetReceiptVaultAuthorizerV1.sol"; 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); - 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) {