@@ -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
5373end
0 commit comments