El contrato Token Vault permite a los usuarios depositar y retirar tokens. Utiliza el estándar de token cw20 y mantiene un mapeo de los saldos de los usuarios.
El contrato de Vault se implementa con una dirección de token cw20 específica, que se pasa como parámetro al constructor. Proporciona las siguientes funcionalidades:
deposit: permite a los usuarios depositar tokens en la bóveda. La cantidad de acciones que se acuñarán para el usuario se calcula en función de la cantidad depositada y el saldo de tokens existente de la bóveda.
withdraw: permite a los usuarios retirar tokens de la bóveda. La cantidad de tokens que se retirarán se calcula en función de la cantidad de acciones que el usuario desea quemar y el saldo actual de tokens de la bóveda.
Deposit
Esta función permite a los usuarios depositar tokens en la bóveda:
pub fn execute_deposit(
deps: DepsMut,
env: Env,
info: MessageInfo,
amount: Uint128,
) -> Result<Response, ContractError> {
let token_info=TOKEN_INFO.load(deps.storage)?;
let mut total_supply=TOTAL_SUPPLY.load(deps.storage)?;
let mut shares=Uint128::zero();
let mut balance=BALANCE_OF.load(deps.storage, info.sender.clone()).unwrap_or(Uint128::zero());
let balance_of=get_token_balance_of(&deps, info.sender.clone(), token_info.token_address.clone())?;
if total_supply.is_zero() {
shares+=amount;
}
else {
shares+=amount.checked_mul(total_supply).map_err(StdError::overflow)?.checked_div(balance_of).map_err(StdError::divide_by_zero)?
}
// Giving allowance to this contract
give_allowance(env.clone(), info.clone(), amount, token_info.token_address.clone())?;
total_supply+=shares;
TOTAL_SUPPLY.save(deps.storage, &total_supply)?;
balance+=shares;
BALANCE_OF.save(deps.storage, info.sender.clone(), &balance)?;
let transfer_from_msg=cw20::Cw20ExecuteMsg::TransferFrom { owner: info.sender.to_string(), recipient: env.contract.address.to_string(), amount };
let msg=CosmosMsg::Wasm(cosmwasm_std::WasmMsg::Execute { contract_addr: token_info.token_address.to_string(), msg: to_binary(&transfer_from_msg)?, funds: info.funds });
Ok(Response::new().add_attribute("action", "deposit").add_message(msg))
}
Withdraw
Esta función permite a los usuarios retirar tokens de la bóveda:
Ejemplo
Para crear una bóveda de tokens con CosmWasm, puede crear los siguientes archivos: lib.rs contract.rs msg.rs error.rs state.rs