@1inch/solidity-utils 3.8.3 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -208
- package/contracts/interfaces/ICreate3Deployer.sol +16 -0
- package/contracts/interfaces/IDaiLikePermit.sol +13 -0
- package/contracts/interfaces/IERC20MetadataUppercase.sol +12 -0
- package/contracts/interfaces/IERC7597Permit.sol +13 -0
- package/contracts/interfaces/IPermit2.sol +45 -12
- package/contracts/interfaces/IWETH.sol +17 -0
- package/contracts/libraries/AddressArray.sol +190 -61
- package/contracts/libraries/AddressLib.sol +2 -1
- package/contracts/libraries/AddressSet.sol +82 -18
- package/contracts/libraries/BySigTraits.sol +46 -0
- package/contracts/libraries/BytesMemory.sol +2 -1
- package/contracts/libraries/BytesStorage.sol +2 -1
- package/contracts/libraries/ECDSA.sol +111 -0
- package/contracts/libraries/RevertReasonForwarder.sol +13 -3
- package/contracts/libraries/RevertReasonParser.sol +11 -2
- package/contracts/libraries/SafeERC20.sol +7 -3
- package/contracts/libraries/StringUtil.sol +21 -3
- package/contracts/libraries/UniERC20.sol +57 -12
- package/contracts/mocks/ERC20PermitMock.sol +12 -0
- package/contracts/mocks/SelfdestructEthSenderMock.sol +17 -0
- package/contracts/mocks/TokenCustomDecimalsMock.sol +25 -4
- package/contracts/mocks/TokenMock.sol +19 -0
- package/dist/hardhat-setup/networks.d.ts +23 -0
- package/dist/hardhat-setup/networks.js +22 -0
- package/dist/hardhat-setup/networks.js.map +1 -1
- package/dist/src/expect.d.ts +12 -0
- package/dist/src/expect.js +12 -0
- package/dist/src/expect.js.map +1 -1
- package/dist/src/permit.d.ts +120 -1
- package/dist/src/permit.js +124 -8
- package/dist/src/permit.js.map +1 -1
- package/dist/src/prelude.d.ts +6 -0
- package/dist/src/prelude.js +6 -0
- package/dist/src/prelude.js.map +1 -1
- package/dist/src/profileEVM.d.ts +26 -0
- package/dist/src/profileEVM.js +30 -3
- package/dist/src/profileEVM.js.map +1 -1
- package/dist/src/utils.d.ts +79 -0
- package/dist/src/utils.js +92 -1
- package/dist/src/utils.js.map +1 -1
- package/dist/typechain-types/@openzeppelin/contracts/utils/Address.d.ts +20 -0
- package/dist/typechain-types/@openzeppelin/contracts/utils/Address.js +3 -0
- package/dist/typechain-types/@openzeppelin/contracts/utils/Address.js.map +1 -0
- package/dist/typechain-types/@openzeppelin/contracts/utils/index.d.ts +1 -0
- package/dist/typechain-types/contracts/index.d.ts +2 -3
- package/dist/typechain-types/contracts/interfaces/IERC7597Permit.d.ts +41 -0
- package/dist/typechain-types/contracts/interfaces/IERC7597Permit.js +3 -0
- package/dist/typechain-types/contracts/interfaces/IERC7597Permit.js.map +1 -0
- package/dist/typechain-types/contracts/interfaces/index.d.ts +1 -0
- package/dist/typechain-types/contracts/libraries/BySigTraits.d.ts +20 -0
- package/dist/typechain-types/contracts/libraries/BySigTraits.js +3 -0
- package/dist/typechain-types/contracts/libraries/BySigTraits.js.map +1 -0
- package/dist/typechain-types/contracts/libraries/index.d.ts +1 -0
- package/dist/typechain-types/contracts/mixins/BySig.d.ts +214 -0
- package/dist/typechain-types/contracts/mixins/BySig.js +3 -0
- package/dist/typechain-types/contracts/mixins/BySig.js.map +1 -0
- package/dist/typechain-types/contracts/{EthReceiver.d.ts → mixins/EthReceiver.d.ts} +1 -1
- package/dist/typechain-types/contracts/mixins/EthReceiver.js.map +1 -0
- package/dist/typechain-types/contracts/{OnlyWethReceiver.d.ts → mixins/OnlyWethReceiver.d.ts} +1 -1
- package/dist/typechain-types/contracts/mixins/OnlyWethReceiver.js.map +1 -0
- package/dist/typechain-types/contracts/{PermitAndCall.d.ts → mixins/PermitAndCall.d.ts} +1 -1
- package/dist/typechain-types/contracts/mixins/PermitAndCall.js.map +1 -0
- package/dist/typechain-types/contracts/mixins/SelfdestructEthSender.d.ts +29 -0
- package/dist/typechain-types/contracts/mixins/SelfdestructEthSender.js +3 -0
- package/dist/typechain-types/contracts/mixins/SelfdestructEthSender.js.map +1 -0
- package/dist/typechain-types/contracts/mixins/index.d.ts +5 -0
- package/dist/typechain-types/contracts/mixins/index.js +3 -0
- package/dist/typechain-types/contracts/mixins/index.js.map +1 -0
- package/dist/typechain-types/contracts/mocks/SelfdestructEthSenderMock.d.ts +37 -0
- package/dist/typechain-types/contracts/mocks/SelfdestructEthSenderMock.js +3 -0
- package/dist/typechain-types/contracts/mocks/SelfdestructEthSenderMock.js.map +1 -0
- package/dist/typechain-types/contracts/mocks/TokenCustomDecimalsMock.d.ts +1 -5
- package/dist/typechain-types/contracts/mocks/index.d.ts +1 -0
- package/dist/typechain-types/contracts/tests/mocks/AddressSetMock.d.ts +5 -1
- package/dist/typechain-types/contracts/tests/mocks/BySigTraitsMock.d.ts +47 -0
- package/dist/typechain-types/contracts/tests/mocks/BySigTraitsMock.js +3 -0
- package/dist/typechain-types/contracts/tests/mocks/BySigTraitsMock.js.map +1 -0
- package/dist/typechain-types/contracts/tests/mocks/TokenWithBySig.d.ts +422 -0
- package/dist/typechain-types/contracts/tests/mocks/TokenWithBySig.js +3 -0
- package/dist/typechain-types/contracts/tests/mocks/TokenWithBySig.js.map +1 -0
- package/dist/typechain-types/contracts/tests/mocks/USDCLikePermitMock.d.ts +260 -0
- package/dist/typechain-types/contracts/tests/mocks/USDCLikePermitMock.js +3 -0
- package/dist/typechain-types/contracts/tests/mocks/USDCLikePermitMock.js.map +1 -0
- package/dist/typechain-types/contracts/tests/mocks/index.d.ts +3 -0
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.d.ts +42 -0
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.js +67 -0
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.js.map +1 -0
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/ShortStrings__factory.d.ts +1 -1
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/ShortStrings__factory.js +1 -1
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.d.ts +1 -1
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.js +1 -1
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.d.ts +1 -1
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.js +1 -1
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/index.d.ts +1 -0
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/index.js +3 -1
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/index.js.map +1 -1
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/math/Math__factory.d.ts +1 -1
- package/dist/typechain-types/factories/@openzeppelin/contracts/utils/math/Math__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/index.d.ts +1 -3
- package/dist/typechain-types/factories/contracts/index.js +2 -7
- package/dist/typechain-types/factories/contracts/index.js.map +1 -1
- package/dist/typechain-types/factories/contracts/interfaces/IERC7597Permit__factory.d.ts +33 -0
- package/dist/typechain-types/factories/contracts/interfaces/IERC7597Permit__factory.js +53 -0
- package/dist/typechain-types/factories/contracts/interfaces/IERC7597Permit__factory.js.map +1 -0
- package/dist/typechain-types/factories/contracts/interfaces/index.d.ts +1 -0
- package/dist/typechain-types/factories/contracts/interfaces/index.js +3 -1
- package/dist/typechain-types/factories/contracts/interfaces/index.js.map +1 -1
- package/dist/typechain-types/factories/contracts/libraries/AddressArray__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/libraries/AddressArray__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/libraries/BySigTraits__factory.d.ts +26 -0
- package/dist/typechain-types/factories/contracts/libraries/BySigTraits__factory.js +45 -0
- package/dist/typechain-types/factories/contracts/libraries/BySigTraits__factory.js.map +1 -0
- package/dist/typechain-types/factories/contracts/libraries/BytesMemory__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/libraries/BytesMemory__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/libraries/BytesStorage__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/libraries/BytesStorage__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/libraries/RevertReasonParser__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/libraries/RevertReasonParser__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/libraries/SafeERC20__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/libraries/SafeERC20__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/libraries/UniERC20__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/libraries/UniERC20__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/libraries/index.d.ts +1 -0
- package/dist/typechain-types/factories/contracts/libraries/index.js +3 -1
- package/dist/typechain-types/factories/contracts/libraries/index.js.map +1 -1
- package/dist/typechain-types/factories/contracts/mixins/BySig__factory.d.ts +286 -0
- package/dist/typechain-types/factories/contracts/mixins/BySig__factory.js +385 -0
- package/dist/typechain-types/factories/contracts/mixins/BySig__factory.js.map +1 -0
- package/dist/typechain-types/factories/contracts/{EthReceiver__factory.d.ts → mixins/EthReceiver__factory.d.ts} +1 -1
- package/dist/typechain-types/factories/contracts/mixins/EthReceiver__factory.js.map +1 -0
- package/dist/typechain-types/factories/contracts/{OnlyWethReceiver__factory.d.ts → mixins/OnlyWethReceiver__factory.d.ts} +1 -1
- package/dist/typechain-types/factories/contracts/mixins/OnlyWethReceiver__factory.js.map +1 -0
- package/dist/typechain-types/factories/contracts/{PermitAndCall__factory.d.ts → mixins/PermitAndCall__factory.d.ts} +1 -1
- package/dist/typechain-types/factories/contracts/mixins/PermitAndCall__factory.js.map +1 -0
- package/dist/typechain-types/factories/contracts/mixins/SelfdestructEthSender__factory.d.ts +17 -0
- package/dist/typechain-types/factories/contracts/mixins/SelfdestructEthSender__factory.js +33 -0
- package/dist/typechain-types/factories/contracts/mixins/SelfdestructEthSender__factory.js.map +1 -0
- package/dist/typechain-types/factories/contracts/mixins/index.d.ts +5 -0
- package/dist/typechain-types/factories/contracts/mixins/index.js +17 -0
- package/dist/typechain-types/factories/contracts/mixins/index.js.map +1 -0
- package/dist/typechain-types/factories/contracts/mocks/ERC20PermitMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/mocks/ERC20PermitMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/mocks/ERC20PermitMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/mocks/SelfdestructEthSenderMock__factory.d.ts +49 -0
- package/dist/typechain-types/factories/contracts/mocks/SelfdestructEthSenderMock__factory.js +75 -0
- package/dist/typechain-types/factories/contracts/mocks/SelfdestructEthSenderMock__factory.js.map +1 -0
- package/dist/typechain-types/factories/contracts/mocks/TokenCustomDecimalsMock__factory.d.ts +1 -11
- package/dist/typechain-types/factories/contracts/mocks/TokenCustomDecimalsMock__factory.js +1 -14
- package/dist/typechain-types/factories/contracts/mocks/TokenCustomDecimalsMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/mocks/TokenMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/mocks/TokenMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/mocks/TokenMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/mocks/index.d.ts +1 -0
- package/dist/typechain-types/factories/contracts/mocks/index.js +3 -1
- package/dist/typechain-types/factories/contracts/mocks/index.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/ECDSATest__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/ECDSATest__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/ECDSATest__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/RevertReasonParserTest__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/RevertReasonParserTest__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/RevertReasonParserTest__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/StringUtilTest__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/StringUtilTest__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/StringUtilTest__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/AddressArrayMock__factory.d.ts +1 -5
- package/dist/typechain-types/factories/contracts/tests/mocks/AddressArrayMock__factory.js +1 -6
- package/dist/typechain-types/factories/contracts/tests/mocks/AddressArrayMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/AddressLibMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/AddressLibMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/AddressLibMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/AddressSetMock__factory.d.ts +11 -5
- package/dist/typechain-types/factories/contracts/tests/mocks/AddressSetMock__factory.js +14 -6
- package/dist/typechain-types/factories/contracts/tests/mocks/AddressSetMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/BySigTraitsMock__factory.d.ts +86 -0
- package/dist/typechain-types/factories/contracts/tests/mocks/BySigTraitsMock__factory.js +126 -0
- package/dist/typechain-types/factories/contracts/tests/mocks/BySigTraitsMock__factory.js.map +1 -0
- package/dist/typechain-types/factories/contracts/tests/mocks/BytesMemoryMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/BytesMemoryMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/BytesMemoryMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/BytesStorageMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/BytesStorageMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/BytesStorageMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/DaiLikePermitMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/DaiLikePermitMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/DaiLikePermitMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/ERC1271WalletMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/ERC1271WalletMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/ERC1271WalletMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/EthReceiverMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/EthReceiverMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/EthSenderMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/EthSenderMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/EthSenderMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/PermitAndCallMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/PermitAndCallMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/PermitAndCallMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/PermitableMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/PermitableMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/PermitableMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20NoReturnMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20NoReturnMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20NoReturnMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20PermitNoRevertMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20PermitNoRevertMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20PermitNoRevertMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20ReturnFalseMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20ReturnFalseMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20ReturnFalseMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20ReturnTrueMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20ReturnTrueMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20ReturnTrueMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20ThroughZeroApprove__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20ThroughZeroApprove__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20ThroughZeroApprove__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20WithSafeBalance__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20WithSafeBalance__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/ERC20WithSafeBalance__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/Permit2ReturnTrueMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/Permit2ReturnTrueMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/Permit2ReturnTrueMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/SafeERC20Wrapper__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/SafeERC20Wrapper__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/SafeERC20Wrapper__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/SafeWETHWrapper__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/SafeWETHWrapper__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/SafeERC20Helper.sol/SafeWETHWrapper__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/TokenWithBySig__factory.d.ts +675 -0
- package/dist/typechain-types/factories/contracts/tests/mocks/TokenWithBySig__factory.js +893 -0
- package/dist/typechain-types/factories/contracts/tests/mocks/TokenWithBySig__factory.js.map +1 -0
- package/dist/typechain-types/factories/contracts/tests/mocks/USDCLikePermitMock__factory.d.ts +481 -0
- package/dist/typechain-types/factories/contracts/tests/mocks/USDCLikePermitMock__factory.js +640 -0
- package/dist/typechain-types/factories/contracts/tests/mocks/USDCLikePermitMock__factory.js.map +1 -0
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ERC20Capitals__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ERC20Capitals__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ERC20Capitals__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ERC20bytes32Capitals__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ERC20bytes32Capitals__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ERC20bytes32Capitals__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ERC20bytes32__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ERC20bytes32__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ERC20bytes32__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ETHBadReceiver__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ETHBadReceiver__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/ETHBadReceiver__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/UniERC20Wrapper__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/UniERC20Wrapper__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/UniERC20Helper.sol/UniERC20Wrapper__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/WETH__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/WETH__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/WETH__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/WethReceiverMock__factory.d.ts +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/WethReceiverMock__factory.js +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/WethReceiverMock__factory.js.map +1 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/index.d.ts +3 -0
- package/dist/typechain-types/factories/contracts/tests/mocks/index.js +7 -1
- package/dist/typechain-types/factories/contracts/tests/mocks/index.js.map +1 -1
- package/dist/typechain-types/index.d.ts +24 -6
- package/dist/typechain-types/index.js +26 -8
- package/dist/typechain-types/index.js.map +1 -1
- package/package.json +23 -18
- package/utils/README.md +180 -0
- package/utils/docify.utils.js +3 -3
- package/utils/file-dependencies.js +0 -0
- package/utils/test-docgen.js +0 -0
- package/contracts/EthReceiver.sol +0 -16
- package/contracts/OnlyWethReceiver.sol +0 -17
- package/contracts/PermitAndCall.sol +0 -28
- package/dist/typechain-types/contracts/EthReceiver.js.map +0 -1
- package/dist/typechain-types/contracts/OnlyWethReceiver.js.map +0 -1
- package/dist/typechain-types/contracts/PermitAndCall.js.map +0 -1
- package/dist/typechain-types/factories/contracts/EthReceiver__factory.js.map +0 -1
- package/dist/typechain-types/factories/contracts/OnlyWethReceiver__factory.js.map +0 -1
- package/dist/typechain-types/factories/contracts/PermitAndCall__factory.js.map +0 -1
- /package/dist/typechain-types/contracts/{EthReceiver.js → mixins/EthReceiver.js} +0 -0
- /package/dist/typechain-types/contracts/{OnlyWethReceiver.js → mixins/OnlyWethReceiver.js} +0 -0
- /package/dist/typechain-types/contracts/{PermitAndCall.js → mixins/PermitAndCall.js} +0 -0
- /package/dist/typechain-types/factories/contracts/{EthReceiver__factory.js → mixins/EthReceiver__factory.js} +0 -0
- /package/dist/typechain-types/factories/contracts/{OnlyWethReceiver__factory.js → mixins/OnlyWethReceiver__factory.js} +0 -0
- /package/dist/typechain-types/factories/contracts/{PermitAndCall__factory.js → mixins/PermitAndCall__factory.js} +0 -0
|
@@ -2,98 +2,227 @@
|
|
|
2
2
|
|
|
3
3
|
pragma solidity ^0.8.0;
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* @title AddressArray
|
|
7
|
+
* @notice Implements a dynamic array of addresses using a mapping for storage efficiency, with the array length stored at index 0.
|
|
8
|
+
* @dev This library provides basic functionalities such as push, pop, set, and retrieval of addresses in a storage-efficient manner.
|
|
9
|
+
*/
|
|
6
10
|
library AddressArray {
|
|
11
|
+
/**
|
|
12
|
+
* @dev Error thrown when attempting to access an index outside the bounds of the array.
|
|
13
|
+
*/
|
|
7
14
|
error IndexOutOfBounds();
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @dev Error thrown when attempting to pop an element from an empty array.
|
|
18
|
+
*/
|
|
8
19
|
error PopFromEmptyArray();
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @dev Error thrown when the output array provided for getting the list of addresses is too small.
|
|
23
|
+
*/
|
|
9
24
|
error OutputArrayTooSmall();
|
|
10
25
|
|
|
11
|
-
|
|
26
|
+
uint256 internal constant _ZERO_ADDRESS = 0x8000000000000000000000000000000000000000000000000000000000000000; // Next tx gas optimization
|
|
27
|
+
uint256 internal constant _LENGTH_MASK = 0x0000000000000000ffffffff0000000000000000000000000000000000000000;
|
|
28
|
+
uint256 internal constant _ADDRESS_MASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff;
|
|
29
|
+
uint256 internal constant _ONE_LENGTH = 0x0000000000000000000000010000000000000000000000000000000000000000;
|
|
30
|
+
uint256 internal constant _LENGTH_OFFSET = 160;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @dev Struct containing the raw mapping used to store the addresses and the array length.
|
|
34
|
+
*/
|
|
12
35
|
struct Data {
|
|
13
|
-
|
|
36
|
+
uint256[1 << 32] _raw;
|
|
14
37
|
}
|
|
15
38
|
|
|
16
|
-
|
|
39
|
+
/**
|
|
40
|
+
* @notice Returns the number of addresses stored in the array.
|
|
41
|
+
* @param self The instance of the Data struct.
|
|
42
|
+
* @return The number of addresses.
|
|
43
|
+
*/
|
|
17
44
|
function length(Data storage self) internal view returns (uint256) {
|
|
18
|
-
return self._raw[0] >>
|
|
45
|
+
return (self._raw[0] & _LENGTH_MASK) >> _LENGTH_OFFSET;
|
|
19
46
|
}
|
|
20
47
|
|
|
21
|
-
|
|
48
|
+
/**
|
|
49
|
+
* @notice Retrieves the address at a specified index in the array.
|
|
50
|
+
* @param self The instance of the Data struct.
|
|
51
|
+
* @param i The index to retrieve the address from.
|
|
52
|
+
* @return The address stored at the specified index.
|
|
53
|
+
*/
|
|
22
54
|
function at(Data storage self, uint256 i) internal view returns (address) {
|
|
23
|
-
|
|
55
|
+
if (i >= 1 << 32) revert IndexOutOfBounds();
|
|
56
|
+
return address(uint160(self._raw[i] & _ADDRESS_MASK));
|
|
24
57
|
}
|
|
25
58
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
59
|
+
/**
|
|
60
|
+
* @notice Returns all addresses in the array from storage.
|
|
61
|
+
* @param self The instance of the Data struct.
|
|
62
|
+
* @return output Array containing all the addresses.
|
|
63
|
+
*/
|
|
64
|
+
function get(Data storage self) internal view returns (address[] memory output) {
|
|
65
|
+
assembly ("memory-safe") { // solhint-disable-line no-inline-assembly
|
|
66
|
+
let lengthAndFirst := sload(self.slot)
|
|
67
|
+
let len := shr(_LENGTH_OFFSET, and(lengthAndFirst, _LENGTH_MASK))
|
|
68
|
+
let fst := and(lengthAndFirst, _ADDRESS_MASK)
|
|
32
69
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
70
|
+
// Allocate array
|
|
71
|
+
output := mload(0x40)
|
|
72
|
+
mstore(0x40, add(output, mul(0x20, add(1, len))))
|
|
73
|
+
mstore(output, len)
|
|
74
|
+
|
|
75
|
+
if len {
|
|
76
|
+
// Copy first element and then the rest in a loop
|
|
77
|
+
let ptr := add(output, 0x20)
|
|
78
|
+
mstore(ptr, fst)
|
|
79
|
+
for { let i := 1 } lt(i, len) { i:= add(i, 1) } {
|
|
80
|
+
let item := and(sload(add(self.slot, i)), _ADDRESS_MASK)
|
|
81
|
+
mstore(add(ptr, mul(0x20, i)), item)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
36
85
|
}
|
|
37
86
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
87
|
+
/**
|
|
88
|
+
* @notice Copies the addresses into the provided output array.
|
|
89
|
+
* @param self The instance of the Data struct.
|
|
90
|
+
* @param input The array to copy the addresses into.
|
|
91
|
+
* @return output The provided output array filled with addresses.
|
|
92
|
+
*/
|
|
93
|
+
function get(Data storage self, address[] memory input) internal view returns (address[] memory output) {
|
|
94
|
+
output = input;
|
|
95
|
+
bytes4 err = OutputArrayTooSmall.selector;
|
|
96
|
+
assembly ("memory-safe") { // solhint-disable-line no-inline-assembly
|
|
97
|
+
let lengthAndFirst := sload(self.slot)
|
|
98
|
+
let len := shr(_LENGTH_OFFSET, and(lengthAndFirst, _LENGTH_MASK))
|
|
99
|
+
let fst := and(lengthAndFirst, _ADDRESS_MASK)
|
|
100
|
+
|
|
101
|
+
if gt(len, mload(input)) {
|
|
102
|
+
mstore(0, err)
|
|
103
|
+
revert(0, 4)
|
|
104
|
+
}
|
|
105
|
+
if len {
|
|
106
|
+
// Copy first element and then the rest in a loop
|
|
107
|
+
let ptr := add(output, 0x20)
|
|
108
|
+
mstore(ptr, fst)
|
|
109
|
+
for { let i := 1 } lt(i, len) { i:= add(i, 1) } {
|
|
110
|
+
let item := and(sload(add(self.slot, i)), _ADDRESS_MASK)
|
|
111
|
+
mstore(add(ptr, mul(0x20, i)), item)
|
|
50
112
|
}
|
|
51
113
|
}
|
|
52
114
|
}
|
|
53
|
-
return output;
|
|
54
115
|
}
|
|
55
116
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
117
|
+
/**
|
|
118
|
+
* @notice Adds an address to the end of the array.
|
|
119
|
+
* @param self The instance of the Data struct.
|
|
120
|
+
* @param account The address to add.
|
|
121
|
+
* @return res The new length of the array.
|
|
122
|
+
*/
|
|
123
|
+
function push(Data storage self, address account) internal returns (uint256 res) {
|
|
124
|
+
assembly ("memory-safe") { // solhint-disable-line no-inline-assembly
|
|
125
|
+
let lengthAndFirst := sload(self.slot)
|
|
126
|
+
let len := shr(_LENGTH_OFFSET, and(lengthAndFirst, _LENGTH_MASK))
|
|
127
|
+
|
|
128
|
+
switch len
|
|
129
|
+
case 0 {
|
|
130
|
+
sstore(self.slot, or(account, _ONE_LENGTH))
|
|
131
|
+
}
|
|
132
|
+
default {
|
|
133
|
+
sstore(self.slot, add(lengthAndFirst, _ONE_LENGTH))
|
|
134
|
+
sstore(add(self.slot, len), or(account, _ZERO_ADDRESS))
|
|
66
135
|
}
|
|
67
|
-
|
|
136
|
+
res := add(len, 1)
|
|
68
137
|
}
|
|
69
138
|
}
|
|
70
139
|
|
|
71
|
-
|
|
140
|
+
/**
|
|
141
|
+
* @notice Removes the last address from the array.
|
|
142
|
+
* @param self The instance of the Data struct.
|
|
143
|
+
*/
|
|
72
144
|
function pop(Data storage self) internal {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
145
|
+
bytes4 err = PopFromEmptyArray.selector;
|
|
146
|
+
assembly ("memory-safe") { // solhint-disable-line no-inline-assembly
|
|
147
|
+
let lengthAndFirst := sload(self.slot)
|
|
148
|
+
let len := shr(_LENGTH_OFFSET, and(lengthAndFirst, _LENGTH_MASK))
|
|
149
|
+
|
|
150
|
+
switch len
|
|
151
|
+
case 0 {
|
|
152
|
+
mstore(0, err)
|
|
153
|
+
revert(0, 4)
|
|
154
|
+
}
|
|
155
|
+
case 1 {
|
|
156
|
+
sstore(self.slot, _ZERO_ADDRESS)
|
|
157
|
+
}
|
|
158
|
+
default {
|
|
159
|
+
sstore(self.slot, sub(lengthAndFirst, _ONE_LENGTH))
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* @notice Array pop back operation for storage `self` that returns popped element.
|
|
166
|
+
* @param self The instance of the Data struct.
|
|
167
|
+
* @return res The address that was removed from the array.
|
|
168
|
+
*/
|
|
169
|
+
function popGet(Data storage self) internal returns(address res) {
|
|
170
|
+
bytes4 err = PopFromEmptyArray.selector;
|
|
171
|
+
assembly ("memory-safe") { // solhint-disable-line no-inline-assembly
|
|
172
|
+
let lengthAndFirst := sload(self.slot)
|
|
173
|
+
let len := shr(_LENGTH_OFFSET, and(lengthAndFirst, _LENGTH_MASK))
|
|
174
|
+
|
|
175
|
+
switch len
|
|
176
|
+
case 0 {
|
|
177
|
+
mstore(0, err)
|
|
178
|
+
revert(0, 4)
|
|
179
|
+
}
|
|
180
|
+
case 1 {
|
|
181
|
+
res := and(lengthAndFirst, _ADDRESS_MASK)
|
|
182
|
+
sstore(self.slot, _ZERO_ADDRESS)
|
|
183
|
+
}
|
|
184
|
+
default {
|
|
185
|
+
res := and(sload(add(self.slot, sub(len, 1))), _ADDRESS_MASK)
|
|
186
|
+
sstore(self.slot, sub(lengthAndFirst, _ONE_LENGTH))
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* @notice Sets the address at a specified index in the array.
|
|
193
|
+
* @param self The instance of the Data struct.
|
|
194
|
+
* @param index The index at which to set the address.
|
|
195
|
+
* @param account The address to set at the specified index.
|
|
196
|
+
*/
|
|
197
|
+
function set(Data storage self, uint256 index, address account) internal {
|
|
198
|
+
bytes4 err = IndexOutOfBounds.selector;
|
|
199
|
+
assembly ("memory-safe") { // solhint-disable-line no-inline-assembly
|
|
200
|
+
let lengthAndFirst := sload(self.slot)
|
|
201
|
+
let len := shr(_LENGTH_OFFSET, and(lengthAndFirst, _LENGTH_MASK))
|
|
202
|
+
let fst := and(lengthAndFirst, _ADDRESS_MASK)
|
|
203
|
+
|
|
204
|
+
if iszero(lt(index, len)) {
|
|
205
|
+
mstore(0, err)
|
|
206
|
+
revert(0, 4)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
switch index
|
|
210
|
+
case 0 {
|
|
211
|
+
sstore(self.slot, or(xor(lengthAndFirst, fst), account))
|
|
212
|
+
}
|
|
213
|
+
default {
|
|
214
|
+
sstore(add(self.slot, index), or(account, _ZERO_ADDRESS))
|
|
80
215
|
}
|
|
81
216
|
}
|
|
82
217
|
}
|
|
83
218
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (index >= len) revert IndexOutOfBounds();
|
|
92
|
-
|
|
93
|
-
if (index == 0) {
|
|
94
|
-
self._raw[0] = (len << 160) | uint160(account);
|
|
95
|
-
} else {
|
|
96
|
-
self._raw[index] = uint160(account);
|
|
219
|
+
/**
|
|
220
|
+
* @notice Erase length of the array.
|
|
221
|
+
* @param self The instance of the Data struct.
|
|
222
|
+
*/
|
|
223
|
+
function erase(Data storage self) internal {
|
|
224
|
+
assembly ("memory-safe") { // solhint-disable-line no-inline-assembly
|
|
225
|
+
sstore(self.slot, _ADDRESS_MASK)
|
|
97
226
|
}
|
|
98
227
|
}
|
|
99
228
|
}
|
|
@@ -5,7 +5,8 @@ pragma solidity ^0.8.0;
|
|
|
5
5
|
type Address is uint256;
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* @
|
|
8
|
+
* @notice AddressLib
|
|
9
|
+
* @notice Library for working with addresses encoded as uint256 values, which can include flags in the highest bits.
|
|
9
10
|
*/
|
|
10
11
|
library AddressLib {
|
|
11
12
|
uint256 private constant _LOW_160_BIT_MASK = (1 << 160) - 1;
|
|
@@ -4,16 +4,18 @@ pragma solidity ^0.8.0;
|
|
|
4
4
|
|
|
5
5
|
import "./AddressArray.sol";
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* 3. contains
|
|
7
|
+
/**
|
|
8
|
+
* @title AddressSet
|
|
9
|
+
* @notice Library for managing sets of addresses, allowing operations such as add, remove, and contains.
|
|
10
|
+
* Utilizes the AddressArray library for underlying data storage.
|
|
12
11
|
*/
|
|
13
12
|
library AddressSet {
|
|
14
13
|
using AddressArray for AddressArray.Data;
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
uint256 internal constant _NULL_INDEX = type(uint256).max;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @dev Data struct from AddressArray.Data items
|
|
17
19
|
* and lookup mapping address => index in data array.
|
|
18
20
|
*/
|
|
19
21
|
struct Data {
|
|
@@ -21,45 +23,107 @@ library AddressSet {
|
|
|
21
23
|
mapping(address => uint256) lookup;
|
|
22
24
|
}
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
/**
|
|
27
|
+
* @notice Determines the number of addresses in the set.
|
|
28
|
+
* @param s The set of addresses.
|
|
29
|
+
* @return The number of addresses in the set.
|
|
30
|
+
*/
|
|
25
31
|
function length(Data storage s) internal view returns (uint256) {
|
|
26
32
|
return s.items.length();
|
|
27
33
|
}
|
|
28
34
|
|
|
29
|
-
|
|
35
|
+
/**
|
|
36
|
+
* @notice Retrieves the address at a specified index in the set.
|
|
37
|
+
* @param s The set of addresses.
|
|
38
|
+
* @param index The index of the address to retrieve.
|
|
39
|
+
* @return The address at the specified index.
|
|
40
|
+
*/
|
|
30
41
|
function at(Data storage s, uint256 index) internal view returns (address) {
|
|
31
42
|
return s.items.at(index);
|
|
32
43
|
}
|
|
33
44
|
|
|
34
|
-
|
|
45
|
+
/**
|
|
46
|
+
* @notice Checks if the set contains the specified address.
|
|
47
|
+
* @param s The set of addresses.
|
|
48
|
+
* @param item The address to check for.
|
|
49
|
+
* @return True if the set contains the address, false otherwise.
|
|
50
|
+
*/
|
|
35
51
|
function contains(Data storage s, address item) internal view returns (bool) {
|
|
36
|
-
|
|
52
|
+
uint256 index = s.lookup[item];
|
|
53
|
+
return index != 0 && index != _NULL_INDEX;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @notice Returns list of addresses from storage `s`.
|
|
58
|
+
* @param s The set of addresses.
|
|
59
|
+
* @return The array of addresses stored in `s`.
|
|
60
|
+
*/
|
|
61
|
+
function get(Data storage s) internal view returns (address[] memory) {
|
|
62
|
+
return s.items.get();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @notice Puts list of addresses from `s` storage into `output` array.
|
|
67
|
+
* @param s The set of addresses.
|
|
68
|
+
* @return The provided output array filled with addresses.
|
|
69
|
+
*/
|
|
70
|
+
function get(Data storage s, address[] memory input) internal view returns (address[] memory) {
|
|
71
|
+
return s.items.get(input);
|
|
37
72
|
}
|
|
38
73
|
|
|
39
|
-
|
|
74
|
+
/**
|
|
75
|
+
* @notice Adds an address to the set if it is not already present.
|
|
76
|
+
* @param s The set of addresses.
|
|
77
|
+
* @param item The address to add.
|
|
78
|
+
* @return True if the address was added to the set, false if it was already present.
|
|
79
|
+
*/
|
|
40
80
|
function add(Data storage s, address item) internal returns (bool) {
|
|
41
|
-
|
|
81
|
+
uint256 index = s.lookup[item];
|
|
82
|
+
if (index != 0 && index != _NULL_INDEX) {
|
|
42
83
|
return false;
|
|
43
84
|
}
|
|
44
85
|
s.lookup[item] = s.items.push(item);
|
|
45
86
|
return true;
|
|
46
87
|
}
|
|
47
88
|
|
|
48
|
-
|
|
89
|
+
/**
|
|
90
|
+
* @notice Removes an address from the set if it exists.
|
|
91
|
+
* @param s The set of addresses.
|
|
92
|
+
* @param item The address to remove.
|
|
93
|
+
* @return True if the address was removed from the set, false if it was not found.
|
|
94
|
+
*/
|
|
49
95
|
function remove(Data storage s, address item) internal returns (bool) {
|
|
50
96
|
uint256 index = s.lookup[item];
|
|
51
|
-
|
|
97
|
+
s.lookup[item] = _NULL_INDEX;
|
|
98
|
+
if (index == 0 || index == _NULL_INDEX) {
|
|
52
99
|
return false;
|
|
53
100
|
}
|
|
54
|
-
|
|
101
|
+
|
|
102
|
+
address lastItem = s.items.popGet();
|
|
103
|
+
if (lastItem != item) {
|
|
55
104
|
unchecked {
|
|
56
|
-
address lastItem = s.items.at(s.items.length() - 1);
|
|
57
105
|
s.items.set(index - 1, lastItem);
|
|
58
106
|
s.lookup[lastItem] = index;
|
|
59
107
|
}
|
|
60
108
|
}
|
|
61
|
-
s.items.pop();
|
|
62
|
-
delete s.lookup[item];
|
|
63
109
|
return true;
|
|
64
110
|
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @notice Erases set from storage `s`.
|
|
114
|
+
* @param s The set of addresses.
|
|
115
|
+
* @return items All removed items.
|
|
116
|
+
*/
|
|
117
|
+
function erase(Data storage s) internal returns(address[] memory items) {
|
|
118
|
+
items = s.items.get();
|
|
119
|
+
uint256 len = items.length;
|
|
120
|
+
if (len > 0) {
|
|
121
|
+
s.items.erase();
|
|
122
|
+
unchecked {
|
|
123
|
+
for (uint256 i = 0; i < len; i++) {
|
|
124
|
+
s.lookup[items[i]] = _NULL_INDEX;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
65
129
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
pragma solidity ^0.8.0;
|
|
4
|
+
|
|
5
|
+
library BySigTraits {
|
|
6
|
+
error WrongNonceType();
|
|
7
|
+
|
|
8
|
+
// 2 bits for type
|
|
9
|
+
// 6 bits reserved for future use
|
|
10
|
+
// 40 bits for deadline
|
|
11
|
+
// 80 bits for relayer address lower bits
|
|
12
|
+
// 128 bits for nonce value
|
|
13
|
+
type Value is uint256;
|
|
14
|
+
|
|
15
|
+
enum NonceType {
|
|
16
|
+
Account,
|
|
17
|
+
Selector,
|
|
18
|
+
Unique
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
uint256 constant internal TYPE_BIT_SHIFT = 254;
|
|
22
|
+
uint256 constant internal DEADLINE_BIT_SHIFT = 208;
|
|
23
|
+
uint256 constant internal DEADLINE_BIT_MASK = (1 << 40) - 1;
|
|
24
|
+
uint256 constant internal RELAYER_BIT_SHIFT = 128;
|
|
25
|
+
uint256 constant internal RELAYER_BIT_MASK = (1 << 80) - 1;
|
|
26
|
+
uint256 constant internal NONCE_MASK = (1 << 128) - 1;
|
|
27
|
+
|
|
28
|
+
function nonceType(Value traits) internal pure returns(NonceType) {
|
|
29
|
+
uint256 _type = Value.unwrap(traits) >> TYPE_BIT_SHIFT;
|
|
30
|
+
if (_type > uint256(NonceType.Unique)) revert WrongNonceType();
|
|
31
|
+
return NonceType(_type);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function deadline(Value traits) internal pure returns(uint256) {
|
|
35
|
+
return (Value.unwrap(traits) >> DEADLINE_BIT_SHIFT) & DEADLINE_BIT_MASK;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function isRelayerAllowed(Value traits, address relayer) internal pure returns(bool) {
|
|
39
|
+
uint256 relayerBits = (Value.unwrap(traits) >> RELAYER_BIT_SHIFT) & RELAYER_BIT_MASK;
|
|
40
|
+
return relayerBits == 0 || (uint160(relayer) & RELAYER_BIT_MASK) == relayerBits;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function nonce(Value traits) internal pure returns(uint256) {
|
|
44
|
+
return Value.unwrap(traits) & NONCE_MASK;
|
|
45
|
+
}
|
|
46
|
+
}
|