├── .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 | ![A screenshot of a simple configuration of gnokey, that we will use 56 | later.](./screenshot.png) 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 | [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](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 | --------------------------------------------------------------------------------