Skip to content

Commit

Permalink
refactor: address parse (#181)
Browse files Browse the repository at this point in the history
refactor: address parse
  • Loading branch information
shaojunda authored Sep 19, 2019
2 parents 1478144 + 1b040b9 commit 10fed4d
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 29 deletions.
33 changes: 15 additions & 18 deletions lib/ckb/address.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,20 +76,14 @@ def parse(address)
self.class.parse(address, mode: @mode)
end

def parse_short_payload_hash160_address(address)
self.class.parse_short_payload_hash160_address(address, mode: @mode)
end

def parse_full_payload_address(address)
self.class.parse_full_payload_address(address, mode: @mode)
end

def self.parse_short_payload_hash160_address(address, mode: DEFAULT_MODE)
def self.parse_short_payload_address(address, mode: DEFAULT_MODE)
decoded_prefix, data = ConvertAddress.decode(address)
format_type = data[0].unpack("H*").first
code_hash_index = data[1].unpack("H*").first

raise InvalidPrefixError.new("Invalid prefix") if decoded_prefix != prefix(mode: mode)
raise InvalidFormatTypeError.new("Invalid format type") if data[0] != [TYPES[0]].pack("H*")
raise InvalidCodeHashIndexError.new("Invalid code hash index") if data[1] != [CODE_HASH_INDEXES[1]].pack("H*")
raise InvalidFormatTypeError.new("Invalid format type") if format_type != TYPES[0]
raise InvalidCodeHashIndexError.new("Invalid code hash index") unless CODE_HASH_INDEXES.include?(code_hash_index)

CKB::Utils.bin_to_hex(data.slice(2..-1))
end
Expand Down Expand Up @@ -119,13 +113,16 @@ def self.parse_full_payload_address(address, mode: DEFAULT_MODE)
end

def self.parse(address, mode: DEFAULT_MODE)
decoded_prefix, data = ConvertAddress.decode(address)

raise InvalidPrefixError.new("Invalid prefix") if decoded_prefix != prefix(mode: mode)
raise InvalidFormatTypeError.new("Invalid format type") if data[0] != [TYPES[0]].pack("H*")
raise InvalidCodeHashIndexError.new("Invalid code hash index") if data[1] != [CODE_HASH_INDEXES[0]].pack("H*")

CKB::Utils.bin_to_hex(data.slice(2..-1))
_decoded_prefix, data = ConvertAddress.decode(address)
format_type = data[0].unpack("H*").first
case format_type
when "01"
parse_short_payload_address(address, mode: mode)
when "02", "04"
parse_full_payload_address(address, mode: mode)
else
raise InvalidFormatTypeError.new("Invalid format type")
end
end

def self.blake160(pubkey)
Expand Down
36 changes: 25 additions & 11 deletions spec/ckb/address_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
let(:type_hash) { "0x1892ea40d82b53c678ff88312450bbb17e164d7a3e0a90941aa58839f56f8df2" }
let(:pubkey_hash160) { "0xc8045f588e627a8381810923c61d0705d10b86d3" }
let(:short_payload_blake160_address) { "ckt1qyqrdsefa43s6m882pcj53m4gdnj4k440axqswmu83" }
let(:short_payload_blake160_address_with_invalid_format_type) { "ckt1qvqrdsefa43s6m882pcj53m4gdnj4k440axqdxkp8n" }
let(:short_payload_blake160_address_with_invalid_code_hash_index) { "ckt1qypndsefa43s6m882pcj53m4gdnj4k440axq2jsln8" }
let(:short_payload_hash160_address) { "ckt1qyquspzltz8xy75rsxqsjg7xr5rst5gtsmfsjh777d" }
let(:full_payload_data_address) { "ckt1q2n9dutjk669cfznq7httfar0gtk7qp0du3wjfvzck9l0w3k9eqhv9pkcv576ccddnn4quf2ga65xee2m26h7nq2rtnac" }
let(:full_payload_type_address) { "ckt1qsvf96jqmq4483ncl7yrzfzshwchu9jd0glq4yy5r2jcsw04d7xly9pkcv576ccddnn4quf2ga65xee2m26h7nqp5mnpu" }
Expand Down Expand Up @@ -97,31 +99,31 @@

it "parse short payload hash160 address" do
expect(
addr.parse_short_payload_hash160_address(short_payload_hash160_address)
addr.parse(short_payload_hash160_address)
).to eq pubkey_hash160
end

it "parse full payload data address" do
expect(
addr.parse_full_payload_address(full_payload_data_address)
addr.parse(full_payload_data_address)
).to eq ["02", data_hash, [pubkey_blake160]]
end

it "parse full payload type address" do
expect(
addr.parse_full_payload_address(full_payload_type_address)
addr.parse(full_payload_type_address)
).to eq ["04", type_hash, [pubkey_blake160]]
end

it "parse full payload data address with multiple args" do
expect(
addr.parse_full_payload_address(full_payload_data_address_with_multiple_args)
addr.parse(full_payload_data_address_with_multiple_args)
).to eq ["02", data_hash, multiple_args]
end

it "parse full payload type address with multiple args" do
expect(
addr.parse_full_payload_address(full_payload_type_address_with_multiple_args)
addr.parse(full_payload_type_address_with_multiple_args)
).to eq ["04", type_hash, multiple_args]
end
end
Expand Down Expand Up @@ -173,37 +175,37 @@

it "parse short payload hash160 address" do
expect(
addr.parse_short_payload_hash160_address(short_payload_hash160_address)
addr.parse(short_payload_hash160_address)
).to eq pubkey_hash160
end

it "parse full payload data address" do
expect(
addr.parse_full_payload_address(full_payload_data_address)
addr.parse(full_payload_data_address)
).to eq ["02", data_hash, [pubkey_blake160]]
end

it "parse full payload type address" do
expect(
addr.parse_full_payload_address(full_payload_type_address)
addr.parse(full_payload_type_address)
).to eq ["04", type_hash, [pubkey_blake160]]
end

it "parse full payload data address with multiple args" do
expect(
addr.parse_full_payload_address(full_payload_data_address_with_multiple_args)
addr.parse(full_payload_data_address_with_multiple_args)
).to eq ["02", data_hash, multiple_args]
end

it "parse full payload type address with multiple args" do
expect(
addr.parse_full_payload_address(full_payload_type_address_with_multiple_args)
addr.parse(full_payload_type_address_with_multiple_args)
).to eq ["04", type_hash, multiple_args]
end
end

context "self.parse" do
it "parse type1 code_hash_index 0 address" do
it "parse short payload blake160 address" do
expect(
CKB::Address.parse(short_payload_blake160_address)
).to eq pubkey_blake160
Expand All @@ -215,6 +217,18 @@
}.to raise_error(CKB::Address::InvalidPrefixError)
end

it "failed when format type is invalid" do
expect {
CKB::Address.parse(short_payload_blake160_address_with_invalid_format_type)
}.to raise_error(CKB::Address::InvalidFormatTypeError)
end

it "failed when code hash index is invalid" do
expect {
CKB::Address.parse(short_payload_blake160_address_with_invalid_code_hash_index)
}.to raise_error(CKB::Address::InvalidCodeHashIndexError)
end

it "eq to parse" do
expect(
CKB::Address.parse(short_payload_blake160_address)
Expand Down

0 comments on commit 10fed4d

Please sign in to comment.