# Uniswap
Uniswap runs on two smart contracts; an "Exchange" contract and a "Factory" contract
https://github.com/Rengo-Labs/uniswap-casper-core
https://github.com/Rengo-Labs/uniswap-casper-router
https://docs.uniswap.org/protocol/V2/introduction
## Core
### Factory
Create and keep track of pairs
Pair:ETH/DAI, ETH/USDT
### Pairs
Which are created from Factory, serving as an AMM and keeping track of pool token balances
Enbles trading between 2 ERC20 tokens
### ERC20
## Periphery
### Library
Convenience functions for fetching data and pricing
### Router
Which uses the library, supports basic req. of UI
## Functions
- Manage pools
- Liquidity providers (deposit/widthdraw)
- Swapper (end-users, swap tokens)
+ Price oracle
## Notes
- Wrapped token (WCSPR, WETH, WBTC): ratio 1:1, be able to use native tokens in DApps, without making the application unncessary complicated
-> Swap ETH direct??
- Liquidity pools instead of order-book
- requires additional layers (controls) complexity
- Tokes must be transfered to pair before executing any other actions?
## Workflow
### Token swap
A user choose an input token:amound to swap, and the expected output token
=> The protocal calculates how much they will receive
## Deploys
### Factory
(https://testnet.cspr.live/contract/13cc83616c3fb4e6ea22ead5e61eb6319d728783ed02eab51b1f442085e605a7)
fee_to_setter (changable): account hash of user
0.3% => 1/6
### Flash swapper
a ref to Factory
(https://testnet.cspr.live/contract/1c23f9e89033e5c2d2a21a6926411b2645c000cf43fc0db495821633da2aed6e)
### Create pairs
- Pool ownership token (ERC20) - Liquidity pool
- Token0:reserve0, token1:reserve1
## Swap (token0, token1, amount0, amount1)
fee 0.3% divide portionally to LPs
## Test data
Testnet node: localhost
AC02
Deploy tokens, router
01d91f6fc88439c67fd40659c41a4156e639d4b9def94cb36d3d45ffaf7edc708a
AC03
Work with router
01d020a370a4bf7165949719821ecdf51ccd7117d17e8456e419c5010dc83784fb
Tokens:
XOY
https://testnet.cspr.live/contract/ef31acc65fb9521c1c559fa47550677b95d4adeeb9c4030f7f4db38de6b5a314
LAK
https://testnet.cspr.live/contract/49f88a64b6e34ff02550afa187f7fef85fa4e69a788917d44f8af1a2559b59f6
RECV
https://testnet.cspr.live/contract/a563a37bbc119960e4956a277e7b608943bfb97945eed0aca332f4839dc941da
Router
https://testnet.cspr.live/contract/059cf19350e440df7dba3870073619831273582f45fb96f54ce08fb9f75292e0
## Test
### ERC20
```
casper-client get-state-root-hash --node-address http://localhost:11101 | jq -r
-- "39d112da61a1b9bb4e4b9e6cbc0efb95ec435ee20092a5c7f46969ca497d5ff2"
casper-client query-global-state --node-address http://localhost:11101 -k 01d020a370a4bf7165949719821ecdf51ccd7117d17e8456e419c5010dc83784fb -s 39d112da61a1b9bb4e4b9e6cbc0efb95ec435ee20092a5c7f46969ca497d5ff2
```
```bash
casper-client put-deploy \
--chain-name casper-test \
--node-address http://localhost:11101/ \
--secret-key ./TestDeploy-secret.pem \
--session-path ./uniswap-casper-core/erc20/target/wasm32-unknown-unknown/release/erc20-token.wasm \
--payment-amount 180000000000 \
--session-arg="public_key:public_key='01d91f6fc88439c67fd40659c41a4156e639d4b9def94cb36d3d45ffaf7edc708a'" \
--session-arg="name:string='Dang Xoy'" \
--session-arg="symbol:string='XOY'" \
--session-arg="decimals:u8='18'" \
--session-arg="initial_supply:u256='1000000000000000000000000000'" \
--session-arg="contract_name:string='ERC20 XOY'"
casper-client put-deploy \
--chain-name casper-test \
--node-address http://localhost:11101/ \
--secret-key ./TestDeploy-secret.pem \
--session-path ./uniswap-casper-core/erc20/target/wasm32-unknown-unknown/release/erc20-token.wasm \
--payment-amount 180000000000 \
--session-arg="public_key:public_key='01d91f6fc88439c67fd40659c41a4156e639d4b9def94cb36d3d45ffaf7edc708a'" \
--session-arg="name:string='Dang Lak'" \
--session-arg="symbol:string='LAK'" \
--session-arg="decimals:u8='18'" \
--session-arg="initial_supply:u256='1000000000000000000000000000'" \
--session-arg="contract_name:string='ERC20_LAK'"
casper-client put-deploy \
--chain-name casper-test \
--node-address http://localhost:11101/ \
--secret-key ./TestDeploy-secret.pem \
--session-path ./uniswap-casper-core/erc20/target/wasm32-unknown-unknown/release/erc20-token.wasm \
--payment-amount 180000000000 \
--session-arg="public_key:public_key='01d91f6fc88439c67fd40659c41a4156e639d4b9def94cb36d3d45ffaf7edc708a'" \
--session-arg="name:string='Dang Recv'" \
--session-arg="symbol:string='RECV'" \
--session-arg="decimals:u8='18'" \
--session-arg="initial_supply:u256='1000000000000000000000000000'" \
--session-arg="contract_name:string='ERC20_RECV'"
```
### Deploy router
```
casper-client put-deploy \
--chain-name casper-test \
--node-address http://localhost:11101/ \
--secret-key ./TestDeploy-secret.pem \
--session-path ./uniswap-casper-router/uniswap-v2-router/target/wasm32-unknown-unknown/release/uniswap-v2-router.wasm \
--payment-amount 220000000000 \
--session-arg="public_key:public_key='01d91f6fc88439c67fd40659c41a4156e639d4b9def94cb36d3d45ffaf7edc708a'" \
--session-arg="factory:Key='hash-5028190b8a5b6addbf3d51ee2c6ae5b913f09223d65eff9bcf5985f74ae976ec'" \
--session-arg="wcspr:Key='hash-083756dee38a7e3a8a7190a17623cfbc8bc107511de206f03c3dbd1af5463a45'" \
--session-arg="library:Key='hash-fa073d1a95a606871983689633dab9464fb5fbe5f723b0855e025ea01b9bf308'" \
--session-arg="pair:Key='hash-8e6fbaae9f5ff3bb3cca7cb15723b2a47917d074922575187cb136e8d4b169a7'" \
--session-arg="contract_name:string='CasperDash_test_uniswap'"
```
# Approve tokens
```
casper-client put-deploy \
--chain-name casper-test \
--node-address http://localhost:11101/ \
--secret-key ./TestDeploy-secret.pem \
--payment-amount 2500000000 \
--session-hash hash-ef31acc65fb9521c1c559fa47550677b95d4adeeb9c4030f7f4db38de6b5a314 \
--session-entry-point "approve" \
--session-arg "spender:Key='hash-119b7c0cc3b427079b1f50178c6f880c666346c9343491c4dbc65b564edb1ed3'" \
--session-arg "amount:U256='10000000000000000000000000'"
casper-client put-deploy \
--chain-name casper-test \
--node-address http://localhost:11101/ \
--secret-key ./TestDeploy-secret.pem \
--payment-amount 2500000000 \
--session-hash hash-ef31acc65fb9521c1c559fa47550677b95d4adeeb9c4030f7f4db38de6b5a314 \
--session-entry-point "allowance" \
--session-arg "owner:Key='hash-119b7c0cc3b427079b1f50178c6f880c666346c9343491c4dbc65b564edb1ed3'" \
--session-arg "spender:Key='hash-119b7c0cc3b427079b1f50178c6f880c666346c9343491c4dbc65b564edb1ed3'"
casper-client put-deploy \
--chain-name casper-test \
--node-address http://localhost:11101/ \
--secret-key ./TestDeploy-secret.pem \
--payment-amount 2500000000 \
--session-hash hash-49f88a64b6e34ff02550afa187f7fef85fa4e69a788917d44f8af1a2559b59f6 \
--session-entry-point "approve" \
--session-arg "spender:Key='hash-119b7c0cc3b427079b1f50178c6f880c666346c9343491c4dbc65b564edb1ed3'" \
--session-arg "amount:U256='10000000000000000000000000'"
casper-client put-deploy \
--chain-name casper-test \
--node-address http://localhost:11101/ \
--secret-key ./TestDeploy-secret.pem \
--payment-amount 2500000000 \
--session-hash hash-49f88a64b6e34ff02550afa187f7fef85fa4e69a788917d44f8af1a2559b59f6 \
--session-entry-point "allowance" \
--session-arg "owner:Key='hash-119b7c0cc3b427079b1f50178c6f880c666346c9343491c4dbc65b564edb1ed3'" \
--session-arg "spender:Key='hash-119b7c0cc3b427079b1f50178c6f880c666346c9343491c4dbc65b564edb1ed3'"
```
## Add liquidity pool
```
casper-client put-deploy \
--chain-name casper-test \
--node-address http://localhost:11101/ \
--secret-key ./TestDeploy-secret.pem \
--payment-amount 2500000000 \
--session-hash hash-059cf19350e440df7dba3870073619831273582f45fb96f54ce08fb9f75292e0 \
--session-entry-point "add_liquidity" \
--session-arg "token_a:Key='hash-ef31acc65fb9521c1c559fa47550677b95d4adeeb9c4030f7f4db38de6b5a314'" \
--session-arg "token_b:Key='hash-49f88a64b6e34ff02550afa187f7fef85fa4e69a788917d44f8af1a2559b59f6'" \
--session-arg "amount_a_desired:U256='10000000000'" \
--session-arg "amount_b_desired:U256='10000000000'" \
--session-arg "amount_a_min:U256='1000000'" \
--session-arg "amount_b_min:U256='1000000'" \
--session-arg "to:Key='hash-a563a37bbc119960e4956a277e7b608943bfb97945eed0aca332f4839dc941da'" \
--session-arg "deadline:U256='1650964984'"
```