@@ -174,11 +174,35 @@ bool CSparkNameManager::CheckSparkNameTx(const CTransaction &tx, int nHeight, CV
174174 if (!IsSparkNameValid (sparkNameData.name ))
175175 return state.DoS (100 , error (" CheckSparkNameTx: invalid name" ));
176176
177+ int existingExpirationHeight = -1 ;
178+ bool fUpdateExistingRecord = false ;
179+ bool fSparkNameTransfer = sparkNameData.nVersion >= 2 && sparkNameData.operationType == (uint8_t )CSparkNameTxData::opTransfer;
180+
181+ if (sparkNames.count (ToUpper (sparkNameData.name )) > 0 ) {
182+ // it's possible to change any metadata of the existing name but if the spark address is being
183+ // tranferred, new name shouldn't be already registered
184+ if (!fSparkNameTransfer && sparkNames[ToUpper (sparkNameData.name )].sparkAddress != sparkNameData.sparkAddress )
185+ return state.DoS (100 , error (" CheckSparkNameTx: name already exists" ));
186+
187+ fUpdateExistingRecord = true ;
188+ existingExpirationHeight = sparkNames[ToUpper (sparkNameData.name )].sparkNameValidityHeight ;
189+ }
190+
177191 constexpr int nBlockPerYear = 365 *24 *24 ; // 24 blocks per hour
178- int nYears = (sparkNameData.sparkNameValidityBlocks + nBlockPerYear-1 ) / nBlockPerYear;
192+ int validityBlocks = sparkNameData.sparkNameValidityBlocks ;
193+ if (nHeight >= consensusParams.nSparkNamesV21StartBlock ) {
194+ if (existingExpirationHeight != -1 )
195+ validityBlocks = std::max (validityBlocks, existingExpirationHeight - nHeight + validityBlocks);
196+ // after nSparkNamesV21StartBlock, max validity is 15 years
197+ if (validityBlocks > nBlockPerYear * 15 )
198+ return state.DoS (100 , error (" CheckSparkNameTx: can't be valid for more than 15 years" ));
199+ }
200+ else {
201+ if (validityBlocks > nBlockPerYear * 10 )
202+ return state.DoS (100 , error (" CheckSparkNameTx: can't be valid for more than 10 years" ));
203+ }
179204
180- if (sparkNameData.sparkNameValidityBlocks > nBlockPerYear * 10 )
181- return state.DoS (100 , error (" CheckSparkNameTx: can't be valid for more than 10 years" ));
205+ int nYears = (validityBlocks + nBlockPerYear-1 ) / nBlockPerYear;
182206
183207 CAmount nameFee = consensusParams.nSparkNamesFee [sparkNameData.name .size ()] * COIN * nYears;
184208
@@ -196,18 +220,6 @@ bool CSparkNameManager::CheckSparkNameTx(const CTransaction &tx, int nHeight, CV
196220 if (sparkNameData.additionalInfo .size () > 1024 )
197221 return state.DoS (100 , error (" CheckSparkNameTx: additional info is too long" ));
198222
199- bool fUpdateExistingRecord = false ;
200- bool fSparkNameTransfer = sparkNameData.nVersion >= 2 && sparkNameData.operationType == (uint8_t )CSparkNameTxData::opTransfer;
201-
202- if (sparkNames.count (ToUpper (sparkNameData.name )) > 0 ) {
203- // it's possible to change any metadata of the existing name but if the spark address is being
204- // tranferred, new name shouldn't be already registered
205- if (!fSparkNameTransfer && sparkNames[ToUpper (sparkNameData.name )].sparkAddress != sparkNameData.sparkAddress )
206- return state.DoS (100 , error (" CheckSparkNameTx: name already exists" ));
207-
208- fUpdateExistingRecord = true ;
209- }
210-
211223 {
212224 LOCK (cs_spark_name);
213225 if ((fSparkNameTransfer || !fUpdateExistingRecord ) && sparkNameAddresses.count (sparkNameData.sparkAddress ) > 0 )
0 commit comments