瀏覽代碼

cosmwasm: remove terraswap dependency (#2739)

* cosmwasm: remove terraswap dependency

* add test to ensure serialization is the same
Nikhil Suri 2 年之前
父節點
當前提交
842462fd78

+ 1 - 0
cosmwasm/Cargo.lock

@@ -1742,6 +1742,7 @@ dependencies = [
  "hex",
  "schemars",
  "serde",
+ "serde-json-wasm",
  "sha3 0.9.1",
  "terraswap",
  "thiserror",

+ 4 - 1
cosmwasm/contracts/token-bridge/Cargo.toml

@@ -26,8 +26,11 @@ serde = { version = "1.0.137", default-features = false, features = ["derive"] }
 cw20 = "0.13.2"
 cw20-base = { version = "0.13.2", features = ["library"] }
 cw20-wrapped-2 = { version = "0.1.0", features = ["library"] }
-terraswap = "2.6.1"
 wormhole-cosmwasm = { version = "0.1.0", default-features = false, features = ["library"] }
 thiserror = { version = "1.0.31" }
 sha3 = { version = "0.9.1", default-features = false }
 hex = "0.4.2"
+
+[dev-dependencies]
+terraswap = "2.6.1"
+serde-json-wasm = "0.4"

+ 3 - 4
cosmwasm/contracts/token-bridge/src/contract.rs

@@ -8,7 +8,6 @@ use std::{
     cmp::{max, min},
     str::FromStr,
 };
-use terraswap::asset::{Asset, AssetInfo};
 
 use cw_wormhole::{
     byte_utils::{
@@ -31,9 +30,9 @@ use cosmwasm_std::{
 
 use crate::{
     msg::{
-        ChainRegistrationResponse, CompleteTransferResponse, ExecuteMsg, ExternalIdResponse,
-        InstantiateMsg, IsVaaRedeemedResponse, MigrateMsg, QueryMsg, TransferInfoResponse,
-        WrappedRegistryResponse,
+        Asset, AssetInfo, ChainRegistrationResponse, CompleteTransferResponse, ExecuteMsg,
+        ExternalIdResponse, InstantiateMsg, IsVaaRedeemedResponse, MigrateMsg, QueryMsg,
+        TransferInfoResponse, WrappedRegistryResponse,
     },
     state::{
         bridge_contracts, bridge_contracts_read, bridge_deposit, config, config_read,

+ 15 - 1
cosmwasm/contracts/token-bridge/src/msg.rs

@@ -1,7 +1,6 @@
 use cosmwasm_std::{Binary, Uint128};
 use schemars::JsonSchema;
 use serde::{Deserialize, Serialize};
-use terraswap::asset::{Asset, AssetInfo};
 
 use crate::token_address::{ExternalTokenId, TokenId};
 
@@ -132,3 +131,18 @@ pub struct CompleteTransferResponse {
     pub relayer: String,
     pub fee: Uint128,
 }
+
+#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
+pub struct Asset {
+    pub info: AssetInfo,
+    pub amount: Uint128,
+}
+
+/// AssetInfo contract_addr is usually passed from the cw20 hook
+/// so we can trust the contract_addr is properly validated.
+#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
+#[serde(rename_all = "snake_case")]
+pub enum AssetInfo {
+    Token { contract_addr: String },
+    NativeToken { denom: String },
+}

+ 47 - 1
cosmwasm/contracts/token-bridge/src/testing/tests.rs

@@ -1,10 +1,11 @@
 use std::convert::TryInto;
 
-use cosmwasm_std::{Binary, StdResult};
+use cosmwasm_std::{Binary, StdResult, Uint128};
 
 use cw_wormhole::state::ParsedVAA;
 
 use crate::{
+    msg::Asset,
     state::{Action, TokenBridgeMessage, TransferInfo, TransferWithPayloadInfo},
     token_address::ExternalTokenId,
 };
@@ -230,3 +231,48 @@ fn deserialize_transfer_with_payload_vaa() -> StdResult<()> {
 
     Ok(())
 }
+
+// We used to have a dependency on terraswap::asset::Asset to encode whether assets are native tokens or cw20 tokens in execute msgs.
+// We removed this dependency in favor of using the same structs defined in our own codebase.
+// This test ensures that the serialization of these structs matches so that the change is backwards compatible.
+#[test]
+fn terraswap_serialization_match() {
+    let denom = "utest".to_string();
+    let contract_addr =
+        "sei1nna9mzp274djrgzhzkac2gvm3j27l402s4xzr08chq57pjsupqnqaj0d5s".to_string();
+    let amount = Uint128::new(17528070000);
+
+    // assert cw20 token serialization formats are the same
+    let ts_token_asset = serde_json_wasm::to_vec(&terraswap::asset::Asset {
+        info: terraswap::asset::AssetInfo::Token {
+            contract_addr: contract_addr.clone(),
+        },
+        amount,
+    })
+    .unwrap();
+
+    let token_asset = serde_json_wasm::to_vec(&Asset {
+        info: crate::msg::AssetInfo::Token { contract_addr },
+        amount,
+    })
+    .unwrap();
+
+    assert_eq!(ts_token_asset, token_asset);
+
+    // assert native token serialization formats are the same
+    let ts_native_token = serde_json_wasm::to_vec(&terraswap::asset::Asset {
+        info: terraswap::asset::AssetInfo::NativeToken {
+            denom: denom.clone(),
+        },
+        amount,
+    })
+    .unwrap();
+
+    let native_token = serde_json_wasm::to_vec(&Asset {
+        info: crate::msg::AssetInfo::NativeToken { denom },
+        amount,
+    })
+    .unwrap();
+
+    assert_eq!(ts_native_token, native_token);
+}