Skip to content

Commit ca8b4bf

Browse files
committed
feat: add self.parse method to Address
1 parent 20a0913 commit ca8b4bf

File tree

2 files changed

+53
-13
lines changed

2 files changed

+53
-13
lines changed

lib/ckb/address.rb

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,24 @@ class Address
88
PREFIX_MAINNET = "ckb"
99
PREFIX_TESTNET = "ckt"
1010

11-
def initialize(blake160, mode: MODE::TESTNET)
11+
DEFAULT_MODE = MODE::TESTNET
12+
13+
TYPE = "01"
14+
BIN_IDX = "P2PH"
15+
16+
def initialize(blake160, mode: DEFAULT_MODE)
17+
@mode = mode
1218
@blake160 = blake160
13-
@prefix = if mode == MODE::TESTNET
14-
PREFIX_TESTNET
15-
elsif mode == MODE::MAINNET
16-
PREFIX_MAINNET
17-
end
19+
@prefix = self.class.prefix(mode: mode)
1820
end
1921

2022
# Generates address assuming default lock script is used
2123
# payload = type(01) | bin-idx("P2PH" => "50/32/50/48") | pubkey blake160
2224
# see https://github.com/nervosnetwork/ckb/wiki/Common-Address-Format for more info.
2325
def generate
2426
blake160_bin = [blake160[2..-1]].pack("H*")
25-
type = ["01"].pack("H*")
26-
bin_idx = ["P2PH".each_char.map { |c| c.ord.to_s(16) }.join].pack("H*")
27+
type = [TYPE].pack("H*")
28+
bin_idx = [self.class.bin_idx_ord].pack("H*")
2729
payload = type + bin_idx + blake160_bin
2830
ConvertAddress.encode(@prefix, payload)
2931
end
@@ -32,10 +34,15 @@ def generate
3234

3335
# Parse address into lock assuming default lock script is used
3436
def parse(address)
37+
self.class.parse(address, mode: @mode)
38+
end
39+
40+
def self.parse(address, mode: DEFAULT_MODE)
3541
decoded_prefix, data = ConvertAddress.decode(address)
36-
raise "Invalid prefix" if decoded_prefix != @prefix
3742

38-
raise "Invalid type/bin-idx" if data.slice(0..4) != ["0150325048"].pack("H*")
43+
raise "Invalid prefix" if decoded_prefix != prefix(mode: mode)
44+
45+
raise "Invalid type/bin-idx" if data.slice(0..4) != [TYPE + bin_idx_ord].pack("H*")
3946

4047
CKB::Utils.bin_to_hex(data.slice(5..-1))
4148
end
@@ -46,8 +53,21 @@ def self.blake160(pubkey)
4653
Utils.bin_to_hex(hash_bin[0...20])
4754
end
4855

49-
def self.from_pubkey(pubkey, mode: MODE::TESTNET)
56+
def self.from_pubkey(pubkey, mode: DEFAULT_MODE)
5057
new(blake160(pubkey), mode: mode)
5158
end
59+
60+
def self.bin_idx_ord
61+
BIN_IDX.each_char.map { |c| c.ord.to_s(16) }.join
62+
end
63+
64+
def self.prefix(mode: DEFAULT_MODE)
65+
case mode
66+
when MODE::TESTNET
67+
PREFIX_TESTNET
68+
when MODE::MAINNET
69+
PREFIX_MAINNET
70+
end
71+
end
5272
end
5373
end

spec/ckb/address_spec.rb

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
let(:prefix) { "ckt" }
99
let(:address) { "ckt1q9gry5zgxmpjnmtrp4kww5r39frh2sm89tdt2l6v234ygf" }
1010

11-
describe "from pubkey" do
11+
context "from pubkey" do
1212
let(:addr) { CKB::Address.from_pubkey(pubkey) }
1313

1414
it "pubkey blake160" do
@@ -32,7 +32,7 @@
3232
end
3333
end
3434

35-
describe "from pubkey hash" do
35+
context "from pubkey hash" do
3636
let(:addr) { CKB::Address.new(pubkey_blake160) }
3737

3838
it "generate_address" do
@@ -47,4 +47,24 @@
4747
).to eq pubkey_blake160
4848
end
4949
end
50+
51+
context "self.parse" do
52+
it "success" do
53+
expect(
54+
CKB::Address.parse(address)
55+
).to eq pubkey_blake160
56+
end
57+
58+
it "failed if mainnet mode" do
59+
expect {
60+
CKB::Address.parse(address, mode: CKB::MODE::MAINNET)
61+
}.to raise_error(RuntimeError)
62+
end
63+
64+
it "eq to parse" do
65+
expect(
66+
CKB::Address.parse(address)
67+
).to eq CKB::Address.new(pubkey_blake160).parse(address)
68+
end
69+
end
5070
end

0 commit comments

Comments
 (0)