ethname 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []