wormhole/terra/contracts/token-bridge/src/testing/tests.rs

222 lines
11 KiB
Rust

use cosmwasm_std::{Binary, StdResult};
use wormhole::state::ParsedVAA;
use crate::{
contract::{build_asset_id, build_native_id},
state::{Action, TokenBridgeMessage, TransferInfo, TransferWithPayloadInfo},
};
#[test]
fn binary_check() -> StdResult<()> {
let x = vec![
1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 96u8, 180u8, 94u8, 195u8, 0u8, 0u8, 0u8,
1u8, 0u8, 3u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 38u8, 229u8,
4u8, 215u8, 149u8, 163u8, 42u8, 54u8, 156u8, 236u8, 173u8, 168u8, 72u8, 220u8, 100u8, 90u8,
154u8, 159u8, 160u8, 215u8, 0u8, 91u8, 48u8, 44u8, 48u8, 44u8, 51u8, 44u8, 48u8, 44u8,
48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8,
44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 53u8, 55u8, 44u8, 52u8, 54u8, 44u8, 50u8, 53u8,
53u8, 44u8, 53u8, 48u8, 44u8, 50u8, 52u8, 51u8, 44u8, 49u8, 48u8, 54u8, 44u8, 49u8, 50u8,
50u8, 44u8, 49u8, 49u8, 48u8, 44u8, 49u8, 50u8, 53u8, 44u8, 56u8, 56u8, 44u8, 55u8, 51u8,
44u8, 49u8, 56u8, 57u8, 44u8, 50u8, 48u8, 55u8, 44u8, 49u8, 48u8, 52u8, 44u8, 56u8, 51u8,
44u8, 49u8, 49u8, 57u8, 44u8, 49u8, 50u8, 55u8, 44u8, 49u8, 57u8, 50u8, 44u8, 49u8, 52u8,
55u8, 44u8, 56u8, 57u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8,
48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8,
44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8,
48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8,
44u8, 48u8, 44u8, 48u8, 44u8, 51u8, 44u8, 50u8, 51u8, 50u8, 44u8, 48u8, 44u8, 51u8, 44u8,
48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8,
44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 48u8, 44u8, 53u8, 51u8, 44u8, 49u8, 49u8, 54u8,
44u8, 52u8, 56u8, 44u8, 49u8, 49u8, 54u8, 44u8, 49u8, 52u8, 57u8, 44u8, 49u8, 48u8, 56u8,
44u8, 49u8, 49u8, 51u8, 44u8, 56u8, 44u8, 48u8, 44u8, 50u8, 51u8, 50u8, 44u8, 52u8, 57u8,
44u8, 49u8, 53u8, 50u8, 44u8, 49u8, 44u8, 50u8, 56u8, 44u8, 50u8, 48u8, 51u8, 44u8, 50u8,
49u8, 50u8, 44u8, 50u8, 50u8, 49u8, 44u8, 50u8, 52u8, 49u8, 44u8, 56u8, 53u8, 44u8, 49u8,
48u8, 57u8, 93u8,
];
let b = Binary::from(x.clone());
let y: Vec<u8> = b.into();
assert_eq!(x, y);
Ok(())
}
#[test]
fn build_native_and_asset_ids() -> StdResult<()> {
let denom = "uusd";
let native_id = build_native_id(denom);
let expected_native_id = vec![
0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 117u8,
117u8, 115u8, 100u8,
];
assert_eq!(&native_id, &expected_native_id, "native_id != expected");
// weth
let chain = 2u16;
let token_address = "000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2";
let token_address = hex::decode(token_address).unwrap();
let asset_id = build_asset_id(chain, token_address.as_slice());
let expected_asset_id = vec![
171u8, 106u8, 233u8, 80u8, 14u8, 139u8, 124u8, 78u8, 181u8, 77u8, 142u8, 76u8, 109u8, 81u8,
55u8, 100u8, 139u8, 159u8, 42u8, 85u8, 172u8, 234u8, 0u8, 114u8, 11u8, 82u8, 40u8, 40u8,
50u8, 73u8, 211u8, 135u8,
];
assert_eq!(&asset_id, &expected_asset_id, "asset_id != expected");
Ok(())
}
#[test]
fn deserialize_transfer_vaa() -> StdResult<()> {
let signed_vaa = "\
010000000001003f3179d5bb17b6f2ecc13741ca3f78d922043e99e09975e390\
4332d2418bb3f16d7ac93ca8401f8bed1cf9827bc806ecf7c5a283340f033bf4\
72724abf1d274f00000000000000000000010000000000000000000000000000\
00000000000000000000000000000000ffff0000000000000000000100000000\
00000000000000000000000000000000000000000000000005f5e10001000000\
0000000000000000000000000000000000000000000000007575736400030000\
00000000000000000000f7f7dde848e7450a029cd0a9bd9bdae4b5147db30003\
00000000000000000000000000000000000000000000000000000000000f4240";
let signed_vaa = hex::decode(signed_vaa).unwrap();
let parsed = ParsedVAA::deserialize(signed_vaa.as_slice())?;
let message = TokenBridgeMessage::deserialize(&parsed.payload)?;
assert_eq!(
message.action,
Action::TRANSFER,
"message.action != expected"
);
let info = TransferInfo::deserialize(&message.payload)?;
let amount = (0u128, 100_000_000u128);
assert_eq!(info.amount, amount, "info.amount != expected");
let token_address = "0100000000000000000000000000000000000000000000000000000075757364";
let token_address = hex::decode(token_address).unwrap();
assert_eq!(
info.token_address.to_vec(),
token_address,
"info.token_address != expected"
);
let token_chain = 3u16;
assert_eq!(
info.token_chain, token_chain,
"info.token_chain != expected"
);
let recipient = "000000000000000000000000f7f7dde848e7450a029cd0a9bd9bdae4b5147db3";
let recipient = hex::decode(recipient).unwrap();
assert_eq!(
info.recipient.to_vec(),
recipient,
"info.recipient != expected"
);
let recipient_chain = 3u16;
assert_eq!(
info.recipient_chain, recipient_chain,
"info.recipient_chain != expected"
);
let fee = (0u128, 1_000_000u128);
assert_eq!(info.fee, fee, "info.fee != expected");
Ok(())
}
#[test]
fn deserialize_transfer_with_payload_vaa() -> StdResult<()> {
// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ Wormhole VAA v1 │ nonce: 2080370133 │ time: 0 │
// │ guardian set #0 │ #4568529024235897313 │ consistency: 32 │
// ├──────────────────────────────────────────────────────────────────────────────┤
// │ Signature: │
// │ #0: 2565e7ae10421624fd81118855acda893e752aeeef31c13fbfc417591ada... │
// ├──────────────────────────────────────────────────────────────────────────────┤
// │ Emitter: 11111111111111111111111111111115 (Solana) │
// ╞══════════════════════════════════════════════════════════════════════════════╡
// │ Token transfer with payload (aka payload 3) │
// │ Amount: 1.0 │
// │ Token: terra1qqqqqqqqqqqqqqqqqqqqqqqqqp6h2umyswfh6y (Terra) │
// │ Recipient: terra13nkgqrfymug724h8pprpexqj9h629sa3ncw7sh (Terra) │
// │ From: 1399a4e782b935d2bb36b97586d3df8747b07dc66902d807eed0ae99e00ed256 │
// ╞══════════════════════════════════════════════════════════════════════════════╡
// │ Custom payload: │
// │ Length: 30 (0x1e) bytes │
// │ 0000: 41 6c 6c 20 79 6f 75 72 20 62 61 73 65 20 61 72 All your base ar│
// │ 0010: 65 20 62 65 6c 6f 6e 67 20 74 6f 20 75 73 e belong to us │
// └──────────────────────────────────────────────────────────────────────────────┘
let signed_vaa = "\
010000000001002565e7ae10421624fd81118855acda893e752aeeef31c13fbf\
c417591ada039822195a1321a72cc4bac1c6031e0595f1c1361ca2a30d941a41\
95fad8020d43d500000000007bffedd500010000000000000000000000000000\
0000000000000000000000000000000000043f66acf143a481e1200300000000\
00000000000000000000000000000000000000000000000005f5e10000000000\
0000000000000000000000000000000000000000000000007575736400030000\
000000000000000000008cec800d24df11e556e708461c98122df4a2c3b10003\
1399a4e782b935d2bb36b97586d3df8747b07dc66902d807eed0ae99e00ed256\
416c6c20796f75722062617365206172652062656c6f6e6720746f207573";
let signed_vaa = hex::decode(signed_vaa).unwrap();
let parsed = ParsedVAA::deserialize(signed_vaa.as_slice())?;
let message = TokenBridgeMessage::deserialize(&parsed.payload)?;
assert_eq!(
message.action,
Action::TRANSFER_WITH_PAYLOAD,
"message.action != expected"
);
let info = TransferWithPayloadInfo::deserialize(&message.payload)?;
let amount = (0u128, 100_000_000u128);
assert_eq!(info.amount, amount, "info.amount != expected");
let token_address = "0000000000000000000000000000000000000000000000000000000075757364";
let token_address = hex::decode(token_address).unwrap();
assert_eq!(
info.token_address.to_vec(),
token_address,
"info.token_address != expected"
);
let token_chain = 3u16;
assert_eq!(
info.token_chain, token_chain,
"info.token_chain != expected"
);
let recipient = "0000000000000000000000008cec800d24df11e556e708461c98122df4a2c3b1";
let recipient = hex::decode(recipient).unwrap();
assert_eq!(
info.recipient.to_vec(),
recipient,
"info.recipient != expected"
);
let sender = "1399a4e782b935d2bb36b97586d3df8747b07dc66902d807eed0ae99e00ed256";
let sender = hex::decode(sender).unwrap();
assert_eq!(
info.sender_address.to_vec(),
sender,
"info.sender != expected"
);
let recipient_chain = 3u16;
assert_eq!(
info.recipient_chain, recipient_chain,
"info.recipient_chain != expected"
);
let transfer_payload = "All your base are belong to us";
let transfer_payload = transfer_payload.as_bytes();
assert_eq!(
info.payload.as_slice(),
transfer_payload,
"info.payload != expected"
);
Ok(())
}