Skip to content

Commit f0c1001

Browse files
committed
up
1 parent 8885cc1 commit f0c1001

14 files changed

+336
-112
lines changed

ethname/Manifest.txt

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Rakefile
55
config/contracts.2017.csv
66
config/contracts.2021.csv
77
config/contracts.2022.csv
8+
config/contracts.2023.csv
89
lib/ethname.rb
910
lib/ethname/directory.rb
1011
lib/ethname/version.rb

ethname/config/contracts.2022.csv

+24
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,27 @@ address, names, interfaces, created
3333
0x6229c811d04501523c6058bfaac29c91bb586268, nouns descriptor v2,, 2022-07-14 14:40:29
3434
0x8761b55af5a703d5855f1865db8fe4dd18e94c53, synth nouns | synthetic nouns,, 2022-07-23 11:31:20
3535

36+
37+
38+
0x8ae5523f76a5711fb6bdca1566df3f4707aec1c4, long live kevin | kevin, , 2022-06-22 03:20:35
39+
40+
0x82e8129dafb2d5f06aeded321fb04628f95ef654, women, , 2022-08-30 05:51:20
41+
42+
0x844da5d5d3c1929229be1d326933307ce29065a8, smiley, , 2022-09-16 00:36:11
43+
0x139cf58d69779eea2edc9d0000a8f9d186d89bbb, pepitos, , 2022-09-23 23:33:23
44+
45+
0x25b4e698bfba060728dee0ca851d536020c79866, peepos, , 2022-10-06 05:58:23
46+
47+
0x7915bf033126fa5fcc4dfa79f9bdd5717ed4ce40, mad masks, , 2022-11-05 04:15:11
48+
0x3b84502df3d36ef2e5318bce5a988460cf349304, teddies, , 2022-11-10 22:58:11
49+
0x9a7d9b8693339f82d65f315f180faa0a558469bd, dick butts, , 2022-11-10 23:56:23
50+
0xcd46fce2daf0f2f5129f74b502667e61b15c89f3, people, , 2022-11-16 11:20:59
51+
0x7c2af580f37c23270dd7c52765073c1601c4ad33, dos phunks, , 2022-11-25 14:19:35
52+
0x9251dec8df720c2adf3b6f46d968107cbbadf4d4, skulls, , 2022-11-26 05:34:59
53+
54+
0xb1bee499b063ee2663b52bfc7a1372296d94e24d, chimps, , 2022-12-04 19:18:47
55+
0xd8a47f76bdca04d1b959cc70d72ae5539812e931, 3d skulls, , 2022-12-10 07:21:35
56+
0xe8a9189218ccd5aa20aca3398e2324ab01ef3bfd, cherry nouns, , 2022-12-10 07:59:35
57+
0xda1d2141154d33cb3b1ce9c87002b07bd24908e9, gatekeepers, , 2022-12-14 02:28:11
58+
0x6255f0e78c520decccb5356d4f51a3df04149a3d, grimmers, , 2022-12-15 10:57:35
59+
0x6c1c678428cc3793a53471c9304fc0372594dbbc, smol phunks | 3d phunks, , 2022-12-21 07:30:23

ethname/config/contracts.2023.csv

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
address, names, interfaces, created
2+
0x22a81c80bb6bf4b797acf08351934b46193bddde, novo | novo punks, , 2023-01-08 04:10:59
3+
0x897792d16a46f9e70446638bfc6a0d884b741f9b, pepe burb punks, , 2023-01-10 13:36:47
4+
0x0e10e5e978ba4d1af92eb554cd730c9b97f4e571, pepe blocks, , 2023-01-14 05:37:35
5+
0x5a8e04a84fb2f6ad4002c824045c7c1bde10cb81, frog central, , 2023-01-17 03:42:35
6+
0xe302f509c4a3729791215f74299f1fa626396e5a, gm kevin, , 2023-01-19 00:24:35
7+
0xcce158dd5384b599fc29fe34d83b11ea8fb7a816, death of kevin, , 2023-01-22 12:09:47
8+
0xb0dc51536e2b4950d7d6667748a6be6fc53c3318, cute kevin, , 2023-01-22 16:29:35
9+
0x94cb646dd34b3b0ff7c116208f7f7ff7ac216079, ecc0s, , 2023-01-25 12:38:11
10+
0xe6313d1776e4043d906d5b7221be70cf470f5e87, shiba, , 2023-01-26 02:20:47

ethname/lib/ethname.rb

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def self.dir
1313
@dir ||= Directory.read( "#{root}/config/contracts.2017.csv",
1414
"#{root}/config/contracts.2021.csv",
1515
"#{root}/config/contracts.2022.csv",
16+
"#{root}/config/contracts.2023.csv",
1617
)
1718
end
1819
class << self

ethname/lib/ethname/version.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module Ethname
44
MAJOR = 0
55
MINOR = 1
6-
PATCH = 2
6+
PATCH = 3
77
VERSION = [MAJOR,MINOR,PATCH].join('.')
88

99
def self.version

ethname/sandbox/contractdetails.csv

+26
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,39 @@ blocknumber, timestamp, address, creator, txid
2121
0xd7bcbd, 0x61fcea8a, 0xd12882c8b5d1bccca57c994c6af7d96355590dbd, 0xc874f918f29addeb8d0a377a625fcaa91007ca66, 0xd02314f9638dd3db61c85cfaf4d11dd3abf85952619e7a87aea43c72c6adb3b9
2222
0xd8aa65, 0x62094d9f, 0xaf9ce4b327a3b690abea6f78eccbfefffbea9fdf, 0x3ce6543978f37315e047236139817c1f446300e5, 0xfd08b691d12ff2cf05e7edccd2a311e124bffdfeb528d666c98221c93dd3d648
2323
0xdea450, 0x62599f86, 0x23581767a106ae21c074b2276d25e5c3e136a68b, 0x6c8984baf566db08675310b122bf0be9ea269eca, 0xd4547dc336dd4a0655f11267537964d7641f115ef3d5440d71514e3efba9d210
24+
0xe4f796, 0x62b28a83, 0x8ae5523f76a5711fb6bdca1566df3f4707aec1c4, 0xea208da933c43857683c04bc76e3fd331d7bfdf7, 0xe25e2c321779de5a944ade29fe12787c76836ad47f28476ec86328b7d1479e54
2425
0xe709ec, 0x62d02add, 0x6229c811d04501523c6058bfaac29c91bb586268, 0xac56e6156c9c0c56b6d9a4e8388799f25d7feb86, 0x2d1785073b0eac3fefc126badf6cfee3128639a35e439dcee7255f2397e9d531
2526
0xe756cf, 0x62d42f7c, 0xe9b91d537c3aa5a3fa87275fbd2e4feaaed69bd0, 0xdf12dba344515c98f866af1436245438cd7d8566, 0xf6cca6972347e21871d55febe8f091e1d9d7584919826bce9d5ced237e8dd937
2627
0xe7e9c3, 0x62dbdc08, 0x8761b55af5a703d5855f1865db8fe4dd18e94c53, 0x970a2bafd2bea9f62592e9b036bf07c287078151, 0xd730f037162e1c9602d2881ceb4600b5d595e0032b21a9e77157e668f35e28be
28+
0xeb933c, 0x630da558, 0x82e8129dafb2d5f06aeded321fb04628f95ef654, 0x7ce5c931beea68a6bba6551ff5d993c86fa121c5, 0x598fe35a295878a83f4cd8df737fd9ab9c1a512c8b2065a3a98e6ef641b56e36
2729
0xec0ede, 0x631450d6, 0xad8474ba5a7f6abc52708f171f57fefc5cdc8c1c, 0xfdf474098acdaec5bf8b4f7798b3e64da0d60f57, 0x9623323e2487dc3e1ed8ed3d5d2014bf81119d6b54ca8980e69445259f9ba065
2830
0xecfbaa, 0x6321562e, 0xe5a5520b798c5f67ca1b0657b932656df02595ad, 0x549c01f812e609b80548c9837b2dacb0cb0adc64, 0x2bea1b01e5b23837de243bb1ae0298adcf710a5d26ff25b3b597c44074ac04bd
31+
0xed2996, 0x6323c4fb, 0x844da5d5d3c1929229be1d326933307ce29065a8, 0x7ce5c931beea68a6bba6551ff5d993c86fa121c5, 0x5cc7d322be5a85cb7c0384b0d1c0ec99ebd49b01c427c8c2ae12bfd66a133a1f
2932
0xedf272, 0x632d4a9f, 0x9b66d03fc1eee61a512341058e95f1a68dc3a913, 0xd503b89b39e5d820399e94ba6250b90fa22b9812, 0x88d3c3c0ac27e4ab93624a5de05ecd83e75637a0e434c02d8b7475f5392629a6
33+
0xee06fe, 0x632e4243, 0x139cf58d69779eea2edc9d0000a8f9d186d89bbb, 0x4f04c937a3ad3b77c16d856c9edd683c64e01f45, 0xda4fb6c02fa374b2dd4359e1694dbfd011f552e7d936135583d06caf2718cd17
34+
0xef5dd5, 0x633e6e7f, 0x25b4e698bfba060728dee0ca851d536020c79866, 0xaf2ab6d0e8f69656e7c8c967351de32f0d60fe76, 0xa38be7eaf3603089268746a9634d861a1201c500df19d475324b69d99fce20c0
3035
0xef95d3, 0x634112e7, 0x34625ecaa75c0ea33733a05c584f4cf112c10b6b, 0xf2c0149f0cff4c19b9819d1084f465df0e1b3795, 0xb9f71063933f573385b4a1f076eb9eea74bcb35a26bb6e7e095fe1cdc92db40d
3136
0xf15908, 0x635655e3, 0x2204a94f96d39df3b6bc0298cf068c8c82dc8d61, 0x29323644b5540d20e834578943a2bd91027699b1, 0xa4af8ee34de9681242bdec6b690aa98dc8325f0d7a3719300d7566d5af24ebfa
37+
0xf2a2b4, 0x6365e34f, 0x7915bf033126fa5fcc4dfa79f9bdd5717ed4ce40, 0x1a1427a73b7cb0f4ea3f71c6c8090c4366c8ebe1, 0x526aeee62599e459be8b6a4c692745844e4a3ef9e5527b3228d342e44220620f
38+
0xf34460, 0x636d8203, 0x3b84502df3d36ef2e5318bce5a988460cf349304, 0x4b074b99b7454dc183fe363faca21b2d7b120781, 0x14a480b0a019ebc28de31f708e64101ad825f1ecf31646583f9799dde7f8ab1a
39+
0xf34582, 0x636d8fa7, 0x9a7d9b8693339f82d65f315f180faa0a558469bd, 0x75f52aef21c1692afa9bbe897a31db3002baf6c3, 0xfc0c612f7097eaaf52a0c2bf1cad71dc0dd6165a9cde7be16b5babc48497e025
40+
0xf3deae, 0x6374c79b, 0xcd46fce2daf0f2f5129f74b502667e61b15c89f3, 0xaf7a60900bf698814b7d4f5e3995361f9cee9150, 0xd7c71b931d08b67ff961b77bdf27762cdb1dae8cfb73169dcc1fa279524ae2f5
41+
0xf4ddc3, 0x6380cef7, 0x7c2af580f37c23270dd7c52765073c1601c4ad33, 0xa6933faa928ab80ba00acc4826f536e236b038ae, 0x236e52c4359b5e743cf98a1bde9d90ae4d2f7bb34c9e1371e85ff2a43d719e2f
42+
0xf4ef8a, 0x6381a583, 0x9251dec8df720c2adf3b6f46d968107cbbadf4d4, 0x8b3f6f5c62ff1d8b66dc04ba3cc309e260bc4693, 0x15bbba06d97572cc94912ffe3c9ff47facf38dcf7265ab26e33992dd3dd2c671
3243
0xf5d8d5, 0x638ca497, 0xd8e916c3016be144eb2907778cf972c4b01645fc, 0xc43473fa66237e9af3b2d886ee1205b81b14b2c8, 0x0d073c189b337ced2275e2f717b6ddd596e306de7e594588f12132d7fefb33ac
44+
0xf5df48, 0x638cf297, 0xb1bee499b063ee2663b52bfc7a1372296d94e24d, 0xcb954e171c1bfdadc4af7adb3f4b20bb937b6158, 0xb8dadf50471cf57c32a43b3073359ccdb0b3456e729e9a0f86a2166bca171ad2
3345
0xf66fe1, 0x6393c803, 0x58e90596c2065befd3060767736c829c18f3474c, 0xc43473fa66237e9af3b2d886ee1205b81b14b2c8, 0x92d3a69c4ac96ddd432f1c13e5dbb8bf3d7782489e7ee3538e78a25f2480c34f
46+
0xf678c8, 0x6394337f, 0xd8a47f76bdca04d1b959cc70d72ae5539812e931, 0x019b0ee245fb09aaf92ac93ca3309832b7974681, 0x63b5353d737a0b0cfcd6a7a02e1573a13df4ba5ced7bf5e605ee6f64ec989481
47+
0xf67984, 0x63943c67, 0xe8a9189218ccd5aa20aca3398e2324ab01ef3bfd, 0xc92b56eec24b3405afb08ee7215fd50725fa7df7, 0x3c66f2dd1fd70e0853faade94bdf4f58475c137badf16a3b17b2bf5b7490bfa4
48+
0xf6e2ef, 0x639934bb, 0xda1d2141154d33cb3b1ce9c87002b07bd24908e9, 0xd503b89b39e5d820399e94ba6250b90fa22b9812, 0x38b2d4c39205df341bddaebafbdcc602c107a27380458f6cae87c7837a597103
49+
0xf708ca, 0x639afd9f, 0x6255f0e78c520decccb5356d4f51a3df04149a3d, 0xe38a7e006aaa0d848587606022dc72872fa6b5e3, 0x0f5fec339fb7f164acc56ef5d2d84e25faea62f55f06edc3ea92970910b8a6f0
50+
0xf7aca9, 0x63a2b60f, 0x6c1c678428cc3793a53471c9304fc0372594dbbc, 0x019b0ee245fb09aaf92ac93ca3309832b7974681, 0x16e2f52fc5542b6cf23814cb22cce6bb01c9a4715452fd87b9ec53bf077723d0
51+
0xf9a0ae, 0x63ba4253, 0x22a81c80bb6bf4b797acf08351934b46193bddde, 0x675e19ebf696faaa27aaa7531edd51e2e75a5baa, 0x0326255452a09ebb308ffcb85a81d97ff68ff6327931ac3aaca7381a7306f016
52+
0xf9e3ac, 0x63bd69ef, 0x897792d16a46f9e70446638bfc6a0d884b741f9b, 0x3dd1a54a8f84d34929e182e03371d2a2f4d47002, 0x518c1d8ee889a3137ccd2e64098fb8b12820d5792ac62f046d7f1541d8f90987
53+
0xfa4a36, 0x63c23f9f, 0x0e10e5e978ba4d1af92eb554cd730c9b97f4e571, 0x240b4b8bf7b50806c1823de45f6fb85441867d01, 0x267f695907de3eff5dd959baf0eaae09664712b8c6c0af912819ceeff3514c51
54+
0xfa9bd8, 0x63c6192b, 0x5a8e04a84fb2f6ad4002c824045c7c1bde10cb81, 0x37d245b218ffd8d546b5d16cc1f95442f70ac6ec, 0x9bfd936ad5acd79908bc7b932e3c543c5aad2156d98998c708c91e6990746739
55+
0xfad004, 0x63c88dc3, 0xe302f509c4a3729791215f74299f1fa626396e5a, 0x5d76f8887b6e8bd6b73ed435c935fa8fc2872edb, 0x239b98cf9e22cc709eb6d65801cd7b8f823f049592341aadea4311f974c7455d
56+
0xfb31a9, 0x63cd278b, 0xcce158dd5384b599fc29fe34d83b11ea8fb7a816, 0xbe1c3d1f47707990d0c852589c7e3f1c13da3b00, 0x6f0d84f531b518cbb041d9ce5b06b9d82783f41d7a83732192d132a58640dc2d
57+
0xfb36b9, 0x63cd646f, 0xb0dc51536e2b4950d7d6667748a6be6fc53c3318, 0x42f575ebe22d4be35fe9e5906c7736416d70e58e, 0x1bac8a1f5f6ebdded47764c8b2b123e8dd1435743d315d71fce096b0b022da0f
58+
0xfb862b, 0x63d122b3, 0x94cb646dd34b3b0ff7c116208f7f7ff7ac216079, 0x8caf042685e8740c6dc9d6ac23a28d0be00139e3, 0x46673453163a9adaa61de585d874ed41bcea1c70a74a5c49f041e2db7a10922a
59+
0xfb9621, 0x63d1e37f, 0xe6313d1776e4043d906d5b7221be70cf470f5e87, 0x84bb73064300ab1f539310237b892ca47c58778c, 0xe015aef229ebe54e6e0b788a0b3eeafac1f4a881dffef74d96e3695a63e0c261

ethname/sandbox/helper.rb

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
$LOAD_PATH.unshift( "../etherscan-lite/lib" )
2+
3+
require 'ethname'
4+
require 'etherscan-lite'
5+
6+
puts " #{Ethname.directory.size} (contract) address record(s)"
7+
8+
9+
10+
class ContractDetailsCache
11+
12+
def initialize( path )
13+
@path = path
14+
@table = if File.exist?( path )
15+
build_table( read_csv( path ) )
16+
else
17+
{}
18+
end
19+
end
20+
21+
def [](addr)
22+
if @table.has_key?( addr )
23+
@table[ addr ]
24+
else ## fetch missing data
25+
data = Etherscan.getcontractdetails( contractaddress: addr )
26+
## note: add new data to cache
27+
@table[ addr ] = data
28+
data
29+
end
30+
end
31+
32+
33+
34+
def build_table( recs )
35+
h = {}
36+
recs.each do |rec|
37+
## (re)use contractdetails format / hash keys
38+
h[ rec['address'] ] = {
39+
'contractAddress' => rec['address'],
40+
'contractCreator' => rec['creator'],
41+
'txHash' => rec['txid'],
42+
'blockNumber' => rec['blocknumber'],
43+
'timestamp' => rec['timestamp']
44+
}
45+
end
46+
h
47+
end
48+
49+
def save
50+
##############
51+
## save cache - sort by blocknumber
52+
entries = @table.values.sort { |l,r| l['blockNumber'].to_i(16) <=> r['blockNumber'].to_i(16) }
53+
buf = ''
54+
buf << ['blocknumber', 'timestamp', 'address', 'creator', 'txid'].join( ', ' )
55+
buf << "\n"
56+
entries.each do |entry|
57+
buf << [entry['blockNumber'],
58+
entry['timestamp'],
59+
entry['contractAddress'],
60+
entry['contractCreator'],
61+
entry['txHash']
62+
].join( ', ' )
63+
buf << "\n"
64+
end
65+
write_text( @path, buf )
66+
end
67+
end # class ContractDetailsCache
68+

ethname/sandbox/inbox.csv

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
names, address
2+
3+
4+
5+

ethname/sandbox/inbox.rb

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
##
2+
# check and auto-fill new contract candidates in inbox
3+
#
4+
# to run use
5+
# ruby -I ./lib sandbox/inbox.rb
6+
7+
8+
require_relative 'helper'
9+
10+
## step 1:
11+
## collect more metadata about (contract) address
12+
13+
## build cache
14+
cache = ContractDetailsCache.new( './sandbox/contractdetails.csv' )
15+
16+
17+
meta = []
18+
19+
recs = read_csv( './sandbox/inbox.csv' )
20+
puts " #{recs.size} record(s)"
21+
22+
recs.each_with_index do |rec,i|
23+
names = rec['names']
24+
addr = rec['address'].downcase
25+
puts "==> [#{i+1}] #{names} @ #{addr}..."
26+
27+
data = cache[ addr ]
28+
pp data
29+
30+
timestamp = data['timestamp'].to_i(16)
31+
32+
## reformat to "classic format"
33+
## for date use "2022-02-03 08:49:52"
34+
meta << [addr, names, '',
35+
Time.at( timestamp ).utc.strftime( '%Y-%m-%d %H:%M:%S' )
36+
]
37+
end
38+
39+
### note: save back contractdetails cache
40+
cache.save
41+
42+
43+
## (re)sort by timestamp / created date
44+
meta = meta.sort { |l,r| l[3] <=> r[3] }
45+
46+
47+
## tddo - lint / warn about non-unique names if any!!!
48+
## todo - keep track of duplicate in new names too!!!
49+
50+
51+
pp meta
52+
53+
54+
meta.each do |values|
55+
names = values[1]
56+
rec = Ethname[ names ]
57+
if rec
58+
puts "!! WARN - duplicate contract found for >#{names}<:"
59+
pp rec
60+
end
61+
end
62+
63+
64+
headers = [
65+
'address',
66+
'names',
67+
'interfaces',
68+
'created'
69+
]
70+
###
71+
72+
73+
buf = String.new('')
74+
buf << headers.join( ', ')
75+
buf << "\n"
76+
meta.each do |values|
77+
buf << values.join( ', ' )
78+
buf << "\n"
79+
end
80+
81+
82+
write_text( "./tmp/contracts.csv", buf )
83+
84+
puts "bye"
85+
86+
__END__
87+
88+
89+
[["0x22a81c80bb6bf4b797acf08351934b46193bddde", "novo", "", "2023-01-08 04:10:59 UTC"],
90+
["0x897792d16a46f9e70446638bfc6a0d884b741f9b", "pepeburbpunks", "", "2023-01-10 13:36:47 UTC"],
91+
["0x0e10e5e978ba4d1af92eb554cd730c9b97f4e571", "pepeblocks", "", "2023-01-14 05:37:35 UTC"],
92+
["0x5a8e04a84fb2f6ad4002c824045c7c1bde10cb81", "frogcentral", "", "2023-01-17 03:42:35 UTC"],
93+
["0xe302f509c4a3729791215f74299f1fa626396e5a", "gmkevin", "", "2023-01-19 00:24:35 UTC"],
94+
["0xcce158dd5384b599fc29fe34d83b11ea8fb7a816", "deathofkevin", "", "2023-01-22 12:09:47 UTC"],
95+
["0xb0dc51536e2b4950d7d6667748a6be6fc53c3318", "cutekevin", "", "2023-01-22 16:29:35 UTC"],
96+
["0x94cb646dd34b3b0ff7c116208f7f7ff7ac216079", "ecc0s", "", "2023-01-25 12:38:11 UTC"],
97+
["0xe6313d1776e4043d906d5b7221be70cf470f5e87", "shiba", "", "2023-01-26 02:20:47 UTC"]]

ethname/sandbox/test_names.rb

-39
Original file line numberDiff line numberDiff line change
@@ -10,43 +10,4 @@
1010
puts " #{Ethname.directory.size} (contract) address record(s)"
1111

1212

13-
pp Ethname[ 'PUNKS V2' ]
14-
pp Ethname[ 'Punks V.2' ]
15-
pp Ethname[ '404 NOT FOUND']
16-
17-
pp Ethname[ 'PHUNKS' ]
18-
pp Ethname[ 'SYNTHPUNKS' ]
19-
pp Ethname[ 'PUNKBLOCKS' ]
20-
pp Ethname[ 'MOONBIRDS' ]
21-
22-
23-
puts
24-
pp Ethname['punks v1']
25-
pp Ethname['punks v2']
26-
pp Ethname['punks v3']
27-
pp Ethname['punks v4']
28-
29-
pp Ethname['punks v1 wrapped i']
30-
pp Ethname['punks v1 wrapped ii']
31-
32-
pp Ethname['phunks v1']
33-
pp Ethname['phunks v2']
34-
pp Ethname['phunks v3']
35-
36-
pp Ethname['synth punks']
37-
38-
pp Ethname['punks data']
39-
pp Ethname['punk blocks']
40-
41-
42-
43-
pp rec = Ethname::Record.find( '0xaf9CE4B327A3b690ABEA6F78eCCBfeFFfbEa9FDf' )
44-
pp rec.addr
45-
pp rec.address
46-
pp rec.name
47-
pp rec.names
48-
49-
pp rec = Ethname::Record.find_by( name: 'synth punks' )
50-
51-
5213
puts "bye"

0 commit comments

Comments
 (0)