From b1b67b851438e3c061fe3fd64f3260043e65c0e9 Mon Sep 17 00:00:00 2001 From: Ruben Dinis Date: Thu, 18 Apr 2024 11:36:16 +0100 Subject: [PATCH] Add some safety checks --- contracts/passport/PassportRegistry.sol | 8 ++++++-- test/contracts/passport/passportRegistry.ts | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/contracts/passport/PassportRegistry.sol b/contracts/passport/PassportRegistry.sol index 1f27223..f27bd04 100644 --- a/contracts/passport/PassportRegistry.sol +++ b/contracts/passport/PassportRegistry.sol @@ -104,7 +104,6 @@ contract PassportRegistry is Ownable, Pausable { uint256 id ) public onlyOwner whenNotPaused whenAdminGeneration { require(passportId[wallet] == 0, "Passport already exists"); - require(idPassport[id] == address(0), "Passport id already issued"); totalAdminsCreates.increment(); @@ -117,12 +116,15 @@ contract PassportRegistry is Ownable, Pausable { */ function transfer(address newWallet) public whenNotPaused { uint256 id = passportId[msg.sender]; + uint256 newWalletId = passportId[newWallet]; require(id != 0, "Passport does not exist"); + require(newWalletId == 0, "Wallet passed already has a passport"); passportId[msg.sender] = 0; passportId[newWallet] = id; idPassport[id] = newWallet; walletActive[msg.sender] = false; + walletActive[newWallet] = true; totalPassportTransfers.increment(); emit Transfer(id, id, msg.sender, newWallet); @@ -208,7 +210,7 @@ contract PassportRegistry is Ownable, Pausable { * @notice Changes the contract generation mode. * @dev Can only be called by the owner. */ - function setGenerationMode(bool sequencialFlag, uint256 nextSequencialPassportId) public whenNotPaused onlyOwner { + function setGenerationMode(bool sequencialFlag, uint256 nextSequencialPassportId) public onlyOwner { _sequencial = sequencialFlag; _nextSequencialPassportId = nextSequencialPassportId; @@ -232,6 +234,8 @@ contract PassportRegistry is Ownable, Pausable { // private function _create(address wallet, uint256 id, string memory source) private { + require(idPassport[id] == address(0), "Passport id already issued"); + totalCreates.increment(); idPassport[id] = wallet; diff --git a/test/contracts/passport/passportRegistry.ts b/test/contracts/passport/passportRegistry.ts index d5ac830..621f474 100644 --- a/test/contracts/passport/passportRegistry.ts +++ b/test/contracts/passport/passportRegistry.ts @@ -261,6 +261,27 @@ describe("Passport", () => { expect(holderThreePreviousPassportId).to.eq(false); }); + it("allows the passport owner to transfer the passport", async () => { + await contract.connect(holderOne).create("farcaster"); + + await contract.connect(holderOne).transfer(holderThree.address); + + const holderOnePassportId = await contract.passportId(holderOne.address); + const holderThreePassportId = await contract.passportId(holderThree.address); + + expect(holderOnePassportId).to.eq(0); + expect(holderThreePassportId).to.eq(1); + }); + + it("prevents the passport owner to transfer the passport to an existing owner wallet", async () => { + await contract.connect(holderOne).create("farcaster"); + await contract.connect(holderThree).create("lens"); + + const action = contract.connect(holderOne).transfer(holderThree.address); + + await expect(action).to.be.revertedWith("Wallet passed already has a passport"); + }); + it("admin generation", async () => { const action = contract.connect(admin).adminCreate("farcaster", holderOne.address, 1010);