From 2b588eaa6a216eb1e271771cafa78458d7828520 Mon Sep 17 00:00:00 2001 From: Mike Ng Date: Tue, 28 Nov 2023 18:36:30 +0800 Subject: [PATCH] Updated `Mortgage` Added `spender` in `deposit` function Added `recipient` in `withdraw` function --- .openzeppelin/goerli.json | 360 +++++++++++++++++++- contracts/mortgage/Mortgage.sol | 8 +- contracts/mortgage/interfaces/IMortgage.sol | 4 +- scripts/B14_Setup_Mortgage.ts | 2 +- scripts/C01_Upgrade_Registry.ts | 2 + scripts/C14_Upgrade_Mortgage.ts | 4 +- static/contracts.json | 8 +- test/index.ts | 2 +- 8 files changed, 370 insertions(+), 20 deletions(-) diff --git a/.openzeppelin/goerli.json b/.openzeppelin/goerli.json index 3acdfc6..fb93821 100644 --- a/.openzeppelin/goerli.json +++ b/.openzeppelin/goerli.json @@ -7329,7 +7329,7 @@ "label": "_registrar", "offset": 0, "slot": "251", - "type": "t_contract(IRegistrar)12323", + "type": "t_contract(IRegistrar)17353", "contract": "MigrationManager", "src": "contracts/migration/MigrationManager.sol:10" }, @@ -7363,7 +7363,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_contract(IRegistrar)12323": { + "t_contract(IRegistrar)17353": { "label": "contract IRegistrar", "numberOfBytes": "20" }, @@ -13849,7 +13849,7 @@ "label": "_token", "offset": 0, "slot": "351", - "type": "t_contract(IERC20Upgradeable)1367", + "type": "t_contract(IERC20Upgradeable)1518", "contract": "Mortgage", "src": "contracts/mortgage/Mortgage.sol:14" }, @@ -13857,7 +13857,7 @@ "label": "_registry", "offset": 0, "slot": "352", - "type": "t_contract(IRegistry)7459", + "type": "t_contract(IRegistry)21758", "contract": "Mortgage", "src": "contracts/mortgage/Mortgage.sol:15" }, @@ -13907,11 +13907,11 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_contract(IERC20Upgradeable)1367": { + "t_contract(IERC20Upgradeable)1518": { "label": "contract IERC20Upgradeable", "numberOfBytes": "20" }, - "t_contract(IRegistry)7459": { + "t_contract(IRegistry)21758": { "label": "contract IRegistry", "numberOfBytes": "20" }, @@ -14319,6 +14319,354 @@ } } } + }, + "8ec7f0459db0b599d34ab464decfb66f79b9cf288515663d275168ef2efc9d89": { + "address": "0xb64035fAb895E3Edb774538B87551A6fF3F6d578", + "txHash": "0xd2ef136d74f406534a8da4ab5b44e2a92c180c88aea96fb65ea23e09d3ca99e5", + "layout": { + "solcVersion": "0.8.17", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_synchronizer", + "offset": 0, + "slot": "51", + "type": "t_contract(ISynchronizer)10650", + "contract": "SynchronizerApplication", + "src": "contracts/crosschain/SynchronizerApplication.sol:9" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_roles", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_bytes32,t_struct(RoleData)34_storage)", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:62" + }, + { + "label": "__gap", + "offset": 0, + "slot": "103", + "type": "t_array(t_uint256)49_storage", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:260" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:169" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:111" + }, + { + "label": "_registry", + "offset": 0, + "slot": "252", + "type": "t_contract(IRegistry)21758", + "contract": "BaseResolver", + "src": "contracts/resolver/BaseResolver.sol:19" + }, + { + "label": "_mortgage", + "offset": 0, + "slot": "253", + "type": "t_contract(IMortgage)15464", + "contract": "BaseResolver", + "src": "contracts/resolver/BaseResolver.sol:21" + }, + { + "label": "__gap", + "offset": 0, + "slot": "254", + "type": "t_array(t_uint256)49_storage", + "contract": "BaseResolver", + "src": "contracts/resolver/BaseResolver.sol:163" + }, + { + "label": "_addresses", + "offset": 0, + "slot": "303", + "type": "t_mapping(t_address,t_mapping(t_bytes32,t_address))", + "contract": "AddressResolver", + "src": "contracts/resolver/profile/AddressResolver.sol:8" + }, + { + "label": "_reverseAddresses", + "offset": 0, + "slot": "304", + "type": "t_mapping(t_address,t_bytes_storage)", + "contract": "AddressResolver", + "src": "contracts/resolver/profile/AddressResolver.sol:9" + }, + { + "label": "__gap", + "offset": 0, + "slot": "305", + "type": "t_array(t_uint256)50_storage", + "contract": "AddressResolver", + "src": "contracts/resolver/profile/AddressResolver.sol:84" + }, + { + "label": "_multiCoinAddresses", + "offset": 0, + "slot": "355", + "type": "t_mapping(t_address,t_mapping(t_bytes32,t_mapping(t_uint256,t_bytes_storage)))", + "contract": "MultiCoinAddressResolver", + "src": "contracts/resolver/profile/MultiCoinAddressResolver.sol:8" + }, + { + "label": "__gap", + "offset": 0, + "slot": "356", + "type": "t_array(t_uint256)50_storage", + "contract": "MultiCoinAddressResolver", + "src": "contracts/resolver/profile/MultiCoinAddressResolver.sol:54" + }, + { + "label": "_nfts", + "offset": 0, + "slot": "406", + "type": "t_mapping(t_address,t_mapping(t_bytes32,t_mapping(t_uint256,t_struct(NFT)24936_storage)))", + "contract": "NFTResolver", + "src": "contracts/resolver/profile/NFTResolver.sol:8" + }, + { + "label": "__gap", + "offset": 0, + "slot": "407", + "type": "t_array(t_uint256)50_storage", + "contract": "NFTResolver", + "src": "contracts/resolver/profile/NFTResolver.sol:50" + }, + { + "label": "_texts", + "offset": 0, + "slot": "457", + "type": "t_mapping(t_address,t_mapping(t_bytes32,t_string_storage))", + "contract": "TextResolver", + "src": "contracts/resolver/profile/TextResolver.sol:8" + }, + { + "label": "__gap", + "offset": 0, + "slot": "458", + "type": "t_array(t_uint256)50_storage", + "contract": "TextResolver", + "src": "contracts/resolver/profile/TextResolver.sol:43" + }, + { + "label": "_typedTexts", + "offset": 0, + "slot": "508", + "type": "t_mapping(t_address,t_mapping(t_bytes32,t_mapping(t_bytes32,t_string_storage)))", + "contract": "TypedTextResolver", + "src": "contracts/resolver/profile/TypedTextResolver.sol:8" + }, + { + "label": "__gap", + "offset": 0, + "slot": "509", + "type": "t_array(t_uint256)50_storage", + "contract": "TypedTextResolver", + "src": "contracts/resolver/profile/TypedTextResolver.sol:43" + }, + { + "label": "__gap", + "offset": 0, + "slot": "559", + "type": "t_array(t_uint256)50_storage", + "contract": "PublicResolver", + "src": "contracts/resolver/PublicResolver.sol:32" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(IMortgage)15464": { + "label": "contract IMortgage", + "numberOfBytes": "20" + }, + "t_contract(IRegistry)21758": { + "label": "contract IRegistry", + "numberOfBytes": "20" + }, + "t_contract(ISynchronizer)10650": { + "label": "contract ISynchronizer", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bytes_storage)": { + "label": "mapping(address => bytes)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_bytes32,t_address))": { + "label": "mapping(address => mapping(bytes32 => address))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_bytes32,t_mapping(t_bytes32,t_string_storage)))": { + "label": "mapping(address => mapping(bytes32 => mapping(bytes32 => string)))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_bytes32,t_mapping(t_uint256,t_bytes_storage)))": { + "label": "mapping(address => mapping(bytes32 => mapping(uint256 => bytes)))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_bytes32,t_mapping(t_uint256,t_struct(NFT)24936_storage)))": { + "label": "mapping(address => mapping(bytes32 => mapping(uint256 => struct INFTResolver.NFT)))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_bytes32,t_string_storage))": { + "label": "mapping(address => mapping(bytes32 => string))", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_address)": { + "label": "mapping(bytes32 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_mapping(t_bytes32,t_string_storage))": { + "label": "mapping(bytes32 => mapping(bytes32 => string))", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_mapping(t_uint256,t_bytes_storage))": { + "label": "mapping(bytes32 => mapping(uint256 => bytes))", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_mapping(t_uint256,t_struct(NFT)24936_storage))": { + "label": "mapping(bytes32 => mapping(uint256 => struct INFTResolver.NFT))", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_string_storage)": { + "label": "mapping(bytes32 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)34_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bytes_storage)": { + "label": "mapping(uint256 => bytes)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(NFT)24936_storage)": { + "label": "mapping(uint256 => struct INFTResolver.NFT)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(NFT)24936_storage": { + "label": "struct INFTResolver.NFT", + "members": [ + { + "label": "contract_", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "tokenId", + "type": "t_uint256", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(RoleData)34_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } } } } diff --git a/contracts/mortgage/Mortgage.sol b/contracts/mortgage/Mortgage.sol index e69825f..a00243d 100644 --- a/contracts/mortgage/Mortgage.sol +++ b/contracts/mortgage/Mortgage.sol @@ -36,17 +36,17 @@ contract Mortgage is IMortgage, ReentrancyGuardUpgradeable, AccessControlUpgrade _token = token_; } - function deposit(bytes32 name, bytes32 tld, address owner, uint256 amount) public whenNotPaused nonReentrant { + function deposit(bytes32 name, bytes32 tld, address owner, address spender, uint256 amount) public whenNotPaused nonReentrant { require(isExists(name, tld), "DOMAIN_NOT_EXISTS"); require(_registry.isLive(name, tld), "DOMAIN_EXPIRED"); - _token.safeTransferFrom(_msgSender(), address(this), getRequirement(name, tld)); + _token.safeTransferFrom(spender, address(this), getRequirement(name, tld)); _funds[tld][name][owner] += amount; emit Deposit(name, tld, owner, amount); } - function withdraw(bytes32 name, bytes32 tld, uint256 amount) public whenNotPaused nonReentrant { + function withdraw(bytes32 name, bytes32 tld, address recipient, uint256 amount) public whenNotPaused nonReentrant { require(_funds[tld][name][_msgSender()] >= amount, "FUND_AMOUNT_EXCEEDED"); - _token.safeTransferFrom(address(this), _msgSender(), amount); + _token.safeTransferFrom(address(this), recipient, amount); emit Withdraw(name, tld, _msgSender(), amount); } diff --git a/contracts/mortgage/interfaces/IMortgage.sol b/contracts/mortgage/interfaces/IMortgage.sol index 022c20f..4c123b4 100644 --- a/contracts/mortgage/interfaces/IMortgage.sol +++ b/contracts/mortgage/interfaces/IMortgage.sol @@ -5,9 +5,9 @@ interface IMortgage { event Deposit(bytes32 name, bytes32 tld, address owner, uint256 amount); event Withdraw(bytes32 name, bytes32 tld, address to, uint256 amount); - function deposit(bytes32 name, bytes32 tld, address owner, uint256 amount) external; + function deposit(bytes32 name, bytes32 tld, address owner, address spender, uint256 amount) external; - function withdraw(bytes32 name, bytes32 tld, uint256 amount) external; + function withdraw(bytes32 name, bytes32 tld, address recipient, uint256 amount) external; function setRequirement(bytes32 name, bytes32 tld, uint256 amount) external; diff --git a/scripts/B14_Setup_Mortgage.ts b/scripts/B14_Setup_Mortgage.ts index 291a495..0033249 100644 --- a/scripts/B14_Setup_Mortgage.ts +++ b/scripts/B14_Setup_Mortgage.ts @@ -1,6 +1,6 @@ import { ethers } from "hardhat"; import { getContracts } from "./src/lib/get-contracts"; -import { setupMigrationManager, setupMortgage } from "./src/setup"; +import { setupMortgage } from "./src/setup"; async function main() { const [signer] = await ethers.getSigners(); diff --git a/scripts/C01_Upgrade_Registry.ts b/scripts/C01_Upgrade_Registry.ts index 67ff4d4..76053fb 100644 --- a/scripts/C01_Upgrade_Registry.ts +++ b/scripts/C01_Upgrade_Registry.ts @@ -1,5 +1,6 @@ import { ethers } from "hardhat"; import { getContracts } from "./src/lib/get-contracts"; +import { setupRegistry } from "./src/setup"; import { upgradeRegistry } from "./src/upgrade"; async function main() { @@ -7,6 +8,7 @@ async function main() { const chainId = await signer.getChainId(); const contracts = await getContracts(signer); await upgradeRegistry({ signer, chainId, contracts }); + await setupRegistry({ signer, chainId, contracts }); } main().catch((error) => { diff --git a/scripts/C14_Upgrade_Mortgage.ts b/scripts/C14_Upgrade_Mortgage.ts index 5054103..c254f0f 100644 --- a/scripts/C14_Upgrade_Mortgage.ts +++ b/scripts/C14_Upgrade_Mortgage.ts @@ -1,12 +1,12 @@ import { ethers } from "hardhat"; import { getContracts } from "./src/lib/get-contracts"; -import { upgradeMigrationManager } from "./src/upgrade"; +import { upgradeMortgage } from "./src/upgrade"; async function main() { const [signer] = await ethers.getSigners(); const chainId = await signer.getChainId(); const contracts = await getContracts(signer); - await upgradeMigrationManager({ signer, chainId, contracts }); + await upgradeMortgage({ signer, chainId, contracts }); } main().catch((error) => { diff --git a/static/contracts.json b/static/contracts.json index 12d86c7..2619cc7 100644 --- a/static/contracts.json +++ b/static/contracts.json @@ -90,10 +90,10 @@ "Registry.DiamondCutFacet": "0x16F8202C66de13B843321d6947052d8BE68cC874", "Registry.DiamondLoupeFacet": "0x0bE19b357eFD1E353704C4a7c5810e18fDBCad40", "Registry.AccessControlFacet": "0x020A9D14a0B93676420DDAE8d7c0BC049815cE51", - "Registry.TldRecordFacet": "0xdc9A9FaE9c3e53B9df13c46F2E21c41562B0250D", - "Registry.DomainRecordFacet": "0x2FBBb72406e7b9cBac2fE139038C4b6a0be17E9B", - "Registry.HostRecordFacet": "0xDeaB37d64e8B1176d4b1a7fC35DC212bE3d277f0", - "Registry.BaseRegistryFacet": "0x4Cd9f4a4585D2E202e76766Dde7A063D19C30774", + "Registry.TldRecordFacet": "0x540621Ad648F66f25bfC9BCB550818985820C2aA", + "Registry.DomainRecordFacet": "0xb031aaDa447caAaa76A25Cd7282104cAe7C225F0", + "Registry.HostRecordFacet": "0x3429484d18B4ad3f3F53C32968b2dB7bf80b5888", + "Registry.BaseRegistryFacet": "0xD2714B1B539764037DaBe6172b855ED897d7e4A4", "Registry.Diamond": "0x2B295aFC93E4f9eBa1A2170D531A42C0232B2102", "DefaultWrapper": "0x2cbbF202b3977E3534cE8EDAd768c4742DeD11ae", "PublicResolver": "0xe90EAE12B9A9CC3AB8BAF9dB06422D6c5922213f", diff --git a/test/index.ts b/test/index.ts index 95b70c5..9e54d96 100644 --- a/test/index.ts +++ b/test/index.ts @@ -331,7 +331,7 @@ describe("Deploy & Setup", function () { expect(await contracts.PublicResolver.getText(ethers.utils.toUtf8Bytes("@"), ethers.utils.toUtf8Bytes(name), ethers.utils.toUtf8Bytes(tld))).to.equal(""); expect( - contracts.PublicResolver.connect(signer_1)["setAddress"](ethers.utils.toUtf8Bytes("@"), ethers.utils.toUtf8Bytes(name), ethers.utils.toUtf8Bytes(tld), signer_1.address), + contracts.PublicResolver.connect(signer_1)["setAddress"](ethers.utils.toUtf8Bytes(host), ethers.utils.toUtf8Bytes(name), ethers.utils.toUtf8Bytes(tld), signer_1.address), ).to.be.revertedWith("DOMAIN_MORTGAGE_NOT_FULFILLED"); // Mint some token to signer_1