# Smart Contracts

## 1. Module: `move_fun::bonding_curve`

### Module Info

* **Description**: Core logic for managing bonding curves used in fungible asset pricing.

### Resources

**`BondingCurves`**

```
struct BondingCurves has key {
    table: table::Table<String, BondingCurve>
}
```

**`BondingCurve`**

```
struct BondingCurve has key, drop, store, copy {
    initial_price_numerator: u128,
    initial_price_denominator: u128,
    growth_constant: u128
}
```

### Public Functions

| Function                     | Description                                                    |
| ---------------------------- | -------------------------------------------------------------- |
| `initialize<CoinType>`       | Initialize bonding curve for a token.                          |
| `initialize_fa`              | Initialize bonding curve for a fungible asset object.          |
| `calculate_k`                | Calculate the growth constant `k`.                             |
| `calculate_buy_amount_out`   | Get amount out when buying with given input.                   |
| `calculate_buy_amount_in`    | Get amount needed to buy specific output.                      |
| `calculate_sell_amount_out`  | Get amount received when selling tokens.                       |
| `calculate_sell_amount_in`   | Calculate tokens needed to get a specific return when selling. |
| `calculate_price`            | Calculate token price based on supply.                         |
| `set_market_cap_goal`        | Adjust bonding curve's growth constant `k`.                    |
| `calculate_price_by_amounts` | Quick price calculation helper.                                |
| `bonding_curve<CoinType>`    | Access bonding curve for a token type.                         |
| `fa_bonding_curve`           | Access bonding curve for a fungible asset.                     |
| `initial_price`              | Return initial price components (numerator, denominator).      |
| `growth_constant`            | Return the growth constant `k`.                                |

### Errors

| Code | Description                       |
| ---- | --------------------------------- |
| `1`  | Same growth constant as existing. |
| `2`  | Amount out exceeds limits.        |

***

## 2. Module: `move_fun::fungible_asset`

### Module Info

* **Description**: Defines a fungible asset backed by a bonding curve with mechanisms for buying, selling, and tracking supply.

### Resources

**`Registry`**

Manages fungible asset info per address.

**`Info`**

Stores details for an asset's bonding curve.

**`Store`**

Manages virtual balances for wallets.

**`FaMetadata`**

Stores additional metadata: logo, banner, description, links.

### Events

| Event          | Description                             |
| -------------- | --------------------------------------- |
| `FaDeployed`   | Emitted after deploying a FA.           |
| `FaBought`     | Emitted after a successful FA buy.      |
| `FaSold`       | Emitted after a successful FA sale.     |
| `BundleBuy`    | Emitted after bundled buy distribution. |
| `FeeExtracted` | Emitted after fee extraction.           |

### Public Functions

| Function                         | Description                                         |
| -------------------------------- | --------------------------------------------------- |
| `initialize_registry`            | Setup registry.                                     |
| `initialize<DEX>`                | Initialize a fungible asset.                        |
| `buy_exact_out`                  | Buy exact token amount, paying MOVE.                |
| `buy_exact_in`                   | Buy as much token as possible with given MOVE.      |
| `sell_exact_in`                  | Sell tokens for MOVE.                               |
| `sell_exact_out`                 | Sell exact MOVE amount worth of tokens.             |
| `quote_buy_exact_in`             | Quote tokens for exact MOVE input.                  |
| `quote_buy_exact_out`            | Quote MOVE for exact token output.                  |
| `quote_sell_exact_in`            | Quote MOVE for selling tokens.                      |
| `quote_sell_exact_out`           | Quote tokens needed to sell for MOVE.               |
| `retrieve_accumulated_supply`    | Retrieve all sold MOVE funds.                       |
| `claim`                          | Claim tokens post-bonding curve.                    |
| `retrieve_liquidity_supply`      | Retrieve liquidity-bound tokens.                    |
| `distribute_virtual_balances`    | Distribute tokens to wallets from virtual balances. |
| `target_price`                   | Get target price of a FA.                           |
| `transfer_from_virtual_balance`  | Move virtual tokens to wallet.                      |
| `batch_transfer`                 | Batch transfer virtual balances.                    |
| `set_bonding_curve_goal_reached` | Finalize bonding curve.                             |

### View Functions

* `price_denominator`
* `total_bound_supply`
* `available_supply`
* `accumulated_sell_supply`
* `price_at_supply`
* `virtual_balance`
* `virtual_balances`
* `has_virtual_balance`
* `icon_uri`
* `banner_uri`
* `project_uri`
* `misc_metadata`
* `bonding_curve_goal`
* `initial_price`
* `dex`
* `max_wallet_balance`
* `is_registered`

### Errors

| Code | Description                 |
| ---- | --------------------------- |
| `1`  | Wallet balance exceeds max. |
| `2`  | FA not registered.          |
| `3`  | No virtual balance owned.   |
| `4`  | No virtual balance exists.  |

***

## 3. Module: `move_fun::fungible_asset_router`

### Module Info

* **Description**: Entry point module to interact with fungible assets on bonding curves: buying, selling, launching, airdropping.

### Events

| Event          | Description                               |
| -------------- | ----------------------------------------- |
| `FeeExtracted` | Fee event (deprecated).                   |
| `FaMigrated`   | Token migration after bonding curve ends. |
| `Airdropped`   | Virtual balance airdrop event.            |

### Entry Functions

| Function                | Description                               |
| ----------------------- | ----------------------------------------- |
| `create<DEX>`           | Initialize bonding curve for existing FA. |
| `buy_exact_out`         | Buy exact FA amount for MOVE.             |
| `buy_exact_move`        | Spend fixed MOVE amount to buy FA.        |
| `sell_exact_in`         | Sell FA tokens for MOVE.                  |
| `sell_exact_move`       | Sell FA for exact MOVE amount.            |
| `claim_virtual_balance` | Claim post-bonding curve tokens.          |
| `airdrop`               | Airdrop remaining tokens to holders.      |

### View Functions

| Function                | Description                     |
| ----------------------- | ------------------------------- |
| `quote_buy_exact_out`   | Get MOVE cost for exact FA.     |
| `quote_buy_exact_move`  | Get FA for MOVE input.          |
| `quote_sell_exact_in`   | Get MOVE for selling FA.        |
| `quote_sell_exact_move` | Get FA needed to sell for MOVE. |

### Internal Functions

* `launch`: Finalize bonding curve and create liquidity pool.

### Errors

| Code | Description                      |
| ---- | -------------------------------- |
| `1`  | Not owner of FA.                 |
| `2`  | Bonding curve already completed. |
| `3`  | Slippage exceeded.               |
| `4`  | Invalid total supply.            |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.yuzu.finance/move.fun/technical/smart-contracts.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
