Terra E2E tests fixed, asset registration refactoring

This commit is contained in:
Yuriy Savchenko 2021-03-22 23:56:20 +02:00 committed by Leopold Schabel
parent f694fbdf0f
commit 7a97381f18
3 changed files with 95 additions and 63 deletions

View File

@ -57,8 +57,8 @@ type TerraClient struct {
} }
const ( const (
feeAmount = 10000, feeAmount = 10000
feeDenomination = "uluna", feeDenomination = "uluna"
) )
func (tc TerraClient) lockAssets(t *testing.T, ctx context.Context, token string, amount *big.Int, recipient [32]byte, targetChain uint8, nonce uint32) (*client.TxResponse, error) { func (tc TerraClient) lockAssets(t *testing.T, ctx context.Context, token string, amount *big.Int, recipient [32]byte, targetChain uint8, nonce uint32) (*client.TxResponse, error) {
@ -100,7 +100,7 @@ func (tc TerraClient) lockAssets(t *testing.T, ctx context.Context, token string
t.Logf("lockAssetsCall\n %s", lockAssetsCall) t.Logf("lockAssetsCall\n %s", lockAssetsCall)
executeIncreaseAllowance := msg.NewExecuteContract(tc.address, tokenContract, increaseAllowanceCall, msg.NewCoins()) executeIncreaseAllowance := msg.NewExecuteContract(tc.address, tokenContract, increaseAllowanceCall, msg.NewCoins())
executeLockAssets := msg.NewExecuteContract(tc.address, bridgeContract, lockAssetsCall, msg.NewCoins(msg.NewCoin(feeDenomination, feeAmount))) executeLockAssets := msg.NewExecuteContract(tc.address, bridgeContract, lockAssetsCall, msg.NewCoins(msg.NewInt64Coin(feeDenomination, feeAmount)))
transaction, err := tc.lcdClient.CreateAndSignTx(ctx, client.CreateTxOptions{ transaction, err := tc.lcdClient.CreateAndSignTx(ctx, client.CreateTxOptions{
Msgs: []msg.Msg{ Msgs: []msg.Msg{

View File

@ -42,6 +42,8 @@ const CHAIN_ID: u8 = 3;
const FEE_AMOUNT: u128 = 10000; const FEE_AMOUNT: u128 = 10000;
const FEE_DENOMINATION: &str = "uluna"; const FEE_DENOMINATION: &str = "uluna";
const WRAPPED_ASSET_UPDATING: &str = "updating";
pub fn init<S: Storage, A: Api, Q: Querier>( pub fn init<S: Storage, A: Api, Q: Querier>(
deps: &mut Extern<S, A, Q>, deps: &mut Extern<S, A, Q>,
env: Env, env: Env,
@ -203,12 +205,11 @@ fn handle_register_asset<S: Storage, A: Api, Q: Querier>(
) -> StdResult<HandleResponse> { ) -> StdResult<HandleResponse> {
let mut bucket = wrapped_asset(&mut deps.storage); let mut bucket = wrapped_asset(&mut deps.storage);
let result = bucket.load(asset_id); let result = bucket.load(asset_id);
match result { let result = result.map_err(|_| ContractError::RegistrationForbidden.std())?;
Ok(_) => { if result != HumanAddr::from(WRAPPED_ASSET_UPDATING) {
// Asset already registered, return error return ContractError::AssetAlreadyRegistered.std_err();
ContractError::AssetAlreadyRegistered.std_err()
} }
Err(_) => {
bucket.save(asset_id, &env.message.sender)?; bucket.save(asset_id, &env.message.sender)?;
let contract_address: CanonicalAddr = let contract_address: CanonicalAddr =
@ -225,8 +226,6 @@ fn handle_register_asset<S: Storage, A: Api, Q: Querier>(
], ],
data: None, data: None,
}) })
}
}
} }
fn vaa_update_guardian_set<S: Storage, A: Api, Q: Querier>( fn vaa_update_guardian_set<S: Storage, A: Api, Q: Querier>(
@ -358,8 +357,10 @@ fn vaa_transfer<S: Storage, A: Api, Q: Querier>(
let mut messages: Vec<CosmosMsg> = vec![]; let mut messages: Vec<CosmosMsg> = vec![];
// Check if this asset is already deployed // Check if this asset is already deployed
match wrapped_asset_read(&deps.storage).load(&asset_id) { let contract_addr = wrapped_asset_read(&deps.storage).load(&asset_id).ok();
Ok(contract_addr) => { let contract_addr = contract_addr.filter(|addr| addr != &HumanAddr::from(WRAPPED_ASSET_UPDATING));
if let Some(contract_addr) = contract_addr {
// Asset already deployed, just mint // Asset already deployed, just mint
messages.push(CosmosMsg::Wasm(WasmMsg::Execute { messages.push(CosmosMsg::Wasm(WasmMsg::Execute {
contract_addr, contract_addr,
@ -372,9 +373,10 @@ fn vaa_transfer<S: Storage, A: Api, Q: Querier>(
})?, })?,
send: vec![], send: vec![],
})); }));
} } else {
Err(_) => {
// Asset is not deployed yet, deploy and mint // Asset is not deployed yet, deploy and mint
wrapped_asset(&mut deps.storage).save(&asset_id, &HumanAddr::from(WRAPPED_ASSET_UPDATING))?;
let state = config_read(&deps.storage).load()?; let state = config_read(&deps.storage).load()?;
messages.push(CosmosMsg::Wasm(WasmMsg::Instantiate { messages.push(CosmosMsg::Wasm(WasmMsg::Instantiate {
code_id: state.wrapped_asset_code_id, code_id: state.wrapped_asset_code_id,
@ -400,7 +402,6 @@ fn vaa_transfer<S: Storage, A: Api, Q: Querier>(
label: None, label: None,
})); }));
} }
}
Ok(HandleResponse { Ok(HandleResponse {
messages, messages,
@ -1147,7 +1148,7 @@ mod tests {
} }
#[test] #[test]
fn valid_lock_deployed_asset() { fn error_lock_deployed_asset() {
let deps = mock_dependencies(CANONICAL_LENGTH, &[]); let deps = mock_dependencies(CANONICAL_LENGTH, &[]);
let mut deps = Extern { let mut deps = Extern {
storage: deps.storage, storage: deps.storage,
@ -1166,6 +1167,33 @@ mod tests {
&HumanAddr::from(LOCK_ASSET_ADDR), &HumanAddr::from(LOCK_ASSET_ADDR),
None, None,
); );
assert_eq!(result, ContractError::RegistrationForbidden.std_err());
}
#[test]
fn valid_lock_deployed_asset() {
let deps = mock_dependencies(CANONICAL_LENGTH, &[]);
let mut deps = Extern {
storage: deps.storage,
api: deps.api,
querier: LockAssetQuerier {},
};
do_init_with_guardians(&mut deps, 1);
let register_msg = HandleMsg::RegisterAssetHook {
asset_id: Binary::from(LOCK_ASSET_ID),
};
wrapped_asset(&mut deps.storage).save(&LOCK_ASSET_ID, &HumanAddr::from(WRAPPED_ASSET_UPDATING)).unwrap();
let result = submit_msg_with_sender(
&mut deps,
register_msg.clone(),
&HumanAddr::from(LOCK_ASSET_ADDR),
None,
);
assert!(result.is_ok()); assert!(result.is_ok());
let result = submit_msg_with_fee(&mut deps, MSG_LOCK.clone(), Coin::new(10000, "uluna")).unwrap(); let result = submit_msg_with_fee(&mut deps, MSG_LOCK.clone(), Coin::new(10000, "uluna")).unwrap();

View File

@ -94,6 +94,10 @@ pub enum ContractError {
/// Thrown when fee is enabled for the action, but was not sent with the transaction /// Thrown when fee is enabled for the action, but was not sent with the transaction
#[error("FeeTooLow")] #[error("FeeTooLow")]
FeeTooLow, FeeTooLow,
/// Registering asset outside of the wormhole
#[error("RegistrationForbidden")]
RegistrationForbidden,
} }
impl ContractError { impl ContractError {