├── .gitattributes
├── .github
└── CODEOWNERS
├── .gitpod.yml
├── .vscode
└── settings.json
├── 001_gno_cli
├── README.md
├── gno.mod
├── hello.gno
└── hello_test.gno
├── 002_gnokey
└── README.md
├── 003_debug_gno_code
├── README.md
├── gno.mod
├── queue.gno
└── queue_test.gno
├── 004_publishing_contracts
├── README.md
├── gno.mod
├── guestbook.gno
└── screenshot.png
├── 005_blog
└── README.md
├── 006_become_contributor
└── README.md
├── LICENSE
├── Makefile
├── README.md
├── go.mod
├── go.sum
└── z_misc
└── tools.go
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.gno linguist-language=Go
2 |
--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | # CODEOWNERS: https://help.github.com/articles/about-codeowners/
2 |
3 | # Primary repo maintainers.
4 | * @gnolang/devrels @gnolang/tech-staff
5 |
--------------------------------------------------------------------------------
/.gitpod.yml:
--------------------------------------------------------------------------------
1 | # http://gitpod.io/#github.com/gnolang/getting-started-workshop
2 |
3 | additionalRepositories:
4 | - url: https://github.com/gnolang/gno
5 | checkoutLocation: gno
6 |
7 | tasks:
8 | - name: Gnoland
9 | before: cd ../gno/gno.land/
10 | init: go install ./cmd/gnoland
11 | command: gnoland start
12 |
13 | - name: Gnoweb
14 | before: cd ../gno/gno.land/
15 | init: go install ./cmd/gnoweb
16 | command: gnoweb --bind=0.0.0.0:8888
17 |
18 | - name: Deps
19 | before: cd ../gno/misc/devdeps
20 | init: |
21 | make install
22 | echo "Deps installed."
23 |
24 | - name: Gno CLI
25 | init: |
26 | go mod download
27 | go install \
28 | github.com/gnolang/gno/gno.land/cmd/gnokey \
29 | github.com/gnolang/gno/gnovm/cmd/gno
30 | command: gno --help
31 |
32 | #- name: faucet
33 | # ...
34 |
35 | ports:
36 | - name: gnoweb
37 | description: "the Gno.land web server"
38 | port: 8888
39 | onOpen: open-preview
40 |
41 | - name: "gnoland RPC"
42 | description: "the RPC server, managed by tendermint2"
43 | port: 36657
44 | onOpen: notify
45 |
46 | github:
47 | prebuilds:
48 | master: true
49 | branches: true
50 | pullRequests: true
51 | pullRequestsFromForks: true
52 | addCheck: true
53 | addComment: true
54 | addBadge: true
55 |
56 | vscode:
57 | extensions:
58 | - harry-hov.gno
59 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "files.autoSave": "onWindowChange"
3 | }
4 |
--------------------------------------------------------------------------------
/001_gno_cli/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started with Gno CLI
2 |
3 | In this section, you will learn to use the `gno` CLI to write and test Gnolang packages. This part does not rely on a blockchain; instead, it operates solely on the GnoVM.
4 |
5 | ## Steps
6 |
7 | * Use `gno --help` to explore available commands and options.
8 | * Use `gno test .` to test your Gnolang packages.
9 | * For additional features, explore `gno doc`, etc.
10 |
11 | Enjoy the journey of discovering and mastering the Gno CLI!
12 |
--------------------------------------------------------------------------------
/001_gno_cli/gno.mod:
--------------------------------------------------------------------------------
1 | module gno.land/r/getting_started/001_gno_cli
2 |
--------------------------------------------------------------------------------
/001_gno_cli/hello.gno:
--------------------------------------------------------------------------------
1 | package hello
2 |
3 | func Sum(a, b int) int {
4 | return a + b
5 | }
6 |
7 | func Greetings(name string) string {
8 | return "Hello " + name + "!"
9 | }
10 |
--------------------------------------------------------------------------------
/001_gno_cli/hello_test.gno:
--------------------------------------------------------------------------------
1 | package hello
2 |
3 | import "testing"
4 |
5 | func TestSum(t *testing.T) {
6 | got := Sum(1, 2)
7 | expected := 3
8 | if got != expected {
9 | t.Errorf("expected %d, got %d", expected, got)
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/002_gnokey/README.md:
--------------------------------------------------------------------------------
1 | # Learn to Use Gnokey
2 |
3 | `gnokey` is the command line tool for interacting with a blockchain node. It
4 | allows you to make blockchain transactions, publish new packages, and in general
5 | do any operation with a remote or local blockchain node.
6 |
7 | We're going to start by importing a test wallet which has a lot of tokens --
8 | allowing you to freely play around. We'll then show you how you can create your
9 | own wallet, although it will have no keys by default on the devnet -- but it can
10 | be useful to play around with the online testnet.
11 |
12 | ## Import the `test1` Wallet
13 |
14 | To import the `test1` wallet (10^13ugnot in genesis), use the following command:
15 |
16 | ```console
17 | gnokey add test1 --recover
18 | ```
19 |
20 | Mnemonic:
21 |
22 | ```console
23 | source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast
24 | ```
25 |
26 | Check:
27 |
28 | ```console
29 | gnokey list
30 | ```
31 |
32 |
33 | Example...
34 |
35 | ```console
36 | $ gnokey list
37 |
38 | $ gnokey add test1 --recover
39 | Enter a passphrase to encrypt your key to disk:
40 | Repeat the passphrase:
41 | Enter your bip39 mnemonic
42 | source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast
43 |
44 | * test1 (local) - addr: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 pub: gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pq0skzdkmzu0r9h6gny6eg8c9dc303xrrudee6z4he4y7cs5rnjwmyf40yaj, path:
45 |
46 | $ gnokey list
47 | 0. test1 (local) - addr: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 pub: gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pq0skzdkmzu0r9h6gny6eg8c9dc303xrrudee6z4he4y7cs5rnjwmyf40yaj, path:
48 | ```
49 |
50 |
51 | ## Create a New Personal Wallet
52 |
53 | To create a new personal wallet, generate your 24 keywords with the command:
54 |
55 | ```console
56 | gnokey generate
57 | ```
58 |
59 | Then follow the instructions for `test1`, but use your chosen name, e.g., `bob`.
60 |
61 |
62 | Example...
63 |
64 | ```console
65 | $ gnokey generate
66 | meat middle doctor gasp axis drastic flower song test public hire title ivory walnut pledge violin mechanic hedgehog rapid satisfy measure autumn front blind
67 |
68 | $ gnokey add bob --recover
69 | Enter a passphrase to encrypt your key to disk:
70 | Repeat the passphrase:
71 | Enter your bip39 mnemonic
72 | meat middle doctor gasp axis drastic flower song test public hire title ivory walnut pledge violin mechanic hedgehog rapid satisfy measure autumn front blind
73 |
74 | * bob (local) - addr: g1h5tap94s8k0dhwhkldf39vavucvnjhrhepmt8a pub: gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pqdzdqdzjre7nfvtd7ge3gsenxsdf0ww2fcazt957q76glapsrxgeg774qj2, path:
75 |
76 | $ gnokey list
77 | 0. bob (local) - addr: g1h5tap94s8k0dhwhkldf39vavucvnjhrhepmt8a pub: gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pqdzdqdzjre7nfvtd7ge3gsenxsdf0ww2fcazt957q76glapsrxgeg774qj2, path:
78 | 1. test1 (local) - addr: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 pub: gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pq0skzdkmzu0r9h6gny6eg8c9dc303xrrudee6z4he4y7cs5rnjwmyf40yaj, path:
79 | ```
80 |
81 |
82 | ## Interact with the `r/demo/boards` Realm
83 |
84 | Now that we have set up an account, let's try interacting with a smart contract.
85 |
86 | ```console
87 | $ gnokey maketx call \
88 | -pkgpath "gno.land/r/demo/boards" \
89 | -func "CreateThread" \
90 | -gas-fee 1000000ugnot \
91 | -gas-wanted 2000000 \
92 | -send "100000000ugnot" \
93 | -broadcast \
94 | -chainid "dev" \
95 | -args "1" \
96 | -args "Hello world\!" \
97 | -args "Just fooling around with creating a new thread on r/demo/boards." \
98 | -remote "127.0.0.1:26657" test1
99 | Enter password.
100 | (7 gno.land/r/demo/boards.PostID)
101 | OK!
102 | GAS WANTED: 2000000
103 | GAS USED: 1043320
104 | ```
105 |
106 | If you click on `r/demo/boards` from the browser in the top-right corner of
107 | Gitpod, and browse to testboard, you should now be able to see a "Hello world!"
108 | post with the test1 address at the bottom of the page.
109 |
--------------------------------------------------------------------------------
/003_debug_gno_code/README.md:
--------------------------------------------------------------------------------
1 | # Debugging Gno code
2 |
3 | In this section, you will learn to debug your Gno contract. As contracts aren't
4 | modifiable, it is crucial to debug them properly before their publication to
5 | the blockchain.
6 |
7 | Debugging Gno code functions in many ways as in Go;
8 | the biggest tool at our disposal are test files. These are identified
9 | as source files whose names end with `_test.go`. Every function of
10 | the kind `func TestXxx(t *testing.T)` is automatically added as a test,
11 | run when using `gno test`. If the function calls `t.Errorf`, then it is
12 | considered failed.
13 |
14 | - `queue.gno`, in this tutorial's directory `003-debug-gno-code`, is a source file containing 2 stub functions `Push` and `Pop`. Your goal in this tutorial is to implement them correctly and see the tests succeed.
15 | - `queue_test.gno` contains a test that checks the behavior of `Pop` and `Push`.
16 | If you implement them correctly, running `gno test` will succeed without errors.
17 |
18 | ## Steps
19 |
20 | - Run the test:
21 | ```
22 | $ gno test . -verbose
23 | ```
24 | The test will fail, because `Pop` and `Push` are currently not
25 | implemented -- if you open the `queue.gno` file, you will see
26 | that they just contain two `// TODO` comments.
27 |
28 | - Implement `Pop` and `Push`. These need to implement a
29 | FIFO (First In, First Out) queue -- so the last element added
30 | using `Push` will be the first one to be removed using `Pop`.
31 | - Run the test again until it succeeds
32 |
33 |
34 | Solution (only if you're stuck!)
35 |
36 | ```go
37 | func Push(s string) {
38 | q = append(q, s)
39 | }
40 |
41 | func Pop() string {
42 | if len(q) == 0 {
43 | return ""
44 | }
45 | s := q[0]
46 | q = q[1:]
47 | return s
48 | }
49 | ```
50 |
51 |
52 |
--------------------------------------------------------------------------------
/003_debug_gno_code/gno.mod:
--------------------------------------------------------------------------------
1 | module gno.land/r/getting_started/003_debug_gno_code
2 |
--------------------------------------------------------------------------------
/003_debug_gno_code/queue.gno:
--------------------------------------------------------------------------------
1 | package queue
2 |
3 | var q []string
4 |
5 | // Push appends s to q.
6 | func Push(s string) {
7 | // TODO
8 | }
9 |
10 | // Pop removes the first element of q and returns it.
11 | // If q is empty, Pop returns an empty string.
12 | func Pop() string {
13 | // TODO
14 | return ""
15 | }
16 |
--------------------------------------------------------------------------------
/003_debug_gno_code/queue_test.gno:
--------------------------------------------------------------------------------
1 | package queue
2 |
3 | import "testing"
4 |
5 | func TestQueue(t *testing.T) {
6 | // Push 2 items
7 | Push("alice")
8 | Push("bob")
9 | // Call Pop() 3 times
10 | // Third time should return an empty string because the queue is empty
11 | for i, expected := range []string{"alice", "bob", ""} {
12 | res := Pop()
13 | if res != expected {
14 | t.Errorf("Pop()#%d want %q, got %q", i, expected, res)
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/004_publishing_contracts/README.md:
--------------------------------------------------------------------------------
1 | # Publishing contracts
2 |
3 | Now that you know how to write programs and debug gno code, let's get you started
4 | publishing some smart contracts.
5 |
6 | In `guestbook.gno`, you can see a simple application for a guestbook. If you did
7 | not already set up your test1 wallet, it's a good time to do so: [follow
8 | the instructions from the second example](../002-gnokey/README.md).
9 |
10 | The advantage of using the `test1` key instead of your own key is that it has,
11 | at genesis, a large number of tokens which can help us run transactions straight
12 | off the bat.
13 |
14 | From this directory (use the `cd` command in the shell to navigate
15 | `004-publish-contracts`), run the following command:
16 |
17 | ```
18 | gnokey maketx addpkg \
19 | --gas-wanted 10000000 \
20 | --gas-fee 1ugnot \
21 | --pkgpath gno.land/r/demo/guestbook \
22 | --pkgdir . \
23 | --broadcast \
24 | test1
25 | ```
26 |
27 | **Note:** if you need to re-publish the contract, you will get an error if you
28 | run the same command again, as for the time being publishing packages is
29 | permanent and they cannot be modified. So, if you modified the contract, simply
30 | change the `pkgpath` argument slightly (ie. `gno.land/r/demo/guestbook2`).
31 |
32 | ## Browsing the contract
33 |
34 | In the source code, there is a `Render` function. This enables us to browse the
35 | smart contract through the `gnoweb` HTTP frontend.
36 |
37 | From the simple browser in your Gitpod, browse to the path `/r/demo/guestbook`
38 | (appending it to the Gitpod URL - so something like
39 | `https://8888-gnolang-gettingstarted-lnw0x71frja.ws-eu102.gitpod.io/r/demo/guestbook`).
40 | You will see a markdown rendering of the website, which works by executing the Render()
41 | function.
42 |
43 | As expected, there will be one single signature on the guestbook -- the one
44 | defined in `var signatures`. Let's fix that and add a new one!
45 |
46 | ## Adding a new signature
47 |
48 | If you click on the `[help]` link in the header, on the right, you
49 | will also be able to see a list of the exported functions of the realm, and
50 | instructions on how to execute them using `gnokey`.
51 |
52 | By modifying the fields, you can interactively set up your `gnokey` command, and
53 | make it do whatever you want it to.
54 |
55 | 
57 |
58 | Let's run that command:
59 |
60 | ```
61 | gnokey maketx call \
62 | -pkgpath "gno.land/r/demo/guestbook" \
63 | -func "Sign" \
64 | -gas-fee 1000000ugnot \
65 | -gas-wanted 2000000 \
66 | -send "" \
67 | -broadcast \
68 | -chainid "dev" \
69 | -args "Hello world\! And hello, **bold**\!" \
70 | -remote "127.0.0.1:26657" \
71 | test1
72 | ```
73 |
74 | The transaction should succeed, and if you browse again to the homepage of the
75 | realm you should see your new post with your address. Ta-da! :tada:
76 |
77 | ## The magic of realms
78 |
79 | We have glossed over an important concept of Gno for the sake of the tutorial:
80 | how global variables work in realms. You may have noticed that in the source
81 | code we declared a global variable, which contained the first signature:
82 |
83 | ```go
84 | var signatures = []Signature{
85 | {
86 | Message: "You've reached the end of the guestbook!",
87 | Address: "",
88 | Time: time.Date(2023, time.January, 1, 12, 0, 0, 0, time.UTC),
89 | },
90 | }
91 | ```
92 |
93 | This shows up when we browse the realm from the web, and all is good here.
94 | However, after we call `Sign`, it stores the new signature in the global
95 | variable, and suddenly -- poof! -- the signature appears in the guestbook.
96 |
97 | ```go
98 | // append new signature -- at the top of the list
99 | signatures = append([]Signature{{
100 | Message: message,
101 | Address: caller,
102 | Time: time.Now(),
103 | }}, signatures...)
104 | ```
105 |
106 | This is the magic of Gno realms -- they are **stateful.** This means that when
107 | in a transaction you change a global variable, or any data stored within it, the
108 | new data is automagically stored and persisted on the blockchain.
109 |
110 | Because we're running in a blockchain context, as opposed to Go we can't have
111 | things like network access, or access to the filesystem, or using
112 | cryptographically random functions. These are all **non-deterministic,** meaning
113 | that if you attempt to run the code twice, or on different machines, it may lead
114 | to different results. Gno code, in contracts, like all other smart contracts,
115 | must be **deterministic** and always have the same results if it's given the
116 | same starting context -- which is why we provide global variables as a solution
117 | for storing data.
118 |
119 | ### Deterministic time
120 |
121 | The careful observer may note that `time.Now()` is not a deterministic value, as by
122 | definition it is always changing and "should" be different each time the program
123 | is executed. However, to enable the use of time.Now() in blockchain, this will
124 | actually represent the _block time_.
125 |
126 | In a blockchain, a new "block" is created after a given amount of time. This
127 | will roughly match the current time; but note the value does not change during
128 | the execution of the program, and as such `time.Now()` cannot be used to
129 | benchmark a program -- it is just a rough idea of what time the transaction is
130 | executed.
131 |
132 | ### The difference between realms and packages
133 |
134 | As you've learned, realms have the distinctive feature of being able to persist
135 | their global variables. The underlying idea here is that realms are end-user
136 | smart contracts; which is why they also support the `Render()` function for
137 | viewing their data on the web.
138 |
139 | In `guestbook.gno`, however, we make an import of package
140 | `gno.land/p/demo/ufmt`. This is an example of a _package_ (as opposed to a
141 | _realm_) -- it is distinct from a realm because its import path starts with
142 | `gno.land/p/` instead of `gno.land/r/`.[^1]
143 |
144 | Packages behave like normal Go packages, or similar concepts of other
145 | programming languages: they are reusable pieces of code which are meant as
146 | "building blocks" to build complex software. They don't persist any data, nor
147 | their functions can be executed as smart contracts.
148 |
149 | ## Keep going
150 |
151 | There are two more challenges for you in `guestbook.gno`: you can find them in
152 | the `TODO` comments.
153 |
154 | The first one is to prevent a user from signing the guestbook more than once,
155 | aborting the transaction entirely. In Gno, you can abort transactions by using
156 | the `panic()` function.
157 |
158 |
159 | Sample solution (only if you're stuck!)
160 |
161 | ```go
162 | for _, sig := range signatures {
163 | if sig.Address == caller {
164 | panic("you have already signed the guestbook!")
165 | }
166 | }
167 | ```
168 |
169 |
170 |
171 | The second one is to use the `gno.land/r/demo/users` realm to render usernames.
172 | The `users` realm is a "username registry" which is used in
173 | other example realms, like [`microblog`](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo/microblog),
174 | [`boards`](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo/boards)
175 | and [`groups`](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo/groups).
176 | You can inspect it and register yourself as a user of the realm.
177 |
178 | We can make our guestbook nicer by referring to users using their username
179 | instead of their address...
180 |
181 | Here's a sample command to register a user (note the `--send` argument -- we use
182 | this to register without being "invited"):
183 |
184 | ```
185 | gnokey maketx call \
186 | -pkgpath "gno.land/r/demo/users" \
187 | -func "Register" \
188 | -gas-fee 1000000ugnot \
189 | -gas-wanted 2000000 \
190 | -send "200000000ugnot" \
191 | -broadcast \
192 | -chainid "dev" \
193 | -args "" -args "torvalds" -args "https://github.com/torvalds" \
194 | -remote "127.0.0.1:26657" test1
195 | ```
196 |
197 |
198 | Hint
199 |
200 | To call other realms in Gno, we simply have to import them at the top of the
201 | file in the `import` statement. After doing that, you can use the function
202 | `users.GetUserByAddress` to see if there is a matching User.
203 |
204 |
205 |
206 |
207 | Sample solution (only if you're stuck!)
208 |
209 | ```go
210 | // add import: "gno.land/r/demo/users"
211 |
212 | func Render(string) string {
213 | b := new(strings.Builder)
214 | // gnoweb, which is the HTTP frontend we're using, will render the content we
215 | // pass to it as markdown.
216 | b.WriteString("# Guestbook\n\n")
217 | for _, sig := range signatures {
218 | a := string(sig.Address)
219 | if a == "" {
220 | a = "anonymous coward"
221 | } else if u := users.GetUserByAddress(sig.Address); u != nil {
222 | a = ufmt.Sprintf("[@%s](/r/demo/users:%s)",
223 | u.Name(), u.Name())
224 | }
225 | // We currently don't have a full fmt package; we have "ufmt" to do basic formatting.
226 | // See `gno doc ufmt` for more information.
227 | //
228 | // If you are unfamiliar with Go time formatting, it is done by writing the way you'd
229 | // format a reference time. See `gno doc time.Layout` for more information.
230 | b.WriteString(ufmt.Sprintf(
231 | "%s\n\n_written by %s at %s_\n\n----\n\n",
232 | sig.Message, a, sig.Time.Format("2006-01-02"),
233 | ))
234 | }
235 | return b.String()
236 | }
237 | ```
238 |
239 |
240 |
241 | ## Recap
242 |
243 | 1. By using the `gnokey maketx addpkg`, we can add a new package or realm to the
244 | blockchain.
245 | 2. Packages are reusable "building blocks" of code. Realms are "special
246 | packages" which:
247 | - Can persist state in their global variables
248 | - Can have their functions called as smart contracts, using `gnokey`
249 | - Can be rendered through the web frontend, using the special `Render` function
250 | 3. Using the `[help]` page of gnoweb, we can construct transactions to smart
251 | contracts we've created.
252 | 4. All Gno code must be deterministic and run exactly the same independent of
253 | the machine. We are still allowed to use `time.Now()` -- however that will
254 | actually return the block time instead of the machine's clock time.
255 | 5. We can make calls to other realms with their state by simply importing their
256 | path in our Gno code.
257 |
258 | [^1]: at the moment, all code uploaded to the chain must have an import path starting with either of the two.
259 |
--------------------------------------------------------------------------------
/004_publishing_contracts/gno.mod:
--------------------------------------------------------------------------------
1 | module gno.land/r/getting_started/004_publishing_contracts
2 |
3 | require (
4 | gno.land/p/demo/ufmt v0.0.0-latest
5 | )
6 |
--------------------------------------------------------------------------------
/004_publishing_contracts/guestbook.gno:
--------------------------------------------------------------------------------
1 | // Realm guestbook is a smart contract to register presences at a workshop.
2 | // Participants to the workshop can add their own signature by calling the [Sign]
3 | // contract.
4 | package guestbook
5 |
6 | import (
7 | "std"
8 | "strings"
9 | "time"
10 |
11 | "gno.land/p/demo/ufmt"
12 | )
13 |
14 | type Signature struct {
15 | Message string
16 | Address std.Address
17 | Time time.Time
18 | }
19 |
20 | var signatures = []Signature{
21 | {
22 | Message: "You've reached the end of the guestbook!",
23 | Address: "",
24 | Time: time.Date(2023, time.January, 1, 12, 0, 0, 0, time.UTC),
25 | },
26 | }
27 |
28 | // Sign adds a new signature to the guestbook
29 | func Sign(message string) {
30 | // AssertOriginCall makes it possible to call Sign only as a transaction - ie.
31 | // it cannot be executed as a function, or called from other realms.
32 | std.AssertOriginCall()
33 | // caller, type std.Address, is the address of who has called this contract.
34 | caller := std.GetOrigCaller()
35 |
36 | // TODO: make sure caller hasn't signed the guestbook already
37 |
38 | // append new signature -- at the top of the list
39 | signatures = append([]Signature{{
40 | Message: message,
41 | Address: caller,
42 | Time: time.Now(),
43 | }}, signatures...)
44 | }
45 |
46 | // Render is called when running the realm through gnoweb, and allows to render
47 | // the realm's internal data, without the possibility of changing it.
48 | //
49 | // Render accepts a string, which is a "request path" -- similar to an HTTP
50 | // request. We will be further exploring this at a later time, for now the
51 | // argument is ignored.
52 | func Render(string) string {
53 | b := new(strings.Builder)
54 | // gnoweb, which is the HTTP frontend we're using, will render the content we
55 | // pass to it as markdown.
56 | b.WriteString("# Guestbook\n\n")
57 | for _, sig := range signatures {
58 | a := string(sig.Address)
59 | if a == "" {
60 | a = "anonymous coward"
61 | }
62 | // We currently don't have a full fmt package; we have "ufmt" to do basic formatting.
63 | // See `gno doc ufmt` for more information.
64 | //
65 | // If you are unfamiliar with Go time formatting, it is done by writing the way you'd
66 | // format a reference time. See `gno doc time.Layout` for more information.
67 | b.WriteString(ufmt.Sprintf(
68 | "%s\n\n_written by %s on %s_\n\n----\n\n",
69 | sig.Message, a, sig.Time.Format("2006-01-02"),
70 | ))
71 |
72 | // TODO: resolve sig.Address to a username, by using the r/demo/users realm.
73 | }
74 | return b.String()
75 | }
76 |
--------------------------------------------------------------------------------
/004_publishing_contracts/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gnolang/old-getting-started-workshop/ae5ceda987de80566d78903c82162ef7664c89f6/004_publishing_contracts/screenshot.png
--------------------------------------------------------------------------------
/005_blog/README.md:
--------------------------------------------------------------------------------
1 | # Building Social Apps on Gno
2 |
3 | ## Overview
4 |
5 | Congratulations on completing the previous steps! Now, let's take on a more challenging task.
6 |
7 | One of Gno's standout features is how it simplifies building social apps compared to other ecosystems. Social apps focus on managing more complex objects, involving various types, recursive pointers, and so on, instead of just arrays of balances like many DeFi apps.
8 |
9 | Let's explore some existing apps as examples. If you attend a physical workshop, feel free to ask questions and discuss with the organizers.
10 |
11 | ## Resources
12 |
13 | Here are some example apps to get you started:
14 |
15 | - [Boards](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)
16 | - [Microblog](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/microblog)
17 | - [Blog](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/gnoland/blog)
18 |
19 | _Organizers Note: We can make this exercice better by bootstrapping a series of .gno files, with a Render func and commands calling `gno test --update-golden-tests`._
20 |
--------------------------------------------------------------------------------
/006_become_contributor/README.md:
--------------------------------------------------------------------------------
1 | # Become a Contributor
2 |
3 | Welcome to the Gno community! This series of exercises has introduced you to Gno, but the real excitement lies ahead as we build Gno together, hand in hand with our community.
4 |
5 | With our innovative [Proof of Contribution](https://github.com/gnolang/gno/issues/918) consensus mechanism, we are creating an ecosystem that truly belongs to its contributors.
6 |
7 | ## Next Steps
8 |
9 | - Check out the main repository at https://github.com/gnolang/gno. You can get involved by looking for existing issues to work on or proposing improvements that haven't been requested yet.
10 |
11 | - Participate in the thrilling [Game of Realms](https://github.com/gnolang/gno/issues/390) online competition, where you can contribute and earn prizes in ATOM.
12 |
13 | - Join our vibrant community on various platforms such as Twitter, Discord, and Reddit. Engage in discussions and share your ideas with like-minded individuals.
14 |
15 | Together, we'll shape the future of Gno and make a lasting impact on the blockchain landscape. We look forward to collaborating with you and building something truly special!
16 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Creative Commons Legal Code
2 |
3 | CC0 1.0 Universal
4 |
5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
12 | HEREUNDER.
13 |
14 | Statement of Purpose
15 |
16 | The laws of most jurisdictions throughout the world automatically confer
17 | exclusive Copyright and Related Rights (defined below) upon the creator
18 | and subsequent owner(s) (each and all, an "owner") of an original work of
19 | authorship and/or a database (each, a "Work").
20 |
21 | Certain owners wish to permanently relinquish those rights to a Work for
22 | the purpose of contributing to a commons of creative, cultural and
23 | scientific works ("Commons") that the public can reliably and without fear
24 | of later claims of infringement build upon, modify, incorporate in other
25 | works, reuse and redistribute as freely as possible in any form whatsoever
26 | and for any purposes, including without limitation commercial purposes.
27 | These owners may contribute to the Commons to promote the ideal of a free
28 | culture and the further production of creative, cultural and scientific
29 | works, or to gain reputation or greater distribution for their Work in
30 | part through the use and efforts of others.
31 |
32 | For these and/or other purposes and motivations, and without any
33 | expectation of additional consideration or compensation, the person
34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she
35 | is an owner of Copyright and Related Rights in the Work, voluntarily
36 | elects to apply CC0 to the Work and publicly distribute the Work under its
37 | terms, with knowledge of his or her Copyright and Related Rights in the
38 | Work and the meaning and intended legal effect of CC0 on those rights.
39 |
40 | 1. Copyright and Related Rights. A Work made available under CC0 may be
41 | protected by copyright and related or neighboring rights ("Copyright and
42 | Related Rights"). Copyright and Related Rights include, but are not
43 | limited to, the following:
44 |
45 | i. the right to reproduce, adapt, distribute, perform, display,
46 | communicate, and translate a Work;
47 | ii. moral rights retained by the original author(s) and/or performer(s);
48 | iii. publicity and privacy rights pertaining to a person's image or
49 | likeness depicted in a Work;
50 | iv. rights protecting against unfair competition in regards to a Work,
51 | subject to the limitations in paragraph 4(a), below;
52 | v. rights protecting the extraction, dissemination, use and reuse of data
53 | in a Work;
54 | vi. database rights (such as those arising under Directive 96/9/EC of the
55 | European Parliament and of the Council of 11 March 1996 on the legal
56 | protection of databases, and under any national implementation
57 | thereof, including any amended or successor version of such
58 | directive); and
59 | vii. other similar, equivalent or corresponding rights throughout the
60 | world based on applicable law or treaty, and any national
61 | implementations thereof.
62 |
63 | 2. Waiver. To the greatest extent permitted by, but not in contravention
64 | of, applicable law, Affirmer hereby overtly, fully, permanently,
65 | irrevocably and unconditionally waives, abandons, and surrenders all of
66 | Affirmer's Copyright and Related Rights and associated claims and causes
67 | of action, whether now known or unknown (including existing as well as
68 | future claims and causes of action), in the Work (i) in all territories
69 | worldwide, (ii) for the maximum duration provided by applicable law or
70 | treaty (including future time extensions), (iii) in any current or future
71 | medium and for any number of copies, and (iv) for any purpose whatsoever,
72 | including without limitation commercial, advertising or promotional
73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
74 | member of the public at large and to the detriment of Affirmer's heirs and
75 | successors, fully intending that such Waiver shall not be subject to
76 | revocation, rescission, cancellation, termination, or any other legal or
77 | equitable action to disrupt the quiet enjoyment of the Work by the public
78 | as contemplated by Affirmer's express Statement of Purpose.
79 |
80 | 3. Public License Fallback. Should any part of the Waiver for any reason
81 | be judged legally invalid or ineffective under applicable law, then the
82 | Waiver shall be preserved to the maximum extent permitted taking into
83 | account Affirmer's express Statement of Purpose. In addition, to the
84 | extent the Waiver is so judged Affirmer hereby grants to each affected
85 | person a royalty-free, non transferable, non sublicensable, non exclusive,
86 | irrevocable and unconditional license to exercise Affirmer's Copyright and
87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the
88 | maximum duration provided by applicable law or treaty (including future
89 | time extensions), (iii) in any current or future medium and for any number
90 | of copies, and (iv) for any purpose whatsoever, including without
91 | limitation commercial, advertising or promotional purposes (the
92 | "License"). The License shall be deemed effective as of the date CC0 was
93 | applied by Affirmer to the Work. Should any part of the License for any
94 | reason be judged legally invalid or ineffective under applicable law, such
95 | partial invalidity or ineffectiveness shall not invalidate the remainder
96 | of the License, and in such case Affirmer hereby affirms that he or she
97 | will not (i) exercise any of his or her remaining Copyright and Related
98 | Rights in the Work or (ii) assert any associated claims and causes of
99 | action with respect to the Work, in either case contrary to Affirmer's
100 | express Statement of Purpose.
101 |
102 | 4. Limitations and Disclaimers.
103 |
104 | a. No trademark or patent rights held by Affirmer are waived, abandoned,
105 | surrendered, licensed or otherwise affected by this document.
106 | b. Affirmer offers the Work as-is and makes no representations or
107 | warranties of any kind concerning the Work, express, implied,
108 | statutory or otherwise, including without limitation warranties of
109 | title, merchantability, fitness for a particular purpose, non
110 | infringement, or the absence of latent or other defects, accuracy, or
111 | the present or absence of errors, whether or not discoverable, all to
112 | the greatest extent permissible under applicable law.
113 | c. Affirmer disclaims responsibility for clearing rights of other persons
114 | that may apply to the Work or any use thereof, including without
115 | limitation any person's Copyright and Related Rights in the Work.
116 | Further, Affirmer disclaims responsibility for obtaining any necessary
117 | consents, permissions or other rights required for any use of the
118 | Work.
119 | d. Affirmer understands and acknowledges that Creative Commons is not a
120 | party to this document and has no duty or obligation with respect to
121 | this CC0 or use of the Work.
122 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | install:
2 | @# install using go.mod
3 | go mod download
4 | go install github.com/gnolang/gno/gnovm/cmd/gno
5 | go install github.com/gnolang/gno/gno.land/cmd/gnokey
6 |
7 | bumpdeps:
8 | go get github.com/gnolang/gno@latest
9 | go mod tidy
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # :magic_wand: Getting Started with Gno
2 |
3 | Welcome to the world of Gno! Through this repository, you can effortlessly embark on a journey to write your first Gno realm -- otherwise known as a smart contract.
4 |
5 | Before you begin, we highly recommend exploring [Gno By Example](https://gno-by-example.com) to familiarize yourself with Gno's foundational concepts.
6 |
7 | ## Suggested Discovery Plan
8 |
9 | 1. Check out the tutorial section of [Awesome Gno](https://github.com/gnolang/awesome-gno#tutorials) and explore the [YouTube channel](https://www.youtube.com/@_gnoland/videos) for previous workshops and demos.
10 | 2. Learn to use the `gno` CLI to write and test your contracts (`gno test [PATH]`) without relying on a blockchain. It offers speed and convenience, and works similarly to the `go` command line tool.
11 | 3. Master `gnokey` for account management and performing transactions.
12 | 4. Discover how to publish contracts on your local devnet.
13 | 5. Obtain faucet tokens and publish your contracts on https://staging.gno.land or another testnet.
14 | 6. Start building more complex dApps, utilizing realms (`/r/...`) and pure packages (`/p/...`) you create or those crafted by the community. Leverage the `Render()` function for smooth interactions.
15 | 7. Experiment with creating web frontends or new clients to engage with the chain and your contracts.
16 |
17 | ## Using Gitpod
18 |
19 | Gitpod simplifies the setup by providing a `gnoland` node, a `gnoweb` server, and a pre-configured terminal with the `gno` CLI.
20 |
21 | 1. Just click the button below.
22 | 2. Start hacking!
23 |
24 | [](https://gitpod.io/new/#https://github.com/gnolang/getting-started)
25 |
26 | ## Fork and Hack
27 |
28 | 1. Install `gno` from https://github.com/gnolang/gno and set up your local environment.
29 | 2. Fork this repo.
30 | 3. Start hacking!
31 |
32 | ## Gno IDE
33 |
34 | _Coming soon_
35 |
36 | ## Resources
37 |
38 | - Gno By Example: https://gno-by-example.com
39 | - Main Repo: https://github.com/gnolang/gno
40 | - Official Website: https://gno.land
41 | - Community Content: https://github.com/gnolang/awesome-gno
42 | - Presentations and Workshops: https://github.com/gnolang/workshops
43 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/gnolang/getting-started
2 |
3 | go 1.20
4 |
5 | require github.com/gnolang/gno v0.0.0-20230723112528-4df47de0731a
6 |
7 | require (
8 | github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c // indirect
9 | github.com/btcsuite/btcd/btcutil v1.1.1 // indirect
10 | github.com/cespare/xxhash v1.1.0 // indirect
11 | github.com/cespare/xxhash/v2 v2.1.1 // indirect
12 | github.com/cockroachdb/apd v1.1.0 // indirect
13 | github.com/davecgh/go-spew v1.1.1 // indirect
14 | github.com/dgraph-io/badger/v3 v3.2103.4 // indirect
15 | github.com/dgraph-io/ristretto v0.1.1 // indirect
16 | github.com/dustin/go-humanize v1.0.0 // indirect
17 | github.com/gnolang/cors v1.8.1 // indirect
18 | github.com/gnolang/overflow v0.0.0-20170615021017-4d914c927216 // indirect
19 | github.com/gogo/protobuf v1.3.2 // indirect
20 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
21 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect
22 | github.com/golang/protobuf v1.5.3 // indirect
23 | github.com/golang/snappy v0.0.3 // indirect
24 | github.com/google/flatbuffers v1.12.1 // indirect
25 | github.com/gorilla/websocket v1.5.0 // indirect
26 | github.com/jmhodges/levigo v1.0.0 // indirect
27 | github.com/klauspost/compress v1.12.3 // indirect
28 | github.com/libp2p/go-buffer-pool v0.1.0 // indirect
29 | github.com/linxGnu/grocksdb v1.7.15 // indirect
30 | github.com/pelletier/go-toml v1.9.5 // indirect
31 | github.com/peterbourgon/ff/v3 v3.3.0 // indirect
32 | github.com/pkg/errors v0.9.1 // indirect
33 | github.com/pmezard/go-difflib v1.0.0 // indirect
34 | github.com/syndtr/goleveldb v1.0.0 // indirect
35 | github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect
36 | go.etcd.io/bbolt v1.3.7 // indirect
37 | go.opencensus.io v0.22.5 // indirect
38 | go.uber.org/atomic v1.7.0 // indirect
39 | go.uber.org/multierr v1.9.0 // indirect
40 | golang.org/x/crypto v0.10.0 // indirect
41 | golang.org/x/mod v0.9.0 // indirect
42 | golang.org/x/net v0.11.0 // indirect
43 | golang.org/x/sys v0.9.0 // indirect
44 | golang.org/x/term v0.9.0 // indirect
45 | golang.org/x/tools v0.6.0 // indirect
46 | google.golang.org/protobuf v1.27.1 // indirect
47 | )
48 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
2 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3 | github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
4 | github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
5 | github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
6 | github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
7 | github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
8 | github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c h1:lnAMg3ra/Gw4AkRMxrxYs8nrprWsHowg8H9zaYsJOo4=
9 | github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M=
10 | github.com/btcsuite/btcd/btcec/v2 v2.1.1/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
11 | github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A=
12 | github.com/btcsuite/btcd/btcutil v1.1.1 h1:hDcDaXiP0uEzR8Biqo2weECKqEw0uHDZ9ixIWevVQqY=
13 | github.com/btcsuite/btcd/btcutil v1.1.1/go.mod h1:nbKlBMNm9FGsdvKvu0essceubPiAcI57pYBNnsLAa34=
14 | github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
15 | github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
16 | github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
17 | github.com/btcsuite/btcutil v1.0.2 h1:9iZ1Terx9fMIOtq1VrwdqfsATL9MC2l8ZrUY6YZ2uts=
18 | github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
19 | github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
20 | github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I=
21 | github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
22 | github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
23 | github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
24 | github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
25 | github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
26 | github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
27 | github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
28 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
29 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
30 | github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
31 | github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
32 | github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
33 | github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
34 | github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
35 | github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
36 | github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
37 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
38 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
39 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
40 | github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
41 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
42 | github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=
43 | github.com/dgraph-io/badger/v3 v3.2103.4 h1:WE1B07YNTTJTtG9xjBcSW2wn0RJLyiV99h959RKZqM4=
44 | github.com/dgraph-io/badger/v3 v3.2103.4/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5jsE0PPFzRiKjtcdw=
45 | github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8=
46 | github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA=
47 | github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
48 | github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
49 | github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
50 | github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
51 | github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0=
52 | github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A=
53 | github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk=
54 | github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
55 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
56 | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
57 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
58 | github.com/gnolang/cors v1.8.1 h1:D3y1DMoWcgGpCefHwD4UHjy1w1163sfczZyy7b5wH8o=
59 | github.com/gnolang/cors v1.8.1/go.mod h1:g7HJhHH+N1r+oRrb7ckR2J6xp5es4EizpAP0JpfgVgU=
60 | github.com/gnolang/gno v0.0.0-20230723112528-4df47de0731a h1:0g88X3UP163Y9m9Qyp0saxla5sjfL9yO6YGC8zMGE8k=
61 | github.com/gnolang/gno v0.0.0-20230723112528-4df47de0731a/go.mod h1:80Pmb2m9eOp2kWkdVG9pBqMTlkBKWul8dT3x/r5joXQ=
62 | github.com/gnolang/overflow v0.0.0-20170615021017-4d914c927216 h1:GKvsK3oLWG9B1GL7WP/VqwM6C92j5tIvB844oggL9Lk=
63 | github.com/gnolang/overflow v0.0.0-20170615021017-4d914c927216/go.mod h1:xJhtEL7ahjM1WJipt89gel8tHzfIl/LyMY+lCYh38d8=
64 | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
65 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
66 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
67 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
68 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
69 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
70 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
71 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
72 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
73 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
74 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
75 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
76 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
77 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
78 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
79 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
80 | github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
81 | github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
82 | github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
83 | github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
84 | github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
85 | github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw=
86 | github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
87 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
88 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
89 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
90 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
91 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
92 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
93 | github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
94 | github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
95 | github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
96 | github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
97 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
98 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
99 | github.com/jaekwon/testify v1.6.1 h1:4AtAJcR9GzXN5W4DdY7ie74iCPiJV1JJUJL90t2ZUyw=
100 | github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
101 | github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
102 | github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U=
103 | github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ=
104 | github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
105 | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
106 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
107 | github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
108 | github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/VqWxVU=
109 | github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
110 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
111 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
112 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
113 | github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
114 | github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
115 | github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
116 | github.com/linxGnu/grocksdb v1.7.15 h1:AEhP28lkeAybv5UYNYviYISpR6bJejEnKuYbnWAnxx0=
117 | github.com/linxGnu/grocksdb v1.7.15/go.mod h1:pY55D0o+r8yUYLq70QmhdudxYvoDb9F+9puf4m3/W+U=
118 | github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
119 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
120 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
121 | github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
122 | github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
123 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
124 | github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
125 | github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
126 | github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA=
127 | github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
128 | github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
129 | github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
130 | github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
131 | github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
132 | github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
133 | github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
134 | github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
135 | github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
136 | github.com/peterbourgon/ff/v3 v3.3.0 h1:PaKe7GW8orVFh8Unb5jNHS+JZBwWUMa2se0HM6/BI24=
137 | github.com/peterbourgon/ff/v3 v3.3.0/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ=
138 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
139 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
140 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
141 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
142 | github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
143 | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
144 | github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
145 | github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
146 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
147 | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
148 | github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
149 | github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
150 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
151 | github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
152 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
153 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
154 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
155 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
156 | github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
157 | github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
158 | github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
159 | github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok=
160 | github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8=
161 | github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
162 | github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
163 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
164 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
165 | go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ=
166 | go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
167 | go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0=
168 | go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
169 | go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
170 | go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
171 | go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
172 | go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
173 | golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
174 | golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
175 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
176 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
177 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
178 | golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
179 | golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
180 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
181 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
182 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
183 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
184 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
185 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
186 | golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
187 | golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
188 | golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
189 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
190 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
191 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
192 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
193 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
194 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
195 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
196 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
197 | golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
198 | golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
199 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
200 | golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
201 | golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
202 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
203 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
204 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
205 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
206 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
207 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
208 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
209 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
210 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
211 | golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
212 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
213 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
214 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
215 | golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
216 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
217 | golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
218 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
219 | golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
220 | golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
221 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
222 | golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
223 | golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
224 | golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
225 | golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28=
226 | golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
227 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
228 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
229 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
230 | golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
231 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
232 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
233 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
234 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
235 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
236 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
237 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
238 | golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
239 | golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
240 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
241 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
242 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
243 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
244 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
245 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
246 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
247 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
248 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
249 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
250 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
251 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
252 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
253 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
254 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
255 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
256 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
257 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
258 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
259 | google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
260 | google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
261 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
262 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
263 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
264 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
265 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
266 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
267 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
268 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
269 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
270 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
271 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
272 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
273 |
--------------------------------------------------------------------------------
/z_misc/tools.go:
--------------------------------------------------------------------------------
1 | package tools
2 |
3 | import _ "github.com/gnolang/gno/gnovm/cmd/gno"
4 |
--------------------------------------------------------------------------------