diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3d14b89b8a..6592b5a14b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
## Current
### Features
+- [#4423](https://github.com/blockscout/blockscout/pull/4423) - Add creation time of contract in the results of the search
- [#4391](https://github.com/blockscout/blockscout/pull/4391) - Add batched transactions on the `address/{addressHash}/transactions` page
- [#4353](https://github.com/blockscout/blockscout/pull/4353) - Added live-reload on the token holders page
diff --git a/apps/block_scout_web/assets/js/lib/autocomplete.js b/apps/block_scout_web/assets/js/lib/autocomplete.js
index 67ea2aaf19..3fbe65cf13 100644
--- a/apps/block_scout_web/assets/js/lib/autocomplete.js
+++ b/apps/block_scout_web/assets/js/lib/autocomplete.js
@@ -1,4 +1,5 @@
import AutoComplete from '@tarekraafat/autocomplete.js/dist/autoComplete.js'
+import { DateTime } from 'luxon'
const placeHolder = 'Search by address, token symbol, name, transaction hash, or block number'
const dataSrc = async (query, id) => {
@@ -44,10 +45,13 @@ const searchEngine = (query, record) => {
record.contract_address_hash.toLowerCase().includes(query.toLowerCase())) {
var searchResult = `${record.contract_address_hash}
${record.name}`
if (record.symbol) {
- searchResult = searchResult + ` (${record.symbol})`
+ searchResult += ` (${record.symbol})`
}
if (record.holder_count) {
- searchResult = searchResult + ` ${record.holder_count} holder(s)`
+ searchResult += ` ${record.holder_count} holder(s)`
+ }
+ if (record.inserted_at) {
+ searchResult += ` (${DateTime.fromISO(record.inserted_at).toLocaleString(DateTime.DATETIME_SHORT)})`
}
var re = new RegExp(query, 'ig')
searchResult = searchResult.replace(re, '$&')
diff --git a/apps/block_scout_web/assets/package-lock.json b/apps/block_scout_web/assets/package-lock.json
index ff056099e4..681ff5f269 100644
--- a/apps/block_scout_web/assets/package-lock.json
+++ b/apps/block_scout_web/assets/package-lock.json
@@ -24,6 +24,7 @@
"humps": "^2.0.1",
"jquery": "^3.4.0",
"lodash": "^4.17.19",
+ "luxon": "^2.0.1",
"moment": "^2.29.1",
"nanomorph": "^5.4.0",
"numeral": "^2.0.6",
@@ -11161,6 +11162,14 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
+ "node_modules/luxon": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.0.1.tgz",
+ "integrity": "sha512-8Eawf81c9ZlQj62W3eq4mp+C7SAIAnmaS7ZuEAiX503YMcn+0C1JnMQRtfaQj6B5qTZLgHv0F4H5WabBCvi1fw==",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -26650,6 +26659,11 @@
}
}
},
+ "luxon": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.0.1.tgz",
+ "integrity": "sha512-8Eawf81c9ZlQj62W3eq4mp+C7SAIAnmaS7ZuEAiX503YMcn+0C1JnMQRtfaQj6B5qTZLgHv0F4H5WabBCvi1fw=="
+ },
"make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
diff --git a/apps/block_scout_web/assets/package.json b/apps/block_scout_web/assets/package.json
index a5e3f92338..0d58582f10 100644
--- a/apps/block_scout_web/assets/package.json
+++ b/apps/block_scout_web/assets/package.json
@@ -36,6 +36,7 @@
"humps": "^2.0.1",
"jquery": "^3.4.0",
"lodash": "^4.17.19",
+ "luxon": "^2.0.1",
"moment": "^2.29.1",
"nanomorph": "^5.4.0",
"numeral": "^2.0.6",
diff --git a/apps/explorer/lib/explorer/chain.ex b/apps/explorer/lib/explorer/chain.ex
index 0ffe32e2d0..7f55374e14 100644
--- a/apps/explorer/lib/explorer/chain.ex
+++ b/apps/explorer/lib/explorer/chain.ex
@@ -1130,8 +1130,14 @@ defmodule Explorer.Chain do
{:some, term} ->
query =
from(smart_contract in SmartContract,
- where: fragment("to_tsvector(name) @@ to_tsquery(?)", ^term),
- select: %{contract_address_hash: smart_contract.address_hash, name: smart_contract.name},
+ left_join: address in Address,
+ on: smart_contract.address_hash == address.hash,
+ where: fragment("to_tsvector(name ) @@ to_tsquery(?)", ^term),
+ select: %{
+ contract_address_hash: smart_contract.address_hash,
+ name: smart_contract.name,
+ inserted_at: address.inserted_at
+ },
order_by: [desc: smart_contract.inserted_at]
)