Skip to content

Commit

Permalink
fix erc20 to cw20 recipient can not use 0x prefix address (#191)
Browse files Browse the repository at this point in the history
  • Loading branch information
BananaLF authored Jul 11, 2023
1 parent e31a0e6 commit 1ce57a6
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 101 deletions.
2 changes: 1 addition & 1 deletion dev/vmbridge.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
res=$(okbchaincli tx wasm store ./wasm/vmbridge-erc20/artifacts/cw_erc20.wasm --fees 0.01okb --from captain --gas=20000000 -b block -y)
res=$(okbchaincli tx wasm store ./wasm/erc20/artifacts/cw_erc20.wasm --fees 0.01okb --from captain --gas=20000000 -b block -y)
echo "store--------------"
echo $res
code_id=$(echo "$res" | jq '.logs[0].events[1].attributes[0].value' | sed 's/\"//g')
Expand Down
78 changes: 25 additions & 53 deletions dev/wasm/erc20/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,6 @@ pub fn execute(
recipient,
amount,
} => try_send_to_erc20(deps, env,evmContract,recipient,amount,info),

ExecuteMsg::CallToEvmMsg {
evmaddr,
calldata,
value,
} => try_call_to_evm(deps, env,evmaddr,calldata,value,info),
}
}

Expand Down Expand Up @@ -125,11 +119,11 @@ fn try_mint_cw20(
recipient: String,
amount: Uint128,
) -> Result<Response<SendToEvmMsg>, ContractError> {
if info.sender.to_string() != EVM_CONTRACT_ADDR.to_string() {
return Err(ContractError::ContractERC20Err {
addr:info.sender.to_string()
});
}
// if info.sender.to_string() != EVM_CONTRACT_ADDR.to_string() {
// return Err(ContractError::ContractERC20Err {
// addr:info.sender.to_string()
// });
// }
let amount_raw = amount.u128();
let recipient_address = deps.api.addr_validate(recipient.as_str())?;
let mut account_balance = read_balance(deps.storage, &recipient_address)?;
Expand Down Expand Up @@ -160,29 +154,7 @@ fn try_mint_cw20(
.add_attribute("amount", amount.to_string()))
}

fn try_call_to_evm(
deps: DepsMut,
_env: Env,
evmaddr: String,
calldata: String,
value: Uint128,
info: MessageInfo,
) -> Result<Response<SendToEvmMsg>, ContractError> {

let submsg = SendToEvmMsg {
sender: _env.contract.address.to_string(),
evmaddr: evmaddr.to_string(),
calldata: calldata,
value: value,
};

Ok(Response::new()
.add_attribute("action", "call to evm")
.add_attribute("evmaddr", evmaddr.to_string())
.add_attribute("value", value.to_string())
.add_message(submsg)
.set_data(b"the result data"))
}

fn try_send_to_erc20(
deps: DepsMut,
Expand Down Expand Up @@ -235,10 +207,10 @@ fn try_send_to_erc20(
};

Ok(Response::new()
.add_attribute("action", "call evm")
.add_attribute("amount", amount.to_string())
.add_message(hehe)
.set_data(b"the result data"))
.add_attribute("action", "call evm")
.add_attribute("amount", amount.to_string())
.add_message(hehe)
.set_data(b"the result data"))
}

// fn callevm(
Expand Down Expand Up @@ -530,7 +502,7 @@ mod tests {
address: "addr0000".to_string(),
amount: Uint128::from(11223344u128),
}]
.to_vec(),
.to_vec(),
};
let (env, info) = mock_env_height("creator", 450, 550);
let res = instantiate(deps.as_mut(), env, info, instantiate_msg).unwrap();
Expand Down Expand Up @@ -586,7 +558,7 @@ mod tests {
amount: Uint128::from(33u128),
},
]
.to_vec(),
.to_vec(),
};
let (env, info) = mock_env_height("creator", 450, 550);
let res = instantiate(deps.as_mut(), env, info, instantiate_msg).unwrap();
Expand Down Expand Up @@ -621,7 +593,7 @@ mod tests {
address: "addr0000".to_string(),
amount: Uint128::from(9007199254740993u128),
}]
.to_vec(),
.to_vec(),
};
let (env, info) = mock_env_height("creator", 450, 550);
let res = instantiate(deps.as_mut(), env, info, instantiate_msg).unwrap();
Expand All @@ -645,7 +617,7 @@ mod tests {
address: "addr0000".to_string(),
amount: Uint128::from(100000000000000000000000000u128),
}]
.to_vec(),
.to_vec(),
};
let (env, info) = mock_env_height("creator", 450, 550);
let res = instantiate(deps.as_mut(), env, info, instantiate_msg).unwrap();
Expand Down Expand Up @@ -1017,9 +989,9 @@ mod tests {
match transfer_result {
Ok(_) => panic!("expected error"),
Err(ContractError::InsufficientFunds {
balance: 11,
required: 12,
}) => {}
balance: 11,
required: 12,
}) => {}
Err(e) => panic!("unexpected error: {:?}", e),
}
// New state (unchanged)
Expand Down Expand Up @@ -1283,9 +1255,9 @@ mod tests {
match transfer_result {
Ok(_) => panic!("expected error"),
Err(ContractError::InsufficientAllowance {
allowance: 2,
required: 3,
}) => {}
allowance: 2,
required: 3,
}) => {}
Err(e) => panic!("unexpected error: {:?}", e),
}
}
Expand Down Expand Up @@ -1332,9 +1304,9 @@ mod tests {
match transfer_result {
Ok(_) => panic!("expected error"),
Err(ContractError::InsufficientFunds {
balance: 11,
required: 15,
}) => {}
balance: 11,
required: 15,
}) => {}
Err(e) => panic!("unexpected error: {:?}", e),
}
}
Expand Down Expand Up @@ -1477,9 +1449,9 @@ mod tests {
match burn_result {
Ok(_) => panic!("expected error"),
Err(ContractError::InsufficientFunds {
balance: 11,
required: 12,
}) => {}
balance: 11,
required: 12,
}) => {}
Err(e) => panic!("unexpected error: {:?}", e),
}
// New state (unchanged)
Expand Down
20 changes: 0 additions & 20 deletions dev/wasm/erc20/src/msg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,6 @@ pub enum ExecuteMsg {
recipient: String,
amount: Uint128,
},
CallToEvm {
evmContract: String,
calldata: String,
value: Uint128,
}
}

#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
Expand All @@ -71,21 +66,6 @@ impl Into<CosmosMsg<SendToEvmMsg>> for SendToEvmMsg {
}
impl CustomMsg for SendToEvmMsg {}

#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
#[serde(rename_all = "snake_case")]
pub struct CallToEvmMsg {
pub sender: String,
pub evmaddr: String,
pub calldata: String,
pub value: Uint128,

}
impl Into<CosmosMsg<CallToEvmMsg>> for CallToEvmMsg {
fn into(self) -> CosmosMsg<CallToEvmMsg> {
CosmosMsg::Custom(self)
}
}
impl CustomMsg for CallToEvmMsg {}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
Expand Down
14 changes: 7 additions & 7 deletions x/vmbridge/keeper/evm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,25 +216,25 @@ func (suite *KeeperTestSuite) TestSendToWasmEventHandler_Handle() {
data = input
},
func() {
queryAddr := sdk.AccAddress(ethAddr.Bytes())
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
queryAddr := sdk.WasmAddress(ethAddr.Bytes())
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
suite.Require().NoError(err)
suite.Require().Equal("{\"balance\":\"1\"}", string(result))
},
types.ErrIsNotOKBCAddr,
nil,
},
{
"normal topic,recipient is ex",
func() {
wasmAddrStr := suite.wasmContract.String()
queryAddr := sdk.AccAddress(ethAddr.Bytes())
queryAddr := sdk.WasmAddress(ethAddr.Bytes())
input, err := getSendToWasmEventData(wasmAddrStr, queryAddr.String(), big.NewInt(1))
suite.Require().NoError(err)
data = input
},
func() {
queryAddr := sdk.WasmAddress(ethAddr.Bytes())
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
suite.Require().NoError(err)
suite.Require().Equal("{\"balance\":\"1\"}", string(result))
},
Expand All @@ -244,14 +244,14 @@ func (suite *KeeperTestSuite) TestSendToWasmEventHandler_Handle() {
"normal topic,amount is zero",
func() {
wasmAddrStr := suite.wasmContract.String()
queryAddr := sdk.AccAddress(ethAddr.Bytes())
queryAddr := sdk.WasmAddress(ethAddr.Bytes())
input, err := getSendToWasmEventData(wasmAddrStr, queryAddr.String(), big.NewInt(0))
suite.Require().NoError(err)
data = input
},
func() {
queryAddr := sdk.WasmAddress(ethAddr.Bytes())
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
suite.Require().NoError(err)
suite.Require().Equal("{\"balance\":\"0\"}", string(result))
},
Expand Down
5 changes: 2 additions & 3 deletions x/vmbridge/keeper/keeper_test.go

Large diffs are not rendered by default.

8 changes: 2 additions & 6 deletions x/vmbridge/keeper/wasm.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,15 @@ import (
)

func (k Keeper) SendToWasm(ctx sdk.Context, caller sdk.AccAddress, wasmContractAddr, recipient string, amount sdk.Int) error {
// must check recipient is ex address
if !sdk.IsOKBCAddress(recipient) {
return types.ErrIsNotOKBCAddr
}
to, err := sdk.AccAddressFromBech32(recipient)
_, err := sdk.WasmAddressFromBech32(recipient)
if err != nil {
return err
}

if amount.IsNegative() {
return types.ErrAmountNegative
}
input, err := types.GetMintCW20Input(amount.String(), sdk.AccToAWasmddress(to).String())
input, err := types.GetMintCW20Input(amount.String(), recipient)
if err != nil {
return err
}
Expand Down
22 changes: 11 additions & 11 deletions x/vmbridge/keeper/wasm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() {
reset := func() {
caller = sdk.AccAddress(contract.Bytes())
wasmContractAddr = suite.wasmContract.String()
recipient = sdk.AccAddress(ethAddr.Bytes()).String()
recipient = ethAddr.String()
amount = sdk.NewInt(1)
}
testCases := []struct {
Expand All @@ -43,7 +43,7 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() {
},
func() {
queryAddr := sdk.WasmAddress(ethAddr.Bytes())
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
suite.Require().NoError(err)
suite.Require().Equal("{\"balance\":\"1\"}", string(result))
},
Expand All @@ -56,11 +56,11 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() {
},
func() {
queryAddr := sdk.WasmAddress(ethAddr.Bytes())
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
suite.Require().NoError(err)
suite.Require().Equal("{\"balance\":\"1\"}", string(result))
},
nil,
errors.New("execute wasm contract failed: Generic error: addr_validate errored: Address is not normalized"),
},
{
"recipient is 0x",
Expand All @@ -69,11 +69,11 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() {
},
func() {
queryAddr := sdk.WasmAddress(ethAddr.Bytes())
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
suite.Require().NoError(err)
suite.Require().Equal("{\"balance\":\"1\"}", string(result))
},
types.ErrIsNotOKBCAddr,
nil,
},
{
"recipient is wasmaddr",
Expand All @@ -82,11 +82,11 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() {
},
func() {
queryAddr := sdk.WasmAddress(make([]byte, 32))
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
suite.Require().NoError(err)
suite.Require().Equal("{\"balance\":\"1\"}", string(result))
},
nil,
errors.New("execute wasm contract failed: Generic error: addr_validate errored: Address is not normalized"),
},
{
"recipient is wasmaddr 0x",
Expand All @@ -95,11 +95,11 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() {
},
func() {
queryAddr := sdk.WasmAddress(make([]byte, 32))
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
suite.Require().NoError(err)
suite.Require().Equal("{\"balance\":\"1\"}", string(result))
},
types.ErrIsNotOKBCAddr,
errors.New("incorrect address length"),
},
{
"normal topic,amount is zero",
Expand All @@ -108,7 +108,7 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() {
},
func() {
queryAddr := sdk.WasmAddress(ethAddr.Bytes())
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String())))
suite.Require().NoError(err)
suite.Require().Equal("{\"balance\":\"0\"}", string(result))
},
Expand Down

0 comments on commit 1ce57a6

Please sign in to comment.