Module bridge::message
- Struct
BridgeMessage
- Struct
BridgeMessageKey
- Struct
TokenTransferPayload
- Struct
EmergencyOp
- Struct
Blocklist
- Struct
UpdateBridgeLimit
- Struct
UpdateAssetPrice
- Struct
AddTokenOnIota
- Struct
ParsedTokenTransferMessage
- Constants
- Function
extract_token_bridge_payload
- Function
extract_emergency_op_payload
- Function
extract_blocklist_payload
- Function
extract_update_bridge_limit
- Function
extract_update_asset_price
- Function
extract_add_tokens_on_iota
- Function
serialize_message
- Function
create_token_bridge_message
- Function
create_emergency_op_message
- Function
create_blocklist_message
- Function
create_update_bridge_limit_message
- Function
create_update_asset_price_message
- Function
create_add_tokens_on_iota_message
- Function
create_key
- Function
key
- Function
message_version
- Function
message_type
- Function
seq_num
- Function
source_chain
- Function
payload
- Function
token_target_chain
- Function
token_target_address
- Function
token_type
- Function
token_amount
- Function
emergency_op_type
- Function
blocklist_type
- Function
blocklist_validator_addresses
- Function
update_bridge_limit_payload_sending_chain
- Function
update_bridge_limit_payload_receiving_chain
- Function
update_bridge_limit_payload_limit
- Function
update_asset_price_payload_token_id
- Function
update_asset_price_payload_new_price
- Function
is_native
- Function
token_ids
- Function
token_type_names
- Function
token_prices
- Function
emergency_op_pause
- Function
emergency_op_unpause
- Function
required_voting_power
- Function
to_parsed_token_transfer_message
- Function
reverse_bytes
- Function
peel_u64_be
use bridge::chain_ids;
use bridge::message_types;
use iota::address;
use iota::bcs;
use iota::hex;
use std::ascii;
use std::bcs;
use std::option;
use std::string;
use std::vector;
Struct BridgeMessage
public struct BridgeMessage has copy, drop, store
Fields
message_type: u8
message_version: u8
seq_num: u64
source_chain: u8
payload: vector<u8>
Struct BridgeMessageKey
public struct BridgeMessageKey has copy, drop, store
Fields
source_chain: u8
message_type: u8
bridge_seq_num: u64
Struct TokenTransferPayload
public struct TokenTransferPayload has drop
Fields
sender_address: vector<u8>
target_chain: u8
target_address: vector<u8>
token_type: u8
amount: u64
Struct EmergencyOp
public struct EmergencyOp has drop
Fields
op_type: u8
Struct Blocklist
public struct Blocklist has drop
Fields
blocklist_type: u8
validator_eth_addresses: vector<vector<u8>>
Struct UpdateBridgeLimit
public struct UpdateBridgeLimit has drop
Fields
receiving_chain: u8
sending_chain: u8
limit: u64
Struct UpdateAssetPrice
public struct UpdateAssetPrice has drop
Fields
token_id: u8
new_price: u64
Struct AddTokenOnIota
public struct AddTokenOnIota has drop
Fields
native_token: bool
token_ids: vector<u8>
token_type_names: vector<std::ascii::String>
token_prices: vector<u64>
Struct ParsedTokenTransferMessage
public struct ParsedTokenTransferMessage has drop
Fields
message_version: u8
seq_num: u64
source_chain: u8
payload: vector<u8>
parsed_payload: bridge::message::TokenTransferPayload
Constants
const CURRENT_MESSAGE_VERSION: u8 = 1;
const ECDSA_ADDRESS_LENGTH: u64 = 20;
const EEmptyList: u64 = 2;
const EInvalidAddressLength: u64 = 1;
const EInvalidEmergencyOpType: u64 = 4;
const EInvalidMessageType: u64 = 3;
const EInvalidPayloadLength: u64 = 5;
const EMustBeTokenMessage: u64 = 6;
const ETrailingBytes: u64 = 0;
const PAUSE: u8 = 0;
const UNPAUSE: u8 = 1;
Function extract_token_bridge_payload
public fun extract_token_bridge_payload(message: &bridge::message::BridgeMessage): bridge::message::TokenTransferPayload
Implementation
public fun extract_token_bridge_payload(message: &BridgeMessage): TokenTransferPayload {
let mut bcs = bcs::new(message.payload);
let sender_address = bcs.peel_vec_u8();
let target_chain = bcs.peel_u8();
let target_address = bcs.peel_vec_u8();
let token_type = bcs.peel_u8();
let amount = peel_u64_be(&mut bcs);
chain_ids::assert_valid_chain_id(target_chain);
assert!(bcs.into_remainder_bytes().is_empty(), ETrailingBytes);
TokenTransferPayload {
sender_address,
target_chain,
target_address,
token_type,
amount,
}
}
Function extract_emergency_op_payload
Emergency op payload is just a single byte
public fun extract_emergency_op_payload(message: &bridge::message::BridgeMessage): bridge::message::EmergencyOp
Implementation
public fun extract_emergency_op_payload(message: &BridgeMessage): EmergencyOp {
assert!(message.payload.length() == 1, ETrailingBytes);
EmergencyOp { op_type: message.payload[0] }
}
Function extract_blocklist_payload
public fun extract_blocklist_payload(message: &bridge::message::BridgeMessage): bridge::message::Blocklist
Implementation
public fun extract_blocklist_payload(message: &BridgeMessage): Blocklist {
// blocklist payload should consist of one byte blocklist type, and list of 20 bytes evm addresses
// derived from ECDSA public keys
let mut bcs = bcs::new(message.payload);
let blocklist_type = bcs.peel_u8();
let mut address_count = bcs.peel_u8();
assert!(address_count != 0, EEmptyList);
let mut validator_eth_addresses = vector[];
while (address_count > 0) {
let (mut address, mut i) = (vector[], 0);
while (i < ECDSA_ADDRESS_LENGTH) {
address.push_back(bcs.peel_u8());
i = i + 1;
};
validator_eth_addresses.push_back(address);
address_count = address_count - 1;
};
assert!(bcs.into_remainder_bytes().is_empty(), ETrailingBytes);
Blocklist {
blocklist_type,
validator_eth_addresses,
}
}
Function extract_update_bridge_limit
public fun extract_update_bridge_limit(message: &bridge::message::BridgeMessage): bridge::message::UpdateBridgeLimit
Implementation
public fun extract_update_bridge_limit(message: &BridgeMessage): UpdateBridgeLimit {
let mut bcs = bcs::new(message.payload);
let sending_chain = bcs.peel_u8();
let limit = peel_u64_be(&mut bcs);
chain_ids::assert_valid_chain_id(sending_chain);
assert!(bcs.into_remainder_bytes().is_empty(), ETrailingBytes);
UpdateBridgeLimit {
receiving_chain: message.source_chain,
sending_chain,
limit,
}
}
Function extract_update_asset_price
public fun extract_update_asset_price(message: &bridge::message::BridgeMessage): bridge::message::UpdateAssetPrice
Implementation
public fun extract_update_asset_price(message: &BridgeMessage): UpdateAssetPrice {
let mut bcs = bcs::new(message.payload);
let token_id = bcs.peel_u8();
let new_price = peel_u64_be(&mut bcs);
assert!(bcs.into_remainder_bytes().is_empty(), ETrailingBytes);
UpdateAssetPrice {
token_id,
new_price,
}
}
Function extract_add_tokens_on_iota
public fun extract_add_tokens_on_iota(message: &bridge::message::BridgeMessage): bridge::message::AddTokenOnIota
Implementation
public fun extract_add_tokens_on_iota(message: &BridgeMessage): AddTokenOnIota {
let mut bcs = bcs::new(message.payload);
let native_token = bcs.peel_bool();
let token_ids = bcs.peel_vec_u8();
let token_type_names_bytes = bcs.peel_vec_vec_u8();
let token_prices = bcs.peel_vec_u64();
let mut n = 0;
let mut token_type_names = vector[];
while (n < token_type_names_bytes.length()) {
token_type_names.push_back(ascii::string(*token_type_names_bytes.borrow(n)));
n = n + 1;
};
assert!(bcs.into_remainder_bytes().is_empty(), ETrailingBytes);
AddTokenOnIota {
native_token,
token_ids,
token_type_names,
token_prices,
}
}