Floating point types

Now you are ready to create smart contracts on your own. It is time to discuss an important limitation of CosmWasm smart contracts - floating-point numbers.

The story is short: you cannot use floating-point types in smart contracts. Never. CosmWasm virtual machine on purpose does not implement floating-point Wasm instructions, even such basics as F32Load. The reasoning is simple: they are not safe to work with in the blockchain world.

The biggest problem is that contract will compile, but uploading it to the blockchain would fail with an error message claiming there is a floating-point operation in the contract. A tool that verifies if the contract is valid (it does not contain any fp operations but also has all needed entry points and so on) is called check_contract. It is implemented as an example on cosmwasm vm, but I encourage you to build it and put the binary available from your PATH so you can use it easily.

This limitation has two implications. First, you always have to use decimal of fixed-point arithmetic in your contracts. It is not a problem, considering that cosmwasm-std provides you with the Decimal and Decimal256 types.

The other implication is tricky - you must be careful with the crates you use. In particular, one gotcha in the serde crate - deserialization of usize type is using floating-point operations. That means you can never use usize (or isize) types in your deserialized messages in the contract.

Another thing that will not work with serde is untagged enums deserialization. The workaround is to create custom deserialization of such enums using serde-cw-value crate. It is a fork of serde-value crate which avoids generating floating-point instructions.