@@ -95,20 +95,15 @@ contract NFT is
9595 home = _home;
9696 for (uint i; i < _firstMembers.length ; i++ ) {
9797 _govMint (_firstMembers[i], _uri);
98- _delegate (_firstMembers[i], _firstMembers[i]);
9998 }
10099 }
101100
102- /**
103- * @notice Adds a new member on home chain
104- * @dev Only callable by owner (governance) on home chain
105- * @param to Address to mint token to
106- * @param uri Token metadata URI
107- */
101+ /// @notice Adds a new member to the DAO
102+ /// @dev Mints a new NFT to the specified address
103+ /// @param to The address of the new member
104+ /// @param uri The metadata URI for the new NFT
108105 function safeMint (address to , string memory uri ) public onlyOwner onlyHomeChain {
109- uint256 nonce = _proofStorage.incrementNonce (uint8 (OperationType.MINT));
110106 _govMint (to, uri);
111- emit MembershipClaimed (_nextTokenId - 1 , to, nonce);
112107 }
113108
114109 /**
@@ -162,29 +157,6 @@ contract NFT is
162157 return ProofHandler.generateProof (address (this ), operationType, params, nextNonce);
163158 }
164159
165- /**
166- * @notice Generates proof for delegation
167- * @dev Only callable on home chain
168- * @param delegator Address delegating voting power
169- * @param delegatee Address receiving delegation
170- * @return Encoded proof data
171- */
172- function generateDelegationProof (
173- address delegator ,
174- address delegatee
175- ) external view returns (bytes memory ) {
176- require (block .chainid == home, "Proofs only generated on home chain " );
177- uint256 nextNonce = _proofStorage.getNextNonce (uint8 (OperationType.DELEGATE));
178- bytes memory params = abi.encode (delegator, delegatee);
179- return
180- ProofHandler.generateProof (
181- address (this ),
182- uint8 (OperationType.DELEGATE),
183- params,
184- nextNonce
185- );
186- }
187-
188160 // Claim operations
189161
190162 /**
@@ -196,9 +168,17 @@ contract NFT is
196168 .verifyAndClaimProof (proof, address (this ), _proofStorage);
197169
198170 if (operationType == uint8 (OperationType.MINT)) {
199- (address to , string memory uri ) = abi.decode (params, (address , string ));
200- _govMint (to, uri);
201- emit MembershipClaimed (_nextTokenId - 1 , to, nonce);
171+ (uint256 tokenId , address owner , string memory uri ) = abi.decode (
172+ params,
173+ (uint256 , address , string )
174+ );
175+
176+ try this .ownerOf (tokenId) returns (address ) {
177+ revert ("Token already exists " );
178+ } catch {
179+ _govMint (owner, uri);
180+ emit MembershipClaimed (_nextTokenId - 1 , owner, nonce);
181+ }
202182 } else if (operationType == uint8 (OperationType.BURN)) {
203183 uint256 tokenId = abi.decode (params, (uint256 ));
204184 address owner = ownerOf (tokenId);
@@ -215,21 +195,6 @@ contract NFT is
215195 }
216196 }
217197
218- /**
219- * @notice Claims a delegation operation on a foreign chain
220- * @param proof Proof generated by home chain
221- */
222- function claimDelegation (bytes memory proof ) external {
223- (uint8 operationType , bytes memory params , uint256 nonce ) = ProofHandler
224- .verifyAndClaimProof (proof, address (this ), _proofStorage);
225-
226- require (operationType == uint8 (OperationType.DELEGATE), "Invalid operation type " );
227- (address delegator , address delegatee ) = abi.decode (params, (address , address ));
228-
229- _delegate (delegator, delegatee);
230- emit DelegationSynced (delegator, delegatee, nonce);
231- }
232-
233198 /**
234199 * @notice Internal function for minting without proof verification
235200 * @param to Address to receive token
0 commit comments