Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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}