# BuyNow

`BuyNow.sol` is a module contract that enables users to buy assets within the Unlockd Protocol. It provides functionality for instant asset purchases, allowing users to buy assets using a combination of their own funds and borrowed funds from the protocol.

### Key functions:

```solidity
function getCalculations(
    DataTypes.SignBuyNow calldata signBuyMarket
) external pure returns (uint256, uint256)
```

Calculates the minimum amount required and the maximum amount that can be borrowed for a buy now operation based on the buy now data.

### Parameters:

`signBuyMarket`: The signed buy now data.

### Returns:

The minimum amount required from the user.

The maximum amount that can be borrowed.

***

```solidity
function buy(
    uint256 amount,
    DataTypes.SignBuyNow calldata signBuyMarket,
    DataTypes.EIP712Signature calldata sig
) external 
```

Allows users to perform a buy now operation, purchasing an asset using the specified amount and creating a loan if necessary. It validates the signature, retrieves the user's Unlockd wallet and protocol owner addresses, updates the reserve state, transfers the user's contribution to the market adapter, creates a loan if necessary, and purchases the asset using the market adapter.

### Parameters:

`amount`: The amount to contribute towards the purchase.

`signBuyMarket`: The signed buy now data.

`sig`: The EIP-712 signature for the buy operation.

## Signature

#### `signBuyMarket` (type: `DataTypes.SignBuyNow`), it contains the following fields:

`asset` (type: `DataTypes.SignAsset`): The asset data, including the asset ID, collection address, token ID, price, nonce, and deadline.

`assetLtv` (type: `uint256`): The loan-to-value ratio of the asset.

`assetLiquidationThreshold` (type: `uint256`): The liquidation threshold of the asset.

`from` (type: `address`): The address from which the buy now action is initiated.

`to` (type: `address`): The address to which the asset is being bought.

`data` (type: `bytes`): Additional data for the buy now action.

`value` (type: `uint256`): The value being sent with the buy now action.

`marketAdapter` (type: `address`): The address of the market adapter used for the buy now action.

`marketApproval` (type: `address`): The address for market approval.

`marketPrice` (type: `uint256`): The market price of the asset.

`underlyingAsset` (type: `address`): The address of the underlying asset.

`nonce` (type: `uint256`): The nonce value is used to ensure the uniqueness of the signature and prevent replay attacks.

`deadline` (type: `uint256`): The deadline timestamp until which the signature is considered valid.

#### `sig` (type: `DataTypes.EIP712Signature`), it contains the following fields:

`v` (type: `uint8`): The recovery ID of the signature.

`r` (type: `bytes32`): The first 32 bytes of the signature.

`s` (type: `bytes32`): The second 32 bytes of the signature.

`deadline` (type: `uint256`): The deadline timestamp until which the signature is considered valid.


---

# 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://devs.unlockd.finance/modules/debt-tokens-4.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.
