Skip to content

Commit 781c04d

Browse files
author
yihuang
authored
Problem: external token mapping not manageable directly (#128)
* Problem: external token mapping not manageable directly Closes: #119 Solution: - add native message to update token mapping unit tests Update x/cronos/keeper/msg_server.go fix lint fix msgs * changelog * fix tests
1 parent 69a652f commit 781c04d

18 files changed

Lines changed: 887 additions & 66 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ We also enable swagger doc ui and add the token mapping state in genesis.
2424

2525
- [cronos#110](https://github.com/crypto-org-chain/cronos/pull/110) embed swagger doc ui
2626
- [cronos#113](https://github.com/crypto-org-chain/cronos/pull/113) export token mapping state to genesis
27+
- [cronos#128](https://github.com/crypto-org-chain/cronos/pull/128) add native message to update token mapping
2728

2829
*September 22, 2021*
2930
## v0.5.4

app/test_helpers.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
3131
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
3232
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
33+
cronostypes "github.com/crypto-org-chain/cronos/x/cronos/types"
3334
)
3435

3536
const (
@@ -67,8 +68,14 @@ func setup(withGenesis bool, invCheckPeriod uint) (*App, GenesisState) {
6768
}
6869

6970
// Setup initializes a new App. A Nop logger is set in App.
70-
func Setup(isCheckTx bool) *App {
71+
func Setup(isCheckTx bool, cronosAdmin string) *App {
7172
app, genesisState := setup(!isCheckTx, 5)
73+
74+
// set cronos_admin for test
75+
cronosGen := cronostypes.DefaultGenesis()
76+
cronosGen.Params.CronosAdmin = cronosAdmin
77+
genesisState["cronos"] = app.cdc.MustMarshalJSON(cronosGen)
78+
7279
if !isCheckTx {
7380
// init chain must be called to stop deliverState from being nil
7481
stateBytes, err := json.MarshalIndent(genesisState, "", " ")

docs/api/proto-docs.md

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
- [MsgConvertVouchersResponse](#cronos.MsgConvertVouchersResponse)
2626
- [MsgTransferTokens](#cronos.MsgTransferTokens)
2727
- [MsgTransferTokensResponse](#cronos.MsgTransferTokensResponse)
28+
- [MsgUpdateTokenMapping](#cronos.MsgUpdateTokenMapping)
29+
- [MsgUpdateTokenMappingResponse](#cronos.MsgUpdateTokenMappingResponse)
2830

2931
- [Msg](#cronos.Msg)
3032

@@ -49,6 +51,7 @@ Params defines the parameters for the cronos module.
4951
| ----- | ---- | ----- | ----------- |
5052
| `ibc_cro_denom` | [string](#string) | | |
5153
| `ibc_timeout` | [uint64](#uint64) | | |
54+
| `cronos_admin` | [string](#string) | | the admin address who can update token mapping |
5255

5356

5457

@@ -274,7 +277,32 @@ MsgTransferTokens represents a message to transfer cronos evm coins through ibc.
274277
### MsgTransferTokensResponse
275278
MsgTransferTokensResponse defines the TransferTokens response type.
276279

277-
this line is used by starport scaffolding # proto/tx/message
280+
281+
282+
283+
284+
285+
<a name="cronos.MsgUpdateTokenMapping"></a>
286+
287+
### MsgUpdateTokenMapping
288+
MsgUpdateTokenMapping defines the request type
289+
290+
291+
| Field | Type | Label | Description |
292+
| ----- | ---- | ----- | ----------- |
293+
| `sender` | [string](#string) | | |
294+
| `denom` | [string](#string) | | |
295+
| `contract` | [string](#string) | | |
296+
297+
298+
299+
300+
301+
302+
<a name="cronos.MsgUpdateTokenMappingResponse"></a>
303+
304+
### MsgUpdateTokenMappingResponse
305+
MsgUpdateTokenMappingResponse defines the response type
278306

279307

280308

@@ -296,6 +324,7 @@ Msg defines the Cronos Msg service
296324
| ----------- | ------------ | ------------- | ------------| ------- | -------- |
297325
| `ConvertVouchers` | [MsgConvertVouchers](#cronos.MsgConvertVouchers) | [MsgConvertVouchersResponse](#cronos.MsgConvertVouchersResponse) | ConvertVouchers defines a method for converting ibc voucher to cronos evm coins. | |
298326
| `TransferTokens` | [MsgTransferTokens](#cronos.MsgTransferTokens) | [MsgTransferTokensResponse](#cronos.MsgTransferTokensResponse) | TransferTokens defines a method to transfer cronos evm coins to another chain through IBC | |
327+
| `UpdateTokenMapping` | [MsgUpdateTokenMapping](#cronos.MsgUpdateTokenMapping) | [MsgUpdateTokenMappingResponse](#cronos.MsgUpdateTokenMappingResponse) | UpdateTokenMapping defines a method to update token mapping | |
299328

300329
<!-- end services -->
301330

integration_tests/cosmoscli.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -983,3 +983,17 @@ def gov_propose_token_mapping_change(self, denom, contract, **kwargs):
983983
**kwargs,
984984
)
985985
)
986+
987+
def update_token_mapping(self, denom, contract, **kwargs):
988+
return json.loads(
989+
self.raw(
990+
"tx",
991+
"cronos",
992+
"update-token-mapping",
993+
denom,
994+
contract,
995+
"-y",
996+
home=self.data_dir,
997+
**kwargs,
998+
)
999+
)

integration_tests/test_gravity.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,3 +271,60 @@ def check():
271271
return balance == 10
272272

273273
wait_for_fn("check balance on cronos", check)
274+
275+
276+
def test_direct_token_mapping(gravity):
277+
"""
278+
Test adding a token mapping directly
279+
- deploy test erc20 contract on geth
280+
- deploy corresponding contract on cronos
281+
- add the token mapping on cronos using gov module
282+
- do a gravity transfer, check the balances
283+
"""
284+
geth = gravity.geth
285+
cli = gravity.cronos.cosmos_cli()
286+
cronos_w3 = gravity.cronos.w3
287+
288+
# deploy test erc20 contract
289+
erc20 = deploy_contract(
290+
geth,
291+
Path(__file__).parent
292+
/ "contracts/artifacts/contracts/TestERC20A.sol/TestERC20A.json",
293+
)
294+
print("erc20 contract", erc20.address)
295+
crc20 = deploy_contract(
296+
cronos_w3,
297+
Path(__file__).parent
298+
/ "contracts/artifacts/contracts/TestERC20Utility.sol/TestERC20Utility.json",
299+
)
300+
print("crc20 contract", crc20.address)
301+
denom = f"gravity{erc20.address}"
302+
303+
print("check the contract mapping not exists yet")
304+
with pytest.raises(AssertionError):
305+
cli.query_contract_by_denom(denom)
306+
307+
rsp = cli.update_token_mapping(denom, crc20.address, from_="community")
308+
assert rsp["code"] != 0, "should not have the permission"
309+
310+
rsp = cli.update_token_mapping(denom, crc20.address, from_="validator")
311+
assert rsp["code"] == 0, rsp["raw_log"]
312+
wait_for_new_blocks(cli, 1)
313+
314+
print("check the contract mapping exists now")
315+
rsp = cli.query_contract_by_denom(denom)
316+
print("contract", rsp)
317+
assert rsp["contract"] == crc20.address
318+
319+
print("try to send token from ethereum to cronos")
320+
txreceipt = send_to_cosmos(
321+
gravity.contract, erc20, ADDRS["community"], 10, KEYS["validator"]
322+
)
323+
assert txreceipt.status == 1
324+
325+
def check():
326+
balance = crc20.caller.balanceOf(ADDRS["community"])
327+
print("crc20 balance", balance)
328+
return balance == 10
329+
330+
wait_for_fn("check balance on cronos", check)

proto/cronos/cronos.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ message Params {
1111
string ibc_cro_denom = 1
1212
[ (gogoproto.moretags) = "yaml:\"ibc_cro_denom,omitempty\"" ];
1313
uint64 ibc_timeout = 2;
14+
// the admin address who can update token mapping
15+
string cronos_admin = 3;
1416
}
1517

1618
// TokenMappingChangeProposal defines a proposal to change one token mapping.

proto/cronos/tx.proto

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ service Msg {
1717

1818
// TransferTokens defines a method to transfer cronos evm coins to another chain through IBC
1919
rpc TransferTokens(MsgTransferTokens) returns (MsgTransferTokensResponse);
20+
21+
// UpdateTokenMapping defines a method to update token mapping
22+
rpc UpdateTokenMapping(MsgUpdateTokenMapping) returns (MsgUpdateTokenMappingResponse);
2023
}
2124

2225
// MsgConvertVouchers represents a message to convert ibc voucher coins to cronos evm coins.
@@ -39,4 +42,16 @@ message MsgConvertVouchersResponse {}
3942

4043
// MsgTransferTokensResponse defines the TransferTokens response type.
4144
message MsgTransferTokensResponse {}
45+
46+
// MsgUpdateTokenMapping defines the request type
47+
message MsgUpdateTokenMapping {
48+
string sender = 1;
49+
string denom = 2;
50+
string contract = 3;
51+
}
52+
53+
// MsgUpdateTokenMappingResponse defines the response type
54+
message MsgUpdateTokenMappingResponse {
55+
}
56+
4257
// this line is used by starport scaffolding # proto/tx/message

scripts/cronos-devnet.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ cronos_777-1:
2121
evm:
2222
params:
2323
evm_denom: basetcro
24+
cronos:
25+
params:
26+
cronos_admin: crc12luku6uxehhak02py4rcz65zu0swh7wjsrw0pp
2427
gov:
2528
voting_params:
2629
voting_period: "10s"

x/cronos/client/cli/tx.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ func GetTxCmd() *cobra.Command {
3333

3434
cmd.AddCommand(CmdConvertTokens())
3535
cmd.AddCommand(CmdSendToCryptoOrg())
36+
cmd.AddCommand(CmdUpdateTokenMapping())
3637

3738
return cmd
3839
}
@@ -174,3 +175,28 @@ $ %s tx gov submit-proposal token-mapping-change gravity0x0000...0000 0x0000...0
174175

175176
return cmd
176177
}
178+
179+
// CmdUpdateTokenMapping returns a CLI command handler for update token mapping
180+
func CmdUpdateTokenMapping() *cobra.Command {
181+
cmd := &cobra.Command{
182+
Use: "update-token-mapping [denom] [contract]",
183+
Short: "Update token mapping",
184+
Args: cobra.ExactArgs(2),
185+
RunE: func(cmd *cobra.Command, args []string) error {
186+
clientCtx, err := client.GetClientTxContext(cmd)
187+
if err != nil {
188+
return err
189+
}
190+
191+
msg := types.NewMsgUpdateTokenMapping(clientCtx.GetFromAddress().String(), args[0], args[1])
192+
if err := msg.ValidateBasic(); err != nil {
193+
return err
194+
}
195+
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
196+
},
197+
}
198+
199+
flags.AddTxFlagsToCmd(cmd)
200+
201+
return cmd
202+
}

x/cronos/handler.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ func NewHandler(k keeper.Keeper) sdk.Handler {
2727
case *types.MsgTransferTokens:
2828
res, err := msgServer.TransferTokens(sdk.WrapSDKContext(ctx), msg)
2929
return sdk.WrapServiceResult(ctx, res, err)
30+
case *types.MsgUpdateTokenMapping:
31+
res, err := msgServer.UpdateTokenMapping(sdk.WrapSDKContext(ctx), msg)
32+
return sdk.WrapServiceResult(ctx, res, err)
3033
default:
3134
errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg)
3235
return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg)

0 commit comments

Comments
 (0)