From e7aa2e944fcdd20f3879f46d8a7ebbd52433bac8 Mon Sep 17 00:00:00 2001 From: Alessio Date: Tue, 4 Jun 2024 13:26:23 -0700 Subject: [PATCH] Add urbit-uniswap proxy --- .../docker-compose-uniswap-interface.yml | 4 +- .../config/uniswap-interface/build-app.sh | 6 +- .../urbit-files/app/proxy.hoon | 225 ++++++++++++++ .../uniswap-interface/urbit-files/desk.bill | 2 + .../urbit-files/lib/dbug.hoon | 155 ++++++++++ .../urbit-files/lib/default-agent.hoon | 65 +++++ .../urbit-files/lib/server.hoon | 159 ++++++++++ .../urbit-files/mar/bill.hoon | 34 +++ .../urbit-files/mar/hoon.hoon | 36 +++ .../urbit-files/mar/kelvin.hoon | 28 ++ .../urbit-files/mar/map.hoon | 18 -- .../urbit-files/mar/mime.hoon | 32 ++ .../urbit-files/mar/noun.hoon | 22 ++ .../urbit-files/mar/ttf.hoon | 12 - .../urbit-files/mar/txt.hoon | 274 ++++++++++++++++++ .../urbit-files/mar/woff.hoon | 12 - .../data/config/urbit/deploy-app.sh | 9 +- .../data/stacks/uniswap-urbit-app/README.md | 5 +- .../data/stacks/uniswap-urbit-app/stack.yml | 3 - 19 files changed, 1042 insertions(+), 59 deletions(-) create mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/app/proxy.hoon create mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/desk.bill create mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/dbug.hoon create mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/default-agent.hoon create mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/server.hoon create mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/bill.hoon create mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/hoon.hoon create mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/kelvin.hoon delete mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/map.hoon create mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/mime.hoon create mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/noun.hoon delete mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/ttf.hoon create mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/txt.hoon delete mode 100644 stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/woff.hoon diff --git a/stack_orchestrator/data/compose/docker-compose-uniswap-interface.yml b/stack_orchestrator/data/compose/docker-compose-uniswap-interface.yml index 334ab0cd..2c640870 100644 --- a/stack_orchestrator/data/compose/docker-compose-uniswap-interface.yml +++ b/stack_orchestrator/data/compose/docker-compose-uniswap-interface.yml @@ -7,12 +7,12 @@ services: environment: - REACT_APP_INFURA_KEY=${CERC_INFURA_KEY} - REACT_APP_AWS_API_ENDPOINT=${CERC_UNISWAP_GQL} + - REACT_APP_UNISWAP_API_URL=${CERC_UNISWAP_API} command: ["./build-app.sh"] volumes: - ../config/uniswap-interface/build-app.sh:/app/build-app.sh - urbit_app_builds:/app-builds - - ../config/uniswap-interface/urbit-files/mar:/app/mar - - ../config/uniswap-interface/urbit-files/desk.docket-0:/app/desk.docket-0 + - ../config/uniswap-interface/urbit-files:/app/urbit-files volumes: urbit_app_builds: diff --git a/stack_orchestrator/data/config/uniswap-interface/build-app.sh b/stack_orchestrator/data/config/uniswap-interface/build-app.sh index 81e306b6..dcfb9304 100755 --- a/stack_orchestrator/data/config/uniswap-interface/build-app.sh +++ b/stack_orchestrator/data/config/uniswap-interface/build-app.sh @@ -15,7 +15,5 @@ yarn build # Copy over build and other files to app-builds for urbit deployment mkdir -p /app-builds/uniswap -cp -r ./build /app-builds/uniswap/ - -cp -r mar /app-builds/uniswap/ -cp desk.docket-0 /app-builds/uniswap/ +cp -r urbit-files /app-builds/uniswap/ +cp -r ./build /app-builds/uniswap/urbit-files diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/app/proxy.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/app/proxy.hoon new file mode 100644 index 00000000..f10520af --- /dev/null +++ b/stack_orchestrator/data/config/uniswap-interface/urbit-files/app/proxy.hoon @@ -0,0 +1,225 @@ +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: Proxy server +:: ------------ +:: +:: This is a simple agent which accepts requests at the path given in the `on-init` arm-- in this +:: case, "/apps/uniswap-proxy/"-- and proxies them to the upstream, in this case, +:: "https://api.uniswap.org/". +:: +:: For example, assuming your ship is running on `localhost:8080`, a request to the url +:: +:: `http://localhost:8080/apps/uniswap-proxy/v1/graphql` +:: +:: will be proxied to +:: +:: `https://api.uniswap.org/v1/graphql` +:: +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +/+ dbug, server, default-agent +:: +|% + +$ card card:agent:gall + +$ state + $% %0 + == +-- +:: +:: Path config +|% + ++ base-url-path /apps/uniswap-proxy :: HTTP path on the ship that this agent will bind to + ++ upstream-api-url "https://api.uniswap.org/" :: Upstream HTTP api that requests should be proxied to +-- +:: +%- agent:dbug +:: +=| state +=* state - +:: +^- agent:gall +=< +|_ =bowl:gall + +* this . + default ~(. (default-agent this) bowl) + :: + ++ on-init + ^- (quip card _this) + :_ this + :~ + [%pass /eyre/connect %arvo %e %connect [~ base-url-path] %proxy] + == + :: + ++ on-poke + |= [=mark =vase] + ^- (quip card _this) + :_ this :: We have no state + ?+ mark (on-poke:default mark vase) + %handle-http-request + =/ [eyre-id=@ta inbound-req=inbound-request:eyre] !<([@ta =inbound-request:eyre] vase) + ~& "Eyre id: {}" + =/ old-req request:inbound-req + =/ new-req=request:http + %= old-req + :: Remove path prefix from the url, replace with Uniswap domain and path prefix + url (rewrite-path url:old-req) + :: Change the "Origin" header to match the upstream (this is hacky as fuck and will break eventually) + header-list (rewrite-headers header-list:old-req) + == + ~& "Proxying {} to {}" + ~& "Outgoing headers: {}" + :~ + [%pass /response/[eyre-id] %arvo %i %request new-req *outbound-config:iris] + == + == + :: + ++ on-arvo + |= [=wire =sign-arvo] + ^- (quip card _this) + :_ this :: We don't have any state + ?+ sign-arvo (on-arvo:default wire sign-arvo) + :: + :: Arvo will respond when we initially connect to Eyre in `on-init`. We will accept (and ignore) + :: that and reject any other communications. + [%eyre %bound *] + ~& "Got eyre bound: {}" + ~ + [%iris %http-response %finished *] + ?+ wire (on-arvo:default wire sign-arvo) + [%response @ ~] + =/ original-eyre-id=@ta (snag 1 `(list @ta)`wire) + =/ resp=client-response:iris +:+:sign-arvo + ?> ?= %finished -.resp + =/ resp-header=response-header:http response-header:resp + =/ the-octs=octs data:(need full-file:resp) + :: + =/ thedata=@t q.the-octs + ~& resp-header + ~& "Proxied HTTP {}: {}" + %+ give-simple-payload:app:server + original-eyre-id + :- %_(resp-header headers [['Content-type'^'application/json'] ~]) + `the-octs + == + == + :: + :: Each time Eyre pokes a request to us, it will subscribe for the response. We will just accept + :: those connections (wire = /http-response/[eyre-id]) and reject any others. + :: See: https://docs.urbit.org/system/kernel/eyre/reference/tasks#connect + ++ on-watch + |= =path + ^- (quip card _this) + ?+ path (on-watch:default path) + [%http-response *] + `this + == + :: + ++ on-save on-save:default + ++ on-load on-load:default + ++ on-leave on-leave:default + ++ on-peek on-peek:default + ++ on-agent on-agent:default + ++ on-fail on-fail:default +-- +:: +:: Helpers core +|% + :: Rewrites a path like "/apps/uniswap-proxy/v1/graphql" to "https://api.uniswap.org/v1/graphql". + :: `url-path` is a path, not a full URL! + ++ rewrite-path + |= [url-path=@t] + %+ rash + url-path + :: Prepend the `upstream-api-url` base url and convert back to a cord + %+ cook + |= [a=tape] + (crip (weld upstream-api-url a)) + :: Strip the base path + ;~ pfix + (ifix [(just '/') (just '/')] (jest (crip (join '/' `(list @t)`base-url-path)))) + (star prn) + == + :: + :: Change the 'Origin' http header to "https://api.uniswap.org". + :: I don't know why this makes the request work, but it does. + :: Also drop the "x-forwarded-for" header for Red Horizon; otherwise this breaks it. + ++ rewrite-headers + |= [headers=header-list:http] + ^- header-list:http + =/ ret *header-list:http + |- + ?~ headers + ret + %= $ + ret ?+ (crip (cass (trip key:(head headers)))) + :: + :: Default: use the header + (snoc ret (head headers)) + :: + :: Drop "x-forwarded-for" header + %'x-forwarded-for' + ret + :: + :: Drop the "cookie" header, which contains the Urbit auth token (!) + %'cookie' + ret + :: + :: Rewrite "origin" header + %'origin' + (snoc ret ['origin' 'https://api.uniswap.org']) + == + headers +.headers + == + :: + :: Manually construct a card that can be passed to iris, simulating a Uniswap graphql request. + :: Can be useful for testing purposes. + ++ iris-request-card + :: + :: The resulting card produces an HTTP request equivalent to the following cURL command: + :: + :: curl 'https://api.uniswap.org/v1/graphql' \ + :: -H 'authority: interface.gateway.uniswap.org' \ + :: -H 'accept: */*' \ + :: -H 'accept-language: en-US,en;q=0.7' \ + :: -H 'content-type: application/json' \ + :: -H 'origin: https://app.uniswap.org' \ + :: -H 'referer: https://app.uniswap.org/' \ + :: -H 'sec-ch-ua: "Not A(Brand";v="99", "Brave";v="121", "Chromium";v="121"' \ + :: -H 'sec-ch-ua-mobile: ?0' \ + :: -H 'sec-ch-ua-platform: "Linux"' \ + :: -H 'sec-fetch-dest: empty' \ + :: -H 'sec-fetch-mode: cors' \ + :: -H 'sec-fetch-site: same-site' \ + :: -H 'sec-gpc: 1' \ + :: -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36' \ + :: --data-raw $'{"operationName":"TokenSpotPrice","variables":{"address":null,"chain":"ETHEREUM"},"query":"query TokenSpotPrice($chain: Chain\u0021, $address: String = null) {\\n token(chain: $chain, address: $address) {\\n id\\n address\\n chain\\n name\\n symbol\\n project {\\n id\\n markets(currencies: [USD]) {\\n id\\n price {\\n id\\n value\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n}"}' \ + :: --compressed + :: + =/ the-request=request:http + :* %'POST' 'https://api.uniswap.org/v1/graphql' + :~ ['Accept-Language' 'en-US,en'] + ['Cache-Control' 'no-cache'] + ['Connection' 'keep-alive'] + ['Origin' 'http://localhost:8080'] + ['Pragma' 'no-cache'] + ['Referer' 'http://localhost:8080/'] + ['Sec-Fetch-Dest' 'empty'] + ['Sec-Fetch-Mode' 'cors'] + ['Sec-Fetch-Site' 'same-site'] + ['Sec-GPC' '1'] + ['User-Agent' 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'] + ['accept' '*/*'] + ['content-type' 'application/json'] + ['sec-ch-ua' '"Not A(Brand";v="99", "Brave";v="121", "Chromium";v="121"'] + ['sec-ch-ua-mobile' '?0'] + ['sec-ch-ua-platform' '"Linux"'] + == + :- ~ %- as-octs:mimes:html + ''' + {"operationName":"TokenSpotPrice","variables":{"address":null,"chain":"ETHEREUM"},"query":"query TokenSpotPrice($chain: Chain\u0021, $address: String = null) {\n token(chain: $chain, address: $address) {\n id\n address\n chain\n name\n symbol\n project {\n id\n markets(currencies: [USD]) {\n id\n price {\n id\n value\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}"} + ''' + == + :~ + [%pass /response/1 %arvo %i %request the-request *outbound-config:iris] + == +-- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/desk.bill b/stack_orchestrator/data/config/uniswap-interface/urbit-files/desk.bill new file mode 100644 index 00000000..24c8041f --- /dev/null +++ b/stack_orchestrator/data/config/uniswap-interface/urbit-files/desk.bill @@ -0,0 +1,2 @@ +:~ %proxy +== diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/dbug.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/dbug.hoon new file mode 100644 index 00000000..ce98619e --- /dev/null +++ b/stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/dbug.hoon @@ -0,0 +1,155 @@ +:: dbug: agent wrapper for generic debugging tools +:: +:: usage: %-(agent:dbug your-agent) +:: +|% ++$ poke + $% [%bowl ~] + [%state grab=cord] + [%incoming =about] + [%outgoing =about] + == +:: ++$ about + $@ ~ + $% [%ship =ship] + [%path =path] + [%wire =wire] + [%term =term] + == +:: +++ agent + |= =agent:gall + ^- agent:gall + !. + |_ =bowl:gall + +* this . + ag ~(. agent bowl) + :: + ++ on-poke + |= [=mark =vase] + ^- (quip card:agent:gall agent:gall) + ?. ?=(%dbug mark) + =^ cards agent (on-poke:ag mark vase) + [cards this] + =/ dbug + !<(poke vase) + =; =tang + ((%*(. slog pri 1) tang) [~ this]) + ?- -.dbug + %bowl [(sell !>(bowl))]~ + :: + %state + =? grab.dbug =('' grab.dbug) '-' + =; product=^vase + [(sell product)]~ + =/ state=^vase + :: if the underlying app has implemented a /dbug/state scry endpoint, + :: use that vase in place of +on-save's. + :: + =/ result=(each ^vase tang) + (mule |.(q:(need (need (on-peek:ag /x/dbug/state))))) + ?:(?=(%& -.result) p.result on-save:ag) + %+ slap + (slop state !>([bowl=bowl ..zuse])) + (ream grab.dbug) + :: + %incoming + =; =tang + ?^ tang tang + [%leaf "no matching subscriptions"]~ + %+ murn + %+ sort ~(tap by sup.bowl) + |= [[* a=[=ship =path]] [* b=[=ship =path]]] + (aor [path ship]:a [path ship]:b) + |= [=duct [=ship =path]] + ^- (unit tank) + =; relevant=? + ?. relevant ~ + `>[path=path from=ship duct=duct]< + ?: ?=(~ about.dbug) & + ?- -.about.dbug + %ship =(ship ship.about.dbug) + %path ?=(^ (find path.about.dbug path)) + %wire %+ lien duct + |=(=wire ?=(^ (find wire.about.dbug wire))) + %term !! + == + :: + %outgoing + =; =tang + ?^ tang tang + [%leaf "no matching subscriptions"]~ + %+ murn + %+ sort ~(tap by wex.bowl) + |= [[[a=wire *] *] [[b=wire *] *]] + (aor a b) + |= [[=wire =ship =term] [acked=? =path]] + ^- (unit tank) + =; relevant=? + ?. relevant ~ + `>[wire=wire agnt=[ship term] path=path ackd=acked]< + ?: ?=(~ about.dbug) & + ?- -.about.dbug + %ship =(ship ship.about.dbug) + %path ?=(^ (find path.about.dbug path)) + %wire ?=(^ (find wire.about.dbug wire)) + %term =(term term.about.dbug) + == + == + :: + ++ on-peek + |= =path + ^- (unit (unit cage)) + ?. ?=([@ %dbug *] path) + (on-peek:ag path) + ?+ path [~ ~] + [%u %dbug ~] ``noun+!>(&) + [%x %dbug %state ~] ``noun+!>(on-save:ag) + [%x %dbug %subscriptions ~] ``noun+!>([wex sup]:bowl) + == + :: + ++ on-init + ^- (quip card:agent:gall agent:gall) + =^ cards agent on-init:ag + [cards this] + :: + ++ on-save on-save:ag + :: + ++ on-load + |= old-state=vase + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-load:ag old-state) + [cards this] + :: + ++ on-watch + |= =path + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-watch:ag path) + [cards this] + :: + ++ on-leave + |= =path + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-leave:ag path) + [cards this] + :: + ++ on-agent + |= [=wire =sign:agent:gall] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-agent:ag wire sign) + [cards this] + :: + ++ on-arvo + |= [=wire =sign-arvo] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-arvo:ag wire sign-arvo) + [cards this] + :: + ++ on-fail + |= [=term =tang] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-fail:ag term tang) + [cards this] + -- +-- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/default-agent.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/default-agent.hoon new file mode 100644 index 00000000..f2107436 --- /dev/null +++ b/stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/default-agent.hoon @@ -0,0 +1,65 @@ +|= [agent=agent:gall] +|_ =bowl:gall +++ on-init + `agent +:: +++ on-save + !>(~) +:: +++ on-load + |= old-state=vase + `agent +:: +++ on-poke + |= =cage + ~| "unexpected poke to {} with mark {}" + !! +:: +++ on-watch + |= =path + ~| "unexpected subscription to {} on path {}" + !! +:: +++ on-leave + |= path + `agent +:: +++ on-peek + |= =path + ~| "unexpected scry into {} on path {}" + !! +:: +++ on-agent + |= [=wire =sign:agent:gall] + ^- (quip card:agent:gall _agent) + ?- -.sign + %poke-ack + ?~ p.sign + `agent + %- (slog leaf+"poke failed from {} on wire {}" u.p.sign) + `agent + :: + %watch-ack + ?~ p.sign + `agent + =/ =tank leaf+"subscribe failed from {} on wire {}" + %- (slog tank u.p.sign) + `agent + :: + %kick `agent + %fact + ~| "unexpected subscription update to {} on wire {}" + ~| "with mark {}" + !! + == +:: +++ on-arvo + |= [=wire =sign-arvo] + ~| "unexpected system response {} to {} on wire {}" + !! +:: +++ on-fail + |= [=term =tang] + %- (slog leaf+"error in {}" >term< tang) + `agent +-- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/server.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/server.hoon new file mode 100644 index 00000000..f5cf8f0c --- /dev/null +++ b/stack_orchestrator/data/config/uniswap-interface/urbit-files/lib/server.hoon @@ -0,0 +1,159 @@ +=, eyre +|% ++$ request-line + $: [ext=(unit @ta) site=(list @t)] + args=(list [key=@t value=@t]) + == +:: +parse-request-line: take a cord and parse out a url +:: +++ parse-request-line + |= url=@t + ^- request-line + (fall (rush url ;~(plug apat:de-purl:html yque:de-purl:html)) [[~ ~] ~]) +:: +++ manx-to-octs + |= man=manx + ^- octs + (as-octt:mimes:html (en-xml:html man)) +:: +++ json-to-octs + |= jon=json + ^- octs + (as-octs:mimes:html (en:json:html jon)) +:: +++ app + |% + :: + :: +require-authorization: + :: redirect to the login page when unauthenticated + :: otherwise call handler on inbound request + :: + ++ require-authorization + |= $: =inbound-request:eyre + handler=$-(inbound-request:eyre simple-payload:http) + == + ^- simple-payload:http + :: + ?: authenticated.inbound-request + ~! this + ~! +:*handler + (handler inbound-request) + :: + =- [[307 ['location' -]~] ~] + %^ cat 3 + '/~/login?redirect=' + url.request.inbound-request + :: + :: +require-authorization-simple: + :: redirect to the login page when unauthenticated + :: otherwise pass through simple-paylod + :: + ++ require-authorization-simple + |= [=inbound-request:eyre =simple-payload:http] + ^- simple-payload:http + :: + ?: authenticated.inbound-request + ~! this + simple-payload + :: + =- [[307 ['location' -]~] ~] + %^ cat 3 + '/~/login?redirect=' + url.request.inbound-request + :: + ++ give-simple-payload + |= [eyre-id=@ta =simple-payload:http] + ^- (list card:agent:gall) + =/ header-cage + [%http-response-header !>(response-header.simple-payload)] + =/ data-cage + [%http-response-data !>(data.simple-payload)] + :~ [%give %fact ~[/http-response/[eyre-id]] header-cage] + [%give %fact ~[/http-response/[eyre-id]] data-cage] + [%give %kick ~[/http-response/[eyre-id]] ~] + == + -- +++ gen + |% + :: + ++ max-1-da ['cache-control' 'max-age=86400'] + ++ max-1-wk ['cache-control' 'max-age=604800'] + :: + ++ html-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'text/html'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ css-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'text/css'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ js-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'text/javascript'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ png-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'image/png'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ svg-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'image/svg+xml'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ ico-response + |= =octs + ^- simple-payload:http + [[200 [['content-type' 'image/x-icon'] max-1-wk ~]] `octs] + :: + ++ woff2-response + =| cache=? + |= =octs + ^- simple-payload:http + [[200 [['content-type' 'font/woff2'] max-1-wk ~]] `octs] + :: + ++ json-response + =| cache=_| + |= =json + ^- simple-payload:http + :_ `(json-to-octs json) + [200 [['content-type' 'application/json'] ?:(cache [max-1-da ~] ~)]] + :: + ++ manx-response + =| cache=_| + |= man=manx + ^- simple-payload:http + :_ `(manx-to-octs man) + [200 [['content-type' 'text/html'] ?:(cache [max-1-da ~] ~)]] + :: + ++ not-found + ^- simple-payload:http + [[404 ~] ~] + :: + ++ login-redirect + |= =request:http + ^- simple-payload:http + =- [[307 ['location' -]~] ~] + %^ cat 3 + '/~/login?redirect=' + url.request + :: + ++ redirect + |= redirect=cord + ^- simple-payload:http + [[307 ['location' redirect]~] ~] + -- +-- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/bill.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/bill.hoon new file mode 100644 index 00000000..76cef343 --- /dev/null +++ b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/bill.hoon @@ -0,0 +1,34 @@ +|_ bil=(list dude:gall) +++ grow + |% + ++ mime `^mime`[/text/x-bill (as-octs:mimes:html hoon)] + ++ noun bil + ++ hoon + ^- @t + |^ (crip (of-wall:format (wrap-lines (spit-duz bil)))) + :: + ++ wrap-lines + |= taz=wall + ^- wall + ?~ taz ["~"]~ + :- (weld ":~ " i.taz) + %- snoc :_ "==" + (turn t.taz |=(t=tape (weld " " t))) + :: + ++ spit-duz + |= duz=(list dude:gall) + ^- wall + (turn duz |=(=dude:gall ['%' (trip dude)])) + -- + ++ txt (to-wain:format hoon) + -- +++ grab + |% + ++ noun (list dude:gall) + ++ mime + |= [=mite len=@ud tex=@] + ~_ tex + !<((list dude:gall) (slap !>(~) (ream tex))) + -- +++ grad %noun +-- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/hoon.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/hoon.hoon new file mode 100644 index 00000000..428e1056 --- /dev/null +++ b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/hoon.hoon @@ -0,0 +1,36 @@ +:::: /hoon/hoon/mar + :: +/? 310 +:: +=, eyre +|_ own=@t +:: +++ grow :: convert to + |% + ++ mime `^mime`[/text/x-hoon (as-octs:mimes:html own)] :: convert to %mime + ++ hymn + ;html + ;head + ;title:"Source" + ;script@"//cdnjs.cloudflare.com/ajax/libs/codemirror/4.3.0/codemirror.js"; + ;script@"/lib/syntax/hoon.js"; + ;link(rel "stylesheet", href "//cdnjs.cloudflare.com/ajax/libs/". + "codemirror/4.3.0/codemirror.min.css"); + ;link/"/lib/syntax/codemirror.css"(rel "stylesheet"); + == + ;body + ;textarea#src:"{(trip own)}" + ;script:'CodeMirror.fromTextArea(src, {lineNumbers:true, readOnly:true})' + == + == + ++ txt + (to-wain:format own) + -- +++ grab + |% :: convert from + ++ mime |=([p=mite q=octs] q.q) + ++ noun @t :: clam from %noun + ++ txt of-wain:format + -- +++ grad %txt +-- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/kelvin.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/kelvin.hoon new file mode 100644 index 00000000..7f1b409c --- /dev/null +++ b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/kelvin.hoon @@ -0,0 +1,28 @@ +|_ kal=waft:clay +++ grow + |% + ++ mime `^mime`[/text/x-kelvin (as-octs:mimes:html hoon)] + ++ noun kal + ++ hoon + %+ rap 3 + %+ turn + %+ sort + ~(tap in (waft-to-wefts:clay kal)) + |= [a=weft b=weft] + ?: =(lal.a lal.b) + (gte num.a num.b) + (gte lal.a lal.b) + |= =weft + (rap 3 '[%' (scot %tas lal.weft) ' ' (scot %ud num.weft) ']\0a' ~) + :: + ++ txt (to-wain:format hoon) + -- +++ grab + |% + ++ noun waft:clay + ++ mime + |= [=mite len=@ud tex=@] + (cord-to-waft:clay tex) + -- +++ grad %noun +-- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/map.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/map.hoon deleted file mode 100644 index e5d61eee..00000000 --- a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/map.hoon +++ /dev/null @@ -1,18 +0,0 @@ -:: -:::: /hoon/map/mar - :: Mark for js source maps -/? 310 -:: -=, eyre -|_ mud=@ -++ grow - |% - ++ mime [/application/octet-stream (as-octs:mimes:html (@t mud))] - -- -++ grab - |% :: convert from - ++ mime |=([p=mite q=octs] (@t q.q)) - ++ noun cord :: clam from %noun - -- -++ grad %mime --- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/mime.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/mime.hoon new file mode 100644 index 00000000..83b4daeb --- /dev/null +++ b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/mime.hoon @@ -0,0 +1,32 @@ +:: +:::: /hoon/mime/mar + :: +/? 310 +:: +|_ own=mime +++ grow + ^? + |% + ++ jam `@`q.q.own + -- +:: +++ grab :: convert from + ^? + |% + ++ noun mime :: clam from %noun + ++ tape + |=(a=_"" [/application/x-urb-unknown (as-octt:mimes:html a)]) + -- +++ grad + ^? + |% + ++ form %mime + ++ diff |=(mime +<) + ++ pact |=(mime +<) + ++ join |=([mime mime] `(unit mime)`~) + ++ mash + |= [[ship desk mime] [ship desk mime]] + ^- mime + ~|(%mime-mash !!) + -- +-- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/noun.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/noun.hoon new file mode 100644 index 00000000..ff5443ec --- /dev/null +++ b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/noun.hoon @@ -0,0 +1,22 @@ +:: +:::: /hoon/noun/mar + :: +/? 310 +!: +:::: A minimal noun mark +|_ non=* +++ grab |% + ++ noun * + -- +++ grow |% + ++ mime [/application/x-urb-jam (as-octs:mimes:html (jam non))] + -- +++ grad + |% + ++ form %noun + ++ diff |=(* +<) + ++ pact |=(* +<) + ++ join |=([* *] *(unit *)) + ++ mash |=([[ship desk *] [ship desk *]] `*`~|(%noun-mash !!)) + -- +-- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/ttf.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/ttf.hoon deleted file mode 100644 index 2d29193e..00000000 --- a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/ttf.hoon +++ /dev/null @@ -1,12 +0,0 @@ -|_ dat=octs -++ grow - |% - ++ mime [/font/ttf dat] - -- -++ grab - |% - ++ mime |=([=mite =octs] octs) - ++ noun octs - -- -++ grad %mime --- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/txt.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/txt.hoon new file mode 100644 index 00000000..982dce97 --- /dev/null +++ b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/txt.hoon @@ -0,0 +1,274 @@ +:: +:::: /hoon/txt/mar + :: +/? 310 +:: +=, clay +=, differ +=, format +=, mimes:html +|_ txt=wain +:: +++ grab :: convert from + |% + ++ mime |=((pair mite octs) (to-wain q.q)) + ++ noun wain :: clam from %noun + -- +++ grow + => v=. + |% + ++ mime => v [/text/plain (as-octs (of-wain txt))] + -- +++ grad + |% + ++ form %txt-diff + ++ diff + |= tyt=wain + ^- (urge cord) + (lusk txt tyt (loss txt tyt)) + :: + ++ pact + |= dif=(urge cord) + ~| [%pacting dif] + ^- wain + (lurk txt dif) + :: + ++ join + |= [ali=(urge cord) bob=(urge cord)] + ^- (unit (urge cord)) + |^ + =. ali (clean ali) + =. bob (clean bob) + |- ^- (unit (urge cord)) + ?~ ali `bob + ?~ bob `ali + ?- -.i.ali + %& + ?- -.i.bob + %& + ?: =(p.i.ali p.i.bob) + %+ bind $(ali t.ali, bob t.bob) + |=(cud=(urge cord) [i.ali cud]) + ?: (gth p.i.ali p.i.bob) + %+ bind $(p.i.ali (sub p.i.ali p.i.bob), bob t.bob) + |=(cud=(urge cord) [i.bob cud]) + %+ bind $(ali t.ali, p.i.bob (sub p.i.bob p.i.ali)) + |=(cud=(urge cord) [i.ali cud]) + :: + %| + ?: =(p.i.ali (lent p.i.bob)) + %+ bind $(ali t.ali, bob t.bob) + |=(cud=(urge cord) [i.bob cud]) + ?: (gth p.i.ali (lent p.i.bob)) + %+ bind $(p.i.ali (sub p.i.ali (lent p.i.bob)), bob t.bob) + |=(cud=(urge cord) [i.bob cud]) + ~ + == + :: + %| + ?- -.i.bob + %| + ?. =(i.ali i.bob) + ~ + %+ bind $(ali t.ali, bob t.bob) + |=(cud=(urge cord) [i.ali cud]) + :: + %& + ?: =(p.i.bob (lent p.i.ali)) + %+ bind $(ali t.ali, bob t.bob) + |=(cud=(urge cord) [i.ali cud]) + ?: (gth p.i.bob (lent p.i.ali)) + %+ bind $(ali t.ali, p.i.bob (sub p.i.bob (lent p.i.ali))) + |=(cud=(urge cord) [i.ali cud]) + ~ + == + == + ++ clean :: clean + |= wig=(urge cord) + ^- (urge cord) + ?~ wig ~ + ?~ t.wig wig + ?: ?=(%& -.i.wig) + ?: ?=(%& -.i.t.wig) + $(wig [[%& (add p.i.wig p.i.t.wig)] t.t.wig]) + [i.wig $(wig t.wig)] + ?: ?=(%| -.i.t.wig) + $(wig [[%| (welp p.i.wig p.i.t.wig) (welp q.i.wig q.i.t.wig)] t.t.wig]) + [i.wig $(wig t.wig)] + -- + :: + ++ mash + |= $: [als=ship ald=desk ali=(urge cord)] + [bos=ship bod=desk bob=(urge cord)] + == + ^- (urge cord) + |^ + =. ali (clean ali) + =. bob (clean bob) + |- ^- (urge cord) + ?~ ali bob + ?~ bob ali + ?- -.i.ali + %& + ?- -.i.bob + %& + ?: =(p.i.ali p.i.bob) + [i.ali $(ali t.ali, bob t.bob)] + ?: (gth p.i.ali p.i.bob) + [i.bob $(p.i.ali (sub p.i.ali p.i.bob), bob t.bob)] + [i.ali $(ali t.ali, p.i.bob (sub p.i.bob p.i.ali))] + :: + %| + ?: =(p.i.ali (lent p.i.bob)) + [i.bob $(ali t.ali, bob t.bob)] + ?: (gth p.i.ali (lent p.i.bob)) + [i.bob $(p.i.ali (sub p.i.ali (lent p.i.bob)), bob t.bob)] + =/ [fic=(unce cord) ali=(urge cord) bob=(urge cord)] + (resolve ali bob) + [fic $(ali ali, bob bob)] + :: ~ :: here, alice is good for a while, but not for the whole + == :: length of bob's changes + :: + %| + ?- -.i.bob + %| + =/ [fic=(unce cord) ali=(urge cord) bob=(urge cord)] + (resolve ali bob) + [fic $(ali ali, bob bob)] + :: + %& + ?: =(p.i.bob (lent p.i.ali)) + [i.ali $(ali t.ali, bob t.bob)] + ?: (gth p.i.bob (lent p.i.ali)) + [i.ali $(ali t.ali, p.i.bob (sub p.i.bob (lent p.i.ali)))] + =/ [fic=(unce cord) ali=(urge cord) bob=(urge cord)] + (resolve ali bob) + [fic $(ali ali, bob bob)] + == + == + :: + ++ annotate :: annotate conflict + |= $: ali=(list @t) + bob=(list @t) + bas=(list @t) + == + ^- (list @t) + %- zing + ^- (list (list @t)) + %- flop + ^- (list (list @t)) + :- :_ ~ + %^ cat 3 '<<<<<<<<<<<<' + %^ cat 3 ' ' + %^ cat 3 `@t`(scot %p bos) + %^ cat 3 '/' + bod + + :- bob + :- ~['------------'] + :- bas + :- ~['++++++++++++'] + :- ali + :- :_ ~ + %^ cat 3 '>>>>>>>>>>>>' + %^ cat 3 ' ' + %^ cat 3 `@t`(scot %p als) + %^ cat 3 '/' + ald + ~ + :: + ++ clean :: clean + |= wig=(urge cord) + ^- (urge cord) + ?~ wig ~ + ?~ t.wig wig + ?: ?=(%& -.i.wig) + ?: ?=(%& -.i.t.wig) + $(wig [[%& (add p.i.wig p.i.t.wig)] t.t.wig]) + [i.wig $(wig t.wig)] + ?: ?=(%| -.i.t.wig) + $(wig [[%| (welp p.i.wig p.i.t.wig) (welp q.i.wig q.i.t.wig)] t.t.wig]) + [i.wig $(wig t.wig)] + :: + ++ resolve + |= [ali=(urge cord) bob=(urge cord)] + ^- [fic=[%| p=(list cord) q=(list cord)] ali=(urge cord) bob=(urge cord)] + =- [[%| bac (annotate alc boc bac)] ali bob] + |- ^- $: $: bac=(list cord) + alc=(list cord) + boc=(list cord) + == + ali=(urge cord) + bob=(urge cord) + == + ?~ ali [[~ ~ ~] ali bob] + ?~ bob [[~ ~ ~] ali bob] + ?- -.i.ali + %& + ?- -.i.bob + %& [[~ ~ ~] ali bob] :: no conflict + %| + =+ lob=(lent p.i.bob) + ?: =(lob p.i.ali) + [[p.i.bob p.i.bob q.i.bob] t.ali t.bob] + ?: (lth lob p.i.ali) + [[p.i.bob p.i.bob q.i.bob] [[%& (sub p.i.ali lob)] t.ali] t.bob] + =+ wat=(scag (sub lob p.i.ali) p.i.bob) + =+ ^= res + %= $ + ali t.ali + bob [[%| (scag (sub lob p.i.ali) p.i.bob) ~] t.bob] + == + :* :* (welp bac.res wat) + (welp alc.res wat) + (welp boc.res q.i.bob) + == + ali.res + bob.res + == + == + :: + %| + ?- -.i.bob + %& + =+ loa=(lent p.i.ali) + ?: =(loa p.i.bob) + [[p.i.ali q.i.ali p.i.ali] t.ali t.bob] + ?: (lth loa p.i.bob) + [[p.i.ali q.i.ali p.i.ali] t.ali [[%& (sub p.i.bob loa)] t.bob]] + =+ wat=(slag (sub loa p.i.bob) p.i.ali) + =+ ^= res + %= $ + ali [[%| (scag (sub loa p.i.bob) p.i.ali) ~] t.ali] + bob t.bob + == + :* :* (welp bac.res wat) + (welp alc.res q.i.ali) + (welp boc.res wat) + == + ali.res + bob.res + == + :: + %| + =+ loa=(lent p.i.ali) + =+ lob=(lent p.i.bob) + ?: =(loa lob) + [[p.i.ali q.i.ali q.i.bob] t.ali t.bob] + =+ ^= res + ?: (gth loa lob) + $(ali [[%| (scag (sub loa lob) p.i.ali) ~] t.ali], bob t.bob) + ~& [%scagging loa=loa pibob=p.i.bob slag=(scag loa p.i.bob)] + $(ali t.ali, bob [[%| (scag (sub lob loa) p.i.bob) ~] t.bob]) + :* :* (welp bac.res ?:((gth loa lob) p.i.bob p.i.ali)) + (welp alc.res q.i.ali) + (welp boc.res q.i.bob) + == + ali.res + bob.res + == + == + == + -- + -- +-- diff --git a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/woff.hoon b/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/woff.hoon deleted file mode 100644 index 2933aea7..00000000 --- a/stack_orchestrator/data/config/uniswap-interface/urbit-files/mar/woff.hoon +++ /dev/null @@ -1,12 +0,0 @@ -|_ dat=octs -++ grow - |% - ++ mime [/font/woff dat] - -- -++ grab - |% - ++ mime |=([=mite =octs] octs) - ++ noun octs - -- -++ grad %mime --- diff --git a/stack_orchestrator/data/config/urbit/deploy-app.sh b/stack_orchestrator/data/config/urbit/deploy-app.sh index 512843cf..495a2866 100755 --- a/stack_orchestrator/data/config/urbit/deploy-app.sh +++ b/stack_orchestrator/data/config/urbit/deploy-app.sh @@ -17,7 +17,7 @@ if [ -d ${app_desk_dir} ]; then exit 0 fi -app_files=/app-builds/${CERC_URBIT_APP} +app_files=/app-builds/${CERC_URBIT_APP}/urbit-files # Loop until the app's build appears while [ ! -d "${app_files}/build" ]; do @@ -44,6 +44,9 @@ hood () { hood "merge %${CERC_URBIT_APP} our %landscape" hood "mount %${CERC_URBIT_APP}" +rm "${app_desk_dir}/desk.bill" # Don't install the landscape apps +rm "${app_desk_dir}/desk.ship" + echo "Copying files from ${app_files}" @@ -51,10 +54,6 @@ echo "Copying files from ${app_files}" cp -r ${app_files}/* ${app_desk_dir} rm ${app_desk_dir}/desk.docket-0 # Remove until we have a valid glob path; it's added back again below -# TODO: why? => -rm "${app_desk_dir}/desk.bill" -rm "${app_desk_dir}/desk.ship" - # Commit changes and create a glob hood "commit %${CERC_URBIT_APP}" dojo "-landscape!make-glob %${CERC_URBIT_APP} /build" diff --git a/stack_orchestrator/data/stacks/uniswap-urbit-app/README.md b/stack_orchestrator/data/stacks/uniswap-urbit-app/README.md index 187d723f..813763ba 100644 --- a/stack_orchestrator/data/stacks/uniswap-urbit-app/README.md +++ b/stack_orchestrator/data/stacks/uniswap-urbit-app/README.md @@ -40,8 +40,6 @@ stack: uniswap-urbit-app deploy-to: compose network: ports: - proxy-server: - - '4000:4000' urbit-fake-ship: - '8080:80' ipfs: @@ -86,7 +84,8 @@ Inside the deployment directory, open the file `config.env` and set the followin # Set this to GQL proxy server endpoint for uniswap app # (Eg. http://localhost:4000/v1/graphql - in case stack is being run locally with proxy enabled) # (Eg. https://abc.xyz.com/v1/graphql - in case https://abc.xyz.com is pointed to the proxy endpoint) - CERC_UNISWAP_GQL=http://localhost:4000/v1/graphql + CERC_UNISWAP_GQL=/apps/uniswap-proxy/v1/graphql + CERC_UNISWAP_API=/apps/uniswap-proxy/v2 # Optional diff --git a/stack_orchestrator/data/stacks/uniswap-urbit-app/stack.yml b/stack_orchestrator/data/stacks/uniswap-urbit-app/stack.yml index 1e5ad3f5..a1a47815 100644 --- a/stack_orchestrator/data/stacks/uniswap-urbit-app/stack.yml +++ b/stack_orchestrator/data/stacks/uniswap-urbit-app/stack.yml @@ -2,12 +2,9 @@ version: "0.1" name: uniswap-urbit-app repos: - github.com/cerc-io/uniswap-interface@laconic # TODO: Use release - - github.com/cerc-io/watcher-ts@v0.2.78 containers: - cerc/uniswap-interface - - cerc/watcher-ts pods: - uniswap-interface - - proxy-server - fixturenet-urbit - kubo