@coti-io/coti-contracts 1.3.0 → 1.3.1
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/contracts/access/DataPrivacyFramework/DataPrivacyFramework.sol +1 -1
- package/contracts/access/DataPrivacyFramework/extensions/DataPrivacyFrameworkMpc.sol +1 -1
- package/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow.sol +2 -4
- package/contracts/disperse/disperseToken/MintDisperser.sol +1 -3
- package/contracts/disperse/disperseToken/TokenDisperser.sol +1 -1
- package/contracts/messaging/PrivateMessaging.sol +1 -1
- package/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock.sol +1 -1
- package/contracts/mocks/messaging/PrivateMessagingHarness.sol +1 -1
- package/contracts/mocks/oracle/CotiPriceConsumerMock.sol +1 -1
- package/contracts/mocks/token/ERC20DecimalsMock.sol +1 -1
- package/contracts/mocks/token/ERC20Mock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock.sol +1 -1
- package/contracts/mocks/utils/mpc/Arithmetic128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Arithmetic256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/ArithmeticAddTestsContract.sol +196 -0
- package/contracts/mocks/utils/mpc/ArithmeticMulTestsContract.sol +194 -0
- package/contracts/mocks/utils/mpc/ArithmeticSigned128TestsContract.sol +63 -0
- package/contracts/mocks/utils/mpc/ArithmeticSigned256TestsContract.sol +107 -0
- package/contracts/mocks/utils/mpc/ArithmeticSignedNarrowTestsContract.sol +123 -0
- package/contracts/mocks/utils/mpc/ArithmeticSubTestsContract.sol +196 -0
- package/contracts/mocks/utils/mpc/Bitwise128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Bitwise256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/BitwiseTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Comparison128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Comparison1TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Comparison256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Comparison2TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MinMax128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MinMax256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MinMaxTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MinimalImplementation.sol +1 -1
- package/contracts/mocks/utils/mpc/MinimalProxy.sol +1 -1
- package/contracts/mocks/utils/mpc/Miscellaneous1TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MiscellaneousTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MpcOperations128TestContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MpcOperationsTestContract.sol +4 -4
- package/contracts/mocks/utils/mpc/Mux128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Mux256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract.sol +1 -1
- package/contracts/mocks/utils/mpc/OnBoard128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/OnBoard256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/PrivacyImplementationV1.sol +1 -1
- package/contracts/mocks/utils/mpc/PrivacyImplementationV2.sol +1 -1
- package/contracts/mocks/utils/mpc/PrivacyProxy.sol +1 -1
- package/contracts/mocks/utils/mpc/Random128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Random256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Shift128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Shift256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/ShiftTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/StringTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Transfer128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Transfer256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferScalarTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract.sol +2 -2
- package/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract.sol +1 -1
- package/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.sol +1 -1
- package/contracts/node/CotiNodeRewards.sol +3 -3
- package/contracts/node/SoulboundNodeNFT.sol +1 -2
- package/contracts/onboard/AccountOnboard.sol +1 -1
- package/contracts/oracle/ICotiPriceConsumer.sol +1 -1
- package/contracts/pod/IInbox.sol +231 -0
- package/contracts/pod/IInboxMiner.sol +53 -0
- package/contracts/pod/InboxUser.sol +29 -0
- package/contracts/pod/InboxUserCotiTestnet.sol +13 -0
- package/contracts/pod/PodNetworkConstants.sol +30 -0
- package/contracts/pod/examples/MpcAdder.sol +57 -0
- package/contracts/pod/examples/MpcAdderPausable.sol +25 -0
- package/contracts/pod/examples/MpcAdderPausable.sol.bak +25 -0
- package/contracts/pod/examples/it128/PodAdder128.sol +48 -0
- package/contracts/pod/examples/it256/PodAdder256.sol +48 -0
- package/contracts/pod/fee/IInboxFeeManager.sol +40 -0
- package/contracts/pod/manifest.json +52 -0
- package/contracts/pod/mpc/PodLib.sol +10 -0
- package/contracts/pod/mpc/PodLib128.sol +361 -0
- package/contracts/pod/mpc/PodLib256.sol +361 -0
- package/contracts/pod/mpc/PodLib64.sol +385 -0
- package/contracts/pod/mpc/PodLibBase.sol +72 -0
- package/contracts/pod/mpc/PodUser.sol +58 -0
- package/contracts/pod/mpc/PodUserFuji.sol +14 -0
- package/contracts/pod/mpc/PodUserSepolia.sol +13 -0
- package/contracts/pod/mpc/coti-side/IPodExecutorOps.sol +99 -0
- package/contracts/pod/mpccodec/MpcAbiCodec.sol +482 -0
- package/contracts/pod/privacy/IPodPriceOracle.sol +20 -0
- package/contracts/pod/privacy/IPrivacyPortal.sol +248 -0
- package/contracts/pod/privacy/IPrivacyPortalFactory.sol +88 -0
- package/contracts/pod/privacy/PortalFeeOracle.sol +51 -0
- package/contracts/pod/privacy/PrivacyPortal.sol +871 -0
- package/contracts/pod/privacy/PrivacyPortalFactory.sol +492 -0
- package/contracts/pod/privacy/PrivacyPortalFeeLib.sol +98 -0
- package/contracts/pod/privacy/mocks/CloneHelper.sol +14 -0
- package/contracts/pod/privacy/mocks/MockERC20.sol +26 -0
- package/contracts/pod/privacy/mocks/MockPodERC20ForPortal.sol +160 -0
- package/contracts/pod/privacy/mocks/MockPrivacyPortalFactory.sol +125 -0
- package/contracts/pod/privacy/mocks/MockWrappedNative.sol +24 -0
- package/contracts/pod/token/erc7984/Erc7984Constants.sol +9 -0
- package/contracts/pod/token/erc7984/Erc7984Pointers.sol +29 -0
- package/contracts/pod/token/erc7984/IERC7984.sol +69 -0
- package/contracts/pod/token/erc7984/IERC7984PortalWrapper.sol +31 -0
- package/contracts/pod/token/erc7984/PodErc7984Mixin.sol +125 -0
- package/contracts/pod/token/erc7984/README.md +60 -0
- package/contracts/pod/token/perc20/IPodERC20.sol +298 -0
- package/contracts/pod/token/perc20/PodERC20.sol +1021 -0
- package/contracts/pod/token/perc20/PodErc20Mintable.sol +88 -0
- package/contracts/pod/token/perc20/PodErc20MintableInitializable.sol +42 -0
- package/contracts/pod/token/perc20/cotiside/IPodErc20CotiSide.sol +88 -0
- package/contracts/pod/token/perc20/cotiside/PodErc20CotiMother.sol +529 -0
- package/contracts/pod/utils/IWrappedNative.sol +11 -0
- package/contracts/privacyBridge/PrivacyBridge.sol +5 -5
- package/contracts/privacyBridge/PrivacyBridgeCotiNative.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeERC20.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeUSDCe.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeUSDT.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeWADA.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeWBTC.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeWETH.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgegCoti.sol +1 -1
- package/contracts/token/PrivateERC20/IPrivateERC20.sol +1 -1
- package/contracts/token/PrivateERC20/ITokenReceiver.sol +1 -1
- package/contracts/token/PrivateERC20/ITokenReceiverEncrypted.sol +1 -1
- package/contracts/token/PrivateERC20/PrivateERC20.sol +5 -5
- package/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateCOTI.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.sol +1 -1
- package/contracts/token/PrivateERC721/IERC721Errors.sol +1 -1
- package/contracts/token/PrivateERC721/PrivateERC721.sol +1 -1
- package/contracts/token/PrivateERC721/extensions/IPrivateERC721URIStorage.sol +1 -1
- package/contracts/token/PrivateERC721/extensions/PrivateERC721URIStorage.sol +1 -1
- package/contracts/token/points/CotiTokenPoints004.sol +43 -0
- package/contracts/utils/mpc/MpcCore.sol +610 -1
- package/contracts/utils/mpc/MpcInterface.sol +1 -1
- package/hardhat.config.ts +5 -14
- package/package.json +4 -4
- package/scripts/deployCotiTokenPoints004.ts +61 -0
- package/scripts/deployFixedRatioCoinDisperserUnlimitedWindow.ts +68 -0
- package/scripts/verifyCotiTokenPoints004.ts +123 -0
- package/scripts/verifyFixedRatioCoinDisperserUnlimitedWindow.ts +112 -0
- package/test/messaging/PrivateMessaging.test.ts +5 -5
- package/test/pod/privacy/PrivacyPortal.access.test.ts +756 -0
- package/test/pod/privacy/PrivacyPortal.recovery.test.ts +263 -0
- package/test/privacyBridge/UnifiedPrivacyBridges.test.cjs +5 -3
- package/test/utils/mpc/CheckedSignedArithmetic256.test.ts +163 -0
- package/test/utils/mpc/NegativeCases.test.ts +3 -3
- package/test/utils/mpc/Precompile.test.ts +6 -6
- package/typechain-types/@openzeppelin/contracts/access/AccessControl.ts +2 -2
- package/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts +2 -2
- package/typechain-types/@openzeppelin/contracts/access/extensions/AccessControlEnumerable.ts +375 -0
- package/typechain-types/@openzeppelin/contracts/access/extensions/IAccessControlEnumerable.ts +329 -0
- package/typechain-types/@openzeppelin/contracts/access/extensions/index.ts +5 -0
- package/typechain-types/@openzeppelin/contracts/access/index.ts +2 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/IERC1363.ts +412 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/IERC5267.ts +151 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts +6 -50
- package/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts +6 -6
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.ts +313 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.ts +356 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.ts +423 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts +6 -6
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts +3 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts +2 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/utils/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts/utils/Nonces.ts +85 -0
- package/typechain-types/@openzeppelin/contracts/utils/Pausable.ts +150 -0
- package/typechain-types/@openzeppelin/contracts/utils/ReentrancyGuard.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/ShortStrings.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/Strings.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/cryptography/ECDSA.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/cryptography/EIP712.ts +151 -0
- package/typechain-types/@openzeppelin/contracts/utils/cryptography/index.ts +5 -0
- package/typechain-types/@openzeppelin/contracts/utils/index.ts +9 -0
- package/typechain-types/@openzeppelin/contracts/utils/math/SafeCast.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/math/index.ts +4 -0
- package/typechain-types/contracts/mocks/token/ERC20DecimalsMock.ts +6 -50
- package/typechain-types/contracts/mocks/token/ERC20Mock.ts +6 -50
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.ts +16 -2
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.ts +2 -2
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.ts +2 -2
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.ts +2 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridge.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeCotiNative.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDCe.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDT.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWADA.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWBTC.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWETH.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgegCoti.ts +16 -2
- package/typechain-types/contracts/token/PrivateERC20/PrivateERC20.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTI.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.ts +2 -2
- package/typechain-types/contracts/token/index.ts +2 -0
- package/typechain-types/contracts/token/points/CotiTokenPoints004.sol/COTITokenPoints004.ts +826 -0
- package/typechain-types/contracts/token/points/CotiTokenPoints004.ts +826 -0
- package/typechain-types/contracts/token/points/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts +22 -1
- package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts +22 -1
- package/typechain-types/factories/@openzeppelin/contracts/access/Ownable__factory.ts +22 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/extensions/AccessControlEnumerable__factory.ts +316 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/extensions/IAccessControlEnumerable__factory.ts +265 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/extensions/index.ts +5 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/index.ts +1 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1363__factory.ts +393 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC5267__factory.ts +71 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts +127 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts +111 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts +128 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts +3 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts +84 -110
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts +3 -3
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable__factory.ts +364 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable__factory.ts +382 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit__factory.ts +540 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts +3 -3
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts +3 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts +1 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/utils/SafeERC20__factory.ts +96 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/utils/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/ERC721__factory.ts +98 -59
- package/typechain-types/factories/@openzeppelin/contracts/utils/Nonces__factory.ts +57 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/Pausable__factory.ts +71 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/ReentrancyGuard__factory.ts +30 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/ShortStrings__factory.ts +83 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.ts +90 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.ts +91 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/EIP712__factory.ts +87 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/index.ts +5 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/index.ts +7 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/math/SafeCast__factory.ts +118 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/math/index.ts +4 -0
- package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1__factory.ts +12 -1
- package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow__factory.ts +39 -1
- package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperser__factory.ts +12 -1
- package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser__factory.ts +23 -1
- package/typechain-types/factories/contracts/disperse/disperseToken/TokenDisperser__factory.ts +12 -1
- package/typechain-types/factories/contracts/messaging/PrivateMessaging__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/messaging/PrivateMessagingHarness__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/token/ERC20DecimalsMock__factory.ts +90 -52
- package/typechain-types/factories/contracts/mocks/token/ERC20Mock__factory.ts +90 -52
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock__factory.ts +90 -2
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock__factory.ts +28 -2
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock__factory.ts +28 -2
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20Mock__factory.ts +28 -2
- package/typechain-types/factories/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/ArithmeticTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/BitwiseTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol/CheckedArithmeticWithOverflowBitTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison1TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison2TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MinMaxTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MinimalImplementation__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous1TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MiscellaneousTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperations128TestContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperationsTestContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Mux128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Mux256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV1__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV2__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Random128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Random256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Shift128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Shift256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/ShiftTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/StringTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferScalarTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock__factory.ts +1 -1
- package/typechain-types/factories/contracts/node/CotiNodeRewards__factory.ts +28 -1
- package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/SoulboundNodeNFT__factory.ts +126 -1
- package/typechain-types/factories/contracts/onboard/AccountOnboard__factory.ts +1 -1
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeCotiNative__factory.ts +79 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20__factory.ts +89 -1
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDCe__factory.ts +90 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDT__factory.ts +90 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWADA__factory.ts +90 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWBTC__factory.ts +90 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWETH__factory.ts +90 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridge__factory.ts +78 -1
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgegCoti__factory.ts +90 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/PrivateERC20__factory.ts +27 -1
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTI__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateTetherUSD__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedADA__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedEther__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/index.ts +1 -0
- package/typechain-types/factories/contracts/token/points/CotiTokenPoints004.sol/COTITokenPoints004__factory.ts +992 -0
- package/typechain-types/factories/contracts/token/points/CotiTokenPoints004__factory.ts +992 -0
- package/typechain-types/factories/contracts/token/points/index.ts +4 -0
- package/typechain-types/factories/contracts/utils/mpc/MpcCore__factory.ts +1 -1
- package/typechain-types/hardhat.d.ts +360 -0
- package/typechain-types/index.ts +36 -4
- package/contracts/mocks/utils/mpc/ArithmeticTestsContract.sol +0 -408
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.20;
|
|
3
|
+
|
|
4
|
+
import "../../token/perc20/IPodERC20.sol";
|
|
5
|
+
|
|
6
|
+
/// @dev Lightweight pToken stand-in for PrivacyPortal unit tests.
|
|
7
|
+
contract MockPodERC20ForPortal {
|
|
8
|
+
address public lastMintRecipient;
|
|
9
|
+
uint256 public lastMintAmount;
|
|
10
|
+
uint256 public lastMintValue;
|
|
11
|
+
uint256 public lastMintCallbackFee;
|
|
12
|
+
bytes32 public lastMintRequestId;
|
|
13
|
+
IPodERC20.RequestStatus private _lastMintStatus;
|
|
14
|
+
|
|
15
|
+
address public lastTransferFrom;
|
|
16
|
+
address public lastTransferTo;
|
|
17
|
+
uint256 public lastTransferAmount;
|
|
18
|
+
uint256 public lastTransferValue;
|
|
19
|
+
uint256 public lastTransferCallbackFee;
|
|
20
|
+
bytes public lastTransferCallbackData;
|
|
21
|
+
|
|
22
|
+
bytes32 public lastTransferRequestId;
|
|
23
|
+
uint256 public burnedAmount;
|
|
24
|
+
uint256 public lastBurnValue;
|
|
25
|
+
uint256 public lastBurnCallbackFee;
|
|
26
|
+
|
|
27
|
+
bool public burnShouldRevert;
|
|
28
|
+
IPodERC20.RequestStatus private _lastTransferStatus;
|
|
29
|
+
|
|
30
|
+
mapping(bytes32 => IPodERC20.RequestStatus) private _requestStatus;
|
|
31
|
+
|
|
32
|
+
function estimateFee()
|
|
33
|
+
external
|
|
34
|
+
pure
|
|
35
|
+
returns (uint256 totalFeeWei, uint256 targetFeeWei, uint256 callbackFeeWei)
|
|
36
|
+
{
|
|
37
|
+
return (1000, 900, 100);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function mint(address to, uint256 amount, uint256 callbackFeeLocalWei)
|
|
41
|
+
external
|
|
42
|
+
payable
|
|
43
|
+
returns (bytes32 requestId)
|
|
44
|
+
{
|
|
45
|
+
lastMintRecipient = to;
|
|
46
|
+
lastMintAmount = amount;
|
|
47
|
+
lastMintValue = msg.value;
|
|
48
|
+
lastMintCallbackFee = callbackFeeLocalWei;
|
|
49
|
+
requestId = keccak256(abi.encodePacked("mint", to, amount, block.number));
|
|
50
|
+
lastMintRequestId = requestId;
|
|
51
|
+
_lastMintStatus = IPodERC20.RequestStatus.Pending;
|
|
52
|
+
_requestStatus[requestId] = IPodERC20.RequestStatus.Pending;
|
|
53
|
+
return requestId;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function transferFromAndCallWithPermit(
|
|
57
|
+
address from,
|
|
58
|
+
address to,
|
|
59
|
+
uint256 amount,
|
|
60
|
+
IPodERC20.PublicPermit calldata,
|
|
61
|
+
bytes calldata data,
|
|
62
|
+
uint256 callbackFeeLocalWei
|
|
63
|
+
) external payable returns (bytes32 requestId) {
|
|
64
|
+
lastTransferFrom = from;
|
|
65
|
+
lastTransferTo = to;
|
|
66
|
+
lastTransferAmount = amount;
|
|
67
|
+
lastTransferValue = msg.value;
|
|
68
|
+
lastTransferCallbackFee = callbackFeeLocalWei;
|
|
69
|
+
lastTransferCallbackData = data;
|
|
70
|
+
_lastTransferStatus = IPodERC20.RequestStatus.Pending;
|
|
71
|
+
requestId = keccak256(abi.encodePacked("transfer", from, to, amount, block.number));
|
|
72
|
+
lastTransferRequestId = requestId;
|
|
73
|
+
_requestStatus[requestId] = IPodERC20.RequestStatus.Pending;
|
|
74
|
+
return requestId;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function requests(bytes32 requestId) external view returns (IPodERC20.RequestRecord memory) {
|
|
78
|
+
IPodERC20.RequestStatus status = _requestStatus[requestId];
|
|
79
|
+
if (status == IPodERC20.RequestStatus.None) {
|
|
80
|
+
if (requestId == lastTransferRequestId) {
|
|
81
|
+
status = _lastTransferStatus;
|
|
82
|
+
} else if (requestId == lastMintRequestId) {
|
|
83
|
+
status = _lastMintStatus;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return IPodERC20.RequestRecord({
|
|
87
|
+
status: status,
|
|
88
|
+
recipientLocked: false,
|
|
89
|
+
account: address(0),
|
|
90
|
+
spender: address(0)
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function balanceOf(address) external pure returns (uint256) {
|
|
95
|
+
return type(uint256).max;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function burn(uint256 amount, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
|
|
99
|
+
if (burnShouldRevert) {
|
|
100
|
+
revert("MockPodERC20ForPortal: burn failed");
|
|
101
|
+
}
|
|
102
|
+
burnedAmount += amount;
|
|
103
|
+
lastBurnValue = msg.value;
|
|
104
|
+
lastBurnCallbackFee = callbackFeeLocalWei;
|
|
105
|
+
return keccak256(abi.encodePacked("burn", amount, block.number));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function triggerLastTransferCallback() external {
|
|
109
|
+
require(lastTransferCallbackData.length >= 4, "no callback");
|
|
110
|
+
(bool ok,) = lastTransferTo.call(lastTransferCallbackData);
|
|
111
|
+
require(ok, "callback failed");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function markLastTransferSuccessful() external {
|
|
115
|
+
_lastTransferStatus = IPodERC20.RequestStatus.Success;
|
|
116
|
+
if (lastTransferRequestId != bytes32(0)) {
|
|
117
|
+
_requestStatus[lastTransferRequestId] = IPodERC20.RequestStatus.Success;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function markLastTransferFailed() external {
|
|
122
|
+
_lastTransferStatus = IPodERC20.RequestStatus.Failed;
|
|
123
|
+
if (lastTransferRequestId != bytes32(0)) {
|
|
124
|
+
_requestStatus[lastTransferRequestId] = IPodERC20.RequestStatus.Failed;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function markLastTransferSystemFailed() external {
|
|
129
|
+
_lastTransferStatus = IPodERC20.RequestStatus.SystemFailed;
|
|
130
|
+
if (lastTransferRequestId != bytes32(0)) {
|
|
131
|
+
_requestStatus[lastTransferRequestId] = IPodERC20.RequestStatus.SystemFailed;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function markLastMintSuccessful() external {
|
|
136
|
+
_lastMintStatus = IPodERC20.RequestStatus.Success;
|
|
137
|
+
if (lastMintRequestId != bytes32(0)) {
|
|
138
|
+
_requestStatus[lastMintRequestId] = IPodERC20.RequestStatus.Success;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function markLastMintFailed() external {
|
|
143
|
+
_lastMintStatus = IPodERC20.RequestStatus.SystemFailed;
|
|
144
|
+
if (lastMintRequestId != bytes32(0)) {
|
|
145
|
+
_requestStatus[lastMintRequestId] = IPodERC20.RequestStatus.SystemFailed;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/// @dev Simulate app `raise` on mint (not refundable via portal).
|
|
150
|
+
function markLastMintRaised() external {
|
|
151
|
+
_lastMintStatus = IPodERC20.RequestStatus.Failed;
|
|
152
|
+
if (lastMintRequestId != bytes32(0)) {
|
|
153
|
+
_requestStatus[lastMintRequestId] = IPodERC20.RequestStatus.Failed;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function setBurnShouldRevert(bool shouldRevert) external {
|
|
158
|
+
burnShouldRevert = shouldRevert;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.20;
|
|
3
|
+
|
|
4
|
+
import "@openzeppelin/contracts/utils/Pausable.sol";
|
|
5
|
+
|
|
6
|
+
import "../IPodPriceOracle.sol";
|
|
7
|
+
import "../IPrivacyPortalFactory.sol";
|
|
8
|
+
import "../PrivacyPortalFeeLib.sol";
|
|
9
|
+
|
|
10
|
+
/// @dev Minimal factory for direct PrivacyPortal unit tests (zero portal fees by default).
|
|
11
|
+
contract MockPrivacyPortalFactory is IPrivacyPortalFactory, Pausable {
|
|
12
|
+
address public immutable feeRecipient;
|
|
13
|
+
address public rescueRecipient;
|
|
14
|
+
address public immutable nativeToken;
|
|
15
|
+
address public immutable owner_;
|
|
16
|
+
IPodPriceOracle public priceOracle;
|
|
17
|
+
bytes32 public defaultDepositFeePacked;
|
|
18
|
+
bytes32 public defaultWithdrawFeePacked;
|
|
19
|
+
mapping(address => bool) public blacklisted;
|
|
20
|
+
mapping(address => bool) public operators;
|
|
21
|
+
|
|
22
|
+
constructor(address feeRecipient_, address nativeToken_) {
|
|
23
|
+
feeRecipient = feeRecipient_;
|
|
24
|
+
rescueRecipient = feeRecipient_;
|
|
25
|
+
nativeToken = nativeToken_;
|
|
26
|
+
owner_ = feeRecipient_;
|
|
27
|
+
operators[feeRecipient_] = true;
|
|
28
|
+
defaultDepositFeePacked = PrivacyPortalFeeLib.packFeeConfig(0, 0, type(uint128).max);
|
|
29
|
+
defaultWithdrawFeePacked = PrivacyPortalFeeLib.packFeeConfig(0, 0, type(uint128).max);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function setRescueRecipient(address rescueRecipient_) external {
|
|
33
|
+
rescueRecipient = rescueRecipient_;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function owner() external view returns (address) {
|
|
37
|
+
return owner_;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function isAdmin(address account) external view returns (bool) {
|
|
41
|
+
return account == owner_;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function isOperator(address account) external view returns (bool) {
|
|
45
|
+
return operators[account];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function setOperator(address account, bool allowed) external {
|
|
49
|
+
operators[account] = allowed;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function pause() external {
|
|
53
|
+
_pause();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function unpause() external {
|
|
57
|
+
_unpause();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function depositsPaused() external view returns (bool) {
|
|
61
|
+
return paused();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function withdrawalsPaused() external view returns (bool) {
|
|
65
|
+
return paused();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function setBlacklisted(address account, bool blocked) external {
|
|
69
|
+
blacklisted[account] = blocked;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function setDefaultDepositFee(uint256 fixedFee, uint256 percentageBps, uint256 maxFee) external {
|
|
73
|
+
defaultDepositFeePacked = PrivacyPortalFeeLib.packFeeConfig(fixedFee, percentageBps, maxFee);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function setDefaultWithdrawFee(uint256 fixedFee, uint256 percentageBps, uint256 maxFee) external {
|
|
77
|
+
defaultWithdrawFeePacked = PrivacyPortalFeeLib.packFeeConfig(fixedFee, percentageBps, maxFee);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function estimateDepositPortalFee(address, uint256, uint8)
|
|
81
|
+
external
|
|
82
|
+
view
|
|
83
|
+
returns (uint256 fee, bool usedDynamicPricing)
|
|
84
|
+
{
|
|
85
|
+
(uint96 fixedFee,,) = PrivacyPortalFeeLib.unpackFeeConfig(defaultDepositFeePacked);
|
|
86
|
+
return (fixedFee, false);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function estimateWithdrawPortalFee(address, uint256, uint8)
|
|
90
|
+
external
|
|
91
|
+
view
|
|
92
|
+
returns (uint256 fee, bool usedDynamicPricing)
|
|
93
|
+
{
|
|
94
|
+
(uint96 fixedFee,,) = PrivacyPortalFeeLib.unpackFeeConfig(defaultWithdrawFeePacked);
|
|
95
|
+
return (fixedFee, false);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function getDepositPortalFeeFloor(address, uint256, uint8)
|
|
99
|
+
external
|
|
100
|
+
view
|
|
101
|
+
returns (uint256 floor, uint128 maxFee)
|
|
102
|
+
{
|
|
103
|
+
(uint96 fixedFee,, uint128 max) = PrivacyPortalFeeLib.unpackFeeConfig(defaultDepositFeePacked);
|
|
104
|
+
return (fixedFee, max);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function getWithdrawPortalFeeFloor(address, uint256, uint8)
|
|
108
|
+
external
|
|
109
|
+
view
|
|
110
|
+
returns (uint256 floor, uint128 maxFee)
|
|
111
|
+
{
|
|
112
|
+
(uint96 fixedFee,, uint128 max) = PrivacyPortalFeeLib.unpackFeeConfig(defaultWithdrawFeePacked);
|
|
113
|
+
return (fixedFee, max);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function getFeeConfig(bool isDeposit) external view returns (PortalFeeConfig memory config) {
|
|
117
|
+
return PrivacyPortalFeeLib.decodeFeeConfig(
|
|
118
|
+
isDeposit ? defaultDepositFeePacked : defaultWithdrawFeePacked
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function decodeFeeConfig(bytes32 packed) external pure returns (PortalFeeConfig memory config) {
|
|
123
|
+
return PrivacyPortalFeeLib.decodeFeeConfig(packed);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.20;
|
|
3
|
+
|
|
4
|
+
import "../../utils/IWrappedNative.sol";
|
|
5
|
+
import "./MockERC20.sol";
|
|
6
|
+
|
|
7
|
+
/// @dev WETH-like wrapper for native portal tests.
|
|
8
|
+
contract MockWrappedNative is MockERC20, IWrappedNative {
|
|
9
|
+
constructor(string memory name_, string memory symbol_) MockERC20(name_, symbol_, 18) {}
|
|
10
|
+
|
|
11
|
+
receive() external payable {
|
|
12
|
+
deposit();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function deposit() public payable override {
|
|
16
|
+
_mint(msg.sender, msg.value);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function withdraw(uint256 amount) public override {
|
|
20
|
+
_burn(msg.sender, amount);
|
|
21
|
+
(bool ok,) = payable(msg.sender).call{value: amount}("");
|
|
22
|
+
require(ok, "MockWrappedNative: withdraw failed");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.20;
|
|
3
|
+
|
|
4
|
+
/// @title Erc7984Constants
|
|
5
|
+
/// @notice Shared constants for ERC-7984 explorer compatibility.
|
|
6
|
+
library Erc7984Constants {
|
|
7
|
+
/// @dev Interface id from EIP-7984; Blockscout uses this to classify confidential tokens.
|
|
8
|
+
bytes4 internal constant INTERFACE_ID = 0x4958f2a4;
|
|
9
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.20;
|
|
3
|
+
|
|
4
|
+
import "../../../utils/mpc/MpcCore.sol";
|
|
5
|
+
|
|
6
|
+
/// @title Erc7984Pointers
|
|
7
|
+
/// @notice Maps PoD ciphertext views to ERC-7984 `bytes32` confidential pointers for explorers.
|
|
8
|
+
library Erc7984Pointers {
|
|
9
|
+
/// @dev Deterministic handle from dual-limb PoD balance/transfer ciphertext. Does not reveal plaintext.
|
|
10
|
+
function toHandle(ctUint256 memory ct) internal pure returns (bytes32) {
|
|
11
|
+
return keccak256(abi.encode(ct.ciphertextHigh, ct.ciphertextLow));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/// @dev Pick the party-specific amount view for a completed transfer/mint/burn callback.
|
|
15
|
+
function transferAmountHandle(
|
|
16
|
+
address from,
|
|
17
|
+
address to,
|
|
18
|
+
ctUint256 memory senderValue,
|
|
19
|
+
ctUint256 memory receiverValue
|
|
20
|
+
) internal pure returns (bytes32) {
|
|
21
|
+
if (from == address(0)) {
|
|
22
|
+
return toHandle(receiverValue);
|
|
23
|
+
}
|
|
24
|
+
if (to == address(0)) {
|
|
25
|
+
return toHandle(senderValue);
|
|
26
|
+
}
|
|
27
|
+
return toHandle(receiverValue);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.20;
|
|
3
|
+
|
|
4
|
+
import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
|
|
5
|
+
|
|
6
|
+
/// @title IERC7984
|
|
7
|
+
/// @notice Draft ERC-7984 confidential fungible token interface (pointer-based amounts).
|
|
8
|
+
/// @dev Technology-agnostic EIP-7984 surface for Blockscout and other indexers. PoD pTokens
|
|
9
|
+
/// implement this for explorer compatibility; execution remains async via inbox + COTI.
|
|
10
|
+
interface IERC7984 is IERC165 {
|
|
11
|
+
/// @dev Emitted when a confidential transfer completes (including mint/burn via zero address).
|
|
12
|
+
event ConfidentialTransfer(address indexed from, address indexed to, bytes32 indexed amount);
|
|
13
|
+
|
|
14
|
+
/// @dev Emitted when an operator authorization is updated.
|
|
15
|
+
event OperatorSet(address indexed holder, address indexed operator, uint48 until);
|
|
16
|
+
|
|
17
|
+
/// @dev Optional: emitted when a pointer amount is publicly disclosed.
|
|
18
|
+
event AmountDisclosed(bytes32 indexed handle, uint256 amount);
|
|
19
|
+
|
|
20
|
+
function name() external view returns (string memory);
|
|
21
|
+
|
|
22
|
+
function symbol() external view returns (string memory);
|
|
23
|
+
|
|
24
|
+
function decimals() external view returns (uint8);
|
|
25
|
+
|
|
26
|
+
function contractURI() external view returns (string memory);
|
|
27
|
+
|
|
28
|
+
function confidentialTotalSupply() external view returns (bytes32);
|
|
29
|
+
|
|
30
|
+
function confidentialBalanceOf(address account) external view returns (bytes32);
|
|
31
|
+
|
|
32
|
+
function isOperator(address holder, address spender) external view returns (bool);
|
|
33
|
+
|
|
34
|
+
function setOperator(address operator, uint48 until) external;
|
|
35
|
+
|
|
36
|
+
function confidentialTransfer(address to, bytes32 amount) external payable returns (bytes32);
|
|
37
|
+
|
|
38
|
+
function confidentialTransfer(address to, bytes32 amount, bytes calldata data) external payable returns (bytes32);
|
|
39
|
+
|
|
40
|
+
function confidentialTransferFrom(address from, address to, bytes32 amount) external payable returns (bytes32);
|
|
41
|
+
|
|
42
|
+
function confidentialTransferFrom(address from, address to, bytes32 amount, bytes calldata data)
|
|
43
|
+
external
|
|
44
|
+
payable
|
|
45
|
+
returns (bytes32);
|
|
46
|
+
|
|
47
|
+
function confidentialTransferAndCall(address to, bytes32 amount, bytes calldata callData)
|
|
48
|
+
external
|
|
49
|
+
payable
|
|
50
|
+
returns (bytes32);
|
|
51
|
+
|
|
52
|
+
function confidentialTransferAndCall(address to, bytes32 amount, bytes calldata data, bytes calldata callData)
|
|
53
|
+
external
|
|
54
|
+
payable
|
|
55
|
+
returns (bytes32);
|
|
56
|
+
|
|
57
|
+
function confidentialTransferFromAndCall(address from, address to, bytes32 amount, bytes calldata callData)
|
|
58
|
+
external
|
|
59
|
+
payable
|
|
60
|
+
returns (bytes32);
|
|
61
|
+
|
|
62
|
+
function confidentialTransferFromAndCall(
|
|
63
|
+
address from,
|
|
64
|
+
address to,
|
|
65
|
+
bytes32 amount,
|
|
66
|
+
bytes calldata data,
|
|
67
|
+
bytes calldata callData
|
|
68
|
+
) external payable returns (bytes32);
|
|
69
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.20;
|
|
3
|
+
|
|
4
|
+
/// @title IERC7984PortalWrapper
|
|
5
|
+
/// @notice Partial ERC-7984 wrapper surface for PrivacyPortal deposit/withdraw explorer visibility.
|
|
6
|
+
/// @dev Does not require full synchronous wrap/unwrap semantics; events mirror OpenZeppelin/Zama naming.
|
|
7
|
+
interface IERC7984PortalWrapper {
|
|
8
|
+
/// @dev Emitted when underlying is locked and a confidential mint is requested (portal deposit / wrap).
|
|
9
|
+
event WrapRequested(address indexed from, address indexed to, uint256 amount, bytes32 indexed mintRequestId);
|
|
10
|
+
|
|
11
|
+
/// @dev Emitted when a confidential unwrap is requested (portal withdrawal).
|
|
12
|
+
event UnwrapRequested(address indexed receiver, bytes32 indexed unwrapRequestId, bytes32 amount);
|
|
13
|
+
|
|
14
|
+
/// @dev Emitted when underlying is released after a confidential unwrap completes.
|
|
15
|
+
/// @param encryptedAmount PoD portals use `unwrapRequestId` as an explorer correlation id; the
|
|
16
|
+
/// real confidential amount pointer is on the pToken `ConfidentialTransfer` in the callback tx.
|
|
17
|
+
event UnwrapFinalized(
|
|
18
|
+
address indexed receiver,
|
|
19
|
+
bytes32 indexed unwrapRequestId,
|
|
20
|
+
bytes32 encryptedAmount,
|
|
21
|
+
uint64 cleartextAmount
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
function underlying() external view returns (address);
|
|
25
|
+
|
|
26
|
+
/// @dev Conversion rate from underlying to confidential token (1:1 for PoD portals).
|
|
27
|
+
function rate() external view returns (uint256);
|
|
28
|
+
|
|
29
|
+
/// @notice Lock underlying and request async confidential mint (alias for deposit with explicit fee).
|
|
30
|
+
function wrap(address to, uint256 amount, uint256 mintCallbackFee) external payable returns (bytes32);
|
|
31
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.20;
|
|
3
|
+
|
|
4
|
+
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
|
|
5
|
+
import "../../../utils/mpc/MpcCore.sol";
|
|
6
|
+
import "./Erc7984Constants.sol";
|
|
7
|
+
import "./Erc7984Pointers.sol";
|
|
8
|
+
import "./IERC7984.sol";
|
|
9
|
+
|
|
10
|
+
/// @title PodErc7984Mixin
|
|
11
|
+
/// @notice ERC-7984 explorer compatibility for PoD pTokens. Emits `ConfidentialTransfer` on async callback success.
|
|
12
|
+
/// @dev Mixed into {PodERC20}. Use native {IPodERC20} async methods for transfers; ERC-7984 transfer entry points revert.
|
|
13
|
+
abstract contract PodErc7984Mixin is IERC7984, ERC165 {
|
|
14
|
+
/// @notice ERC-7572 metadata URI for explorers (optional).
|
|
15
|
+
string public contractURI;
|
|
16
|
+
|
|
17
|
+
/// @dev Last confidential amount handle emitted on callback; portals may read for unwrap finalization events.
|
|
18
|
+
bytes32 public lastConfidentialTransferHandle;
|
|
19
|
+
|
|
20
|
+
/// @dev ERC-7984 operator approvals (separate from async pToken allowance model).
|
|
21
|
+
mapping(address => mapping(address => uint48)) private _operatorUntil;
|
|
22
|
+
|
|
23
|
+
/// @notice Thrown when an ERC-7984 transfer method is invoked; use {IPodERC20} async entry points instead.
|
|
24
|
+
error Erc7984UsePodTransferMethods();
|
|
25
|
+
|
|
26
|
+
/// @inheritdoc IERC165
|
|
27
|
+
function supportsInterface(bytes4 interfaceId)
|
|
28
|
+
public
|
|
29
|
+
view
|
|
30
|
+
virtual
|
|
31
|
+
override(ERC165, IERC165)
|
|
32
|
+
returns (bool)
|
|
33
|
+
{
|
|
34
|
+
return interfaceId == Erc7984Constants.INTERFACE_ID || interfaceId == type(IERC7984).interfaceId
|
|
35
|
+
|| super.supportsInterface(interfaceId);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// @inheritdoc IERC7984
|
|
39
|
+
function confidentialTotalSupply() external pure returns (bytes32) {
|
|
40
|
+
return bytes32(0);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// @inheritdoc IERC7984
|
|
44
|
+
function confidentialBalanceOf(address account) external view returns (bytes32) {
|
|
45
|
+
return Erc7984Pointers.toHandle(_erc7984BalanceOf(account));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/// @inheritdoc IERC7984
|
|
49
|
+
function isOperator(address holder, address spender) public view returns (bool) {
|
|
50
|
+
return _operatorUntil[holder][spender] > block.timestamp;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// @inheritdoc IERC7984
|
|
54
|
+
function setOperator(address operator, uint48 until) external {
|
|
55
|
+
_operatorUntil[msg.sender][operator] = until;
|
|
56
|
+
emit OperatorSet(msg.sender, operator, until);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// @inheritdoc IERC7984
|
|
60
|
+
function confidentialTransfer(address, bytes32) external payable returns (bytes32) {
|
|
61
|
+
revert Erc7984UsePodTransferMethods();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/// @inheritdoc IERC7984
|
|
65
|
+
function confidentialTransfer(address, bytes32, bytes calldata) external payable returns (bytes32) {
|
|
66
|
+
revert Erc7984UsePodTransferMethods();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/// @inheritdoc IERC7984
|
|
70
|
+
function confidentialTransferFrom(address, address, bytes32) external payable returns (bytes32) {
|
|
71
|
+
revert Erc7984UsePodTransferMethods();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// @inheritdoc IERC7984
|
|
75
|
+
function confidentialTransferFrom(address, address, bytes32, bytes calldata) external payable returns (bytes32) {
|
|
76
|
+
revert Erc7984UsePodTransferMethods();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/// @inheritdoc IERC7984
|
|
80
|
+
function confidentialTransferAndCall(address, bytes32, bytes calldata) external payable returns (bytes32) {
|
|
81
|
+
revert Erc7984UsePodTransferMethods();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/// @inheritdoc IERC7984
|
|
85
|
+
function confidentialTransferAndCall(address, bytes32, bytes calldata, bytes calldata)
|
|
86
|
+
external
|
|
87
|
+
payable
|
|
88
|
+
returns (bytes32)
|
|
89
|
+
{
|
|
90
|
+
revert Erc7984UsePodTransferMethods();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/// @inheritdoc IERC7984
|
|
94
|
+
function confidentialTransferFromAndCall(address, address, bytes32, bytes calldata)
|
|
95
|
+
external
|
|
96
|
+
payable
|
|
97
|
+
returns (bytes32)
|
|
98
|
+
{
|
|
99
|
+
revert Erc7984UsePodTransferMethods();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// @inheritdoc IERC7984
|
|
103
|
+
function confidentialTransferFromAndCall(address, address, bytes32, bytes calldata, bytes calldata)
|
|
104
|
+
external
|
|
105
|
+
payable
|
|
106
|
+
returns (bytes32)
|
|
107
|
+
{
|
|
108
|
+
revert Erc7984UsePodTransferMethods();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/// @dev Emit ERC-7984 transfer row for explorers after COTI callback applied balances.
|
|
112
|
+
function _emitConfidentialTransfer(
|
|
113
|
+
address from,
|
|
114
|
+
address to,
|
|
115
|
+
ctUint256 memory senderValue,
|
|
116
|
+
ctUint256 memory receiverValue
|
|
117
|
+
) internal {
|
|
118
|
+
bytes32 handle = Erc7984Pointers.transferAmountHandle(from, to, senderValue, receiverValue);
|
|
119
|
+
lastConfidentialTransferHandle = handle;
|
|
120
|
+
emit ConfidentialTransfer(from, to, handle);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/// @dev Child returns cached PoD balance ciphertext for `account`.
|
|
124
|
+
function _erc7984BalanceOf(address account) internal view virtual returns (ctUint256 memory);
|
|
125
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# ERC-7984 explorer compatibility
|
|
2
|
+
|
|
3
|
+
PoD pTokens expose a narrow [EIP-7984](https://eips.ethereum.org/EIPS/eip-7984) surface so Blockscout and similar explorers can classify confidential tokens and index completed confidential transfers.
|
|
4
|
+
|
|
5
|
+
## Contracts
|
|
6
|
+
|
|
7
|
+
| File | Role |
|
|
8
|
+
|------|------|
|
|
9
|
+
| `IERC7984.sol` | Draft ERC-7984 interface (`bytes32` confidential pointers) |
|
|
10
|
+
| `IERC7984PortalWrapper.sol` | Partial wrapper events/views for `PrivacyPortal` |
|
|
11
|
+
| `Erc7984Constants.sol` | Interface id `0x4958f2a4` |
|
|
12
|
+
| `Erc7984Pointers.sol` | Maps PoD `ctUint256` to explorer handles |
|
|
13
|
+
| `PodErc7984Mixin.sol` | ERC-165 + metadata + `ConfidentialTransfer` emission |
|
|
14
|
+
|
|
15
|
+
`PodERC20` inherits `PodErc7984Mixin` and emits `ConfidentialTransfer` alongside the existing `Transfer` event when COTI callbacks succeed.
|
|
16
|
+
|
|
17
|
+
`PrivacyPortal` emits `WrapRequested` on deposit/wrap and `UnwrapRequested` / `UnwrapFinalized` on withdraw/release.
|
|
18
|
+
|
|
19
|
+
## Important notes
|
|
20
|
+
|
|
21
|
+
- This is **explorer compatibility**, not Zama FHE semantic equivalence.
|
|
22
|
+
- ERC-7984 transfer entry points revert with `Erc7984UsePodTransferMethods`; use native async `IPodERC20` methods for actual moves.
|
|
23
|
+
- Explorer-visible confidential transfers are emitted **only after async callback success** on production `PodERC20`.
|
|
24
|
+
- **Live Sepolia pMTT/pWETH/pUSDC deployments do not include this mixin yet** — they emit `Transfer` only until upgraded. Use `DummyTestPERC20` at fresh addresses for explorer testing without touching production contracts.
|
|
25
|
+
|
|
26
|
+
## Dummy test stack (no COTI)
|
|
27
|
+
|
|
28
|
+
| File | Role |
|
|
29
|
+
|------|------|
|
|
30
|
+
| `contracts/mocks/DummyTestPERC20.sol` | Synchronous test pToken with `ConfidentialTransfer` on every completed move |
|
|
31
|
+
| `contracts/mocks/PodCallbackTestInbox.sol` | Optional inbox stub to complete pending dummy mints/transfers |
|
|
32
|
+
|
|
33
|
+
Deploy and run on Sepolia (new addresses each run; saves `erc7984-dummy-deploy.json`):
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm run demo:erc7984-dummy-sepolia
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Then verify the pToken on Blockscout Sepolia so `supportsInterface(0x4958f2a4)` and `ConfidentialTransfer` appear in the UI.
|
|
40
|
+
|
|
41
|
+
## Tests
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm run test:erc7984
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Blockscout verification (requires deployed verified contracts):
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
ERC7984_EXPLORER_TESTS=1 \
|
|
51
|
+
ERC7984_PTOKEN=0x... \
|
|
52
|
+
ERC7984_BLOCKSCOUT_API=https://eth.blockscout.com/api/v2 \
|
|
53
|
+
npm run test:erc7984-explorer
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Optional tx inspection:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx tsx scripts/erc7984/check-blockscout.ts --token 0x... --tx 0x...
|
|
60
|
+
```
|