Skip to content

Commit

Permalink
New Asset System - Enable fee payment for CampaignAssets (#1289)
Browse files Browse the repository at this point in the history
* Merge release v0.4.2 (#1174)

* Update versions (#1168)

* Add updated weights from reference machine (#1169)

* Add license header

Co-authored-by: Chralt <[email protected]>

---------

Co-authored-by: Chralt <[email protected]>

* Remove migrations (#1180)

* Filter admin functions for main-net (#1190)

filter admin functions for main-net

* Add debug assertions for slashes and reserves (#1188)

* add debug assertions for missing slashes

* place debug_assert for unreserves

* Add some verify checks to court (#1187)

add some verify checks to court

* Bypass battery stations contracts call filter for court, parimutuel, order book markets (#1185)

update contracts call filter

* Fix failing court benchmark (#1191)

* fix court assertion for resolve_at

* remove unnecessary variable

* mirror mock and actual impl for DisputeResolution

* Implement trusted market close (#1184)

* implement trusted market close

* remove unnecessary benchmark helper function

* Update zrml/prediction-markets/src/lib.rs

Co-authored-by: Malte Kliemann <[email protected]>

* remove unnecessary function

* check market end

* check auto close

* add invalid market status test

---------

Co-authored-by: Malte Kliemann <[email protected]>

* Modify court events for indexer (#1182)

* modify events for indexer

* gracefully handle panicers

* handle binary search by key error

* improve style

* Ensure MinBetSize after fee (#1193)

* handle own existential deposit errors

* use require_transactional

* correct benchmark and test min bet size amounts

* Replace fixed math operations with traited versions (#1149)

* Replace `bmul` and `bdiv` with traited versions

* Restructure directories

* Replace `saturating_*` from neo-swaps

* Fix formatting

* Restructure zrml-swaps math

* Implement and test `b*`

* Fix formatting

* Use new math in orderbook-v1

* Replace checked multiplication with new math

* Use correct rounding in neo-swaps

* Add docs

* Update licenses

* Remove `fixed` module from `primitives`

* Fix formatting

* Update primitives/src/math/fixed.rs

Co-authored-by: Harald Heckmann <[email protected]>

---------

Co-authored-by: Harald Heckmann <[email protected]>

* Add env_logger and add force-debug feature (#1205)

* add env_logger and add force-debug feature

* taplo fmt, fix copyrights

* Update zrml/styx/src/mock.rs

Co-authored-by: Malte Kliemann <[email protected]>

* Update zrml/rikiddo/src/mock.rs

Co-authored-by: Malte Kliemann <[email protected]>

* update comment to clarify logging

---------

Co-authored-by: Malte Kliemann <[email protected]>

* Inflate defensively (#1195)

* inflate defensively

* add tests

* Update zrml/court/src/tests.rs

Co-authored-by: Malte Kliemann <[email protected]>

* fix test

* fix test name

---------

Co-authored-by: Malte Kliemann <[email protected]>

* Maintain order book (#1183)

* integrate market creator fees into orderbook

* edit tests

* update tests

* modify tests

* avoid order side

* Update primitives/src/traits/distribute_fees.rs

Co-authored-by: Malte Kliemann <[email protected]>

* remove asset and account from get_fee api call

* take base asset fees from fill_order

* adjust orderbook for taking fees in fill_order

* adjust without order side for fill_order

* adapt to avoid concept of order side

* adapt benchmarks, tests and weights, restructure

* use DispatchResult

* remove unused import

* do not adjust maker amount for place_order

* correct fuzz of orderbook

* check if maker_amount is zero

* fix order book name in benchmarks

* use remove instead of cancel order book

* correct order book test names

* update READMEs

* fmt

* add tests

* use minimum balance as min order size

* Update zrml/orderbook/README.md

Co-authored-by: Malte Kliemann <[email protected]>

* Update zrml/orderbook/README.md

Co-authored-by: Malte Kliemann <[email protected]>

* Apply suggestions from code review

Co-authored-by: Malte Kliemann <[email protected]>

* prettier orderbook md

* remove comments from benchmarks

* fix tests and benchmarks readibility

* use order book instead of orderbook

* clarify error message

* clarify comments

* rename is to ensure

* error for repatriate

* fix unnecessary clone

* correct mocks behaviour

* improve test

* improve test of near full fill error

* use turbofish syntax

* add filled_maker_amount to event

* split tests

* combine two functions, add docs

* abandon get_fees

* fix order book tests and mock

* remove check for impossible behaviour

* fix toml and benchs

* prepare migration

* add migration for order structure

* return zero fees if transfer fails

* delete unnecessary assert

* fix naming

* fix naming the second

* fix maker fill description

* add scoring rule check to remove order

* fix post_upgrade

* fix terminology

* Update zrml/orderbook/src/migrations.rs

Co-authored-by: Malte Kliemann <[email protected]>

* use storage root check in migration test

* Update zrml/orderbook/src/lib.rs

Co-authored-by: Harald Heckmann <[email protected]>

* Update zrml/orderbook/src/lib.rs

Co-authored-by: Harald Heckmann <[email protected]>

* Update zrml/orderbook/src/lib.rs

Co-authored-by: Harald Heckmann <[email protected]>

* delete debug_assert

---------

Co-authored-by: Malte Kliemann <[email protected]>
Co-authored-by: Harald Heckmann <[email protected]>

* Implement AMM 2.0 (#1173)

* Replace `bmul` and `bdiv` with traited versions

* Restructure directories

* Replace `saturating_*` from neo-swaps

* Fix formatting

* Restructure zrml-swaps math

* Implement and test `b*`

* Fix formatting

* Use new math in orderbook-v1

* Replace checked multiplication with new math

* Use correct rounding in neo-swaps

* Add docs

* Update licenses

* Remove `fixed` module from `primitives`

* Fix formatting

* .

* Rewrite math functions

* Remove training wheels

* Fix docs.pdf

* Fix quotes

* Add tests for buying

* Add tests for selling and improve error names

* Update docs

* Check adjusted amount in for numerical bounds

* Remove unused implementations

* Adjust docs

* Add stress test exploring various scenarios

* Add swap fees to stress test

* Add underscore separators

* Clean up

* Benchmark `buy` as function of `asset_count`

* Update benchmarks

* Clippy fix

* Fix benchmark tests

* Update benchmarks of zrml-prediction-markets

* Fix broken comment

* Add comment explaining benchmark spot prices

* Use clearer constants for `amount_in` in tests

* Update zrml/neo-swaps/src/traits/pool_operations.rs

Co-authored-by: Chralt <[email protected]>

* Fix botched merge

* Fix merge

* Update benchmarks

* Update zrml/neo-swaps/docs/docs.tex

Co-authored-by: Harald Heckmann <[email protected]>

* Apply suggestions from code review

Co-authored-by: Harald Heckmann <[email protected]>

* Rename `Fixed` and clean up

* Hotfix exponential function and extend tests

* Complete math test suite

* Fix broken sentence

* Remove unused imports

* Extend `ln` test cases

* Merge & fix formatting

---------

Co-authored-by: Chralt <[email protected]>
Co-authored-by: Harald Heckmann <[email protected]>

* Implement Liquidity Tree (#1178)

* Replace `bmul` and `bdiv` with traited versions

* Restructure directories

* Replace `saturating_*` from neo-swaps

* Fix formatting

* Restructure zrml-swaps math

* Implement and test `b*`

* Fix formatting

* Use new math in orderbook-v1

* Replace checked multiplication with new math

* Use correct rounding in neo-swaps

* Add docs

* Update licenses

* Remove `fixed` module from `primitives`

* Fix formatting

* Add liquidity tree draft

* Fix compiler error in draft

* Clean up `propagate_fees`

* Add docs

* Reorganize

* Clean up, add max iterations

* Remove migrations

* Prepare switch to bounded vector

* Use `BoundedVec`

* Use bounded `BTreeMap` and insert `LiquidityTree` into neo-swaps

* Resolve TODO

* Clean up tests

* Add migration and fix clippy errors

* Make tree depth a generic

* Make tree depth a config parameter

* Update runtime complexities

* Add benchmarking utilities

* Fix runtime complexity for `deploy_pool`

* Add missing lazy propagation

* Fix comment

* Fix error type

* Add `join` benchmarking and fix a bug in `LiquidityTree`

* Clean up benchmarks

* Fix clippy issues

* Remove unnecessary type hint

* Fix bugs in liquidity tree

* Fix comments

* Some fixes in benchmarks

* Implement `BenchmarkHelper`

* Update benchmarks to use the LT

* Clean up and format

* Add testing framework for liquidity trees

* Add first extensive test and fix a bug

* Add more tests

* Clean up test

* Add news tests and use better numerics for ratio calculations

* Make docs more explicit

* Add tests for `exit`

* Add tests for deposit fees

* Add tests for getters

* Clean up tests some more

* Finalize liquidity tree tests

* Clean up comments

* Introduce exit fees

* Rewrite `exit_works`

* Fix liquidity parameter calculation

* Make test a bit more complex

* Test liquidity shares

* Clean up tests

* Update test for destruction

* Enhance `exit_destroys_pool` test

* More cleanup

* Add test for full tree

* Add tests for `join`

* Improve test

* Test withdrawal

* Clean up the test

* Add test for noop

* Add minimum relative liquidity

* Verify that buys deduct the correct amount of fees

* Add last tests

* Add notes about the liquidity tree

* Fix benchmarks

* Fix clippy errors

* Fix benchmarks

* Do more work on benchmarks

* Fix benchmarks, deduce max tree depth

* Remove already solved TODO

* Document macros

* Remove TODO (not a good idea to edit LaTeX docs now)

* Fix `bmul_bdiv`

* Make `bmul_bdiv_*` not implemented

* Double-check that there's a non-zero check for `ratio`

* Fix formatting

* Fix taplo formatting

* Remove TODO

* Remove TODOs and fix documents

* Update primitives/src/math/fixed.rs

Co-authored-by: Chralt <[email protected]>

* Mark `SoloLp` as deprecated

* Update zrml/neo-swaps/README.md

Co-authored-by: Chralt <[email protected]>

* Make `bmul_bdiv` a little more idiomatic

* Update zrml/neo-swaps/README.md

Co-authored-by: Chralt <[email protected]>

* Update zrml/neo-swaps/README.md

Co-authored-by: Chralt <[email protected]>

* Update zrml/neo-swaps/README.md

Co-authored-by: Chralt <[email protected]>

* Update zrml/neo-swaps/README.md

Co-authored-by: Chralt <[email protected]>

* Update zrml/neo-swaps/README.md

Co-authored-by: Chralt <[email protected]>

* Update zrml/neo-swaps/README.md

Co-authored-by: Chralt <[email protected]>

* Update zrml/neo-swaps/README.md

Co-authored-by: Chralt <[email protected]>

* Rewrite and format `README.md`

* Fix comment about existential deposit

* Remove FIXME

* Add a check against misconfiguration of the pallet

* Fix field docstrings

* Add comment about `assert_ok_with_transaction`

* Update zrml/neo-swaps/src/mock.rs

Co-authored-by: Chralt <[email protected]>

* Format code

* Fix comment

* Prettify extrinsic calls in benchmarks

* Improve code quality of `assert_pool_state!`

* Extend comment about order of abandoned nodes

* Clarify the meaning of "leaf" in `is_leaf`

* Rename `index_maybe` to `opt_index`

* Add unexpected storage overflow error for bounded objects

* Rename `UnclaimedFees` to `UnwithdrawnFees`

* Fix documentation

* Use enum to signal update direction in `update_descendant_stake`

* Add verification to `join_*` benchmarks

* Improve documentation

* Use builtin log

* Remove illegal token from `README.md`

* Update zrml/neo-swaps/src/types/liquidity_tree.rs

Co-authored-by: Chralt <[email protected]>

* Fix unintentional doctest

* Improve `mutate_children`

* Add helpful comment

* Update zrml/neo-swaps/src/types/liquidity_tree.rs

Co-authored-by: Chralt <[email protected]>

* Fix migration

* Fix balances in parachain mock

* use PartialEqNoBound and CloneNoBound for tree

* Fix formatting

* Make `debug_assert!` more clear

* Redesign node assignment

* Clean up comments

* Add some storage overflow errors

* Introduce `LiquidityTreeChildIndices`

* Remove outdated docs

* Rename `update_descendant_stake`

* Remove `Default` usage

* Make liquidity tree types `pub(crate)` where possible

* Make all fields of `Node` only `pub(crate)`

* Make `Node<T>` an associated type of `LiquidityTreeHelper`

* Update zrml/neo-swaps/src/lib.rs

Co-authored-by: Harald Heckmann <[email protected]>

* Fix comment

* Update zrml/neo-swaps/src/types/liquidity_tree.rs

Co-authored-by: Harald Heckmann <[email protected]>

* Fix tests

* Prettify `path_to_node`

* Add max iterations to `path_to_node`

* Add test for complex liquidity tree interactions

* Improve documentation of `LiquidityTreeChildIndices`

* Reorganize crate structure

* Update weights and fix formatting

---------

Co-authored-by: Chralt <[email protected]>
Co-authored-by: Chralt98 <[email protected]>
Co-authored-by: Harald Heckmann <[email protected]>

* Improve XCM fee handling (#1225)

* Fix padding of foreign fees in Zeitgeist runtime

* Fix padding of foreign fees in Battery Station runtime

* Format

* Update copyright

* Use adjusted_balance function

* Remove court and global disputes from call filter for the main-net (#1226)

* remove from call filter

* update copyright

* Sunset old AMMs and their pools (#1197)

* Replace `bmul` and `bdiv` with traited versions

* Restructure directories

* Replace `saturating_*` from neo-swaps

* Fix formatting

* Restructure zrml-swaps math

* Implement and test `b*`

* Fix formatting

* Use new math in orderbook-v1

* Replace checked multiplication with new math

* Use correct rounding in neo-swaps

* Add docs

* Update licenses

* Remove `fixed` module from `primitives`

* Fix formatting

* .

* Rewrite math functions

* Remove training wheels

* Fix docs.pdf

* Fix quotes

* Add tests for buying

* Add tests for selling and improve error names

* Update docs

* Check adjusted amount in for numerical bounds

* Remove unused implementations

* Adjust docs

* Add stress test exploring various scenarios

* Add swap fees to stress test

* Add underscore separators

* Clean up

* Benchmark `buy` as function of `asset_count`

* Update benchmarks

* Clippy fix

* Fix benchmark tests

* Update benchmarks of zrml-prediction-markets

* Fix broken comment

* Add comment explaining benchmark spot prices

* Use clearer constants for `amount_in` in tests

* Update zrml/neo-swaps/src/traits/pool_operations.rs

Co-authored-by: Chralt <[email protected]>

* Fix botched merge

* Fix merge

* Update benchmarks

* Remove `pool_*_subsidy`

* Remove `distribute_pool_share_rewards`

* Remove `end_subsidy_phase`

* Remove `destroy_pool_in_subsidy_phase`

* Remove `MinSubsidy*`

* Remove `SubsidyProviders`

* Remove `start_subsidy`

* Rewrite `create_pool`

* Rewrite `swap_exact_amount_in`

* Rewrite `swap_exact_amount_out`

* Rewrite utility functions

* Remove Rikiddo from weight calculation

* Remove Rikiddo from zrml-swaps

* Remove unused errors

* Remove `ScoringRule::Rikiddo...`

* Remove `*SubsidyPeriod`

* Remove Rikiddo-related storage and events

* Remove automatic opening of pools

* Remove `open_pool` from prediction-markets

* Remove `Swaps::close_pool` from prediction-markets

* Remove `clean_up_pool` from prediction-markets

* Remove `clean_up_pool` from `Swaps` trait

* Remove CPMM deployment from prediction-markets

* Remove automatic arbitrage

* Move `market_account` back to prediction-markets

* Remove unused market states

* Fix fuzz tests

* Implement market migration

* Minor changes

* Fix migration behavior

* Remove creator fees from swaps

* Fix try-runtime

* Fix clippy issues

* Remove `LiquidityMining` from swaps

* Fix `get_spot_prices`

* Take first step to remove `MarketCommons` from swaps

* Remove `MarketCommons` from swaps

* Rewrite `PoolStatus`

* Move `Pool*` to swaps

* Use `Bounded*` types in `Pool`

* Finish swaps migration

* Add missing files

* Fix formatting and clippy errors

* Remove `pool_status.rs`

* Ignore doctests

* Fix fuzz tests

* Add prediciton-markets migration

* Test prediction-markets migration

* Finish tests of the market-commons migration

* Add migrations to runtime and fix various errors

* Clean up

* Clean up

* Format code

* Fix pool migration behavior

* Remove `MarketId` from swaps

* Fix formatting

* Fix formatting

* Remove `CPMM` and allow other scoring rules on Battery Station

* Update macros/Cargo.toml

Co-authored-by: Harald Heckmann <[email protected]>

* Update primitives/src/traits/zeitgeist_asset.rs

Co-authored-by: Harald Heckmann <[email protected]>

* Update zrml/market-commons/src/migrations.rs

Co-authored-by: Harald Heckmann <[email protected]>

* Update zrml/swaps/src/migrations.rs

Co-authored-by: Harald Heckmann <[email protected]>

* Update zrml/swaps/src/migrations.rs

Co-authored-by: Harald Heckmann <[email protected]>

* Update zrml/prediction-markets/src/migrations.rs

Co-authored-by: Harald Heckmann <[email protected]>

* Update zrml/market-commons/src/migrations.rs

Co-authored-by: Harald Heckmann <[email protected]>

* Clean up TODOs/FIXMEs

* Update changelog

* Make more changes to changelog

* Clear zrml-swaps storage

* Remove cfg-if dependency

* Fix formatting

* Trigger CI

* Update copyright notices

* Update docs/changelog_for_devs.md

Co-authored-by: Chralt <[email protected]>

* Make benchmark helper only available if feature flags are set

* Remove `ZeitgeistAsset` trait

* Remove preliminary benchmarks with more steps

* Format code

* Fix copyright notice

---------

Co-authored-by: Chralt <[email protected]>
Co-authored-by: Harald Heckmann <[email protected]>

* Merge release v0.4.3 (#1211)

* Use hotfixed `exp`

* Reorganize tests

* Fix formatting

* Bump versions to v0.4.3

* Update spec versions

* Add missing version bumps

* Format

* Update licenses

---------

Co-authored-by: Malte Kliemann <[email protected]>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Reduce `market_status_manager` aka `on_initialize` iterations (#1160)

* remove dangerous loop

* limit iterations of dangerous loop

* reintegrate last time frame storage item

* wip

* benchmark manual close and open

* fix stall test

* emit event and log for recovery time frame

* add tests

* add trailing comma

* Update zrml/prediction-markets/src/benchmarks.rs

Co-authored-by: Malte Kliemann <[email protected]>

* change should_be_closed condition

* Apply suggestions from code review

Co-authored-by: Malte Kliemann <[email protected]>

* change recursion limit line

* regard period not started yet

* add error tests

* correct benchmarks

* fix after merge and clippy

* use turbofish, add test checks

* remove manually open broken market

* correct errors and call index

* correct wrong error name

* correct position of call index

* correct error position

* update copyrights

* fix after merge

* Update zrml/prediction-markets/src/benchmarks.rs

Co-authored-by: Malte Kliemann <[email protected]>

* set market end for manual close

---------

Co-authored-by: Malte Kliemann <[email protected]>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Update style guide to streamline reviews (#1228)

* Reduce benchmark runs of Zeitgeist pallets (#1233)

Reduce bencharm runs of Zeitgeist pallets

Running benchmarks of Zeitgeist pallets on the Zeitgeist reference machine currently takes four days.

* Set inflation to more than zero for a full benchmark of handle_inflation (#1234)

Update benchmarks.rs

* Implement `force_pool_exit` and disable other zrml-swaps functions (#1235)

* Abstract `pool_exit` business logic into `do_*` function

* Add `force_pool_exit` and test

* Install call filters for zrml-swaps

* Implement and test `bmul_bdiv_*`; use in zrml-orderbook and zrml-parimutuel  (#1223)

* Implement and test `bmul_bdiv_*`

* Use `bmul_bdiv_*` in pallets

* Update copyright

* Utilize Merigify's Merge Queue (#1243)

ci(Mergify): configuration update

Signed-off-by: Harald Heckmann <[email protected]>

* Set in-progress when needed and rerun CI in merge queue (#1244)

* Set in-progress when need and rerun CI in merge queue

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Avoid mergify dequeue (#1245)

* Avoid mergify deque

* Set review needed only shortly after Mergify commit

* Extend neo-swaps tests and clean up `math.rs` (#1238)

* Add tests to neo-swaps that check large buy/sell amounts at high liquidity

* Use new implementation of HydraDX's `exp`

* Add failure tests to neo-swaps's `math.rs`

* Fix formatting

* Update copyright notices

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Remove migrations and dead code (#1241)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Reorganize prediction-market tests (#1242)

* Rename `tests.rs` to `old_tests.rs` to avoid naming conflicts

* Move `buy_complete_set` tests to new tests

* Clean up `buy_complete_set` tests

* Extract `sell_complete_set_tests`

* Clean up `sell_complete_set` tests

* Extract `admin_move_market_to_closed` tests

* Extract `create_market` tests

* Extract `admin_move_market_to_resolved` tests

* Remove superfluous test

* Extract more `create_market` tests

* Extract `approve_market` tests

* Extract `edit_market` tests

* Extract `edit_market` tests

* Add `on_market_close` tests

* Extract `manually_close_market` tests

* Extract `on_initialize` tests

* Extract `report` tests

* Extract `dispute` tests

* Extract `schedule_early_close` tests

* Extract `dispute_early_close` tests

* Extract `reject_early_close` tests

* Extract more `dispute` tests

* Extract `close_trusted_market` tests

* Extract `start_global_dispute` tests

* Extract `redeem_shares` tests and add missing tests

* Extract `on_resolution` and additional `redeem_shares` tests

* Move integration tests into new test module

* Automatically set block to `1` at the start of test

* Replace `crate::Config` with `Config`

* Access constant through `Config`

* Add TODOs for missing execution paths

* Fix formatting

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Improve fee payment management (#1246)

* Improve fee payment management

* Make code compileable

* Do not remit TX fees for redeem_shares

Co-authored-by: Malte Kliemann <[email protected]>

---------

Co-authored-by: Malte Kliemann <[email protected]>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Fix Rust and Discord badge (#1247)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Fix neo-swaps doc strings (#1250)

* Improve `SellExecuted` documentation

* Clean up math in comments and doc strings

* Fix formatting

* Adjust style guide (loops) and add unreachable macro (#1252)

* Adjust style guide (loops) and add unreachable macro

* Add macros module to lib.rs

* Update docs/STYLE_GUIDE.md

Co-authored-by: Malte Kliemann <[email protected]>

* Move macro to zeitgeist-macros and add examples

---------

Co-authored-by: Malte Kliemann <[email protected]>

* Merge Old* and New* asset variants

* Partially integrate lazy migration routing

* Integrate lazy migration routing

* Fix ExistentialDeposit mapping & Satisfy Clippy

* Remove primitives/macros

* Filter certain asset destroy calls (they're managed)

* Integrate asset destruction into prediction markets

* Add BaseAssetClass

* Update prediction-markets & market-commons

* Update authorized

* Update liquidity-mining

* Update simple-disputes

* Update parimutuels (wip)

* Move functions into market struct and properly delete assets

* Add ParimutuelAssetClass

* Add parimutuel.rs

* Remove duplicate code

* Adjust asset type and managed destroy after refund in parimutuels

* Add MarketTransitionApi

This will allow prediction-markets to signal other pallets that state transitions happened

* Add MarketTransitionApi

* Implement MarketTransitionApi for Parimutuels

* Partially implement asset creation/destruction in parimutuels

* Add all asset creation / destruction tests to parimutuels

* Adjust Court

* Update global-disputes

* Update swaps

* Update neo-swaps

* Integrate OnStateTransition hooks into prediction-markets

* Use proper state transition weights

* Make cargo check succeed

* Partially update orderbook

* Update orderbook

* Update orderbook

* Finalize orderbook update

* Improve style

* Add XcmAssetClass

* Add sub asset classes, extend Market, provide market transition trait

* Update asset-router

* Integrate asset system into prediction-market, market-commons and parimutuel

- Market commons now uses the BaseAsset class for base assets
- Prediction markets now creates and destroys MarketAssets only if market.is_redeemable
- Prediction markets now calls OnStateTransition when transitioning it's state
- Parimutuel markets now implements StateTransitionApi
- Parimutuel markets now properly creates and destroys ParimutuelShares

* Implement support for non-reservable assets in orderbook

* Integrate new asset system into Battery Station XCM

* Integrate new asset system into Zeitgeist XCM

* Implement Unbalanced for asset-router

* Enable fee payment for campaign assets

* Fix conditional import

* Format

* Fix unfillable / unremovable order bug

Co-authored-by: Chralt <[email protected]>

* Add tests for Unbalanced impl

* Implement fee charging tests

* Undo unnecessray change

* Undo last commit

* Better case-distinction and explicitly drop campaign asset fee

Co-authored-by: Chralt <[email protected]>

* Use is_foreign_asset()

* Avoid panic

* Format

* Fix CI

---------

Signed-off-by: Harald Heckmann <[email protected]>
Co-authored-by: Chralt <[email protected]>
Co-authored-by: Malte Kliemann <[email protected]>
Co-authored-by: Chralt98 <[email protected]>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
  • Loading branch information
5 people authored Apr 2, 2024
1 parent 7a751ec commit 6b1aef6
Show file tree
Hide file tree
Showing 14 changed files with 531 additions and 154 deletions.
6 changes: 6 additions & 0 deletions primitives/src/assets/currencies.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ pub enum CurrencyClass<MI> {
ParimutuelShare(MI, CategoryIndex),
}

impl<MI> CurrencyClass<MI> {
pub fn is_foreign_asset(&self) -> bool {
matches!(self, Self::ForeignAsset(_))
}
}

impl<MI> Default for CurrencyClass<MI> {
fn default() -> Self {
Self::ForeignAsset(u32::default())
Expand Down
2 changes: 2 additions & 0 deletions runtime/battery-station/src/parameters.rs
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,8 @@ parameter_types! {
.build_or_panic();

// Transaction payment
/// A fee multiplier applied to the calculated fee factor for `CampaignAsset`
pub const CampaignAssetFeeMultiplier: u32 = 100;
/// A fee mulitplier for Operational extrinsics to compute “virtual tip”
/// to boost their priority.
pub const OperationalFeeMultiplier: u8 = 5;
Expand Down
428 changes: 286 additions & 142 deletions runtime/common/src/fees.rs

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions runtime/common/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1090,8 +1090,8 @@ macro_rules! impl_config_traits {

impl pallet_asset_tx_payment::Config for Runtime {
type RuntimeEvent = RuntimeEvent;
type Fungibles = Tokens;
type OnChargeAssetTransaction = TokensTxCharger;
type Fungibles = AssetRouter;
type OnChargeAssetTransaction = TxCharger;
}

impl pallet_transaction_payment::Config for Runtime {
Expand Down
2 changes: 2 additions & 0 deletions runtime/zeitgeist/src/parameters.rs
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,8 @@ parameter_types! {
.build_or_panic();

// Transaction payment
/// A fee multiplier applied to the calculated fee factor for `CampaignAsset`
pub const CampaignAssetFeeMultiplier: u32 = 100;
/// A fee mulitplier for Operational extrinsics to compute “virtual tip”
/// to boost their priority.
pub const OperationalFeeMultiplier: u8 = 5;
Expand Down
9 changes: 6 additions & 3 deletions zrml/asset-router/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ pub mod pallet {
require_transactional,
traits::{
tokens::{
fungibles::{Create, Destroy, Inspect, Mutate, Transfer},
fungibles::{Create, Destroy, Inspect, Mutate, Transfer, Unbalanced},
DepositConsequence, WithdrawConsequence,
},
BalanceStatus as Status, ConstU32,
Expand Down Expand Up @@ -83,6 +83,7 @@ pub mod pallet {
+ Inspect<T::AccountId, AssetId = A, Balance = T::Balance>
+ Transfer<T::AccountId, AssetId = A, Balance = T::Balance>
+ Mutate<T::AccountId, AssetId = A, Balance = T::Balance>
+ Unbalanced<T::AccountId, AssetId = A, Balance = T::Balance>
{
}

Expand All @@ -92,7 +93,8 @@ pub mod pallet {
+ Destroy<T::AccountId, AssetId = A, Balance = T::Balance>
+ Inspect<T::AccountId, AssetId = A, Balance = T::Balance>
+ Transfer<T::AccountId, AssetId = A, Balance = T::Balance>
+ Mutate<T::AccountId, AssetId = A, Balance = T::Balance>,
+ Mutate<T::AccountId, AssetId = A, Balance = T::Balance>
+ Unbalanced<T::AccountId, AssetId = A, Balance = T::Balance>,
T: Config,
{
}
Expand Down Expand Up @@ -145,7 +147,8 @@ pub mod pallet {
Balance = Self::Balance,
> + MultiLockableCurrency<Self::AccountId>
+ MultiReservableCurrency<Self::AccountId>
+ NamedMultiReservableCurrency<Self::AccountId>;
+ NamedMultiReservableCurrency<Self::AccountId>
+ Unbalanced<Self::AccountId, AssetId = Self::CurrencyType, Balance = Self::Balance>;
/// The currency type.
type CurrencyType: TryFrom<Self::AssetType>
+ Copy
Expand Down
25 changes: 25 additions & 0 deletions zrml/asset-router/src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,31 @@ macro_rules! route_call {
};
}

macro_rules! route_call_with_trait {
($currency_id:expr, $trait:ident, $method:ident, $($args:expr),*) => {
if let Ok(asset) = T::MarketAssetType::try_from($currency_id) {
// Route "pre new asset system" market assets to `CurrencyType`
if T::MarketAssets::asset_exists(asset) {
Ok(<T::MarketAssets as $trait<T::AccountId>>::$method(asset, $($args),*))
} else {
if let Ok(currency) = T::CurrencyType::try_from($currency_id) {
Ok(<T::Currencies as $trait<T::AccountId>>::$method(currency, $($args),*))
} else {
Ok(<T::MarketAssets as $trait<T::AccountId>>::$method(asset, $($args),*))
}
}
} else if let Ok(asset) = T::CampaignAssetType::try_from($currency_id) {
Ok(<T::CampaignAssets as $trait<T::AccountId>>::$method(asset, $($args),*))
} else if let Ok(asset) = T::CustomAssetType::try_from($currency_id) {
Ok(<T::CustomAssets as $trait<T::AccountId>>::$method(asset, $($args),*))
} else if let Ok(currency) = T::CurrencyType::try_from($currency_id) {
Ok(<T::Currencies as $trait<T::AccountId>>::$method(currency, $($args),*))
} else {
Err(Error::<T>::UnknownAsset)
}
};
}

/// This macro delegates a call to Currencies if the asset represents a currency, otherwise
/// it returns an error.
macro_rules! only_currency {
Expand Down
8 changes: 4 additions & 4 deletions zrml/asset-router/src/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ pub(super) const CURRENCY: Assets = Assets::ForeignAsset(0);
pub(super) const CURRENCY_OLD_OUTCOME: Assets = Assets::CategoricalOutcome(7, 8);
pub(super) const CURRENCY_INTERNAL: Currencies = Currencies::ForeignAsset(0);

pub(super) const CAMPAIGN_ASSET_MIN_BALANCE: Balance = 1;
pub(super) const CUSTOM_ASSET_MIN_BALANCE: Balance = 2;
pub(super) const MARKET_ASSET_MIN_BALANCE: Balance = 3;
pub(super) const CURRENCY_MIN_BALANCE: Balance = 4;
pub(super) const CAMPAIGN_ASSET_MIN_BALANCE: Balance = 2;
pub(super) const CUSTOM_ASSET_MIN_BALANCE: Balance = 3;
pub(super) const MARKET_ASSET_MIN_BALANCE: Balance = 4;
pub(super) const CURRENCY_MIN_BALANCE: Balance = 5;

pub(super) const CAMPAIGN_ASSET_INITIAL_AMOUNT: Balance = 10;
pub(super) const CUSTOM_ASSET_INITIAL_AMOUNT: Balance = 20;
Expand Down
4 changes: 3 additions & 1 deletion zrml/asset-router/src/pallet_impl/inspect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,9 @@ impl<T: Config> Inspect<T::AccountId> for Pallet<T> {

fn asset_exists(asset: Self::AssetId) -> bool {
if let Ok(currency) = T::CurrencyType::try_from(asset) {
if T::Currencies::total_issuance(currency) > Zero::zero() {
if <T::Currencies as MultiCurrency<T::AccountId>>::total_issuance(currency)
> Zero::zero()
{
true
} else {
only_asset!(asset, false, Inspect, asset_exists,)
Expand Down
1 change: 1 addition & 0 deletions zrml/asset-router/src/pallet_impl/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,4 @@ pub mod multi_lockable_currency;
pub mod multi_reserveable_currency;
pub mod named_multi_reserveable_currency;
pub mod transfer_all;
pub mod unbalanced;
67 changes: 67 additions & 0 deletions zrml/asset-router/src/pallet_impl/unbalanced.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Copyright 2024 Forecasting Technologies LTD.
//
// This file is part of Zeitgeist.
//
// Zeitgeist is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// Zeitgeist is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Zeitgeist. If not, see <https://www.gnu.org/licenses/>.

use crate::pallet::*;
use frame_support::traits::tokens::fungibles::Unbalanced;

impl<T: Config> Unbalanced<T::AccountId> for Pallet<T> {
fn set_balance(
asset: Self::AssetId,
who: &T::AccountId,
amount: Self::Balance,
) -> DispatchResult {
route_call_with_trait!(asset, Unbalanced, set_balance, who, amount)?
}

fn set_total_issuance(asset: Self::AssetId, amount: Self::Balance) {
let _ = route_call_with_trait!(asset, Unbalanced, set_total_issuance, amount);
}

fn decrease_balance(
asset: Self::AssetId,
who: &T::AccountId,
amount: Self::Balance,
) -> Result<Self::Balance, DispatchError> {
route_call_with_trait!(asset, Unbalanced, decrease_balance, who, amount)?
}

fn decrease_balance_at_most(
asset: Self::AssetId,
who: &T::AccountId,
amount: Self::Balance,
) -> Self::Balance {
route_call_with_trait!(asset, Unbalanced, decrease_balance_at_most, who, amount)
.unwrap_or(Zero::zero())
}

fn increase_balance(
asset: Self::AssetId,
who: &T::AccountId,
amount: Self::Balance,
) -> Result<Self::Balance, DispatchError> {
route_call_with_trait!(asset, Unbalanced, increase_balance, who, amount)?
}

fn increase_balance_at_most(
asset: Self::AssetId,
who: &T::AccountId,
amount: Self::Balance,
) -> Self::Balance {
route_call_with_trait!(asset, Unbalanced, increase_balance_at_most, who, amount)
.unwrap_or(Zero::zero())
}
}
1 change: 1 addition & 0 deletions zrml/asset-router/src/tests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,4 @@ mod multi_currency;
mod multi_lockable_currency;
mod multi_reservable_currency;
mod named_multi_reservable_currency;
mod unbalanced;
125 changes: 125 additions & 0 deletions zrml/asset-router/src/tests/unbalanced.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
// Copyright 2024 Forecasting Technologies LTD.
//
// This file is part of Zeitgeist.
//
// Zeitgeist is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// Zeitgeist is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Zeitgeist. If not, see <https://www.gnu.org/licenses/>.

#![cfg(test)]

use super::*;
use frame_support::traits::tokens::fungibles::Unbalanced;
use orml_traits::MultiCurrency;

fn test_helper(
asset: Assets,
initial_amount: <Runtime as crate::Config>::Balance,
min_balance: <Runtime as crate::Config>::Balance,
) {
assert_eq!(AssetRouter::total_balance(asset, &ALICE), initial_amount);
assert_ok!(AssetRouter::increase_balance(asset, &ALICE, 1));
assert_eq!(AssetRouter::total_balance(asset, &ALICE), initial_amount + 1);
assert_ok!(AssetRouter::decrease_balance(asset, &ALICE, 1));
assert_eq!(AssetRouter::total_balance(asset, &ALICE), initial_amount);
assert_eq!(AssetRouter::increase_balance_at_most(asset, &ALICE, 1), 1);
assert_eq!(AssetRouter::total_balance(asset, &ALICE), initial_amount + 1);
let to_decrease = initial_amount + 2 - min_balance;
assert_eq!(
AssetRouter::decrease_balance_at_most(asset, &ALICE, to_decrease),
initial_amount + 1
);
assert_eq!(AssetRouter::total_balance(asset, &ALICE), 0);
AssetRouter::set_total_issuance(asset, 1337);
assert_eq!(AssetRouter::total_issuance(asset), 1337);
}

#[test]
fn routes_campaign_assets_correctly() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(AssetRouter::create(CAMPAIGN_ASSET, ALICE, true, CAMPAIGN_ASSET_MIN_BALANCE));
assert_ok!(AssetRouter::deposit(CAMPAIGN_ASSET, &ALICE, CAMPAIGN_ASSET_INITIAL_AMOUNT));

test_helper(CAMPAIGN_ASSET, CAMPAIGN_ASSET_INITIAL_AMOUNT, CAMPAIGN_ASSET_MIN_BALANCE);

assert_eq!(AssetRouter::total_issuance(CUSTOM_ASSET), 0);
assert_eq!(AssetRouter::total_issuance(MARKET_ASSET), 0);
assert_eq!(AssetRouter::total_issuance(CURRENCY), 0);
});
}

#[test]
#[should_panic]
fn campaign_assets_panic_on_set_balance() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(AssetRouter::create(CAMPAIGN_ASSET, ALICE, true, CAMPAIGN_ASSET_MIN_BALANCE));
let _ = AssetRouter::set_balance(CAMPAIGN_ASSET, &ALICE, 42);
});
}

#[test]
fn routes_custom_assets_correctly() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(AssetRouter::create(CUSTOM_ASSET, ALICE, true, CUSTOM_ASSET_MIN_BALANCE));
assert_ok!(AssetRouter::deposit(CUSTOM_ASSET, &ALICE, CUSTOM_ASSET_INITIAL_AMOUNT));

test_helper(CUSTOM_ASSET, CUSTOM_ASSET_INITIAL_AMOUNT, CUSTOM_ASSET_MIN_BALANCE);

assert_eq!(AssetRouter::total_issuance(CAMPAIGN_ASSET), 0);
assert_eq!(AssetRouter::total_issuance(MARKET_ASSET), 0);
assert_eq!(AssetRouter::total_issuance(CURRENCY), 0);
});
}

#[test]
#[should_panic]
fn custom_assets_panic_on_set_balance() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(AssetRouter::create(CUSTOM_ASSET, ALICE, true, CUSTOM_ASSET_MIN_BALANCE));
let _ = AssetRouter::set_balance(CUSTOM_ASSET, &ALICE, 42);
});
}

#[test]
fn routes_market_assets_correctly() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(AssetRouter::create(MARKET_ASSET, ALICE, true, MARKET_ASSET_MIN_BALANCE));
assert_ok!(AssetRouter::deposit(MARKET_ASSET, &ALICE, MARKET_ASSET_INITIAL_AMOUNT));

test_helper(MARKET_ASSET, MARKET_ASSET_INITIAL_AMOUNT, MARKET_ASSET_MIN_BALANCE);

assert_eq!(AssetRouter::total_issuance(CAMPAIGN_ASSET), 0);
assert_eq!(AssetRouter::total_issuance(CUSTOM_ASSET), 0);
assert_eq!(AssetRouter::total_issuance(CURRENCY), 0);
});
}

#[test]
#[should_panic]
fn market_assets_panic_on_set_balance() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(AssetRouter::create(MARKET_ASSET, ALICE, true, MARKET_ASSET_MIN_BALANCE));
let _ = AssetRouter::set_balance(MARKET_ASSET, &ALICE, 42);
});
}

#[test]
fn routes_currencies_correctly() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(AssetRouter::set_balance(CURRENCY, &ALICE, CURRENCY_INITIAL_AMOUNT));
test_helper(CURRENCY, CURRENCY_INITIAL_AMOUNT, CURRENCY_MIN_BALANCE);

assert_eq!(AssetRouter::total_issuance(CAMPAIGN_ASSET), 0);
assert_eq!(AssetRouter::total_issuance(CUSTOM_ASSET), 0);
assert_eq!(AssetRouter::total_issuance(MARKET_ASSET), 0);
});
}
3 changes: 1 addition & 2 deletions zrml/orderbook/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -301,8 +301,7 @@ mod pallet {
let asset = order_data.maker_asset;
let amount = order_data.maker_amount;

if !T::AssetManager::reserved_balance_named(&Self::reserve_id(), asset, maker)
.is_zero()
if !T::AssetManager::reserved_balance_named(&Self::reserve_id(), asset, maker).is_zero()
{
let missing =
T::AssetManager::unreserve_named(&Self::reserve_id(), asset, maker, amount);
Expand Down

0 comments on commit 6b1aef6

Please sign in to comment.