# `gno.land/r/moul/x/grc20faucet/v0`
**Two free GRC20 tokens, RED and BLUE, so experiments have something to run on.**
Worthless by construction, unlimited, and shared.
```
maketx call -pkgpath gno.land/r/moul/x/grc20faucet/v0 -func Claim
```
100.0000 of each per claim (4 decimals), once every 100 blocks per account.
| token | symbol | registry key |
|---|---|---|
| Red Token | `RED` | `gno.land/r/moul/x/grc20faucet/v0.RED` |
| Blue Token | `BLUE` | `gno.land/r/moul/x/grc20faucet/v0.BLUE` |
Both are registered in [`r/nt/grc20reg`](https://gno.land/r/nt/grc20reg/v0), which
is the point: another realm can find and move them by key without importing this
one. Everything else here is the ordinary GRC20 surface, with the symbol as the
first argument:
```
-func Transfer -args RED -args <to> -args 250000
-func Approve -args BLUE -args <spender> -args 250000
-func TransferFrom -args RED -args <from> -args <to> -args 250000
```
`Approve` is the interesting one. It is what lets a realm such as
[`r/moul/x/grc20wrapdemo`](https://gno.land/r/moul/x/grc20wrapdemo/v0) pull your
tokens into escrow, and until you call it that realm has no authority over your
balance at all.
Two tokens rather than one because the interesting patterns start at two: a
meta-token over a pair needs a pair.
<!-- BEGIN GNOCONTRACTS FOOTER (generated by `make readmes`; do not edit below) -->
---
Part of **[moul/gno-contracts](https://github.com/moul/gno-contracts)** — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage.
**Dependency graph:**

> 🧪 **Highly experimental — potentially vibe-coded.** Not audited; may break, change, or be removed at any time. Do not use with anything of value. Full disclaimer: [DISCLAIMER](https://github.com/moul/gno-contracts/blob/main/DISCLAIMER.md).
<!-- END GNOCONTRACTS FOOTER -->
Allowance(symbol string, owner string, spender string) int64
Approve(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, symbol string, spender string, amount int64)
BalanceOf(symbol string, owner string) int64
Claim(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string})
NextClaim(who string) (int64, bool)
Render(path string) string
TotalSupply(symbol string) int64
Transfer(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, symbol string, to string, amount int64)
TransferFrom(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, symbol string, from string, to string, amount int64)
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.