# User Functions

### Spoke

Spoke user actions require a `costForReturnDelivery` parameter, which is the total fee a user pays the Wormhole relayer to deliver a message from a Hub to a Spoke. The fee depends on current gas prices and the relayer fee. The value for this parameter can be retrieved from `Hub.getCostForReturnDelivery()`.  It covers data and tokens transfer from the Hub to the Spoke (e.g. borrow, withdraw) as well as handling sending tokens back to the user in case the cross-chain transaction fails on the Hub (e.g. deposit, repay).

Spoke user actions, require also a Wormhole relayer fee to cover sending data and tokens from Spoke to Hub. This is handled internally with a `Spoke.getDeliveryCostRoundtrip()` function. This additional fee is only paid if any tokens are sent from the Spoke to the Hub, so only during deposits and repays.

The surplus is refunded to the user on the Spoke chain.

`Spoke.depositCollateral(...)`

* Initiates a deposit from a Spoke chain
* Params
  * `msg.value` - should equal to `Spoke.getDeliveryCostRoundtrip(costForReturnDelivery, true)`
  * `asset` - asset address on the Spoke chain
  * `assetAmount`
  * `costForReturnDelivery`

`Spoke.withdrawCollateral(...)`

* Initiates a  withdrawal to a Spoke chain
* Params
  * `msg.value` - should equal to `Spoke.getDeliveryCostRoundtrip(costForReturnDelivery, false)`
  * `asset` - asset address on the Spoke chain
  * `assetAmount`
  * `costForReturnDelivery`

`Spoke.borrow(...)`

* Initiates a  borrow to a Spoke chain
* Params
  * `msg.value` - should equal to `Spoke.getDeliveryCostRoundtrip(costForReturnDelivery, false)`
  * `asset` - asset address on the Spoke chain
  * `assetAmount`
  * `costForReturnDelivery`

`Spoke.repay(...)`

* Initiates a repay from a Spoke chain
* Params
  * `msg.value` - should equal to `Spoke.getDeliveryCostRoundtrip(costForReturnDelivery, true)`
  * `asset` - asset address on the Spoke chain
  * `assetAmount`
  * `costForReturnDelivery`

`Spoke.depositCollateralNative(...)`

* Initiates a Spoke native asset deposit from a Spoke chain, wrapping the native asset before bridging it.
* Params
  * `msg.value` - should be greather than `Spoke.getDeliveryCostRoundtrip(costForReturnDelivery, true)` - the surplus will be what a user deposits
  * `costForReturnDelivery`

`Spoke.repayNative(...)`

* Initiates a Spoke native asset repay from a Spoke chain, wrapping the native asset before bridging it.
* Params
  * `msg.value` - should be greather than `Spoke.getDeliveryCostRoundtrip(costForReturnDelivery, true)` - the surplus will be what a user repays
  * `costForReturnDelivery`

`Spoke.withdrawCollateralNative(...)`

* Initiates a Spoke native asset withdrawal to a Spoke chain, wrapping the native asset before bridging it.
* Params
  * `msg.value` - should equal to `Spoke.getDeliveryCostRoundtrip(costForReturnDelivery, true)`
  * `assetAmount`&#x20;
  * `costForReturnDelivery`
  * `unwrap` -  if `true`, the native asset will be unwrapped before delivery to the user

`Spoke.borrowNative(...)`

* Initiates a Spoke native asset borrow to a Spoke chain, wrapping the native asset before bridging it.
* Params
  * `msg.value` - should equal to `Spoke.getDeliveryCostRoundtrip(costForReturnDelivery, true)`
  * `assetAmount`&#x20;
  * `costForReturnDelivery`
  * `unwrap` -  if `true`, the native asset will be unwrapped before delivery to the user

### Hub

`Hub.userActions(...)`

Allows users to perform actions on the vault from the Hub chain

* Params
  * `action` - `Deposit` | `Borrow` | `Withdraw` | `Repay` | `DepositNative` | `RepayNative`
  * `asset` - USDC or a Wormhole wrapped version of the asset
  * `amount`

`borrowOrWithdrawNative(...)`

Allows users to borrow or withdraw the native asset

* Params
  * `action` - `Action.Withdraw` | `Action.Borrow`
  * `amount`
  * `unwrap` - if `false`, the user will receive the wrapped version of the native asset. Otherwise the nave asset will be unwrapped before being sent to the user.

## Liquidator functions (Hub)

### Liquidation parameters

`ILiquidationCalculator.LiquidationInput`

* `vault` - the address of the vault that is being liquidated&#x20;

`ILiquidationCalculator.DenormalizedLiquidationAsset`

* For every asset to be received or repaid a liquidation asset entry must be provided
* `assetAddress` - the address of the repaid/received asset (USDC or a Wormhole wrapped version of the asset)
* `repaidAmount` - the amount of the asset that is being repaid (can be zero)
* `receivedAmount` - The amount of the asset that is being received (can be zero)
* `depositTakeover` - A flag if the liquidator will take the deposit of the debtor instead of collateral tokens. This is useful in case the assets to be received are not currently available in the protocol (have borrowed) or if the liquidator just wants to deposit the received tokens anyway. If a liquidator chooses to takeover the deposit instead of receiving the tokens directly there's a regular deposit created for them, which earns yield.

### Functions

`Hub.liquidation(...)`   &#x20;

Params

* `input` - `ILiquidationCalculator.LiquidationInput`


---

# 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.syno.finance/developer-docs/user-functions.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.
