Crypto Copycats Collectibles - Buy! Sell! Hodl! Sire!
copycats command line tool (and core library) - crypto cats / kitties collectibles unchained - buy! sell! hodl! sire! - play for free - runs off the blockchain w/ ledger lite - no ether / gas required; run your own peer-to-peer (P2P) network node over HTTP
kitty Command Line Tool
Use the kitty
command line tool to (auto-)read kitty data records
(in comma-separated values (CSV)) into an in-memory SQLite database
and print reports. Example - kitties/1-99_999/000.csv
:
id,gen,matron_id,sire_id,birthdate,genes,name
1,0,,,2017-11-23 06:19:59,ccac 7787 fa7f afaa 1646 7755 f9ee 4444 6766 7366 cccc eede,
2,0,,,2017-11-23 06:19:59,ca9c 7575 f442 af9g 6664 5557 7777 4444 6686 8667 cccc ffec,
3,0,,,2017-11-23 06:19:59,ac9a 6686 ff7f 99aa 6666 5575 779f 4444 6786 7748 cccc dcfc,
4,0,,,2017-11-23 06:19:59,ccac 5686 22ff f99g 1616 7555 ffed 4444 8668 4687 cccc dcff,
5,0,,,2017-11-23 06:19:59,ca9c 8777 747f g99g 4411 7775 f77d 4444 7788 6377 cccc ffef,
...
Note: By default all datafiles (**/*.csv
) in the ./data
and all subdirectories
get (auto-)read. Use the -i/--include
option to change the data directory.
Kitty Genes Reader / Report
Pass in the id (e.g. 1
, 43
, etc.) of the kitty to print a genes report.
Example:
$ kitty 1
prints:
# Kitty #1
genes (kai): ccac 7787 fa7f afaa 1646 7755 f9ee 4444 6766 7366 cccc eede
Fur (Genes 0-3)
|Gene| Binary |Kai (Tier)| Trait | |
|----|--------|----------|------------|----|
| 0 | 01101 | e (I) | **sphynx** | d |
| 1 | 01100 | d (I) | munchkin ) | r1 |
| 2 | 01101 | e (I) | sphynx | r2 |
| 3 | 01101 | e (I) | sphynx | r3 |
d = dominant, r1 = 1st order recessive, r2 = 2nd order recessive, r3 = 3rd order recessive
Pattern (Genes 4-7)
|Gene| Binary |Kai (Tier)| Trait | |
|----|--------|----------|------------|----|
| 4 | 01011 | c (I) | **jaguar** | d |
| 5 | 01011 | c (I) | jaguar | r1 |
| 6 | 01011 | c (I) | jaguar | r2 |
| 7 | 01011 | c (I) | jaguar | r3 |
Eye Color (Genes 8-11)
|Gene| Binary |Kai (Tier)| Trait | |
|----|--------|----------|-------------|----|
| 8 | 00101 | 6 (I) | **sizzurp** | d |
| 9 | 00101 | 6 (I) | sizzurp | r1 |
| 10 | 00010 | 3 (I) | topaz | r2 |
| 11 | 00110 | 7 (I) | chestnut | r3 |
Eye Shape (Genes 12-15)
|Gene| Binary |Kai (Tier)| Trait | |
|----|---------|----------|------------|----|
| 12 | 00101 | 6 (I) | **simple** | d |
| 13 | 00101 | 6 (I) | simple | r1 |
| 14 | 00110 | 7 (I) | crazy | r2 |
| 15 | 00101 | 6 (I) | simple | r3 |
Base Color (Genes 16-19)
|Gene| Binary |Kai (Tier)| Trait | |
|----|--------|----------|----------------|----|
| 16 | 00011 | 4 (I) | **orangesoda** | d |
| 17 | 00011 | 4 (I) | orangesoda | r1 |
| 18 | 00011 | 4 (I) | orangesoda | r2 |
| 19 | 00011 | 4 (I) | orangesoda | r3 |
Highlight Color (Genes 20-23)
|Gene| Binary |Kai (Tier)| Trait | |
|----|--------|----------|--------------|----|
| 20 | 01101 | e (I) | **lemonade** | d |
| 21 | 01101 | e (I) | lemonade | r1 |
| 22 | 01000 | 9 (I) | swampgreen | r2 |
| 23 | 01110 | f (I) | chocolate | r3 |
Accent Color (Genes 24-27)
|Gene| Binary |Kai (Tier)| Trait | |
|----|--------|----------|-----------------|----|
| 24 | 00100 | 5 (I) | **granitegrey** | d |
| 25 | 00100 | 5 (I) | granitegrey | r1 |
| 26 | 00110 | 7 (I) | kittencream | r2 |
| 27 | 00110 | 7 (I) | kittencream | r3 |
Wild (Genes 28-31)
|Gene| Binary |Kai (Tier)| Trait | |
|----|--------|----------|---------|----|
| 28 | 00101 | 6 (I) | **?** | d |
| 29 | 00011 | 4 (I) | ? | r1 |
| 30 | 00101 | 6 (I) | ? | r2 |
| 31 | 00000 | 1 (I) | ? | r3 |
Mouth (Genes 32-35)
|Gene| Binary |Kai (Tier)| Trait | |
|----|--------|----------|--------------|---|
| 32 | 01001 | a (I) | **pouty** | d |
| 33 | 01001 | a (I) | pouty | r1 |
| 34 | 01110 | f (I) | happygokitty | r2 |
| 35 | 01001 | a (I) | pouty | r3 |
Kitty Mix Genes (Matron + Sire) Report
Pass in two ids for the matron and sire kitties to print a mix genes report.
Example:
$ kitty 2 43
prints:
# Kitty #2 + #43
genes (kai) 1: ca9c 7575 f442 af9g 6664 5557 7777 4444 6686 8667 cccc ffec
genes (kai) 2: ca9a 7588 72a7 fa9f 4111 5555 dedf 4444 5888 4666 cccc fded
Fur (Genes 0-3)
|Gene|Kai|Trait (Matron) |Kai|Trait (Sire) | |
|----|---|---------------|---|--------------|----|
| 0 | c | **himalayan** | d | **munchkin** | d |
| 1 | e | sphynx | e | sphynx | r1 |
| 2 | f | ragamuffin | d | munchkin | r2 |
| 3 | f | ragamuffin | f | ragamuffin | r3 |
d = dominant, r1 = 1st order recessive, r2 = 2nd order recessive, r3 = 3rd order recessive
Pattern (Genes 4-7)
|Gene|Kai|Trait (Matron)|Kai|Trait (Sire)| |
|----|---|--------------|---|------------|----|
| 4 | c | **jaguar** | c | **jaguar** | d |
| 5 | c | jaguar | c | jaguar | r1 |
| 6 | c | jaguar | c | jaguar | r2 |
| 7 | c | jaguar | c | jaguar | r3 |
Eye Color (Genes 8-11)
|Gene|Kai|Trait (Matron)|Kai|Trait (Sire) | |
|----|---|--------------|---|-------------|----|
| 8 | 7 | **chestnut** | 6 | **sizzurp** | d |
| 9 | 6 | sizzurp | 6 | sizzurp | r1 |
| 10 | 6 | sizzurp | 6 | sizzurp | r2 |
| 11 | 8 | strawberry | 4 | mintgreen | r3 |
Eye Shape (Genes 12-15)
|Gene|Kai|Trait (Matron)|Kai|Trait (Sire) | |
|----|---|--------------|---|-----------------|----|
| 12 | 6 | **simple** | 8 | **thicccbrowz** | d |
| 13 | 8 | thicccbrowz | 8 | thicccbrowz | r1 |
| 14 | 6 | simple | 8 | thicccbrowz | r2 |
| 15 | 6 | simple | 5 | otaku | r3 |
Base Color (Genes 16-19)
|Gene|Kai|Trait (Matron) |Kai|Trait (Sire) | |
|----|---|----------------|---|----------------|----|
| 16 | 4 | **orangesoda** | 4 | **orangesoda** | d |
| 17 | 4 | orangesoda | 4 | orangesoda | r1 |
| 18 | 4 | orangesoda | 4 | orangesoda | r2 |
| 19 | 4 | orangesoda | 4 | orangesoda | r3 |
Highlight Color (Genes 20-23)
|Gene|Kai|Trait (Matron) |Kai|Trait (Sire) | |
|----|---|-----------------|---|---------------|----|
| 20 | 7 | **royalpurple** | f | **chocolate** | d |
| 21 | 7 | royalpurple | d | coffee | r1 |
| 22 | 7 | royalpurple | e | lemonade | r2 |
| 23 | 7 | royalpurple | d | coffee | r3 |
Accent Color (Genes 24-27)
|Gene|Kai|Trait (Matron) |Kai|Trait (Sire) | |
|----|---|-----------------|---|-----------------|----|
| 24 | 7 | **kittencream** | 5 | **granitegrey** | d |
| 25 | 5 | granitegrey | 5 | granitegrey | r1 |
| 26 | 5 | granitegrey | 5 | granitegrey | r2 |
| 27 | 5 | granitegrey | 5 | granitegrey | r3 |
Wild (Genes 28-31)
|Gene|Kai|Trait (Matron)|Kai|Trait (Sire)| |
|----|---|--------------|---|------------|----|
| 28 | 4 | **?** | 1 | **?** | d |
| 29 | 6 | ? | 1 | ? | r1 |
| 30 | 6 | ? | 1 | ? | r2 |
| 31 | 6 | ? | 4 | ? | r3 |
Mouth (Genes 32-35)
|Gene|Kai|Trait (Matron) |Kai|Trait (Sire) | |
|----|---|---------------|---|------------------|----|
| 32 | g | **soserious** | f | **happygokitty** | d |
| 33 | 9 | beard | 9 | beard | r1 |
| 34 | f | happygokitty | a | pouty | r2 |
| 35 | a | pouty | f | happygokitty | r3 |
Database Tables
Table Diagram
SQL Tables (in SQLite Dialect)
CREATE TABLE kitties (
id INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
name VARCHAR,
genes_kai VARCHAR NOT NULL,
gen INTEGER NOT NULL,
birthdate DATETIME NOT NULL,
day_count INTEGER NOT NULL,
matron_id INTEGER,
sire_id INTEGER,
body_id INTEGER NOT NULL,
pattern_id INTEGER NOT NULL,
coloreyes_id INTEGER NOT NULL,
eyes_id INTEGER NOT NULL,
color1_id INTEGER NOT NULL,
color2_id INTEGER NOT NULL,
color3_id INTEGER NOT NULL,
wild_id INTEGER NOT NULL,
mouth_id INTEGER NOT NULL
);
CREATE TABLE genes (
id INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
kitty_id INTEGER NOT NULL,
n INTEGER NOT NULL,
gene VARCHAR NOT NULL,
gene_n INTEGER NOT NULL,
trait_id INTEGER NOT NULL
);
CREATE TABLE traits (
id INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
trait_type_id INTEGER NOT NULL,
name VARCHAR NOT NULL,
n INTEGER NOT NULL,
kai VARCHAR NOT NULL,
tier INTEGER
);
CREATE TABLE trait_types (
id INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
name VARCHAR NOT NULL,
[key] VARCHAR NOT NULL
);
Database Setup
Use the kitty setup command to setup an SQLite database and (auto-)read
all datafiles. Example:
$ kitty setup
This will create:
- a single-file SQLite database
kitties.db
- setup all tables
- add all known traits and trait types (body, pattern, eyes, ...) and
- (auto-)read all datafiles (
**/*.csv
) in the .
and all subdirectories
Note: Use the -i/--include
option to change the default data directory (that is, .
)
and use the -n/--dbname
option to change the default SQLite database name (that is, kitties.db
)
and use the -d/--dbpath
option to change the default SQLite database path (that is, .
).
Showtime! Use the sqlite3 command line tool
and try some queries. Example:
$ sqlite3 kitties.db
sqlite> SELECT * FROM kitties WHERE id = 1;
1||ccac 7787 fa7f afaa 1646 7755 f9ee 4444 6766 7366 cccc eede|0|2017-11-23 06:19:59|...
sqlite> SELECT * FROM genes WHERE trait_id = 14; -- sphynx (14)
1|1|0|d|0|14
3|1|2|r2|2|14
4|1|3|r3|3|14
38|2|1|r1|1|14
146|5|1|r1|1|14
181|6|0|d|0|14
183|6|2|r2|2|14
...
Database Queries
SQL
Find all kitties with a trait
Let's use the trait savannah (fur) with the id 0:
SELECT id FROM kitties WHERE body_id = 0
Find all kitties with two traits
Let's use the trait savannah (fur) with the id 0
and the trait tiger (pattern) with the id 33:
SELECT id FROM kitties
WHERE body_id = 0 AND pattern_id = 33
Find all kitties with a trait (in any gene d/r1/r2/r3)
Note: All traits (12 x 32 = 384) are numbered with ids from 0 to 383 in the traits database table.
Let's use the trait savannah (fur) with the id 0:
SELECT kitty_id FROM genes WHERE trait_id = 0
Find all kitties with a dominant (visible) trait
Note: Use gene
column (d
/r1
/r2
/r3
) or the numeric gene_n
column (0/1/2/3): Let's use the trait savannah (fur) with the id 0
and a dominant (d) gene:
SELECT kitty_id FROM genes
WHERE trait_id = 0 AND gene='d'
Find all kitties with two traits (in any gene d/r1/r2/r3)
Use two query with "intersect" the result. Let's
use the trait savannah (fur) with the id 0
and the trait tiger (pattern) with the id 33:
SELECT kitty_id FROM genes WHERE trait_id = 0
INTERSECT
SELECT kitty_id FROM genes WHERE trait_id = 33
Using Models w/ ActiveRecord in Ruby
Find all kitties with a trait
Let's use the trait savannah (fur) with the id 0:
Kitty.find_by( body: Trait.find_by( name: 'savannah' ))
Kitty.find_by( body_id: 0)
Find all kitties with two traits
Let's use the trait savannah (fur) with the id 0
and the trait tiger (pattern) with the id 33:
Kitty.find_by( body: Trait.find_by( name: 'savannah' ),
pattern: Trait.find_by( name: 'tiger' ))
Kitty.find_by( body_id: 0, pattern_id: 33 )
Find all kitties with a trait (in any gene d/r1/r2/r3)
Let's use the trait savannah (fur) with the id 0:
genes = Gene.find_by( trait: Trait.find_by( name: 'savannah' ))
genes = Gene.find_by( trait_id: 0 )
genes.map { |gene| gene.kitty }
Find all kitties with a dominant (visible) trait
Let's use the trait savannah (fur) with the id 0 and a dominant (d) gene:
genes = Gene.find_by( trait: Trait.find_by( name: 'savannah' ),
d: 'd' )
genes = Gene.find_by( trait_id: 0, d: 'd' )
genes.map { |gene| gene.kitty }
Find all kitties with two traits
Use two query with "intersect" the result. Let's
use the trait savannah (fur)
and the trait tiger (pattern):
genes = Gene.select('kitty_id').where( trait: Trait.find_by( name: 'savannah' )).intersect(
Gene.select('kitty_id').where( trait: Trait.find_by( name: 'pattern' )))
genes.map { |gene| gene.kitty }
Quick References / Cheat Sheets
Traits - Traits (Cattributes) Charts with Mutation (Mewtations) Pairs and Tiers
Genes - Fur (0-3) • Pattern (4-7) • Eye Color (8-11) • Eye Shape (12-15) • Base Color (16-19) • Highlight Color (20-23) • Accent Color (24-27) • Wild (28-31) • Mouth (32-35) • Future 1 (36-39) • Future 2 (40-43) • Future 3 (44-47)
Datasets
(Crypto) Kitties on the Blockchain -
public dataset in comma-separated values (CSV) format in blocks of a thousand kitties each (e.g.
000.csv
incl. 1-999,
001.csv
incl. 1000-1999,
002.csv
incl. 2000-2999,
and so on). The data records for kitties incl. id, gen(eration), matron+sire ids, birthdate, 48 (12x4) genes in kai (base32) notation, and more.
(Crypto) Kittydex Kitty Data - public dataset in comma-separated values (CSV) format in a single file (+250 MiB).
The data records for kitties incl. id, gen(eration), matron+sire ids, birthdate, 48 (12x4) genes in kai (base32) notation, and more.
Add your dataset here!
Installation - I Can Has Copycats?
Use:
$ gem install copycats
Post them on the cryptokitties reddit. Thanks.
License
The copycats
scripts are dedicated to the public domain.
Use it as you please with no restrictions whatsoever.