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 cosmwasm-check
.
This limitation has two implications. First, you always have to use decimals 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.