false
false
0
Blockchain
Blocks
Blocks
Uncles
Forked Blocks (Reorgs)
Transactions
Validated
Pending
Verified contracts
Withdrawals
Tokens
All
FTN
APIs
GraphQL
RPC
Eth RPC
Bahamut
Testnets
Ocean
Search
Search
Connection Lost
New Solidity Smart Contract Verification
Contract Address
The 0x address supplied on contract creation.
Is Yul contract
No
Yes
Select Yes if you want to verify Yul contract.
Contract Name
Must match the name specified in the code. For example, in
contract MyContract {..}
MyContract
is the contract name.
Include nightly builds
No
Yes
Select yes if you want to show nightly builds.
Compiler
v0.8.29-nightly.2024.12.20+commit.13943d9c
v0.8.29-nightly.2024.12.19+commit.55c65789
v0.8.29-nightly.2024.12.18+commit.2fe4769f
v0.8.29-nightly.2024.12.17+commit.6c28421e
v0.8.29-nightly.2024.12.16+commit.10fbfca1
v0.8.29-nightly.2024.12.13+commit.03e27398
v0.8.29-nightly.2024.12.12+commit.9ad66603
v0.8.29-nightly.2024.12.10+commit.ea52aca0
v0.8.29-nightly.2024.12.9+commit.a62a4550
v0.8.29-nightly.2024.12.6+commit.953a4ca3
v0.8.29-nightly.2024.12.5+commit.32ae8216
v0.8.29-nightly.2024.12.4+commit.8da621c4
v0.8.29-nightly.2024.12.3+commit.df91531c
v0.8.29-nightly.2024.12.2+commit.6b000bde
v0.8.29-nightly.2024.11.29+commit.b4ecc58b
v0.8.29-nightly.2024.11.28+commit.1cce9744
v0.8.29-nightly.2024.11.27+commit.8ea8efd9
v0.8.29-nightly.2024.11.25+commit.6fc4c033
v0.8.29-nightly.2024.11.22+commit.46e1f81b
v0.8.29-nightly.2024.11.21+commit.72795fbf
v0.8.29-nightly.2024.11.20+commit.4e954a31
v0.8.29-nightly.2024.11.11+commit.b0d991bd
v0.8.29-nightly.2024.11.8+commit.323ad934
v0.8.29-nightly.2024.10.31+commit.fca0bd31
v0.8.29-nightly.2024.10.30+commit.654ce6b3
v0.8.29-nightly.2024.10.29+commit.2486a8c4
v0.8.29-nightly.2024.10.25+commit.879d8e69
v0.8.29-nightly.2024.10.24+commit.a83ea408
v0.8.29-nightly.2024.10.23+commit.66a1edb0
v0.8.29-nightly.2024.10.22+commit.b16d8119
v0.8.29-nightly.2024.10.21+commit.abc46f30
v0.8.29-nightly.2024.10.17+commit.cb576b1a
v0.8.29-nightly.2024.10.16+commit.39943862
v0.8.29-nightly.2024.10.15+commit.7264b475
v0.8.29-nightly.2024.10.14+commit.1c0695f6
v0.8.29-nightly.2024.10.13+commit.56902580
v0.8.29-nightly.2024.10.12+commit.589f8b1e
v0.8.29-nightly.2024.10.11+commit.73b7dcd6
v0.8.29-nightly.2024.10.9+commit.d6fa8491
v0.8.28+commit.7893614a
v0.8.28-nightly.2024.10.7+commit.0e02c469
v0.8.28-nightly.2024.10.2+commit.256e9528
v0.8.28-nightly.2024.10.1+commit.4ab3e361
v0.8.28-nightly.2024.9.30+commit.a8a679d1
v0.8.28-nightly.2024.9.27+commit.4ba39cbe
v0.8.28-nightly.2024.9.26+commit.f369cdd0
v0.8.28-nightly.2024.9.25+commit.3ee5f2df
v0.8.28-nightly.2024.9.24+commit.bd733546
v0.8.28-nightly.2024.9.23+commit.60cea4d7
v0.8.28-nightly.2024.9.20+commit.33b67f0a
v0.8.28-nightly.2024.9.19+commit.7d331510
v0.8.28-nightly.2024.9.18+commit.ba4d7684
v0.8.28-nightly.2024.9.17+commit.154fc1df
v0.8.28-nightly.2024.9.16+commit.322d6561
v0.8.28-nightly.2024.9.11+commit.4049f51e
v0.8.28-nightly.2024.9.10+commit.6ef580cd
v0.8.28-nightly.2024.9.9+commit.62909dec
v0.8.28-nightly.2024.9.4+commit.09e9aa65
v0.8.27+commit.40a35a09
v0.8.27-nightly.2024.9.2+commit.d6f95196
v0.8.27-nightly.2024.8.30+commit.40e005be
v0.8.27-nightly.2024.8.29+commit.ae1c3d48
v0.8.27-nightly.2024.8.28+commit.9e8369fa
v0.8.27-nightly.2024.8.27+commit.a9b9c7da
v0.8.27-nightly.2024.8.26+commit.431911d7
v0.8.27-nightly.2024.8.15+commit.60b2b033
v0.8.27-nightly.2024.8.14+commit.add191dc
v0.8.27-nightly.2024.8.12+commit.6d3340af
v0.8.27-nightly.2024.8.9+commit.55a5fd9b
v0.8.27-nightly.2024.8.8+commit.f99c2392
v0.8.27-nightly.2024.8.6+commit.c92b32f6
v0.8.27-nightly.2024.8.5+commit.5dbaa13b
v0.8.27-nightly.2024.8.2+commit.7094e307
v0.8.27-nightly.2024.8.1+commit.1bb78727
v0.8.27-nightly.2024.7.31+commit.72451086
v0.8.27-nightly.2024.7.30+commit.e73ab6a6
v0.8.27-nightly.2024.7.25+commit.065c2c3d
v0.8.27-nightly.2024.7.24+commit.b4c395b8
v0.8.27-nightly.2024.7.23+commit.35231a1b
v0.8.27-nightly.2024.7.20+commit.17c36142
v0.8.27-nightly.2024.7.19+commit.81a05f37
v0.8.27-nightly.2024.7.18+commit.8e74c486
v0.8.27-nightly.2024.7.17+commit.91b1254c
v0.8.27-nightly.2024.7.16+commit.9d90b391
v0.8.27-nightly.2024.7.15+commit.e0ab0f28
v0.8.27-nightly.2024.7.12+commit.64facd49
v0.8.27-nightly.2024.7.10+commit.e9d42394
v0.8.27-nightly.2024.7.9+commit.5e9d38e9
v0.8.27-nightly.2024.7.2+commit.d42f92bd
v0.8.27-nightly.2024.7.1+commit.8c6fed72
v0.8.27-nightly.2024.6.28+commit.f3f77208
v0.8.27-nightly.2024.6.26+commit.31d87b02
v0.8.27-nightly.2024.6.25+commit.c967d468
v0.8.27-nightly.2024.6.21+commit.ce4be6e1
v0.8.27-nightly.2024.6.20+commit.7711a8ec
v0.8.27-nightly.2024.6.17+commit.d0190e1d
v0.8.27-nightly.2024.6.14+commit.acfc3dae
v0.8.27-nightly.2024.6.13+commit.e5d60a2b
v0.8.27-nightly.2024.6.11+commit.07f25f56
v0.8.27-nightly.2024.6.6+commit.0f982266
v0.8.27-nightly.2024.6.5+commit.dd4f189a
v0.8.27-nightly.2024.6.4+commit.5da0f474
v0.8.27-nightly.2024.6.3+commit.cb1d21a9
v0.8.27-nightly.2024.5.30+commit.b849b327
v0.8.27-nightly.2024.5.29+commit.12b404f8
v0.8.27-nightly.2024.5.28+commit.15b99ca8
v0.8.27-nightly.2024.5.27+commit.318e036b
v0.8.27-nightly.2024.5.24+commit.a5b74ca6
v0.8.27-nightly.2024.5.23+commit.3251a03b
v0.8.27-nightly.2024.5.22+commit.f162db00
v0.8.26+commit.8a97fa7a
v0.8.26-nightly.2024.5.17+commit.028cf330
v0.8.26-nightly.2024.5.16+commit.de002446
v0.8.26-nightly.2024.5.15+commit.f9c8ab03
v0.8.26-nightly.2024.5.14+commit.59cc93e5
v0.8.26-nightly.2024.5.13+commit.ff81bac4
v0.8.26-nightly.2024.5.10+commit.e202d30d
v0.8.26-nightly.2024.5.8+commit.cfff77cf
v0.8.26-nightly.2024.5.7+commit.5091b5bb
v0.8.26-nightly.2024.5.2+commit.ae79d13a
v0.8.26-nightly.2024.4.30+commit.5afa25ea
v0.8.26-nightly.2024.4.29+commit.d74b8af7
v0.8.26-nightly.2024.4.26+commit.2c3fc909
v0.8.26-nightly.2024.4.25+commit.24e3c308
v0.8.26-nightly.2024.4.23+commit.ebdce269
v0.8.26-nightly.2024.4.22+commit.272892e9
v0.8.26-nightly.2024.4.19+commit.2e8cd3f5
v0.8.26-nightly.2024.4.18+commit.00b2e54e
v0.8.26-nightly.2024.4.17+commit.39af4492
v0.8.26-nightly.2024.4.16+commit.30d78788
v0.8.26-nightly.2024.4.15+commit.7f0a083a
v0.8.26-nightly.2024.4.12+commit.6c7e686d
v0.8.26-nightly.2024.4.8+commit.2bc657ac
v0.8.26-nightly.2024.4.4+commit.3d7b3d94
v0.8.26-nightly.2024.4.3+commit.6040a521
v0.8.26-nightly.2024.4.2+commit.28e91a49
v0.8.26-nightly.2024.3.26+commit.06fc835c
v0.8.26-nightly.2024.3.15+commit.afda6984
v0.8.25+commit.b61c2a91
v0.8.25-nightly.2024.1.30+commit.4577aebf
v0.8.25-nightly.2024.1.26+commit.4edbaf1e
v0.8.24+commit.e11b9ed9
v0.8.24-nightly.2024.1.22+commit.01cb85fd
v0.8.24-nightly.2024.1.20+commit.43c39103
v0.8.24-nightly.2024.1.18+commit.ec563a12
v0.8.24-nightly.2024.1.17+commit.9c9eddb5
v0.8.24-nightly.2024.1.15+commit.5aace4f3
v0.8.24-nightly.2024.1.12+commit.1473ce21
v0.8.24-nightly.2024.1.10+commit.fbbac9c1
v0.8.24-nightly.2024.1.9+commit.814225e6
v0.8.24-nightly.2024.1.6+commit.c78f9652
v0.8.24-nightly.2024.1.5+commit.2348552a
v0.8.24-nightly.2023.12.18+commit.92f383d8
v0.8.24-nightly.2023.12.13+commit.1b5c6f66
v0.8.24-nightly.2023.12.12+commit.cdf2f5ec
v0.8.24-nightly.2023.12.5+commit.557d567a
v0.8.24-nightly.2023.12.4+commit.7e90ad00
v0.8.24-nightly.2023.12.1+commit.c3af02c2
v0.8.24-nightly.2023.11.30+commit.3d7d8aad
v0.8.24-nightly.2023.11.29+commit.e658eebc
v0.8.24-nightly.2023.11.28+commit.4b293808
v0.8.24-nightly.2023.11.27+commit.7b269d16
v0.8.24-nightly.2023.11.23+commit.efed3b23
v0.8.24-nightly.2023.11.10+commit.58811f13
v0.8.24-nightly.2023.11.8+commit.90b046aa
v0.8.23+commit.f704f362
v0.8.23-nightly.2023.11.7+commit.cb93e6e9
v0.8.23-nightly.2023.11.6+commit.f70bd949
v0.8.23-nightly.2023.10.31+commit.7df949ed
v0.8.23-nightly.2023.10.30+commit.ad3caa7f
v0.8.23-nightly.2023.10.26+commit.d8de97d0
v0.8.23-nightly.2023.10.25+commit.28ee5d3f
v0.8.22+commit.4fc1097e
v0.8.22-nightly.2023.10.24+commit.c7e52122
v0.8.22-nightly.2023.10.23+commit.1b5775ac
v0.8.22-nightly.2023.10.22+commit.b187d065
v0.8.22-nightly.2023.10.19+commit.ddb0d895
v0.8.22-nightly.2023.10.17+commit.766efb3a
v0.8.22-nightly.2023.10.16+commit.e98f174d
v0.8.22-nightly.2023.10.13+commit.3dab116e
v0.8.22-nightly.2023.10.10+commit.88208707
v0.8.22-nightly.2023.10.9+commit.b12d8fa1
v0.8.22-nightly.2023.10.4+commit.b54e7207
v0.8.22-nightly.2023.10.2+commit.72671d6c
v0.8.22-nightly.2023.9.29+commit.fe1f9c64
v0.8.22-nightly.2023.9.19+commit.cc7a14a6
v0.8.22-nightly.2023.9.18+commit.dc44f8ad
v0.8.22-nightly.2023.9.14+commit.020b5968
v0.8.22-nightly.2023.9.13+commit.9bce5f91
v0.8.22-nightly.2023.9.11+commit.64a0f627
v0.8.22-nightly.2023.9.5+commit.16ae76ca
v0.8.22-nightly.2023.9.4+commit.e4396859
v0.8.22-nightly.2023.8.29+commit.df03f141
v0.8.22-nightly.2023.8.28+commit.26912e0e
v0.8.22-nightly.2023.8.23+commit.37e18612
v0.8.22-nightly.2023.8.22+commit.60b18a13
v0.8.22-nightly.2023.8.21+commit.c96db510
v0.8.22-nightly.2023.8.18+commit.d2f86ffb
v0.8.22-nightly.2023.8.17+commit.ef5f1318
v0.8.22-nightly.2023.8.16+commit.69e5b634
v0.8.22-nightly.2023.8.15+commit.579259d6
v0.8.22-nightly.2023.8.14+commit.d8cc2c62
v0.8.22-nightly.2023.8.11+commit.c50c9b2c
v0.8.22-nightly.2023.8.9+commit.3edf91ad
v0.8.22-nightly.2023.8.7+commit.e357b8bc
v0.8.22-nightly.2023.8.3+commit.51171257
v0.8.22-nightly.2023.8.2+commit.ead0615c
v0.8.22-nightly.2023.8.1+commit.2c702556
v0.8.22-nightly.2023.7.27+commit.45123298
v0.8.22-nightly.2023.7.26+commit.80d0a979
v0.8.22-nightly.2023.7.25+commit.95beef40
v0.8.22-nightly.2023.7.24+commit.83fe3d40
v0.8.22-nightly.2023.7.21+commit.89407d25
v0.8.22-nightly.2023.7.20+commit.f466e1ef
v0.8.22-nightly.2023.7.19+commit.ceb65876
v0.8.21+commit.d9974bed
v0.8.21-nightly.2023.7.17+commit.4c4410e0
v0.8.21-nightly.2023.7.14+commit.11be2f48
v0.8.21-nightly.2023.7.13+commit.ebc2bc9e
v0.8.21-nightly.2023.7.12+commit.69c034b1
v0.8.21-nightly.2023.7.11+commit.b29d8a42
v0.8.21-nightly.2023.7.10+commit.b583e9e6
v0.8.21-nightly.2023.7.3+commit.5d7533b5
v0.8.21-nightly.2023.6.30+commit.2f451a18
v0.8.21-nightly.2023.6.28+commit.30cd1a0f
v0.8.21-nightly.2023.6.27+commit.3bb492a2
v0.8.21-nightly.2023.6.26+commit.34d2383f
v0.8.21-nightly.2023.6.23+commit.aca4c86a
v0.8.21-nightly.2023.6.21+commit.b26090c2
v0.8.21-nightly.2023.6.20+commit.dc7cda18
v0.8.21-nightly.2023.6.19+commit.3ecf9680
v0.8.21-nightly.2023.6.14+commit.374a6fd5
v0.8.21-nightly.2023.6.12+commit.53c305ea
v0.8.21-nightly.2023.6.7+commit.facc3809
v0.8.21-nightly.2023.6.6+commit.09038ce4
v0.8.21-nightly.2023.6.5+commit.f1d2eda7
v0.8.21-nightly.2023.6.2+commit.dcecf00e
v0.8.21-nightly.2023.5.31+commit.14d2ae2d
v0.8.21-nightly.2023.5.30+commit.3eedc635
v0.8.21-nightly.2023.5.29+commit.4449f07d
v0.8.21-nightly.2023.5.26+commit.38468d03
v0.8.21-nightly.2023.5.25+commit.8c7404f6
v0.8.21-nightly.2023.5.24+commit.6db4f182
v0.8.21-nightly.2023.5.22+commit.02a07fdf
v0.8.21-nightly.2023.5.18+commit.9eaa5ceb
v0.8.21-nightly.2023.5.17+commit.574d454b
v0.8.21-nightly.2023.5.16+commit.aa9e2502
v0.8.21-nightly.2023.5.15+commit.1250ee77
v0.8.21-nightly.2023.5.12+commit.3f2cde9b
v0.8.21-nightly.2023.5.11+commit.0a0c3895
v0.8.21-nightly.2023.5.10+commit.f07c8b1f
v0.8.20+commit.a1b79de6
v0.8.20-nightly.2023.5.9+commit.44a30e47
v0.8.20-nightly.2023.5.8+commit.2da0a861
v0.8.20-nightly.2023.5.6+commit.29751849
v0.8.20-nightly.2023.5.5+commit.102f18b2
v0.8.20-nightly.2023.5.4+commit.0f40bcc0
v0.8.20-nightly.2023.5.3+commit.385c48df
v0.8.20-nightly.2023.5.2+commit.1af6ca77
v0.8.20-nightly.2023.4.28+commit.0cb27949
v0.8.20-nightly.2023.4.27+commit.7c870c95
v0.8.20-nightly.2023.4.26+commit.302d46c1
v0.8.20-nightly.2023.4.25+commit.14c25c38
v0.8.20-nightly.2023.4.24+commit.4a8d6618
v0.8.20-nightly.2023.4.23+commit.cd5ae26e
v0.8.20-nightly.2023.4.21+commit.b75bddbd
v0.8.20-nightly.2023.4.20+commit.a297a687
v0.8.20-nightly.2023.4.18+commit.a77d4e28
v0.8.20-nightly.2023.4.17+commit.02e936ad
v0.8.20-nightly.2023.4.14+commit.e1a9446f
v0.8.20-nightly.2023.4.13+commit.5d42bb5e
v0.8.20-nightly.2023.4.12+commit.f0c0df2d
v0.8.20-nightly.2023.4.11+commit.8b4c1d33
v0.8.20-nightly.2023.4.6+commit.e29a68d3
v0.8.20-nightly.2023.4.5+commit.9e0a0af7
v0.8.20-nightly.2023.4.4+commit.7b634152
v0.8.20-nightly.2023.4.3+commit.0037693c
v0.8.19+commit.7dd6d404
v0.8.19-nightly.2023.2.16+commit.23eb9c59
v0.8.19-nightly.2023.2.15+commit.e147654f
v0.8.19-nightly.2023.2.14+commit.1b0f7af7
v0.8.19-nightly.2023.2.13+commit.7cd589ee
v0.8.19-nightly.2023.2.11+commit.e50d5651
v0.8.19-nightly.2023.2.9+commit.59f9ab4d
v0.8.19-nightly.2023.2.8+commit.d33f2734
v0.8.19-nightly.2023.2.7+commit.665bf29a
v0.8.19-nightly.2023.2.6+commit.88e44ed5
v0.8.19-nightly.2023.2.5+commit.f2bf23a0
v0.8.19-nightly.2023.2.3+commit.77640a57
v0.8.19-nightly.2023.2.1+commit.ddbef8f6
v0.8.18+commit.87f61d96
v0.8.18-nightly.2022.11.23+commit.eb2f874e
v0.8.18-nightly.2022.11.22+commit.1dd05e29
v0.8.18-nightly.2022.11.21+commit.5211d3da
v0.8.18-nightly.2022.11.17+commit.0b4b1045
v0.8.18-nightly.2022.11.16+commit.75a74cd4
v0.8.18-nightly.2022.11.14+commit.4100a59c
v0.8.18-nightly.2022.11.10+commit.310a58dd
v0.8.18-nightly.2022.11.9+commit.73e7b844
v0.8.18-nightly.2022.11.8+commit.9db2da03
v0.8.18-nightly.2022.11.7+commit.ce18dddd
v0.8.18-nightly.2022.11.3+commit.2cc6610e
v0.8.18-nightly.2022.11.2+commit.46a7ebd5
v0.8.18-nightly.2022.11.1+commit.7ac4c70c
v0.8.18-nightly.2022.10.28+commit.ff14e408
v0.8.18-nightly.2022.10.27+commit.0816b15e
v0.8.18-nightly.2022.10.26+commit.12f5612c
v0.8.18-nightly.2022.10.25+commit.799ef0ab
v0.8.18-nightly.2022.10.24+commit.84cdcec2
v0.8.17+commit.8df45f5f
v0.8.17-nightly.2022.8.24+commit.22a0c46e
v0.8.17-nightly.2022.8.22+commit.a3de6cd6
v0.8.17-nightly.2022.8.19+commit.f01a09f8
v0.8.17-nightly.2022.8.18+commit.3497e2b2
v0.8.17-nightly.2022.8.16+commit.bb41ddd7
v0.8.17-nightly.2022.8.15+commit.a0ee14f7
v0.8.17-nightly.2022.8.13+commit.a78a2bcf
v0.8.17-nightly.2022.8.12+commit.e27cb025
v0.8.17-nightly.2022.8.10+commit.3c0a7355
v0.8.17-nightly.2022.8.9+commit.6b60524c
v0.8.17-nightly.2022.8.8+commit.6a42da8d
v0.8.16+commit.07a7930e
v0.8.16-nightly.2022.8.5+commit.49a2db99
v0.8.16-nightly.2022.8.4+commit.19ad8b11
v0.8.16-nightly.2022.8.3+commit.82e5a110
v0.8.16-nightly.2022.7.28+commit.d5a78b18
v0.8.16-nightly.2022.7.27+commit.72f19072
v0.8.16-nightly.2022.7.26+commit.ce5da7db
v0.8.16-nightly.2022.7.25+commit.9f34322f
v0.8.16-nightly.2022.7.14+commit.800088e3
v0.8.16-nightly.2022.7.13+commit.454603e1
v0.8.16-nightly.2022.7.12+commit.d003400c
v0.8.16-nightly.2022.7.11+commit.e7c5f044
v0.8.16-nightly.2022.7.8+commit.8d6b20f7
v0.8.16-nightly.2022.7.6+commit.b6f11b33
v0.8.16-nightly.2022.7.5+commit.c8aed8c1
v0.8.16-nightly.2022.7.4+commit.a53f15f4
v0.8.16-nightly.2022.7.1+commit.5de51204
v0.8.16-nightly.2022.6.30+commit.48669b4b
v0.8.16-nightly.2022.6.29+commit.05496064
v0.8.16-nightly.2022.6.27+commit.b70e064e
v0.8.16-nightly.2022.6.23+commit.3ed9a38a
v0.8.16-nightly.2022.6.22+commit.a2a88afd
v0.8.16-nightly.2022.6.21+commit.75300c32
v0.8.16-nightly.2022.6.20+commit.c3ea8661
v0.8.16-nightly.2022.6.17+commit.be470c16
v0.8.16-nightly.2022.6.16+commit.b80f4baa
v0.8.16-nightly.2022.6.15+commit.f904bb06
v0.8.15+commit.e14f2714
v0.8.15-nightly.2022.6.14+commit.dccc06cc
v0.8.15-nightly.2022.6.13+commit.82e5339d
v0.8.15-nightly.2022.6.10+commit.efcbc79b
v0.8.15-nightly.2022.6.9+commit.80f6a13d
v0.8.15-nightly.2022.6.8+commit.9b220a20
v0.8.15-nightly.2022.6.7+commit.8c87f58f
v0.8.15-nightly.2022.6.6+commit.3948391c
v0.8.15-nightly.2022.6.2+commit.035f6abb
v0.8.15-nightly.2022.6.1+commit.3f84837e
v0.8.15-nightly.2022.5.31+commit.baf56aff
v0.8.15-nightly.2022.5.27+commit.095cc647
v0.8.15-nightly.2022.5.25+commit.fdc3c8ee
v0.8.15-nightly.2022.5.23+commit.21591531
v0.8.15-nightly.2022.5.20+commit.02567fd3
v0.8.15-nightly.2022.5.19+commit.0cb95902
v0.8.15-nightly.2022.5.18+commit.de7daaa2
v0.8.14+commit.80d49f37
v0.8.14-nightly.2022.5.17+commit.80d49f37
v0.8.14-nightly.2022.5.13+commit.a3bd01d9
v0.8.14-nightly.2022.5.12+commit.aafda389
v0.8.14-nightly.2022.5.11+commit.0c0ff4fc
v0.8.14-nightly.2022.5.10+commit.9f6d3dea
v0.8.14-nightly.2022.5.9+commit.463e4175
v0.8.14-nightly.2022.5.5+commit.1dba6aaf
v0.8.14-nightly.2022.5.4+commit.84c64edf
v0.8.14-nightly.2022.5.2+commit.3e3e73e3
v0.8.14-nightly.2022.4.28+commit.d55b84ff
v0.8.14-nightly.2022.4.25+commit.fbecdbe7
v0.8.14-nightly.2022.4.14+commit.55917405
v0.8.14-nightly.2022.4.13+commit.25923c1f
v0.8.14-nightly.2022.4.11+commit.9e92c7a4
v0.8.14-nightly.2022.4.10+commit.0b811943
v0.8.14-nightly.2022.4.8+commit.d9c6ceca
v0.8.14-nightly.2022.4.7+commit.15c2a33e
v0.8.14-nightly.2022.4.6+commit.31b54857
v0.8.14-nightly.2022.4.5+commit.34dd30d7
v0.8.14-nightly.2022.4.4+commit.fd763fa6
v0.8.14-nightly.2022.3.24+commit.c4909e99
v0.8.14-nightly.2022.3.23+commit.b35cda59
v0.8.14-nightly.2022.3.21+commit.43f29c00
v0.8.14-nightly.2022.3.17+commit.430ecb6e
v0.8.14-nightly.2022.3.16+commit.10b581b8
v0.8.13+commit.abaa5c0e
v0.8.13-nightly.2022.3.15+commit.724af73f
v0.8.13-nightly.2022.3.14+commit.353759c1
v0.8.13-nightly.2022.3.11+commit.26963775
v0.8.13-nightly.2022.3.10+commit.4263b893
v0.8.13-nightly.2022.3.9+commit.bebdccca
v0.8.13-nightly.2022.3.7+commit.145186f6
v0.8.13-nightly.2022.3.4+commit.198b7053
v0.8.13-nightly.2022.3.3+commit.999a53c9
v0.8.13-nightly.2022.3.2+commit.ebefb5d9
v0.8.13-nightly.2022.3.1+commit.2bcb0275
v0.8.13-nightly.2022.2.28+commit.466251b5
v0.8.13-nightly.2022.2.24+commit.1aacb67a
v0.8.13-nightly.2022.2.23+commit.e7d93f83
v0.8.13-nightly.2022.2.22+commit.47d77931
v0.8.13-nightly.2022.2.21+commit.5db29076
v0.8.13-nightly.2022.2.17+commit.daad9a42
v0.8.13-nightly.2022.2.16+commit.da50176b
v0.8.12+commit.f00d7308
v0.8.12-nightly.2022.2.15+commit.16983848
v0.8.12-nightly.2022.2.14+commit.b3ccc013
v0.8.12-nightly.2022.2.10+commit.1210c3e6
v0.8.12-nightly.2022.2.9+commit.5539a745
v0.8.12-nightly.2022.2.8+commit.5c3bcb6c
v0.8.12-nightly.2022.2.7+commit.0e93456e
v0.8.12-nightly.2022.2.4+commit.32d64ce6
v0.8.12-nightly.2022.2.3+commit.2b141c23
v0.8.12-nightly.2022.2.1+commit.a05d2b35
v0.8.12-nightly.2022.1.31+commit.d839624f
v0.8.12-nightly.2022.1.29+commit.ef8911a6
v0.8.12-nightly.2022.1.27+commit.7a40785b
v0.8.12-nightly.2022.1.26+commit.597426bd
v0.8.12-nightly.2022.1.25+commit.2725788c
v0.8.12-nightly.2022.1.21+commit.3f401ebd
v0.8.12-nightly.2022.1.20+commit.40d3223b
v0.8.12-nightly.2022.1.19+commit.0b9ab33f
v0.8.12-nightly.2022.1.18+commit.a07b3ec7
v0.8.12-nightly.2022.1.17+commit.79e9d619
v0.8.12-nightly.2022.1.14+commit.756ae673
v0.8.12-nightly.2022.1.13+commit.7c1daa50
v0.8.12-nightly.2022.1.12+commit.bc4436c5
v0.8.12-nightly.2022.1.11+commit.a7119699
v0.8.12-nightly.2022.1.10+commit.10c954fd
v0.8.12-nightly.2022.1.6+commit.c3b4292d
v0.8.12-nightly.2022.1.5+commit.b6a203a9
v0.8.12-nightly.2022.1.4+commit.b892851d
v0.8.12-nightly.2022.1.3+commit.c28f85f1
v0.8.12-nightly.2021.12.30+commit.6849774b
v0.8.12-nightly.2021.12.29+commit.692614df
v0.8.12-nightly.2021.12.22+commit.b28cd00a
v0.8.12-nightly.2021.12.21+commit.15826826
v0.8.12-nightly.2021.12.20+commit.b65e0933
v0.8.11+commit.d7f03943
v0.8.11-nightly.2021.12.16+commit.10289fbc
v0.8.11-nightly.2021.12.15+commit.1822261d
v0.8.11-nightly.2021.12.3+commit.c76a6bdb
v0.8.11-nightly.2021.12.1+commit.dcef56a5
v0.8.11-nightly.2021.11.30+commit.c04fca7c
v0.8.11-nightly.2021.11.29+commit.cb610b50
v0.8.11-nightly.2021.11.25+commit.e0c85c6f
v0.8.11-nightly.2021.11.23+commit.71f8576b
v0.8.11-nightly.2021.11.22+commit.9b6a687a
v0.8.11-nightly.2021.11.18+commit.2aeeef83
v0.8.11-nightly.2021.11.16+commit.e5579526
v0.8.11-nightly.2021.11.11+commit.73344204
v0.8.11-nightly.2021.11.10+commit.9240368e
v0.8.11-nightly.2021.11.9+commit.19159b96
v0.8.10+commit.fc410830
v0.8.10-nightly.2021.11.8+commit.f095442d
v0.8.10-nightly.2021.11.5+commit.2f720f22
v0.8.10-nightly.2021.11.4+commit.dd0ff194
v0.8.10-nightly.2021.11.3+commit.4a49e6e4
v0.8.10-nightly.2021.11.2+commit.a7b13782
v0.8.10-nightly.2021.11.1+commit.5eb97fa6
v0.8.10-nightly.2021.10.29+commit.408bd5fa
v0.8.10-nightly.2021.10.28+commit.558d9d45
v0.8.10-nightly.2021.10.27+commit.cede3693
v0.8.10-nightly.2021.10.26+commit.453f404f
v0.8.10-nightly.2021.10.25+commit.e6e30f82
v0.8.10-nightly.2021.10.22+commit.3774955d
v0.8.10-nightly.2021.10.20+commit.ef21e43f
v0.8.10-nightly.2021.10.19+commit.863a0d3b
v0.8.10-nightly.2021.10.18+commit.6bca1549
v0.8.10-nightly.2021.10.16+commit.fdf3b96e
v0.8.10-nightly.2021.10.15+commit.7f0771f8
v0.8.10-nightly.2021.10.14+commit.1e630fc5
v0.8.10-nightly.2021.10.13+commit.1deda33e
v0.8.10-nightly.2021.10.12+commit.a79120fe
v0.8.10-nightly.2021.10.11+commit.b0a5b92f
v0.8.10-nightly.2021.10.7+commit.b343e132
v0.8.10-nightly.2021.10.6+commit.0549c42c
v0.8.10-nightly.2021.10.5+commit.9c6ca4f4
v0.8.10-nightly.2021.10.4+commit.9d6eaa7a
v0.8.10-nightly.2021.10.1+commit.d10e668f
v0.8.10-nightly.2021.9.30+commit.0e7e936f
v0.8.10-nightly.2021.9.29+commit.7a9f4815
v0.8.9+commit.e5eed63a
v0.8.8+commit.dddeac2f
v0.8.8-nightly.2021.9.28+commit.89d959d7
v0.8.8-nightly.2021.9.27+commit.c3ef27f3
v0.8.8-nightly.2021.9.24+commit.3c8846e6
v0.8.8-nightly.2021.9.23+commit.55467c1c
v0.8.8-nightly.2021.9.22+commit.72fc3449
v0.8.8-nightly.2021.9.21+commit.fc954367
v0.8.8-nightly.2021.9.20+commit.2c3322cb
v0.8.8-nightly.2021.9.17+commit.d7ddfcc6
v0.8.8-nightly.2021.9.16+commit.7877758c
v0.8.8-nightly.2021.9.15+commit.c1070fab
v0.8.8-nightly.2021.9.14+commit.0fa24c78
v0.8.8-nightly.2021.9.13+commit.49cde9d4
v0.8.8-nightly.2021.9.9+commit.dea1b9ec
v0.8.8-nightly.2021.9.8+commit.dae6b53c
v0.8.8-nightly.2021.9.7+commit.6feed460
v0.8.8-nightly.2021.9.6+commit.11a85059
v0.8.8-nightly.2021.9.3+commit.8447b32d
v0.8.8-nightly.2021.9.2+commit.7f137d35
v0.8.8-nightly.2021.9.1+commit.70fe0c65
v0.8.8-nightly.2021.8.31+commit.1e334a89
v0.8.8-nightly.2021.8.30+commit.78afd71a
v0.8.8-nightly.2021.8.27+commit.a3d8da25
v0.8.8-nightly.2021.8.26+commit.7df33f0d
v0.8.8-nightly.2021.8.25+commit.208cf6a3
v0.8.8-nightly.2021.8.24+commit.7a0295ec
v0.8.8-nightly.2021.8.23+commit.a39eb7ae
v0.8.8-nightly.2021.8.20+commit.6b7857d5
v0.8.8-nightly.2021.8.19+commit.26207968
v0.8.8-nightly.2021.8.18+commit.cef0f1b9
v0.8.8-nightly.2021.8.17+commit.729db521
v0.8.8-nightly.2021.8.16+commit.97b4ff15
v0.8.8-nightly.2021.8.12+commit.4fdf7db0
v0.8.8-nightly.2021.8.11+commit.cc4e24c2
v0.8.7+commit.e28d00a7
v0.8.7-nightly.2021.8.10+commit.13b26949
v0.8.7-nightly.2021.8.9+commit.74c804d8
v0.8.7-nightly.2021.8.6+commit.ce0e0c48
v0.8.7-nightly.2021.8.5+commit.a532df20
v0.8.7-nightly.2021.8.4+commit.2d5b9036
v0.8.7-nightly.2021.8.3+commit.ae519c12
v0.8.7-nightly.2021.8.2+commit.e9cab0ff
v0.8.7-nightly.2021.7.29+commit.5ff0811b
v0.8.7-nightly.2021.7.28+commit.1794e1c8
v0.8.7-nightly.2021.7.27+commit.c018cdf4
v0.8.7-nightly.2021.7.26+commit.f97fe813
v0.8.7-nightly.2021.7.25+commit.a2ce4616
v0.8.7-nightly.2021.7.21+commit.6d6c9e6e
v0.8.7-nightly.2021.7.20+commit.d655a3c9
v0.8.7-nightly.2021.7.15+commit.3d26d47d
v0.8.7-nightly.2021.7.14+commit.90f77f8c
v0.8.7-nightly.2021.7.13+commit.57d32ca2
v0.8.7-nightly.2021.7.12+commit.ef6ad57c
v0.8.7-nightly.2021.7.8+commit.c3fa520c
v0.8.7-nightly.2021.7.7+commit.46514ffa
v0.8.7-nightly.2021.7.6+commit.69233c37
v0.8.7-nightly.2021.7.5+commit.19b217dc
v0.8.7-nightly.2021.7.2+commit.f6cb933f
v0.8.7-nightly.2021.7.1+commit.98e1dee4
v0.8.7-nightly.2021.6.30+commit.8a6a330d
v0.8.7-nightly.2021.6.29+commit.eaac16c7
v0.8.7-nightly.2021.6.28+commit.d91dc995
v0.8.7-nightly.2021.6.23+commit.cbf1c3ae
v0.8.7-nightly.2021.6.22+commit.9cf6021d
v0.8.6+commit.11564f7e
v0.8.6-nightly.2021.6.21+commit.a96114b3
v0.8.6-nightly.2021.6.17+commit.11281586
v0.8.6-nightly.2021.6.16+commit.61468301
v0.8.6-nightly.2021.6.15+commit.e7bf1cc7
v0.8.6-nightly.2021.6.14+commit.b2ffa910
v0.8.5+commit.a4f2e591
v0.8.5-nightly.2021.6.10+commit.a4f2e591
v0.8.5-nightly.2021.6.9+commit.98e7b61a
v0.8.5-nightly.2021.6.8+commit.e77e9e44
v0.8.5-nightly.2021.6.7+commit.7d8a4e63
v0.8.5-nightly.2021.6.4+commit.1f8f1a3d
v0.8.5-nightly.2021.6.3+commit.1638b210
v0.8.5-nightly.2021.6.1+commit.4cbf9ff7
v0.8.5-nightly.2021.5.31+commit.7d1df951
v0.8.5-nightly.2021.5.27+commit.2f0df8f0
v0.8.5-nightly.2021.5.26+commit.a3634934
v0.8.5-nightly.2021.5.25+commit.6640fb8c
v0.8.5-nightly.2021.5.24+commit.c5031799
v0.8.5-nightly.2021.5.21+commit.29c8f282
v0.8.5-nightly.2021.5.20+commit.13388e28
v0.8.5-nightly.2021.5.19+commit.d07c85db
v0.8.5-nightly.2021.5.18+commit.dac24294
v0.8.5-nightly.2021.5.17+commit.21af5408
v0.8.5-nightly.2021.5.14+commit.f58d5873
v0.8.5-nightly.2021.5.13+commit.324caef5
v0.8.5-nightly.2021.5.12+commit.98e2b4e5
v0.8.5-nightly.2021.5.11+commit.eb991775
v0.8.5-nightly.2021.5.10+commit.643140e2
v0.8.5-nightly.2021.5.7+commit.5d070c5b
v0.8.5-nightly.2021.5.6+commit.518629a8
v0.8.5-nightly.2021.5.5+commit.4c7b61d8
v0.8.5-nightly.2021.5.4+commit.1d1175c2
v0.8.5-nightly.2021.5.3+commit.fe4822a1
v0.8.5-nightly.2021.4.29+commit.f1d58c54
v0.8.5-nightly.2021.4.28+commit.850c25bf
v0.8.5-nightly.2021.4.27+commit.c7944637
v0.8.5-nightly.2021.4.26+commit.2e99a56b
v0.8.5-nightly.2021.4.24+commit.eed0bf58
v0.8.5-nightly.2021.4.23+commit.173a5118
v0.8.5-nightly.2021.4.22+commit.f162c484
v0.8.5-nightly.2021.4.21+commit.85274304
v0.8.4+commit.c7e474f2
v0.8.4-nightly.2021.4.20+commit.cf7f814a
v0.8.4-nightly.2021.4.19+commit.159d6f9e
v0.8.4-nightly.2021.4.16+commit.f9b23ca8
v0.8.4-nightly.2021.4.14+commit.69411436
v0.8.4-nightly.2021.4.13+commit.f188f3d9
v0.8.4-nightly.2021.4.12+commit.0289994d
v0.8.4-nightly.2021.4.8+commit.124db22f
v0.8.4-nightly.2021.4.6+commit.a5cae64a
v0.8.4-nightly.2021.4.1+commit.5433a640
v0.8.4-nightly.2021.3.31+commit.b2555eac
v0.8.4-nightly.2021.3.30+commit.851051c6
v0.8.4-nightly.2021.3.29+commit.2346ec1c
v0.8.4-nightly.2021.3.26+commit.c37bf893
v0.8.4-nightly.2021.3.25+commit.d75a132f
v0.8.4-nightly.2021.3.24+commit.6eac77ae
v0.8.3+commit.8d00100c
v0.8.3-nightly.2021.3.22+commit.54cea090
v0.8.3-nightly.2021.3.17+commit.e179d0aa
v0.8.3-nightly.2021.3.16+commit.35da404c
v0.8.3-nightly.2021.3.15+commit.ae1b321a
v0.8.3-nightly.2021.3.12+commit.ccd9de13
v0.8.3-nightly.2021.3.11+commit.0e22d0bd
v0.8.3-nightly.2021.3.10+commit.23f03e1b
v0.8.3-nightly.2021.3.9+commit.ad5d34df
v0.8.3-nightly.2021.3.5+commit.093ea461
v0.8.3-nightly.2021.3.4+commit.08df163a
v0.8.3-nightly.2021.3.3+commit.be564773
v0.8.2+commit.661d1103
v0.8.2-nightly.2021.3.2+commit.661d1103
v0.8.2-nightly.2021.3.1+commit.ad48b713
v0.8.2-nightly.2021.2.25+commit.44493ad4
v0.8.2-nightly.2021.2.24+commit.eacf7c1c
v0.8.2-nightly.2021.2.23+commit.1220d8df
v0.8.2-nightly.2021.2.22+commit.e75e3fc2
v0.8.2-nightly.2021.2.19+commit.6fd5ea01
v0.8.2-nightly.2021.2.18+commit.5c6633f9
v0.8.2-nightly.2021.2.12+commit.b385b41f
v0.8.2-nightly.2021.2.11+commit.003701f6
v0.8.2-nightly.2021.2.10+commit.215233d5
v0.8.2-nightly.2021.2.9+commit.9b20c984
v0.8.2-nightly.2021.2.8+commit.ec62d123
v0.8.2-nightly.2021.2.4+commit.2fb27884
v0.8.2-nightly.2021.2.3+commit.1a949e53
v0.8.2-nightly.2021.2.2+commit.358324ed
v0.8.2-nightly.2021.2.1+commit.dde6353c
v0.8.2-nightly.2021.1.28+commit.70882cc4
v0.8.2-nightly.2021.1.27+commit.49dbcba3
v0.8.1+commit.df193b15
v0.8.1-nightly.2021.1.27+commit.34fa756f
v0.8.1-nightly.2021.1.25+commit.ccdf57c9
v0.8.1-nightly.2021.1.22+commit.8a844237
v0.8.1-nightly.2021.1.21+commit.3045770a
v0.8.1-nightly.2021.1.20+commit.a75b87c8
v0.8.1-nightly.2021.1.19+commit.1df28473
v0.8.1-nightly.2021.1.18+commit.957e9995
v0.8.1-nightly.2021.1.15+commit.055c4b4d
v0.8.1-nightly.2021.1.14+commit.eaf7d7da
v0.8.1-nightly.2021.1.13+commit.50146114
v0.8.1-nightly.2021.1.12+commit.e9dcd4f8
v0.8.1-nightly.2021.1.11+commit.67d21a87
v0.8.1-nightly.2021.1.8+commit.f03245d4
v0.8.1-nightly.2021.1.7+commit.d11cf15d
v0.8.1-nightly.2021.1.6+commit.5241b7b7
v0.8.1-nightly.2021.1.4+commit.fce6d999
v0.8.1-nightly.2020.12.30+commit.0e32fa82
v0.8.1-nightly.2020.12.29+commit.86c30b4c
v0.8.1-nightly.2020.12.28+commit.8e9a5a02
v0.8.1-nightly.2020.12.22+commit.e299d8ba
v0.8.1-nightly.2020.12.21+commit.b78443ac
v0.8.1-nightly.2020.12.20+commit.67712d50
v0.8.1-nightly.2020.12.18+commit.158154ba
v0.8.1-nightly.2020.12.17+commit.8194cbb4
v0.8.1-nightly.2020.12.16+commit.2be078b4
v0.8.0+commit.c7dfd78e
v0.7.6+commit.7338295f
v0.7.6-nightly.2020.12.15+commit.17293858
v0.7.6-nightly.2020.12.14+commit.d83ce0bc
v0.7.6-nightly.2020.12.11+commit.db9aa36d
v0.7.6-nightly.2020.12.10+commit.9e4f3bad
v0.7.6-nightly.2020.12.9+commit.7e930f7b
v0.7.6-nightly.2020.12.8+commit.0d7f9ae1
v0.7.6-nightly.2020.12.7+commit.b23d9230
v0.7.6-nightly.2020.12.4+commit.3619a0a0
v0.7.6-nightly.2020.12.3+commit.a27d7707
v0.7.6-nightly.2020.12.2+commit.3cd0b252
v0.7.6-nightly.2020.12.1+commit.e10712c1
v0.7.6-nightly.2020.11.30+commit.91e67472
v0.7.6-nightly.2020.11.27+commit.887569ef
v0.7.6-nightly.2020.11.26+commit.e8843fe1
v0.7.6-nightly.2020.11.25+commit.7eb5fc31
v0.7.6-nightly.2020.11.24+commit.ae34fba4
v0.7.6-nightly.2020.11.23+commit.61425e35
v0.7.6-nightly.2020.11.21+commit.8bf455bb
v0.7.6-nightly.2020.11.20+commit.3a3303f2
v0.7.6-nightly.2020.11.19+commit.8d315ee1
v0.7.6-nightly.2020.11.18+commit.bfe87378
v0.7.5+commit.eb77ed08
v0.7.5-nightly.2020.11.17+commit.e1292380
v0.7.5-nightly.2020.11.16+commit.a97521bf
v0.7.5-nightly.2020.11.13+commit.f1846b57
v0.7.5-nightly.2020.11.12+commit.c69c7f32
v0.7.5-nightly.2020.11.11+commit.44eb63fa
v0.7.5-nightly.2020.11.10+commit.d3a016b5
v0.7.5-nightly.2020.11.9+commit.41f50365
v0.7.5-nightly.2020.11.6+commit.6fa42b5e
v0.7.5-nightly.2020.11.5+commit.f55f5c24
v0.7.5-nightly.2020.11.4+commit.5b412544
v0.7.5-nightly.2020.11.3+commit.a8045ba5
v0.7.5-nightly.2020.11.2+commit.c83d8fae
v0.7.5-nightly.2020.10.29+commit.be02db49
v0.7.5-nightly.2020.10.28+commit.f42280f5
v0.7.5-nightly.2020.10.27+commit.f1ed5100
v0.7.5-nightly.2020.10.26+commit.96c188be
v0.7.5-nightly.2020.10.23+commit.08a27b9c
v0.7.5-nightly.2020.10.22+commit.95c521a3
v0.7.5-nightly.2020.10.21+commit.38d58a45
v0.7.5-nightly.2020.10.20+commit.06394672
v0.7.5-nightly.2020.10.19+commit.58579332
v0.7.4+commit.3f05b770
v0.7.4-nightly.2020.10.18+commit.6aae7cae
v0.7.4-nightly.2020.10.16+commit.eedd12ad
v0.7.4-nightly.2020.10.15+commit.9aafb62e
v0.7.4-nightly.2020.10.14+commit.36a36caf
v0.7.4-nightly.2020.10.13+commit.8d241fec
v0.7.4-nightly.2020.10.12+commit.abfa136a
v0.7.4-nightly.2020.10.9+commit.d9215cf9
v0.7.4-nightly.2020.10.8+commit.3739b03a
v0.7.3+commit.9bfce1f6
v0.7.3-nightly.2020.10.6+commit.25d40805
v0.7.3-nightly.2020.10.2+commit.756e21a8
v0.7.3-nightly.2020.9.30+commit.3af21c92
v0.7.3-nightly.2020.9.29+commit.343c13f9
v0.7.3-nightly.2020.9.28+commit.dd5b0a71
v0.7.2+commit.51b20bc0
v0.7.2-nightly.2020.9.25+commit.b34465c5
v0.7.2-nightly.2020.9.24+commit.5711d664
v0.7.2-nightly.2020.9.23+commit.35a7d5d3
v0.7.2-nightly.2020.9.22+commit.700cc4c9
v0.7.2-nightly.2020.9.21+commit.d80a81b0
v0.7.2-nightly.2020.9.17+commit.b571fd05
v0.7.2-nightly.2020.9.16+commit.90506528
v0.7.2-nightly.2020.9.15+commit.3399570d
v0.7.2-nightly.2020.9.12+commit.38175150
v0.7.2-nightly.2020.9.11+commit.31b5102a
v0.7.2-nightly.2020.9.10+commit.0db79dbc
v0.7.2-nightly.2020.9.9+commit.95a284e5
v0.7.2-nightly.2020.9.8+commit.20233240
v0.7.2-nightly.2020.9.7+commit.38e6f272
v0.7.2-nightly.2020.9.3+commit.f9649660
v0.7.2-nightly.2020.9.2+commit.cde65224
v0.7.1+commit.f4a555be
v0.7.1-nightly.2020.9.1+commit.0d83977d
v0.7.1-nightly.2020.8.31+commit.34543e5e
v0.7.1-nightly.2020.8.28+commit.98cc1d99
v0.7.1-nightly.2020.8.27+commit.e872b1b5
v0.7.1-nightly.2020.8.26+commit.fdc4142b
v0.7.1-nightly.2020.8.25+commit.29b6c172
v0.7.1-nightly.2020.8.24+commit.21489d81
v0.7.1-nightly.2020.8.22+commit.bff0f9bd
v0.7.1-nightly.2020.8.21+commit.4dd25f73
v0.7.1-nightly.2020.8.20+commit.4a720a65
v0.7.1-nightly.2020.8.19+commit.9e488f12
v0.7.1-nightly.2020.8.18+commit.3c27d36e
v0.7.1-nightly.2020.8.17+commit.660ef792
v0.7.1-nightly.2020.8.13+commit.b1fb9da6
v0.7.1-nightly.2020.8.12+commit.acdaff63
v0.7.1-nightly.2020.8.11+commit.e68d16d8
v0.7.1-nightly.2020.8.10+commit.05901f5b
v0.7.1-nightly.2020.8.6+commit.241a564f
v0.7.1-nightly.2020.8.5+commit.3a409c39
v0.7.1-nightly.2020.8.4+commit.b8fd409f
v0.7.1-nightly.2020.8.3+commit.d31f05fc
v0.7.1-nightly.2020.7.31+commit.08791ab0
v0.7.1-nightly.2020.7.29+commit.f2fa5b5f
v0.7.1-nightly.2020.7.28+commit.cd2ce283
v0.7.0+commit.9e61f92b
v0.7.0-nightly.2020.7.27+commit.4e4b3ee6
v0.7.0-nightly.2020.7.23+commit.7ad27188
v0.6.12+commit.27d51765
v0.6.11+commit.5ef660b1
v0.6.11-nightly.2020.6.25+commit.48dd3634
v0.6.10+commit.00c0fcaf
v0.6.10-nightly.2020.6.10+commit.0a5d9927
v0.6.10-nightly.2020.6.9+commit.1e8e0ebd
v0.6.10-nightly.2020.6.8+commit.3d241eed
v0.6.10-nightly.2020.6.5+commit.d4552678
v0.6.10-nightly.2020.6.4+commit.0ec96337
v0.6.9+commit.3e3065ac
v0.6.9-nightly.2020.6.4+commit.70e62524
v0.6.9-nightly.2020.6.3+commit.de5e2835
v0.6.9-nightly.2020.6.2+commit.22f7a9f0
v0.6.9-nightly.2020.5.29+commit.b01a1a36
v0.6.9-nightly.2020.5.28+commit.ee8307ce
v0.6.9-nightly.2020.5.27+commit.57ac8628
v0.6.9-nightly.2020.5.14+commit.33d8d838
v0.6.8+commit.0bbfe453
v0.6.8-nightly.2020.5.14+commit.a6d0067b
v0.6.8-nightly.2020.5.13+commit.aca70049
v0.6.8-nightly.2020.5.12+commit.b014b89e
v0.6.8-nightly.2020.5.11+commit.39249bc6
v0.6.8-nightly.2020.5.8+commit.4e58c672
v0.6.8-nightly.2020.5.7+commit.741c41a1
v0.6.8-nightly.2020.5.6+commit.3a93080c
v0.6.8-nightly.2020.5.5+commit.1de73a16
v0.6.8-nightly.2020.5.4+commit.1bb07e26
v0.6.7+commit.b8d736ae
v0.6.7-nightly.2020.5.4+commit.94f7ffcf
v0.6.7-nightly.2020.5.1+commit.5163c09e
v0.6.7-nightly.2020.4.29+commit.602b29cb
v0.6.7-nightly.2020.4.28+commit.75a25d53
v0.6.7-nightly.2020.4.27+commit.61b1369f
v0.6.7-nightly.2020.4.25+commit.ed6c6b31
v0.6.7-nightly.2020.4.24+commit.2b39f3b9
v0.6.7-nightly.2020.4.23+commit.aaa434da
v0.6.7-nightly.2020.4.22+commit.d0fcd468
v0.6.7-nightly.2020.4.20+commit.7eff836a
v0.6.7-nightly.2020.4.17+commit.ccc06c49
v0.6.7-nightly.2020.4.16+commit.0f7a5e80
v0.6.7-nightly.2020.4.15+commit.cbd90f8d
v0.6.7-nightly.2020.4.14+commit.accd8d76
v0.6.7-nightly.2020.4.9+commit.f8aaa83e
v0.6.6+commit.6c089d02
v0.6.6-nightly.2020.4.9+commit.605e176f
v0.6.6-nightly.2020.4.8+commit.9fab9df1
v0.6.6-nightly.2020.4.7+commit.582c7545
v0.6.6-nightly.2020.4.6+commit.e349f4b7
v0.6.5+commit.f956cc89
v0.6.5-nightly.2020.4.6+commit.8451639f
v0.6.5-nightly.2020.4.3+commit.00acaadd
v0.6.5-nightly.2020.4.2+commit.c8f0629e
v0.6.5-nightly.2020.4.1+commit.c11d5b8d
v0.6.5-nightly.2020.3.31+commit.b83d82ab
v0.6.5-nightly.2020.3.30+commit.469316f8
v0.6.5-nightly.2020.3.26+commit.994591b8
v0.6.5-nightly.2020.3.25+commit.18971389
v0.6.5-nightly.2020.3.24+commit.d584b2d1
v0.6.5-nightly.2020.3.23+commit.848f405f
v0.6.5-nightly.2020.3.19+commit.8834b1ac
v0.6.5-nightly.2020.3.18+commit.cfd315e1
v0.6.5-nightly.2020.3.17+commit.435c9dae
v0.6.5-nightly.2020.3.16+commit.e21567c1
v0.6.5-nightly.2020.3.13+commit.362c2175
v0.6.5-nightly.2020.3.12+commit.bdd8045d
v0.6.5-nightly.2020.3.11+commit.1167af1d
v0.6.5-nightly.2020.3.10+commit.59071f60
v0.6.4+commit.1dca32f3
v0.6.4-nightly.2020.3.10+commit.683ebc8e
v0.6.4-nightly.2020.3.9+commit.dbe2a5f4
v0.6.4-nightly.2020.3.8+commit.a328e940
v0.6.4-nightly.2020.3.6+commit.78ce4b96
v0.6.4-nightly.2020.3.4+commit.27a4670a
v0.6.4-nightly.2020.3.3+commit.20679d63
v0.6.4-nightly.2020.2.27+commit.b65a165d
v0.6.4-nightly.2020.2.26+commit.6930e0c2
v0.6.4-nightly.2020.2.25+commit.af81d4b6
v0.6.4-nightly.2020.2.24+commit.aa6a2b47
v0.6.4-nightly.2020.2.20+commit.525fe384
v0.6.4-nightly.2020.2.19+commit.8f2c5fc0
v0.6.4-nightly.2020.2.18+commit.ba9f740a
v0.6.3+commit.8dda9521
v0.6.3-nightly.2020.2.18+commit.64f9dc35
v0.6.3-nightly.2020.2.17+commit.50421e8b
v0.6.3-nightly.2020.2.14+commit.96709b32
v0.6.3-nightly.2020.2.13+commit.7af581df
v0.6.3-nightly.2020.2.12+commit.0e100e7e
v0.6.3-nightly.2020.2.11+commit.5214cb0e
v0.6.3-nightly.2020.2.10+commit.64bb0d55
v0.6.3-nightly.2020.2.7+commit.462cd432
v0.6.3-nightly.2020.2.6+commit.93191ceb
v0.6.3-nightly.2020.2.5+commit.913d5f32
v0.6.3-nightly.2020.2.4+commit.836938c1
v0.6.3-nightly.2020.2.3+commit.93a41f7a
v0.6.3-nightly.2020.1.31+commit.b6190e06
v0.6.3-nightly.2020.1.30+commit.ad98bf0f
v0.6.3-nightly.2020.1.29+commit.01eb9a5b
v0.6.3-nightly.2020.1.28+commit.2d3bd91d
v0.6.3-nightly.2020.1.27+commit.8809d4bb
v0.6.2+commit.bacdbe57
v0.6.2-nightly.2020.1.27+commit.1bdb409b
v0.6.2-nightly.2020.1.23+commit.3add37a2
v0.6.2-nightly.2020.1.22+commit.641bb815
v0.6.2-nightly.2020.1.20+commit.470c19eb
v0.6.2-nightly.2020.1.17+commit.92908f52
v0.6.2-nightly.2020.1.16+commit.3d4a2219
v0.6.2-nightly.2020.1.15+commit.9d9a7ebe
v0.6.2-nightly.2020.1.14+commit.6dbadf69
v0.6.2-nightly.2020.1.13+commit.408458b7
v0.6.2-nightly.2020.1.10+commit.d577a768
v0.6.2-nightly.2020.1.9+commit.17158995
v0.6.2-nightly.2020.1.8+commit.12b52ae6
v0.6.1+commit.e6f7d5a4
v0.6.1-nightly.2020.1.7+commit.8385256b
v0.6.1-nightly.2020.1.6+commit.20cf9d9f
v0.6.1-nightly.2020.1.3+commit.943af71d
v0.6.1-nightly.2020.1.2+commit.d082b9b8
v0.6.1-nightly.2019.12.20+commit.ece6463f
v0.6.1-nightly.2019.12.19+commit.d420fe37
v0.6.1-nightly.2019.12.18+commit.9a1cc027
v0.6.0+commit.26b70077
v0.6.0-nightly.2019.12.17+commit.d13438ee
v0.6.0-nightly.2019.12.16+commit.7390b5b5
v0.6.0-nightly.2019.12.14+commit.1c01c69e
v0.6.0-nightly.2019.12.13+commit.9ddd5042
v0.6.0-nightly.2019.12.12+commit.104a8c59
v0.6.0-nightly.2019.12.11+commit.7247e72d
v0.6.0-nightly.2019.12.10+commit.7244aa01
v0.5.17+commit.d19bba13
v0.5.16+commit.9c3226ce
v0.5.15+commit.6a57276f
v0.5.14+commit.01f1aaa4
v0.5.14-nightly.2019.12.10+commit.45aa7a88
v0.5.14-nightly.2019.12.9+commit.d6667560
v0.5.14-nightly.2019.12.5+commit.d2e3933d
v0.5.14-nightly.2019.12.4+commit.2a1b6f55
v0.5.14-nightly.2019.11.30+commit.4775af73
v0.5.14-nightly.2019.11.29+commit.7b038dbd
v0.5.14-nightly.2019.11.28+commit.40d9744b
v0.5.14-nightly.2019.11.27+commit.87943bf4
v0.5.14-nightly.2019.11.26+commit.200a92b4
v0.5.14-nightly.2019.11.25+commit.c4622774
v0.5.14-nightly.2019.11.21+commit.9eac460c
v0.5.14-nightly.2019.11.20+commit.7535039f
v0.5.14-nightly.2019.11.19+commit.e383b2bb
v0.5.14-nightly.2019.11.18+commit.79af19db
v0.5.14-nightly.2019.11.15+commit.6a993152
v0.5.14-nightly.2019.11.14+commit.3e04fd6e
v0.5.13+commit.5b0b510c
v0.5.13-nightly.2019.11.14+commit.d1c6ab8a
v0.5.13-nightly.2019.11.13+commit.6bef3071
v0.5.13-nightly.2019.11.12+commit.52a9de83
v0.5.13-nightly.2019.11.11+commit.7c7cca5f
v0.5.13-nightly.2019.11.10+commit.a5f0422d
v0.5.13-nightly.2019.11.8+commit.78be9385
v0.5.13-nightly.2019.11.7+commit.37c6ab4c
v0.5.13-nightly.2019.11.6+commit.56a3abcd
v0.5.13-nightly.2019.11.5+commit.9bec5334
v0.5.13-nightly.2019.11.4+commit.26c6a1fc
v0.5.13-nightly.2019.11.1+commit.73954f16
v0.5.13-nightly.2019.10.31+commit.d932f2d0
v0.5.13-nightly.2019.10.29+commit.5d906cd5
v0.5.13-nightly.2019.10.28+commit.9eb08c0c
v0.5.13-nightly.2019.10.25+commit.302a51a5
v0.5.13-nightly.2019.10.24+commit.15e39f7d
v0.5.13-nightly.2019.10.23+commit.e56d1aa5
v0.5.13-nightly.2019.10.22+commit.eca2b9bd
v0.5.13-nightly.2019.10.18+commit.d5b2f347
v0.5.13-nightly.2019.10.17+commit.5ea1d90f
v0.5.13-nightly.2019.10.16+commit.9ec8bcda
v0.5.13-nightly.2019.10.15+commit.83bb1515
v0.5.13-nightly.2019.10.4+commit.6cbcc379
v0.5.13-nightly.2019.10.2+commit.2d150b65
v0.5.13-nightly.2019.10.1+commit.74d2b228
v0.5.12+commit.7709ece9
v0.5.12-nightly.2019.10.1+commit.cbdc3bc1
v0.5.12-nightly.2019.9.30+commit.88476475
v0.5.12-nightly.2019.9.24+commit.973e4ca9
v0.5.12-nightly.2019.9.23+commit.c4208a6a
v0.5.12-nightly.2019.9.19+commit.0478eb1e
v0.5.12-nightly.2019.9.17+commit.58f0f9db
v0.5.12-nightly.2019.9.16+commit.34a84f3a
v0.5.12-nightly.2019.9.13+commit.5d58c43a
v0.5.12-nightly.2019.9.12+commit.b747c267
v0.5.12-nightly.2019.9.11+commit.5063e537
v0.5.12-nightly.2019.9.10+commit.4452a9b6
v0.5.12-nightly.2019.9.9+commit.f5e976ce
v0.5.12-nightly.2019.9.6+commit.7e80fceb
v0.5.12-nightly.2019.9.5+commit.96980d0b
v0.5.12-nightly.2019.9.4+commit.c5fbf23f
v0.5.12-nightly.2019.9.3+commit.d1831b15
v0.5.12-nightly.2019.9.2+commit.3c963eb0
v0.5.12-nightly.2019.8.29+commit.459aed90
v0.5.12-nightly.2019.8.28+commit.e74b63b6
v0.5.12-nightly.2019.8.26+commit.e1bb4b9f
v0.5.12-nightly.2019.8.24+commit.bb104546
v0.5.12-nightly.2019.8.23+commit.b5048bd6
v0.5.12-nightly.2019.8.19+commit.a39d26f3
v0.5.12-nightly.2019.8.16+commit.058bbd39
v0.5.12-nightly.2019.8.15+commit.2508cbc1
v0.5.12-nightly.2019.8.14+commit.fb8137df
v0.5.12-nightly.2019.8.13+commit.a6cbc3b8
v0.5.11+commit.c082d0b4
v0.5.11+commit.22be8592
v0.5.11-nightly.2019.8.12+commit.b285e086
v0.5.11-nightly.2019.8.10+commit.f5f2bbb2
v0.5.11-nightly.2019.8.9+commit.682a3ece
v0.5.11-nightly.2019.8.8+commit.16efcfdb
v0.5.11-nightly.2019.8.7+commit.6166dc8e
v0.5.11-nightly.2019.8.6+commit.cd563e52
v0.5.11-nightly.2019.8.5+commit.29d47d5c
v0.5.11-nightly.2019.8.2+commit.967ee944
v0.5.11-nightly.2019.8.1+commit.aa87a607
v0.5.11-nightly.2019.7.31+commit.32e6e356
v0.5.11-nightly.2019.7.30+commit.092e62f1
v0.5.11-nightly.2019.7.29+commit.2fdc07c5
v0.5.11-nightly.2019.7.25+commit.4f7fec69
v0.5.11-nightly.2019.7.23+commit.14699340
v0.5.11-nightly.2019.7.22+commit.535553b5
v0.5.11-nightly.2019.7.19+commit.508cf66d
v0.5.11-nightly.2019.7.18+commit.1d673a3b
v0.5.11-nightly.2019.7.17+commit.4fa78004
v0.5.11-nightly.2019.7.16+commit.a5a7983a
v0.5.11-nightly.2019.7.11+commit.88477bdb
v0.5.11-nightly.2019.7.10+commit.ba922e76
v0.5.11-nightly.2019.7.9+commit.8d006d20
v0.5.11-nightly.2019.7.8+commit.25928767
v0.5.11-nightly.2019.7.4+commit.3b2ebba4
v0.5.11-nightly.2019.7.3+commit.c3c8bc09
v0.5.11-nightly.2019.7.2+commit.06d01d15
v0.5.11-nightly.2019.7.1+commit.b8dbf7d2
v0.5.11-nightly.2019.6.27+commit.3597de35
v0.5.11-nightly.2019.6.26+commit.b4a0a793
v0.5.11-nightly.2019.6.25+commit.1cc84753
v0.5.10+commit.5a6ea5b1
v0.5.10-nightly.2019.6.25+commit.92529068
v0.5.10-nightly.2019.6.24+commit.eb5b8298
v0.5.10-nightly.2019.6.20+commit.096e3fcd
v0.5.10-nightly.2019.6.19+commit.53f26d97
v0.5.10-nightly.2019.6.18+commit.b6695071
v0.5.10-nightly.2019.6.17+commit.9c5dc63e
v0.5.10-nightly.2019.6.14+commit.4aa0c9e0
v0.5.10-nightly.2019.6.13+commit.62bd7032
v0.5.10-nightly.2019.6.12+commit.502d22a2
v0.5.10-nightly.2019.6.11+commit.bd1f65d6
v0.5.10-nightly.2019.6.7+commit.dc085bb8
v0.5.10-nightly.2019.6.6+commit.fc35c139
v0.5.10-nightly.2019.6.5+commit.3a331639
v0.5.10-nightly.2019.6.4+commit.95e6b2e4
v0.5.10-nightly.2019.5.30+commit.dd04a35c
v0.5.10-nightly.2019.5.29+commit.c9e2d388
v0.5.10-nightly.2019.5.28+commit.ff8898b8
v0.5.9+commit.e560f70d
v0.5.9+commit.c68bc34e
v0.5.9-nightly.2019.5.28+commit.01b6b680
v0.5.9-nightly.2019.5.27+commit.c14279fc
v0.5.9-nightly.2019.5.24+commit.2a2cea08
v0.5.9-nightly.2019.5.23+commit.7cf51876
v0.5.9-nightly.2019.5.22+commit.f06582f9
v0.5.9-nightly.2019.5.21+commit.0e132d07
v0.5.9-nightly.2019.5.20+commit.0731abd3
v0.5.9-nightly.2019.5.17+commit.88e9fbe6
v0.5.9-nightly.2019.5.16+commit.46d6f395
v0.5.9-nightly.2019.5.15+commit.a10501bb
v0.5.9-nightly.2019.5.14+commit.563aec1d
v0.5.9-nightly.2019.5.13+commit.a28b6224
v0.5.9-nightly.2019.5.10+commit.661b08e1
v0.5.9-nightly.2019.5.9+commit.8f2c8daf
v0.5.9-nightly.2019.5.8+commit.97f16421
v0.5.9-nightly.2019.5.7+commit.a21f8a0b
v0.5.9-nightly.2019.5.6+commit.dee1c110
v0.5.9-nightly.2019.5.2+commit.90f2fe6f
v0.5.9-nightly.2019.4.30+commit.b6bcd8a1
v0.5.8+commit.23d335f2
v0.5.8-nightly.2019.4.30+commit.0dc461b9
v0.5.8-nightly.2019.4.29+commit.578d6180
v0.5.8-nightly.2019.4.25+commit.eea425a3
v0.5.8-nightly.2019.4.24+commit.f124bace
v0.5.8-nightly.2019.4.23+commit.13518820
v0.5.8-nightly.2019.4.18+commit.fce19bde
v0.5.8-nightly.2019.4.17+commit.1feefa1c
v0.5.8-nightly.2019.4.16+commit.a61931c5
v0.5.8-nightly.2019.4.15+commit.e4e786a9
v0.5.8-nightly.2019.4.14+commit.6c68904f
v0.5.8-nightly.2019.4.12+commit.31abeb99
v0.5.8-nightly.2019.4.11+commit.e97d4b4a
v0.5.8-nightly.2019.4.10+commit.9eaaf42c
v0.5.8-nightly.2019.4.5+commit.9ef84df4
v0.5.8-nightly.2019.4.4+commit.ee2f5662
v0.5.8-nightly.2019.4.3+commit.1b7878cf
v0.5.8-nightly.2019.4.2+commit.7b0f7eb1
v0.5.8-nightly.2019.4.1+commit.a3a60b8e
v0.5.8-nightly.2019.3.29+commit.91a54f9b
v0.5.8-nightly.2019.3.28+commit.2bbc41ad
v0.5.8-nightly.2019.3.27+commit.97818f65
v0.5.8-nightly.2019.3.26+commit.b85fc1a6
v0.5.7+commit.6da8b019
v0.5.7-nightly.2019.3.26+commit.d079cdbf
v0.5.7-nightly.2019.3.25+commit.99ed3a64
v0.5.7-nightly.2019.3.22+commit.0af47da1
v0.5.7-nightly.2019.3.21+commit.ebb8c175
v0.5.7-nightly.2019.3.20+commit.5245a66d
v0.5.7-nightly.2019.3.19+commit.c7824932
v0.5.7-nightly.2019.3.18+commit.5b5c9aa2
v0.5.7-nightly.2019.3.14+commit.d1d6d59c
v0.5.7-nightly.2019.3.13+commit.2da906d9
v0.5.6+commit.b259423e
v0.5.6-nightly.2019.3.13+commit.9ccd5dfe
v0.5.6-nightly.2019.3.12+commit.2f37cd09
v0.5.6-nightly.2019.3.11+commit.189983a1
v0.5.5+commit.47a71e8f
v0.5.5-nightly.2019.3.5+commit.c283f6d8
v0.5.5-nightly.2019.3.4+commit.5490a5cd
v0.5.5-nightly.2019.2.28+commit.e9543d83
v0.5.5-nightly.2019.2.27+commit.a0dcb36f
v0.5.5-nightly.2019.2.26+commit.472a6445
v0.5.5-nightly.2019.2.25+commit.52ee955f
v0.5.5-nightly.2019.2.21+commit.e7a8fed0
v0.5.5-nightly.2019.2.20+commit.c8fb2c1b
v0.5.5-nightly.2019.2.19+commit.d9e4a10d
v0.5.5-nightly.2019.2.18+commit.db7b38e3
v0.5.5-nightly.2019.2.16+commit.2f0926c3
v0.5.5-nightly.2019.2.15+commit.04081303
v0.5.5-nightly.2019.2.14+commit.33318249
v0.5.5-nightly.2019.2.13+commit.b1a5ffb9
v0.5.5-nightly.2019.2.12+commit.828255fa
v0.5.4+commit.9549d8ff
v0.5.4-nightly.2019.2.12+commit.f0f34984
v0.5.4-nightly.2019.2.11+commit.49cd55d3
v0.5.4-nightly.2019.2.7+commit.caecdfab
v0.5.4-nightly.2019.2.6+commit.e5bf1f1d
v0.5.4-nightly.2019.2.5+commit.f3c9b41f
v0.5.4-nightly.2019.2.4+commit.82b69963
v0.5.4-nightly.2019.1.31+commit.ddab3f06
v0.5.4-nightly.2019.1.30+commit.bf3968d6
v0.5.4-nightly.2019.1.29+commit.ebf503a6
v0.5.4-nightly.2019.1.28+commit.e6d102f2
v0.5.4-nightly.2019.1.26+commit.0ef45b28
v0.5.4-nightly.2019.1.24+commit.2e7274b4
v0.5.4-nightly.2019.1.23+commit.ea292393
v0.5.4-nightly.2019.1.22+commit.26c06550
v0.5.3+commit.10d17f24
v0.5.3-nightly.2019.1.22+commit.d87d9a26
v0.5.3-nightly.2019.1.21+commit.606c2b99
v0.5.3-nightly.2019.1.19+commit.d3270bc3
v0.5.3-nightly.2019.1.18+commit.7b759866
v0.5.3-nightly.2019.1.17+commit.49f74a7b
v0.5.3-nightly.2019.1.16+commit.82453a76
v0.5.3-nightly.2019.1.15+commit.6146c59a
v0.5.3-nightly.2019.1.14+commit.051df319
v0.5.3-nightly.2019.1.11+commit.94688d2f
v0.5.3-nightly.2019.1.10+commit.31033fb4
v0.5.3-nightly.2019.1.9+commit.63319cfd
v0.5.3-nightly.2019.1.8+commit.a0ca746c
v0.5.3-nightly.2019.1.7+commit.f3799034
v0.5.3-nightly.2019.1.3+commit.d597b1db
v0.5.3-nightly.2018.12.20+commit.245ec29c
v0.5.2+commit.1df8f40c
v0.5.2-nightly.2018.12.19+commit.88750920
v0.5.2-nightly.2018.12.18+commit.4b43aeca
v0.5.2-nightly.2018.12.17+commit.12874029
v0.5.2-nightly.2018.12.13+commit.b3e2ba15
v0.5.2-nightly.2018.12.12+commit.85291bcb
v0.5.2-nightly.2018.12.11+commit.599760b6
v0.5.2-nightly.2018.12.10+commit.6240d9e7
v0.5.2-nightly.2018.12.7+commit.52ff3c94
v0.5.2-nightly.2018.12.6+commit.5a08ae5e
v0.5.2-nightly.2018.12.5+commit.6efe2a52
v0.5.2-nightly.2018.12.4+commit.e49f37be
v0.5.2-nightly.2018.12.3+commit.e6a01d26
v0.5.1+commit.c8a2cb62
v0.5.1-nightly.2018.12.3+commit.a73df9bc
v0.5.1-nightly.2018.11.30+commit.a7ca4991
v0.5.1-nightly.2018.11.29+commit.f6d01323
v0.5.1-nightly.2018.11.28+commit.7cbf0468
v0.5.1-nightly.2018.11.27+commit.bc7cb301
v0.5.1-nightly.2018.11.26+commit.f9378967
v0.5.1-nightly.2018.11.25+commit.1e03c160
v0.5.1-nightly.2018.11.23+commit.616ef8bc
v0.5.1-nightly.2018.11.22+commit.dc748bc7
v0.5.1-nightly.2018.11.21+commit.2c6e1888
v0.5.1-nightly.2018.11.19+commit.d3f66ca0
v0.5.1-nightly.2018.11.17+commit.5be45e73
v0.5.1-nightly.2018.11.15+commit.9db76403
v0.5.1-nightly.2018.11.14+commit.10d99fc3
v0.5.1-nightly.2018.11.13+commit.74ede87a
v0.5.0+commit.1d4f565a
v0.5.0-nightly.2018.11.13+commit.ac980fb8
v0.5.0-nightly.2018.11.12+commit.09f8ff27
v0.5.0-nightly.2018.11.11+commit.405565db
v0.5.0-nightly.2018.11.9+commit.9709dfe0
v0.5.0-nightly.2018.11.8+commit.cc2de07b
v0.5.0-nightly.2018.11.7+commit.a459b8c8
v0.5.0-nightly.2018.11.5+commit.88aee34c
v0.5.0-nightly.2018.11.4+commit.e4da724f
v0.5.0-nightly.2018.10.30+commit.cbbbc0d5
v0.5.0-nightly.2018.10.29+commit.0b4f6ab7
v0.5.0-nightly.2018.10.28+commit.c338b422
v0.5.0-nightly.2018.10.26+commit.c8400353
v0.5.0-nightly.2018.10.25+commit.f714b0dd
v0.5.0-nightly.2018.10.24+commit.01566c2e
v0.5.0-nightly.2018.10.23+commit.f5f977ea
v0.5.0-nightly.2018.10.22+commit.a2f5087d
v0.5.0-nightly.2018.10.19+commit.c13b5280
v0.5.0-nightly.2018.10.18+commit.99dc869e
v0.5.0-nightly.2018.10.17+commit.ba158882
v0.5.0-nightly.2018.10.16+commit.b723893a
v0.5.0-nightly.2018.10.15+commit.b965fd6e
v0.5.0-nightly.2018.10.12+commit.1d312c8e
v0.5.0-nightly.2018.10.11+commit.6b5d041e
v0.5.0-nightly.2018.10.10+commit.06200b4b
v0.5.0-nightly.2018.10.9+commit.4ab2e03b
v0.5.0-nightly.2018.10.8+commit.7d2dc143
v0.5.0-nightly.2018.10.6+commit.363b527b
v0.5.0-nightly.2018.10.5+commit.44c1293a
v0.5.0-nightly.2018.10.4+commit.68dfe8b6
v0.5.0-nightly.2018.10.3+commit.b8b31eb3
v0.5.0-nightly.2018.10.2+commit.b77b79c4
v0.5.0-nightly.2018.10.1+commit.80012e69
v0.5.0-nightly.2018.9.30+commit.8ef47cb6
v0.5.0-nightly.2018.9.27+commit.963ae540
v0.5.0-nightly.2018.9.26+commit.d72498b3
v0.5.0-nightly.2018.9.25+commit.608f36d7
v0.4.26+commit.4563c3fc
v0.4.26-nightly.2018.9.25+commit.1b8334e5
v0.4.26-nightly.2018.9.24+commit.dce1ed5a
v0.4.26-nightly.2018.9.21+commit.8f96fe69
v0.4.26-nightly.2018.9.20+commit.2150aea3
v0.4.26-nightly.2018.9.19+commit.7c15f6b1
v0.4.26-nightly.2018.9.18+commit.fcb48bce
v0.4.26-nightly.2018.9.17+commit.2409986c
v0.4.26-nightly.2018.9.13+commit.8b089cc8
v0.4.25+commit.59dbf8f1
v0.4.25-nightly.2018.9.13+commit.15c8c0d2
v0.4.25-nightly.2018.9.12+commit.9214c7c3
v0.4.25-nightly.2018.9.11+commit.d66e956a
v0.4.25-nightly.2018.9.10+commit.86d85025
v0.4.25-nightly.2018.9.6+commit.f19cddd5
v0.4.25-nightly.2018.9.5+commit.a996ea26
v0.4.25-nightly.2018.9.4+commit.f27d7edf
v0.4.25-nightly.2018.9.3+commit.0b9cc80b
v0.4.25-nightly.2018.8.16+commit.a9e7ae29
v0.4.25-nightly.2018.8.15+commit.2946b7cd
v0.4.25-nightly.2018.8.14+commit.6ca39739
v0.4.25-nightly.2018.8.13+commit.a2c754b3
v0.4.25-nightly.2018.8.9+commit.63d071d6
v0.4.25-nightly.2018.8.8+commit.d2ca9c82
v0.4.25-nightly.2018.8.7+commit.cda3fbda
v0.4.25-nightly.2018.8.6+commit.3684151e
v0.4.25-nightly.2018.8.3+commit.04efbc9e
v0.4.25-nightly.2018.8.2+commit.6003ed2a
v0.4.25-nightly.2018.8.1+commit.21888e24
v0.4.25-nightly.2018.7.31+commit.75c1a9bd
v0.4.25-nightly.2018.7.30+commit.9d09e21b
v0.4.25-nightly.2018.7.27+commit.bc51b0f6
v0.4.25-nightly.2018.7.25+commit.ff8e9300
v0.4.25-nightly.2018.7.24+commit.fc68d22b
v0.4.25-nightly.2018.7.23+commit.79ddcc76
v0.4.25-nightly.2018.7.20+commit.d3000e70
v0.4.25-nightly.2018.7.19+commit.e3c2f20f
v0.4.25-nightly.2018.7.18+commit.b909df45
v0.4.25-nightly.2018.7.17+commit.56096e9c
v0.4.25-nightly.2018.7.16+commit.98656423
v0.4.25-nightly.2018.7.12+commit.ff9974e9
v0.4.25-nightly.2018.7.11+commit.07910c80
v0.4.25-nightly.2018.7.10+commit.5c404fcf
v0.4.25-nightly.2018.7.9+commit.c42583d2
v0.4.25-nightly.2018.7.5+commit.b1ab81ef
v0.4.25-nightly.2018.7.4+commit.47637224
v0.4.25-nightly.2018.7.3+commit.09f3532e
v0.4.25-nightly.2018.7.2+commit.a5608b31
v0.4.25-nightly.2018.6.29+commit.c9cab803
v0.4.25-nightly.2018.6.28+commit.42680629
v0.4.25-nightly.2018.6.27+commit.b67dfa15
v0.4.25-nightly.2018.6.26+commit.24f124f8
v0.4.25-nightly.2018.6.25+commit.b7003505
v0.4.25-nightly.2018.6.22+commit.9b67bdb3
v0.4.25-nightly.2018.6.21+commit.0d104718
v0.4.25-nightly.2018.6.20+commit.ba7fbf11
v0.4.25-nightly.2018.6.19+commit.c72e04c3
v0.4.25-nightly.2018.6.18+commit.4247b004
v0.4.25-nightly.2018.6.17+commit.1692f78b
v0.4.25-nightly.2018.6.14+commit.baeabe1c
v0.4.25-nightly.2018.6.13+commit.3055e4ca
v0.4.25-nightly.2018.6.12+commit.56a965ea
v0.4.25-nightly.2018.6.11+commit.d0355619
v0.4.25-nightly.2018.6.8+commit.81c5a6e4
v0.4.25-nightly.2018.6.7+commit.ddd256a6
v0.4.25-nightly.2018.6.6+commit.59b35fa5
v0.4.25-nightly.2018.6.5+commit.7422cd73
v0.4.25-nightly.2018.6.4+commit.0a074d84
v0.4.25-nightly.2018.6.3+commit.ef8fb63b
v0.4.25-nightly.2018.5.30+commit.3f3d6df2
v0.4.25-nightly.2018.5.28+commit.0c223b03
v0.4.25-nightly.2018.5.23+commit.18c651b7
v0.4.25-nightly.2018.5.22+commit.849b1bd5
v0.4.25-nightly.2018.5.21+commit.e97f9b6b
v0.4.25-nightly.2018.5.18+commit.4d7b092c
v0.4.25-nightly.2018.5.17+commit.4aa2f036
v0.4.25-nightly.2018.5.16+commit.3897c367
v0.4.24+commit.e67f0147
v0.4.24-nightly.2018.5.16+commit.7f965c86
v0.4.24-nightly.2018.5.15+commit.b8b46099
v0.4.24-nightly.2018.5.14+commit.7a669b39
v0.4.24-nightly.2018.5.11+commit.43803b1a
v0.4.24-nightly.2018.5.10+commit.85d417a8
v0.4.24-nightly.2018.5.9+commit.1e953355
v0.4.24-nightly.2018.5.8+commit.0a63bc17
v0.4.24-nightly.2018.5.7+commit.6db7e09a
v0.4.24-nightly.2018.5.4+commit.81d61ca0
v0.4.24-nightly.2018.5.3+commit.72c3b3a2
v0.4.24-nightly.2018.5.2+commit.dc18cde6
v0.4.24-nightly.2018.4.30+commit.9e61b25d
v0.4.24-nightly.2018.4.27+commit.1604a996
v0.4.24-nightly.2018.4.26+commit.ef2111a2
v0.4.24-nightly.2018.4.25+commit.81cca26f
v0.4.24-nightly.2018.4.24+commit.258ae892
v0.4.24-nightly.2018.4.23+commit.c7ee2ca0
v0.4.24-nightly.2018.4.22+commit.2fae248d
v0.4.24-nightly.2018.4.20+commit.0f328431
v0.4.24-nightly.2018.4.19+commit.27d79906
v0.4.23+commit.124ca40d
v0.4.23-nightly.2018.4.19+commit.ae834e3d
v0.4.23-nightly.2018.4.18+commit.85687a37
v0.4.23-nightly.2018.4.17+commit.5499db01
v0.4.22+commit.4cb486ee
v0.4.22-nightly.2018.4.16+commit.d8030c9b
v0.4.22-nightly.2018.4.14+commit.73ca3e8a
v0.4.22-nightly.2018.4.13+commit.2001cc6b
v0.4.22-nightly.2018.4.12+commit.c3dc67d0
v0.4.22-nightly.2018.4.11+commit.b7b6d0ce
v0.4.22-nightly.2018.4.10+commit.27385d6d
v0.4.22-nightly.2018.4.6+commit.9bd49516
v0.4.22-nightly.2018.4.5+commit.c6adad93
v0.4.22-nightly.2018.4.4+commit.920de496
v0.4.22-nightly.2018.4.3+commit.3fbdd655
v0.4.22-nightly.2018.3.30+commit.326d656a
v0.4.22-nightly.2018.3.29+commit.c2ae33f8
v0.4.22-nightly.2018.3.27+commit.af262281
v0.4.22-nightly.2018.3.21+commit.8fd53c1c
v0.4.22-nightly.2018.3.16+commit.2b2527f3
v0.4.22-nightly.2018.3.15+commit.3f1e0d84
v0.4.22-nightly.2018.3.14+commit.c3f07b52
v0.4.22-nightly.2018.3.13+commit.f2614be9
v0.4.22-nightly.2018.3.12+commit.c6e9dd13
v0.4.22-nightly.2018.3.8+commit.fbc29f6d
v0.4.22-nightly.2018.3.7+commit.b5e804b8
v0.4.21+commit.dfe3193c
v0.4.21-nightly.2018.3.7+commit.bd7bc7c4
v0.4.21-nightly.2018.3.6+commit.a9e02acc
v0.4.21-nightly.2018.3.5+commit.cd6ffbdf
v0.4.21-nightly.2018.3.1+commit.cf6720ea
v0.4.21-nightly.2018.2.28+commit.ac5485a2
v0.4.21-nightly.2018.2.27+commit.415ac2ae
v0.4.21-nightly.2018.2.26+commit.cd2d8936
v0.4.21-nightly.2018.2.23+commit.cae6cc2c
v0.4.21-nightly.2018.2.22+commit.71a34abd
v0.4.21-nightly.2018.2.21+commit.16c7eabc
v0.4.21-nightly.2018.2.20+commit.dcc4083b
v0.4.21-nightly.2018.2.19+commit.839acafb
v0.4.21-nightly.2018.2.16+commit.3f7e82d0
v0.4.21-nightly.2018.2.15+commit.f4aa05f3
v0.4.21-nightly.2018.2.14+commit.bb3b327c
v0.4.20+commit.3155dd80
v0.4.20-nightly.2018.2.13+commit.27ef9794
v0.4.20-nightly.2018.2.12+commit.954903b5
v0.4.20-nightly.2018.1.29+commit.a668b9de
v0.4.20-nightly.2018.1.26+commit.bbad48bb
v0.4.20-nightly.2018.1.25+commit.e7afde95
v0.4.20-nightly.2018.1.24+commit.b177352a
v0.4.20-nightly.2018.1.23+commit.31aaf433
v0.4.20-nightly.2018.1.22+commit.e5def2da
v0.4.20-nightly.2018.1.19+commit.eba46a65
v0.4.20-nightly.2018.1.18+commit.33723c45
v0.4.20-nightly.2018.1.17+commit.4715167e
v0.4.20-nightly.2018.1.15+commit.14fcbd65
v0.4.20-nightly.2018.1.11+commit.0c20b6da
v0.4.20-nightly.2018.1.10+commit.a75d5333
v0.4.20-nightly.2018.1.6+commit.2548228b
v0.4.20-nightly.2018.1.5+commit.bca01f8f
v0.4.20-nightly.2018.1.4+commit.a0771691
v0.4.20-nightly.2017.12.20+commit.efc198d5
v0.4.20-nightly.2017.12.19+commit.2d800e67
v0.4.20-nightly.2017.12.18+commit.37b70e8e
v0.4.20-nightly.2017.12.14+commit.3d1830f3
v0.4.20-nightly.2017.12.13+commit.bfc54463
v0.4.20-nightly.2017.12.12+commit.1ddd4e2b
v0.4.20-nightly.2017.12.11+commit.4a1f18c9
v0.4.20-nightly.2017.12.8+commit.226bfe5b
v0.4.20-nightly.2017.12.6+commit.c2109436
v0.4.20-nightly.2017.12.5+commit.b47e023d
v0.4.20-nightly.2017.12.4+commit.240c79e6
v0.4.20-nightly.2017.12.1+commit.6d8d0393
v0.4.20-nightly.2017.11.30+commit.cb16a5d3
v0.4.19+commit.c4cbbb05
v0.4.19-nightly.2017.11.30+commit.f5a2508e
v0.4.19-nightly.2017.11.29+commit.7c69d88f
v0.4.19-nightly.2017.11.22+commit.f22ac8fc
v0.4.19-nightly.2017.11.21+commit.5c9e273d
v0.4.19-nightly.2017.11.17+commit.2b5ef806
v0.4.19-nightly.2017.11.16+commit.58e452d1
v0.4.19-nightly.2017.11.15+commit.e3206d8e
v0.4.19-nightly.2017.11.14+commit.bc39e730
v0.4.19-nightly.2017.11.13+commit.060b2c2b
v0.4.19-nightly.2017.11.11+commit.284c3839
v0.4.19-nightly.2017.10.29+commit.eb140bc6
v0.4.19-nightly.2017.10.28+commit.f9b24009
v0.4.19-nightly.2017.10.27+commit.1e085f85
v0.4.19-nightly.2017.10.26+commit.59d4dfbd
v0.4.19-nightly.2017.10.24+commit.1313e9d8
v0.4.19-nightly.2017.10.23+commit.dc6b1f02
v0.4.19-nightly.2017.10.20+commit.bdd2858b
v0.4.19-nightly.2017.10.19+commit.c58d9d2c
v0.4.19-nightly.2017.10.18+commit.f7ca2421
v0.4.18+commit.9cf6e910
v0.4.18-nightly.2017.10.18+commit.e854da1a
v0.4.18-nightly.2017.10.17+commit.8fbfd62d
v0.4.18-nightly.2017.10.16+commit.dbc8655b
v0.4.18-nightly.2017.10.15+commit.a74c9aef
v0.4.18-nightly.2017.10.10+commit.c35496bf
v0.4.18-nightly.2017.10.9+commit.6f832cac
v0.4.18-nightly.2017.10.6+commit.961f8746
v0.4.18-nightly.2017.10.5+commit.995b5525
v0.4.18-nightly.2017.10.4+commit.0c3888ab
v0.4.18-nightly.2017.10.3+commit.5c284589
v0.4.18-nightly.2017.10.2+commit.c6161030
v0.4.18-nightly.2017.9.29+commit.b9218468
v0.4.18-nightly.2017.9.28+commit.4d01d086
v0.4.18-nightly.2017.9.27+commit.809d5ce1
v0.4.18-nightly.2017.9.26+commit.eb5a6aac
v0.4.18-nightly.2017.9.25+commit.a72237f2
v0.4.18-nightly.2017.9.22+commit.a2a58789
v0.4.17+commit.bdeb9e52
v0.4.17-nightly.2017.9.21+commit.725b4fc2
v0.4.17-nightly.2017.9.20+commit.c0b3e5b0
v0.4.17-nightly.2017.9.19+commit.1fc71bd7
v0.4.17-nightly.2017.9.18+commit.c289fd3d
v0.4.17-nightly.2017.9.16+commit.a0d17172
v0.4.17-nightly.2017.9.14+commit.7dd372ce
v0.4.17-nightly.2017.9.12+commit.4770f8f4
v0.4.17-nightly.2017.9.11+commit.fbe24da1
v0.4.17-nightly.2017.9.6+commit.59223061
v0.4.17-nightly.2017.9.5+commit.f242331c
v0.4.17-nightly.2017.9.4+commit.8283f836
v0.4.17-nightly.2017.8.31+commit.402d6e71
v0.4.17-nightly.2017.8.29+commit.2d39a42d
v0.4.17-nightly.2017.8.28+commit.d15cde2a
v0.4.17-nightly.2017.8.25+commit.e945f458
v0.4.17-nightly.2017.8.24+commit.012d9f79
v0.4.16+commit.d7661dd9
v0.4.16-nightly.2017.8.24+commit.78c2dcac
v0.4.16-nightly.2017.8.23+commit.c5f11d93
v0.4.16-nightly.2017.8.22+commit.f874fc28
v0.4.16-nightly.2017.8.21+commit.0cf60488
v0.4.16-nightly.2017.8.16+commit.83561e13
v0.4.16-nightly.2017.8.15+commit.dca1f45c
v0.4.16-nightly.2017.8.14+commit.4d9790b6
v0.4.16-nightly.2017.8.11+commit.c84de7fa
v0.4.16-nightly.2017.8.10+commit.41e3cbe0
v0.4.16-nightly.2017.8.9+commit.81887bc7
v0.4.15+commit.bbb8e64f
v0.4.15+commit.8b45bddb
v0.4.15-nightly.2017.8.8+commit.41e72436
v0.4.15-nightly.2017.8.7+commit.212454a9
v0.4.15-nightly.2017.8.4+commit.e48730fe
v0.4.15-nightly.2017.8.2+commit.04166ce1
v0.4.15-nightly.2017.8.1+commit.7e07eb6e
v0.4.15-nightly.2017.7.31+commit.93f90eb2
v0.4.14+commit.c2215d46
v0.4.14-nightly.2017.7.31+commit.22326189
v0.4.14-nightly.2017.7.28+commit.7e40def6
v0.4.14-nightly.2017.7.26+commit.0d701c94
v0.4.14-nightly.2017.7.25+commit.3c2b710b
v0.4.14-nightly.2017.7.24+commit.cfb11ff7
v0.4.14-nightly.2017.7.21+commit.75b48616
v0.4.14-nightly.2017.7.20+commit.d70974ea
v0.4.14-nightly.2017.7.19+commit.3ad326be
v0.4.14-nightly.2017.7.18+commit.c167a31b
v0.4.14-nightly.2017.7.14+commit.7c97546f
v0.4.14-nightly.2017.7.13+commit.2b33e0bc
v0.4.14-nightly.2017.7.12+commit.b981ef20
v0.4.14-nightly.2017.7.11+commit.0b17ff1b
v0.4.14-nightly.2017.7.10+commit.6fa5d47f
v0.4.14-nightly.2017.7.9+commit.aafcc360
v0.4.14-nightly.2017.7.8+commit.7d1ddfc6
v0.4.14-nightly.2017.7.6+commit.08dade9f
v0.4.13+commit.0fb4cb1a
v0.4.13-nightly.2017.7.6+commit.40d4ee49
v0.4.13-nightly.2017.7.5+commit.2b505e7a
v0.4.13-nightly.2017.7.4+commit.331b0b1c
v0.4.13-nightly.2017.7.3+commit.6e4e627b
v0.4.12+commit.194ff033
v0.4.12-nightly.2017.7.3+commit.0c7530a8
v0.4.12-nightly.2017.7.1+commit.06f8949f
v0.4.12-nightly.2017.6.30+commit.568e7520
v0.4.12-nightly.2017.6.29+commit.f5372cda
v0.4.12-nightly.2017.6.28+commit.e19c4125
v0.4.12-nightly.2017.6.27+commit.bc31d496
v0.4.12-nightly.2017.6.26+commit.f8794892
v0.4.12-nightly.2017.6.25+commit.29b8cdb5
v0.4.12-nightly.2017.6.23+commit.793f05fa
v0.4.12-nightly.2017.6.22+commit.1c54ce2a
v0.4.12-nightly.2017.6.21+commit.ac977cdf
v0.4.12-nightly.2017.6.20+commit.cb5f2f90
v0.4.12-nightly.2017.6.19+commit.0c75afb2
v0.4.12-nightly.2017.6.16+commit.17de4a07
v0.4.12-nightly.2017.6.15+commit.71fea1e3
v0.4.12-nightly.2017.6.14+commit.43cfab70
v0.4.12-nightly.2017.6.13+commit.0c8c2091
v0.4.12-nightly.2017.6.12+commit.496c2a20
v0.4.12-nightly.2017.6.9+commit.76667fed
v0.4.12-nightly.2017.6.8+commit.51fcfbcf
v0.4.12-nightly.2017.6.6+commit.243e389f
v0.4.12-nightly.2017.6.1+commit.96de7a83
v0.4.12-nightly.2017.5.30+commit.254b5572
v0.4.12-nightly.2017.5.29+commit.4a5dc6a4
v0.4.12-nightly.2017.5.26+commit.e43ff797
v0.4.12-nightly.2017.5.24+commit.cf639f48
v0.4.12-nightly.2017.5.23+commit.14b22150
v0.4.12-nightly.2017.5.22+commit.e3af0640
v0.4.12-nightly.2017.5.19+commit.982f6613
v0.4.12-nightly.2017.5.18+commit.6f9428e9
v0.4.12-nightly.2017.5.17+commit.b4c6877a
v0.4.12-nightly.2017.5.16+commit.2ba87fe8
v0.4.12-nightly.2017.5.11+commit.242e4318
v0.4.12-nightly.2017.5.10+commit.a6586f75
v0.4.12-nightly.2017.5.6+commit.822c9057
v0.4.12-nightly.2017.5.5+commit.0582fcb9
v0.4.12-nightly.2017.5.4+commit.025b32d9
v0.4.11+commit.68ef5810
v0.4.11-nightly.2017.5.3+commit.1aa0f77a
v0.4.11-nightly.2017.5.2+commit.5aeb6352
v0.4.11-nightly.2017.4.28+commit.f33614e1
v0.4.11-nightly.2017.4.27+commit.abe77f48
v0.4.11-nightly.2017.4.26+commit.3cbdf6d4
v0.4.11-nightly.2017.4.25+commit.c3b839ca
v0.4.11-nightly.2017.4.24+commit.a9f42157
v0.4.11-nightly.2017.4.22+commit.aa441668
v0.4.11-nightly.2017.4.21+commit.e3eea9fc
v0.4.11-nightly.2017.4.20+commit.6468955f
v0.4.11-nightly.2017.4.18+commit.82628a80
v0.4.11-nightly.2017.4.13+commit.138c952a
v0.4.11-nightly.2017.4.10+commit.9fe20650
v0.4.11-nightly.2017.3.29+commit.fefb3fad
v0.4.11-nightly.2017.3.28+commit.215184ef
v0.4.11-nightly.2017.3.27+commit.9d769a56
v0.4.11-nightly.2017.3.22+commit.74d7c513
v0.4.11-nightly.2017.3.21+commit.6fb27dee
v0.4.11-nightly.2017.3.20+commit.57bc763e
v0.4.11-nightly.2017.3.17+commit.2f2ad42c
v0.4.11-nightly.2017.3.16+commit.a2eb2c0a
v0.4.11-nightly.2017.3.15+commit.0157b86c
v0.4.10+commit.9e8cc01b
v0.4.10-nightly.2017.3.15+commit.d134fda0
v0.4.10-nightly.2017.3.14+commit.409eb9e3
v0.4.10-nightly.2017.3.13+commit.9aab3b86
v0.4.10-nightly.2017.3.10+commit.f1dd79c7
v0.4.10-nightly.2017.3.9+commit.b22369d5
v0.4.10-nightly.2017.3.8+commit.a1e350a4
v0.4.10-nightly.2017.3.2+commit.5c411b47
v0.4.10-nightly.2017.3.1+commit.6ac2c15c
v0.4.10-nightly.2017.2.24+commit.6bbba106
v0.4.10-nightly.2017.2.22+commit.0b67fee3
v0.4.10-nightly.2017.2.20+commit.32b7d174
v0.4.10-nightly.2017.2.17+commit.419ab926
v0.4.10-nightly.2017.2.16+commit.0ad8e534
v0.4.10-nightly.2017.2.15+commit.ad751bd3
v0.4.10-nightly.2017.2.14+commit.91d5515c
v0.4.10-nightly.2017.2.13+commit.8357bdad
v0.4.10-nightly.2017.2.3+commit.5ce79609
v0.4.10-nightly.2017.2.2+commit.8f9839c6
v0.4.10-nightly.2017.2.1+commit.c1a675da
v0.4.10-nightly.2017.1.31+commit.747db75a
v0.4.9+commit.364da425
v0.4.9-nightly.2017.1.31+commit.f9af2de0
v0.4.9-nightly.2017.1.30+commit.edd3696d
v0.4.9-nightly.2017.1.27+commit.1774e087
v0.4.9-nightly.2017.1.26+commit.2122d2d7
v0.4.9-nightly.2017.1.24+commit.b52a6040
v0.4.9-nightly.2017.1.23+commit.6946902c
v0.4.9-nightly.2017.1.20+commit.12b002b3
v0.4.9-nightly.2017.1.19+commit.09403dd5
v0.4.9-nightly.2017.1.18+commit.005e1908
v0.4.9-nightly.2017.1.17+commit.6ecb4aa3
v0.4.9-nightly.2017.1.16+commit.79e5772b
v0.4.9-nightly.2017.1.13+commit.392ef5f4
v0.4.8+commit.60cc1668
v0.4.8-nightly.2017.1.13+commit.bde0b406
v0.4.8-nightly.2017.1.12+commit.b983c749
v0.4.8-nightly.2017.1.11+commit.4f5da2ea
v0.4.8-nightly.2017.1.10+commit.26a90af4
v0.4.8-nightly.2017.1.9+commit.354a10be
v0.4.8-nightly.2017.1.6+commit.a4d7a590
v0.4.8-nightly.2017.1.5+commit.0031e6a5
v0.4.8-nightly.2017.1.3+commit.43a5d11f
v0.4.8-nightly.2017.1.2+commit.75a596ab
v0.4.8-nightly.2016.12.16+commit.af8bc1c9
v0.4.7+commit.822622cf
v0.4.7-nightly.2016.12.15+commit.688841ae
v0.4.7-nightly.2016.12.14+commit.e53d1255
v0.4.7-nightly.2016.12.13+commit.9d607345
v0.4.7-nightly.2016.12.12+commit.e53fdb49
v0.4.7-nightly.2016.12.11+commit.84d4f3da
v0.4.7-nightly.2016.12.8+commit.89771a44
v0.4.7-nightly.2016.12.7+commit.fd7561ed
v0.4.7-nightly.2016.12.6+commit.b201e148
v0.4.7-nightly.2016.12.5+commit.34327c5d
v0.4.7-nightly.2016.12.3+commit.9be2fb12
v0.4.7-nightly.2016.12.2+commit.3a01a87a
v0.4.7-nightly.2016.12.1+commit.67f274f6
v0.4.7-nightly.2016.11.30+commit.e43a8ebc
v0.4.7-nightly.2016.11.29+commit.071cbc4a
v0.4.7-nightly.2016.11.28+commit.dadb4818
v0.4.7-nightly.2016.11.26+commit.4a67a286
v0.4.7-nightly.2016.11.25+commit.ba94b0ae
v0.4.7-nightly.2016.11.24+commit.851f8576
v0.4.7-nightly.2016.11.23+commit.475009b9
v0.4.7-nightly.2016.11.22+commit.1a205ebf
v0.4.6+commit.2dabbdf0
v0.4.6-nightly.2016.11.22+commit.3d9a180c
v0.4.6-nightly.2016.11.21+commit.aa48008c
v0.4.5+commit.b318366e
v0.4.5-nightly.2016.11.21+commit.afda210a
v0.4.5-nightly.2016.11.17+commit.b46a14f4
v0.4.5-nightly.2016.11.16+commit.c8116918
v0.4.5-nightly.2016.11.15+commit.c1b1efaf
v0.4.5-nightly.2016.11.14+commit.4f546e65
v0.4.5-nightly.2016.11.11+commit.6248e92d
v0.4.5-nightly.2016.11.10+commit.a40dcfef
v0.4.5-nightly.2016.11.9+commit.c82acfd3
v0.4.5-nightly.2016.11.8+commit.7a30e8cf
v0.4.5-nightly.2016.11.4+commit.d97d267a
v0.4.5-nightly.2016.11.3+commit.90a4acc3
v0.4.5-nightly.2016.11.1+commit.9cb1d30e
v0.4.4+commit.4633f3de
v0.4.4-nightly.2016.10.31+commit.1d3460c4
v0.4.4-nightly.2016.10.28+commit.e85390cc
v0.4.4-nightly.2016.10.27+commit.76e958f6
v0.4.4-nightly.2016.10.26+commit.34e2209b
v0.4.4-nightly.2016.10.25+commit.f99a418b
v0.4.3+commit.2353da71
v0.4.3-nightly.2016.10.25+commit.d190f016
v0.4.3-nightly.2016.10.24+commit.84b43b91
v0.4.3-nightly.2016.10.21+commit.984b8ac1
v0.4.3-nightly.2016.10.20+commit.9d304501
v0.4.3-nightly.2016.10.19+commit.0fd6f2b5
v0.4.3-nightly.2016.10.18+commit.0a9eb645
v0.4.3-nightly.2016.10.17+commit.07d32937
v0.4.3-nightly.2016.10.15+commit.482807f6
v0.4.3-nightly.2016.10.14+commit.0635b6e0
v0.4.3-nightly.2016.10.13+commit.2951c1eb
v0.4.3-nightly.2016.10.12+commit.def3f3ea
v0.4.3-nightly.2016.10.11+commit.aa18a6bd
v0.4.3-nightly.2016.10.10+commit.119bd4ad
v0.4.3-nightly.2016.9.30+commit.d5cfb17b
v0.4.2+commit.af6afb04
v0.4.2-nightly.2016.9.17+commit.212e0160
v0.4.2-nightly.2016.9.15+commit.6a80511f
v0.4.2-nightly.2016.9.13+commit.2bee7e91
v0.4.2-nightly.2016.9.12+commit.149dba9b
v0.4.2-nightly.2016.9.9+commit.51a98ab8
v0.4.1+commit.4fc6fc2c
v0.4.1-nightly.2016.9.9+commit.79867f49
v0.4.0+commit.acd334c9
The compiler version is specified in
pragma solidity X.X.X
. Use the compiler version rather than the nightly build. If using the Solidity compiler, run
solc —version
to check.
EVM Version
homestead
tangerineWhistle
spuriousDragon
byzantium
constantinople
petersburg
istanbul
berlin
london
paris
shanghai
cancun
default
The EVM version the contract is written for. If the bytecode does not match the version, we try to verify using the latest EVM version.
EVM version details
.
Optimization
No
Yes
If you enabled optimization during compilation, select yes.
Optimization runs
Enter the Solidity Contract Code
// Sources flattened with hardhat v2.19.2 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol@v4.9.5 // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol@v4.9.5 // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol@v4.9.5 // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol@v4.9.5 // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol@v4.9.5 // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol@v4.9.5 // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20PermitUpgradeable { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol@v4.9.5 // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File @openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol@v4.9.5 // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using AddressUpgradeable for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20Upgradeable token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20PermitUpgradeable token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20Upgradeable token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && AddressUpgradeable.isContract(address(token)); } } // File @openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol@v4.9.5 // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File contracts/Staking/Staking.sol // Original license: SPDX_License_Identifier: MIT pragma solidity =0.8.18; /** * @title Staking * @author gotbit * @notice Contract for staking tokens in order to earn rewards. * Any user can make multiple stakes. Reward earn period is practically unlimited. */ contract Staking is OwnableUpgradeable, PausableUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; // TYPES struct Stake { uint256 id; uint256 amount; uint256 earned; uint256 claimed; uint256 userRewardPerTokenPaid; address owner; uint32 timestamp; uint32 unstakedAtBlockNumber; uint32 unstakedAtBlockTimestamp; } // CONSTANTS uint256 public constant ACCURACY = 1e18; uint256 public constant TREASURY_STAKE_AMOUNT = 1; // 1 wei (to simplify calculations) uint256 public constant MIN_REWARDS_DURATION = 1 minutes; // 1 min uint256 public constant MAX_STAKE = 10 ** 30; // reward rate will not fall into overflow // even if reward is being added during 1000 min possible reward periods in a row uint256 public constant MAX_RATE = type(uint128).max / (1000 * MIN_REWARDS_DURATION); uint256 public constant MAX_REWARDS_DURATION = 10 * 365 days; // 10 years (to prevent overflow) // STATE VARIABLES IERC20Upgradeable public stakingToken; IERC20Upgradeable public rewardToken; uint128 public rewardRate; uint128 public rewardsRemaining; uint256 public rewardPerTokenStored; uint64 public periodFinish; // rewardsDuration is not always equal to periodFinish - periodStart uint64 public rewardsDuration; uint64 public lastUpdateTime; // variable for correct reward calculations in case of rewardsDuration changes uint64 public periodStart; // sum of all rewards distributed to users in all periods uint256 public cumulativeDistributedReward; // sum of claimed reawards in one current reward period uint256 public currentRewardPaid; // sum of claimed reawards in all reward periods uint256 public cumulativeRewardPaid; // sum of unused rewards by all users in all owner locks in the current period // unused reward is set = 0 in each notify uint256 public currentPeriodUnusedRewardsSum; uint256 public unusedRewardsExtracted; mapping(uint256 => Stake) public stakes; mapping(address => uint256[]) public userInactiveStakes; mapping(address => EnumerableSetUpgradeable.UintSet) private idsByUser; mapping(address => uint256) public userBalances; uint256 public globalId; // hide real total supply uint256 private totalSupplyInternal; // number of currenlty active stakes uint128 private numOfActiveStakesInternal; // first reward period creation timestamp uint128 public firstRewardPeriodStart; // active stake holder EnumerableSetUpgradeable.AddressSet private holders; bool public finished; // EVENTS event RewardAdded(uint256 reward); event Staked( address indexed user, uint256 indexed id, uint256 amount, uint256 totalSupply ); event Withdrawn( address indexed user, uint256 indexed id, uint256 amount, uint256 totalSupply ); event RewardPaid(address indexed user, uint256 indexed id, uint256 reward); event RewardsDurationUpdated(uint256 indexed newDuration); event Finished(address indexed recepient); event WithdrawnTokens(address indexed recepient, uint256 indexed amount); // FUNCTIONS constructor() { _disableInitializers(); } // external /// @notice Inits a new contract /// @param stakingToken_ staking token address /// @param rewardToken_ reward token address /// @param owner_ owner address function init( IERC20Upgradeable stakingToken_, IERC20Upgradeable rewardToken_, address owner_ ) external initializer { require(address(stakingToken_) != address(0), 'Invalid address'); require(address(rewardToken_) != address(0), 'Invalid address'); require(owner_ != address(0), 'Invalid address'); stakingToken = stakingToken_; rewardToken = rewardToken_; rewardsDuration = 365 days; _transferOwnership(owner_); } /// @dev Allows user to stake tokens /// @param amount of token to stake function stake(uint256 amount) external whenNotPaused { require(amount > 0, 'Cannot stake 0'); require(amount <= MAX_STAKE, 'Stake amount too high'); require(periodFinish > block.timestamp, 'Reward period not activated'); // if no active stakers were previously => unstake owner stake to stop accumulating unused rewards if (totalSupply() == 0) { // change stakes[0].earned _updateReward(0, true); (, uint256 unusedRewards) = _withdrawInternal(0, address(this)); currentPeriodUnusedRewardsSum += unusedRewards; } else { // do not change stakes[0] _updateReward(0, false); } // execute stake _stakeInternal(amount, msg.sender); emit Staked(msg.sender, globalId, amount, totalSupply()); stakingToken.safeTransferFrom(msg.sender, address(this), amount); } /// @dev Allows user to withdraw staked tokens + claim earned rewards /// @param id Stake id function withdraw(uint256 id) external { _updateReward(id, true); // CHANGE STATE & EXECUTE ALL CHECKS (uint256 amount, uint256 reward) = _withdrawInternal(id, msg.sender); // if no active stakers left => create a owner stake to accumulate unused rewards if (totalSupply() == 0) { _stakeInternal(TREASURY_STAKE_AMOUNT, address(this)); } emit Withdrawn(msg.sender, id, amount, totalSupply()); // ALL TOKENS TRANSFERS ------------------------------------------------------- // REWARDS emit RewardPaid(msg.sender, id, reward); if (reward != 0) { rewardToken.safeTransfer(msg.sender, reward); } // PRINCIPAL stakingToken.safeTransfer(msg.sender, amount); } /// @dev Allows user to claim earned rewards without unstaking the position /// @param id Stake id function claim(uint256 id) external { _updateReward(id, true); // CHANGE STATE & EXECUTE ALL CHECKS uint256 reward = _claimInternal(id, msg.sender); require(reward != 0, 'Nothing to claim'); // ALL TOKENS TRANSFERS ------------------------------------------------------- // REWARDS emit RewardPaid(msg.sender, id, reward); // reward != 0 due to technical design rewardToken.safeTransfer(msg.sender, reward); } /// @dev Allows owner to set new reward rate /// @param newRewardRate is amount of token weis will be distributed per second (rewards / rewardsDuration) function notifyRewardAmount(uint128 newRewardRate) external onlyOwner { _updateReward(0, false); _notifyRewardAmount(newRewardRate); } /// @dev Allows owner to set previous reward rate function notifyRewardAmountPrevious() external onlyOwner { _updateReward(0, false); uint128 rate = rewardRate; require(rate != 0, 'Previous reward rate is too low'); _notifyRewardAmount(rate); } /// @dev Allows owner to stop staking and extract extra liquidity /// @param recepient is the extra liquidity recepient function finish(address recepient) external onlyOwner { require(!finished, 'Finished'); require(recepient != address(0), 'Zero recepient'); uint256 periodFinishLocal = periodFinish; require( block.timestamp > periodFinishLocal && periodFinishLocal != 0, 'Only after period end' ); // lastTimeRewardApplicable == periodFinish (period is already over) uint256 previousPeriodRewardDuration = periodFinishLocal - periodStart; // no need to unstake owner stake (no active reward period + all rewards are counted in getUnusedRewards()) // update cumulative variables // use REAL previous period rewards duration here uint256 currentRewardDistributed = rewardRate * previousPeriodRewardDuration; cumulativeDistributedReward += currentRewardDistributed; cumulativeRewardPaid += currentRewardPaid; currentRewardPaid = 0; uint256 unusedReward = getUnusedRewards(); uint256 unclaimedReward = cumulativeDistributedReward - cumulativeRewardPaid - unusedReward - unusedRewardsExtracted; IERC20Upgradeable rewardTokenLocal = rewardToken; IERC20Upgradeable stakingTokenLocal = stakingToken; uint256 rewardTokenBalance = rewardTokenLocal.balanceOf(address(this)); uint256 stakingTokenBalance = stakingTokenLocal.balanceOf(address(this)); finished = true; // unusedRewards - from contract // unclaimed rewards - on contract emit Finished(recepient); if (rewardTokenLocal == stakingTokenLocal) { uint256 supply = totalSupply(); if (rewardTokenBalance - (supply + unclaimedReward) != 0) { rewardTokenLocal.safeTransfer( recepient, rewardTokenBalance - (supply + unclaimedReward) ); } } else { if (rewardTokenBalance - unclaimedReward != 0) { rewardTokenLocal.safeTransfer( recepient, rewardTokenBalance - unclaimedReward ); } uint256 supply = totalSupply(); if (stakingTokenBalance - supply != 0) { stakingTokenLocal.safeTransfer(recepient, stakingTokenBalance - supply); } } } /// @dev Allows owner to stop staking and extract extra liquidity /// @param recepient is the extra liquidity recepient function withdrawOtherTokens(address token, address recepient) external onlyOwner { require(token != address(0), 'Invalid token'); require(recepient != address(0), 'Zero recepient'); require(token != address(stakingToken), 'Token == staking token'); require(token != address(rewardToken), 'Token == reward token'); uint256 balance = IERC20Upgradeable(token).balanceOf(address(this)); require(balance != 0, 'Zero balance'); emit WithdrawnTokens(recepient, balance); IERC20Upgradeable(token).safeTransfer(recepient, balance); } /// @dev Allows owner to set period of rewards distribution /// @param rewardsDuration_ is new rewardsDuration amount function setRewardsDuration(uint64 rewardsDuration_) external onlyOwner { require(block.timestamp > periodFinish, 'Previous period not complete'); require( rewardsDuration_ >= MIN_REWARDS_DURATION, 'Rewards duration is too short' ); require(rewardsDuration_ <= MAX_REWARDS_DURATION, 'Rewards duration is too long'); require(rewardsDuration_ != rewardsDuration, 'Rewards duration duplicate'); rewardsDuration = rewardsDuration_; emit RewardsDurationUpdated(rewardsDuration_); } /// @dev Sets paused state for the contract (can be called by the owner only) /// @param state paused flag function setPaused(bool state) external onlyOwner { if (state) { _pause(); } else { _unpause(); } } // external view /// @dev Allows to view staking amount of selected user /// @param account to view balance /// @return balance of staking tokens for selected account function balanceOf(address account) external view returns (uint256) { return userBalances[account]; } /// @dev Allows to view user`s stake ids quantity /// @param user user account /// @return length of user ids array function getUserStakeIdsLength(address user) external view returns (uint256) { return idsByUser[user].length(); } /// @dev Allows to view if a user has a stake with specific id /// @param user user account /// @param id stake id /// @return bool flag (true if a user has owns the id) function hasStakeId(address user, uint256 id) external view returns (bool) { return idsByUser[user].contains(id); } /// @dev Allows to get a slice user stakes array /// @param user user account /// @param startIndex Starting index in user ids array /// @param length return array length /// @return Array-slice of user stakes function getUserStakesSlice( address user, uint256 startIndex, uint256 length ) external view returns (Stake[] memory) { require(length != 0, 'Zero length'); require( startIndex + length <= idsByUser[user].length(), 'Invalid startIndex + length' ); Stake[] memory userStakes = new Stake[](length); for (uint256 i; i < length; ) { uint256 stakeId = idsByUser[user].at(i + startIndex); userStakes[i] = stakes[stakeId]; userStakes[i].earned = earned(stakeId); unchecked { ++i; } } return userStakes; } /// @dev Allows to get a slice user stakes history array /// @param user user account /// @param startIndex Starting index in user ids array /// @param length return array length /// @return Array-slice of user stakes history function getUserInactiveStakesSlice( address user, uint256 startIndex, uint256 length ) external view returns (Stake[] memory) { require(length != 0, 'Zero length'); require( startIndex + length <= userInactiveStakes[user].length, 'Invalid startIndex + length' ); Stake[] memory userStakes = new Stake[](length); for (uint256 i; i < length; ) { uint256 stakeId = userInactiveStakes[user][i + startIndex]; userStakes[i] = stakes[stakeId]; unchecked { ++i; } } return userStakes; } /// @dev Allows to view user`s closed stakes quantity /// @param user user account /// @return length of user closed stakes array function getUserInactiveStakesLength(address user) external view returns (uint256) { return userInactiveStakes[user].length; } /// @dev Allows to view total cumulative unclaimed rewards (earned by all users) /// @return rewards (nominated in token weis) function getTotalRewards() external view returns (uint256) { if (totalSupply() != 0) { uint256 timePassed = lastTimeRewardApplicable() - periodStart; uint256 totalDistributedRewards = cumulativeDistributedReward; if (!finished) { totalDistributedRewards += rewardRate * timePassed; } uint256 totalClaimedRewards = cumulativeRewardPaid + currentRewardPaid; return totalDistributedRewards - totalClaimedRewards - getUnusedRewards() - unusedRewardsExtracted; } else { return 0; } } /// @dev Returns the approximate APR for a specific stake position not including penalties /// @return APR value multiplied by 10**18 function getPotentialAPR() external view returns (uint256) { uint256 _tvl = totalSupply(); if (_tvl == 0) return 0; // earned user value in tokens for one second including share (1e18 for accuracy) return (uint256(rewardRate) * ACCURACY * 365 days * 100) / (_tvl); } /// @dev Allows to view the number of stake holders /// @return length of stake holders array function getHoldersLength() external view returns (uint256) { return holders.length(); } /// @dev Allows to get a slice of stake holders array /// @param startIndex Starting index in stake holders array /// @param length return array length /// @return Array-slice of stake holders function getHoldersSlice( uint256 startIndex, uint256 length ) external view returns (address[] memory) { require(length != 0, 'Zero length'); require(startIndex + length <= holders.length(), 'Invalid startIndex + length'); address[] memory holdersArray = new address[](length); for (uint256 i = 0; i < length; ) { holdersArray[i] = holders.at(i + startIndex); unchecked { ++i; } } return holdersArray; } /// @notice Returns the number of currently active stakes /// @dev Excludes the number of owner`s active stakes /// @return numOfActiveStakesInternal - number of active stakes, made by users function numOfActiveStakes() external view returns (uint256) { return numOfActiveStakesInternal - idsByUser[address(this)].length(); } // public /// @notice Returns the user`s stakes total supply /// @dev Excludes reward owner stake supply /// @return totalSupplyInternal - total amount of staked tokens (in weis) function totalSupply() public view returns (uint256) { return totalSupplyInternal - userBalances[address(this)]; } /// @dev Allows to view last action time in the contract /// @return timestamp of last action function lastTimeRewardApplicable() public view returns (uint64) { return block.timestamp < periodFinish ? uint64(block.timestamp) : periodFinish; } /// @dev Allows to view already distributed rewards /// @return rewardPerTokenStored for current moment function rewardPerToken() public view returns (uint256) { uint256 totalSupplyInternalLocal = totalSupplyInternal; // can be == 0 before the first owner stake in made if (totalSupplyInternalLocal == 0) { return rewardPerTokenStored; } // can not overflow here, rewardRate * duration * ACCURACY <= uint128_max * 10 ** 18 << uint256 max return rewardPerTokenStored + (((lastTimeRewardApplicable() - lastUpdateTime) * uint256(rewardRate) * ACCURACY) / totalSupplyInternalLocal); } /// @dev Allows to view current user earned rewards /// @param id to view rewards /// @return earnedAmount of rewards for selected user function earned(uint256 id) public view returns (uint256) { Stake storage _stake = stakes[id]; if (_stake.unstakedAtBlockNumber == 0) { // ACTIVE STAKE => calculate amount + increase reward per token // can not overflow here, amount * (rewardRate * duration * ACCURACY / total supply) uint256 amount = _stake.amount; uint256 rewardPerTokenLocal = rewardPerToken(); uint256 rewardPerTokenPaid = _stake.userRewardPerTokenPaid; uint256 reward = uint256( (amount * (rewardPerTokenLocal - rewardPerTokenPaid)) / ACCURACY + _stake.earned ); return reward; } // INACTIVE STAKE return 0; } /// @notice Returns the amount of unused reward tokens /// @return reward tokens amount in weis function getUnusedRewards() public view returns (uint256) { // makes return amount always updated real time return earned(0) + currentPeriodUnusedRewardsSum; } // private /// @dev Allows to set reward rate /// @param newRewardRate is amount of token weis will be distributed per second (rewards / rewardsDuration) function _notifyRewardAmount(uint128 newRewardRate) private { require(!finished, 'Finished'); require(newRewardRate <= MAX_RATE, 'Reward rate too high'); // reward for the incoming period => use the new rewardsDuration uint64 rewardsDurationLocal = rewardsDuration; uint256 rewardRateOld = uint256(rewardRate); uint256 reward = uint256(newRewardRate) * uint256(rewardsDurationLocal); uint256 periodFinishOld = periodFinish; bool restakeOwnerPosition = true; if (firstRewardPeriodStart == 0) { // open owner stake in the first reward period (stake 1 wei to to accumulate unused rewards) _stakeInternal(TREASURY_STAKE_AMOUNT, address(this)); firstRewardPeriodStart = uint128(block.timestamp); restakeOwnerPosition = false; } // update cumulative variables // add rewards from teh previous period => use previous reward period start uint256 currentRewardDistributed = periodFinishOld == 0 ? 0 : rewardRateOld * (lastTimeRewardApplicable() - periodStart); cumulativeDistributedReward += currentRewardDistributed; cumulativeRewardPaid += currentRewardPaid; currentRewardPaid = 0; // update rate with the reward from the incoming period => use the updated rewards duration if (block.timestamp >= periodFinishOld) { // can not overflow here (MAX Numerator = Const * uint128_max * uint64), // Const < 100 <= num of reward periods, min period = 1 year rewardRate = uint128((reward + rewardsRemaining) / rewardsDurationLocal); // can not overfow here => MAX value = uint64_max - 1 rewardsRemaining = uint128( (reward + rewardsRemaining) % rewardsDurationLocal ); } else { uint64 remaining = uint64(periodFinishOld) - uint64(block.timestamp); uint256 leftover = remaining * rewardRateOld + rewardsRemaining; // can not overflow here (MAX Numerator = Const * uint128_max * uint64), // Const < 100 <= num of reward periods, min period = 1 year rewardRate = uint128((reward + leftover) / rewardsDurationLocal); // can not overfow here => MAX value = uint64_max - 1 rewardsRemaining = uint128((reward + leftover) % rewardsDurationLocal); } uint256 rewardRateNew = rewardRate; require(rewardRateNew != 0, 'Actual reward rate is too low'); // Ensure the provided reward amount is not more than the balance in the contract. // This keeps the reward rate in the right range, preventing overflows due to // very high values of rewardRate in the earned and rewardsPerToken functions; uint256 balance = address(rewardToken) == address(stakingToken) ? rewardToken.balanceOf(address(this)) - totalSupply() : rewardToken.balanceOf(address(this)); bool updateUnusedReward = (totalSupply() == 0); uint256 unusedReward = getUnusedRewards(); uint256 unclaimedReward = cumulativeDistributedReward - cumulativeRewardPaid - unusedReward - unusedRewardsExtracted; // unusedRewards are transferred to the owner in each notify currentPeriodUnusedRewardsSum = 0; // increase total unused rewards extracted after each period unusedRewardsExtracted += unusedReward; // if no active stakers were previously => unstake owner stake to stop accumulating unused rewards if (updateUnusedReward && restakeOwnerPosition) { _updateReward(0, true); // no update for cumulative unused reward here (already called getUnusedRewards() before, using earned()) _withdrawInternal(0, address(this)); } // Ensure the balance in the contract is more than the maximum reward + unclaimedRewards require( rewardRateNew * rewardsDurationLocal + unclaimedReward + unusedReward <= balance, 'Provided reward too high' ); lastUpdateTime = uint64(block.timestamp); periodFinish = uint64(block.timestamp) + rewardsDurationLocal; periodStart = uint64(block.timestamp); if (updateUnusedReward && restakeOwnerPosition) { _stakeInternal(TREASURY_STAKE_AMOUNT, address(this)); } if (unusedReward != 0) IERC20Upgradeable(rewardToken).safeTransfer(owner(), unusedReward); emit RewardAdded(reward); } /// @dev Internal function for staking tokens /// @param amount of token to stake function _stakeInternal(uint256 amount, address interractor) private { totalSupplyInternal += amount; ++numOfActiveStakesInternal; uint256 newId; if (interractor != address(this)) { newId = ++globalId; } // else owner stake => newId = 0 (not to affect other stakes) stakes[newId] = Stake({ id: newId, amount: amount, earned: 0, claimed: 0, userRewardPerTokenPaid: rewardPerTokenStored, owner: interractor, timestamp: uint32(block.timestamp), unstakedAtBlockNumber: 0, unstakedAtBlockTimestamp: 0 }); // add new holder if needed (address(this) should not be displayed in holders) if (userBalances[interractor] == 0 && interractor != address(this)) holders.add(interractor); userBalances[interractor] += amount; idsByUser[interractor].add(newId); } /// @dev Internal function for withdrawing staked tokens + claim earned rewards /// @param id Stake id /// @param interractor Address which is supposed to be the stake owner /// @return amount - principal token amount, reward - reward token amount function _withdrawInternal( uint256 id, address interractor ) private returns (uint256 amount, uint256 reward) { Stake storage _stake = stakes[id]; amount = _stake.amount; require(_stake.unstakedAtBlockNumber == 0, 'Already unstaked'); require(_stake.owner == interractor, 'Called not by stake owner'); totalSupplyInternal -= amount; userBalances[interractor] -= amount; --numOfActiveStakesInternal; // calculate the available rewards // increase the currentRewardPaid // earned = 0, increase claimed reward = _claimInternal(id, interractor); // address(this) should not be displayed in holders if (userBalances[interractor] == 0 && interractor != address(this)) holders.remove(interractor); idsByUser[interractor].remove(id); if (interractor != address(this)) userInactiveStakes[interractor].push(id); stakes[id].unstakedAtBlockNumber = uint32(block.number); stakes[id].unstakedAtBlockTimestamp = uint32(block.timestamp); } function _claimInternal( uint256 id, address interractor ) private returns (uint256 reward) { Stake storage _stake = stakes[id]; require(_stake.unstakedAtBlockNumber == 0, 'Already unstaked'); require(_stake.owner == interractor, 'Called not by stake owner'); // reward already updated reward = _stake.earned; if (reward != 0 && interractor != address(this)) { // CLAIM ALL EARNED REWARDS // update var only if claim by real user currentRewardPaid += reward; } if (reward != 0) { stakes[id].earned = 0; stakes[id].claimed += reward; } } /// @dev Update rewards pool information to correct rewards calculation for global varialbes and current stake /// @param id stake to update info for /// @param updateId flag, true when update stake struct function _updateReward(uint256 id, bool updateId) private { rewardPerTokenStored = rewardPerToken(); lastUpdateTime = lastTimeRewardApplicable(); if (updateId) { stakes[id].earned = earned(id); stakes[id].userRewardPerTokenPaid = rewardPerTokenStored; } } }
We recommend using flattened code. This is necessary if your code utilizes a library or inherits dependencies. Use the
POA solidity flattener or the
truffle flattener
.
Try to fetch constructor arguments automatically
No
Yes
ABI-encoded Constructor Arguments (if required by the contract)
Add arguments in
ABI hex encoded form
. Constructor arguments are written right to left, and will be found at the end of the input created bytecode. They may also be
parsed here.
Add Contract Libraries
Contract Libraries
Library 1 Name
A library name called in the .sol file. Multiple libraries (up to 10) may be added for each contract. Click the Add Library button to add an additional one.
Library 1 Address
The 0x library address. This can be found in the generated json file or Truffle output (if using truffle).
Library 2 Name
Library 2 Address
Library 3 Name
Library 3 Address
Library 4 Name
Library 4 Address
Library 5 Name
Library 5 Address
Library 6 Name
Library 6 Address
Library 7 Name
Library 7 Address
Library 8 Name
Library 8 Address
Library 9 Name
Library 9 Address
Library 10 Name
Library 10 Address
Add Library
Loading...
Verify & publish
Cancel
Ok
Ok
Ok
No
Yes