diff --git a/common/bandwidth-claim-contract/src/events.rs b/common/bandwidth-claim-contract/src/events.rs new file mode 100644 index 0000000000..0925d53dc2 --- /dev/null +++ b/common/bandwidth-claim-contract/src/events.rs @@ -0,0 +1,8 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +// event types +pub const VOUCHER_ACQUIRED_EVENT_TYPE: &str = "coconut-acquired"; + +// attributes that are used in multiple places +pub const VOUCHER_VALUE: &str = "value"; diff --git a/common/bandwidth-claim-contract/src/lib.rs b/common/bandwidth-claim-contract/src/lib.rs index f878fe6526..f64deef0de 100644 --- a/common/bandwidth-claim-contract/src/lib.rs +++ b/common/bandwidth-claim-contract/src/lib.rs @@ -1,3 +1,4 @@ +pub mod events; pub mod keys; pub mod msg; pub mod payment; diff --git a/common/bandwidth-claim-contract/src/msg.rs b/common/bandwidth-claim-contract/src/msg.rs index bc0bedcc6b..0f221334e8 100644 --- a/common/bandwidth-claim-contract/src/msg.rs +++ b/common/bandwidth-claim-contract/src/msg.rs @@ -14,6 +14,7 @@ pub struct InstantiateMsg {} #[serde(rename_all = "snake_case")] pub enum ExecuteMsg { LinkPayment { data: LinkPaymentData }, + BuyBandwidth {}, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] diff --git a/contracts/bandwidth-claim/Cargo.toml b/contracts/bandwidth-claim/Cargo.toml index 390baf1ab7..35cdc4443b 100644 --- a/contracts/bandwidth-claim/Cargo.toml +++ b/contracts/bandwidth-claim/Cargo.toml @@ -8,11 +8,9 @@ edition = "2021" [lib] crate-type = ["cdylib", "rlib"] -[dev-dependencies] -config = { path = "../../common/config"} - [dependencies] bandwidth-claim-contract = { path = "../../common/bandwidth-claim-contract" } +config = { path = "../../common/config"} cosmwasm-std = "1.0.0-beta3" cosmwasm-storage = "1.0.0-beta3" diff --git a/contracts/bandwidth-claim/src/error.rs b/contracts/bandwidth-claim/src/error.rs index 02f3523eeb..f1a2045ab7 100644 --- a/contracts/bandwidth-claim/src/error.rs +++ b/contracts/bandwidth-claim/src/error.rs @@ -1,6 +1,8 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use config::defaults::DENOM; + use cosmwasm_std::{StdError, VerificationError}; use thiserror::Error; @@ -24,4 +26,13 @@ pub enum ContractError { #[error("The payment is not properly signed")] BadSignature, + + #[error("Received multiple coin types")] + MultipleDenoms, + + #[error("No coin was sent for voucher")] + NoCoin, + + #[error("Wrong coin denomination, you must send {}", DENOM)] + WrongDenom, } diff --git a/contracts/bandwidth-claim/src/lib.rs b/contracts/bandwidth-claim/src/lib.rs index 53be5bfb7e..9f0e9eb8d1 100644 --- a/contracts/bandwidth-claim/src/lib.rs +++ b/contracts/bandwidth-claim/src/lib.rs @@ -39,6 +39,7 @@ pub fn execute( ) -> Result { match msg { ExecuteMsg::LinkPayment { data } => transactions::link_payment(deps, env, info, data), + ExecuteMsg::BuyBandwidth {} => transactions::buy_bandwidth(deps, env, info), } } diff --git a/contracts/bandwidth-claim/src/storage.rs b/contracts/bandwidth-claim/src/storage.rs index b49db84d83..a40a55875a 100644 --- a/contracts/bandwidth-claim/src/storage.rs +++ b/contracts/bandwidth-claim/src/storage.rs @@ -11,6 +11,7 @@ use bandwidth_claim_contract::payment::Payment; // buckets const PREFIX_PAYMENTS: &[u8] = b"payments"; const PREFIX_STATUS: &[u8] = b"status"; +const PREFIX_COCONUT: &[u8] = b"coconut"; #[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema)] pub enum Status { @@ -31,6 +32,14 @@ pub fn status(storage: &mut dyn Storage) -> Bucket<'_, Status> { bucket(storage, PREFIX_STATUS) } +pub fn coconut(storage: &mut dyn Storage) -> Bucket<'_, Payment> { + bucket(storage, PREFIX_COCONUT) +} + +pub fn coconut_read(storage: &dyn Storage) -> ReadonlyBucket<'_, Payment> { + bucket_read(storage, PREFIX_COCONUT) +} + #[cfg(test)] mod tests { use super::*; diff --git a/contracts/bandwidth-claim/src/transactions.rs b/contracts/bandwidth-claim/src/transactions.rs index 9677204942..e91842d266 100644 --- a/contracts/bandwidth-claim/src/transactions.rs +++ b/contracts/bandwidth-claim/src/transactions.rs @@ -1,11 +1,13 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use cosmwasm_std::{DepsMut, Env, MessageInfo, Response}; +use cosmwasm_std::{DepsMut, Env, Event, MessageInfo, Response}; use crate::error::ContractError; -use crate::storage::{payments, status, Status}; +use crate::storage::{coconut, payments, status, Status}; +use bandwidth_claim_contract::events::{VOUCHER_ACQUIRED_EVENT_TYPE, VOUCHER_VALUE}; use bandwidth_claim_contract::payment::{LinkPaymentData, Payment}; +use config::defaults::DENOM; pub(crate) fn link_payment( deps: DepsMut<'_>, @@ -44,6 +46,27 @@ pub(crate) fn link_payment( Ok(Response::default()) } +pub(crate) fn buy_bandwidth( + _deps: DepsMut<'_>, + _env: Env, + info: MessageInfo, +) -> Result { + if info.funds.is_empty() { + return Err(ContractError::NoCoin); + } + if info.funds.len() > 1 { + return Err(ContractError::MultipleDenoms); + } + if info.funds[0].denom != DENOM { + return Err(ContractError::WrongDenom); + } + + let voucher_value = info.funds.last().unwrap(); + let event = + Event::new(VOUCHER_ACQUIRED_EVENT_TYPE).add_attribute(VOUCHER_VALUE, voucher_value.amount); + Ok(Response::new().add_event(event)) +} + #[cfg(test)] mod tests { use super::*;