cryptopunks 0.0.1 → 1.0.0
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 +4 -4
- data/Manifest.txt +2 -0
- data/README.md +173 -4
- data/Rakefile +1 -1
- data/bin/cryptopunk +17 -0
- data/bin/punk +17 -0
- data/lib/cryptopunks.rb +175 -3
- data/lib/cryptopunks/version.rb +2 -2
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3babd0420946592ca224951eacf1b9b14e6fea52917796bb550d86e4c05d13b1
|
4
|
+
data.tar.gz: e301d2ff4f5b84648d9cf7ba61fafbddc9383eca269563ff85a840c21a032159
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c152187a308be9c17a8cd165f2a059abbbc34f39f81ac4e88a4e1d1d0aee597a583675895ee9b8e5f577b3e2752fd0d2dfabf705eebc1d247efbc9c8e2b1de85
|
7
|
+
data.tar.gz: 238114795788bdf2685ffc093fd3c25960fd268738722810ac1bd524a3be2708c3388606da3ddce2bf6c6c2762f0f9401e3d768c7f19bcdaa8bdefe45b73ba1d
|
data/Manifest.txt
CHANGED
data/README.md
CHANGED
@@ -1,15 +1,184 @@
|
|
1
|
-
#
|
1
|
+
# Crypto Punks
|
2
2
|
|
3
|
-
mint your own 24×24 pixel punk images off chain from the True Official Genuine CryptoPunks™ sha256-verified original; incl. 2x/4x/8x zoom for bigger sizes
|
3
|
+
cryptopunks - mint your own 24×24 pixel punk images off chain from the True Official Genuine CryptoPunks™ sha256-verified original 10 000 unique character collection; incl. 2x/4x/8x zoom for bigger sizes
|
4
4
|
|
5
|
+
* home :: [github.com/rubycoco/cryptopunks](https://github.com/rubycoco/cryptopunks)
|
6
|
+
* bugs :: [github.com/rubycoco/cryptopunks/issues](https://github.com/rubycoco/cryptopunks/issues)
|
7
|
+
* gem :: [rubygems.org/gems/cryptopunks](https://rubygems.org/gems/cryptopunks)
|
8
|
+
* rdoc :: [rubydoc.info/gems/cryptopunks](http://rubydoc.info/gems/cryptopunks)
|
5
9
|
|
6
10
|
|
7
|
-
## Usage
|
8
11
|
|
9
|
-
|
12
|
+
> Someday, owning a CryptoPunk might signify just how early of an
|
13
|
+
> adopter you were into the world of blockchain and its thriving digital
|
14
|
+
> art scene. Or, they could just be a bunch of [24×24 pixel] images.
|
15
|
+
>
|
16
|
+
> -- [June 2017](https://mashable.com/2017/06/16/cryptopunks-ethereum-art-collectibles/)
|
17
|
+
>
|
18
|
+
>
|
19
|
+
> There will be a desire and need to buy expensive [status symbols]
|
20
|
+
> in the digital realm [to "flex" how rich I am].
|
21
|
+
> What could be more desirable than a small [24×24]
|
22
|
+
> pixelated [knitted cap-wearing ape] face?
|
23
|
+
> CryptoPunk artwork [ [#8219](https://www.larvalabs.com/cryptopunks/details/8219)] just sold for $176,000.
|
24
|
+
>
|
25
|
+
> -- [January 2021](https://decrypt.co/53519/an-ethereum-based-cryptopunk-artwork-just-sold-for-176000)
|
26
|
+
>
|
27
|
+
>
|
28
|
+
> Ultra-rare alien [24×24 pixel] CryptoPunk
|
29
|
+
> sells for 605 ETH, or $750,000.
|
30
|
+
> The investment thesis. "Aliens are the rarest form of CryptoPunk and
|
31
|
+
> we believe that the acquired Alien [ [#2890](https://www.larvalabs.com/cryptopunks/details/2890), one of nine]
|
32
|
+
> will be prized by collectors over
|
33
|
+
> time and mature into an iconic digital art piece."
|
34
|
+
>
|
35
|
+
> -- [January 2021](https://cointelegraph.com/news/ultra-rare-alien-cryptopunk-nft-sells-for-605-eth-or-750-000)
|
36
|
+
>
|
37
|
+
>
|
38
|
+
> The [CryptoPunksMarket] contract now holds 4,095 ETH (~$5.4M USD) in open bids and pending withdrawals.
|
39
|
+
>
|
40
|
+
> -- [January 2021](https://twitter.com/larvalabs/status/1353915659453870080)
|
10
41
|
|
11
42
|
|
12
43
|
|
44
|
+
New to Crypto Punks?
|
45
|
+
See the [**Awesome CryptoPunks Bubble (Anno 2021) - Modern 24×24 Pixel Crypto Art on the Blockchain** »](https://github.com/openblockchains/awesome-cryptopunks-bubble)
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
## Command Line
|
50
|
+
|
51
|
+
Use the `punk` (or `cryptopunk`) command line tool. Try:
|
52
|
+
|
53
|
+
```
|
54
|
+
$ punk -h
|
55
|
+
```
|
56
|
+
|
57
|
+
resulting in:
|
58
|
+
|
59
|
+
```
|
60
|
+
Usage: cryptopunks [options] IDs
|
61
|
+
Mint punk characters from composite (./punks.png) - for IDs use 0 to 9999
|
62
|
+
|
63
|
+
Options:
|
64
|
+
-z, --zoom=ZOOM Zoom factor x2, x4, x8, etc. (default: 1)
|
65
|
+
-d, --dir=DIR Output directory (default: .)
|
66
|
+
-f, --file=FILE True Official Genuine CryptoPunks™ composite image (default: ./punks.png)
|
67
|
+
-h, --help Prints this help
|
68
|
+
```
|
69
|
+
|
70
|
+
|
71
|
+
Step 0 - Download the True Official Genuine CryptoPunks™ composite image
|
72
|
+
|
73
|
+
One time / first time only - Download the True Official Genuine CryptoPunks™ composite
|
74
|
+
housing all 10 000 CryptoPunks
|
75
|
+
in a single 2400×2400 image (~830 kb) for free.
|
76
|
+
See [`punks.png` »](https://github.com/larvalabs/cryptopunks/blob/master/punks.png)
|
77
|
+
|
78
|
+
|
79
|
+

|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
Now let's give it a try. Let's mint punk #0, #2890, and #8219:
|
84
|
+
|
85
|
+
```
|
86
|
+
$ punk 0 2890 8219
|
87
|
+
```
|
88
|
+
|
89
|
+
printing:
|
90
|
+
|
91
|
+
```
|
92
|
+
==> reading >./punks.png<...
|
93
|
+
>ac39af4793119ee46bbff351d8cb6b5f23da60222126add4268e261199a2921b< SHA256 hash matching
|
94
|
+
✓ True Official Genuine CryptoPunks™ verified
|
95
|
+
==> (1/3) minting punk #0; writing to >./punk-0000.png<...
|
96
|
+
==> (2/3) minting punk #2890; writing to >./punk-2890.png<...
|
97
|
+
==> (3/3) minting punk #8219; writing to >./punk-8219.png<...
|
98
|
+
```
|
99
|
+
|
100
|
+
And voila!
|
101
|
+
|
102
|
+

|
103
|
+

|
104
|
+

|
105
|
+
|
106
|
+
|
107
|
+
Bonus: Try the -z/--zoom factor x2, x4, x8, etc.
|
108
|
+
|
109
|
+
Now let's give it a try. Let's mint punk #0, #2890, and #8219 in 2x format:
|
110
|
+
|
111
|
+
```
|
112
|
+
$ punk --zoom 2 0 2890 8219
|
113
|
+
# -or-
|
114
|
+
$ punk -z2 0 2890 8219
|
115
|
+
```
|
116
|
+
|
117
|
+
printing:
|
118
|
+
|
119
|
+
```
|
120
|
+
==> reading >./punks.png<...
|
121
|
+
>ac39af4793119ee46bbff351d8cb6b5f23da60222126add4268e261199a2921b< SHA256 hash matching
|
122
|
+
✓ True Official Genuine CryptoPunks™ verified
|
123
|
+
setting zoom to 2x
|
124
|
+
==> (1/3) minting punk #0; writing to >punk-0000x2.png<...
|
125
|
+
==> (2/3) minting punk #2890; writing to >punk-2890x2.png<...
|
126
|
+
==> (3/3) minting punk #8219; writing to >punk-8219x2.png<...
|
127
|
+
```
|
128
|
+
|
129
|
+
And voila!
|
130
|
+
|
131
|
+

|
132
|
+

|
133
|
+

|
134
|
+
|
135
|
+
And x4:
|
136
|
+
|
137
|
+

|
138
|
+

|
139
|
+

|
140
|
+
|
141
|
+
|
142
|
+
And x8:
|
143
|
+
|
144
|
+

|
145
|
+

|
146
|
+

|
147
|
+
|
148
|
+
|
149
|
+
And so on.
|
150
|
+
|
151
|
+
|
152
|
+
## Usage in Your Scripts
|
153
|
+
|
154
|
+
|
155
|
+
Yes, you can mint punks in your own scripts.
|
156
|
+
Example:
|
157
|
+
|
158
|
+
``` ruby
|
159
|
+
require 'cryptopunks'
|
160
|
+
|
161
|
+
# step 1: read True Official Genuine CryptoPunks™ composite image
|
162
|
+
punks = Punks::Image.read( './punks.png' )
|
163
|
+
|
164
|
+
# step 2: start minting
|
165
|
+
|
166
|
+
punks[0].save( './punk-0000.png' )
|
167
|
+
punks[2890].save( './punk-2890.png' )
|
168
|
+
punks[8219].save( './punk-8219.png')
|
169
|
+
|
170
|
+
# or change the zoom factor
|
171
|
+
punks.zoom = 4 # use x4
|
172
|
+
|
173
|
+
punks[0].save( './punk-0000x4.png' )
|
174
|
+
punks[2890].save( './punk-2890x4.png' )
|
175
|
+
punks[8219].save( './punk-8219x4.png')
|
176
|
+
```
|
177
|
+
|
178
|
+
and so on. Happy miniting.
|
179
|
+
That's all for now.
|
180
|
+
|
181
|
+
|
13
182
|
|
14
183
|
## Install
|
15
184
|
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ Hoe.spec 'cryptopunks' do
|
|
5
5
|
|
6
6
|
self.version = Cryptopunks::VERSION
|
7
7
|
|
8
|
-
self.summary = "cryptopunks - mint your own 24×24 pixel punk images off chain from the True Official Genuine CryptoPunks™ sha256-verified original; incl. 2x/4x/8x zoom for bigger sizes"
|
8
|
+
self.summary = "cryptopunks - mint your own 24×24 pixel punk images off chain from the True Official Genuine CryptoPunks™ sha256-verified original 10 000 unique character collection; incl. 2x/4x/8x zoom for bigger sizes"
|
9
9
|
self.description = summary
|
10
10
|
|
11
11
|
self.urls = { home: 'https://github.com/rubycoco/blockchain' }
|
data/bin/cryptopunk
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
###################
|
4
|
+
# == DEV TIPS:
|
5
|
+
#
|
6
|
+
# For local testing run like:
|
7
|
+
#
|
8
|
+
# ruby -Ilib bin/cryptopunk
|
9
|
+
#
|
10
|
+
# Set the executable bit in Linux. Example:
|
11
|
+
#
|
12
|
+
# % chmod a+x bin/cryptopunk
|
13
|
+
#
|
14
|
+
|
15
|
+
require 'cryptopunks'
|
16
|
+
|
17
|
+
Cryptopunks.main
|
data/bin/punk
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
###################
|
4
|
+
# == DEV TIPS:
|
5
|
+
#
|
6
|
+
# For local testing run like:
|
7
|
+
#
|
8
|
+
# ruby -Ilib bin/punk
|
9
|
+
#
|
10
|
+
# Set the executable bit in Linux. Example:
|
11
|
+
#
|
12
|
+
# % chmod a+x bin/punk
|
13
|
+
#
|
14
|
+
|
15
|
+
require 'cryptopunks'
|
16
|
+
|
17
|
+
Cryptopunks.main
|
data/lib/cryptopunks.rb
CHANGED
@@ -1,9 +1,181 @@
|
|
1
|
-
|
1
|
+
## 3rd party
|
2
|
+
require 'crypto-lite'
|
3
|
+
require 'chunky_png'
|
4
|
+
|
5
|
+
## extra stdlibs
|
6
|
+
require 'fileutils'
|
7
|
+
require 'optparse'
|
8
|
+
|
2
9
|
|
3
10
|
|
4
11
|
## our own code
|
5
12
|
require 'cryptopunks/version' # note: let version always go first
|
6
13
|
|
7
14
|
|
8
|
-
|
9
|
-
|
15
|
+
module Cryptopunks
|
16
|
+
class Image
|
17
|
+
def self.read( path='./punks.png' )
|
18
|
+
data = File.open( path, 'rb' ) { |f| f.read }
|
19
|
+
new( data )
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
attr_accessor :zoom
|
24
|
+
|
25
|
+
PUNK_ROWS = 100
|
26
|
+
PUNK_COLS = 100
|
27
|
+
PUNK_COUNT = PUNK_ROWS * PUNK_COLS ## 10_000 = 100x100 (24000x24000 pixel)
|
28
|
+
|
29
|
+
PUNK_HEIGHT = 24
|
30
|
+
PUNK_WIDTH = 24
|
31
|
+
|
32
|
+
PUNK_HASH = 'ac39af4793119ee46bbff351d8cb6b5f23da60222126add4268e261199a2921b'
|
33
|
+
|
34
|
+
|
35
|
+
def initialize( data )
|
36
|
+
@punks = ChunkyPNG::Image.from_blob( data )
|
37
|
+
puts " #{@punks.height}x#{@punks.width} (height x width)"
|
38
|
+
|
39
|
+
## check sha256 checksum
|
40
|
+
@hexdigest = sha256( data )
|
41
|
+
if original?
|
42
|
+
puts " >#{@hexdigest}< SHA256 hash matching"
|
43
|
+
puts " ✓ True Official Genuine CryptoPunks™ verified"
|
44
|
+
else
|
45
|
+
puts " !! ERROR: >#{hexdigest}< SHA256 hash NOT matching"
|
46
|
+
puts " >#{PUNK_HASH}< expected for True Official Genuine CryptoPunks™."
|
47
|
+
puts ""
|
48
|
+
puts " Sorry, please download the original."
|
49
|
+
exit 1
|
50
|
+
end
|
51
|
+
|
52
|
+
@zoom = 1
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def hexdigest() @hexdigest end
|
57
|
+
|
58
|
+
def verify?() @hexdigest == PUNK_HASH; end
|
59
|
+
alias_method :genuine?, :verify?
|
60
|
+
alias_method :original?, :verify?
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
def size() PUNK_COUNT; end
|
65
|
+
|
66
|
+
def []( index )
|
67
|
+
@zoom == 1 ? crop( index ) : scale( index, @zoom )
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def crop( index )
|
72
|
+
y, x = index.divmod( PUNK_ROWS )
|
73
|
+
@punks.crop( x*PUNK_WIDTH, y*PUNK_HEIGHT, PUNK_WIDTH, PUNK_HEIGHT )
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
def scale( index, zoom )
|
78
|
+
punk = ChunkyPNG::Image.new( PUNK_WIDTH*zoom, PUNK_HEIGHT*zoom,
|
79
|
+
ChunkyPNG::Color::WHITE )
|
80
|
+
|
81
|
+
## (x,y) offset in big all-in-one punks image
|
82
|
+
y, x = index.divmod( PUNK_ROWS )
|
83
|
+
|
84
|
+
## copy all 24x24 pixels
|
85
|
+
PUNK_WIDTH.times do |i|
|
86
|
+
PUNK_HEIGHT.times do |j|
|
87
|
+
pixel = @punks[i+x*PUNK_WIDTH, j+y*PUNK_HEIGHT]
|
88
|
+
zoom.times do |n|
|
89
|
+
zoom.times do |m|
|
90
|
+
punk[n+zoom*i,m+zoom*j] = pixel
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
punk
|
96
|
+
end
|
97
|
+
end ## class Image
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
class Tool
|
102
|
+
def run( args )
|
103
|
+
opts = { zoom: 1,
|
104
|
+
outdir: '.',
|
105
|
+
file: './punks.png',
|
106
|
+
}
|
107
|
+
|
108
|
+
parser = OptionParser.new do |cmd|
|
109
|
+
cmd.banner = "Usage: cryptopunks [options] IDs"
|
110
|
+
|
111
|
+
cmd.separator " Mint punk characters from composite (#{opts[:file]}) - for IDs use 0 to 9999"
|
112
|
+
cmd.separator ""
|
113
|
+
cmd.separator " Options:"
|
114
|
+
|
115
|
+
cmd.on("-z", "--zoom=ZOOM", "Zoom factor x2, x4, x8, etc. (default: #{opts[:zoom]})", Integer ) do |zoom|
|
116
|
+
opts[:zoom] = zoom
|
117
|
+
end
|
118
|
+
|
119
|
+
cmd.on("-d", "--dir=DIR", "Output directory (default: #{opts[:outdir]})", String ) do |outdir|
|
120
|
+
opts[:outdir] = outdir
|
121
|
+
end
|
122
|
+
|
123
|
+
cmd.on("-f", "--file=FILE", "True Official Genuine CryptoPunks™ composite image (default: #{opts[:file]})", String ) do |file|
|
124
|
+
opts[:file] = file
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
cmd.on("-h", "--help", "Prints this help") do
|
129
|
+
puts cmd
|
130
|
+
exit
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
parser.parse!( args )
|
135
|
+
|
136
|
+
puts "opts:"
|
137
|
+
pp opts
|
138
|
+
|
139
|
+
puts "==> reading >#{opts[:file]}<..."
|
140
|
+
punks = Image.read( opts[:file] )
|
141
|
+
|
142
|
+
|
143
|
+
puts " setting zoom to #{opts[:zoom]}x" if opts[:zoom] != 1
|
144
|
+
punks.zoom = opts[:zoom] ## note: always reset zoom even if 1
|
145
|
+
|
146
|
+
## make sure outdir exits (default is current working dir e.g. .)
|
147
|
+
FileUtils.mkdir_p( opts[:outdir] ) unless Dir.exist?( opts[:outdir] )
|
148
|
+
|
149
|
+
args.each_with_index do |arg,index|
|
150
|
+
punk_index = arg.to_i
|
151
|
+
punk_name = "punk-" + "%04d" % punk_index
|
152
|
+
|
153
|
+
## if zoom - add x2,x4 or such
|
154
|
+
punk_name << "x#{opts[:zoom]}" if opts[:zoom] != 1
|
155
|
+
|
156
|
+
path = "#{opts[:outdir]}/#{punk_name}.png"
|
157
|
+
puts "==> (#{index+1}/#{args.size}) minting punk ##{punk_index}; writing to >#{path}<..."
|
158
|
+
|
159
|
+
punks[ punk_index ].save( path )
|
160
|
+
end
|
161
|
+
|
162
|
+
puts "done"
|
163
|
+
end ## method run
|
164
|
+
end # class Tool
|
165
|
+
|
166
|
+
|
167
|
+
def self.main( args=ARGV )
|
168
|
+
Tool.new.run( args )
|
169
|
+
end
|
170
|
+
end ## module Cryptopunks
|
171
|
+
|
172
|
+
|
173
|
+
|
174
|
+
### add some convenience shortcuts
|
175
|
+
CryptoPunks = Cryptopunks
|
176
|
+
Punks = Cryptopunks
|
177
|
+
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
puts Cryptopunks.banner # say hello
|
data/lib/cryptopunks/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cryptopunks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
@@ -73,10 +73,12 @@ dependencies:
|
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '3.22'
|
75
75
|
description: cryptopunks - mint your own 24×24 pixel punk images off chain from the
|
76
|
-
True Official Genuine CryptoPunks™ sha256-verified original
|
77
|
-
for bigger sizes
|
76
|
+
True Official Genuine CryptoPunks™ sha256-verified original 10 000 unique character
|
77
|
+
collection; incl. 2x/4x/8x zoom for bigger sizes
|
78
78
|
email: wwwmake@googlegroups.com
|
79
|
-
executables:
|
79
|
+
executables:
|
80
|
+
- cryptopunk
|
81
|
+
- punk
|
80
82
|
extensions: []
|
81
83
|
extra_rdoc_files:
|
82
84
|
- CHANGELOG.md
|
@@ -87,6 +89,8 @@ files:
|
|
87
89
|
- Manifest.txt
|
88
90
|
- README.md
|
89
91
|
- Rakefile
|
92
|
+
- bin/cryptopunk
|
93
|
+
- bin/punk
|
90
94
|
- lib/cryptopunks.rb
|
91
95
|
- lib/cryptopunks/version.rb
|
92
96
|
homepage: https://github.com/rubycoco/blockchain
|
@@ -114,6 +118,6 @@ rubygems_version: 3.1.4
|
|
114
118
|
signing_key:
|
115
119
|
specification_version: 4
|
116
120
|
summary: cryptopunks - mint your own 24×24 pixel punk images off chain from the True
|
117
|
-
Official Genuine CryptoPunks™ sha256-verified original
|
118
|
-
bigger sizes
|
121
|
+
Official Genuine CryptoPunks™ sha256-verified original 10 000 unique character collection;
|
122
|
+
incl. 2x/4x/8x zoom for bigger sizes
|
119
123
|
test_files: []
|