ethname 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 450342f14ab626b337ad859811381f4185a11cfd805a887fb628be35427c6549
4
+ data.tar.gz: 45b92de48f56083fad1e94975f1dfb58f7afeb4d64ee55a12650104ae87372af
5
+ SHA512:
6
+ metadata.gz: 6e37ff7f85701c927c9f5fb8f78b8174b003f7a521f1e6d705c565f919f1d437d5b467ac044484379a45be52669de8cb427b45cf4f3c02b31c75fa313c1eddbc
7
+ data.tar.gz: 0bcee46cf8ebb0b33de5e85c9ce93e7fc9b1dd33a40a6a771b92d99943362ef4758db0d9a022d838bdcbfdc127c8ce9fc33ab4e81233aff0ed7c43f50e0755bc
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ### 0.0.1 / 2022-12-16
2
+
3
+ * Everything is new. First release
data/Manifest.txt ADDED
@@ -0,0 +1,10 @@
1
+ CHANGELOG.md
2
+ Manifest.txt
3
+ README.md
4
+ Rakefile
5
+ config/contracts.2017.csv
6
+ config/contracts.2021.csv
7
+ config/contracts.2022.csv
8
+ lib/ethname.rb
9
+ lib/ethname/dictionary.rb
10
+ lib/ethname/version.rb
data/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # Ethname - Free Crowd-Sourced "Off-Chain" Eth(erum) Name Service
2
+
3
+ ethname - light-weight crowd-sourced "off-chain" ethereum name to (contract) address service / helper (incl. punks v1,v2,v3,v4; phunks v1,v2, synth punks, punk blocks, etc.) - yes, you can! - add more names / contracts via git ;-)
4
+
5
+
6
+ * home :: [github.com/rubycocos/blockchain](https://github.com/rubycocos/blockchain)
7
+ * bugs :: [github.com/rubycocos/blockchain/issues](https://github.com/rubycocos/blockchain/issues)
8
+ * gem :: [rubygems.org/gems/ethname](https://rubygems.org/gems/ethname)
9
+ * rdoc :: [rubydoc.info/gems/ethname](http://rubydoc.info/gems/ethname)
10
+
11
+
12
+
13
+
14
+ ## Usage
15
+
16
+
17
+ Lookup (contract) addresses by name via the `Ethname` helper:
18
+
19
+ ``` ruby
20
+ require 'ethname'
21
+
22
+ ## let's try some punk (pixel art collection) contracts / services:
23
+ Ethname['punks v1'] #=> "0x6ba6f2207e343923ba692e5cae646fb0f566db8d"
24
+ Ethname['punks v2'] #=> "0xb47e3cd837ddf8e4c57f05d70ab865de6e193bbb"
25
+ Ethname['punks v3'] #=> "0xd33c078c2486b7be0f7b4dda9b14f35163b949e0"
26
+ Ethname['punks v4'] #=> "0xd12882c8b5d1bccca57c994c6af7d96355590dbd"
27
+
28
+ Ethname['punks v1 wrapped i'] #=> "0xf4a4644e818c2843ba0aabea93af6c80b5984114"
29
+ Ethname['punks v1 wrapped ii'] #=> "0x282bdd42f4eb70e7a9d9f40c8fea0825b7f68c5d"
30
+
31
+ Ethname['phunks v1'] #=> "0xa82f3a61f002f83eba7d184c50bb2a8b359ca1ce"
32
+ Ethname['phunks v2'] #=> "0xf07468ead8cf26c752c676e43c814fee9c8cf402"
33
+ Ethname['phunks v3'] #=> "0xa19f0378a6f3f3361d8e962f3589ec28f4f8f159"
34
+
35
+ Ethname['synth punks'] #=> "0xaf9ce4b327a3b690abea6f78eccbfefffbea9fdf"
36
+
37
+ Ethname['punks data'] #=> "0x16f5a35647d6f03d5d3da7b35409d65ba03af3b2"
38
+ Ethname['punk blocks'] #=> "0x58e90596c2065befd3060767736c829c18f3474c"
39
+
40
+ # and so on
41
+ ```
42
+
43
+ Note: The names internally get "normalized", that is,
44
+ all characters except a-z and the digits 0-9 get stripped
45
+ that includes spaces, dots (.), dashes (-), underline (_), and so on.
46
+ Yes, for the lookup you can use all variants of uppercase (PUNKS)
47
+ or lowercase (punks) spellings. Example:
48
+
49
+
50
+ ``` ruby
51
+ Ethname['Synth Punks'] #=> "0xaf9ce4b327a3b690abea6f78eccbfefffbea9fdf"
52
+ Ethname['SynthPunks'] #=> "0xaf9ce4b327a3b690abea6f78eccbfefffbea9fdf"
53
+ Ethname['Synthpunks'] #=> "0xaf9ce4b327a3b690abea6f78eccbfefffbea9fdf"
54
+ Ethname['SYNTH PUNKS'] #=> "0xaf9ce4b327a3b690abea6f78eccbfefffbea9fdf"
55
+ Ethname['SYNTHPUNKS'] #=> "0xaf9ce4b327a3b690abea6f78eccbfefffbea9fdf"
56
+ # and so on
57
+ ```
58
+
59
+
60
+
61
+ ## Inside the Crowd-Sourced "Off-Chain" Ethereum Name To (Contract) Address Service
62
+
63
+ The name to address mappings are fow now stored
64
+ in datafiles in the comma-separated value (.csv) format
65
+ and split by year (e.g. 2017, 2018, ..., 2021, 2022, 2023, etc.)
66
+
67
+ Example - [config/contracts.2017.csv](config/contracts.2017.csv):
68
+
69
+ ``` csv
70
+ address, names
71
+ 0x6Ba6f2207e343923BA692e5Cae646Fb0F566DB8D, punks v1 | crypto punks v1
72
+ 0xb47e3cd837ddf8e4c57f05d70ab865de6e193bbb, punks v2 | crypto punks v2 | crypto punks market
73
+ 0x60cd862c9c687a9de49aecdc3a99b74a4fc54ab6, mooncats | mooncatrescue
74
+ ...
75
+ ```
76
+
77
+ Example - [config/contracts.2022.csv](config/contracts.2022.csv):
78
+
79
+ ``` csv
80
+ address, names
81
+ 0x282bdd42f4eb70e7a9d9f40c8fea0825b7f68c5d, punks v1 wrapped ii
82
+ 0xD33c078C2486B7Be0F7B4DDa9B14F35163B949e0, punks v3
83
+ 0xd12882c8b5d1bccca57c994c6af7d96355590dbd, punks v4
84
+ 0xA19f0378A6F3f3361d8e962F3589Ec28f4f8F159, phunks v3
85
+ 0xaf9CE4B327A3b690ABEA6F78eCCBfeFFfbEa9FDf, synthetic punks | synth punks
86
+ 0x58E90596C2065BEfD3060767736C829C18F3474c, punk blocks
87
+ 0x23581767a106ae21c074b2276D25e5C3e136a68b, moonbirds
88
+ ...
89
+ ```
90
+
91
+ ### Yes, You Can! - Add More Names / Contracts Via Git ;-)
92
+
93
+ Your contributions welcome. You are welcome to join in and
94
+ help to add more name to ethereum contract / service mappings.
95
+
96
+
97
+
98
+
99
+ ## License
100
+
101
+ The scripts are dedicated to the public domain.
102
+ Use it as you please with no restrictions whatsoever.
103
+
104
+
105
+ ## Questions? Comments?
106
+
107
+
108
+ Post them on the [D.I.Y. Punk (Pixel) Art reddit](https://old.reddit.com/r/DIYPunkArt). Thanks.
109
+
110
+
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ require 'hoe'
2
+ require './lib/ethname/version.rb'
3
+
4
+
5
+ Hoe.spec 'ethname' do
6
+
7
+ self.version = Ethname::VERSION
8
+
9
+ self.summary = 'ethname - light-weight crowd-sourced "off-chain" ethereum name to (contract) address service / helper (incl. punks v1,v2,v3,v4; phunks v1,v2, synth punks, punk blocks, etc.) - yes, you can! - add more names / contracts via git ;-)'
10
+ self.description = summary
11
+
12
+ self.urls = { home: 'https://github.com/rubycocos/blockchain' }
13
+
14
+ self.author = 'Gerald Bauer'
15
+ self.email = 'wwwmake@googlegroups.com'
16
+
17
+ # switch extension to .markdown for gihub formatting
18
+ self.readme_file = 'README.md'
19
+ self.history_file = 'CHANGELOG.md'
20
+
21
+ self.extra_deps = [
22
+ ['cocos'],
23
+ ]
24
+
25
+ self.licenses = ['Public Domain']
26
+
27
+ self.spec_extras = {
28
+ required_ruby_version: '>= 2.3'
29
+ }
30
+
31
+ end
32
+
@@ -0,0 +1,6 @@
1
+ address, names
2
+ 0x6Ba6f2207e343923BA692e5Cae646Fb0F566DB8D, punks v1 | crypto punks v1
3
+ 0xb47e3cd837ddf8e4c57f05d70ab865de6e193bbb, punks v2 | crypto punks v2 | crypto punks market
4
+ 0x60cd862c9c687a9de49aecdc3a99b74a4fc54ab6, mooncats | mooncatrescue
5
+
6
+
@@ -0,0 +1,11 @@
1
+ address, names
2
+ 0x16f5a35647d6f03d5d3da7b35409d65ba03af3b2, punks data | crypto punks data
3
+ 0xf4a4644e818c2843ba0aabea93af6c80b5984114, punks v1 wrapped i | classic punks
4
+
5
+ 0xa82f3a61f002f83eba7d184c50bb2a8b359ca1ce, phunks v1 | philips
6
+ 0xf07468ead8cf26c752c676e43c814fee9c8cf402, phunks v2 | phunks
7
+
8
+ 0x031920cc2d9f5c10b444fd44009cd64f829e7be2, zunks
9
+
10
+ 0x0d0167a823c6619d430b1a96ad85b888bcf97c37, xpunks | expansion punks
11
+ 0x71eb5c179ceb640160853144cbb8df5bd24ab5cc, xphunks | expansion phunks
@@ -0,0 +1,15 @@
1
+ address, names
2
+ 0x282bdd42f4eb70e7a9d9f40c8fea0825b7f68c5d, punks v1 wrapped ii
3
+
4
+ 0xD33c078C2486B7Be0F7B4DDa9B14F35163B949e0, punks v3
5
+ 0xd12882c8b5d1bccca57c994c6af7d96355590dbd, punks v4
6
+
7
+ 0xA19f0378A6F3f3361d8e962F3589Ec28f4f8F159, phunks v3
8
+
9
+
10
+ 0xaf9CE4B327A3b690ABEA6F78eCCBfeFFfbEa9FDf, synthetic punks | synth punks
11
+
12
+ 0x58E90596C2065BEfD3060767736C829C18F3474c, punk blocks
13
+
14
+
15
+ 0x23581767a106ae21c074b2276D25e5C3e136a68b, moonbirds
@@ -0,0 +1,75 @@
1
+
2
+ module Ethname
3
+
4
+ class Dictionary
5
+ ## let's you lookup up ethereum addresses by name
6
+
7
+ def self.read( *paths ) ## use load - why? why not?
8
+ dict = new
9
+ paths.each do |path|
10
+ recs = read_csv( path )
11
+ dict.add_recs( recs )
12
+ end
13
+ dict
14
+ end
15
+
16
+
17
+
18
+ def initialize
19
+ @recs = []
20
+ @reverse_table = {} ## lookup (address) by (normalized) name
21
+ end
22
+
23
+ def recs() @recs; end
24
+ def size() @recs.size; end
25
+
26
+
27
+
28
+ def lookup( q )
29
+ key = normalize( q )
30
+ addr = @reverse_table[ key ]
31
+ addr
32
+ end
33
+ alias_method :[], :lookup
34
+
35
+
36
+ def add_recs( recs )
37
+ recs.each do |rec|
38
+ ## note: always downcase addresses for now
39
+ ## (do NOT use addresss checksum with mixed-hexchars) - why? why not?
40
+ addr = rec['address'].downcase
41
+ names = rec['names'].split('|')
42
+ names.each do |name|
43
+ _add( addr, name )
44
+ end
45
+ end
46
+
47
+ @recs += recs
48
+ end
49
+
50
+
51
+ #################
52
+ # convencience helpers
53
+ def self.normalize( str )
54
+ ## remove all non a-z (and 0-9) characters
55
+ str.downcase.gsub( /[^a-z0-9]/i, '' )
56
+ end
57
+
58
+ def normalize( str ) self.class.normalize( str ); end
59
+
60
+ ####
61
+ # private (internal) helpers
62
+ def _add( addr, name )
63
+ key = normalize( name )
64
+ addr2 = @reverse_table[ key ]
65
+
66
+ ## check for duplicates
67
+ raise ArgumentError, "duplicate (normalized) key >#{key} for addr >#{addr}<" if addr == addr2
68
+ raise ArgumentError, "duplicate (normalized) key >#{key}< for addr >#{addr}; addr already in use >#{addr2}<" if addr2
69
+ @reverse_table[ key ] = addr
70
+ self
71
+ end
72
+
73
+ end
74
+ end # module Ethname
75
+
@@ -0,0 +1,22 @@
1
+
2
+
3
+ module Ethname
4
+ MAJOR = 0
5
+ MINOR = 0
6
+ PATCH = 1
7
+ VERSION = [MAJOR,MINOR,PATCH].join('.')
8
+
9
+ def self.version
10
+ VERSION
11
+ end
12
+
13
+ def self.banner
14
+ "ethname/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] in (#{root})"
15
+ end
16
+
17
+ def self.root
18
+ File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
19
+ end
20
+
21
+ end # module Ethname
22
+
data/lib/ethname.rb ADDED
@@ -0,0 +1,30 @@
1
+ require 'cocos'
2
+
3
+
4
+
5
+ ## our own code
6
+ require_relative 'ethname/version'
7
+ require_relative 'ethname/dictionary'
8
+
9
+
10
+ module Ethname
11
+
12
+ def self.dict
13
+ @dict ||= Dictionary.read( "#{root}/config/contracts.2017.csv",
14
+ "#{root}/config/contracts.2021.csv",
15
+ "#{root}/config/contracts.2022.csv",
16
+ )
17
+ end
18
+
19
+ def self.lookup( q )
20
+ dict.lookup( q )
21
+ end
22
+ class << self
23
+ alias_method :[], :lookup
24
+ end
25
+
26
+ end # module Ethname
27
+
28
+
29
+
30
+ Ethname.banner ## say hello
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ethname
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Gerald Bauer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-12-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cocos
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rdoc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '4.0'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '7'
37
+ type: :development
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '4.0'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '7'
47
+ - !ruby/object:Gem::Dependency
48
+ name: hoe
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.23'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.23'
61
+ description: ethname - light-weight crowd-sourced "off-chain" ethereum name to (contract)
62
+ address service / helper (incl. punks v1,v2,v3,v4; phunks v1,v2, synth punks, punk
63
+ blocks, etc.) - yes, you can! - add more names / contracts via git ;-)
64
+ email: wwwmake@googlegroups.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files:
68
+ - CHANGELOG.md
69
+ - Manifest.txt
70
+ - README.md
71
+ files:
72
+ - CHANGELOG.md
73
+ - Manifest.txt
74
+ - README.md
75
+ - Rakefile
76
+ - config/contracts.2017.csv
77
+ - config/contracts.2021.csv
78
+ - config/contracts.2022.csv
79
+ - lib/ethname.rb
80
+ - lib/ethname/dictionary.rb
81
+ - lib/ethname/version.rb
82
+ homepage: https://github.com/rubycocos/blockchain
83
+ licenses:
84
+ - Public Domain
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options:
88
+ - "--main"
89
+ - README.md
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '2.3'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubygems_version: 3.3.7
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: ethname - light-weight crowd-sourced "off-chain" ethereum name to (contract)
107
+ address service / helper (incl. punks v1,v2,v3,v4; phunks v1,v2, synth punks, punk
108
+ blocks, etc.) - yes, you can! - add more names / contracts via git ;-)
109
+ test_files: []