@sudobility/contracts 1.16.4 → 1.17.10
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 +16 -2
- package/artifacts/contracts/Mailer.sol/Mailer.d.ts +242 -16
- package/artifacts/contracts/Mailer.sol/Mailer.dbg.json +1 -1
- package/artifacts/contracts/Mailer.sol/Mailer.json +237 -11
- package/artifacts/contracts/MockUSDC.sol/MockUSDC.d.ts +2 -2
- package/artifacts/contracts/MockUSDC.sol/MockUSDC.dbg.json +1 -1
- package/artifacts/contracts/MockUSDC.sol/MockUSDC.json +2 -2
- package/artifacts/contracts/examples/MailerIntegrationExample.sol/MailerIntegrationExample.d.ts +299 -0
- package/artifacts/contracts/examples/MailerIntegrationExample.sol/MailerIntegrationExample.dbg.json +4 -0
- package/artifacts/contracts/examples/MailerIntegrationExample.sol/MailerIntegrationExample.json +249 -0
- package/artifacts/contracts/examples/MailerIntegrationExample.sol/artifacts.d.ts +21 -0
- package/artifacts/contracts/interfaces/IERC20.sol/IERC20.dbg.json +1 -1
- package/artifacts/contracts/interfaces/IMailer.sol/IMailer.d.ts +216 -0
- package/artifacts/contracts/interfaces/IMailer.sol/IMailer.dbg.json +4 -0
- package/artifacts/contracts/interfaces/IMailer.sol/IMailer.json +166 -0
- package/artifacts/contracts/interfaces/IMailer.sol/artifacts.d.ts +21 -0
- package/contracts/Mailer.sol +922 -0
- package/contracts/MockUSDC.sol +106 -0
- package/contracts/examples/MailerIntegrationExample.sol +189 -0
- package/contracts/interfaces/IERC20.sol +33 -0
- package/contracts/interfaces/IMailer.sol +86 -0
- package/dist/evm/src/evm/evm-mailer-client.d.ts +184 -8
- package/dist/evm/src/evm/evm-mailer-client.d.ts.map +1 -1
- package/dist/evm/src/evm/evm-mailer-client.js +3 -2
- package/dist/evm/src/evm/evm-mailer-client.js.map +1 -1
- package/dist/evm/src/evm/index.d.ts +2 -2
- package/dist/evm/src/evm/index.d.ts.map +1 -1
- package/dist/evm/src/evm/index.js +1 -1
- package/dist/evm/src/evm/index.js.map +1 -1
- package/dist/evm/typechain-types/@openzeppelin/contracts/index.d.ts +7 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.d.ts +66 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.d.ts +26 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.d.ts +2 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/index.d.ts +4 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/interfaces/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.d.ts +21 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.d.ts +2 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.d.ts +26 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/beacon/index.d.ts +2 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/beacon/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/beacon/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/beacon/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/index.d.ts +5 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/proxy/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/Address.d.ts +21 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/Address.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/Address.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/Address.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/Errors.d.ts +21 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/Errors.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/Errors.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/Errors.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/index.d.ts +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts/utils/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.d.ts +69 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/access/index.d.ts +2 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/access/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/access/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/index.d.ts +7 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.d.ts +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.d.ts +37 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.d.ts +74 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.d.ts +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.d.ts +37 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.d.ts +2 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.js.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/index.d.ts +5 -0
- package/dist/evm/typechain-types/@openzeppelin/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/@openzeppelin/index.js +3 -0
- package/dist/evm/typechain-types/@openzeppelin/index.js.map +1 -0
- package/dist/evm/typechain-types/{Mailer.d.ts → contracts/Mailer.d.ts} +135 -21
- package/dist/evm/typechain-types/contracts/Mailer.d.ts.map +1 -0
- package/dist/evm/typechain-types/contracts/Mailer.js.map +1 -0
- package/dist/evm/typechain-types/{MockUSDC.d.ts → contracts/MockUSDC.d.ts} +1 -1
- package/dist/evm/typechain-types/contracts/MockUSDC.d.ts.map +1 -0
- package/dist/evm/typechain-types/contracts/MockUSDC.js.map +1 -0
- package/dist/evm/typechain-types/contracts/examples/MailerIntegrationExample.d.ts +170 -0
- package/dist/evm/typechain-types/contracts/examples/MailerIntegrationExample.d.ts.map +1 -0
- package/dist/evm/typechain-types/contracts/examples/MailerIntegrationExample.js +3 -0
- package/dist/evm/typechain-types/contracts/examples/MailerIntegrationExample.js.map +1 -0
- package/dist/evm/typechain-types/contracts/examples/index.d.ts +2 -0
- package/dist/evm/typechain-types/contracts/examples/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/contracts/examples/index.js +3 -0
- package/dist/evm/typechain-types/contracts/examples/index.js.map +1 -0
- package/dist/evm/typechain-types/contracts/index.d.ts +7 -0
- package/dist/evm/typechain-types/contracts/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/contracts/index.js +3 -0
- package/dist/evm/typechain-types/contracts/index.js.map +1 -0
- package/dist/{unified/typechain-types → evm/typechain-types/contracts}/interfaces/IERC20.d.ts +1 -1
- package/dist/evm/typechain-types/contracts/interfaces/IERC20.d.ts.map +1 -0
- package/dist/evm/typechain-types/contracts/interfaces/IERC20.js.map +1 -0
- package/dist/evm/typechain-types/contracts/interfaces/IMailer.d.ts +118 -0
- package/dist/evm/typechain-types/contracts/interfaces/IMailer.d.ts.map +1 -0
- package/dist/evm/typechain-types/contracts/interfaces/IMailer.js +3 -0
- package/dist/evm/typechain-types/contracts/interfaces/IMailer.js.map +1 -0
- package/dist/evm/typechain-types/contracts/interfaces/index.d.ts +3 -0
- package/dist/evm/typechain-types/contracts/interfaces/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/contracts/interfaces/index.js +3 -0
- package/dist/evm/typechain-types/contracts/interfaces/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/index.d.ts +4 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/index.js +43 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.d.ts +43 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.js +65 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.d.ts +18 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.js +33 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.d.ts +2 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.js +9 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/index.d.ts +3 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/index.js +43 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/interfaces/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.d.ts +51 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.js +78 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.d.ts +2 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.js +9 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.d.ts +18 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.js +33 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.d.ts +2 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.js +9 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/index.d.ts +3 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/index.js +42 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/proxy/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.d.ts +31 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.js +51 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.d.ts +51 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.js +77 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/index.d.ts +3 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/index.js +11 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts/utils/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.d.ts +83 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.js +117 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.d.ts +2 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.js +9 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.d.ts +4 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.js +43 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.d.ts +2 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.js +41 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.d.ts +26 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.js +43 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.d.ts +106 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.js +148 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.d.ts +3 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.js +11 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.d.ts +26 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.js +43 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.d.ts +2 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.js +9 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/index.d.ts +3 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/index.js +42 -0
- package/dist/evm/typechain-types/factories/@openzeppelin/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/Mailer__factory.d.ts +1061 -0
- package/dist/evm/typechain-types/factories/contracts/Mailer__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/Mailer__factory.js +1364 -0
- package/dist/evm/typechain-types/factories/contracts/Mailer__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/{MockUSDC__factory.d.ts → contracts/MockUSDC__factory.d.ts} +3 -3
- package/dist/evm/typechain-types/factories/contracts/MockUSDC__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/{MockUSDC__factory.js → contracts/MockUSDC__factory.js} +1 -1
- package/dist/evm/typechain-types/factories/contracts/MockUSDC__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/examples/MailerIntegrationExample__factory.d.ts +209 -0
- package/dist/evm/typechain-types/factories/contracts/examples/MailerIntegrationExample__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/examples/MailerIntegrationExample__factory.js +278 -0
- package/dist/evm/typechain-types/factories/contracts/examples/MailerIntegrationExample__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/examples/index.d.ts +2 -0
- package/dist/evm/typechain-types/factories/contracts/examples/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/examples/index.js +9 -0
- package/dist/evm/typechain-types/factories/contracts/examples/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/index.d.ts +5 -0
- package/dist/evm/typechain-types/factories/contracts/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/index.js +46 -0
- package/dist/evm/typechain-types/factories/contracts/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/{interfaces → contracts/interfaces}/IERC20__factory.d.ts +1 -1
- package/dist/evm/typechain-types/factories/contracts/interfaces/IERC20__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/interfaces/IERC20__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/interfaces/IMailer__factory.d.ts +130 -0
- package/dist/evm/typechain-types/factories/contracts/interfaces/IMailer__factory.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/interfaces/IMailer__factory.js +175 -0
- package/dist/evm/typechain-types/factories/contracts/interfaces/IMailer__factory.js.map +1 -0
- package/dist/evm/typechain-types/factories/contracts/interfaces/index.d.ts +3 -0
- package/dist/evm/typechain-types/factories/contracts/interfaces/index.d.ts.map +1 -0
- package/dist/evm/typechain-types/factories/{interfaces → contracts/interfaces}/index.js +3 -1
- package/dist/evm/typechain-types/factories/contracts/interfaces/index.js.map +1 -0
- package/dist/evm/typechain-types/factories/index.d.ts +2 -3
- package/dist/evm/typechain-types/factories/index.d.ts.map +1 -1
- package/dist/evm/typechain-types/factories/index.js +3 -6
- package/dist/evm/typechain-types/factories/index.js.map +1 -1
- package/dist/evm/typechain-types/index.d.ts +34 -8
- package/dist/evm/typechain-types/index.d.ts.map +1 -1
- package/dist/evm/typechain-types/index.js +28 -4
- package/dist/evm/typechain-types/index.js.map +1 -1
- package/dist/unified/src/evm/evm-mailer-client.d.ts +184 -8
- package/dist/unified/src/evm/evm-mailer-client.d.ts.map +1 -1
- package/dist/unified/src/evm/evm-mailer-client.js +3 -2
- package/dist/unified/src/evm/evm-mailer-client.js.map +1 -1
- package/dist/unified/src/evm/index.d.ts +2 -2
- package/dist/unified/src/evm/index.d.ts.map +1 -1
- package/dist/unified/src/evm/index.js +1 -1
- package/dist/unified/src/evm/index.js.map +1 -1
- package/dist/unified/typechain-types/@openzeppelin/contracts/index.d.ts +7 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.d.ts +66 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.d.ts +26 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.d.ts +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/index.d.ts +4 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/interfaces/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.d.ts +21 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.d.ts +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.d.ts +26 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/beacon/index.d.ts +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/beacon/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/beacon/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/beacon/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/index.d.ts +5 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/proxy/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/Address.d.ts +21 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/Address.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/Address.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/Address.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/Errors.d.ts +21 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/Errors.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/Errors.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/Errors.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/index.d.ts +3 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts/utils/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.d.ts +69 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/access/index.d.ts +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/access/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/access/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/index.d.ts +7 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.d.ts +3 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.d.ts +37 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.d.ts +74 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.d.ts +3 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.d.ts +37 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.d.ts +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.js.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/index.d.ts +5 -0
- package/dist/unified/typechain-types/@openzeppelin/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/@openzeppelin/index.js +2 -0
- package/dist/unified/typechain-types/@openzeppelin/index.js.map +1 -0
- package/dist/unified/typechain-types/{Mailer.d.ts → contracts/Mailer.d.ts} +135 -21
- package/dist/unified/typechain-types/contracts/Mailer.d.ts.map +1 -0
- package/dist/unified/typechain-types/contracts/Mailer.js.map +1 -0
- package/dist/unified/typechain-types/{MockUSDC.d.ts → contracts/MockUSDC.d.ts} +1 -1
- package/dist/unified/typechain-types/contracts/MockUSDC.d.ts.map +1 -0
- package/dist/unified/typechain-types/contracts/MockUSDC.js.map +1 -0
- package/dist/unified/typechain-types/contracts/examples/MailerIntegrationExample.d.ts +170 -0
- package/dist/unified/typechain-types/contracts/examples/MailerIntegrationExample.d.ts.map +1 -0
- package/dist/unified/typechain-types/contracts/examples/MailerIntegrationExample.js +2 -0
- package/dist/unified/typechain-types/contracts/examples/MailerIntegrationExample.js.map +1 -0
- package/dist/unified/typechain-types/contracts/examples/index.d.ts +2 -0
- package/dist/unified/typechain-types/contracts/examples/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/contracts/examples/index.js +2 -0
- package/dist/unified/typechain-types/contracts/examples/index.js.map +1 -0
- package/dist/unified/typechain-types/contracts/index.d.ts +7 -0
- package/dist/unified/typechain-types/contracts/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/contracts/index.js +2 -0
- package/dist/unified/typechain-types/contracts/index.js.map +1 -0
- package/dist/{evm/typechain-types → unified/typechain-types/contracts}/interfaces/IERC20.d.ts +1 -1
- package/dist/unified/typechain-types/contracts/interfaces/IERC20.d.ts.map +1 -0
- package/dist/unified/typechain-types/contracts/interfaces/IERC20.js.map +1 -0
- package/dist/unified/typechain-types/contracts/interfaces/IMailer.d.ts +118 -0
- package/dist/unified/typechain-types/contracts/interfaces/IMailer.d.ts.map +1 -0
- package/dist/unified/typechain-types/contracts/interfaces/IMailer.js +2 -0
- package/dist/unified/typechain-types/contracts/interfaces/IMailer.js.map +1 -0
- package/dist/unified/typechain-types/contracts/interfaces/index.d.ts +3 -0
- package/dist/unified/typechain-types/contracts/interfaces/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/contracts/interfaces/index.js +2 -0
- package/dist/unified/typechain-types/contracts/interfaces/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/index.d.ts +4 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/index.js +7 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.d.ts +43 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.js +61 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.d.ts +18 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.js +29 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.d.ts +2 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.js +5 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/index.d.ts +3 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/index.js +6 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/interfaces/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.d.ts +51 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.js +74 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.d.ts +2 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.js +5 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.d.ts +18 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.js +29 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.d.ts +2 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.js +5 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/index.d.ts +3 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/index.js +6 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/proxy/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.d.ts +31 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.js +47 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.d.ts +51 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.js +73 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/index.d.ts +3 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/index.js +6 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts/utils/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.d.ts +83 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.js +113 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.d.ts +2 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.js +5 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.d.ts +4 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.js +7 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.d.ts +2 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.js +5 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.d.ts +26 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.js +39 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.d.ts +106 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.js +144 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.d.ts +3 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.js +6 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.d.ts +26 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.js +39 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.d.ts +2 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.js +5 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/index.d.ts +3 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/index.js +6 -0
- package/dist/unified/typechain-types/factories/@openzeppelin/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/Mailer__factory.d.ts +1061 -0
- package/dist/unified/typechain-types/factories/contracts/Mailer__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/Mailer__factory.js +1360 -0
- package/dist/unified/typechain-types/factories/contracts/Mailer__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/{MockUSDC__factory.d.ts → contracts/MockUSDC__factory.d.ts} +3 -3
- package/dist/unified/typechain-types/factories/contracts/MockUSDC__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/{MockUSDC__factory.js → contracts/MockUSDC__factory.js} +1 -1
- package/dist/unified/typechain-types/factories/contracts/MockUSDC__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/examples/MailerIntegrationExample__factory.d.ts +209 -0
- package/dist/unified/typechain-types/factories/contracts/examples/MailerIntegrationExample__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/examples/MailerIntegrationExample__factory.js +274 -0
- package/dist/unified/typechain-types/factories/contracts/examples/MailerIntegrationExample__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/examples/index.d.ts +2 -0
- package/dist/unified/typechain-types/factories/contracts/examples/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/examples/index.js +5 -0
- package/dist/unified/typechain-types/factories/contracts/examples/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/index.d.ts +5 -0
- package/dist/unified/typechain-types/factories/contracts/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/index.js +8 -0
- package/dist/unified/typechain-types/factories/contracts/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/{interfaces → contracts/interfaces}/IERC20__factory.d.ts +1 -1
- package/dist/unified/typechain-types/factories/contracts/interfaces/IERC20__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/interfaces/IERC20__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/interfaces/IMailer__factory.d.ts +130 -0
- package/dist/unified/typechain-types/factories/contracts/interfaces/IMailer__factory.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/interfaces/IMailer__factory.js +171 -0
- package/dist/unified/typechain-types/factories/contracts/interfaces/IMailer__factory.js.map +1 -0
- package/dist/unified/typechain-types/factories/contracts/interfaces/index.d.ts +3 -0
- package/dist/unified/typechain-types/factories/contracts/interfaces/index.d.ts.map +1 -0
- package/dist/unified/typechain-types/factories/{interfaces → contracts/interfaces}/index.js +1 -0
- package/dist/unified/typechain-types/factories/contracts/interfaces/index.js.map +1 -0
- package/dist/unified/typechain-types/factories/index.d.ts +2 -3
- package/dist/unified/typechain-types/factories/index.d.ts.map +1 -1
- package/dist/unified/typechain-types/factories/index.js +2 -3
- package/dist/unified/typechain-types/factories/index.js.map +1 -1
- package/dist/unified/typechain-types/index.d.ts +34 -8
- package/dist/unified/typechain-types/index.d.ts.map +1 -1
- package/dist/unified/typechain-types/index.js +15 -3
- package/dist/unified/typechain-types/index.js.map +1 -1
- package/package.json +9 -3
- package/programs/mailer/Cargo.toml +13 -0
- package/programs/mailer/src/cpi.rs +330 -0
- package/programs/mailer/src/lib.rs +252 -114
- package/programs/mailer/tests/integration_tests.rs +8399 -146
- package/programs/mailer/tests/integration_tests.rs.backup +5124 -0
- package/programs/mailer-integration-example/Cargo.toml +23 -0
- package/programs/mailer-integration-example/src/lib.rs +362 -0
- package/typechain-types/@openzeppelin/contracts/index.ts +9 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.ts +168 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.ts +90 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/index.ts +6 -0
- package/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.ts +90 -0
- package/typechain-types/@openzeppelin/contracts/proxy/beacon/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts/proxy/index.ts +7 -0
- package/typechain-types/@openzeppelin/contracts/utils/Address.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/Errors.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/index.ts +5 -0
- package/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts +186 -0
- package/typechain-types/@openzeppelin/contracts-upgradeable/access/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts-upgradeable/index.ts +9 -0
- package/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.ts +5 -0
- package/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.ts +105 -0
- package/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.ts +196 -0
- package/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts +5 -0
- package/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.ts +105 -0
- package/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.ts +4 -0
- package/typechain-types/@openzeppelin/index.ts +7 -0
- package/typechain-types/{Mailer.ts → contracts/Mailer.ts} +237 -19
- package/typechain-types/{MockUSDC.ts → contracts/MockUSDC.ts} +1 -1
- package/typechain-types/contracts/examples/MailerIntegrationExample.ts +352 -0
- package/typechain-types/contracts/examples/index.ts +4 -0
- package/typechain-types/contracts/index.ts +9 -0
- package/typechain-types/{interfaces → contracts/interfaces}/IERC20.ts +1 -1
- package/typechain-types/contracts/interfaces/IMailer.ts +225 -0
- package/typechain-types/{interfaces → contracts/interfaces}/index.ts +1 -0
- package/typechain-types/factories/@openzeppelin/contracts/index.ts +6 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.ts +67 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.ts +38 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts +5 -0
- package/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.ts +105 -0
- package/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.ts +35 -0
- package/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts/proxy/index.ts +5 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.ts +75 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.ts +101 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/index.ts +5 -0
- package/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts +122 -0
- package/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.ts +6 -0
- package/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.ts +48 -0
- package/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.ts +153 -0
- package/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts +5 -0
- package/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.ts +48 -0
- package/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/index.ts +5 -0
- package/typechain-types/factories/contracts/Mailer__factory.ts +1385 -0
- package/typechain-types/factories/{MockUSDC__factory.ts → contracts/MockUSDC__factory.ts} +3 -3
- package/typechain-types/factories/contracts/examples/MailerIntegrationExample__factory.ts +330 -0
- package/typechain-types/factories/contracts/examples/index.ts +4 -0
- package/typechain-types/factories/contracts/index.ts +7 -0
- package/typechain-types/factories/{interfaces → contracts/interfaces}/IERC20__factory.ts +4 -1
- package/typechain-types/factories/contracts/interfaces/IMailer__factory.ts +177 -0
- package/typechain-types/factories/{interfaces → contracts/interfaces}/index.ts +1 -0
- package/typechain-types/factories/index.ts +2 -3
- package/typechain-types/hardhat.d.ts +216 -0
- package/typechain-types/index.ts +34 -8
- package/dist/evm/typechain-types/Mailer.d.ts.map +0 -1
- package/dist/evm/typechain-types/Mailer.js.map +0 -1
- package/dist/evm/typechain-types/MockUSDC.d.ts.map +0 -1
- package/dist/evm/typechain-types/MockUSDC.js.map +0 -1
- package/dist/evm/typechain-types/factories/Mailer__factory.d.ts +0 -885
- package/dist/evm/typechain-types/factories/Mailer__factory.d.ts.map +0 -1
- package/dist/evm/typechain-types/factories/Mailer__factory.js +0 -1138
- package/dist/evm/typechain-types/factories/Mailer__factory.js.map +0 -1
- package/dist/evm/typechain-types/factories/MockUSDC__factory.d.ts.map +0 -1
- package/dist/evm/typechain-types/factories/MockUSDC__factory.js.map +0 -1
- package/dist/evm/typechain-types/factories/interfaces/IERC20__factory.d.ts.map +0 -1
- package/dist/evm/typechain-types/factories/interfaces/IERC20__factory.js.map +0 -1
- package/dist/evm/typechain-types/factories/interfaces/index.d.ts +0 -2
- package/dist/evm/typechain-types/factories/interfaces/index.d.ts.map +0 -1
- package/dist/evm/typechain-types/factories/interfaces/index.js.map +0 -1
- package/dist/evm/typechain-types/interfaces/IERC20.d.ts.map +0 -1
- package/dist/evm/typechain-types/interfaces/IERC20.js.map +0 -1
- package/dist/evm/typechain-types/interfaces/index.d.ts +0 -2
- package/dist/evm/typechain-types/interfaces/index.d.ts.map +0 -1
- package/dist/evm/typechain-types/interfaces/index.js.map +0 -1
- package/dist/unified/typechain-types/Mailer.d.ts.map +0 -1
- package/dist/unified/typechain-types/Mailer.js.map +0 -1
- package/dist/unified/typechain-types/MockUSDC.d.ts.map +0 -1
- package/dist/unified/typechain-types/MockUSDC.js.map +0 -1
- package/dist/unified/typechain-types/factories/Mailer__factory.d.ts +0 -885
- package/dist/unified/typechain-types/factories/Mailer__factory.d.ts.map +0 -1
- package/dist/unified/typechain-types/factories/Mailer__factory.js +0 -1134
- package/dist/unified/typechain-types/factories/Mailer__factory.js.map +0 -1
- package/dist/unified/typechain-types/factories/MockUSDC__factory.d.ts.map +0 -1
- package/dist/unified/typechain-types/factories/MockUSDC__factory.js.map +0 -1
- package/dist/unified/typechain-types/factories/interfaces/IERC20__factory.d.ts.map +0 -1
- package/dist/unified/typechain-types/factories/interfaces/IERC20__factory.js.map +0 -1
- package/dist/unified/typechain-types/factories/interfaces/index.d.ts +0 -2
- package/dist/unified/typechain-types/factories/interfaces/index.d.ts.map +0 -1
- package/dist/unified/typechain-types/factories/interfaces/index.js.map +0 -1
- package/dist/unified/typechain-types/interfaces/IERC20.d.ts.map +0 -1
- package/dist/unified/typechain-types/interfaces/IERC20.js.map +0 -1
- package/dist/unified/typechain-types/interfaces/index.d.ts +0 -2
- package/dist/unified/typechain-types/interfaces/index.d.ts.map +0 -1
- package/dist/unified/typechain-types/interfaces/index.js.map +0 -1
- package/typechain-types/factories/Mailer__factory.ts +0 -1170
- /package/dist/evm/typechain-types/{interfaces → @openzeppelin/contracts-upgradeable/access}/index.js +0 -0
- /package/dist/evm/typechain-types/{Mailer.js → contracts/Mailer.js} +0 -0
- /package/dist/evm/typechain-types/{MockUSDC.js → contracts/MockUSDC.js} +0 -0
- /package/dist/evm/typechain-types/{interfaces → contracts/interfaces}/IERC20.js +0 -0
- /package/dist/evm/typechain-types/factories/{interfaces → contracts/interfaces}/IERC20__factory.js +0 -0
- /package/dist/unified/typechain-types/{interfaces → @openzeppelin/contracts-upgradeable/access}/index.js +0 -0
- /package/dist/unified/typechain-types/{Mailer.js → contracts/Mailer.js} +0 -0
- /package/dist/unified/typechain-types/{MockUSDC.js → contracts/MockUSDC.js} +0 -0
- /package/dist/unified/typechain-types/{interfaces → contracts/interfaces}/IERC20.js +0 -0
- /package/dist/unified/typechain-types/factories/{interfaces → contracts/interfaces}/IERC20__factory.js +0 -0
|
@@ -0,0 +1,922 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.24;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @title Mailer
|
|
6
|
+
* @notice Decentralized messaging system with delegation management, USDC fees and revenue sharing
|
|
7
|
+
* @dev Two-tier messaging fee system + delegation management with rejection capability
|
|
8
|
+
* Upgradable contract using UUPS proxy pattern
|
|
9
|
+
* @author Mailer Team
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import "./interfaces/IERC20.sol";
|
|
13
|
+
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
|
|
14
|
+
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
|
|
15
|
+
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
|
|
16
|
+
|
|
17
|
+
contract Mailer is Initializable, OwnableUpgradeable, UUPSUpgradeable {
|
|
18
|
+
/// @notice USDC token contract for fee payments
|
|
19
|
+
IERC20 public usdcToken;
|
|
20
|
+
|
|
21
|
+
/// @notice Time limit for recipients to claim their revenue share (60 days)
|
|
22
|
+
uint256 public constant CLAIM_PERIOD = 60 days;
|
|
23
|
+
|
|
24
|
+
/// @notice Percentage of fee that goes to message sender as revenue share
|
|
25
|
+
uint8 internal constant RECIPIENT_SHARE = 90; // 90%
|
|
26
|
+
|
|
27
|
+
/// @notice Percentage of fee that goes to contract owner
|
|
28
|
+
uint8 internal constant OWNER_SHARE = 10; // 10%
|
|
29
|
+
|
|
30
|
+
// ============================================
|
|
31
|
+
// STORAGE LAYOUT - OPTIMIZED FOR GAS EFFICIENCY
|
|
32
|
+
// ============================================
|
|
33
|
+
// Slot 0 (32 bytes): sendFee (16) + delegationFee (16) = 32 bytes ✅
|
|
34
|
+
// Slot 1 (19 bytes): ownerClaimable (16) + _status (1) + paused (1) + feePaused (1) = 19 bytes ✅
|
|
35
|
+
// Total: 2 storage slots for all state variables
|
|
36
|
+
// This packing saves ~40,000 gas per deployment and ~5,000 gas per write operation
|
|
37
|
+
// ============================================
|
|
38
|
+
|
|
39
|
+
/// @notice Base sending fee (0.1 USDC with 6 decimals) - packed with delegationFee in Slot 0
|
|
40
|
+
uint128 public sendFee;
|
|
41
|
+
|
|
42
|
+
/// @notice Fee required for delegation operations (10 USDC with 6 decimals) - packed with sendFee in Slot 0
|
|
43
|
+
uint128 public delegationFee;
|
|
44
|
+
|
|
45
|
+
/// @notice Total USDC amount claimable by contract owner - packed with status/bools in Slot 1
|
|
46
|
+
uint128 public ownerClaimable;
|
|
47
|
+
|
|
48
|
+
/// @notice Reentrancy guard status - packed with ownerClaimable in Slot 1
|
|
49
|
+
uint8 private _status;
|
|
50
|
+
|
|
51
|
+
/// @notice Contract pause state - packed with ownerClaimable in Slot 1
|
|
52
|
+
bool public paused;
|
|
53
|
+
|
|
54
|
+
/// @notice Fee pause state - packed with ownerClaimable in Slot 1
|
|
55
|
+
bool public feePaused;
|
|
56
|
+
|
|
57
|
+
/// @notice Structure for tracking claimable amounts with timestamp
|
|
58
|
+
/// @dev STORAGE OPTIMIZATION: Packed into 1 slot (32 bytes total)
|
|
59
|
+
/// - amount: uint192 (24 bytes) - max ~6.2e57, far exceeds total USDC supply (~6e16)
|
|
60
|
+
/// - timestamp: uint64 (8 bytes) - valid until year 584,942,417,355 AD
|
|
61
|
+
/// This packing saves 20,000 gas per new recipient vs using uint256 for both
|
|
62
|
+
/// @param amount USDC amount claimable by recipient
|
|
63
|
+
/// @param timestamp Unix timestamp when claimable amount was last updated
|
|
64
|
+
struct ClaimableAmount {
|
|
65
|
+
uint192 amount; // 24 bytes
|
|
66
|
+
uint64 timestamp; // 8 bytes
|
|
67
|
+
} // Total: 32 bytes = 1 slot ✅
|
|
68
|
+
|
|
69
|
+
/// @notice Mapping of recipient addresses to their claimable revenue shares
|
|
70
|
+
mapping(address => ClaimableAmount) public recipientClaims;
|
|
71
|
+
|
|
72
|
+
/// @notice Mapping of addresses to their custom fee discount (0-100)
|
|
73
|
+
/// @dev 0 = no discount (full fee), 100 = full discount (free)
|
|
74
|
+
/// Internally stores discount instead of percentage for cleaner logic
|
|
75
|
+
mapping(address => uint8) public customFeeDiscount;
|
|
76
|
+
|
|
77
|
+
/// @notice Mapping of contract addresses to authorized wallet addresses that can pay fees
|
|
78
|
+
/// @dev Allows smart contracts to send messages while authorized wallets pay the fees
|
|
79
|
+
/// permissions[contractAddress][walletAddress] = true/false
|
|
80
|
+
/// Multiple wallets can be authorized per contract for security
|
|
81
|
+
mapping(address => mapping(address => bool)) public permissions;
|
|
82
|
+
|
|
83
|
+
event MailSent(
|
|
84
|
+
address indexed from,
|
|
85
|
+
address indexed to,
|
|
86
|
+
string subject,
|
|
87
|
+
string body,
|
|
88
|
+
bool revenueShareToReceiver,
|
|
89
|
+
bool resolveSenderToName,
|
|
90
|
+
bool feePaid
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
event PreparedMailSent(
|
|
94
|
+
address indexed from,
|
|
95
|
+
address indexed to,
|
|
96
|
+
string indexed mailId,
|
|
97
|
+
bool revenueShareToReceiver,
|
|
98
|
+
bool resolveSenderToName,
|
|
99
|
+
bool feePaid
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
event MailSentToEmail(
|
|
103
|
+
address indexed from,
|
|
104
|
+
string toEmail,
|
|
105
|
+
string subject,
|
|
106
|
+
string body,
|
|
107
|
+
bool feePaid
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
event PreparedMailSentToEmail(
|
|
111
|
+
address indexed from,
|
|
112
|
+
string toEmail,
|
|
113
|
+
string indexed mailId,
|
|
114
|
+
bool feePaid
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
event WebhookMailSent(
|
|
118
|
+
address indexed from,
|
|
119
|
+
address indexed to,
|
|
120
|
+
string indexed webhookId,
|
|
121
|
+
bool revenueShareToReceiver,
|
|
122
|
+
bool resolveSenderToName,
|
|
123
|
+
bool feePaid
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
event FeeUpdated(uint256 oldFee, uint256 newFee);
|
|
127
|
+
event SharesRecorded(address indexed recipient, uint256 recipientAmount, uint256 ownerAmount);
|
|
128
|
+
event RecipientClaimed(address indexed recipient, uint256 amount);
|
|
129
|
+
event OwnerClaimed(uint256 amount);
|
|
130
|
+
event ExpiredSharesClaimed(address indexed recipient, uint256 amount);
|
|
131
|
+
|
|
132
|
+
/// @notice Emitted when delegation is set or cleared
|
|
133
|
+
/// @param delegator The address setting the delegation
|
|
134
|
+
/// @param delegate The delegate address (address(0) for clearing)
|
|
135
|
+
event DelegationSet(address indexed delegator, address indexed delegate);
|
|
136
|
+
|
|
137
|
+
/// @notice Emitted when delegation fee is updated
|
|
138
|
+
/// @param oldFee Previous fee amount
|
|
139
|
+
/// @param newFee New fee amount
|
|
140
|
+
event DelegationFeeUpdated(uint256 oldFee, uint256 newFee);
|
|
141
|
+
|
|
142
|
+
/// @notice Emitted when contract is paused and funds are distributed
|
|
143
|
+
event ContractPaused();
|
|
144
|
+
|
|
145
|
+
/// @notice Emitted when contract is unpaused
|
|
146
|
+
event ContractUnpaused();
|
|
147
|
+
|
|
148
|
+
/// @notice Emitted when contract is emergency unpaused without fund distribution
|
|
149
|
+
event EmergencyUnpaused();
|
|
150
|
+
|
|
151
|
+
/// @notice Emitted when fee collection is toggled
|
|
152
|
+
/// @param feePaused True if fees are paused, false otherwise
|
|
153
|
+
event FeePauseToggled(bool feePaused);
|
|
154
|
+
|
|
155
|
+
/// @notice Emitted when funds are auto-distributed during pause
|
|
156
|
+
/// @param recipient Address receiving funds
|
|
157
|
+
/// @param amount Amount distributed
|
|
158
|
+
event FundsDistributed(address indexed recipient, uint256 amount);
|
|
159
|
+
|
|
160
|
+
/// @notice Emitted when custom fee percentage is set for an address
|
|
161
|
+
/// @param account Address that received custom fee percentage
|
|
162
|
+
/// @param percentage Fee percentage (0-100)
|
|
163
|
+
event CustomFeePercentageSet(address indexed account, uint256 percentage);
|
|
164
|
+
|
|
165
|
+
/// @notice Emitted when a wallet grants permission for a contract to send messages
|
|
166
|
+
/// @param contractAddress The contract being granted permission
|
|
167
|
+
/// @param wallet The wallet that will pay fees for the contract
|
|
168
|
+
event PermissionGranted(address indexed contractAddress, address indexed wallet);
|
|
169
|
+
|
|
170
|
+
/// @notice Emitted when permission is revoked
|
|
171
|
+
/// @param contractAddress The contract having permission revoked
|
|
172
|
+
/// @param wallet The wallet that was paying fees
|
|
173
|
+
event PermissionRevoked(address indexed contractAddress, address indexed wallet);
|
|
174
|
+
|
|
175
|
+
error OnlyOwner();
|
|
176
|
+
error NoClaimableAmount();
|
|
177
|
+
error ClaimPeriodNotExpired();
|
|
178
|
+
error FeePaymentRequired();
|
|
179
|
+
error TransferFailed();
|
|
180
|
+
error ReentrancyGuard();
|
|
181
|
+
error InvalidAddress();
|
|
182
|
+
error MathOverflow();
|
|
183
|
+
error ContractIsPaused();
|
|
184
|
+
error ContractNotPaused();
|
|
185
|
+
error InvalidPercentage();
|
|
186
|
+
error UnpermittedPayer();
|
|
187
|
+
|
|
188
|
+
modifier nonReentrant() {
|
|
189
|
+
if (_status == 1) {
|
|
190
|
+
revert ReentrancyGuard();
|
|
191
|
+
}
|
|
192
|
+
_status = 1;
|
|
193
|
+
_;
|
|
194
|
+
_status = 0;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
modifier whenNotPaused() {
|
|
198
|
+
if (paused) {
|
|
199
|
+
revert ContractIsPaused();
|
|
200
|
+
}
|
|
201
|
+
_;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/// @custom:oz-upgrades-unsafe-allow constructor
|
|
205
|
+
constructor() {
|
|
206
|
+
_disableInitializers();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* @notice Initialize the contract (replaces constructor for upgradeable pattern)
|
|
211
|
+
* @param _usdcToken Address of the USDC token contract
|
|
212
|
+
* @param _owner Address of the contract owner
|
|
213
|
+
*/
|
|
214
|
+
function initialize(address _usdcToken, address _owner) public initializer {
|
|
215
|
+
if (_usdcToken == address(0) || _owner == address(0)) {
|
|
216
|
+
revert InvalidAddress();
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
__Ownable_init(_owner);
|
|
220
|
+
__UUPSUpgradeable_init();
|
|
221
|
+
|
|
222
|
+
usdcToken = IERC20(_usdcToken);
|
|
223
|
+
sendFee = 100000; // 0.1 USDC with 6 decimals
|
|
224
|
+
delegationFee = 10000000; // 10 USDC with 6 decimals
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* @notice Authorize contract upgrades (UUPS requirement)
|
|
229
|
+
* @dev Only owner can authorize upgrades
|
|
230
|
+
*/
|
|
231
|
+
function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* @notice Send a message with optional revenue sharing
|
|
236
|
+
* @dev Two modes based on revenueShareToReceiver flag:
|
|
237
|
+
* - true (Priority): Charges full sendFee (0.1 USDC), receiver gets 90% back as claimable within 60 days of the last reward
|
|
238
|
+
* - false (Standard): Charges only 10% of sendFee (0.01 USDC), no claimable amount
|
|
239
|
+
*
|
|
240
|
+
* IMPORTANT - SOFT-FAIL BEHAVIOR:
|
|
241
|
+
* This function is designed for composability with other smart contracts.
|
|
242
|
+
* If fee payment fails (insufficient balance, no approval, etc.), the transaction
|
|
243
|
+
* WILL NOT REVERT. Instead, no event is emitted and the message is silently dropped.
|
|
244
|
+
* This allows calling contracts to continue execution without failing.
|
|
245
|
+
*
|
|
246
|
+
* For off-chain applications: Monitor the MailSent event. If the transaction succeeds
|
|
247
|
+
* but no event is emitted, the message was not sent due to fee payment failure.
|
|
248
|
+
*
|
|
249
|
+
* @param to Recipient address who receives the message and potential revenue share
|
|
250
|
+
* @param subject Message subject line
|
|
251
|
+
* @param body Message body content
|
|
252
|
+
* @param payer Address that will pay the USDC fee (must be authorized if msg.sender is a contract)
|
|
253
|
+
* @param revenueShareToReceiver If true, receiver gets 90% revenue share; if false, no revenue share
|
|
254
|
+
* @param resolveSenderToName If true, resolve sender address to name via off-chain service
|
|
255
|
+
*
|
|
256
|
+
* Cost for payer:
|
|
257
|
+
* - Priority (revenueShareToReceiver=true): Payer pays 0.1 USDC, receiver gets 0.09 USDC claimable
|
|
258
|
+
* - Standard (revenueShareToReceiver=false): Payer pays 0.01 USDC only
|
|
259
|
+
*
|
|
260
|
+
* Why use Standard? Lower upfront cost, no revenue tracking needed.
|
|
261
|
+
* Why use Priority? Reward the recipient with claimable revenue share.
|
|
262
|
+
*
|
|
263
|
+
* Requirements:
|
|
264
|
+
* - Contract must not be paused
|
|
265
|
+
* - Payer must have approved this contract to spend required USDC amount
|
|
266
|
+
* - Payer must have sufficient USDC balance
|
|
267
|
+
* - If msg.sender is a contract, payer must be in permissions[msg.sender]
|
|
268
|
+
*/
|
|
269
|
+
function send(
|
|
270
|
+
address to,
|
|
271
|
+
string calldata subject,
|
|
272
|
+
string calldata body,
|
|
273
|
+
address payer,
|
|
274
|
+
bool revenueShareToReceiver,
|
|
275
|
+
bool resolveSenderToName
|
|
276
|
+
) external nonReentrant whenNotPaused {
|
|
277
|
+
// Process fee and capture whether it succeeded
|
|
278
|
+
bool feePaid = _processFee(payer, to, revenueShareToReceiver);
|
|
279
|
+
// Always emit event, with feePaid indicating success/failure
|
|
280
|
+
emit MailSent(msg.sender, to, subject, body, revenueShareToReceiver, resolveSenderToName, feePaid);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* @notice Send a message using pre-prepared content (referenced by mailId)
|
|
285
|
+
* @dev Same as send but references off-chain stored content via mailId
|
|
286
|
+
* SOFT-FAIL BEHAVIOR: Does not revert on fee payment failure. No event emitted if payment fails.
|
|
287
|
+
* See send() function documentation for detailed explanation.
|
|
288
|
+
* @param to Recipient address who receives the message and potential revenue share
|
|
289
|
+
* @param mailId Reference ID to pre-prepared message content
|
|
290
|
+
* @param payer Address that will pay the USDC fee (must be authorized if msg.sender is a contract)
|
|
291
|
+
* @param revenueShareToReceiver If true, receiver gets 90% revenue share; if false, no revenue share
|
|
292
|
+
* @param resolveSenderToName If true, resolve sender address to name via off-chain service
|
|
293
|
+
*
|
|
294
|
+
* Use case: For large messages or repeated templates, store content off-chain
|
|
295
|
+
* and reference it here to save gas costs on transaction data.
|
|
296
|
+
*/
|
|
297
|
+
function sendPrepared(
|
|
298
|
+
address to,
|
|
299
|
+
string calldata mailId,
|
|
300
|
+
address payer,
|
|
301
|
+
bool revenueShareToReceiver,
|
|
302
|
+
bool resolveSenderToName
|
|
303
|
+
) external nonReentrant whenNotPaused {
|
|
304
|
+
// Process fee and capture whether it succeeded
|
|
305
|
+
bool feePaid = _processFee(payer, to, revenueShareToReceiver);
|
|
306
|
+
// Always emit event, with feePaid indicating success/failure
|
|
307
|
+
emit PreparedMailSent(msg.sender, to, mailId, revenueShareToReceiver, resolveSenderToName, feePaid);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* @notice Send a message to an email address (no wallet address known)
|
|
312
|
+
* @dev Always charges standard 10% fee (0.01 USDC) since there's no recipient wallet for revenue sharing
|
|
313
|
+
* SOFT-FAIL BEHAVIOR: Does not revert on fee payment failure. No event emitted if payment fails.
|
|
314
|
+
* See send() function documentation for detailed explanation.
|
|
315
|
+
* @param toEmail Email address of the recipient
|
|
316
|
+
* @param subject Message subject line
|
|
317
|
+
* @param body Message body content
|
|
318
|
+
* @param payer Address that will pay the USDC fee (must be authorized if msg.sender is a contract)
|
|
319
|
+
*
|
|
320
|
+
* Use case: Send to users who haven't set up a wallet yet
|
|
321
|
+
* Cost: 0.01 USDC (10% of sendFee), all goes to owner
|
|
322
|
+
*
|
|
323
|
+
* Requirements:
|
|
324
|
+
* - Contract must not be paused
|
|
325
|
+
* - Payer must have approved this contract to spend required USDC amount
|
|
326
|
+
* - Payer must have sufficient USDC balance
|
|
327
|
+
* - If msg.sender is a contract, payer must be in permissions[msg.sender]
|
|
328
|
+
*/
|
|
329
|
+
function sendToEmailAddress(
|
|
330
|
+
string calldata toEmail,
|
|
331
|
+
string calldata subject,
|
|
332
|
+
string calldata body,
|
|
333
|
+
address payer
|
|
334
|
+
) external nonReentrant whenNotPaused {
|
|
335
|
+
// Process fee and capture whether it succeeded
|
|
336
|
+
bool feePaid = _processFee(payer, address(0), false);
|
|
337
|
+
// Always emit event, with feePaid indicating success/failure
|
|
338
|
+
emit MailSentToEmail(msg.sender, toEmail, subject, body, feePaid);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* @notice Send a pre-prepared message to an email address (no wallet address known)
|
|
343
|
+
* @dev Always charges standard 10% fee (0.01 USDC) since there's no recipient wallet for revenue sharing
|
|
344
|
+
* SOFT-FAIL BEHAVIOR: Does not revert on fee payment failure. No event emitted if payment fails.
|
|
345
|
+
* See send() function documentation for detailed explanation.
|
|
346
|
+
* @param toEmail Email address of the recipient
|
|
347
|
+
* @param mailId Reference ID to pre-prepared message content
|
|
348
|
+
* @param payer Address that will pay the USDC fee (must be authorized if msg.sender is a contract)
|
|
349
|
+
*
|
|
350
|
+
* Use case: For large messages or repeated templates, store content off-chain
|
|
351
|
+
* and reference it here to save gas costs on transaction data.
|
|
352
|
+
*/
|
|
353
|
+
function sendPreparedToEmailAddress(
|
|
354
|
+
string calldata toEmail,
|
|
355
|
+
string calldata mailId,
|
|
356
|
+
address payer
|
|
357
|
+
) external nonReentrant whenNotPaused {
|
|
358
|
+
// Process fee and capture whether it succeeded
|
|
359
|
+
bool feePaid = _processFee(payer, address(0), false);
|
|
360
|
+
// Always emit event, with feePaid indicating success/failure
|
|
361
|
+
emit PreparedMailSentToEmail(msg.sender, toEmail, mailId, feePaid);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* @notice Send a message through webhook (referenced by webhookId)
|
|
366
|
+
* @dev Same as sendPrepared but for webhook-triggered messages
|
|
367
|
+
* SOFT-FAIL BEHAVIOR: Does not revert on fee payment failure. No event emitted if payment fails.
|
|
368
|
+
* See send() function documentation for detailed explanation.
|
|
369
|
+
* @param to Recipient address who receives the message and potential revenue share
|
|
370
|
+
* @param webhookId Reference ID to webhook configuration
|
|
371
|
+
* @param payer Address that will pay the USDC fee (must be authorized if msg.sender is a contract)
|
|
372
|
+
* @param revenueShareToReceiver If true, receiver gets 90% revenue share; if false, no revenue share
|
|
373
|
+
* @param resolveSenderToName If true, resolve sender address to name via off-chain service
|
|
374
|
+
*
|
|
375
|
+
* Use case: For webhook-triggered automated messages where content is generated dynamically
|
|
376
|
+
* based on webhook configuration.
|
|
377
|
+
*/
|
|
378
|
+
function sendThroughWebhook(
|
|
379
|
+
address to,
|
|
380
|
+
string calldata webhookId,
|
|
381
|
+
address payer,
|
|
382
|
+
bool revenueShareToReceiver,
|
|
383
|
+
bool resolveSenderToName
|
|
384
|
+
) external nonReentrant whenNotPaused {
|
|
385
|
+
// Process fee and capture whether it succeeded
|
|
386
|
+
bool feePaid = _processFee(payer, to, revenueShareToReceiver);
|
|
387
|
+
// Always emit event, with feePaid indicating success/failure
|
|
388
|
+
emit WebhookMailSent(msg.sender, to, webhookId, revenueShareToReceiver, resolveSenderToName, feePaid);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* @notice Update the base sending fee (owner only)
|
|
393
|
+
* @dev WARNING: Fee changes take effect IMMEDIATELY with no time delay or user notification.
|
|
394
|
+
* This design allows the owner to respond quickly to market conditions, spam attacks, or operational needs.
|
|
395
|
+
*
|
|
396
|
+
* IMPORTANT IMPLICATIONS FOR USERS:
|
|
397
|
+
* - Fee can increase at any time without warning
|
|
398
|
+
* - No maximum fee cap enforced by contract
|
|
399
|
+
* - Users should monitor FeeUpdated events
|
|
400
|
+
* - Consider the trust assumption: owner will not abuse instant fee changes
|
|
401
|
+
* - Smart contracts calling send functions should implement their own fee caps if needed
|
|
402
|
+
*
|
|
403
|
+
* FRONT-RUNNING RISK:
|
|
404
|
+
* - Owner could potentially front-run user transactions by changing fees
|
|
405
|
+
* - Users with pending transactions may pay different fees than expected
|
|
406
|
+
* - Integrating contracts should set appropriate USDC approvals and handle failures gracefully
|
|
407
|
+
*
|
|
408
|
+
* @param usdcAmount New fee amount in USDC (6 decimals). No maximum enforced.
|
|
409
|
+
*/
|
|
410
|
+
function setFee(uint256 usdcAmount) external onlyOwner whenNotPaused {
|
|
411
|
+
if (usdcAmount > type(uint128).max) {
|
|
412
|
+
revert MathOverflow();
|
|
413
|
+
}
|
|
414
|
+
uint128 oldFee = sendFee;
|
|
415
|
+
sendFee = uint128(usdcAmount);
|
|
416
|
+
emit FeeUpdated(oldFee, usdcAmount);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
function getFee() external view returns (uint256) {
|
|
420
|
+
return sendFee;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* @notice Internal function to record revenue shares for priority messages
|
|
425
|
+
* @dev Splits totalAmount into 90% for recipient (message receiver) and 10% for owner
|
|
426
|
+
* @param recipient Address that will be able to claim the 90% share (the message recipient)
|
|
427
|
+
* @param totalAmount Total fee amount to split (typically sendFee = 0.1 USDC)
|
|
428
|
+
*
|
|
429
|
+
* Split logic:
|
|
430
|
+
* - Owner gets exactly 10% (calculated first for precision)
|
|
431
|
+
* - Recipient gets remainder (totalAmount - ownerAmount) to handle any rounding
|
|
432
|
+
*
|
|
433
|
+
* Timestamp behavior:
|
|
434
|
+
* - Every call updates timestamp to current block time, extending the 60-day claim window
|
|
435
|
+
*
|
|
436
|
+
* Safety:
|
|
437
|
+
* - Explicit overflow checks on type conversions (defense-in-depth)
|
|
438
|
+
* - Practically impossible to overflow with USDC (max supply ~6×10^16, uint128 max ~3.4×10^38)
|
|
439
|
+
* - Uses optimized uint192 for amount and uint64 for timestamp
|
|
440
|
+
*/
|
|
441
|
+
function _recordShares(address recipient, uint256 totalAmount) internal {
|
|
442
|
+
// Calculate owner amount first to ensure precision
|
|
443
|
+
uint256 ownerAmountCalc = (totalAmount * OWNER_SHARE) / 100;
|
|
444
|
+
if (ownerAmountCalc > type(uint128).max) {
|
|
445
|
+
revert MathOverflow();
|
|
446
|
+
}
|
|
447
|
+
uint128 ownerAmount = uint128(ownerAmountCalc);
|
|
448
|
+
|
|
449
|
+
// Calculate recipient amount
|
|
450
|
+
uint256 recipientAmountCalc = totalAmount - ownerAmount;
|
|
451
|
+
if (recipientAmountCalc > type(uint192).max) {
|
|
452
|
+
revert MathOverflow();
|
|
453
|
+
}
|
|
454
|
+
uint192 recipientAmount = uint192(recipientAmountCalc);
|
|
455
|
+
|
|
456
|
+
// Update recipient's claimable amount and refresh timestamp to extend the claim window
|
|
457
|
+
recipientClaims[recipient].amount += recipientAmount;
|
|
458
|
+
recipientClaims[recipient].timestamp = uint64(block.timestamp);
|
|
459
|
+
|
|
460
|
+
// Update owner's claimable amount
|
|
461
|
+
_increaseOwnerClaimable(ownerAmount);
|
|
462
|
+
|
|
463
|
+
emit SharesRecorded(recipient, recipientAmount, ownerAmount);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* @notice Process fee payment for any send operation
|
|
468
|
+
* @dev Unified fee processing with revenue sharing support
|
|
469
|
+
* Gas optimized with unchecked math and early return for zero fees
|
|
470
|
+
* @param recipient Address to receive revenue share (use address(0) for email sends with no revenue share)
|
|
471
|
+
* @param revenueShareToReceiver If true, splits fee 90/10; if false, charges 10% owner fee only
|
|
472
|
+
*
|
|
473
|
+
* Fee logic:
|
|
474
|
+
* - Priority mode (revenueShareToReceiver=true):
|
|
475
|
+
* - Charges full fee
|
|
476
|
+
* - If recipient != address(0): 90% to recipient, 10% to owner
|
|
477
|
+
* - If recipient == address(0): 100% to owner (email case)
|
|
478
|
+
* - Standard mode (revenueShareToReceiver=false):
|
|
479
|
+
* - Charges 10% fee only, all to owner
|
|
480
|
+
*
|
|
481
|
+
* Gas optimizations:
|
|
482
|
+
* - Ternary operator for conditional assignment (cheaper than if/else)
|
|
483
|
+
* - Unchecked math for safe operations (division/multiplication cannot overflow)
|
|
484
|
+
* - Early return on zero fee (avoids unnecessary transfer and storage write)
|
|
485
|
+
*/
|
|
486
|
+
/**
|
|
487
|
+
* @notice Internal function to process fees with permission checking
|
|
488
|
+
* @dev Verifies that the payer is authorized to pay for msg.sender (if msg.sender != payer)
|
|
489
|
+
* @param payer Address that will pay the USDC fee
|
|
490
|
+
* @param recipient Address that receives revenue share (or address(0) for email sends)
|
|
491
|
+
* @param revenueShareToReceiver Whether to enable revenue sharing
|
|
492
|
+
*/
|
|
493
|
+
function _processFee(address payer, address recipient, bool revenueShareToReceiver) internal returns (bool) {
|
|
494
|
+
// Short-circuit permission check: only load mapping if sender != payer (saves ~2100 gas in common case)
|
|
495
|
+
if (msg.sender != payer) {
|
|
496
|
+
if (!permissions[msg.sender][payer]) {
|
|
497
|
+
revert UnpermittedPayer();
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Early return if fee collection is paused (success - no fee required)
|
|
502
|
+
if (feePaused) return true;
|
|
503
|
+
|
|
504
|
+
uint256 effectiveFee = _calculateFeeForAddress(payer, sendFee);
|
|
505
|
+
|
|
506
|
+
// Early return if no fee (success - no fee required)
|
|
507
|
+
if (effectiveFee == 0) return true;
|
|
508
|
+
|
|
509
|
+
// Calculate fee to charge
|
|
510
|
+
uint256 feeToCharge;
|
|
511
|
+
unchecked {
|
|
512
|
+
// Safe: division by 100 reduces value, multiplication by 10 then division cannot overflow
|
|
513
|
+
feeToCharge = revenueShareToReceiver ? effectiveFee : (effectiveFee * OWNER_SHARE) / 100;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// Transfer fee from payer to contract
|
|
517
|
+
// If transfer fails (including ERC20 reverts), return false instead of bubbling up
|
|
518
|
+
if (!_safeTransferFrom(payer, feeToCharge)) {
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// Handle revenue sharing or direct owner payment
|
|
523
|
+
if (revenueShareToReceiver && recipient != address(0)) {
|
|
524
|
+
// Split fee between recipient (90%) and owner (10%)
|
|
525
|
+
_recordShares(recipient, effectiveFee);
|
|
526
|
+
} else {
|
|
527
|
+
// All fees go to owner (standard mode or email send)
|
|
528
|
+
_increaseOwnerClaimable(feeToCharge);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
return true;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* @notice Attempt to transfer USDC from payer to this contract without propagating reverts
|
|
536
|
+
* @param payer Address that should pay the fee
|
|
537
|
+
* @param amount Amount of USDC to transfer
|
|
538
|
+
* @return success True if transfer succeeded, false if transferFrom reverted or returned false
|
|
539
|
+
*/
|
|
540
|
+
function _safeTransferFrom(address payer, uint256 amount) internal returns (bool) {
|
|
541
|
+
if (amount == 0) {
|
|
542
|
+
return true;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
try usdcToken.transferFrom(payer, address(this), amount) returns (bool success) {
|
|
546
|
+
return success;
|
|
547
|
+
} catch {
|
|
548
|
+
return false;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* @notice Claim your accumulated revenue share from priority messages received
|
|
554
|
+
* @dev Must be called within 60 days of the most recent reward being recorded
|
|
555
|
+
*
|
|
556
|
+
* TIMESTAMP DEPENDENCY WARNING:
|
|
557
|
+
* This function uses block.timestamp for expiration checks. Miners/validators can manipulate
|
|
558
|
+
* block.timestamp by ±15 seconds (Ethereum) or more (other chains). This means:
|
|
559
|
+
* - Claims near the 60-day deadline have a small risk of being denied via timestamp manipulation
|
|
560
|
+
* - Recommended: Claim well before the deadline (e.g., within 55 days) to avoid edge cases
|
|
561
|
+
* - The 60-day period is approximate and may vary by a few seconds
|
|
562
|
+
*
|
|
563
|
+
* Claim period logic:
|
|
564
|
+
* - Clock refreshes on every priority message received (when timestamp is updated)
|
|
565
|
+
* - Multiple priority messages extend the timer, keeping all rewards available as long as one is received every 60 days
|
|
566
|
+
* - After 60 days with no new rewards, funds become permanently unclaimable (owner can recover via claimExpiredShares)
|
|
567
|
+
*
|
|
568
|
+
* Example timeline:
|
|
569
|
+
* Day 0: Receive priority message, get 0.09 USDC claimable, timer starts
|
|
570
|
+
* Day 60: Receive another priority message, now 0.18 USDC claimable, timer refreshes
|
|
571
|
+
* Day 119: Can still claim all 0.18 USDC because the second reward reset the timer
|
|
572
|
+
* Day 121: Too late, funds expired if no new rewards arrived after Day 60
|
|
573
|
+
*/
|
|
574
|
+
function claimRecipientShare() external nonReentrant {
|
|
575
|
+
ClaimableAmount storage claim = recipientClaims[msg.sender];
|
|
576
|
+
if (claim.amount == 0) {
|
|
577
|
+
revert NoClaimableAmount();
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// Check if claim period has expired (60 days from the most recent reward)
|
|
581
|
+
if (block.timestamp > claim.timestamp + CLAIM_PERIOD) {
|
|
582
|
+
revert NoClaimableAmount();
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// Store amount and delete claim data (saves ~15000 gas via storage refund)
|
|
586
|
+
uint256 amount = claim.amount;
|
|
587
|
+
delete recipientClaims[msg.sender];
|
|
588
|
+
|
|
589
|
+
// Transfer USDC to claimer
|
|
590
|
+
bool success = usdcToken.transfer(msg.sender, amount);
|
|
591
|
+
if (!success) {
|
|
592
|
+
revert TransferFailed();
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
emit RecipientClaimed(msg.sender, amount);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
function claimOwnerShare() external onlyOwner nonReentrant {
|
|
599
|
+
if (ownerClaimable == 0) {
|
|
600
|
+
revert NoClaimableAmount();
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
uint256 amount = ownerClaimable;
|
|
604
|
+
ownerClaimable = 0;
|
|
605
|
+
|
|
606
|
+
bool success = usdcToken.transfer(owner(), amount);
|
|
607
|
+
if (!success) {
|
|
608
|
+
revert TransferFailed();
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
emit OwnerClaimed(amount);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
function claimExpiredShares(address recipient) external onlyOwner nonReentrant {
|
|
615
|
+
ClaimableAmount storage claim = recipientClaims[recipient];
|
|
616
|
+
if (claim.amount == 0) {
|
|
617
|
+
revert NoClaimableAmount();
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
if (block.timestamp <= claim.timestamp + CLAIM_PERIOD) {
|
|
621
|
+
revert ClaimPeriodNotExpired();
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
uint256 amount = claim.amount;
|
|
625
|
+
delete recipientClaims[recipient];
|
|
626
|
+
|
|
627
|
+
_increaseOwnerClaimable(amount);
|
|
628
|
+
|
|
629
|
+
emit ExpiredSharesClaimed(recipient, amount);
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
function getRecipientClaimable(address recipient) external view returns (uint256 amount, uint256 expiresAt, bool isExpired) {
|
|
633
|
+
ClaimableAmount storage claim = recipientClaims[recipient];
|
|
634
|
+
amount = claim.amount;
|
|
635
|
+
expiresAt = claim.timestamp + CLAIM_PERIOD;
|
|
636
|
+
isExpired = claim.amount > 0 && block.timestamp > expiresAt;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
function getOwnerClaimable() external view returns (uint256) {
|
|
640
|
+
return ownerClaimable;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/// @notice Delegate mail handling to another address
|
|
644
|
+
/// @dev Charges delegation fee in USDC unless feePaused is true. Emits event for indexer tracking
|
|
645
|
+
/// WARNING: Delegation fee is NON-REFUNDABLE, even if the delegate rejects the delegation.
|
|
646
|
+
/// The fee is an anti-spam measure and goes to the contract owner regardless of delegation outcome.
|
|
647
|
+
/// @param delegate Address to delegate to, or address(0) to clear
|
|
648
|
+
function delegateTo(address delegate) external nonReentrant whenNotPaused {
|
|
649
|
+
// If clearing delegation (setting to address(0)), no fee required
|
|
650
|
+
// If feePaused is true, skip fee collection
|
|
651
|
+
if (delegate != address(0) && !feePaused) {
|
|
652
|
+
uint128 fee = delegationFee;
|
|
653
|
+
if (!usdcToken.transferFrom(msg.sender, address(this), fee)) {
|
|
654
|
+
revert FeePaymentRequired();
|
|
655
|
+
}
|
|
656
|
+
_increaseOwnerClaimable(fee);
|
|
657
|
+
}
|
|
658
|
+
emit DelegationSet(msg.sender, delegate);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
/// @notice Reject a delegation made to you by another address
|
|
662
|
+
/// @dev Emits event for indexer tracking. No validation - relies on off-chain logic.
|
|
663
|
+
/// NOTE: Rejecting a delegation does NOT refund the delegation fee paid by the delegator.
|
|
664
|
+
/// The fee is an anti-spam measure and is non-refundable by design.
|
|
665
|
+
/// @param delegatingAddress Address that delegated to msg.sender
|
|
666
|
+
function rejectDelegation(address delegatingAddress) external nonReentrant whenNotPaused {
|
|
667
|
+
emit DelegationSet(delegatingAddress, address(0));
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
/**
|
|
671
|
+
* @notice Update the delegation fee (owner only)
|
|
672
|
+
* @dev WARNING: Fee changes take effect IMMEDIATELY with no time delay or user notification.
|
|
673
|
+
* Users who are in the process of delegating may pay a different fee than expected.
|
|
674
|
+
* See setFee() documentation for detailed implications of instant fee changes.
|
|
675
|
+
* @param usdcAmount New fee amount in USDC (6 decimals). No maximum enforced.
|
|
676
|
+
*/
|
|
677
|
+
function setDelegationFee(uint256 usdcAmount) external onlyOwner whenNotPaused {
|
|
678
|
+
if (usdcAmount > type(uint128).max) {
|
|
679
|
+
revert MathOverflow();
|
|
680
|
+
}
|
|
681
|
+
uint128 oldFee = delegationFee;
|
|
682
|
+
delegationFee = uint128(usdcAmount);
|
|
683
|
+
emit DelegationFeeUpdated(oldFee, usdcAmount);
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/// @notice Get current delegation fee
|
|
687
|
+
/// @return Current delegation fee in USDC (6 decimals)
|
|
688
|
+
function getDelegationFee() external view returns (uint256) {
|
|
689
|
+
return delegationFee;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
/// @notice Set custom fee percentage for a specific address
|
|
693
|
+
/// @dev Only owner can set. Percentage must be between 0-100 (inclusive)
|
|
694
|
+
/// 0 = free (no fee), 100 = full fee, anything in between reduces the fee proportionally
|
|
695
|
+
/// Internally stores as discount (100 - percentage) for cleaner logic
|
|
696
|
+
/// @param account Address to set custom fee percentage for
|
|
697
|
+
/// @param percentage Fee percentage (0-100). Set to 0 for free messages, 100 for full fee
|
|
698
|
+
function setCustomFeePercentage(address account, uint256 percentage) external onlyOwner whenNotPaused {
|
|
699
|
+
if (account == address(0)) {
|
|
700
|
+
revert InvalidAddress();
|
|
701
|
+
}
|
|
702
|
+
if (percentage > 100) {
|
|
703
|
+
revert InvalidPercentage();
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// Store as discount: 0% fee = 100 discount, 100% fee = 0 discount
|
|
707
|
+
customFeeDiscount[account] = uint8(100 - percentage);
|
|
708
|
+
emit CustomFeePercentageSet(account, percentage);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
/// @notice Clear custom fee percentage for a specific address
|
|
712
|
+
/// @dev Only owner can clear. After clearing, address will use default fee structure (100%)
|
|
713
|
+
/// @param account Address to clear custom fee percentage for
|
|
714
|
+
function clearCustomFeePercentage(address account) external onlyOwner whenNotPaused {
|
|
715
|
+
if (account == address(0)) {
|
|
716
|
+
revert InvalidAddress();
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
// Set discount to 0 (no discount = 100% fee = default behavior)
|
|
720
|
+
customFeeDiscount[account] = 0;
|
|
721
|
+
emit CustomFeePercentageSet(account, 100);
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/// @notice Get custom fee percentage for an address
|
|
725
|
+
/// @param account Address to check
|
|
726
|
+
/// @return percentage Fee percentage (0-100), 100 means default (full fee)
|
|
727
|
+
function getCustomFeePercentage(address account) external view returns (uint256) {
|
|
728
|
+
// Convert discount back to percentage: 0 discount = 100% fee, 100 discount = 0% fee
|
|
729
|
+
return 100 - customFeeDiscount[account];
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
/// @notice Calculate the effective fee for an address based on custom discount
|
|
733
|
+
/// @dev Internal helper function with early returns for common cases (gas optimization)
|
|
734
|
+
/// Default discount of 0 means full fee (100%)
|
|
735
|
+
/// @param account Address to calculate fee for
|
|
736
|
+
/// @param baseFee Base fee amount to apply discount to
|
|
737
|
+
/// @return Calculated fee amount
|
|
738
|
+
function _calculateFeeForAddress(address account, uint128 baseFee) internal view returns (uint256) {
|
|
739
|
+
// Get discount (0-100): 0 = no discount (full fee), 100 = full discount (free)
|
|
740
|
+
uint8 discount = customFeeDiscount[account];
|
|
741
|
+
|
|
742
|
+
// Early return for no discount (most common case - saves ~200 gas)
|
|
743
|
+
if (discount == 0) return baseFee;
|
|
744
|
+
|
|
745
|
+
// Early return for full discount (free - saves ~200 gas)
|
|
746
|
+
if (discount == 100) return 0;
|
|
747
|
+
|
|
748
|
+
// Apply discount: fee = baseFee * (100 - discount) / 100
|
|
749
|
+
// Examples: discount=50 → 50% fee, discount=25 → 75% fee
|
|
750
|
+
unchecked {
|
|
751
|
+
// Safe: baseFee is uint128, discount is 0-99, cannot overflow
|
|
752
|
+
return (uint256(baseFee) * (100 - discount)) / 100;
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
/// @notice Pause the contract and distribute all claimable funds to their rightful owners
|
|
757
|
+
/// @dev Only owner can pause. All recipient shares and owner claimable funds are distributed
|
|
758
|
+
function pause() external onlyOwner nonReentrant {
|
|
759
|
+
if (paused) {
|
|
760
|
+
revert ContractIsPaused();
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
paused = true;
|
|
764
|
+
|
|
765
|
+
// Cache storage read (saves ~2100 gas)
|
|
766
|
+
uint128 _ownerClaimable = ownerClaimable;
|
|
767
|
+
|
|
768
|
+
// Distribute owner claimable funds first
|
|
769
|
+
if (_ownerClaimable > 0) {
|
|
770
|
+
ownerClaimable = 0;
|
|
771
|
+
|
|
772
|
+
bool success = usdcToken.transfer(owner(), _ownerClaimable);
|
|
773
|
+
if (success) {
|
|
774
|
+
emit FundsDistributed(owner(), _ownerClaimable);
|
|
775
|
+
} else {
|
|
776
|
+
// If transfer fails, restore the balance
|
|
777
|
+
ownerClaimable = _ownerClaimable;
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
emit ContractPaused();
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
/// @notice Distribute a specific recipient's claimable funds during pause
|
|
785
|
+
/// @dev Can only be called when paused. Anyone can call this function to help distribute funds.
|
|
786
|
+
/// Funds are always sent to their rightful owner (recipient), so this is safe for public access.
|
|
787
|
+
/// Distributes funds regardless of expiration to prevent fund loss during emergency.
|
|
788
|
+
/// @param recipient Address to distribute funds for
|
|
789
|
+
function distributeClaimableFunds(address recipient) external nonReentrant {
|
|
790
|
+
if (!paused) {
|
|
791
|
+
revert ContractNotPaused();
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
ClaimableAmount storage claim = recipientClaims[recipient];
|
|
795
|
+
if (claim.amount == 0) {
|
|
796
|
+
revert NoClaimableAmount();
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
uint256 amount = claim.amount;
|
|
800
|
+
uint64 lastTimestamp = claim.timestamp;
|
|
801
|
+
delete recipientClaims[recipient];
|
|
802
|
+
|
|
803
|
+
bool success = usdcToken.transfer(recipient, amount);
|
|
804
|
+
if (success) {
|
|
805
|
+
emit FundsDistributed(recipient, amount);
|
|
806
|
+
} else {
|
|
807
|
+
// If transfer fails, restore the balance
|
|
808
|
+
recipientClaims[recipient].amount = uint192(amount);
|
|
809
|
+
recipientClaims[recipient].timestamp = lastTimestamp;
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/// @notice Unpause the contract to resume normal operations
|
|
814
|
+
/// @dev Only owner can unpause
|
|
815
|
+
function unpause() external onlyOwner {
|
|
816
|
+
if (!paused) {
|
|
817
|
+
revert ContractNotPaused();
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
paused = false;
|
|
821
|
+
emit ContractUnpaused();
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
/// @notice Emergency unpause without fund distribution (owner only)
|
|
825
|
+
/// @dev Use when pause() failed due to transfer issues. Owner can still manually claim funds later
|
|
826
|
+
function emergencyUnpause() external onlyOwner {
|
|
827
|
+
if (!paused) {
|
|
828
|
+
revert ContractNotPaused();
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
paused = false;
|
|
832
|
+
emit EmergencyUnpaused();
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
/// @notice Toggle fee collection on or off (owner only)
|
|
836
|
+
/// @dev When feePaused is true, send functions will not charge fees
|
|
837
|
+
/// @param _feePaused True to pause fee collection, false to enable
|
|
838
|
+
function setFeePaused(bool _feePaused) external onlyOwner {
|
|
839
|
+
feePaused = _feePaused;
|
|
840
|
+
emit FeePauseToggled(_feePaused);
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
function _increaseOwnerClaimable(uint256 amount) internal {
|
|
844
|
+
if (amount == 0) {
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
uint256 newOwnerClaimable = uint256(ownerClaimable) + amount;
|
|
848
|
+
if (newOwnerClaimable > type(uint128).max) {
|
|
849
|
+
revert MathOverflow();
|
|
850
|
+
}
|
|
851
|
+
ownerClaimable = uint128(newOwnerClaimable);
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
/// @notice Grant permission for a contract to send messages using caller's USDC balance
|
|
855
|
+
/// @dev Allows smart contracts to send messages while the wallet pays fees
|
|
856
|
+
/// If permission already exists, emits PermissionRevoked for the old wallet
|
|
857
|
+
/// @param contractAddress The contract address to grant permission to
|
|
858
|
+
///
|
|
859
|
+
/// Requirements:
|
|
860
|
+
/// - contractAddress must not be address(0)
|
|
861
|
+
/// - Caller must have approved this Mailer contract to spend their USDC
|
|
862
|
+
///
|
|
863
|
+
/// Usage:
|
|
864
|
+
/// 1. Wallet calls: usdc.approve(mailer, largeAmount)
|
|
865
|
+
/// 2. Wallet calls: mailer.setPermission(myContract)
|
|
866
|
+
/// 3. Contract can now call: mailer.send(...) and fees are paid by wallet
|
|
867
|
+
/**
|
|
868
|
+
* @notice Grant permission for a contract to send messages using caller's USDC balance
|
|
869
|
+
* @dev Adds caller to the set of authorized payers for the contract
|
|
870
|
+
* Multiple wallets can be authorized per contract for security and flexibility
|
|
871
|
+
* @param contractAddress The contract address to grant permission to
|
|
872
|
+
*
|
|
873
|
+
* Requirements:
|
|
874
|
+
* - contractAddress must not be address(0)
|
|
875
|
+
* - Contract must not be paused
|
|
876
|
+
* - Caller must have approved Mailer to spend their USDC
|
|
877
|
+
*
|
|
878
|
+
* Events:
|
|
879
|
+
* - PermissionGranted(contractAddress, msg.sender)
|
|
880
|
+
*/
|
|
881
|
+
function setPermission(address contractAddress) external whenNotPaused {
|
|
882
|
+
if (contractAddress == address(0)) {
|
|
883
|
+
revert InvalidAddress();
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
permissions[contractAddress][msg.sender] = true;
|
|
887
|
+
emit PermissionGranted(contractAddress, msg.sender);
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
/**
|
|
891
|
+
* @notice Remove permission for a contract to use caller's USDC balance
|
|
892
|
+
* @dev Removes caller from the set of authorized payers for the contract
|
|
893
|
+
* @param contractAddress The contract address to remove permission from
|
|
894
|
+
*
|
|
895
|
+
* Requirements:
|
|
896
|
+
* - Contract must not be paused
|
|
897
|
+
* - Caller must have previously granted permission
|
|
898
|
+
*
|
|
899
|
+
* Events:
|
|
900
|
+
* - PermissionRevoked(contractAddress, msg.sender)
|
|
901
|
+
*/
|
|
902
|
+
function removePermission(address contractAddress) external whenNotPaused {
|
|
903
|
+
if (contractAddress == address(0)) {
|
|
904
|
+
revert InvalidAddress();
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
permissions[contractAddress][msg.sender] = false;
|
|
908
|
+
emit PermissionRevoked(contractAddress, msg.sender);
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
/// @notice Check if contract is currently paused
|
|
912
|
+
/// @return True if contract is paused, false otherwise
|
|
913
|
+
function isPaused() external view returns (bool) {
|
|
914
|
+
return paused;
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
/**
|
|
918
|
+
* @dev Reserved storage space to allow for layout changes in future upgrades
|
|
919
|
+
* @notice This gap reserves 50 storage slots for future state variables
|
|
920
|
+
*/
|
|
921
|
+
uint256[50] private __gap;
|
|
922
|
+
}
|