10k_swap-contracts
10k_swap-contracts copied to clipboard
A decentralized ZK Rollup AMM written in Cairo for StarkNet.
10Kswap Contracts for Cairo
Introducing 10KSwap: An AMM protocol that advances with Ethereum
10KSwap(10kswap.com), being built on StarkNet, is an AMM protocol that advances with Ethereum. 10K aims to revolutionize the performance of the AMM protocol by leveraging the rollup feature, bringing lower fees, less friction, and ultimately better liquidity to the L2 world and advance DeFi adoption.
10KSwap is the first open source AMM deployed on StarkNet Mainnet. We trust Ethereum and StarkNet, which represents the most advanced rollup trend. With its unique Cairo-VM giving developers a new development option, higher TPS and a computational cost that can be ignored. We believe AMM will be the most direct beneficiary of these two features.
With Cairo-VM, the gas cost required to perform calculation is much lower than for state updates, and on top of this we will increase the appropriate amount of calculation to reduce the number of state updates, continue to improve contract performance, and further reduce gas costs. Ensuring that 10K brings users a lightning-fast trading experience while enjoying the security of broad consensus - that's what every DeFi user wants to see, and we look forward to exploring this magical starfield with the pioneers on StarkNet.
10KSwap has adopted an immutable scheme where the protocol does not serve centralized interests. When it is fully delivered by the creator, the power is left to the community. It is a reflection of the spirit of decentralization, and our desire to work with users to make the impossible triangle possible.
In subsequent developments, we will continue to explore the potential of zk-tech to develop an AMM that is more LP friendly and allows for finer control of liquidity distribution.
The key technology is how to use Cairo to develop the "Rich Convex Function", and we will bring the results to the community. All the development process is open source and available as reference material, hoping to motivate more Dapp developers to inspire them to get involved in the L2 ecosystem and build DeFi. The following three products will be brought to the community.
1). A summary tutorial related to development.
2). A more generic and accessible development scaffolding.
3). SDK and DeFi contract libraries to facilitate dapp development.
10Kswap was online. To preview
Get started
Clone this repo
git clone [email protected]:0x60018/10k_swap-contracts.git
cd 10k_swap-contracts
Install dependencies
yarn install
Compile a contract
npx hardhat starknet-compile contracts/l0k_factory.cairo
Run a test that interacts with the compiled contract
npx hardhat test l0k_factory.test.ts
Branches
-
main
Stable version -
develop
New PRs and features
Contracts
l0k_factory
l0k_factory.cairo
- Mainnet Adddress:
0x01c0a36e26a8f822e0d81f20a5a562b16a8f8a3dfd99801367dd2aea8f1a87a2
- Goerli Adddress:
0x06c31f39524388c982045988de3788530605ed08b10389def2e7b1dd09d19308
Events
func PairCreated(token0 : felt, token1 : felt, pair : felt, index : felt):
end
-
token0
is guaranteed to be strictly less thantoken1
by sort order. -
pair
token0 & token1 pair address -
index
pair index, start from 0
constructor
func constructor(pairClass : felt, feeToSetter : felt):
end
-
pairClass
l0k_pair contract class hash -
feeToSetter
feeTo address manager
Read Functions
feeTo
func feeTo() -> (feeTo : felt):
end
- Returns
feeTo
feeToSetter
func feeToSetter() -> (feeToSetter : felt):
end
- Returns
feeToSetter
getPair
func getPair(token0 : felt, token1 : felt) -> (pair : felt):
end
-
token0
- -
token1
- - Returns
pair
allPairs
func allPairs(index : felt) -> (pair : felt):
end
-
index
pair index - Returns
pair
allPairsLength
func allPairsLength() -> (length : felt):
end
- Returns
length
Write Functions
createPair
func createPair(tokenA : felt, tokenB : felt) -> (pair : felt):
end
-
tokenA
A token address -
tokenB
B token address - Returns
pair
- Emits
PairCreated
setFeeTo
func setFeeTo(feeTo : felt) -> ():
end
-
feeTo
-
setFeeToSetter
func setFeeToSetter(feeToSetter : felt) -> ():
end
-
feeToSetter
-
l0k_pair
l0k_pair.cairo
- ClassHash:
0x231adde42526bad434ca2eb983efdd64472638702f87f97e6e3c084f264e06f
ERC20 functions and events based on openzeppelin cairo, click here for details.
Thanks to openzeppelin for powering cairo.
Events
Mint
func Mint(sender : felt, amount0 : Uint256, amount1 : Uint256):
end
-
sender
Minter -
amount0
Token0 amount -
amount1
Token1 amount
Burn
func Burn(sender : felt, amount0 : Uint256, amount1 : Uint256, to : felt):
end
-
sender
Burner -
amount0
Token0 amount -
amount1
Token1 amount -
to
Recipient
Swap
func Swap(
sender : felt,
amount0In : Uint256,
amount1In : Uint256,
amount0Out : Uint256,
amount1Out : Uint256,
to : felt,
):
end
-
sender
Swaper -
amount0In
Token0 in amount -
amount1In
Token1 in amount -
amount0Out
Token0 out amount -
amount1Out
Token1 out amount -
to
Recipient
Sync
func Sync(reserve0 : felt, reserve1 : felt):
end
-
reserve0
Token0 quantity in pair -
reserve1
Token1 quantity in pair
Read Functions
MINIMUM_LIQUIDITY
func MINIMUM_LIQUIDITY() -> (MINIMUM_LIQUIDITY : felt):
end
-
MINIMUM_LIQUIDITY
-
factory
func factory() -> (factory : felt):
end
-
factory
l0k_factory contract
token0
func token0() -> (token0 : felt):
end
-
token0
-
token1
func token1() -> (token1 : felt):
end
-
token1
-
blockTimestampLast
func blockTimestampLast() -> (blockTimestampLast : felt):
end
-
blockTimestampLast
-
price0CumulativeLast
func price0CumulativeLast() -> (price0CumulativeLast : felt):
end
-
price0CumulativeLast
-
price1CumulativeLast
func price1CumulativeLast() -> (price1CumulativeLast : felt):
end
-
price1CumulativeLast
-
kLast
func kLast() -> (kLast : felt):
end
-
kLast
-
getReserves
func getReserves() -> (reserve0 : felt, reserve1 : felt, blockTimestampLast : felt):
end
-
reserve0
Token0 quantity in pair -
reserve1
reserve1 quantity in pair -
blockTimestampLast
-
Write Functions
initialize
func initialize() -> (token0 : felt, token1 : felt):
end
called once by the factory at time of deployment
-
token0
- -
token1
-
mint
func mint(to : felt) -> (liquidity : Uint256):
end
-
to
Recipient - RETURNS:
liquidity
Pair token quantity - Emits
Mint
,Sync
,Transfer
ERC20
burn
func burn(to : felt) -> (amount0 : Uint256, amount1 : Uint256):
end
-
to
Recipient - RETURNS:
amount0
Received token0 quantity,amount1
Received token0 quantity - Emits
Burn
,Sync
,Transfer
ERC20
swap
func swap(amount0Out : Uint256, amount1Out : Uint256, to : felt) -> ():
end
-
amount0Out
- -
amount1Out
- -
to
Recipient - Emits
Swap
,Sync
skim
func skim() -> (to : felt):
end
-
to
Recipient
sync
func sync() -> ():
end
- Emits
Sync
l0k_router
l0k_router.cairo
- Mainnet Adddress:
0x07a6f98c03379b9513ca84cca1373ff452a7462a3b61598f0af5bb27ad7f76d1
- Goerli Adddress:
0x00975910cd99bc56bd289eaaa5cee6cd557f0ddafdb2ce6ebea15b158eb2c664
Read Functions
factory
func factory() -> (factory : felt):
end
-
factory
l0k_factory contract
quote
func quote(amountA : Uint256, reserveA : felt, reserveB : felt) -> (amountB : Uint256):
end
-
amountA
TokenA quantity -
reserveA
TokenA quantity in pair -
reserveB
TokenB quantity in pair - Returns
amountB
Received tokenB quantity
getAmountOut
func getAmountOut(amountIn : Uint256, reserveIn : felt, reserveOut : felt) -> (amountOut : Uint256):
end
-
amountIn
TokenIn quantity -
reserveIn
TokenIn quantity in pair -
reserveOut
TokenOut quantity in pair - Returns
amountOut
Received tokenOut quantity
getAmountIn
func getAmountOut(amountOut : Uint256, reserveIn : felt, reserveOut : felt) -> (amountIn : Uint256):
end
-
amountOut
TokenOut quantity -
reserveIn
TokenIn quantity in pair -
reserveOut
TokenOut quantity in pair - Returns
amountIn
Received tokenIn quantity
getAmountsOut
func getAmountsOut(amountIn : Uint256, path_len : felt, path : felt*) -> (amounts_len : felt, amounts : Uint256*):
end
-
amountIn
TokenIn quantity -
path_len
Path's length -
path
[TokenA, TokenB, ...] - Returns
amounts_len
amounts's length,amounts
received tokens amount
getAmountsIn
func getAmountsIn(amountOut : Uint256, path_len : felt, path : felt*) -> (amounts_len : felt, amounts : Uint256*):
end
-
amountOut
TokenOut quantity -
path_len
Path's length -
path
[TokenB, TokenA, ...] - Returns
amounts_len
amounts's length,amounts
send tokens amount
Write Functions
addLiquidity
func addLiquidity(
tokenA : felt,
tokenB : felt,
amountADesired : Uint256,
amountBDesired : Uint256,
amountAMin : Uint256,
amountBMin : Uint256,
to : felt,
deadline : felt,
) -> (amountA : Uint256, amountB : Uint256, liquidity : Uint256):
end
-
tokenA
TokenA address -
tokenB
TokenB address -
amountADesired
- -
amountBDesired
- -
amountAMin
- -
amountBMin
- -
to
Recipient -
deadline
Expired timestamp(unix) - Returns
amountA
Used tokenA quantity,amountB
Used tokenB quantity,liquidity
Pair token quantity
removeLiquidity
func removeLiquidity(
tokenA : felt,
tokenB : felt,
liquidity : Uint256,
amountAMin : Uint256,
amountBMin : Uint256,
to : felt,
deadline : felt,
) -> (amountA : Uint256, amountB : Uint256):
end
-
tokenA
TokenA address -
tokenB
TokenB address -
liquidity
Pair token quantity -
amountAMin
- -
amountBMin
- -
to
Recipient -
deadline
Expired timestamp(unix) - Returns
amountA
Received tokenA quantity,amountB
Received tokenB quantity
swapExactTokensForTokens
func swapExactTokensForTokens(
amountIn : Uint256,
amountOutMin : Uint256,
path_len : felt,
path : felt*,
to : felt,
deadline : felt,
) -> (amounts_len : felt, amounts : Uint256*):
end
-
amountIn
- -
amountOutMin
- -
path_len
- -
path
- -
to
Recipient -
deadline
Expired timestamp(unix) - Returns
amounts_len
amounts's length,amounts
received tokens amount
swapTokensForExactTokens
func swapTokensForExactTokens(
amountOut : Uint256,
amountInMax : Uint256,
path_len : felt,
path : felt*,
to : felt,
deadline : felt,
) -> (amounts_len : felt, amounts : Uint256*):
end
-
amountOut
- -
amountInMax
- -
path_len
- -
path
- -
to
Recipient -
deadline
Expired timestamp(unix) - Returns
amounts_len
amounts's length,amounts
send tokens amount
swapExactTokensForTokensSupportingFeeOnTransferTokens
func swapExactTokensForTokensSupportingFeeOnTransferTokens(
amountIn : Uint256,
amountOutMin : Uint256,
path_len : felt,
path : felt*,
to : felt,
deadline : felt,
):
end
-
amountIn
- -
amountOutMin
- -
path_len
- -
path
- -
to
Recipient -
deadline
Expired timestamp(unix) - Returns
amounts_len
amounts's length,amounts
send tokens amount