Function secret_toolkit_utils::padding::space_pad
source · Expand description
Take a Vecblock_size, using spaces at the end.
Examples found in repository?
src/padding.rs (line 29)
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
pub fn pad_handle_result<T, E>(
response: Result<Response<T>, E>,
block_size: usize,
) -> Result<Response<T>, E>
where
T: Clone + std::fmt::Debug + PartialEq + schemars::JsonSchema,
{
response.map(|mut response| {
response.data = response.data.map(|mut data| {
space_pad(&mut data.0, block_size);
data
});
for attribute in &mut response.attributes {
// Safety: These two are safe because we know the characters that
// `space_pad` appends are valid UTF-8
unsafe { space_pad(attribute.key.as_mut_vec(), block_size) };
unsafe { space_pad(attribute.value.as_mut_vec(), block_size) };
}
response
})
}
/// Pad a `QueryResult` with spaces
pub fn pad_query_result<E>(response: Result<Binary, E>, block_size: usize) -> Result<Binary, E> {
response.map(|mut response| {
space_pad(&mut response.0, block_size);
response
})
}More examples
src/calls.rs (line 44)
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
fn to_cosmos_msg(
&self,
label: String,
code_id: u64,
code_hash: String,
funds_amount: Option<Uint128>,
) -> StdResult<CosmosMsg> {
let mut msg = to_binary(self)?;
// can not have 0 block size
let padding = if Self::BLOCK_SIZE == 0 {
1
} else {
Self::BLOCK_SIZE
};
space_pad(&mut msg.0, padding);
let mut funds = Vec::new();
if let Some(amount) = funds_amount {
funds.push(Coin {
amount,
denom: String::from("uscrt"),
});
}
let init = WasmMsg::Instantiate {
code_id,
msg,
code_hash,
funds,
label,
};
Ok(init.into())
}
}
/// A trait marking types that define the handle message(s) of a contract
///
/// This trait requires specifying a padding block size and provides a method to create the
/// CosmosMsg used to execute a handle method of a contract
pub trait HandleCallback: Serialize {
/// pad the message to blocks of this size
const BLOCK_SIZE: usize;
/// Returns StdResult<CosmosMsg>
///
/// Tries to convert the instance of the implementing type to a CosmosMsg that will trigger a
/// handle function of a contract. The BLOCK_SIZE specified in the implementation is used when
/// padding the message
///
/// # Arguments
///
/// * `code_hash` - String holding the code hash of the contract to be executed
/// * `contract_addr` - address of the contract being called
/// * `funds_amount` - Optional Uint128 amount of native coin to send with the handle message
fn to_cosmos_msg(
&self,
code_hash: String,
contract_addr: String,
funds_amount: Option<Uint128>,
) -> StdResult<CosmosMsg> {
let mut msg = to_binary(self)?;
// can not have 0 block size
let padding = if Self::BLOCK_SIZE == 0 {
1
} else {
Self::BLOCK_SIZE
};
space_pad(&mut msg.0, padding);
let mut funds = Vec::new();
if let Some(amount) = funds_amount {
funds.push(Coin {
amount,
denom: String::from("uscrt"),
});
}
let execute = WasmMsg::Execute {
msg,
contract_addr,
code_hash,
funds,
};
Ok(execute.into())
}
}
/// A trait marking types that define the query message(s) of a contract
///
/// This trait requires specifying a padding block size and provides a method to query a contract
pub trait Query: Serialize {
/// pad the message to blocks of this size
const BLOCK_SIZE: usize;
/// Returns StdResult<T>, where T is the type defining the query response
///
/// Tries to query a contract and deserialize the query response. The BLOCK_SIZE specified in the
/// implementation is used when padding the message
///
/// # Arguments
///
/// * `querier` - a reference to the Querier dependency of the querying contract
/// * `callback_code_hash` - String holding the code hash of the contract to be queried
/// * `contract_addr` - address of the contract being queried
fn query<C: CustomQuery, T: DeserializeOwned>(
&self,
querier: QuerierWrapper<C>,
code_hash: String,
contract_addr: String,
) -> StdResult<T> {
let mut msg = to_binary(self)?;
// can not have 0 block size
let padding = if Self::BLOCK_SIZE == 0 {
1
} else {
Self::BLOCK_SIZE
};
space_pad(&mut msg.0, padding);
querier.query(&QueryRequest::Wasm(WasmQuery::Smart {
contract_addr,
code_hash,
msg,
}))
}