Skip to content

Latest commit

 

History

History
146 lines (102 loc) · 5.06 KB

formulae.md

File metadata and controls

146 lines (102 loc) · 5.06 KB

Formulae

I. Pool Minimum Balance

Ref: Minimum balance requirement for a smart contract

Local state uint count: 12

Local state byte slice count: 2

A. ASA-ASA Pool

100000 (Accounts on Algorand require a minimum balance of 100,000 micro Algo)
+ 100000 ASA 1 (Asset Optin)
+ 100000 ASA 2 (Asset Optin)
+ 100000 Pool Token (Asset Optin)
+ 542000 App Optin (100000 + (25000+3500)*12 + (25000+25000)*2)
= 942000 micro Algo

B. ASA-ALGO Pool

100000 (Accounts on Algorand require a minimum balance of 100,000 micro Algo)
+ 100000 ASA 1 (Asset Optin)
+ 100,000 ASA 2 (Asset Optin)
+ 100000 Pool Token (Asset Optin)
+ 542000 App Optin (100000 + (25000+3500)*12 + (25000+25000)*2)
= 842000 micro Algo

II. Adding Liquidity

A. Adding Initial Liquidity

Issued Pool Tokens = floor(sqrt(Asset1 Amount * Asset2 Amount))
Locked Pool Tokens= 1000
Pool Token Output = Issued Pool Tokens - Locked Pool Tokens

B. Adding Subsequent Liquidity

The same formula applies to single and flexible modes.

Old K = Asset1 Reserves * Asset2 Reserves
New K = (Asset1 Reserves + Asset1 Amount) * (Asset2 Reserves + Asset2 Amount)
R = sqrt(Old K) / Issued Pool Tokens
New Issued Pool Tokens = sqrt(New K) / R
New Issued Pool Tokens = sqrt(New K) / ( sqrt(Old K) / Issued Pool Tokens)
New Issued Pool Tokens = sqrt((New K * Issued Pool Tokens* Issued Pool Tokens) / Old K)

Pool Tokens Out = New Issued Pool Tokens - Old Issued Pool Tokens
New Asset1 Reserves = Old Asset1 Reserves + Asset1 Amount
New Asset2 Reserves = Old Asset1 Reserves + Asset2 Amount

Calculated Asset1 Amount = floor((Pool Tokens Out * New Asset1 Reserves) / New Issued Pool Tokens)
Calculated Asset2 Amount =floor((Pool Tokens Out *New Asset2 Reserves) / New Issued Pool Tokens)
Asset1 Swap Amount = Asset1 Amount - Calculated Asset1 Amount
Asset2 Swap Amount = Asset2 Amount - Calculated Asset2 Amount
Swap Amount = Max(Asset1 Swap Amount, Asset2 Swap Amount)

Total Fee Amount = (Swap Amount * Total Fee Share) / (10000 - Total Fee Share)
Protocol Fee Amount = Total Fee Amount / Protocol Fee Ratio
Poolers Fee Amount = Total Fee Amount - Protocol Fee Amount

Asset1 Swap Amount > Asset2 Swap Amount:
Fee As Pool Tokens = (Total Fee Amount * New Issued Pool Tokens) / (New Asset1 Reserves * 2)
New Asset1 Reserves = New Asset1 Reserves - Protocol Fee Amount
Pool Tokens Out = Pool Tokens Out - Fee As Pool Tokens

Asset2 Swap Amount > Asset1 Swap Amount:
Fee As Pool Tokens = (Total Fee Amount * New Issued Pool Tokens) / (New Asset2 Reserves * 2)
New Asset2 Reserves = New Asset2 Reserves - Protocol Fee Amount
Pool Tokens Out = Pool Tokens Out - Fee As Pool Tokens

III. Removing Liquidity

A. Multiple Asset Out

a. Remove all circulating pool tokens

Issued Pool Tokens == Locked Pool Tokens + Removed Pool Tokens
Asset1 Output = Asset1 Reserves
Asset2 Output = Asset2 Reserves

b. Otherwise

Issued Pool Tokens > Locked Pool Tokens + Removed Pool Tokens
Asset1 Output= floor(Removed Pool Token Amount * Asset1 Reserves / Issued Pool Tokens)
Asset2 Output= floor(Removed Pool Token Amount * Asset2 Reserves / Issued Pool Tokens)

B. Single Asset Out

Calculate the Asset1 Output and Asset2 Output as multiple assets out and convert an asset to desired output by doing an internal swap (fixed-input swap).

a. Asset 1 Out

Input Amount = Asset2 Output
Swap Output = FixedInputSwap(Input Amount)
Asset1 Output=Asset1 Output + Swap Output
Asset2 Output=0

b. Asset 2 Out

Input Amount = Asset1 Output
Swap Output = FixedInputSwap(Input Amount)
Asset2 Output=Asset2 Output + Swap Output
Asset1 Output=0

IV. Swapping

A. Fixed Input

Total Fee = floor((Input Amount * Total Fee Share) / 10000)
Protocol Fee = floor(Total Fee / Protocol Fee Ratio)
Poolers Fee = Total Fee - Protocol Fee
Swap Amount = Input Amount - Total Fee
K = Input Supply * Output Supply
Swap Output = Output Supply - (floor(K / (Input Supply + Swap Amount)) + 1)

B. Fixed Output

Swap Amount = (floor(K / (Output Supply - Output Amount)) + 1) - Input Supply
Input Amount = floor((Swap Amount * 10000) / (10000 - Total Fee Share))
Total Fee = Input Amount - Swap Amount
Protocol Fee = floor(Total Fee / Protocol Fee Ratio)
Poolers Fee = Total Fee - Protocol Fee
Change = Input Transfer Amount - Input Amount

V. Flash Loan

Applies to both assets.

Total Fee = floor((Loan Amount * Total Fee Share) / 10000)
Protocol Fee = floor(Total Fee / Protocol Fee Ratio)
Poolers Fee = Total Fee - Protocol Fee
Expected Repayment Amount = Loan Amount + Total Fee
Donation Amount = Repayment Transfer Amount - Expected Repayment Amount

VI. Flash Swap

Applies to both assets.

Input Amount= Transfer Amount (Final Balance - Initial Balance)

Note: The rest is the same with fixed input swap.

Total Fee = floor((Input Amount * Total Fee Share) / 10000)
Protocol Fee = floor(Total Fee / Protocol Fee Ratio)
Poolers Fee = Total Fee - Protocol Fee