# Cadangan

#### **`deposit`**

Mendepositokan`token` ke Cadangan, yang menghasilkan token yang sesuai di sisi Everscale.

```
function deposit(
        EverscaleAddress memory recipient,
        uint256 amount
    ) public override onlyEmergencyDisabled
        respectDepositLimit(amount) nonReentrant
```

**Parameter:**

| Nama      | Jenis                   | Deskripsi                      |
| --------- | ----------------------- | ------------------------------ |
| recipient | EverscaleAddress memory | Penerima di jaringan Everscale |
| amount    | uint256                 | Jumlah token yang akan disetor |

**Acara yang dikeluarkan:**

* UserDeposit

#### **`deposit`**

Sama dengan `deposit`biasa, tetapi mengisi beberapa penarikan tertunda.

```
function deposit(
        EverscaleAddress memory recipient,
        uint256 amount,
        uint256 expectedMinBounty,
        PendingWithdrawalId[] memory pendingWithdrawalIds
    ) external override
```

**Parameter:**

| Nama                 | Jenis                         | Deskripsi                               |
| -------------------- | ----------------------------- | --------------------------------------- |
| recipient            | EverscaleAddress memory       | Penerima di jaringan Everscale          |
| amount               | uint256                       | Jumlah token yang akan disetor          |
| expectedMinBounty    | uint256                       | Jumlah bounty minimal yang diharapkan   |
| pendingWithdrawalIds | PendingWithdrawalId\[] memory | Daftar penarikan tertunda untuk ditutup |

**Acara yang dikeluarkan:**

* UserDeposit

#### **`depositToFactory`**

Menyetorkan token ke Pabrik.

```
function depositToFactory(
        uint128 amount,
        int8 wid,
        uint256 user,
        uint256 creditor,
        uint256 recipient,
        uint128 tokenAmount,
        uint128 tonAmount,
        uint8 swapType,
        uint128 slippageNumerator,
        uint128 slippageDenominator,
        bytes memory level3
    ) external override onlyEmergencyDisabled respectDepositLimit(amount)
```

**Parameter:**

| Nama                | Jenis        | Deskripsi                                                |
| ------------------- | ------------ | -------------------------------------------------------- |
| amount              | uint128      | Jumlah yang harus disetor                                |
| wid                 | int8         | Id workchain                                             |
| user                | uint256      | Alamat pengguna                                          |
| creditor            | uint256      | Alamat kreditor                                          |
| recipient           | uint256      | Alamat penerima                                          |
| tokenAmount         | uint128      | Jumlah token                                             |
| tonAmount           | uint128      | Jumlah ton                                               |
| swapType            | uint8        | Jenis penghapusan                                        |
| slippageNumerator   | uint128      | Numerator yang digunakan dalam menentukan nilai slippage |
| slippageDenominator | uint128      | Penyebut yang digunakan dalam menentukan nilai slippage  |
| level3              | bytes memory |                                                          |

**Acara yang dikeluarkan:**

* FactoryDeposit

#### **`saveWithdraw`**

Menyimpan tanda terima penarikan. Jika Cadangan memiliki cukup token dan penarikan melewati batas, maka Cadangan akan segera dieksekusi. Jika tidak, disimpan sebagai penarikan tertunda.

```
function saveWithdraw(
        bytes memory payload,
        bytes[] memory signatures
    )  public override onlyEmergencyDisabled
        withdrawalNotSeenBefore(payload)
        returns (bool instantWithdrawal, PendingWithdrawalId memory pendingWithdrawalId)
```

**Parameter:**

| Nama       | Jenis           | Deskripsi                                                       |
| ---------- | --------------- | --------------------------------------------------------------- |
| payload    | bytes memory    | Tanda terima penarikan, byte yang dikodekan dari EverscaleEvent |
| signatures | bytes\[] memory | Daftar tanda tangan pengganti                                   |

**Nilai hasil:**

| Nama                | Jenis                      | Deskripsi                                                                            |
| ------------------- | -------------------------- | ------------------------------------------------------------------------------------ |
| instantWithdrawal   | bool                       | Benar jika penarikan langsung terisi, salah jika disimpan sebagai penarikan tertunda |
| pendingWithdrawalId | PendingWithdrawalId memory | Id penarikan tertunda                                                                |

**Acara yang dikeluarkan:**

* InstantWithdrawal

#### **`saveWithdraw`**

Menyimpan bukti penarikan, sama dengan `saveWithdraw(bytes payload, bytes[] signatures)`, tetapi mengizinkan untuk langsung mengatur bounty.

```
function saveWithdraw(
        bytes memory payload,
        bytes[] memory signatures,
        uint bounty
    )
        external
        override
```

**Parameter:**

| Nama       | Jenis           | Deskripsi                                                       |
| ---------- | --------------- | --------------------------------------------------------------- |
| payload    | bytes memory    | Tanda terima penarikan, byte yang dikodekan dari EverscaleEvent |
| signatures | bytes\[] memory | Daftar tanda tangan pengganti                                   |
| bounty     | uint            | Nilai baru untuk bounty penarikan yang tertunda                 |

#### **`cancelPendingWithdrawal`**

Membatalkan penarikan tertunda sebagian atau seluruhnya. Hanya dapat dipanggil oleh penerima penarikan yang tertunda.

```
function cancelPendingWithdrawal(
        uint256 id,
        uint256 amount,
        EverscaleAddress memory recipient,
        uint bounty
    ) external override onlyEmergencyDisabled
        pendingWithdrawalApproved(PendingWithdrawalId(msg.sender, id))
        pendingWithdrawalOpened(PendingWithdrawalId(msg.sender, id))
```

**Parameter:**

| Nama      | Jenis                   | Deskripsi                                                         |
| --------- | ----------------------- | ----------------------------------------------------------------- |
| id        | uint256                 | Id penarikan tertunda                                             |
| amount    | uint256                 | Jumlah yang akan dibatalkan (lalu jumlah penarikan yang tertunda) |
| recipient | EverscaleAddress memory | Penerima token di jaringan Everscale                              |
| bounty    | uint                    | Nilai bounty baru                                                 |

**Acara yang dikeluarkan:**

* PendingWithdrawalCancel

#### **`withdraw`**

Menarik penarikan tertunda akun panggilan dari Cadangan ini.

```
function withdraw(
        uint256 id,
        uint256 amountRequested,
        address recipient,
        uint256 maxLoss,
        uint256 bounty
    ) external override onlyEmergencyDisabled
        pendingWithdrawalOpened(PendingWithdrawalId(msg.sender, id))
        pendingWithdrawalApproved(PendingWithdrawalId(msg.sender, id))
        returns(uint256 amountAdjusted)
```

**Parameter:**

| Nama            | Jenis   | Deskripsi                                             |
| --------------- | ------- | ----------------------------------------------------- |
| id              | uint256 | Id penarikan tertunda                                 |
| amountRequested | uint256 | Jumlah token yang akan ditarik                        |
| recipient       | address | Alamat untuk mengirim token tebusan                   |
| maxLoss         | uint256 | Kerugian maksimum yang dapat diterima untuk penarikan |
| bounty          | uint256 | Nilai bounty baru                                     |

**Nilai hasil:**

| Nama           | Jenis   | Deskripsi                    |
| -------------- | ------- | ---------------------------- |
| amountAdjusted | uint256 | Jumlah token yang ditukarkan |

**Acara yang dikeluarkan:**

* PendingWithdrawalWithdraw

#### **`addStrategy`**

Menambahkan Strategi ke Cadangan. Hanya bisa dipanggil dengan`governance`.

```
function addStrategy(
        address strategyId,
        uint256 _debtRatio,
        uint256 minDebtPerHarvest,
        uint256 maxDebtPerHarvest,
        uint256 _performanceFee
    ) external  override onlyGovernance
        onlyEmergencyDisabled strategyNotExists(strategyId)
```

**Parameter:**

| Nama              | Jenis   | Deskripsi                                                               |
| ----------------- | ------- | ----------------------------------------------------------------------- |
| strategyId        | address | Alamat strategi untuk menambahkan                                       |
| \_debtRatio       | uint256 | Bagian dari total aset cadangan yang dapat diakses oleh strategi        |
| minDebtPerHarvest | uint256 | Batas bawah peningkatan utang sejak panen terakhir                      |
| maxDebtPerHarvest | uint256 | Batas atas peningkatan utang sejak panen terakhir                       |
| \_performanceFee  | uint256 | Biaya yang akan diterima ahli strategi berdasarkan kinerja Cadangan ini |

**Acara yang dikeluarkan:**

* StrategyAdded

#### **`updateStrategyDebtRatio`**

Mengganti kuantitas aset yang boleh dikelola `strategy`. Bisa dipanggil oleh`governance` atau `management`.

```
function updateStrategyDebtRatio(
        address strategyId,
        uint256 _debtRatio
    ) external  override onlyGovernanceOrManagement
        strategyExists(strategyId)
```

**Parameter:**

| Nama        | Jenis   | Deskripsi                                                |
| ----------- | ------- | -------------------------------------------------------- |
| strategyId  | address | Alamat strategi untuk memperbarui                        |
| \_debtRatio | uint256 | Kuantitas strategi aset dapat dikelola setelah pembaruan |

**Acara yang dikeluarkan:**

* StrategyUpdateDebtRatio

#### **`updateStrategyMinDebtPerHarvest`**

Memperbarui strategi utang minimal dengan nilai baru yang diteruskan dari param.

```
function updateStrategyMinDebtPerHarvest(
        address strategyId,
        uint256 minDebtPerHarvest
    ) external override onlyGovernanceOrManagement
        strategyExists(strategyId)
```

**Parameter:**

| Nama              | Jenis   | Deskripsi                                          |
| ----------------- | ------- | -------------------------------------------------- |
| strategyId        | address | Alamat strategi untuk memperbarui                  |
| minDebtPerHarvest | uint256 | Batas bawah peningkatan utang sejak panen terakhir |

**Acara yang dikeluarkan:**

* StrategyUpdateMinDebtPerHarvest

#### **`updateStrategyMaxDebtPerHarvest`**

Memperbarui strategi hutang maksimum dengan nilai baru yang diteruskan dari param.

```
function updateStrategyMaxDebtPerHarvest(
        address strategyId,
        uint256 maxDebtPerHarvest
    ) external override onlyGovernanceOrManagement
        strategyExists(strategyId)
```

**Parameter:**

| Nama              | Jenis   | Deskripsi                                         |
| ----------------- | ------- | ------------------------------------------------- |
| strategyId        | address | Alamat strategi untuk memperbarui                 |
| maxDebtPerHarvest | uint256 | Batas atas peningkatan utang sejak panen terakhir |

**Acara yang dikeluarkan:**

* StrategyUpdateMaxDebtPerHarvest

#### **`updateStrategyPerformanceFee`**

Memperbarui biaya kinerja strategi dengan nilai baru yang diteruskan dari param.

```
function updateStrategyPerformanceFee(
        address strategyId,
        uint256 _performanceFee
    ) external override onlyGovernance strategyExists(strategyId)
```

**Parameter:**

| Nama             | Jenis   | Deskripsi                                                                    |
| ---------------- | ------- | ---------------------------------------------------------------------------- |
| strategyId       | address | Alamat strategi untuk memperbarui                                            |
| \_performanceFee | uint256 | Biaya baru yang akan diterima ahli strategi berdasarkan kinerja Cadangan ini |

**Acara yang dikeluarkan:**

* StrategyUpdatePerformanceFee

#### **`revokeStrategy`**

Membatalkan strategi.

```
function revokeStrategy(
        address strategyId
    ) external override onlyStrategyOrGovernanceOrGuardian(strategyId)
```

**Parameter:**

| Nama       | Jenis   | Deskripsi                         |
| ---------- | ------- | --------------------------------- |
| strategyId | address | Alamat strategi untuk memperbarui |

**Acara yang dikeluarkan:**

* StrategyRevoked

#### **`_assessFees`**

Berdasarkan id strategi dan keuntungan yang dilaporkan, menghitung total biaya berdasarkan perkiraan biaya manajemen, ahli strategi, dan kinerja.

```
function _assessFees(
        address strategyId,
        uint256 gain
    ) internal returns (uint256)
```

**Parameter:**

| Nama       | Jenis   | Deskripsi                                                |
| ---------- | ------- | -------------------------------------------------------- |
| strategyId | address | Alamat strategi untuk memperbarui                        |
| gain       | uint256 | Keuntungan yang dilaporkan digunakan untuk menilai biaya |

**Nilai hasil:**

| Jenis   | Deskripsi               |
| ------- | ----------------------- |
| uint256 | Biaya baru yang dinilai |

#### **`report`**

Melaporkan jumlah aset yang dimiliki Strategi panggilan gratis (biasanya dalam hal ROI).

```
function report(
        uint256 gain,
        uint256 loss,
        uint256 _debtPayment
    )
        external
        override
        strategyExists(msg.sender)
        returns (uint256)
```

**Parameter:**

| Nama          | Jenis   | Deskripsi                                                                                        |
| ------------- | ------- | ------------------------------------------------------------------------------------------------ |
| gain          | uint256 | Strategi jumlah telah direalisasikan sebagai keuntungan atas investasinya sejak laporan terakhir |
| loss          | uint256 | Strategi jumlah telah direalisasikan sebagai kerugian atas investasinya sejak laporan terakhir   |
| \_debtPayment | uint256 | Strategi jumlah telah tersedia untuk menutupi hutang yang belum dibayar                          |

**Nilai hasil:**

| Jenis   | Deskripsi                        |
| ------- | -------------------------------- |
| uint256 | Jumlah hutang yang belum dibayar |

**Acara yang dikeluarkan:**

* StrategyReported

#### **`skim`**

Menyaring keuntungan strategi ke alamat `rewards_`. Hanya bisa dipanggil oleh `governance` atau `management`.

```
function skim(
        address strategyId
    ) external  override onlyGovernanceOrManagement
        strategyExists(strategyId)
```

**Parameter:**

| Nama       | Jenis   | Deskripsi                         |
| ---------- | ------- | --------------------------------- |
| strategyId | address | Alamat strategi untuk memperbarui |

#### **`skimFees`**

Menyaring biaya Cadangan ke alamat `rewards_`. Hanya bisa dipanggil oleh `governance` atau `management`.

```
function skimFees(
        bool skim_to_everscale
    ) external override onlyGovernanceOrManagement
```

**Parameter:**

| Nama                | Jenis | Deskripsi                                                 |
| ------------------- | ----- | --------------------------------------------------------- |
| skim\_to\_everscale | bool  | Benar jika menyaring biaya ke Everscale, salah jika tidak |

#### **`sweep`**

Menghapus token dari Cadangan ini yang bukan jenis token yang dikelola oleh Cadangan ini. Ini dapat digunakan jika tidak sengaja mengirim jenis token yang salah ke Cadangan ini.

```
function sweep(
        address _token
    ) external override onlyGovernance
```

**Parameter:**

| Nama    | Jenis   | Deskripsi                                              |
| ------- | ------- | ------------------------------------------------------ |
| \_token | address | Alamat token untuk ditransfer keluar dari cadangan ini |

#### **`forceWithdraw`**

Memaksa penarikan tertunda pengguna. Hanya berfungsi jika Cadangan memiliki cukup token di saldonya. Hanya dapat dipanggil dengan wrapped.

```
function forceWithdraw(
        PendingWithdrawalId memory pendingWithdrawalId
    )
        public
        override
        onlyEmergencyDisabled
        pendingWithdrawalOpened(pendingWithdrawalId)
        pendingWithdrawalApproved(pendingWithdrawalId)
```

**Parameter:**

| Nama                | Jenis                      | Deskripsi             |
| ------------------- | -------------------------- | --------------------- |
| pendingWithdrawalId | PendingWithdrawalId memory | Id penarikan tertunda |

**Acara yang dikeluarkan:** PendingWithdrawalForce

#### **`forceWithdraw`**

Multicall untuk`forceWithdraw`.

```
function forceWithdraw(
        PendingWithdrawalId[] memory pendingWithdrawalId
    ) external override
```

**Parameter:**

| Nama                | Jenis                         | Deskripsi             |
| ------------------- | ----------------------------- | --------------------- |
| pendingWithdrawalId | PendingWithdrawalId\[] memory | Id penarikan tertunda |

#### **`setPendingWithdrawalApprove`**

Menetapkan status persetujuan untuk penarikan yang tertunda. Penarikan tertunda harus dalam status persetujuan `Required` (1), jadi status persetujuan hanya dapat diatur satu kali. Jika Cadangan memiliki cukup token di saldonya - penarikan akan segera diisi. Hanya bisa dipanggil dengan`governance` atau`withdrawGuardian`.

**Acara yang dikeluarkan:**

* PendingWithdrawalWithdraw

```
function setPendingWithdrawalApprove(
        PendingWithdrawalId memory pendingWithdrawalId,
        ApproveStatus approveStatus
    ) public override onlyGovernanceOrWithdrawGuardian
        pendingWithdrawalOpened(pendingWithdrawalId)
```

#### **`setPendingWithdrawalApprove`**

Multicall untuk`setPendingWithdrawalApprove`.

```
function setPendingWithdrawalApprove(
        PendingWithdrawalId[] memory pendingWithdrawalId,
        ApproveStatus[] memory approveStatus
    ) external override
```

**Parameter:**

| Nama                | Jenis                         | Deskripsi                                        |
| ------------------- | ----------------------------- | ------------------------------------------------ |
| pendingWithdrawalId | PendingWithdrawalId\[] memory | Id penarikan tertunda                            |
| approveStatus       | ApproveStatus\[] memory       | Status persetujuan, harus Disetujui atau Ditolak |

#### **`_transferToEverscale`**

Mengeluarkan acara untuk memberi tahu transfer yang berhasil.

```
function _transferToEverscale(EverscaleAddress memory recipient,uint256 _amount) internal
```

**Parameter:**

| Nama      | Jenis                   | Deskripsi                    |
| --------- | ----------------------- | ---------------------------- |
| recipient | EverscaleAddress memory | Alamat penerima di Everscale |
| \_amount  | uint256                 | Jumlah yang akan ditransfer  |

**Acara yang dikeluarkan:**

* Deposit
