render.gno
6.37 Kb · 107 lines
1package router
2
3import (
4 "chain"
5 "strings"
6
7 "gno.land/p/moul/md/v0"
8 "gno.land/p/moul/mdtable/v0"
9 ufmt "gno.land/p/nt/ufmt/v0"
10
11 "gno.land/r/gnoswap/halt/v1"
12 "gno.land/r/gnoswap/router"
13)
14
15const maxSwapFeeBPS uint64 = 1000
16
17func (r *routerV1) Render(path string) string {
18 var action string
19 switch path {
20 case "":
21 action = md.H3("Exact-input single-route swap") + "\n" +
22 "<gno-form exec=\"ExactInSingleSwapRoute\">\n" +
23 " <gno-input name=\"inputToken\" type=\"text\" placeholder=\"Approved input: gno.land/r/gnoland/wugnot.wugnot\" required=\"true\" />\n" +
24 " <gno-input name=\"outputToken\" type=\"text\" placeholder=\"Output: gno.land/r/gnoswap/gns.GNS\" required=\"true\" />\n" +
25 " <gno-input name=\"amountIn\" type=\"text\" placeholder=\"Exact input amount (base units)\" required=\"true\" />\n" +
26 " <gno-input name=\"routeArr\" type=\"text\" placeholder=\"Route: inputToken:outputToken:500\" required=\"true\" />\n" +
27 " <gno-input name=\"amountOutMin\" type=\"text\" placeholder=\"Minimum output amount (base units)\" required=\"true\" />\n" +
28 " <gno-input name=\"sqrtPriceLimitX96\" type=\"text\" placeholder=\"Q64.96 sqrt-price limit (0 = no limit)\" required=\"true\" />\n" +
29 " <gno-input name=\"deadline\" type=\"number\" placeholder=\"Future Unix timestamp (seconds)\" required=\"true\" />\n" +
30 " <gno-input name=\"referrer\" type=\"text\" placeholder=\"Optional referrer address\" />\n" +
31 "</gno-form>\n"
32 case "swap/exact-in":
33 action = md.H3("Exact-input multi-route swap") + "\n" +
34 "<gno-form exec=\"ExactInSwapRoute\">\n" +
35 " <gno-input name=\"inputToken\" type=\"text\" placeholder=\"Approved input: gno.land/r/gnoland/wugnot.wugnot\" required=\"true\" />\n" +
36 " <gno-input name=\"outputToken\" type=\"text\" placeholder=\"Output: gno.land/r/gnoswap/gns.GNS\" required=\"true\" />\n" +
37 " <gno-input name=\"amountIn\" type=\"text\" placeholder=\"Exact input amount (base units)\" required=\"true\" />\n" +
38 " <gno-input name=\"routeArr\" type=\"text\" placeholder=\"Routes: A:C:500,A:B:500*POOL*B:C:3000 (A/B/C = token keys)\" required=\"true\" />\n" +
39 " <gno-input name=\"quoteArr\" type=\"text\" placeholder=\"Route percentages: 100 or 70,30 (total 100)\" required=\"true\" />\n" +
40 " <gno-input name=\"amountOutMin\" type=\"text\" placeholder=\"Minimum output amount (base units)\" required=\"true\" />\n" +
41 " <gno-input name=\"deadline\" type=\"number\" placeholder=\"Future Unix timestamp (seconds)\" required=\"true\" />\n" +
42 " <gno-input name=\"referrer\" type=\"text\" placeholder=\"Optional referrer address\" />\n" +
43 "</gno-form>\n"
44 case "swap/exact-out":
45 action = md.H3("Exact-output multi-route swap") + "\n" +
46 "<gno-form exec=\"ExactOutSwapRoute\">\n" +
47 " <gno-input name=\"inputToken\" type=\"text\" placeholder=\"Approved input: gno.land/r/gnoland/wugnot.wugnot\" required=\"true\" />\n" +
48 " <gno-input name=\"outputToken\" type=\"text\" placeholder=\"Output: gno.land/r/gnoswap/gns.GNS\" required=\"true\" />\n" +
49 " <gno-input name=\"amountOut\" type=\"text\" placeholder=\"Exact output amount (base units)\" required=\"true\" />\n" +
50 " <gno-input name=\"routeArr\" type=\"text\" placeholder=\"Routes: A:C:500,A:B:500*POOL*B:C:3000 (A/B/C = token keys)\" required=\"true\" />\n" +
51 " <gno-input name=\"quoteArr\" type=\"text\" placeholder=\"Route percentages: 100 or 70,30 (total 100)\" required=\"true\" />\n" +
52 " <gno-input name=\"amountInMax\" type=\"text\" placeholder=\"Maximum input amount (base units)\" required=\"true\" />\n" +
53 " <gno-input name=\"deadline\" type=\"number\" placeholder=\"Future Unix timestamp (seconds)\" required=\"true\" />\n" +
54 " <gno-input name=\"referrer\" type=\"text\" placeholder=\"Optional referrer address\" />\n" +
55 "</gno-form>\n"
56 case "swap/exact-out-single":
57 action = md.H3("Exact-output single-route swap") + "\n" +
58 "<gno-form exec=\"ExactOutSingleSwapRoute\">\n" +
59 " <gno-input name=\"inputToken\" type=\"text\" placeholder=\"Approved input: gno.land/r/gnoland/wugnot.wugnot\" required=\"true\" />\n" +
60 " <gno-input name=\"outputToken\" type=\"text\" placeholder=\"Output: gno.land/r/gnoswap/gns.GNS\" required=\"true\" />\n" +
61 " <gno-input name=\"amountOut\" type=\"text\" placeholder=\"Exact output amount (base units)\" required=\"true\" />\n" +
62 " <gno-input name=\"routeArr\" type=\"text\" placeholder=\"Route: inputToken:outputToken:500\" required=\"true\" />\n" +
63 " <gno-input name=\"amountInMax\" type=\"text\" placeholder=\"Maximum input amount (base units)\" required=\"true\" />\n" +
64 " <gno-input name=\"sqrtPriceLimitX96\" type=\"text\" placeholder=\"Q64.96 sqrt-price limit (0 = no limit)\" required=\"true\" />\n" +
65 " <gno-input name=\"deadline\" type=\"number\" placeholder=\"Future Unix timestamp (seconds)\" required=\"true\" />\n" +
66 " <gno-input name=\"referrer\" type=\"text\" placeholder=\"Optional referrer address\" />\n" +
67 "</gno-form>\n"
68 default:
69 return "404\n"
70 }
71
72 swapFee := r.GetSwapFee()
73 implementation := router.GetImplementationPackagePath()
74 statusTable := mdtable.Table{
75 Headers: []string{"Field", "Value"},
76 Rows: [][]string{
77 {"Router package", md.Link("gno.land/r/gnoswap/router", "/r/gnoswap/router")},
78 {"Realm address", md.InlineCode(chain.PackageAddress("gno.land/r/gnoswap/router").String())},
79 {"Active implementation", md.Link(implementation, strings.TrimPrefix(implementation, "gno.land"))},
80 {"Router halted", ufmt.Sprintf("%t", halt.IsHaltedRouter())},
81 },
82 }
83 feeTable := mdtable.Table{
84 Headers: []string{"Field", "Value"},
85 Rows: [][]string{
86 {"Swap fee", ufmt.Sprintf("%d bps", swapFee)},
87 {"Maximum swap fee", ufmt.Sprintf("%d bps (10%%)", maxSwapFeeBPS)},
88 {"Fee unit", "1 bps = 0.01% of the output-token amount"},
89 {"Amount unit", "Integer token base units; decimals are token-specific"},
90 },
91 }
92
93 out := md.H1("Gnoswap Router") + "\n"
94 out += md.H2("Router status") + "\n"
95 out += statusTable.String() + "\n"
96 out += md.H2("Swap fee configuration") + "\n"
97 out += feeTable.String() + "\n"
98 out += md.H2("Swap") + "\n"
99 out += md.Paragraph(
100 md.Link("Exact input: single route", "/r/gnoswap/router") + " · " +
101 md.Link("Exact input: multiple routes", "/r/gnoswap/router:swap/exact-in") + " · " +
102 md.Link("Exact output: single route", "/r/gnoswap/router:swap/exact-out-single") + " · " +
103 md.Link("Exact output: multiple routes", "/r/gnoswap/router:swap/exact-out"),
104 )
105 out += action
106 return out
107}