# 4a: Exotic Bases

## `+po` <a href="#po" id="po"></a>

Phonetic base.

Container core for providing phonetic syllables and name generators for the Urbit naming system. The two faces, `.sis` and `.dex`, are available to the contained arms.

#### Source

```hoon
~/  %po
=+  :-  ^=  sis                                       ::  prefix syllables
    'dozmarbinwansamlitsighidfidlissogdirwacsabwissib\
    /rigsoldopmodfoglidhopdardorlorhodfolrintogsilmir\
    /holpaslacrovlivdalsatlibtabhanticpidtorbolfosdot\
    /losdilforpilramtirwintadbicdifrocwidbisdasmidlop\
    /rilnardapmolsanlocnovsitnidtipsicropwitnatpanmin\
    /ritpodmottamtolsavposnapnopsomfinfonbanmorworsip\
    /ronnorbotwicsocwatdolmagpicdavbidbaltimtasmallig\
    /sivtagpadsaldivdactansidfabtarmonranniswolmispal\
    /lasdismaprabtobrollatlonnodnavfignomnibpagsopral\
    /bilhaddocridmocpacravripfaltodtiltinhapmicfanpat\
    /taclabmogsimsonpinlomrictapfirhasbosbatpochactid\
    /havsaplindibhosdabbitbarracparloddosbortochilmac\
    /tomdigfilfasmithobharmighinradmashalraglagfadtop\
    /mophabnilnosmilfopfamdatnoldinhatnacrisfotribhoc\
    /nimlarfitwalrapsarnalmoslandondanladdovrivbacpol\
    /laptalpitnambonrostonfodponsovnocsorlavmatmipfip'
    ^=  dex                                           ::  suffix syllables
    'zodnecbudwessevpersutletfulpensytdurwepserwylsun\
    /rypsyxdyrnuphebpeglupdepdysputlughecryttyvsydnex\
    /lunmeplutseppesdelsulpedtemledtulmetwenbynhexfeb\
    /pyldulhetmevruttylwydtepbesdexsefwycburderneppur\
    /rysrebdennutsubpetrulsynregtydsupsemwynrecmegnet\
    /secmulnymtevwebsummutnyxrextebfushepbenmuswyxsym\
    /selrucdecwexsyrwetdylmynmesdetbetbeltuxtugmyrpel\
    /syptermebsetdutdegtexsurfeltudnuxruxrenwytnubmed\
    /lytdusnebrumtynseglyxpunresredfunrevrefmectedrus\
    /bexlebduxrynnumpyxrygryxfeptyrtustyclegnemfermer\
    /tenlusnussyltecmexpubrymtucfyllepdebbermughuttun\
    /bylsudpemdevlurdefbusbeprunmelpexdytbyttyplevmyl\
    /wedducfurfexnulluclennerlexrupnedlecrydlydfenwel\
    /nydhusrelrudneshesfetdesretdunlernyrsebhulryllud\
    /remlysfynwerrycsugnysnyllyndyndemluxfedsedbecmun\
    /lyrtesmudnytbyrsenwegfyrmurtelreptegpecnelnevfes'
|%
```

***

### `+ind:po` <a href="#indpo" id="indpo"></a>

Parse suffix.

Produces the byte of the right-hand syllable `.a`.

#### Accepts

`.a` is a `@tas`.

#### Produces

A `(unit @)`.

#### Source

```hoon
++  ind  ~/  %ind
         |=  a=@tas
         =+  b=0
         |-  ^-  (unit @)
         ?:(=(256 b) ~ ?:(=(a (tod b)) [~ b] $(b +(b))))
```

#### Examples

```
> (ind:po %zod)
[~ 0]
```

```
> (ind:po %foo)
~
```

```
> (ind:po %wet)
[~ 101]
```

***

### `+ins:po` <a href="#inspo" id="inspo"></a>

Parse prefix.

Produces the byte of the left-hand phonetic syllable `.a`.

#### Accepts

`.a` is a `@tas`.

#### Produces

A `(unit @)`.

#### Source

```hoon
++  ins  ~/  %ins
         |=  a=@tas
         =+  b=0
         |-  ^-  (unit @)
         ?:(=(256 b) ~ ?:(=(a (tos b)) [~ b] $(b +(b))))
```

#### Examples

```
> (ins:po %doz)
[~ 0]
```

```
> (ins:po %foo)
~
```

```
> (ins:po %pit)
[~ 242]
```

***

### `+tod:po` <a href="#todpo" id="todpo"></a>

Fetch suffix.

Produces the phonetic suffix syllable from index `.a` within `.dex` as an `$atom`.

#### Accepts

`.a` is an `$atom`

#### Produces

An `$atom`.

#### Source

```hoon
++  tod  ~/  %tod
         |=(a=@ ?>((lth a 256) (cut 3 [(mul 3 a) 3] dex)))
```

#### Examples

```
> `@t`(tod:po 0)
'zod'
```

```
> `@t`(tod:po 100)
'syr'
```

```
> `@t`(tod:po 255)
'fes'
```

```
> `@t`(tod:po 256)
dojo: hoon expression failed
```

***

### `+tos:po` <a href="#tospo" id="tospo"></a>

Fetch prefix.

Produces the phonetic prefix syllable from index `.a` within `.sis` as an `$atom`.

#### Accepts

`.a` is an `$atom`.

#### Produces

An `$atom`.

#### Source

```hoon
++  tos  ~/  %tos
         |=(a=@ ?>((lth a 256) (cut 3 [(mul 3 a) 3] sis)))
```

#### Examples

```
> `@t`(tos:po 0)
'doz'
```

```
> `@t`(tos:po 100)
'soc'
```

```
> `@t`(tos:po 255)
'fip'
```

```
> `@t`(tos:po 256)
dojo: hoon expression failed
```

***

## `+fa` <a href="#fa" id="fa"></a>

base58check.

Container core for base58check (e.g. bitcoin address) functions.

#### Source

```hoon
++  fa
  =+  key='123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
  =/  yek=@ux  ~+
      =-  yek:(roll (rip 3 key) -)
      =+  [a=*char b=*@ yek=`@ux`(fil 3 256 0xff)]
      |.
      [+(b) (mix yek (lsh [3 `@u`a] (~(inv fe 3) b)))]
  |%
```

***

### `+cha:fa` <a href="#chafa" id="chafa"></a>

Decode base58check character.

Check whether character `.a` is valid in base58check encoding, producing a `+unit` of its decoded value if it's valid, and a null `+unit` if it's not.

#### Accepts

`.a` is a `+char`.

#### Produces

A `(unit @uF)`.

#### Source

```hoon
++  cha  |=(a=char `(unit @uF)`=+(b=(cut 3 [`@`a 1] yek) ?:(=(b 0xff) ~ `b)))
```

#### Examples

```
> (cha:fa 'Z')
[~ 32]
```

```
> (cha:fa 'n')
[~ 45]
```

```
> (cha:fa 'l')
~
```

***

### `+tok:fa` <a href="#tokfa" id="tokfa"></a>

Compute base58check checksum.

Compute the base58check checksum of `.a`.

#### Accepts

`.a` is a `@ux`.

#### Produces

A `@ux`.

#### Source

```hoon
++  tok
  |=  a=@ux  ^-  @ux
  =+  b=(pad a)
  =-  (~(net fe 5) (end [3 4] (shay 32 -)))
  (shay (add b (met 3 a)) (lsh [3 b] (swp 3 a)))
```

#### Examples

```
> (tok:fa 0xdead.beef)
0x938b.8b0c
```

***

### `+pad:fa` <a href="#padfa" id="padfa"></a>

base58check padding bytes.

Compute the number of bytes of 0s needed to pad `.a` to 21 bytes, if it's less than 21 bytes.

#### Accepts

`.a` is a `@` - a value without its base58check checksum.

#### Produces

A `@`.

#### Source

```hoon
++  pad  |=(a=@ =+(b=(met 3 a) ?:((gte b 21) 0 (sub 21 b))))
```

#### Examples

```
> (pad:fa 0xdead.beef)
17
```

***

### `+enc:fa` <a href="#encfa" id="encfa"></a>

encode base58check.

Compute and append checksum to `.a`.

#### Accepts

`.a` is a `@ux`.

#### Produces

A `@ux`.

#### Source

```hoon
++  enc  |=(a=@ux `@ux`(mix (lsh [3 4] a) (tok a)))
```

#### Example

```
> (enc:fa 0xdead.beef)
0xdead.beef.938b.8b0c
```

***

### `+den:fa` <a href="#denfa" id="denfa"></a>

decode base58check.

Check checksum of `.a`, return a `+unit` of `.a` sans the checksum if successful, or a null `+unit` otherwise.

#### Accepts

`.a` is a `@ux`

#### Produces

A `(unit @ux)`.

#### Source

```hoon
++  den
  |=  a=@ux  ^-  (unit @ux)
  =+  b=(rsh [3 4] a)
  ?.  =((tok b) (end [3 4] a))
    ~
  `b
```

#### Examples

```
> (den:fa 0xdead.beef.938b.8b0c)
[~ 0xdead.beef]
```

```
> (den:fa 0xdead.beef.1111.1111)
~
```

***
