MarpaX-Hoonlint

 view release on metacpan or  search on metacpan

hoons/arvo/sys/vane/jael.hoon  view on Meta::CPAN

      +>.$
    ::                                                  ::  grow:ex:ur
    ++  grow                                            ::  merge wills
      |=  $:  ::  vie: data source
              ::  cod: merge context
              ::  gur: input will
              ::
              vie/(unit (unit ship))
              cod/farm
              gur/will
          ==
      ?:  |(=(~ gur) =(gur rug))  ..grow
      |^  ^+  ..grow
          ::
          ::  wap: ascending list of new certs
          ::  pre: previous deed
          ::
          =/  wap  ~(forward we gur)
          ?~  wap  ..grow
          =/  pre
            ^-  (unit deed)
            ?~  (dec p.i.wap)  ~
            `dat:(~(got by rug) (dec p.i.wap))
          ::
          ::  merge each life
          ::
          |-  ^+  ..grow
          ::
          ::  hub: changes
          ::  lub: merged deed
          ::
          =+  [hub lub]=[p q]:(grow-mate p.i.wap q.i.wap pre)
          ?~  t.wap  ..grow
          ?>  =(p.i.t.wap +(p.i.wap))
          %=  $
            wap  t.wap
            pre  `dat.lub
            rug  (~(put by rug) p.i.wap lub)
            hab  (weld (flop hub) hab)
          ==
      ::                                                ::  grow-lick/ex:ur
      ++  grow-lick                                     ::  check signature
        |=  {pub/pass ash/@ val/@}
        ^-  ?
        =+  ver=(sure:as:(com:nu:crub pub) *code:ames val)
        ?~  ver  |
        =(ash u.ver)
      ::                                                ::  grow-like/ex:ur
      ++  grow-like                                     ::  verify signature
        |=  {myn/mind ash/@ val/@}
        ^-  ?
        =:  ..able  able(rex who.myn)
            gur     (fall (~(get by cod) who.myn) *will)
          ==
        (grow-lick (grow-look lyf.myn) ash val)
      ::                                                ::  grow-look/ex:ur
      ++  grow-look                                     ::  load public key
        |=  lyf/life
        ^-  @
        ::
        ::  cascade search over old and new, new first
        ::
        |^  %-  (bond |.((need grow-look-find)))
            grow-look-find(rug gur)
        ::                                              ::  grow-look-find:ex:ur
        ++  grow-look-find                              ::
          ^-  (unit @)
          ::
          ::  crash if this life is revoked
          ::
          ?<  (~(has by rug) +(lyf))
          %+  biff  (~(get by rug) lyf)
          |=(cert `pub.dat)
        --
      ::                                                ::  grow-mate/ex:ur
      ++  grow-mate                                     ::  merge lives
        |=  $:  ::  num: life we're merging
                ::  new: new deed
                ::  pre: previous deed
                ::  eld: old deed
                ::
                num/@ud
                new/cert
                pre/(unit deed)
            ==
        =+  :*  eld=`(unit cert)`(~(get by rug) num)
            ==
        ^-  (pair (list change) cert)
        ::
        ::  enforce artificial scarcity in lives
        ::
        ?>  (lte num 9)
        ::
        ::  if no new information, do nothing
        ::
        ?:  |(=(eld `new))
          ?>  ?=(^ eld)
          [~ u.eld]
        ::
        ::  ash: hash of deed content
        ::  def: our default parent
        ::  dad: our declared parent
        ::  mir: our rank
        ::
        =/  ash  (sham %urbit rex num dat.new)
        =/  def  (sein rex)
        =*  dad  dad.doc.dat.new
        =/  mir  (clan rex)
        ?>  ?:  |(=(num 1) =(%earl mir) =(%pawn mir))
              ::
              ::  first parent must be default;
              ::  comets and moons may not migrate
              ::
              =(def dad)
            ::
            ::  all others may migrate to parent of same rank
            ::
            =((clan def) (clan dad))
        ::
        ::  if we have an old deed at this life, merge new signatures
        ::



( run in 2.861 seconds using v1.01-cache-2.11-cpan-b16cb0d3907 )