Creador de mercado automático de productos constantes (AMM)

Explicación

Este contrato es un creador de mercado automatizado (AMM) de productos constantes para CosmWasm. Este contrato le permite intercambiar tokens. Los proveedores de liquidez pueden agregar liquidez al mercado y recibir una tarifa determinada por cada transacción que se establece en la instanciación. El código también incluye varias comprobaciones de validación y manejo de errores para garantizar la corrección y seguridad de las operaciones. Este tipo de AMM se basa en la función x*y=k, que establece un rango de precios para dos tokens según la liquidez disponible de cada token. Cuando la oferta de token X aumenta, la oferta de token de Y debe disminuir, y viceversa, para mantener el producto K constante. Cuando se representa gráficamente, el resultado es una hipérbola donde la liquidez siempre está disponible pero a precios cada vez más altos, que se acercan al infinito. en ambos extremos.

Creación de instancias

El contrato se puede instanciar con los siguientes mensajes

{
    "token1_denom": {"cw20": "<CONTRACT_ADDRESS>"},
    "token2_denom": {"cw20": "<CONTRACT_ADDRESS>"},
}

El nombre del token puede ser cw20 para tokens cw20. Los tokens cw20 tienen una dirección de contrato. CW20_CODE_ID es la identificación del código para un binario cw20 básico.

Agregar liquidez

Permite a un usuario agregar liquidez al grupo.

pub fn execute_add_liquidity(
    deps: DepsMut,
    info: &MessageInfo,
    env: Env,
    min_liquidity: Uint128,
    token1_amount: Uint128,
    token2_amount: Uint128,
    expiration: Option<Expiration>,
) -> Result<Response, ContractError> {
    check_expiration(&expiration, &env.block)?;
    let token1 = TOKEN1.load(deps.storage)?;
    let token2 = TOKEN2.load(deps.storage)?;
    let mut token_supply = TOTAL_STORED.load(deps.storage)?;
    let liquidity_amount = token1_amount+token2_amount;
    token_supply+=liquidity_amount;
    TOTAL_STORED.save(deps.storage, &token_supply)?;
    if liquidity_amount < min_liquidity {
        return Err(ContractError::MinLiquidityError {
            min_liquidity,
            liquidity_available: liquidity_amount,
        });
    }
    // Generate cw20 transfer messages if necessary
    let mut transfer_msgs: Vec<CosmosMsg> = vec![];
    if let Cw20(addr) = token1.denom {
        transfer_msgs.push(get_cw20_transfer_from_msg(
            &info.sender,
            &env.contract.address,
            &addr,
            token1_amount,
        )?)
    }
    if let Cw20(addr) = token2.denom.clone() {
        transfer_msgs.push(get_cw20_transfer_from_msg(
            &info.sender,
            &env.contract.address,
            &addr,
            token2_amount,
        )?)
    }
    TOKEN1.update(deps.storage, |mut token1| -> Result<_, ContractError> {
        token1.reserve += token1_amount;
        Ok(token1)
    })?;
    TOKEN2.update(deps.storage, |mut token2| -> Result<_, ContractError> {
        token2.reserve += token2_amount;
        Ok(token2)
    })?;
    Ok(Response::new()
        .add_messages(transfer_msgs)
        .add_attributes(vec![
            attr("token1_amount", token1_amount),
            attr("token2_amount", token2_amount),
            attr("liquidity_received", liquidity_amount),
        ]))
}

Los usuarios pueden agregar liquidez al AMM llamando a la función ejecutar_add_liquidity. Esta función toma las cantidades deseadas de dos tokens (token1_amount y token2_amount) y acuña la cantidad correspondiente de tokens de liquidez. Los tokens de liquidez representan la participación del usuario en el fondo de liquidez de AMM. La función también transfiere los tokens de entrada del usuario al contrato.

Eliminar liquidez

Permite a un usuario eliminar liquidez del grupo.

Los proveedores de liquidez pueden eliminar su liquidez llamando a la función ejecutar_remove_liquidity. Especifican la cantidad de tokens de liquidez (monto) que quieren quemar y la función calcula las cantidades proporcionales de los tokens subyacentes (token1_amount y token2_amount). La función transfiere los tokens correspondientes al usuario y reduce las reservas de tokens en consecuencia.

Swap

Cambiar un activo por otro

Los usuarios pueden intercambiar tokens utilizando AMM llamando a la función ejecutar_swap. Especifican el token de entrada (input_token), la cantidad a intercambiar (input_amount) y la cantidad mínima de salida (min_output). La función calcula la cantidad de salida calculada en la fórmula del producto constante y verifica si cumple con el requisito mínimo. Si el intercambio es válido, transfiere el token de entrada del usuario al contrato y transfiere el token de salida nuevamente al usuario.

Actualización de configuración

Para actualizar la configuración de AMM

El propietario puede actualizar la configuración del AMM mediante la función ejecutar_update_config. El propietario puede cambiar el porcentaje de la tarifa LP (proveedor de liquidez), el porcentaje de la tarifa del protocolo y la dirección del destinatario de la tarifa del protocolo.

Congelamiento de depósitos

Para congelar el depósito a AMM

El propietario puede congelar los depósitos en AMM llamando a la función ejecutar_freeze_deposits. Esto evita que los usuarios agreguen liquidez o intercambien tokens. Sólo el propietario puede congelar o descongelar los depósitos.

Ejemplos

Para crear un AMM con CosmWasm, puede crear los siguientes archivos: lib.rs Integration_tests.rs contract.rs msg.rs error.rs state.rs

lib.rs

integration_tests.rs

contract.rs

msg.rs

error.rs

state.rs

Last updated