Commit Graph

49 Commits

Author SHA1 Message Date
Maximilian Schneider 22f639c361 disable single sided withdraw and deposit 2022-12-24 14:56:19 +01:00
Jon Cinque b26491552f
token-swap: Add version to state (#985)
* Add version to token swap state

* Fix fuzz

* Cargo fmt

* Revert solana localnet version

* Update enum dispatch
2021-02-04 15:22:33 +01:00
Jon Cinque 40b7690a58
swap: Add rounding correction for deposit / withdraw (#1061)
* Add rounding specification for deposit / withdraw

The fuzzing test was improved to make sure that the value of pool tokens
(minus fees) never changed, which revealed a calc bug with deposits and
withdrawals.  If someone withdraws, they can take additional small
value out of the pool in the form of truncated value.

Before, deposit and withdrawal used the same calculation, rounding up the token
A and B amounts.  Remember that deposit / withdrawal specify the pool
token amount, and calculate the amount of A / B required to get to that
many pool tokens.  On withdrawal, we were giving back a little bit too
much.  The concept is that everything would even out since a deposit is
required for a withdrawal, which makes everything a wash.

Fuzzing found this issue very quickly! The change is to introduce a
rounding parameter to avoid ever giving away too much value, either
during deposit or withdrawal.

* Cleanup

* Add withdraw test

* Cleanup

* Cargo fmt

* Remove curve tests from fuzzing cfg

* Update JS test

* Cleanup test

* Update honggfuzz again

* Fix fee on JS test

* Force correct version of honggfuzz for CI (remove later)

* Improve value tests using PreciseNumber everywhere

* Fix ceiling

* Add comment for 0 tokens

* Fix ceiling div, add in constant price calc

* Revert ceiling division as template and use trait, too much boilerplate

* Run cargo fmt
2021-01-15 18:17:27 +01:00
Jon Cinque 608b75a115
swap: Move transfers into user account to the end of instructions (#1047)
* Move transfers into user account to the end of instructions

* Run cargo fmt
2021-01-11 19:20:34 +01:00
Jon Cinque a86abe49cd
token-swap: Add user transfer authority (#1033)
* Add user transfer authority to swap instruction

* Add user transfer authority to deposit all

* Add authority to withdraw all

* Add authority to deposit one

* Add authority to withdraw one

* Update fuzzer

* Add user transfer authority to JS
2021-01-06 20:55:31 +01:00
Jon Cinque 9e7e63f405
token-swap: Add new instructions to fuzzing (#961) 2020-12-18 16:35:17 +01:00
Jon Cinque 2158214c84
token-swap: Add fuzz check for pool token value (#958)
* Add extra check on instruction fuzz

* Refactor division

* Fix tests from fixed deposit math

* Fixup comments and cleanup fuzz

* Run fmt

* Address review feedback

* Fix JS test
2020-12-17 21:13:48 +01:00
Jon Cinque 7190672a0f
token-swap: Add instructions to deposit / withdraw one token (#937)
* Add instructions to deposit / withdraw one token

* Run cargo fmt

* Fix clippy issues

* Add JS interface

* Add tests for new instructions

* Run prettier

* Rename deposit and withdraw

* Rename withdraw -> withdraw all in program

* Rename single token instructions
2020-12-16 10:02:27 +01:00
Jon Cinque 55deb6c1af
token-swap: Constant price curve (#936)
* Update constant price curve conversion to/from pool tokens

* Add test for pool token conversion

* Fix tests

* run cargo fmt

* Assess fee on half source amount for conversion
2020-12-11 10:27:28 +01:00
Jon Cinque 087ae2e242
token-swap: Add offset curve and math (#935)
* Add offset curve

* Fix for math

* Add PreciseNumber

* Use Balancer formulation for trading token -> pool token conversion

* Add round-trip conversion testing

* Add offset curve to JS

* Run cargo fmt

* Update JS test numbers for new calcs

* Integrate review feedback

* Allow for withdrawals when one side is 0

* Run cargo fmt

* Disallow deposits for offset curve

* Run cargo fmt

* Allow for withdrawals through 0
2020-12-10 18:31:21 +01:00
Jon Cinque 3dcb1c5665
token-swap: Add pool token conversion interface (#934)
* Add pool token conversion interface for all curves

This reverts commit 8400bc7bfe4fcc18580d8f81cbb19a4ef5a437ff.

* Improve tests

* Run cargo fmt
2020-12-09 11:30:22 +01:00
Jon Cinque c0f5ff182c
token-swap: Refactor for new curves (#930)
* Add price parameter for flat / constant price curve

This encompasses a lot of changes to properly support the constant price
curve, and fixes some old pain points to make the whole thing easier to
use, including:
* refactor fees out of the curve
* move all fee calculations into new Fees type
* modify constraints to only care about curve types and fee
* add price parameter into constant price curve (flat curve)

* Run cargo fmt and clippy

* Revert interface changes and math update

* Run cargo fmt

* Address review feedback

* Fix fraction validation for zeros
2020-12-08 18:22:32 +01:00
Jon Cinque 04a3c833f0
token-swap: Cleanup check (#903)
* Add extra check

* Add extra check on init

* Run cargo fmt

* Clippy

* Add token program id check on unpack

* Run cargo fmt

* Add checks for program id ownership on swap account

* Add truncation check during swapping

* Run cargo fmt

* Update truncation to ceiling the value

* Run cargo fmt

* Fix JS test

* Refund back not needed source tokens

* Run cargo fmt

* Add swap_without_fees method to trait

* Fix merge problem

Co-authored-by: Justin Starry <justin@solana.com>
2020-12-03 12:17:32 +01:00
Michael Vines 158fa1dea6 Upgrade to Solana v1.4.14 2020-12-03 05:39:55 +00:00
Jon Cinque b40e0dd3fd
token-swap: Add fuzzer for swap / withdraw / deposit (#875)
* token-swap: Add fuzzer for swap / withdraw / deposit

* Run cargo fmt

* Make end-to-end testing work

* Fix test failures

* Cleanup for review

* Remove Clone trait for Initialize

* Fix building fuzz targets

* Fix fuzz withdraw logic to avoid ZeroTradingTokens error

* Cargo fmt

* Clippy / fmt again

* Integrate fuzzer in main workspace to share clippy / fmt

* Fix clippy

* Switch to stable honggfuzz that could work with BPF

* Update to most recent honggfuzz

* Add build / run requirements

* Add fuzz CI and cleanup for honggfuzz

* Revert to using fuzz feature to integrate with workspace

* Make fuzz script executable

* Refactor and cleanup

* Add nightly run

* Fix workflow typo

* Add runtime for pull request fuzz workflow

* Fix unrelated new clippy errors
2020-11-30 13:01:31 +01:00
Yuriy Savchenko d62ddd2b94
Added stable curve invariant to the token swap smart contract (#838)
* Added stable curve invariant to the token swap smart contract

* Fixed formatting

* Added missing stable curve constraints

* Symbol renames to make math clearer

* Small refactoring according to PR comments, fixes for JS tests
2020-11-17 14:13:18 +01:00
Jon Cinque 75acddc100
Fix zero fee calculation (#813)
If a swap has a trading fee and a zero owner fee, when calculating the owner
fee to pool token conversion, the simulated trading fee will be non-zero
because we floor the trading fee to 1 token.  If the input to trading
fee calculation is 0, then we will try to do `0 - 1` on an unsigned int,
which causes an underflow error.  The fix is to simply return a 0 fee
for a 0 input.
2020-11-09 19:01:21 +01:00
Michael Huang 5bf4b76df4
Refactor curve.rs (#754)
* Refactor shared out of curve.rs

* Refactor out flat curve

* Refactor out constant product curve

* Cargo fmt

* More moving

* Fixup

* use::super -> user::create::curve

* cp -> constant_product

* Fix circular dependency

* Docs

* Trigger Build
2020-11-02 14:29:00 +01:00
Michael Vines 9f4e6d8beb Update to solana v1.4.4 2020-11-01 20:48:15 -08:00
Jon Cinque 9cd1cb0900
Token-swap: Add "production mode" hard-coded fee constraints (#731)
* Add statically configured program constraints

* Allow missing host fee account

* Run cargo fmt + clippy

* Update JS for new host fee account param

* Fix merge issues

* Add host fee to curve, constrain on curves

* Cleanup static variable

* Add production test to CI

Integrate review feedback

* Run cargo fmt, clippy, prettier

* Re-run cargo fmt

* Fix test for eslint / prettier clash
2020-10-29 12:52:17 +01:00
anatoly yakovenko 64a362c059
Use u128 for all the math but store in u64 (#711)
* Use u128 for all the math but store in u64

* tests

* missing changes

* bulds

* specific conversion failure

* fix tests

* use large numbers

* Rebase and fix merge issue from new tests

Co-authored-by: Jon Cinque <jon.cinque@gmail.com>
2020-10-26 18:18:33 +01:00
Justin Starry a6cfc590e1
Prevent swap accounts being used as user accounts (#719) 2020-10-26 18:17:47 +08:00
Michael Vines fe627797c3 Use program_stubs to clean up invoke_signed stub 2020-10-25 03:29:01 +00:00
Michael Vines 80e29ef6b9 Port SPL to solana-program and `cargo build-bpf` 2020-10-24 19:21:38 -07:00
Jon Cinque b0867c7e28
token-swap: Add fee account to receive withdraw / trading fees, trading token mints (#695)
* Add mints to swap info

* Add mints to JS

* Add fee account in SwapInfo / init

* Add test for 0 fee, init test fully

* Add withdraw command interface

* Add fee accounts to swap instruction

* Add calculations for swap and withdraw fees

* Run cargo fmt

* Add new fees to JS and test

* Review feedback: fixup instruction doc and clone

* Update order of accounts in instructions

* Run cargo fmt

* Fix owner fee pool token calculation to include trading fee

* Add owner fees to flat curve, per request

* Fix instruction comment numbering

* Add more errors types for clearer calculation errors

Add a check for withdrawing from fee account

* Cargo fmt
2020-10-23 18:31:58 +02:00
Justin Starry ee99fcf025
Check for close and freeze authorities in token-swap (#686) 2020-10-22 21:20:38 +08:00
Jon Cinque db42f7abbe
token-swap: Add curve and pool token trait and integrate in processor (#624)
* Add SwapCurve trait and integrate in processor

* Add PoolTokenConverter trait to correspond

* Add curve type parameter to initialization and JS

* Refactor for flat curve test, fmt

* Update token-swap/program/src/curve.rs

Co-authored-by: Tyera Eulberg <teulberg@gmail.com>

* Refactor swap curve to allow for any implementation

* Rename SwapCurveWrapper -> SwapCurve

* Run cargo fmt

* Update CurveType to enum in JS

Co-authored-by: Tyera Eulberg <teulberg@gmail.com>
2020-10-21 20:46:50 +02:00
Yutaro Mori 5f56635fde
Pass TokenSwap state into the constructor to simplify function calls (#586)
* Pass TokenSwap state into the constructor to simplify function calls

* WIP: Update program to return token_program_id

* Add tokenProgramId to js TokenSwapInfo object

* Address pr comments

* Remove TokenSwapInfo and use loadTokenSwap as the primary way to fetch TokenSwap metadata

* Fix module.d.ts

* Address pr comments

* Clarification on comments

Co-authored-by: Yutaro Mori <yutaro@umaproject.org>
2020-10-14 12:37:58 +02:00
Jon Cinque 423d8b1ae9
Add checks for 0 token output and tests (#595) 2020-10-09 19:23:43 +02:00
Jon Cinque bbc5f57dcc
token-swap: Add slippage to swap / withdraw / deposit (#560)
* token-swap: Add slippage to swap / withdraw / deposit

* Update JS snake_case -> camelCase

* Run prettier
2020-10-02 10:40:33 +02:00
Jon Cinque 5e1c2bb34d
token-swap: Use sdk version of Pack (#554)
* token-swap: Use sdk version of Pack

* Update to get_packed_len per review
2020-10-01 11:02:31 +02:00
Jon Cinque 13de66817d
token-swap: Improve pool token supply on initialization, deposit, and withdrawal (#508)
* token-swap: Add token supply in invariant calculation

* Refactor state classes into curve components for future use
* Align pool initialization with Uniswap using geometric mean of token
  amounts
* Fix deposit and withdraw instruction to work as a proportion of pool
  tokens
* Add math utilities to calculate the geometric mean with u64

* Improve variable names

* Use a fixed starting pool size

* Run cargo fmt

* Update js tests with new pool numbers

* Run linting

* Remove math

* Fix BN type issues found by flow
2020-09-23 23:08:44 +02:00
Tyera Eulberg 90b5ce6d65
Standardize failure case ordering (#509)
* Standardize processor failure-case ordering

* Fix token-swap test
2020-09-21 20:28:24 -06:00
Jack May 759fe1487e Switch to solana_sdk Pack and COption 2020-09-21 17:08:37 -07:00
Jon Cinque 84cf55e9ae
Token-swap: add tests for all instructions (#455)
* token-swap: Add initialize tests

* Cleanup initialize test using helper struct

* Add deposit tests

* Run cargo fmt

* Add withdraw tests, refactor swap in test

* Add swap tests

* Integrate review feedback
2020-09-17 12:11:24 +02:00
Jon Cinque 759cbb3866
Pack instructions and state more efficiently (#420)
* Pack instructions and state more efficiently

* SwapInfo and SwapInstruction are more memory-efficient, following the
  example from SPL Token
* Remove unnecessary helper structs to make instructions clearer
* Error -> SwapError
* Update JS tests to reflect the change

* Integrate review feedback
2020-09-11 18:19:06 +02:00
Jon Cinque f5e0d793a9
token-swap: Swap instruction fix and update libs for CI (#408)
* token-swap: Fix swap instruction

* Update SDK libs and fix outstanding issues

* Run lint in token/js

* Disable CI token-swap js tests

* Update code for web3.js 0.75.0

* Update output -> destination verbiage for clarity / consistency
2020-09-10 20:16:50 +02:00
Jon Cinque f6fc53c311
token-swap: Fix withdraw instruction (#405)
* Include pool mint in instruction, required for burning
* Add simple Rust test
* Fix js withdraw test
2020-09-09 18:00:03 +02:00
Jon Cinque db729af089
Fix deposit instruction (#399)
* Fix deposit instruction

* Refactor tests for easier composibility
* Add deposit instruction and test
* Deposit JS test works again

* Fix js lint
2020-09-09 10:59:27 +02:00
Jon Cinque ac73bd2e73
Fix token-swap tests (#388)
* Fix local token-swap tests

* Change generation of program address to use a nonce
* Accept nonce properly in initialization
* Include nonce in TokenSwap structure
* Fixup serialization with new parameter (padding used for now)
* Update dependencies

Update toml / lock files

Fix token swap initialization end-to-end

Cleanup unit test to use `find_program_address`

Add / refactor tests

Most importantly, added a special test to make sure that
token_program_id is provided at the end of CPI instructions, since
unit testing did not pick up that problem, and it was tough to debug
during end-to-end testing

* Revert some testing changes for PR

* Update token-swap/program/src/processor.rs

Co-authored-by: Tyera Eulberg <teulberg@gmail.com>

* Integrate review comments

* Fmt and clippy

* Refactor for clippy

* Fmt again

* Fix npm lint error

* Clarify signers line as requested

Co-authored-by: Tyera Eulberg <teulberg@gmail.com>
2020-09-06 00:09:05 +02:00
Trent Nelson 9eb10d9144 Unrelated clippy... 2020-09-04 01:18:44 -06:00
Trent Nelson ddc47a6d86 Fix TokenSwap initialization test 2020-09-04 01:18:44 -06:00
Jack May 815cca3cb8
Don't repack if not needed (#355) 2020-08-28 12:03:10 -07:00
Jack May 2a5acff2d8
Safer pack/unpack (#349)
* Safer pack/unpack

* fix cli

* clippy

* fix swap

* nit

* clippy

Co-authored-by: Michael Vines <mvines@gmail.com>
2020-08-27 21:19:15 -07:00
Tyera Eulberg 49e6e4a589
Reinstate Mint supply (#342)
* Reinstate Mint supply, and adjust with Minto & Burn

* C headers

* Patch token-cli

* Patch token-swap
2020-08-27 13:06:23 -06:00
Michael Vines c671fdcd3a Update token-swap for token2 2020-08-26 23:10:18 -07:00
Michael Vines 77e43016f1 clippy 2020-08-14 01:22:11 +00:00
Michael Vines b9bb2f2c48 Adapt to create_program_address changes 2020-08-14 01:22:11 +00:00
Michael Vines 26ab9bb26a Reorganize crates based on program 2020-08-08 15:25:47 -07:00