4ca40fd3bc
* Starting on cosmwasm smart contracts * Mixnet contract now builds * Removing license and notice files, the monorepo already has these. * Removing generated README content * Simplified development instructions a bit. * Converted some network monitor files to use SPDX license headers * Renamed packaget to mixnet-contracts * Depending on the Nym topology crate * Renaming contract package in usage * Renamed "announce" to "register_node" in the defined messages * Fixed package name for mixnet contracts in defined release annotations * Added the mixnet contracts to the Cargo lock file * Renamed some fields in our contract topology * Using the stringy mixnode from the validator client. * Removing mix nodes count from state, we can infer that * Saving generated code in comment as it's a useful example for now * Renamed "count" to "get_topology" * Adding the beginnings of a validator client (in Typescript) * Starting to integrate example code. WIP. * Ignoring generated accounts * Making a few less mixnodes :) * Adding shebang to start script * Cranking up the Nym-related gas limits, as otherwise contract upload fails. * Simplest mixnode example is now working * Removing the external client code, it messed up wasm compilation. Will copy/paste for now. * Contract now wants to add a MixNode rather than an IP string * Adding mixnodes via contract now works (!) * Simplified mixnode registration example * Further mixnode-adding simplification. * Adding author name * Fixed description * Sent funds are now required to bond a mixnode * Ensuring that we send correct coin denomination * Unbonding now works (!). Quite primitivist. * Checking that unbonding works from the client. * Setting up a thief account to play with * Checking to see whether thief can unbond a node (it fails, happily) * Adding a more specific error for when an account attempts to unbond but owns no bonds * Figured out how to test contract balances * Set the console messages to explain things a little more nicely * Tests for insufficient funds result * Using more async in driver example * Added a bit more explanation of the actions taken by the driver example * Locking down wasm instantiate a bit more * Docs clarifications on how to run example * README clarification * Corrected the commit hash in the wasmd build command, it was still set for 0.14.0 * Moved models from types into state * Starting work on range queries * whitespace * Going back to slow but reliabel node uploads and disabling new contract upload * Cranking gas fees temporarily * Mixnode key retrieval working and tested * Range retrievals now working well * Removing unused clone * Compressing tests a bit * Testing node retrieval on large numbers of nodes. Not sure whether MockStorage has the same space limitations as production storage does. * Getting rid of spelling warning * Removing unused responses * Minor cleanup * Starting to map my way out of the tuples * Slightly more meaningful variable names * Returning a StdResult from nodes query * Fighting through the unwraps :) * Unfucking a bit more * Starting to use ranged nodes in contract * Testing node retrieval from range store * Ditching generated tests * Adding works, still need to test removing mixnodes * Attempting to remove a mixnode returns an error when no nodes exist * Un-registering when no accounts exist (edit) * un-registering someone else's mixnode fails * Ensuring proper ownership * Testing for only 1 mixnode getting deleted * Testing single-node retrieval * Removing mixnode working * Removed unused imports and unused variable warnings * Made handler functions private * Tested for error response on mixnode removal * Ensured proper post-state on mixnode removal * Using Vec<Coin> for currency equality comparisons * Removed todo, this amount is only for logging purposes anyway * Refactoring tests a bit * Adding a few storytelling comments * Putting helper methods into alphabetical order * Drying up mixnode adding in tests * Using the new add_mixnode helper * Checking full object equality in test * Removing the GetNodes handler * Taking a more "storytelling" approach to the contract tests * We need a few more methods to run our example driver * We now need to make a new address for each node we want to have, as each sending account can only have one node * HumanAddr not needed * Making call sequence a little more readable * Added the results of today's experiments with the REST API to the validator client readme * Corrected console.log message * Adding a note about how to run tests * More contract exercising fun * Updating mocha * Whitespace * Adding a note about running tests * Adding typed rest client * Starting to mess with typescript paging client * Removing the rest client, we'll use the cosmjs one for this * Noting a few more contract requirements * Starting client restructuring * Importing cosmjs stargate client * Starting to work on the chain cache * Cleanup * Removing type annotations which hilariously worked, confusing the compiler * Might as well do each cache individually * Renaming chaincache so that it handles only mixnodes * Renaming chaincache * Setting dynamic per-page value to ease testing * Using perPage in tests * Moving tests back into their own special home so they don't bloat our package * Ignoring generated docs * Adding TypeDoc documentation generator * Removing unused NetClient import * Added docs generation * Noting existence of docs generation * Starting to test paged responses * Working paging tests * Clarified test names a bit * Removed console.logs * Added a test for two full pages. * Formatting * Starting to query for mix nodes * Removed the topology in preparation for paging * Removing unused struct * Getting ready for series-based paging * We're now setting page size limits on list retrievals * Pagination starting to work, needs more testing * Moved test support stuff into its own home * Removing duplicate testy code * Testing all paging stuff in the contract * Removed useless method duplicate * Moving queries into their own file * Removing redundant tests * Testing default paging limit * Testing max paging limit * We don't need to c/p pagination stuff from the cw-plus contracts, removing * Testing pagination * Making next key calculation explict via a function * Removing temporary variable * Commenting final state * Incorporating the PagedResponse * On the road to a working TypeScript client * Adding some logging utilities * Paged retrieval working but needs improvement - it's very brittle * Getting the loop right * Removing unused logger * Setting up a request count * Documenting the ins and outs of the client network interface * Removing requestCount as we're not using it yet * Success! Making paginated requests for mixnodes! * Differentiating between MixNode and MixNodeBond * Checking that Fred can upload a mixnode * Fixing export * Adding the ability for client to get balances * Docs fix * Converting interfaces to types * Changing `mixNodes()` to `getMixNodes()` on client * We might as well return the nodes we've just retrieved when we refresh * Starting work on unbonding * Fixed a caching bug which was causing multiple result sets to be cached * Using the sender address as the key for removal * Importing some result stuff so we can find out what happened on execution * Minor messing around to prove that the sequence fully works * Displaying a nicer message on mixnode unbond * Renamed announce to bond in validator client * Fixed unstable clippy warnings * Removing commented fields * Comment spacing * Changed announce to bond in example code * Making the test accounts directory configurable * Rebuilt * Loading keys from the local ./accounts directory * Ignoring contract lockfile * Saving out a contract lockfile so things continue working after contract upload * Splitting the driver example into smaller self-contained examples * Deleting the example that Andrew hates so much * Making dependabot happy * Stricter equals * Removing unused import
116 lines
5.1 KiB
Markdown
116 lines
5.1 KiB
Markdown
# Publishing Contracts
|
|
|
|
This is an overview of how to publish the contract's source code in this repo.
|
|
We use Cargo's default registry [crates.io](https://crates.io/) for publishing contracts written in Rust.
|
|
|
|
## Preparation
|
|
|
|
Ensure the `Cargo.toml` file in the repo is properly configured. In particular, you want to
|
|
choose a name starting with `cw-`, which will help a lot finding CosmWasm contracts when
|
|
searching on crates.io. For the first publication, you will probably want version `0.1.0`.
|
|
If you have tested this on a public net already and/or had an audit on the code,
|
|
you can start with `1.0.0`, but that should imply some level of stability and confidence.
|
|
You will want entries like the following in `Cargo.toml`:
|
|
|
|
```toml
|
|
name = "cw-escrow"
|
|
version = "0.1.0"
|
|
description = "Simple CosmWasm contract for an escrow with arbiter and timeout"
|
|
repository = "https://github.com/confio/cosmwasm-examples"
|
|
```
|
|
|
|
You will also want to add a valid [SPDX license statement](https://spdx.org/licenses/),
|
|
so others know the rules for using this crate. You can use any license you wish,
|
|
even a commercial license, but we recommend choosing one of the following, unless you have
|
|
specific requirements.
|
|
|
|
* Permissive: [`Apache-2.0`](https://spdx.org/licenses/Apache-2.0.html#licenseText) or [`MIT`](https://spdx.org/licenses/MIT.html#licenseText)
|
|
* Copyleft: [`GPL-3.0-or-later`](https://spdx.org/licenses/GPL-3.0-or-later.html#licenseText) or [`AGPL-3.0-or-later`](https://spdx.org/licenses/AGPL-3.0-or-later.html#licenseText)
|
|
* Commercial license: `Commercial` (not sure if this works, I cannot find examples)
|
|
|
|
It is also helpful to download the LICENSE text (linked to above) and store this
|
|
in a LICENSE file in your repo. Now, you have properly configured your crate for use
|
|
in a larger ecosystem.
|
|
|
|
### Updating schema
|
|
|
|
To allow easy use of the contract, we can publish the schema (`schema/*.json`) together
|
|
with the source code.
|
|
|
|
```sh
|
|
cargo schema
|
|
```
|
|
|
|
Ensure you check in all the schema files, and make a git commit with the final state.
|
|
This commit will be published and should be tagged. Generally, you will want to
|
|
tag with the version (eg. `v0.1.0`), but in the `cosmwasm-examples` repo, we have
|
|
multiple contracts and label it like `escrow-0.1.0`. Don't forget a
|
|
`git push && git push --tags`
|
|
|
|
### Note on build results
|
|
|
|
Build results like Wasm bytecode or expected hash don't need to be updated since
|
|
the don't belong to the source publication. However, they are excluded from packaging
|
|
in `Cargo.toml` which allows you to commit them to your git repository if you like.
|
|
|
|
```toml
|
|
exclude = ["artifacts"]
|
|
```
|
|
|
|
A single source code can be built with multiple different optimizers, so
|
|
we should not make any strict assumptions on the tooling that will be used.
|
|
|
|
## Publishing
|
|
|
|
Now that your package is properly configured and all artifacts are committed, it
|
|
is time to share it with the world.
|
|
Please refer to the [complete instructions for any questions](https://rurust.github.io/cargo-docs-ru/crates-io.html),
|
|
but I will try to give a quick overview of the happy path here.
|
|
|
|
### Registry
|
|
|
|
You will need an account on [crates.io](https://crates.io) to publish a rust crate.
|
|
If you don't have one already, just click on "Log in with GitHub" in the top-right
|
|
to quickly set up a free account. Once inside, click on your username (top-right),
|
|
then "Account Settings". On the bottom, there is a section called "API Access".
|
|
If you don't have this set up already, create a new token and use `cargo login`
|
|
to set it up. This will now authenticate you with the `cargo` cli tool and allow
|
|
you to publish.
|
|
|
|
### Uploading
|
|
|
|
Once this is set up, make sure you commit the current state you want to publish.
|
|
Then try `cargo publish --dry-run`. If that works well, review the files that
|
|
will be published via `cargo package --list`. If you are satisfied, you can now
|
|
officially publish it via `cargo publish`.
|
|
|
|
Congratulations, your package is public to the world.
|
|
|
|
### Sharing
|
|
|
|
Once you have published your package, people can now find it by
|
|
[searching for "cw-" on crates.io](https://crates.io/search?q=cw).
|
|
But that isn't exactly the simplest way. To make things easier and help
|
|
keep the ecosystem together, we suggest making a PR to add your package
|
|
to the [`cawesome-wasm`](https://github.com/cosmwasm/cawesome-wasm) list.
|
|
|
|
### Organizations
|
|
|
|
Many times you are writing a contract not as a solo developer, but rather as
|
|
part of an organization. You will want to allow colleagues to upload new
|
|
versions of the contract to crates.io when you are on holiday.
|
|
[These instructions show how]() you can set up your crate to allow multiple maintainers.
|
|
|
|
You can add another owner to the crate by specifying their github user. Note, you will
|
|
now both have complete control of the crate, and they can remove you:
|
|
|
|
`cargo owner --add ethanfrey`
|
|
|
|
You can also add an existing github team inside your organization:
|
|
|
|
`cargo owner --add github:confio:developers`
|
|
|
|
The team will allow anyone who is currently in the team to publish new versions of the crate.
|
|
And this is automatically updated when you make changes on github. However, it will not allow
|
|
anyone in the team to add or remove other owners.
|