From abe7c6dbc7afa6d3d52bbac28c16d0d9e407ae23 Mon Sep 17 00:00:00 2001 From: pierre Date: Thu, 6 Sep 2018 19:42:59 +0200 Subject: [PATCH 1/5] Add Faker::Tezos --- README.md | 1 + doc/tezos.md | 11 ++++++++++ lib/faker.rb | 1 + lib/faker/bitcoin.rb | 19 +---------------- lib/faker/tezos.rb | 44 ++++++++++++++++++++++++++++++++++++++++ lib/helpers/base58.rb | 22 ++++++++++++++++++++ test/test_faker_tezos.rb | 28 +++++++++++++++++++++++++ 7 files changed, 108 insertions(+), 18 deletions(-) create mode 100644 doc/tezos.md create mode 100644 lib/faker/tezos.rb create mode 100644 lib/helpers/base58.rb create mode 100644 test/test_faker_tezos.rb diff --git a/README.md b/README.md index b34a0cb072..d3c37c0bc3 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,7 @@ Contents - [Faker::Superhero](doc/superhero.md) - [Faker::SwordArtOnline](doc/sword_art_online.md) - [Faker::Team](doc/team.md) + - [Faker::Tezos](doc/tezos.md) - [Faker::TheFreshPrinceOfBelAir](doc/the_fresh_prince_of_bel_air.md) - [Faker::TheITCrowd](doc/the_it_crowd.md) - [Faker::TheThickOfIt](doc/the_thick_of_it.md) diff --git a/doc/tezos.md b/doc/tezos.md new file mode 100644 index 0000000000..cb94129c1a --- /dev/null +++ b/doc/tezos.md @@ -0,0 +1,11 @@ +# Faker::Tezos + +```ruby +Faker::Tezos.account #=> "tz1eUsgK6aj752Fbxwk5sAoEFvSDnPjZ4qvk" + +Faker::Tezos.contract #=> "KT1MroqeP15nnitB4CnNfkqHYa2NErhPPLWF" + +Faker::Tezos.operation #=> "onygWYXJX3xNstFLv9PcCrhQdCkENC795xwSinmTEc1jsDN4VDa" + +Faker::Tezos.signature #=> "edsigu165B7VFf3Dpw2QABVzEtCxJY2gsNBNcE3Ti7rRxtDUjqTFRpg67EdAQmY6YWPE5tKJDMnSTJDFu65gic8uLjbW2YwGvAZ" +``` diff --git a/lib/faker.rb b/lib/faker.rb index bfe7b46eee..3202688f2a 100644 --- a/lib/faker.rb +++ b/lib/faker.rb @@ -230,3 +230,4 @@ def rand(max = nil) require 'helpers/char' require 'helpers/unique_generator' +require 'helpers/base58' diff --git a/lib/faker/bitcoin.rb b/lib/faker/bitcoin.rb index d2f51a62c8..9189558c59 100644 --- a/lib/faker/bitcoin.rb +++ b/lib/faker/bitcoin.rb @@ -21,28 +21,11 @@ def testnet_address protected - def base58(str) - alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' - base = alphabet.size - - lv = 0 - str.split('').reverse.each_with_index { |v, i| lv += v.unpack('C')[0] * 256**i } - - ret = +'' - while lv.positive? - lv, mod = lv.divmod(base) - ret << alphabet[mod] - end - - npad = str.match(/^#{0.chr}*/)[0].to_s.size - '1' * npad + ret.reverse - end - def address_for(network) version = PROTOCOL_VERSIONS.fetch(network) packed = version.chr + Faker::Config.random.bytes(20) checksum = Digest::SHA2.digest(Digest::SHA2.digest(packed))[0..3] - base58(packed + checksum) + Faker::Base58.encode(packed + checksum) end end end diff --git a/lib/faker/tezos.rb b/lib/faker/tezos.rb new file mode 100644 index 0000000000..fe2c423e9a --- /dev/null +++ b/lib/faker/tezos.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require 'digest' +require 'securerandom' + +module Faker + class Tezos < Base + class << self + PREFIXES = { + tz1: [6, 161, 159], + KT1: [2, 90, 121], + edpk: [13, 15, 37, 217], + edsk: [13, 15, 58, 7], + edsig: [9, 245, 205, 134, 18], + o: [5, 116] + }.freeze + + def account + encode_tz(:tz1, 20) + end + + def contract + encode_tz(:KT1, 20) + end + + def operation + encode_tz(:o, 32) + end + + def signature + encode_tz(:edsig, 64) + end + + protected + + def encode_tz(prefix, payload_size) + prefix = PREFIXES.fetch(prefix) + packed = prefix.map(&:chr).join('') + Faker::Config.random.bytes(payload_size) + checksum = Digest::SHA2.digest(Digest::SHA2.digest(packed))[0..3] + Faker::Base58.encode(packed + checksum) + end + end + end +end diff --git a/lib/helpers/base58.rb b/lib/helpers/base58.rb new file mode 100644 index 0000000000..bde37f767f --- /dev/null +++ b/lib/helpers/base58.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Faker + module Base58 + def self.encode(str) + alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' + base = alphabet.size + + lv = 0 + str.split('').reverse.each_with_index { |v, i| lv += v.unpack('C')[0] * 256**i } + + ret = +'' + while lv.positive? + lv, mod = lv.divmod(base) + ret << alphabet[mod] + end + + npad = str.match(/^#{0.chr}*/)[0].to_s.size + '1' * npad + ret.reverse + end + end +end \ No newline at end of file diff --git a/test/test_faker_tezos.rb b/test/test_faker_tezos.rb new file mode 100644 index 0000000000..02423c86f0 --- /dev/null +++ b/test/test_faker_tezos.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require_relative 'test_helper' + +class TestFakerTezos < Test::Unit::TestCase + def test_contract + assert Faker::Tezos.contract.match(/^KT1[1-9A-Za-z][^OIl]{20,40}/) + end + + def test_account + assert Faker::Tezos.account.match(/^tz1[1-9A-Za-z][^OIl]{20,40}/) + end + + def test_operation + assert Faker::Tezos.operation.match(/^o[1-9A-Za-z][^OIl]{20,40}/) + end + + def test_signature + assert Faker::Tezos.signature.match(/^edsig[1-9A-Za-z][^OIl]{20,40}/) + end + + def test_deterministic_contract + Faker::Config.random = Random.new(42) + v = Faker::Tezos.contract + Faker::Config.random = Random.new(42) + assert v == Faker::Tezos.contract + end +end From 801694346c855c0dd677193b1fa4289f632bacb8 Mon Sep 17 00:00:00 2001 From: pierre Date: Thu, 6 Sep 2018 19:47:32 +0200 Subject: [PATCH 2/5] fix tests failing to to Faker::Base58 helper addition --- test/test_determinism.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_determinism.rb b/test/test_determinism.rb index 6f8c47fa89..e655ab2a16 100644 --- a/test/test_determinism.rb +++ b/test/test_determinism.rb @@ -45,7 +45,7 @@ def all_methods def subclasses Faker.constants.delete_if do |subclass| - %i[Base Bank Char ChileRut Config Date Internet Time VERSION].include?(subclass) + %i[Base Bank Char Base58 ChileRut Config Date Internet Time VERSION].include?(subclass) end.sort end From 432097a035f080a76137bb6bc4102506c7679f7c Mon Sep 17 00:00:00 2001 From: pierre Date: Fri, 7 Sep 2018 10:04:41 +0200 Subject: [PATCH 3/5] Fix rubocop offense --- lib/helpers/base58.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/helpers/base58.rb b/lib/helpers/base58.rb index bde37f767f..3b7f055fb3 100644 --- a/lib/helpers/base58.rb +++ b/lib/helpers/base58.rb @@ -19,4 +19,4 @@ def self.encode(str) '1' * npad + ret.reverse end end -end \ No newline at end of file +end From 1a48d780b255b7e7abc306236cd0666497de3a36 Mon Sep 17 00:00:00 2001 From: Vitor Oliveira Date: Mon, 17 Sep 2018 17:14:59 -0300 Subject: [PATCH 4/5] Update tezos.md --- doc/tezos.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/tezos.md b/doc/tezos.md index cb94129c1a..bcc26bb6af 100644 --- a/doc/tezos.md +++ b/doc/tezos.md @@ -1,5 +1,7 @@ # Faker::Tezos +It might be available in the next version. + ```ruby Faker::Tezos.account #=> "tz1eUsgK6aj752Fbxwk5sAoEFvSDnPjZ4qvk" From b411885c617f7afedc2afd64abbad5a02b640bd3 Mon Sep 17 00:00:00 2001 From: Vitor Oliveira Date: Mon, 17 Sep 2018 17:40:19 -0300 Subject: [PATCH 5/5] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0525c1de03..4d1c5b456a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ - [PR #1329](https://github.com/stympy/faker/pull/1329) Update docs on behavior of price [@softwaregravy](https://github.com/softwaregravy) ### Feature Request +- [PR #1359](https://github.com/stympy/faker/pull/1359) Add Faker::Tezos [@Pierre-Michard](https://github.com/Pierre-Michard) - [PR #1336](https://github.com/stympy/faker/pull/1336) Implements and tests South African business registration numbers [@bradleymarques](https://github.com/bradleymarques) - [PR #1346](https://github.com/stympy/faker/pull/1346) Add Faker::Relationship [@QuantumWaver](https://github.com/QuantumWaver) - [PR #1348](https://github.com/stympy/faker/pull/1348) Add Faker::Finance.vat_number [@vbrazo](https://github.com/vbrazo)