Skip to content

Commit 290761e

Browse files
Merge pull request #663 from public-awesome/humanalgorithm/fix-lowercase-conversion
Fix Lowercase Conversion for Eth Addresses
2 parents 3b43da4 + 37f5b01 commit 290761e

File tree

7 files changed

+161
-5
lines changed

7 files changed

+161
-5
lines changed

contracts/dydx-airdrop/src/claim_airdrop.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,17 @@ pub fn claim_airdrop(
1919
eth_sig: String,
2020
) -> Result<Response, ContractError> {
2121
let config = CONFIG.load(deps.storage)?;
22+
let eth_address_lower = eth_address.to_ascii_lowercase();
23+
validation::assert_lower_case(eth_address_lower.clone())?;
2224
validate_claim(
2325
&deps,
2426
info.clone(),
25-
eth_address.clone(),
27+
eth_address_lower.clone(),
2628
eth_sig,
2729
config.clone(),
2830
)?;
2931
let res = claim_and_whitelist_add(&deps, info, config.airdrop_amount)?;
30-
increment_local_mint_count_for_address(deps, eth_address)?;
32+
increment_local_mint_count_for_address(deps, eth_address_lower)?;
3133

3234
Ok(res.add_attribute("claimed_amount", config.airdrop_amount.to_string()))
3335
}
@@ -100,13 +102,23 @@ mod validation {
100102
)
101103
}
102104

105+
pub fn assert_lower_case(eth_address: String) -> Result<(), ContractError> {
106+
match eth_address.to_lowercase() == eth_address {
107+
true => Ok(()),
108+
false => Err(ContractError::EthAddressShouldBeLower {
109+
address: eth_address,
110+
}),
111+
}
112+
}
113+
103114
pub fn validate_claim(
104115
deps: &DepsMut,
105116
info: MessageInfo,
106117
eth_address: String,
107118
eth_sig: String,
108119
config: Config,
109120
) -> Result<(), ContractError> {
121+
assert_lower_case(eth_address.clone())?;
110122
validate_is_eligible(deps, eth_address.clone())?;
111123
validate_eth_sig(deps, info, eth_address.clone(), eth_sig, config)?;
112124
validate_mints_remaining(deps, &eth_address)?;

contracts/dydx-airdrop/src/error.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,7 @@ pub enum ContractError {
5151

5252
#[error("Plaintext message is too long")]
5353
PlaintextTooLong {},
54+
55+
#[error("Address {address} should be converted to lowercase")]
56+
EthAddressShouldBeLower { address: String },
5457
}

contracts/rekt-airdrop/src/claim_airdrop.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,17 @@ pub fn claim_airdrop(
1919
eth_sig: String,
2020
) -> Result<Response, ContractError> {
2121
let config = CONFIG.load(deps.storage)?;
22+
let eth_address_lower = eth_address.to_ascii_lowercase();
23+
validation::assert_lower_case(eth_address_lower.clone())?;
2224
validate_claim(
2325
&deps,
2426
info.clone(),
25-
eth_address.clone(),
27+
eth_address_lower.clone(),
2628
eth_sig,
2729
config.clone(),
2830
)?;
2931
let res = claim_and_whitelist_add(&deps, info, config.airdrop_amount)?;
30-
increment_local_mint_count_for_address(deps, eth_address)?;
32+
increment_local_mint_count_for_address(deps, eth_address_lower)?;
3133

3234
Ok(res.add_attribute("claimed_amount", config.airdrop_amount.to_string()))
3335
}
@@ -100,13 +102,23 @@ mod validation {
100102
)
101103
}
102104

105+
pub fn assert_lower_case(eth_address: String) -> Result<(), ContractError> {
106+
match eth_address.to_lowercase() == eth_address {
107+
true => Ok(()),
108+
false => Err(ContractError::EthAddressShouldBeLower {
109+
address: eth_address,
110+
}),
111+
}
112+
}
113+
103114
pub fn validate_claim(
104115
deps: &DepsMut,
105116
info: MessageInfo,
106117
eth_address: String,
107118
eth_sig: String,
108119
config: Config,
109120
) -> Result<(), ContractError> {
121+
assert_lower_case(eth_address.clone())?;
110122
validate_is_eligible(deps, eth_address.clone())?;
111123
validate_eth_sig(deps, info, eth_address.clone(), eth_sig, config)?;
112124
validate_mints_remaining(deps, &eth_address)?;

contracts/rekt-airdrop/src/error.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,7 @@ pub enum ContractError {
5151

5252
#[error("Plaintext message is too long")]
5353
PlaintextTooLong {},
54+
55+
#[error("Address {address} should be converted to lowercase")]
56+
EthAddressShouldBeLower { address: String },
5457
}

contracts/whitelists/whitelist-immutable/src/contract.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ pub fn instantiate(
4444
fn update_whitelist(deps: &mut DepsMut, msg: InstantiateMsg) -> Result<u64, ContractError> {
4545
let mut count = 0u64;
4646
for address in msg.addresses.into_iter() {
47-
WHITELIST.save(deps.storage, &address, &true)?;
47+
let address_lower = address.clone().to_ascii_lowercase();
48+
WHITELIST.save(deps.storage, &address_lower, &true)?;
4849
count += 1;
4950
}
5051
Ok(count)

test-suite/src/dydx_airdrop/tests/test_claim.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,3 +593,65 @@ fn test_two_claims_allowed_success() {
593593
}];
594594
assert_eq!(balances, expected_balance)
595595
}
596+
597+
#[test]
598+
fn test_claim_converts_to_lowercase() {
599+
let claim_plaintext = &get_msg_plaintext(STARGAZE_WALLET_01.to_string());
600+
let (_, eth_sig_str, _, eth_addr_str) = get_wallet_and_sig(claim_plaintext.clone());
601+
602+
let stargaze_wallet_01 = Addr::unchecked(STARGAZE_WALLET_01);
603+
604+
let mut app = custom_mock_app();
605+
configure_mock_minter_with_mock_whitelist(&mut app);
606+
let minter_addr = Addr::unchecked(MOCK_MINTER_ADDR_STR);
607+
let airdrop_contract = Addr::unchecked(MOCK_AIRDROP_ADDR_STR);
608+
609+
let mut mixed_case = vec![];
610+
let mut to_upper = true;
611+
for char in eth_addr_str.chars() {
612+
if !to_upper {
613+
mixed_case.extend([char.to_string().to_lowercase()]);
614+
} else {
615+
mixed_case.extend([char.to_string().to_uppercase()]);
616+
}
617+
to_upper = !to_upper;
618+
}
619+
let mixed_case_eth_addr: String = mixed_case.into_iter().collect();
620+
621+
let params = InstantiateParams {
622+
addresses: vec![mixed_case_eth_addr.clone()],
623+
funds_amount: WHITELIST_AMOUNT + INSTANTIATION_FEE,
624+
expected_airdrop_contract_id: 4,
625+
minter_address: minter_addr.clone(),
626+
admin_account: Addr::unchecked(OWNER),
627+
app: &mut app,
628+
per_address_limit: 1,
629+
claim_msg_plaintext: CONFIG_PLAINTEXT.to_string(),
630+
};
631+
instantiate_contract(params).unwrap();
632+
query_minter_as_expected(&mut app, airdrop_contract.clone(), minter_addr);
633+
let balances = app
634+
.wrap()
635+
.query_all_balances(stargaze_wallet_01.clone())
636+
.unwrap();
637+
assert_eq!(balances, []);
638+
639+
let claim_message = ExecuteMsg::ClaimAirdrop {
640+
eth_address: mixed_case_eth_addr,
641+
eth_sig: eth_sig_str,
642+
};
643+
let _ = execute_contract_with_msg(
644+
claim_message,
645+
&mut app,
646+
stargaze_wallet_01.clone(),
647+
airdrop_contract,
648+
)
649+
.unwrap();
650+
651+
let balances = app.wrap().query_all_balances(stargaze_wallet_01).unwrap();
652+
let expected_balance = [Coin {
653+
denom: NATIVE_DENOM.to_string(),
654+
amount: Uint128::new(WHITELIST_AMOUNT),
655+
}];
656+
assert_eq!(balances, expected_balance)
657+
}

test-suite/src/rekt_airdrop/tests/test_claim.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ fn test_instantiate() {
3939
let minter_address = Addr::unchecked("contract1");
4040
let claim_plaintext = &get_msg_plaintext(STARGAZE_WALLET_01.to_string());
4141
let (_, _, _, eth_addr_str) = get_wallet_and_sig(claim_plaintext.clone());
42+
4243
let params = InstantiateParams {
4344
addresses: vec![eth_addr_str],
4445
funds_amount: WHITELIST_AMOUNT + INSTANTIATION_FEE,
@@ -593,3 +594,65 @@ fn test_two_claims_allowed_success() {
593594
}];
594595
assert_eq!(balances, expected_balance)
595596
}
597+
598+
#[test]
599+
fn test_claim_converts_to_lowercase() {
600+
let claim_plaintext = &get_msg_plaintext(STARGAZE_WALLET_01.to_string());
601+
let (_, eth_sig_str, _, eth_addr_str) = get_wallet_and_sig(claim_plaintext.clone());
602+
603+
let stargaze_wallet_01 = Addr::unchecked(STARGAZE_WALLET_01);
604+
605+
let mut app = custom_mock_app();
606+
configure_mock_minter_with_mock_whitelist(&mut app);
607+
let minter_addr = Addr::unchecked(MOCK_MINTER_ADDR_STR);
608+
let airdrop_contract = Addr::unchecked(MOCK_AIRDROP_ADDR_STR);
609+
610+
let mut mixed_case = vec![];
611+
let mut to_upper = true;
612+
for char in eth_addr_str.chars() {
613+
if !to_upper {
614+
mixed_case.extend([char.to_string().to_lowercase()]);
615+
} else {
616+
mixed_case.extend([char.to_string().to_uppercase()]);
617+
}
618+
to_upper = !to_upper;
619+
}
620+
let mixed_case_eth_addr: String = mixed_case.into_iter().collect();
621+
622+
let params = InstantiateParams {
623+
addresses: vec![mixed_case_eth_addr.clone()],
624+
funds_amount: WHITELIST_AMOUNT + INSTANTIATION_FEE,
625+
expected_airdrop_contract_id: 4,
626+
minter_address: minter_addr.clone(),
627+
admin_account: Addr::unchecked(OWNER),
628+
app: &mut app,
629+
per_address_limit: 1,
630+
claim_msg_plaintext: CONFIG_PLAINTEXT.to_string(),
631+
};
632+
instantiate_contract(params).unwrap();
633+
query_minter_as_expected(&mut app, airdrop_contract.clone(), minter_addr);
634+
let balances = app
635+
.wrap()
636+
.query_all_balances(stargaze_wallet_01.clone())
637+
.unwrap();
638+
assert_eq!(balances, []);
639+
640+
let claim_message = ExecuteMsg::ClaimAirdrop {
641+
eth_address: mixed_case_eth_addr,
642+
eth_sig: eth_sig_str,
643+
};
644+
let _ = execute_contract_with_msg(
645+
claim_message,
646+
&mut app,
647+
stargaze_wallet_01.clone(),
648+
airdrop_contract,
649+
)
650+
.unwrap();
651+
652+
let balances = app.wrap().query_all_balances(stargaze_wallet_01).unwrap();
653+
let expected_balance = [Coin {
654+
denom: NATIVE_DENOM.to_string(),
655+
amount: Uint128::new(WHITELIST_AMOUNT),
656+
}];
657+
assert_eq!(balances, expected_balance)
658+
}

0 commit comments

Comments
 (0)