Package
0x000000000000000000000000000000000000000000000000000000000000000b
- version
- 1
- digest
- 7CLcprcDgkqTk2ZMmQoobLVaNPP1tYozVt9hUYY8CFCr
- previous transaction
- AzYEMWffCQNx3cGBpTYqdvYpiisYSghXsUtPZXg5a9EJ
- last modified
- Jul 30, 7:04:59 PM
- checkpoint
- 0
Modules (8)
bridge
// Move bytecode v6
module b.bridge {
use 000000000000000000000000000000000000000000000000000000000000000b::chain_ids;
use 000000000000000000000000000000000000000000000000000000000000000b::committee;
use 000000000000000000000000000000000000000000000000000000000000000b::limiter;
use 000000000000000000000000000000000000000000000000000000000000000b::message;
use 000000000000000000000000000000000000000000000000000000000000000b::message_types;
use 000000000000000000000000000000000000000000000000000000000000000b::treasury;
use 0000000000000000000000000000000000000000000000000000000000000002::address;
use 0000000000000000000000000000000000000000000000000000000000000002::balance;
use 0000000000000000000000000000000000000000000000000000000000000002::clock;
use 0000000000000000000000000000000000000000000000000000000000000002::coin;
use 0000000000000000000000000000000000000000000000000000000000000002::event;
use 0000000000000000000000000000000000000000000000000000000000000002::linked_table;
use 0000000000000000000000000000000000000000000000000000000000000002::object;
use 0000000000000000000000000000000000000000000000000000000000000002::package;
use 0000000000000000000000000000000000000000000000000000000000000002::transfer;
use 0000000000000000000000000000000000000000000000000000000000000002::tx_context;
use 0000000000000000000000000000000000000000000000000000000000000002::vec_map;
use 0000000000000000000000000000000000000000000000000000000000000002::versioned;
use 0000000000000000000000000000000000000000000000000000000000000003::safe_system;
use 0000000000000000000000000000000000000000000000000000000000000001::ascii;
use 0000000000000000000000000000000000000000000000000000000000000001::option;
struct Bridge has key {
id: UID,
inner: Versioned
}
struct BridgeInner has store {
bridge_version: u64,
message_version: u8,
chain_id: u8,
sequence_nums: VecMap<u8, u64>,
committee: BridgeCommittee,
treasury: BridgeTreasury,
token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>,
limiter: TransferLimiter,
paused: bool
}
struct TokenDepositedEvent has copy, drop {
seq_num: u64,
source_chain: u8,
sender_address: vector<u8>,
target_chain: u8,
target_address: vector<u8>,
token_type: u8,
amount: u64
}
struct EmergencyOpEvent has copy, drop {
frozen: bool
}
struct BridgeRecord has drop, store {
message: BridgeMessage,
verified_signatures: Option<vector<vector<u8>>>,
claimed: bool
}
struct TokenTransferApproved has copy, drop {
message_key: BridgeMessageKey
}
struct TokenTransferClaimed has copy, drop {
message_key: BridgeMessageKey
}
struct TokenTransferAlreadyApproved has copy, drop {
message_key: BridgeMessageKey
}
struct TokenTransferAlreadyClaimed has copy, drop {
message_key: BridgeMessageKey
}
struct TokenTransferLimitExceed has copy, drop {
message_key: BridgeMessageKey
}
create(Arg0: UID, Arg1: u8, Arg2: &mut TxContext) {
L3: loc0: BridgeInner
B0:
0: CopyLoc[2](Arg2: &mut TxContext)
1: FreezeRef
2: Call tx_context::sender(&TxContext): address
3: LdConst[25](address: 0x00..)
4: Eq
5: BrFalse(7)
B1:
6: Branch(11)
B2:
7: MoveLoc[2](Arg2: &mut TxContext)
8: Pop
9: LdConst[10](u64: 5)
10: Abort
B3:
11: LdConst[6](u64: 1)
12: LdConst[0](u8: 1)
13: MoveLoc[1](Arg1: u8)
14: Call vec_map::empty<u8, u64>(): VecMap<u8, u64>
15: CopyLoc[2](Arg2: &mut TxContext)
16: FreezeRef
17: Call committee::create(&TxContext): BridgeCommittee
18: CopyLoc[2](Arg2: &mut TxContext)
19: Call treasury::create(&mut TxContext): BridgeTreasury
20: CopyLoc[2](Arg2: &mut TxContext)
21: Call linked_table::new<BridgeMessageKey, BridgeRecord>(&mut TxContext): LinkedTable<BridgeMessageKey, BridgeRecord>
22: Call limiter::new(): TransferLimiter
23: LdFalse
24: Pack[1](BridgeInner)
25: StLoc[3](loc0: BridgeInner)
26: MoveLoc[0](Arg0: UID)
27: LdConst[6](u64: 1)
28: MoveLoc[3](loc0: BridgeInner)
29: MoveLoc[2](Arg2: &mut TxContext)
30: Call versioned::create<BridgeInner>(u64, BridgeInner, &mut TxContext): Versioned
31: Pack[0](Bridge)
32: Call transfer::share_object<Bridge>(Bridge)
33: Ret
}
init_bridge_committee(Arg0: &mut Bridge, Arg1: VecMap<address, u64>, Arg2: u64, Arg3: &TxContext) {
L4: loc0: &mut BridgeInner
B0:
0: CopyLoc[3](Arg3: &TxContext)
1: Call tx_context::sender(&TxContext): address
2: LdConst[25](address: 0x00..)
3: Eq
4: BrFalse(6)
B1:
5: Branch(12)
B2:
6: MoveLoc[3](Arg3: &TxContext)
7: Pop
8: MoveLoc[0](Arg0: &mut Bridge)
9: Pop
10: LdConst[10](u64: 5)
11: Abort
B3:
12: MoveLoc[0](Arg0: &mut Bridge)
13: Call load_inner_mut(&mut Bridge): &mut BridgeInner
14: StLoc[4](loc0: &mut BridgeInner)
15: CopyLoc[4](loc0: &mut BridgeInner)
16: ImmBorrowField[0](BridgeInner.committee: BridgeCommittee)
17: Call committee::committee_members(&BridgeCommittee): &VecMap<vector<u8>, CommitteeMember>
18: Call vec_map::is_empty<vector<u8>, CommitteeMember>(&VecMap<vector<u8>, CommitteeMember>): bool
19: BrFalse(27)
B4:
20: MoveLoc[4](loc0: &mut BridgeInner)
21: MutBorrowField[0](BridgeInner.committee: BridgeCommittee)
22: MoveLoc[1](Arg1: VecMap<address, u64>)
23: MoveLoc[2](Arg2: u64)
24: MoveLoc[3](Arg3: &TxContext)
25: Call committee::try_create_next_committee(&mut BridgeCommittee, VecMap<address, u64>, u64, &TxContext)
26: Branch(31)
B5:
27: MoveLoc[4](loc0: &mut BridgeInner)
28: Pop
29: MoveLoc[3](Arg3: &TxContext)
30: Pop
B6:
31: Ret
}
public committee_registration(Arg0: &mut Bridge, Arg1: &mut SafeSystemState, Arg2: vector<u8>, Arg3: vector<u8>, Arg4: &TxContext) {
B0:
0: MoveLoc[0](Arg0: &mut Bridge)
1: Call load_inner_mut(&mut Bridge): &mut BridgeInner
2: MutBorrowField[0](BridgeInner.committee: BridgeCommittee)
3: MoveLoc[1](Arg1: &mut SafeSystemState)
4: MoveLoc[2](Arg2: vector<u8>)
5: MoveLoc[3](Arg3: vector<u8>)
6: MoveLoc[4](Arg4: &TxContext)
7: Call committee::register(&mut BridgeCommittee, &mut SafeSystemState, vector<u8>, vector<u8>, &TxContext)
8: Ret
}
public update_node_url(Arg0: &mut Bridge, Arg1: vector<u8>, Arg2: &TxContext) {
B0:
0: MoveLoc[0](Arg0: &mut Bridge)
1: Call load_inner_mut(&mut Bridge): &mut BridgeInner
2: MutBorrowField[0](BridgeInner.committee: BridgeCommittee)
3: MoveLoc[1](Arg1: vector<u8>)
4: MoveLoc[2](Arg2: &TxContext)
5: Call committee::update_node_url(&mut BridgeCommittee, vector<u8>, &TxContext)
6: Ret
}
public register_foreign_token<Ty0>(Arg0: &mut Bridge, Arg1: TreasuryCap<Ty0>, Arg2: UpgradeCap, Arg3: &CoinMetadata<Ty0>) {
B0:
0: MoveLoc[0](Arg0: &mut Bridge)
1: Call load_inner_mut(&mut Bridge): &mut BridgeInner
2: MutBorrowField[1](BridgeInner.treasury: BridgeTreasury)
3: MoveLoc[1](Arg1: TreasuryCap<Ty0>)
4: MoveLoc[2](Arg2: UpgradeCap)
5: MoveLoc[3](Arg3: &CoinMetadata<Ty0>)
6: Call treasury::register_foreign_token<Ty0>(&mut BridgeTreasury, TreasuryCap<Ty0>, UpgradeCap, &CoinMetadata<Ty0>)
7: Ret
}
public send_token<Ty0>(Arg0: &mut Bridge, Arg1: u8, Arg2: vector<u8>, Arg3: Coin<Ty0>, Arg4: &mut TxContext) {
L5: loc0: u64
L6: loc1: &mut BridgeInner
L7: loc2: BridgeMessage
L8: loc3: u64
L9: loc4: u8
B0:
0: MoveLoc[0](Arg0: &mut Bridge)
1: Call load_inner_mut(&mut Bridge): &mut BridgeInner
2: StLoc[6](loc1: &mut BridgeInner)
3: CopyLoc[6](loc1: &mut BridgeInner)
4: ImmBorrowField[2](BridgeInner.paused: bool)
5: ReadRef
6: Not
7: BrFalse(9)
B1:
8: Branch(15)
B2:
9: MoveLoc[6](loc1: &mut BridgeInner)
10: Pop
11: MoveLoc[4](Arg4: &mut TxContext)
12: Pop
13: LdConst[13](u64: 8)
14: Abort
B3:
15: CopyLoc[6](loc1: &mut BridgeInner)
16: ImmBorrowField[3](BridgeInner.chain_id: u8)
17: ReadRef
18: CopyLoc[1](Arg1: u8)
19: Call chain_ids::is_valid_route(u8, u8): bool
20: BrFalse(22)
B4:
21: Branch(28)
B5:
22: MoveLoc[6](loc1: &mut BridgeInner)
23: Pop
24: MoveLoc[4](Arg4: &mut TxContext)
25: Pop
26: LdConst[21](u64: 16)
27: Abort
B6:
28: ImmBorrowLoc[2](Arg2: vector<u8>)
29: VecLen(11)
30: LdConst[4](u64: 20)
31: Eq
32: BrFalse(34)
B7:
33: Branch(40)
B8:
34: MoveLoc[6](loc1: &mut BridgeInner)
35: Pop
36: MoveLoc[4](Arg4: &mut TxContext)
37: Pop
38: LdConst[23](u64: 18)
39: Abort
B9:
40: CopyLoc[6](loc1: &mut BridgeInner)
41: Call message_types::token(): u8
42: Call get_current_seq_num_and_increment(&mut BridgeInner, u8): u64
43: StLoc[5](loc0: u64)
44: CopyLoc[6](loc1: &mut BridgeInner)
45: ImmBorrowField[1](BridgeInner.treasury: BridgeTreasury)
46: Call treasury::token_id<Ty0>(&BridgeTreasury): u8
47: StLoc[9](loc4: u8)
48: ImmBorrowLoc[3](Arg3: Coin<Ty0>)
49: Call coin::balance<Ty0>(&Coin<Ty0>): &Balance<Ty0>
50: Call balance::value<Ty0>(&Balance<Ty0>): u64
51: StLoc[8](loc3: u64)
52: CopyLoc[8](loc3: u64)
53: LdU64(0)
54: Gt
55: BrFalse(57)
B10:
56: Branch(63)
B11:
57: MoveLoc[6](loc1: &mut BridgeInner)
58: Pop
59: MoveLoc[4](Arg4: &mut TxContext)
60: Pop
61: LdConst[24](u64: 19)
62: Abort
B12:
63: CopyLoc[6](loc1: &mut BridgeInner)
64: ImmBorrowField[3](BridgeInner.chain_id: u8)
65: ReadRef
66: CopyLoc[5](loc0: u64)
67: CopyLoc[4](Arg4: &mut TxContext)
68: FreezeRef
69: Call tx_context::sender(&TxContext): address
70: Call address::to_bytes(address): vector<u8>
71: CopyLoc[1](Arg1: u8)
72: CopyLoc[2](Arg2: vector<u8>)
73: CopyLoc[9](loc4: u8)
74: CopyLoc[8](loc3: u64)
75: Call message::create_token_bridge_message(u8, u64, vector<u8>, u8, vector<u8>, u8, u64): BridgeMessage
76: StLoc[7](loc2: BridgeMessage)
77: CopyLoc[6](loc1: &mut BridgeInner)
78: MutBorrowField[1](BridgeInner.treasury: BridgeTreasury)
79: MoveLoc[3](Arg3: Coin<Ty0>)
80: Call treasury::burn<Ty0>(&mut BridgeTreasury, Coin<Ty0>)
81: CopyLoc[6](loc1: &mut BridgeInner)
82: MutBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
83: ImmBorrowLoc[7](loc2: BridgeMessage)
84: Call message::key(&BridgeMessage): BridgeMessageKey
85: MoveLoc[7](loc2: BridgeMessage)
86: Call option::none<vector<vector<u8>>>(): Option<vector<vector<u8>>>
87: LdFalse
88: Pack[4](BridgeRecord)
89: Call linked_table::push_back<BridgeMessageKey, BridgeRecord>(&mut LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey, BridgeRecord)
90: MoveLoc[5](loc0: u64)
91: MoveLoc[6](loc1: &mut BridgeInner)
92: ImmBorrowField[3](BridgeInner.chain_id: u8)
93: ReadRef
94: MoveLoc[4](Arg4: &mut TxContext)
95: FreezeRef
96: Call tx_context::sender(&TxContext): address
97: Call address::to_bytes(address): vector<u8>
98: MoveLoc[1](Arg1: u8)
99: MoveLoc[2](Arg2: vector<u8>)
100: MoveLoc[9](loc4: u8)
101: MoveLoc[8](loc3: u64)
102: Pack[2](TokenDepositedEvent)
103: Call event::emit<TokenDepositedEvent>(TokenDepositedEvent)
104: Ret
}
public approve_token_transfer(Arg0: &mut Bridge, Arg1: BridgeMessage, Arg2: vector<vector<u8>>) {
L3: loc0: bool
L4: loc1: &mut BridgeInner
L5: loc2: BridgeMessageKey
L6: loc3: &mut BridgeRecord
L7: loc4: u8
L8: loc5: TokenTransferPayload
B0:
0: MoveLoc[0](Arg0: &mut Bridge)
1: Call load_inner_mut(&mut Bridge): &mut BridgeInner
2: StLoc[4](loc1: &mut BridgeInner)
3: CopyLoc[4](loc1: &mut BridgeInner)
4: ImmBorrowField[2](BridgeInner.paused: bool)
5: ReadRef
6: Not
7: BrFalse(9)
B1:
8: Branch(13)
B2:
9: MoveLoc[4](loc1: &mut BridgeInner)
10: Pop
11: LdConst[13](u64: 8)
12: Abort
B3:
13: CopyLoc[4](loc1: &mut BridgeInner)
14: ImmBorrowField[0](BridgeInner.committee: BridgeCommittee)
15: CopyLoc[1](Arg1: BridgeMessage)
16: CopyLoc[2](Arg2: vector<vector<u8>>)
17: Call committee::verify_signatures(&BridgeCommittee, BridgeMessage, vector<vector<u8>>)
18: ImmBorrowLoc[1](Arg1: BridgeMessage)
19: Call message::message_type(&BridgeMessage): u8
20: Call message_types::token(): u8
21: Eq
22: BrFalse(24)
B4:
23: Branch(28)
B5:
24: MoveLoc[4](loc1: &mut BridgeInner)
25: Pop
26: LdConst[22](u64: 17)
27: Abort
B6:
28: ImmBorrowLoc[1](Arg1: BridgeMessage)
29: Call message::message_version(&BridgeMessage): u8
30: LdConst[0](u8: 1)
31: Eq
32: BrFalse(34)
B7:
33: Branch(38)
B8:
34: MoveLoc[4](loc1: &mut BridgeInner)
35: Pop
36: LdConst[17](u64: 12)
37: Abort
B9:
38: ImmBorrowLoc[1](Arg1: BridgeMessage)
39: Call message::extract_token_bridge_payload(&BridgeMessage): TokenTransferPayload
40: StLoc[8](loc5: TokenTransferPayload)
41: ImmBorrowLoc[8](loc5: TokenTransferPayload)
42: Call message::token_target_chain(&TokenTransferPayload): u8
43: StLoc[7](loc4: u8)
44: ImmBorrowLoc[1](Arg1: BridgeMessage)
45: Call message::source_chain(&BridgeMessage): u8
46: CopyLoc[4](loc1: &mut BridgeInner)
47: ImmBorrowField[3](BridgeInner.chain_id: u8)
48: ReadRef
49: Eq
50: BrFalse(54)
B10:
51: LdTrue
52: StLoc[3](loc0: bool)
53: Branch(60)
B11:
54: MoveLoc[7](loc4: u8)
55: CopyLoc[4](loc1: &mut BridgeInner)
56: ImmBorrowField[3](BridgeInner.chain_id: u8)
57: ReadRef
58: Eq
59: StLoc[3](loc0: bool)
B12:
60: MoveLoc[3](loc0: bool)
61: BrFalse(63)
B13:
62: Branch(67)
B14:
63: MoveLoc[4](loc1: &mut BridgeInner)
64: Pop
65: LdConst[9](u64: 4)
66: Abort
B15:
67: ImmBorrowLoc[1](Arg1: BridgeMessage)
68: Call message::key(&BridgeMessage): BridgeMessageKey
69: StLoc[5](loc2: BridgeMessageKey)
70: ImmBorrowLoc[1](Arg1: BridgeMessage)
71: Call message::source_chain(&BridgeMessage): u8
72: CopyLoc[4](loc1: &mut BridgeInner)
73: ImmBorrowField[3](BridgeInner.chain_id: u8)
74: ReadRef
75: Eq
76: BrFalse(119)
B16:
77: MoveLoc[4](loc1: &mut BridgeInner)
78: MutBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
79: CopyLoc[5](loc2: BridgeMessageKey)
80: Call linked_table::borrow_mut<BridgeMessageKey, BridgeRecord>(&mut LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey): &mut BridgeRecord
81: StLoc[6](loc3: &mut BridgeRecord)
82: CopyLoc[6](loc3: &mut BridgeRecord)
83: ImmBorrowField[5](BridgeRecord.message: BridgeMessage)
84: ReadRef
85: MoveLoc[1](Arg1: BridgeMessage)
86: Eq
87: BrFalse(89)
B17:
88: Branch(93)
B18:
89: MoveLoc[6](loc3: &mut BridgeRecord)
90: Pop
91: LdConst[7](u64: 2)
92: Abort
B19:
93: CopyLoc[6](loc3: &mut BridgeRecord)
94: ImmBorrowField[6](BridgeRecord.claimed: bool)
95: ReadRef
96: Not
97: BrFalse(99)
B20:
98: Branch(103)
B21:
99: MoveLoc[6](loc3: &mut BridgeRecord)
100: Pop
101: LdConst[15](u64: 10)
102: Abort
B22:
103: CopyLoc[6](loc3: &mut BridgeRecord)
104: ImmBorrowField[7](BridgeRecord.verified_signatures: Option<vector<vector<u8>>>)
105: Call option::is_some<vector<vector<u8>>>(&Option<vector<vector<u8>>>): bool
106: BrFalse(113)
B23:
107: MoveLoc[6](loc3: &mut BridgeRecord)
108: Pop
109: MoveLoc[5](loc2: BridgeMessageKey)
110: Pack[7](TokenTransferAlreadyApproved)
111: Call event::emit<TokenTransferAlreadyApproved>(TokenTransferAlreadyApproved)
112: Ret
B24:
113: MoveLoc[2](Arg2: vector<vector<u8>>)
114: Call option::some<vector<vector<u8>>>(vector<vector<u8>>): Option<vector<vector<u8>>>
115: MoveLoc[6](loc3: &mut BridgeRecord)
116: MutBorrowField[7](BridgeRecord.verified_signatures: Option<vector<vector<u8>>>)
117: WriteRef
118: Branch(139)
B25:
119: CopyLoc[4](loc1: &mut BridgeInner)
120: ImmBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
121: CopyLoc[5](loc2: BridgeMessageKey)
122: Call linked_table::contains<BridgeMessageKey, BridgeRecord>(&LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey): bool
123: BrFalse(130)
B26:
124: MoveLoc[4](loc1: &mut BridgeInner)
125: Pop
126: MoveLoc[5](loc2: BridgeMessageKey)
127: Pack[7](TokenTransferAlreadyApproved)
128: Call event::emit<TokenTransferAlreadyApproved>(TokenTransferAlreadyApproved)
129: Ret
B27:
130: MoveLoc[4](loc1: &mut BridgeInner)
131: MutBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
132: CopyLoc[5](loc2: BridgeMessageKey)
133: MoveLoc[1](Arg1: BridgeMessage)
134: MoveLoc[2](Arg2: vector<vector<u8>>)
135: Call option::some<vector<vector<u8>>>(vector<vector<u8>>): Option<vector<vector<u8>>>
136: LdFalse
137: Pack[4](BridgeRecord)
138: Call linked_table::push_back<BridgeMessageKey, BridgeRecord>(&mut LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey, BridgeRecord)
B28:
139: MoveLoc[5](loc2: BridgeMessageKey)
140: Pack[5](TokenTransferApproved)
141: Call event::emit<TokenTransferApproved>(TokenTransferApproved)
142: Ret
}
public claim_token<Ty0>(Arg0: &mut Bridge, Arg1: &Clock, Arg2: u8, Arg3: u64, Arg4: &mut TxContext): Coin<Ty0> {
L5: loc0: Option<Coin<Ty0>>
L6: loc1: address
B0:
0: MoveLoc[0](Arg0: &mut Bridge)
1: MoveLoc[1](Arg1: &Clock)
2: MoveLoc[2](Arg2: u8)
3: MoveLoc[3](Arg3: u64)
4: CopyLoc[4](Arg4: &mut TxContext)
5: Call claim_token_internal<Ty0>(&mut Bridge, &Clock, u8, u64, &mut TxContext): Option<Coin<Ty0>> * address
6: StLoc[6](loc1: address)
7: StLoc[5](loc0: Option<Coin<Ty0>>)
8: MoveLoc[4](Arg4: &mut TxContext)
9: FreezeRef
10: Call tx_context::sender(&TxContext): address
11: MoveLoc[6](loc1: address)
12: Eq
13: BrFalse(15)
B1:
14: Branch(17)
B2:
15: LdConst[6](u64: 1)
16: Abort
B3:
17: ImmBorrowLoc[5](loc0: Option<Coin<Ty0>>)
18: Call option::is_some<Coin<Ty0>>(&Option<Coin<Ty0>>): bool
19: BrFalse(21)
B4:
20: Branch(23)
B5:
21: LdConst[20](u64: 15)
22: Abort
B6:
23: MoveLoc[5](loc0: Option<Coin<Ty0>>)
24: Call option::destroy_some<Coin<Ty0>>(Option<Coin<Ty0>>): Coin<Ty0>
25: Ret
}
public claim_and_transfer_token<Ty0>(Arg0: &mut Bridge, Arg1: &Clock, Arg2: u8, Arg3: u64, Arg4: &mut TxContext) {
L5: loc0: address
L6: loc1: Option<Coin<Ty0>>
B0:
0: MoveLoc[0](Arg0: &mut Bridge)
1: MoveLoc[1](Arg1: &Clock)
2: MoveLoc[2](Arg2: u8)
3: MoveLoc[3](Arg3: u64)
4: MoveLoc[4](Arg4: &mut TxContext)
5: Call claim_token_internal<Ty0>(&mut Bridge, &Clock, u8, u64, &mut TxContext): Option<Coin<Ty0>> * address
6: StLoc[5](loc0: address)
7: StLoc[6](loc1: Option<Coin<Ty0>>)
8: ImmBorrowLoc[6](loc1: Option<Coin<Ty0>>)
9: Call option::is_some<Coin<Ty0>>(&Option<Coin<Ty0>>): bool
10: BrFalse(16)
B1:
11: MoveLoc[6](loc1: Option<Coin<Ty0>>)
12: Call option::destroy_some<Coin<Ty0>>(Option<Coin<Ty0>>): Coin<Ty0>
13: MoveLoc[5](loc0: address)
14: Call transfer::public_transfer<Coin<Ty0>>(Coin<Ty0>, address)
15: Branch(18)
B2:
16: MoveLoc[6](loc1: Option<Coin<Ty0>>)
17: Call option::destroy_none<Coin<Ty0>>(Option<Coin<Ty0>>)
B3:
18: Ret
}
public execute_system_message(Arg0: &mut Bridge, Arg1: BridgeMessage, Arg2: vector<vector<u8>>) {
L3: loc0: u64
L4: loc1: &mut BridgeInner
L5: loc2: u8
L6: loc3: EmergencyOp
L7: loc4: Blocklist
L8: loc5: UpdateBridgeLimit
L9: loc6: UpdateAssetPrice
L10: loc7: AddTokenOnSafe
B0:
0: ImmBorrowLoc[1](Arg1: BridgeMessage)
1: Call message::message_type(&BridgeMessage): u8
2: StLoc[5](loc2: u8)
3: ImmBorrowLoc[1](Arg1: BridgeMessage)
4: Call message::message_version(&BridgeMessage): u8
5: LdConst[0](u8: 1)
6: Eq
7: BrFalse(9)
B1:
8: Branch(13)
B2:
9: MoveLoc[0](Arg0: &mut Bridge)
10: Pop
11: LdConst[17](u64: 12)
12: Abort
B3:
13: MoveLoc[0](Arg0: &mut Bridge)
14: Call load_inner_mut(&mut Bridge): &mut BridgeInner
15: StLoc[4](loc1: &mut BridgeInner)
16: ImmBorrowLoc[1](Arg1: BridgeMessage)
17: Call message::source_chain(&BridgeMessage): u8
18: CopyLoc[4](loc1: &mut BridgeInner)
19: ImmBorrowField[3](BridgeInner.chain_id: u8)
20: ReadRef
21: Eq
22: BrFalse(24)
B4:
23: Branch(28)
B5:
24: MoveLoc[4](loc1: &mut BridgeInner)
25: Pop
26: LdConst[9](u64: 4)
27: Abort
B6:
28: CopyLoc[4](loc1: &mut BridgeInner)
29: CopyLoc[5](loc2: u8)
30: Call get_current_seq_num_and_increment(&mut BridgeInner, u8): u64
31: StLoc[3](loc0: u64)
32: ImmBorrowLoc[1](Arg1: BridgeMessage)
33: Call message::seq_num(&BridgeMessage): u64
34: MoveLoc[3](loc0: u64)
35: Eq
36: BrFalse(38)
B7:
37: Branch(42)
B8:
38: MoveLoc[4](loc1: &mut BridgeInner)
39: Pop
40: LdConst[11](u64: 6)
41: Abort
B9:
42: CopyLoc[4](loc1: &mut BridgeInner)
43: ImmBorrowField[0](BridgeInner.committee: BridgeCommittee)
44: CopyLoc[1](Arg1: BridgeMessage)
45: MoveLoc[2](Arg2: vector<vector<u8>>)
46: Call committee::verify_signatures(&BridgeCommittee, BridgeMessage, vector<vector<u8>>)
47: CopyLoc[5](loc2: u8)
48: Call message_types::emergency_op(): u8
49: Eq
50: BrFalse(58)
B10:
51: ImmBorrowLoc[1](Arg1: BridgeMessage)
52: Call message::extract_emergency_op_payload(&BridgeMessage): EmergencyOp
53: StLoc[6](loc3: EmergencyOp)
54: MoveLoc[4](loc1: &mut BridgeInner)
55: MoveLoc[6](loc3: EmergencyOp)
56: Call execute_emergency_op(&mut BridgeInner, EmergencyOp)
57: Branch(107)
B11:
58: CopyLoc[5](loc2: u8)
59: Call message_types::committee_blocklist(): u8
60: Eq
61: BrFalse(70)
B12:
62: ImmBorrowLoc[1](Arg1: BridgeMessage)
63: Call message::extract_blocklist_payload(&BridgeMessage): Blocklist
64: StLoc[7](loc4: Blocklist)
65: MoveLoc[4](loc1: &mut BridgeInner)
66: MutBorrowField[0](BridgeInner.committee: BridgeCommittee)
67: MoveLoc[7](loc4: Blocklist)
68: Call committee::execute_blocklist(&mut BridgeCommittee, Blocklist)
69: Branch(107)
B13:
70: CopyLoc[5](loc2: u8)
71: Call message_types::update_bridge_limit(): u8
72: Eq
73: BrFalse(81)
B14:
74: ImmBorrowLoc[1](Arg1: BridgeMessage)
75: Call message::extract_update_bridge_limit(&BridgeMessage): UpdateBridgeLimit
76: StLoc[8](loc5: UpdateBridgeLimit)
77: MoveLoc[4](loc1: &mut BridgeInner)
78: MoveLoc[8](loc5: UpdateBridgeLimit)
79: Call execute_update_bridge_limit(&mut BridgeInner, UpdateBridgeLimit)
80: Branch(107)
B15:
81: CopyLoc[5](loc2: u8)
82: Call message_types::update_asset_price(): u8
83: Eq
84: BrFalse(92)
B16:
85: ImmBorrowLoc[1](Arg1: BridgeMessage)
86: Call message::extract_update_asset_price(&BridgeMessage): UpdateAssetPrice
87: StLoc[9](loc6: UpdateAssetPrice)
88: MoveLoc[4](loc1: &mut BridgeInner)
89: MoveLoc[9](loc6: UpdateAssetPrice)
90: Call execute_update_asset_price(&mut BridgeInner, UpdateAssetPrice)
91: Branch(107)
B17:
92: MoveLoc[5](loc2: u8)
93: Call message_types::add_tokens_on_safe(): u8
94: Eq
95: BrFalse(103)
B18:
96: ImmBorrowLoc[1](Arg1: BridgeMessage)
97: Call message::extract_add_tokens_on_safe(&BridgeMessage): AddTokenOnSafe
98: StLoc[10](loc7: AddTokenOnSafe)
99: MoveLoc[4](loc1: &mut BridgeInner)
100: MoveLoc[10](loc7: AddTokenOnSafe)
101: Call execute_add_tokens_on_safe(&mut BridgeInner, AddTokenOnSafe)
102: Branch(107)
B19:
103: MoveLoc[4](loc1: &mut BridgeInner)
104: Pop
105: LdConst[5](u64: 0)
106: Abort
B20:
107: Ret
}
get_token_transfer_action_status(Arg0: &Bridge, Arg1: u8, Arg2: u64): u8 {
L3: loc0: &BridgeInner
L4: loc1: BridgeMessageKey
L5: loc2: &BridgeRecord
B0:
0: MoveLoc[0](Arg0: &Bridge)
1: Call load_inner(&Bridge): &BridgeInner
2: StLoc[3](loc0: &BridgeInner)
3: MoveLoc[1](Arg1: u8)
4: Call message_types::token(): u8
5: MoveLoc[2](Arg2: u64)
6: Call message::create_key(u8, u8, u64): BridgeMessageKey
7: StLoc[4](loc1: BridgeMessageKey)
8: CopyLoc[3](loc0: &BridgeInner)
9: ImmBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
10: CopyLoc[4](loc1: BridgeMessageKey)
11: Call linked_table::contains<BridgeMessageKey, BridgeRecord>(&LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey): bool
12: Not
13: BrFalse(18)
B1:
14: MoveLoc[3](loc0: &BridgeInner)
15: Pop
16: LdConst[3](u8: 3)
17: Ret
B2:
18: MoveLoc[3](loc0: &BridgeInner)
19: ImmBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
20: MoveLoc[4](loc1: BridgeMessageKey)
21: Call linked_table::borrow<BridgeMessageKey, BridgeRecord>(&LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey): &BridgeRecord
22: StLoc[5](loc2: &BridgeRecord)
23: CopyLoc[5](loc2: &BridgeRecord)
24: ImmBorrowField[6](BridgeRecord.claimed: bool)
25: ReadRef
26: BrFalse(31)
B3:
27: MoveLoc[5](loc2: &BridgeRecord)
28: Pop
29: LdConst[2](u8: 2)
30: Ret
B4:
31: MoveLoc[5](loc2: &BridgeRecord)
32: ImmBorrowField[7](BridgeRecord.verified_signatures: Option<vector<vector<u8>>>)
33: Call option::is_some<vector<vector<u8>>>(&Option<vector<vector<u8>>>): bool
34: BrFalse(37)
B5:
35: LdConst[0](u8: 1)
36: Ret
B6:
37: LdConst[1](u8: 0)
38: Ret
}
get_token_transfer_action_signatures(Arg0: &Bridge, Arg1: u8, Arg2: u64): Option<vector<vector<u8>>> {
L3: loc0: &BridgeInner
L4: loc1: BridgeMessageKey
B0:
0: MoveLoc[0](Arg0: &Bridge)
1: Call load_inner(&Bridge): &BridgeInner
2: StLoc[3](loc0: &BridgeInner)
3: MoveLoc[1](Arg1: u8)
4: Call message_types::token(): u8
5: MoveLoc[2](Arg2: u64)
6: Call message::create_key(u8, u8, u64): BridgeMessageKey
7: StLoc[4](loc1: BridgeMessageKey)
8: CopyLoc[3](loc0: &BridgeInner)
9: ImmBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
10: CopyLoc[4](loc1: BridgeMessageKey)
11: Call linked_table::contains<BridgeMessageKey, BridgeRecord>(&LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey): bool
12: Not
13: BrFalse(18)
B1:
14: MoveLoc[3](loc0: &BridgeInner)
15: Pop
16: Call option::none<vector<vector<u8>>>(): Option<vector<vector<u8>>>
17: Ret
B2:
18: MoveLoc[3](loc0: &BridgeInner)
19: ImmBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
20: MoveLoc[4](loc1: BridgeMessageKey)
21: Call linked_table::borrow<BridgeMessageKey, BridgeRecord>(&LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey): &BridgeRecord
22: ImmBorrowField[7](BridgeRecord.verified_signatures: Option<vector<vector<u8>>>)
23: ReadRef
24: Ret
}
load_inner(Arg0: &Bridge): &BridgeInner {
L1: loc0: &BridgeInner
L2: loc1: u64
B0:
0: CopyLoc[0](Arg0: &Bridge)
1: ImmBorrowField[8](Bridge.inner: Versioned)
2: Call versioned::version(&Versioned): u64
3: StLoc[2](loc1: u64)
4: CopyLoc[2](loc1: u64)
5: LdConst[6](u64: 1)
6: Eq
7: BrFalse(9)
B1:
8: Branch(13)
B2:
9: MoveLoc[0](Arg0: &Bridge)
10: Pop
11: LdConst[12](u64: 7)
12: Abort
B3:
13: MoveLoc[0](Arg0: &Bridge)
14: ImmBorrowField[8](Bridge.inner: Versioned)
15: Call versioned::load_value<BridgeInner>(&Versioned): &BridgeInner
16: StLoc[1](loc0: &BridgeInner)
17: CopyLoc[1](loc0: &BridgeInner)
18: ImmBorrowField[9](BridgeInner.bridge_version: u64)
19: ReadRef
20: MoveLoc[2](loc1: u64)
21: Eq
22: BrFalse(24)
B4:
23: Branch(28)
B5:
24: MoveLoc[1](loc0: &BridgeInner)
25: Pop
26: LdConst[12](u64: 7)
27: Abort
B6:
28: MoveLoc[1](loc0: &BridgeInner)
29: Ret
}
load_inner_mut(Arg0: &mut Bridge): &mut BridgeInner {
L1: loc0: &mut BridgeInner
L2: loc1: u64
B0:
0: CopyLoc[0](Arg0: &mut Bridge)
1: ImmBorrowField[8](Bridge.inner: Versioned)
2: Call versioned::version(&Versioned): u64
3: StLoc[2](loc1: u64)
4: CopyLoc[2](loc1: u64)
5: LdConst[6](u64: 1)
6: Eq
7: BrFalse(9)
B1:
8: Branch(13)
B2:
9: MoveLoc[0](Arg0: &mut Bridge)
10: Pop
11: LdConst[12](u64: 7)
12: Abort
B3:
13: MoveLoc[0](Arg0: &mut Bridge)
14: MutBorrowField[8](Bridge.inner: Versioned)
15: Call versioned::load_value_mut<BridgeInner>(&mut Versioned): &mut BridgeInner
16: StLoc[1](loc0: &mut BridgeInner)
17: CopyLoc[1](loc0: &mut BridgeInner)
18: ImmBorrowField[9](BridgeInner.bridge_version: u64)
19: ReadRef
20: MoveLoc[2](loc1: u64)
21: Eq
22: BrFalse(24)
B4:
23: Branch(28)
B5:
24: MoveLoc[1](loc0: &mut BridgeInner)
25: Pop
26: LdConst[12](u64: 7)
27: Abort
B6:
28: MoveLoc[1](loc0: &mut BridgeInner)
29: Ret
}
claim_token_internal<Ty0>(Arg0: &mut Bridge, Arg1: &Clock, Arg2: u8, Arg3: u64, Arg4: &mut TxContext): Option<Coin<Ty0>> * address {
L5: loc0: u8
L6: loc1: u8
L7: loc2: &u8
L8: loc3: u64
L9: loc4: &mut BridgeInner
L10: loc5: BridgeMessageKey
L11: loc6: address
L12: loc7: &mut BridgeRecord
L13: loc8: BridgeRoute
L14: loc9: u8
L15: loc10: Coin<Ty0>
L16: loc11: TokenTransferPayload
B0:
0: MoveLoc[0](Arg0: &mut Bridge)
1: Call load_inner_mut(&mut Bridge): &mut BridgeInner
2: StLoc[9](loc4: &mut BridgeInner)
3: CopyLoc[9](loc4: &mut BridgeInner)
4: ImmBorrowField[2](BridgeInner.paused: bool)
5: ReadRef
6: Not
7: BrFalse(9)
B1:
8: Branch(17)
B2:
9: MoveLoc[9](loc4: &mut BridgeInner)
10: Pop
11: MoveLoc[4](Arg4: &mut TxContext)
12: Pop
13: MoveLoc[1](Arg1: &Clock)
14: Pop
15: LdConst[13](u64: 8)
16: Abort
B3:
17: CopyLoc[2](Arg2: u8)
18: Call message_types::token(): u8
19: MoveLoc[3](Arg3: u64)
20: Call message::create_key(u8, u8, u64): BridgeMessageKey
21: StLoc[10](loc5: BridgeMessageKey)
22: CopyLoc[9](loc4: &mut BridgeInner)
23: ImmBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
24: CopyLoc[10](loc5: BridgeMessageKey)
25: Call linked_table::contains<BridgeMessageKey, BridgeRecord>(&LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey): bool
26: BrFalse(28)
B4:
27: Branch(36)
B5:
28: MoveLoc[9](loc4: &mut BridgeInner)
29: Pop
30: MoveLoc[4](Arg4: &mut TxContext)
31: Pop
32: MoveLoc[1](Arg1: &Clock)
33: Pop
34: LdConst[16](u64: 11)
35: Abort
B6:
36: CopyLoc[9](loc4: &mut BridgeInner)
37: MutBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
38: CopyLoc[10](loc5: BridgeMessageKey)
39: Call linked_table::borrow_mut<BridgeMessageKey, BridgeRecord>(&mut LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey): &mut BridgeRecord
40: StLoc[12](loc7: &mut BridgeRecord)
41: CopyLoc[12](loc7: &mut BridgeRecord)
42: ImmBorrowField[5](BridgeRecord.message: BridgeMessage)
43: Call message::message_type(&BridgeMessage): u8
44: StLoc[5](loc0: u8)
45: ImmBorrowLoc[5](loc0: u8)
46: StLoc[7](loc2: &u8)
47: Call message_types::token(): u8
48: StLoc[6](loc1: u8)
49: MoveLoc[7](loc2: &u8)
50: ImmBorrowLoc[6](loc1: u8)
51: Eq
52: BrFalse(54)
B7:
53: Branch(64)
B8:
54: MoveLoc[12](loc7: &mut BridgeRecord)
55: Pop
56: MoveLoc[9](loc4: &mut BridgeInner)
57: Pop
58: MoveLoc[4](Arg4: &mut TxContext)
59: Pop
60: MoveLoc[1](Arg1: &Clock)
61: Pop
62: LdConst[5](u64: 0)
63: Abort
B9:
64: CopyLoc[12](loc7: &mut BridgeRecord)
65: ImmBorrowField[7](BridgeRecord.verified_signatures: Option<vector<vector<u8>>>)
66: Call option::is_some<vector<vector<u8>>>(&Option<vector<vector<u8>>>): bool
67: BrFalse(69)
B10:
68: Branch(79)
B11:
69: MoveLoc[12](loc7: &mut BridgeRecord)
70: Pop
71: MoveLoc[9](loc4: &mut BridgeInner)
72: Pop
73: MoveLoc[4](Arg4: &mut TxContext)
74: Pop
75: MoveLoc[1](Arg1: &Clock)
76: Pop
77: LdConst[6](u64: 1)
78: Abort
B12:
79: CopyLoc[12](loc7: &mut BridgeRecord)
80: ImmBorrowField[5](BridgeRecord.message: BridgeMessage)
81: Call message::extract_token_bridge_payload(&BridgeMessage): TokenTransferPayload
82: StLoc[16](loc11: TokenTransferPayload)
83: ImmBorrowLoc[16](loc11: TokenTransferPayload)
84: Call message::token_target_address(&TokenTransferPayload): vector<u8>
85: Call address::from_bytes(vector<u8>): address
86: StLoc[11](loc6: address)
87: CopyLoc[12](loc7: &mut BridgeRecord)
88: ImmBorrowField[6](BridgeRecord.claimed: bool)
89: ReadRef
90: BrFalse(105)
B13:
91: MoveLoc[12](loc7: &mut BridgeRecord)
92: Pop
93: MoveLoc[9](loc4: &mut BridgeInner)
94: Pop
95: MoveLoc[4](Arg4: &mut TxContext)
96: Pop
97: MoveLoc[1](Arg1: &Clock)
98: Pop
99: MoveLoc[10](loc5: BridgeMessageKey)
100: Pack[8](TokenTransferAlreadyClaimed)
101: Call event::emit<TokenTransferAlreadyClaimed>(TokenTransferAlreadyClaimed)
102: Call option::none<Coin<Ty0>>(): Option<Coin<Ty0>>
103: MoveLoc[11](loc6: address)
104: Ret
B14:
105: ImmBorrowLoc[16](loc11: TokenTransferPayload)
106: Call message::token_target_chain(&TokenTransferPayload): u8
107: StLoc[14](loc9: u8)
108: CopyLoc[14](loc9: u8)
109: CopyLoc[9](loc4: &mut BridgeInner)
110: ImmBorrowField[3](BridgeInner.chain_id: u8)
111: ReadRef
112: Eq
113: BrFalse(115)
B15:
114: Branch(125)
B16:
115: MoveLoc[12](loc7: &mut BridgeRecord)
116: Pop
117: MoveLoc[9](loc4: &mut BridgeInner)
118: Pop
119: MoveLoc[4](Arg4: &mut TxContext)
120: Pop
121: MoveLoc[1](Arg1: &Clock)
122: Pop
123: LdConst[9](u64: 4)
124: Abort
B17:
125: MoveLoc[2](Arg2: u8)
126: MoveLoc[14](loc9: u8)
127: Call chain_ids::get_route(u8, u8): BridgeRoute
128: StLoc[13](loc8: BridgeRoute)
129: CopyLoc[9](loc4: &mut BridgeInner)
130: ImmBorrowField[1](BridgeInner.treasury: BridgeTreasury)
131: Call treasury::token_id<Ty0>(&BridgeTreasury): u8
132: ImmBorrowLoc[16](loc11: TokenTransferPayload)
133: Call message::token_type(&TokenTransferPayload): u8
134: Eq
135: BrFalse(137)
B18:
136: Branch(147)
B19:
137: MoveLoc[12](loc7: &mut BridgeRecord)
138: Pop
139: MoveLoc[9](loc4: &mut BridgeInner)
140: Pop
141: MoveLoc[4](Arg4: &mut TxContext)
142: Pop
143: MoveLoc[1](Arg1: &Clock)
144: Pop
145: LdConst[8](u64: 3)
146: Abort
B20:
147: ImmBorrowLoc[16](loc11: TokenTransferPayload)
148: Call message::token_amount(&TokenTransferPayload): u64
149: StLoc[8](loc3: u64)
150: CopyLoc[9](loc4: &mut BridgeInner)
151: MutBorrowField[10](BridgeInner.limiter: TransferLimiter)
152: CopyLoc[9](loc4: &mut BridgeInner)
153: ImmBorrowField[1](BridgeInner.treasury: BridgeTreasury)
154: MoveLoc[1](Arg1: &Clock)
155: MoveLoc[13](loc8: BridgeRoute)
156: CopyLoc[8](loc3: u64)
157: Call limiter::check_and_record_sending_transfer<Ty0>(&mut TransferLimiter, &BridgeTreasury, &Clock, BridgeRoute, u64): bool
158: Not
159: BrFalse(172)
B21:
160: MoveLoc[12](loc7: &mut BridgeRecord)
161: Pop
162: MoveLoc[9](loc4: &mut BridgeInner)
163: Pop
164: MoveLoc[4](Arg4: &mut TxContext)
165: Pop
166: MoveLoc[10](loc5: BridgeMessageKey)
167: Pack[9](TokenTransferLimitExceed)
168: Call event::emit<TokenTransferLimitExceed>(TokenTransferLimitExceed)
169: Call option::none<Coin<Ty0>>(): Option<Coin<Ty0>>
170: MoveLoc[11](loc6: address)
171: Ret
B22:
172: MoveLoc[9](loc4: &mut BridgeInner)
173: MutBorrowField[1](BridgeInner.treasury: BridgeTreasury)
174: MoveLoc[8](loc3: u64)
175: MoveLoc[4](Arg4: &mut TxContext)
176: Call treasury::mint<Ty0>(&mut BridgeTreasury, u64, &mut TxContext): Coin<Ty0>
177: StLoc[15](loc10: Coin<Ty0>)
178: LdTrue
179: MoveLoc[12](loc7: &mut BridgeRecord)
180: MutBorrowField[6](BridgeRecord.claimed: bool)
181: WriteRef
182: MoveLoc[10](loc5: BridgeMessageKey)
183: Pack[6](TokenTransferClaimed)
184: Call event::emit<TokenTransferClaimed>(TokenTransferClaimed)
185: MoveLoc[15](loc10: Coin<Ty0>)
186: Call option::some<Coin<Ty0>>(Coin<Ty0>): Option<Coin<Ty0>>
187: MoveLoc[11](loc6: address)
188: Ret
}
execute_emergency_op(Arg0: &mut BridgeInner, Arg1: EmergencyOp) {
L2: loc0: u8
B0:
0: ImmBorrowLoc[1](Arg1: EmergencyOp)
1: Call message::emergency_op_type(&EmergencyOp): u8
2: StLoc[2](loc0: u8)
3: CopyLoc[2](loc0: u8)
4: Call message::emergency_op_pause(): u8
5: Eq
6: BrFalse(25)
B1:
7: CopyLoc[0](Arg0: &mut BridgeInner)
8: ImmBorrowField[2](BridgeInner.paused: bool)
9: ReadRef
10: Not
11: BrFalse(13)
B2:
12: Branch(17)
B3:
13: MoveLoc[0](Arg0: &mut BridgeInner)
14: Pop
15: LdConst[18](u64: 13)
16: Abort
B4:
17: LdTrue
18: MoveLoc[0](Arg0: &mut BridgeInner)
19: MutBorrowField[2](BridgeInner.paused: bool)
20: WriteRef
21: LdTrue
22: Pack[3](EmergencyOpEvent)
23: Call event::emit<EmergencyOpEvent>(EmergencyOpEvent)
24: Branch(50)
B5:
25: MoveLoc[2](loc0: u8)
26: Call message::emergency_op_unpause(): u8
27: Eq
28: BrFalse(46)
B6:
29: CopyLoc[0](Arg0: &mut BridgeInner)
30: ImmBorrowField[2](BridgeInner.paused: bool)
31: ReadRef
32: BrFalse(34)
B7:
33: Branch(38)
B8:
34: MoveLoc[0](Arg0: &mut BridgeInner)
35: Pop
36: LdConst[19](u64: 14)
37: Abort
B9:
38: LdFalse
39: MoveLoc[0](Arg0: &mut BridgeInner)
40: MutBorrowField[2](BridgeInner.paused: bool)
41: WriteRef
42: LdFalse
43: Pack[3](EmergencyOpEvent)
44: Call event::emit<EmergencyOpEvent>(EmergencyOpEvent)
45: Branch(50)
B10:
46: MoveLoc[0](Arg0: &mut BridgeInner)
47: Pop
48: LdConst[14](u64: 9)
49: Abort
B11:
50: Ret
}
execute_update_bridge_limit(Arg0: &mut BridgeInner, Arg1: UpdateBridgeLimit) {
L2: loc0: u8
L3: loc1: BridgeRoute
B0:
0: ImmBorrowLoc[1](Arg1: UpdateBridgeLimit)
1: Call message::update_bridge_limit_payload_receiving_chain(&UpdateBridgeLimit): u8
2: StLoc[2](loc0: u8)
3: CopyLoc[2](loc0: u8)
4: CopyLoc[0](Arg0: &mut BridgeInner)
5: ImmBorrowField[3](BridgeInner.chain_id: u8)
6: ReadRef
7: Eq
8: BrFalse(10)
B1:
9: Branch(14)
B2:
10: MoveLoc[0](Arg0: &mut BridgeInner)
11: Pop
12: LdConst[9](u64: 4)
13: Abort
B3:
14: ImmBorrowLoc[1](Arg1: UpdateBridgeLimit)
15: Call message::update_bridge_limit_payload_sending_chain(&UpdateBridgeLimit): u8
16: MoveLoc[2](loc0: u8)
17: Call chain_ids::get_route(u8, u8): BridgeRoute
18: StLoc[3](loc1: BridgeRoute)
19: MoveLoc[0](Arg0: &mut BridgeInner)
20: MutBorrowField[10](BridgeInner.limiter: TransferLimiter)
21: ImmBorrowLoc[3](loc1: BridgeRoute)
22: ImmBorrowLoc[1](Arg1: UpdateBridgeLimit)
23: Call message::update_bridge_limit_payload_limit(&UpdateBridgeLimit): u64
24: Call limiter::update_route_limit(&mut TransferLimiter, &BridgeRoute, u64)
25: Ret
}
execute_update_asset_price(Arg0: &mut BridgeInner, Arg1: UpdateAssetPrice) {
B0:
0: MoveLoc[0](Arg0: &mut BridgeInner)
1: MutBorrowField[1](BridgeInner.treasury: BridgeTreasury)
2: ImmBorrowLoc[1](Arg1: UpdateAssetPrice)
3: Call message::update_asset_price_payload_token_id(&UpdateAssetPrice): u8
4: ImmBorrowLoc[1](Arg1: UpdateAssetPrice)
5: Call message::update_asset_price_payload_new_price(&UpdateAssetPrice): u64
6: Call treasury::update_asset_notional_price(&mut BridgeTreasury, u8, u64)
7: Ret
}
execute_add_tokens_on_safe(Arg0: &mut BridgeInner, Arg1: AddTokenOnSafe) {
L2: loc0: bool
L3: loc1: u8
L4: loc2: vector<u8>
L5: loc3: u64
L6: loc4: vector<u64>
L7: loc5: String
L8: loc6: vector<String>
B0:
0: ImmBorrowLoc[1](Arg1: AddTokenOnSafe)
1: Call message::is_native(&AddTokenOnSafe): bool
2: StLoc[2](loc0: bool)
3: ImmBorrowLoc[1](Arg1: AddTokenOnSafe)
4: Call message::token_ids(&AddTokenOnSafe): vector<u8>
5: StLoc[4](loc2: vector<u8>)
6: ImmBorrowLoc[1](Arg1: AddTokenOnSafe)
7: Call message::token_type_names(&AddTokenOnSafe): vector<String>
8: StLoc[8](loc6: vector<String>)
9: ImmBorrowLoc[1](Arg1: AddTokenOnSafe)
10: Call message::token_prices(&AddTokenOnSafe): vector<u64>
11: StLoc[6](loc4: vector<u64>)
12: ImmBorrowLoc[4](loc2: vector<u8>)
13: VecLen(11)
14: ImmBorrowLoc[8](loc6: vector<String>)
15: VecLen(111)
16: Eq
17: BrFalse(19)
B1:
18: Branch(23)
B2:
19: MoveLoc[0](Arg0: &mut BridgeInner)
20: Pop
21: LdConst[7](u64: 2)
22: Abort
B3:
23: ImmBorrowLoc[4](loc2: vector<u8>)
24: VecLen(11)
25: ImmBorrowLoc[6](loc4: vector<u64>)
26: VecLen(23)
27: Eq
28: BrFalse(30)
B4:
29: Branch(34)
B5:
30: MoveLoc[0](Arg0: &mut BridgeInner)
31: Pop
32: LdConst[7](u64: 2)
33: Abort
B6:
34: ImmBorrowLoc[4](loc2: vector<u8>)
35: VecLen(11)
36: LdU64(0)
37: Gt
38: BrFalse(56)
B7:
39: MutBorrowLoc[4](loc2: vector<u8>)
40: VecPopBack(11)
41: StLoc[3](loc1: u8)
42: MutBorrowLoc[8](loc6: vector<String>)
43: VecPopBack(111)
44: StLoc[7](loc5: String)
45: MutBorrowLoc[6](loc4: vector<u64>)
46: VecPopBack(23)
47: StLoc[5](loc3: u64)
48: CopyLoc[0](Arg0: &mut BridgeInner)
49: MutBorrowField[1](BridgeInner.treasury: BridgeTreasury)
50: MoveLoc[7](loc5: String)
51: MoveLoc[3](loc1: u8)
52: CopyLoc[2](loc0: bool)
53: MoveLoc[5](loc3: u64)
54: Call treasury::add_new_token(&mut BridgeTreasury, String, u8, bool, u64)
55: Branch(34)
B8:
56: MoveLoc[0](Arg0: &mut BridgeInner)
57: Pop
58: Ret
}
get_current_seq_num_and_increment(Arg0: &mut BridgeInner, Arg1: u8): u64 {
L2: loc0: &mut u64
L3: loc1: u64
B0:
0: CopyLoc[0](Arg0: &mut BridgeInner)
1: ImmBorrowField[11](BridgeInner.sequence_nums: VecMap<u8, u64>)
2: ImmBorrowLoc[1](Arg1: u8)
3: Call vec_map::contains<u8, u64>(&VecMap<u8, u64>, &u8): bool
4: Not
5: BrFalse(13)
B1:
6: MoveLoc[0](Arg0: &mut BridgeInner)
7: MutBorrowField[11](BridgeInner.sequence_nums: VecMap<u8, u64>)
8: MoveLoc[1](Arg1: u8)
9: LdU64(1)
10: Call vec_map::insert<u8, u64>(&mut VecMap<u8, u64>, u8, u64)
11: LdU64(0)
12: Ret
B2:
13: MoveLoc[0](Arg0: &mut BridgeInner)
14: MutBorrowField[11](BridgeInner.sequence_nums: VecMap<u8, u64>)
15: ImmBorrowLoc[1](Arg1: u8)
16: Call vec_map::get_mut<u8, u64>(&mut VecMap<u8, u64>, &u8): &mut u64
17: StLoc[2](loc0: &mut u64)
18: CopyLoc[2](loc0: &mut u64)
19: ReadRef
20: StLoc[3](loc1: u64)
21: CopyLoc[3](loc1: u64)
22: LdU64(1)
23: Add
24: MoveLoc[2](loc0: &mut u64)
25: WriteRef
26: MoveLoc[3](loc1: u64)
27: Ret
}
get_parsed_token_transfer_message(Arg0: &Bridge, Arg1: u8, Arg2: u64): Option<ParsedTokenTransferMessage> {
L3: loc0: &BridgeInner
L4: loc1: BridgeMessageKey
B0:
0: MoveLoc[0](Arg0: &Bridge)
1: Call load_inner(&Bridge): &BridgeInner
2: StLoc[3](loc0: &BridgeInner)
3: MoveLoc[1](Arg1: u8)
4: Call message_types::token(): u8
5: MoveLoc[2](Arg2: u64)
6: Call message::create_key(u8, u8, u64): BridgeMessageKey
7: StLoc[4](loc1: BridgeMessageKey)
8: CopyLoc[3](loc0: &BridgeInner)
9: ImmBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
10: CopyLoc[4](loc1: BridgeMessageKey)
11: Call linked_table::contains<BridgeMessageKey, BridgeRecord>(&LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey): bool
12: Not
13: BrFalse(18)
B1:
14: MoveLoc[3](loc0: &BridgeInner)
15: Pop
16: Call option::none<ParsedTokenTransferMessage>(): Option<ParsedTokenTransferMessage>
17: Ret
B2:
18: MoveLoc[3](loc0: &BridgeInner)
19: ImmBorrowField[4](BridgeInner.token_transfer_records: LinkedTable<BridgeMessageKey, BridgeRecord>)
20: MoveLoc[4](loc1: BridgeMessageKey)
21: Call linked_table::borrow<BridgeMessageKey, BridgeRecord>(&LinkedTable<BridgeMessageKey, BridgeRecord>, BridgeMessageKey): &BridgeRecord
22: ImmBorrowField[5](BridgeRecord.message: BridgeMessage)
23: Call message::to_parsed_token_transfer_message(&BridgeMessage): ParsedTokenTransferMessage
24: Call option::some<ParsedTokenTransferMessage>(ParsedTokenTransferMessage): Option<ParsedTokenTransferMessage>
25: Ret
}
Constants [
0 => u8: 1
1 => u8: 0
2 => u8: 2
3 => u8: 3
4 => u64: 20
5 => u64: 0
6 => u64: 1
7 => u64: 2
8 => u64: 3
9 => u64: 4
10 => u64: 5
11 => u64: 6
12 => u64: 7
13 => u64: 8
14 => u64: 9
15 => u64: 10
16 => u64: 11
17 => u64: 12
18 => u64: 13
19 => u64: 14
20 => u64: 15
21 => u64: 16
22 => u64: 17
23 => u64: 18
24 => u64: 19
25 => address: 0x0000000000000000000000000000000000000000000000000000000000000000
]
}
chain_ids
// Move bytecode v6
module b.chain_ids {
use 0000000000000000000000000000000000000000000000000000000000000001::vector;
struct BridgeRoute has copy, drop, store {
source: u8,
destination: u8
}
public safe_mainnet(): u8 {
B0:
0: LdConst[0](u8: 0)
1: Ret
}
public safe_testnet(): u8 {
B0:
0: LdConst[1](u8: 1)
1: Ret
}
public safe_custom(): u8 {
B0:
0: LdConst[2](u8: 2)
1: Ret
}
public eth_mainnet(): u8 {
B0:
0: LdConst[3](u8: 10)
1: Ret
}
public eth_sepolia(): u8 {
B0:
0: LdConst[4](u8: 11)
1: Ret
}
public eth_custom(): u8 {
B0:
0: LdConst[5](u8: 12)
1: Ret
}
public route_source(Arg0: &BridgeRoute): &u8 {
B0:
0: MoveLoc[0](Arg0: &BridgeRoute)
1: ImmBorrowField[0](BridgeRoute.source: u8)
2: Ret
}
public route_destination(Arg0: &BridgeRoute): &u8 {
B0:
0: MoveLoc[0](Arg0: &BridgeRoute)
1: ImmBorrowField[1](BridgeRoute.destination: u8)
2: Ret
}
public assert_valid_chain_id(Arg0: u8) {
L1: loc0: bool
B0:
0: CopyLoc[0](Arg0: u8)
1: LdConst[0](u8: 0)
2: Eq
3: BrFalse(7)
B1:
4: LdTrue
5: StLoc[1](loc0: bool)
6: Branch(39)
B2:
7: CopyLoc[0](Arg0: u8)
8: LdConst[1](u8: 1)
9: Eq
10: BrFalse(14)
B3:
11: LdTrue
12: StLoc[1](loc0: bool)
13: Branch(39)
B4:
14: CopyLoc[0](Arg0: u8)
15: LdConst[2](u8: 2)
16: Eq
17: BrFalse(21)
B5:
18: LdTrue
19: StLoc[1](loc0: bool)
20: Branch(39)
B6:
21: CopyLoc[0](Arg0: u8)
22: LdConst[3](u8: 10)
23: Eq
24: BrFalse(28)
B7:
25: LdTrue
26: StLoc[1](loc0: bool)
27: Branch(39)
B8:
28: CopyLoc[0](Arg0: u8)
29: LdConst[4](u8: 11)
30: Eq
31: BrFalse(35)
B9:
32: LdTrue
33: StLoc[1](loc0: bool)
34: Branch(39)
B10:
35: MoveLoc[0](Arg0: u8)
36: LdConst[5](u8: 12)
37: Eq
38: StLoc[1](loc0: bool)
B11:
39: MoveLoc[1](loc0: bool)
40: BrFalse(42)
B12:
41: Branch(44)
B13:
42: LdConst[6](u64: 0)
43: Abort
B14:
44: Ret
}
public valid_routes(): vector<BridgeRoute> {
B0:
0: LdConst[0](u8: 0)
1: LdConst[3](u8: 10)
2: Pack[0](BridgeRoute)
3: LdConst[3](u8: 10)
4: LdConst[0](u8: 0)
5: Pack[0](BridgeRoute)
6: LdConst[1](u8: 1)
7: LdConst[4](u8: 11)
8: Pack[0](BridgeRoute)
9: LdConst[1](u8: 1)
10: LdConst[5](u8: 12)
11: Pack[0](BridgeRoute)
12: LdConst[2](u8: 2)
13: LdConst[5](u8: 12)
14: Pack[0](BridgeRoute)
15: LdConst[2](u8: 2)
16: LdConst[4](u8: 11)
17: Pack[0](BridgeRoute)
18: LdConst[4](u8: 11)
19: LdConst[1](u8: 1)
20: Pack[0](BridgeRoute)
21: LdConst[4](u8: 11)
22: LdConst[2](u8: 2)
23: Pack[0](BridgeRoute)
24: LdConst[5](u8: 12)
25: LdConst[1](u8: 1)
26: Pack[0](BridgeRoute)
27: LdConst[5](u8: 12)
28: LdConst[2](u8: 2)
29: Pack[0](BridgeRoute)
30: VecPack(7, 10)
31: Ret
}
public is_valid_route(Arg0: u8, Arg1: u8): bool {
L2: loc0: vector<BridgeRoute>
L3: loc1: BridgeRoute
B0:
0: MoveLoc[0](Arg0: u8)
1: MoveLoc[1](Arg1: u8)
2: Pack[0](BridgeRoute)
3: StLoc[3](loc1: BridgeRoute)
4: Call valid_routes(): vector<BridgeRoute>
5: StLoc[2](loc0: vector<BridgeRoute>)
6: ImmBorrowLoc[2](loc0: vector<BridgeRoute>)
7: ImmBorrowLoc[3](loc1: BridgeRoute)
8: Call vector::contains<BridgeRoute>(&vector<BridgeRoute>, &BridgeRoute): bool
9: Ret
}
public get_route(Arg0: u8, Arg1: u8): BridgeRoute {
L2: loc0: vector<BridgeRoute>
L3: loc1: BridgeRoute
B0:
0: MoveLoc[0](Arg0: u8)
1: MoveLoc[1](Arg1: u8)
2: Pack[0](BridgeRoute)
3: StLoc[3](loc1: BridgeRoute)
4: Call valid_routes(): vector<BridgeRoute>
5: StLoc[2](loc0: vector<BridgeRoute>)
6: ImmBorrowLoc[2](loc0: vector<BridgeRoute>)
7: ImmBorrowLoc[3](loc1: BridgeRoute)
8: Call vector::contains<BridgeRoute>(&vector<BridgeRoute>, &BridgeRoute): bool
9: BrFalse(11)
B1:
10: Branch(13)
B2:
11: LdConst[6](u64: 0)
12: Abort
B3:
13: MoveLoc[3](loc1: BridgeRoute)
14: Ret
}
Constants [
0 => u8: 0
1 => u8: 1
2 => u8: 2
3 => u8: 10
4 => u8: 11
5 => u8: 12
6 => u64: 0
]
}
committee
// Move bytecode v6
module b.committee {
use 000000000000000000000000000000000000000000000000000000000000000b::crypto;
use 000000000000000000000000000000000000000000000000000000000000000b::message;
use 0000000000000000000000000000000000000000000000000000000000000002::ecdsa_k1;
use 0000000000000000000000000000000000000000000000000000000000000002::event;
use 0000000000000000000000000000000000000000000000000000000000000002::tx_context;
use 0000000000000000000000000000000000000000000000000000000000000002::vec_map;
use 0000000000000000000000000000000000000000000000000000000000000002::vec_set;
use 0000000000000000000000000000000000000000000000000000000000000003::safe_system;
use 0000000000000000000000000000000000000000000000000000000000000001::option;
use 0000000000000000000000000000000000000000000000000000000000000001::vector;
struct BlocklistValidatorEvent has copy, drop {
blocklisted: bool,
public_keys: vector<vector<u8>>
}
struct BridgeCommittee has store {
members: VecMap<vector<u8>, CommitteeMember>,
member_registrations: VecMap<address, CommitteeMemberRegistration>,
last_committee_update_epoch: u64
}
struct CommitteeUpdateEvent has copy, drop {
members: VecMap<vector<u8>, CommitteeMember>,
stake_participation_percentage: u64
}
struct CommitteeMemberUrlUpdateEvent has copy, drop {
member: vector<u8>,
new_url: vector<u8>
}
struct CommitteeMember has copy, drop, store {
safe_address: address,
bridge_pubkey_bytes: vector<u8>,
voting_power: u64,
http_rest_url: vector<u8>,
blocklisted: bool
}
struct CommitteeMemberRegistration has copy, drop, store {
safe_address: address,
bridge_pubkey_bytes: vector<u8>,
http_rest_url: vector<u8>
}
public verify_signatures(Arg0: &BridgeCommittee, Arg1: BridgeMessage, Arg2: vector<vector<u8>>) {
L3: loc0: u64
L4: loc1: &CommitteeMember
L5: loc2: vector<u8>
L6: loc3: vector<u8>
L7: loc4: u64
L8: loc5: VecSet<vector<u8>>
L9: loc6: u64
L10: loc7: u64
B0:
0: LdU64(0)
1: ImmBorrowLoc[2](Arg2: vector<vector<u8>>)
2: VecLen(12)
3: StLoc[9](loc6: u64)
4: StLoc[3](loc0: u64)
5: Call vec_set::empty<vector<u8>>(): VecSet<vector<u8>>
6: StLoc[8](loc5: VecSet<vector<u8>>)
7: ImmBorrowLoc[1](Arg1: BridgeMessage)
8: Call message::required_voting_power(&BridgeMessage): u64
9: StLoc[7](loc4: u64)
10: LdConst[10](vector<u8>: "SAF..)
11: StLoc[5](loc2: vector<u8>)
12: MutBorrowLoc[5](loc2: vector<u8>)
13: MoveLoc[1](Arg1: BridgeMessage)
14: Call message::serialize_message(BridgeMessage): vector<u8>
15: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
16: LdU64(0)
17: StLoc[10](loc7: u64)
B1:
18: CopyLoc[3](loc0: u64)
19: CopyLoc[9](loc6: u64)
20: Lt
21: BrFalse(77)
B2:
22: Branch(23)
B3:
23: ImmBorrowLoc[2](Arg2: vector<vector<u8>>)
24: CopyLoc[3](loc0: u64)
25: VecImmBorrow(12)
26: ImmBorrowLoc[5](loc2: vector<u8>)
27: LdU8(0)
28: Call ecdsa_k1::secp256k1_ecrecover(&vector<u8>, &vector<u8>, u8): vector<u8>
29: StLoc[6](loc3: vector<u8>)
30: ImmBorrowLoc[8](loc5: VecSet<vector<u8>>)
31: ImmBorrowLoc[6](loc3: vector<u8>)
32: Call vec_set::contains<vector<u8>>(&VecSet<vector<u8>>, &vector<u8>): bool
33: Not
34: BrFalse(36)
B4:
35: Branch(40)
B5:
36: MoveLoc[0](Arg0: &BridgeCommittee)
37: Pop
38: LdConst[1](u64: 1)
39: Abort
B6:
40: CopyLoc[0](Arg0: &BridgeCommittee)
41: ImmBorrowField[0](BridgeCommittee.members: VecMap<vector<u8>, CommitteeMember>)
42: ImmBorrowLoc[6](loc3: vector<u8>)
43: Call vec_map::contains<vector<u8>, CommitteeMember>(&VecMap<vector<u8>, CommitteeMember>, &vector<u8>): bool
44: BrFalse(46)
B7:
45: Branch(50)
B8:
46: MoveLoc[0](Arg0: &BridgeCommittee)
47: Pop
48: LdConst[2](u64: 2)
49: Abort
B9:
50: CopyLoc[0](Arg0: &BridgeCommittee)
51: ImmBorrowField[0](BridgeCommittee.members: VecMap<vector<u8>, CommitteeMember>)
52: ImmBorrowLoc[6](loc3: vector<u8>)
53: Call vec_map::get<vector<u8>, CommitteeMember>(&VecMap<vector<u8>, CommitteeMember>, &vector<u8>): &CommitteeMember
54: StLoc[4](loc1: &CommitteeMember)
55: CopyLoc[4](loc1: &CommitteeMember)
56: ImmBorrowField[1](CommitteeMember.blocklisted: bool)
57: ReadRef
58: Not
59: BrFalse(67)
B10:
60: MoveLoc[10](loc7: u64)
61: MoveLoc[4](loc1: &CommitteeMember)
62: ImmBorrowField[2](CommitteeMember.voting_power: u64)
63: ReadRef
64: Add
65: StLoc[10](loc7: u64)
66: Branch(69)
B11:
67: MoveLoc[4](loc1: &CommitteeMember)
68: Pop
B12:
69: MutBorrowLoc[8](loc5: VecSet<vector<u8>>)
70: MoveLoc[6](loc3: vector<u8>)
71: Call vec_set::insert<vector<u8>>(&mut VecSet<vector<u8>>, vector<u8>)
72: MoveLoc[3](loc0: u64)
73: LdU64(1)
74: Add
75: StLoc[3](loc0: u64)
76: Branch(18)
B13:
77: MoveLoc[0](Arg0: &BridgeCommittee)
78: Pop
79: MoveLoc[10](loc7: u64)
80: MoveLoc[7](loc4: u64)
81: Ge
82: BrFalse(84)
B14:
83: Branch(86)
B15:
84: LdConst[0](u64: 0)
85: Abort
B16:
86: Ret
}
public(friend) create(Arg0: &TxContext): BridgeCommittee {
B0:
0: MoveLoc[0](Arg0: &TxContext)
1: Call tx_context::sender(&TxContext): address
2: LdConst[12](address: 0x00..)
3: Eq
4: BrFalse(6)
B1:
5: Branch(8)
B2:
6: LdConst[3](u64: 3)
7: Abort
B3:
8: Call vec_map::empty<vector<u8>, CommitteeMember>(): VecMap<vector<u8>, CommitteeMember>
9: Call vec_map::empty<address, CommitteeMemberRegistration>(): VecMap<address, CommitteeMemberRegistration>
10: LdU64(0)
11: Pack[1](BridgeCommittee)
12: Ret
}
public(friend) register(Arg0: &mut BridgeCommittee, Arg1: &mut SafeSystemState, Arg2: vector<u8>, Arg3: vector<u8>, Arg4: &TxContext) {
L5: loc0: CommitteeMemberRegistration
L6: loc1: &mut CommitteeMemberRegistration
L7: loc2: CommitteeMemberRegistration
L8: loc3: CommitteeMemberRegistration
L9: loc4: address
L10: loc5: vector<address>
B0:
0: CopyLoc[0](Arg0: &mut BridgeCommittee)
1: ImmBorrowField[0](BridgeCommittee.members: VecMap<vector<u8>, CommitteeMember>)
2: Call vec_map::is_empty<vector<u8>, CommitteeMember>(&VecMap<vector<u8>, CommitteeMember>): bool
3: BrFalse(5)
B1:
4: Branch(13)
B2:
5: MoveLoc[1](Arg1: &mut SafeSystemState)
6: Pop
7: MoveLoc[0](Arg0: &mut BridgeCommittee)
8: Pop
9: MoveLoc[4](Arg4: &TxContext)
10: Pop
11: LdConst[7](u64: 7)
12: Abort
B3:
13: ImmBorrowLoc[2](Arg2: vector<u8>)
14: VecLen(17)
15: LdConst[11](u64: 33)
16: Eq
17: BrFalse(19)
B4:
18: Branch(27)
B5:
19: MoveLoc[1](Arg1: &mut SafeSystemState)
20: Pop
21: MoveLoc[0](Arg0: &mut BridgeCommittee)
22: Pop
23: MoveLoc[4](Arg4: &TxContext)
24: Pop
25: LdConst[6](u64: 6)
26: Abort
B6:
27: MoveLoc[4](Arg4: &TxContext)
28: Call tx_context::sender(&TxContext): address
29: StLoc[9](loc4: address)
30: MoveLoc[1](Arg1: &mut SafeSystemState)
31: Call safe_system::active_validator_addresses(&mut SafeSystemState): vector<address>
32: StLoc[10](loc5: vector<address>)
33: ImmBorrowLoc[10](loc5: vector<address>)
34: ImmBorrowLoc[9](loc4: address)
35: Call vector::contains<address>(&vector<address>, &address): bool
36: BrFalse(38)
B7:
37: Branch(42)
B8:
38: MoveLoc[0](Arg0: &mut BridgeCommittee)
39: Pop
40: LdConst[5](u64: 5)
41: Abort
B9:
42: CopyLoc[0](Arg0: &mut BridgeCommittee)
43: ImmBorrowField[3](BridgeCommittee.member_registrations: VecMap<address, CommitteeMemberRegistration>)
44: ImmBorrowLoc[9](loc4: address)
45: Call vec_map::contains<address, CommitteeMemberRegistration>(&VecMap<address, CommitteeMemberRegistration>, &address): bool
46: BrFalse(64)
B10:
47: CopyLoc[0](Arg0: &mut BridgeCommittee)
48: MutBorrowField[3](BridgeCommittee.member_registrations: VecMap<address, CommitteeMemberRegistration>)
49: ImmBorrowLoc[9](loc4: address)
50: Call vec_map::get_mut<address, CommitteeMemberRegistration>(&mut VecMap<address, CommitteeMemberRegistration>, &address): &mut CommitteeMemberRegistration
51: StLoc[6](loc1: &mut CommitteeMemberRegistration)
52: MoveLoc[3](Arg3: vector<u8>)
53: CopyLoc[6](loc1: &mut CommitteeMemberRegistration)
54: MutBorrowField[4](CommitteeMemberRegistration.http_rest_url: vector<u8>)
55: WriteRef
56: CopyLoc[2](Arg2: vector<u8>)
57: CopyLoc[6](loc1: &mut CommitteeMemberRegistration)
58: MutBorrowField[5](CommitteeMemberRegistration.bridge_pubkey_bytes: vector<u8>)
59: WriteRef
60: MoveLoc[6](loc1: &mut CommitteeMemberRegistration)
61: ReadRef
62: StLoc[5](loc0: CommitteeMemberRegistration)
63: Branch(76)
B11:
64: CopyLoc[9](loc4: address)
65: CopyLoc[2](Arg2: vector<u8>)
66: MoveLoc[3](Arg3: vector<u8>)
67: Pack[5](CommitteeMemberRegistration)
68: StLoc[7](loc2: CommitteeMemberRegistration)
69: CopyLoc[0](Arg0: &mut BridgeCommittee)
70: MutBorrowField[3](BridgeCommittee.member_registrations: VecMap<address, CommitteeMemberRegistration>)
71: MoveLoc[9](loc4: address)
72: CopyLoc[7](loc2: CommitteeMemberRegistration)
73: Call vec_map::insert<address, CommitteeMemberRegistration>(&mut VecMap<address, CommitteeMemberRegistration>, address, CommitteeMemberRegistration)
74: MoveLoc[7](loc2: CommitteeMemberRegistration)
75: StLoc[5](loc0: CommitteeMemberRegistration)
B12:
76: MoveLoc[5](loc0: CommitteeMemberRegistration)
77: StLoc[8](loc3: CommitteeMemberRegistration)
78: MoveLoc[0](Arg0: &mut BridgeCommittee)
79: FreezeRef
80: MoveLoc[2](Arg2: vector<u8>)
81: Call check_uniqueness_bridge_keys(&BridgeCommittee, vector<u8>)
82: MoveLoc[8](loc3: CommitteeMemberRegistration)
83: Call event::emit<CommitteeMemberRegistration>(CommitteeMemberRegistration)
84: Ret
}
public(friend) try_create_next_committee(Arg0: &mut BridgeCommittee, Arg1: VecMap<address, u64>, Arg2: u64, Arg3: &TxContext) {
L4: loc0: u64
L5: loc1: CommitteeMember
L6: loc2: VecMap<vector<u8>, CommitteeMember>
L7: loc3: &CommitteeMemberRegistration
L8: loc4: u64
L9: loc5: Option<u64>
L10: loc6: u64
B0:
0: LdU64(0)
1: StLoc[4](loc0: u64)
2: Call vec_map::empty<vector<u8>, CommitteeMember>(): VecMap<vector<u8>, CommitteeMember>
3: StLoc[6](loc2: VecMap<vector<u8>, CommitteeMember>)
4: LdU64(0)
5: StLoc[8](loc4: u64)
B1:
6: CopyLoc[4](loc0: u64)
7: CopyLoc[0](Arg0: &mut BridgeCommittee)
8: ImmBorrowField[3](BridgeCommittee.member_registrations: VecMap<address, CommitteeMemberRegistration>)
9: Call vec_map::size<address, CommitteeMemberRegistration>(&VecMap<address, CommitteeMemberRegistration>): u64
10: Lt
11: BrFalse(62)
B2:
12: Branch(13)
B3:
13: CopyLoc[0](Arg0: &mut BridgeCommittee)
14: ImmBorrowField[3](BridgeCommittee.member_registrations: VecMap<address, CommitteeMemberRegistration>)
15: CopyLoc[4](loc0: u64)
16: Call vec_map::get_entry_by_idx<address, CommitteeMemberRegistration>(&VecMap<address, CommitteeMemberRegistration>, u64): &address * &CommitteeMemberRegistration
17: StLoc[7](loc3: &CommitteeMemberRegistration)
18: Pop
19: ImmBorrowLoc[1](Arg1: VecMap<address, u64>)
20: CopyLoc[7](loc3: &CommitteeMemberRegistration)
21: ImmBorrowField[6](CommitteeMemberRegistration.safe_address: address)
22: Call vec_map::try_get<address, u64>(&VecMap<address, u64>, &address): Option<u64>
23: StLoc[9](loc5: Option<u64>)
24: ImmBorrowLoc[9](loc5: Option<u64>)
25: Call option::is_some<u64>(&Option<u64>): bool
26: BrFalse(55)
B4:
27: MoveLoc[9](loc5: Option<u64>)
28: Call option::destroy_some<u64>(Option<u64>): u64
29: StLoc[10](loc6: u64)
30: MoveLoc[8](loc4: u64)
31: CopyLoc[10](loc6: u64)
32: Add
33: StLoc[8](loc4: u64)
34: CopyLoc[7](loc3: &CommitteeMemberRegistration)
35: ImmBorrowField[6](CommitteeMemberRegistration.safe_address: address)
36: ReadRef
37: CopyLoc[7](loc3: &CommitteeMemberRegistration)
38: ImmBorrowField[5](CommitteeMemberRegistration.bridge_pubkey_bytes: vector<u8>)
39: ReadRef
40: MoveLoc[10](loc6: u64)
41: CastU64
42: CopyLoc[7](loc3: &CommitteeMemberRegistration)
43: ImmBorrowField[4](CommitteeMemberRegistration.http_rest_url: vector<u8>)
44: ReadRef
45: LdFalse
46: Pack[4](CommitteeMember)
47: StLoc[5](loc1: CommitteeMember)
48: MutBorrowLoc[6](loc2: VecMap<vector<u8>, CommitteeMember>)
49: MoveLoc[7](loc3: &CommitteeMemberRegistration)
50: ImmBorrowField[5](CommitteeMemberRegistration.bridge_pubkey_bytes: vector<u8>)
51: ReadRef
52: MoveLoc[5](loc1: CommitteeMember)
53: Call vec_map::insert<vector<u8>, CommitteeMember>(&mut VecMap<vector<u8>, CommitteeMember>, vector<u8>, CommitteeMember)
54: Branch(57)
B5:
55: MoveLoc[7](loc3: &CommitteeMemberRegistration)
56: Pop
B6:
57: MoveLoc[4](loc0: u64)
58: LdU64(1)
59: Add
60: StLoc[4](loc0: u64)
61: Branch(6)
B7:
62: CopyLoc[8](loc4: u64)
63: MoveLoc[2](Arg2: u64)
64: Ge
65: BrFalse(84)
B8:
66: Call vec_map::empty<address, CommitteeMemberRegistration>(): VecMap<address, CommitteeMemberRegistration>
67: CopyLoc[0](Arg0: &mut BridgeCommittee)
68: MutBorrowField[3](BridgeCommittee.member_registrations: VecMap<address, CommitteeMemberRegistration>)
69: WriteRef
70: CopyLoc[6](loc2: VecMap<vector<u8>, CommitteeMember>)
71: CopyLoc[0](Arg0: &mut BridgeCommittee)
72: MutBorrowField[0](BridgeCommittee.members: VecMap<vector<u8>, CommitteeMember>)
73: WriteRef
74: MoveLoc[3](Arg3: &TxContext)
75: Call tx_context::epoch(&TxContext): u64
76: MoveLoc[0](Arg0: &mut BridgeCommittee)
77: MutBorrowField[7](BridgeCommittee.last_committee_update_epoch: u64)
78: WriteRef
79: MoveLoc[6](loc2: VecMap<vector<u8>, CommitteeMember>)
80: MoveLoc[8](loc4: u64)
81: Pack[2](CommitteeUpdateEvent)
82: Call event::emit<CommitteeUpdateEvent>(CommitteeUpdateEvent)
83: Branch(88)
B9:
84: MoveLoc[0](Arg0: &mut BridgeCommittee)
85: Pop
86: MoveLoc[3](Arg3: &TxContext)
87: Pop
B10:
88: Ret
}
public(friend) execute_blocklist(Arg0: &mut BridgeCommittee, Arg1: Blocklist) {
L2: loc0: bool
L3: loc1: vector<u8>
L4: loc2: &vector<vector<u8>>
L5: loc3: bool
L6: loc4: u64
L7: loc5: u64
L8: loc6: &mut CommitteeMember
L9: loc7: u64
L10: loc8: &vector<u8>
L11: loc9: vector<vector<u8>>
L12: loc10: &vector<u8>
B0:
0: ImmBorrowLoc[1](Arg1: Blocklist)
1: Call message::blocklist_type(&Blocklist): u8
2: LdU8(1)
3: Neq
4: StLoc[2](loc0: bool)
5: ImmBorrowLoc[1](Arg1: Blocklist)
6: Call message::blocklist_validator_addresses(&Blocklist): &vector<vector<u8>>
7: StLoc[4](loc2: &vector<vector<u8>>)
8: CopyLoc[4](loc2: &vector<vector<u8>>)
9: VecLen(12)
10: StLoc[7](loc5: u64)
11: LdU64(0)
12: StLoc[6](loc4: u64)
13: LdU64(0)
14: StLoc[9](loc7: u64)
15: LdConst[13](vector<vector<u8>>: 00)
16: StLoc[11](loc9: vector<vector<u8>>)
B1:
17: CopyLoc[6](loc4: u64)
18: CopyLoc[7](loc5: u64)
19: Lt
20: BrFalse(87)
B2:
21: Branch(22)
B3:
22: CopyLoc[4](loc2: &vector<vector<u8>>)
23: CopyLoc[6](loc4: u64)
24: VecImmBorrow(12)
25: StLoc[12](loc10: &vector<u8>)
26: LdFalse
27: StLoc[5](loc3: bool)
B4:
28: CopyLoc[9](loc7: u64)
29: CopyLoc[0](Arg0: &mut BridgeCommittee)
30: ImmBorrowField[0](BridgeCommittee.members: VecMap<vector<u8>, CommitteeMember>)
31: Call vec_map::size<vector<u8>, CommitteeMember>(&VecMap<vector<u8>, CommitteeMember>): u64
32: Lt
33: BrFalse(73)
B5:
34: Branch(35)
B6:
35: CopyLoc[0](Arg0: &mut BridgeCommittee)
36: MutBorrowField[0](BridgeCommittee.members: VecMap<vector<u8>, CommitteeMember>)
37: CopyLoc[9](loc7: u64)
38: Call vec_map::get_entry_by_idx_mut<vector<u8>, CommitteeMember>(&mut VecMap<vector<u8>, CommitteeMember>, u64): &vector<u8> * &mut CommitteeMember
39: StLoc[8](loc6: &mut CommitteeMember)
40: StLoc[10](loc8: &vector<u8>)
41: CopyLoc[10](loc8: &vector<u8>)
42: Call crypto::ecdsa_pub_key_to_eth_address(&vector<u8>): vector<u8>
43: StLoc[3](loc1: vector<u8>)
44: CopyLoc[12](loc10: &vector<u8>)
45: ReadRef
46: MoveLoc[3](loc1: vector<u8>)
47: Eq
48: BrFalse(64)
B7:
49: MoveLoc[12](loc10: &vector<u8>)
50: Pop
51: CopyLoc[2](loc0: bool)
52: MoveLoc[8](loc6: &mut CommitteeMember)
53: MutBorrowField[1](CommitteeMember.blocklisted: bool)
54: WriteRef
55: MutBorrowLoc[11](loc9: vector<vector<u8>>)
56: MoveLoc[10](loc8: &vector<u8>)
57: ReadRef
58: VecPushBack(12)
59: LdTrue
60: StLoc[5](loc3: bool)
61: LdU64(0)
62: StLoc[9](loc7: u64)
63: Branch(73)
B8:
64: MoveLoc[10](loc8: &vector<u8>)
65: Pop
66: MoveLoc[8](loc6: &mut CommitteeMember)
67: Pop
68: MoveLoc[9](loc7: u64)
69: LdU64(1)
70: Add
71: StLoc[9](loc7: u64)
72: Branch(28)
B9:
73: MoveLoc[5](loc3: bool)
74: BrFalse(76)
B10:
75: Branch(82)
B11:
76: MoveLoc[0](Arg0: &mut BridgeCommittee)
77: Pop
78: MoveLoc[4](loc2: &vector<vector<u8>>)
79: Pop
80: LdConst[4](u64: 4)
81: Abort
B12:
82: MoveLoc[6](loc4: u64)
83: LdU64(1)
84: Add
85: StLoc[6](loc4: u64)
86: Branch(17)
B13:
87: MoveLoc[0](Arg0: &mut BridgeCommittee)
88: Pop
89: MoveLoc[4](loc2: &vector<vector<u8>>)
90: Pop
91: MoveLoc[2](loc0: bool)
92: MoveLoc[11](loc9: vector<vector<u8>>)
93: Pack[0](BlocklistValidatorEvent)
94: Call event::emit<BlocklistValidatorEvent>(BlocklistValidatorEvent)
95: Ret
}
public(friend) committee_members(Arg0: &BridgeCommittee): &VecMap<vector<u8>, CommitteeMember> {
B0:
0: MoveLoc[0](Arg0: &BridgeCommittee)
1: ImmBorrowField[0](BridgeCommittee.members: VecMap<vector<u8>, CommitteeMember>)
2: Ret
}
public(friend) update_node_url(Arg0: &mut BridgeCommittee, Arg1: vector<u8>, Arg2: &TxContext) {
L3: loc0: u64
L4: loc1: &mut CommitteeMember
B0:
0: LdU64(0)
1: StLoc[3](loc0: u64)
B1:
2: CopyLoc[3](loc0: u64)
3: CopyLoc[0](Arg0: &mut BridgeCommittee)
4: ImmBorrowField[0](BridgeCommittee.members: VecMap<vector<u8>, CommitteeMember>)
5: Call vec_map::size<vector<u8>, CommitteeMember>(&VecMap<vector<u8>, CommitteeMember>): u64
6: Lt
7: BrFalse(44)
B2:
8: Branch(9)
B3:
9: CopyLoc[0](Arg0: &mut BridgeCommittee)
10: MutBorrowField[0](BridgeCommittee.members: VecMap<vector<u8>, CommitteeMember>)
11: CopyLoc[3](loc0: u64)
12: Call vec_map::get_entry_by_idx_mut<vector<u8>, CommitteeMember>(&mut VecMap<vector<u8>, CommitteeMember>, u64): &vector<u8> * &mut CommitteeMember
13: StLoc[4](loc1: &mut CommitteeMember)
14: Pop
15: CopyLoc[4](loc1: &mut CommitteeMember)
16: ImmBorrowField[8](CommitteeMember.safe_address: address)
17: ReadRef
18: CopyLoc[2](Arg2: &TxContext)
19: Call tx_context::sender(&TxContext): address
20: Eq
21: BrFalse(37)
B4:
22: MoveLoc[0](Arg0: &mut BridgeCommittee)
23: Pop
24: MoveLoc[2](Arg2: &TxContext)
25: Pop
26: CopyLoc[1](Arg1: vector<u8>)
27: CopyLoc[4](loc1: &mut CommitteeMember)
28: MutBorrowField[9](CommitteeMember.http_rest_url: vector<u8>)
29: WriteRef
30: MoveLoc[4](loc1: &mut CommitteeMember)
31: ImmBorrowField[10](CommitteeMember.bridge_pubkey_bytes: vector<u8>)
32: ReadRef
33: MoveLoc[1](Arg1: vector<u8>)
34: Pack[3](CommitteeMemberUrlUpdateEvent)
35: Call event::emit<CommitteeMemberUrlUpdateEvent>(CommitteeMemberUrlUpdateEvent)
36: Ret
B5:
37: MoveLoc[4](loc1: &mut CommitteeMember)
38: Pop
39: MoveLoc[3](loc0: u64)
40: LdU64(1)
41: Add
42: StLoc[3](loc0: u64)
43: Branch(2)
B6:
44: MoveLoc[0](Arg0: &mut BridgeCommittee)
45: Pop
46: MoveLoc[2](Arg2: &TxContext)
47: Pop
48: LdConst[9](u64: 9)
49: Abort
}
check_uniqueness_bridge_keys(Arg0: &BridgeCommittee, Arg1: vector<u8>) {
L2: loc0: bool
L3: loc1: u64
L4: loc2: &CommitteeMemberRegistration
B0:
0: CopyLoc[0](Arg0: &BridgeCommittee)
1: ImmBorrowField[3](BridgeCommittee.member_registrations: VecMap<address, CommitteeMemberRegistration>)
2: Call vec_map::size<address, CommitteeMemberRegistration>(&VecMap<address, CommitteeMemberRegistration>): u64
3: StLoc[3](loc1: u64)
4: LdFalse
5: StLoc[2](loc0: bool)
B1:
6: CopyLoc[3](loc1: u64)
7: LdU64(0)
8: Gt
9: BrFalse(38)
B2:
10: Branch(11)
B3:
11: MoveLoc[3](loc1: u64)
12: LdU64(1)
13: Sub
14: StLoc[3](loc1: u64)
15: CopyLoc[0](Arg0: &BridgeCommittee)
16: ImmBorrowField[3](BridgeCommittee.member_registrations: VecMap<address, CommitteeMemberRegistration>)
17: CopyLoc[3](loc1: u64)
18: Call vec_map::get_entry_by_idx<address, CommitteeMemberRegistration>(&VecMap<address, CommitteeMemberRegistration>, u64): &address * &CommitteeMemberRegistration
19: StLoc[4](loc2: &CommitteeMemberRegistration)
20: Pop
21: MoveLoc[4](loc2: &CommitteeMemberRegistration)
22: ImmBorrowField[5](CommitteeMemberRegistration.bridge_pubkey_bytes: vector<u8>)
23: ReadRef
24: CopyLoc[1](Arg1: vector<u8>)
25: Eq
26: BrFalse(6)
B4:
27: MoveLoc[2](loc0: bool)
28: Not
29: BrFalse(31)
B5:
30: Branch(35)
B6:
31: MoveLoc[0](Arg0: &BridgeCommittee)
32: Pop
33: LdConst[8](u64: 8)
34: Abort
B7:
35: LdTrue
36: StLoc[2](loc0: bool)
37: Branch(6)
B8:
38: MoveLoc[0](Arg0: &BridgeCommittee)
39: Pop
40: Ret
}
Constants [
0 => u64: 0
1 => u64: 1
2 => u64: 2
3 => u64: 3
4 => u64: 4
5 => u64: 5
6 => u64: 6
7 => u64: 7
8 => u64: 8
9 => u64: 9
10 => vector<u8>: "SAFE_BRIDGE_MESSAGE" // interpreted as UTF8 string
11 => u64: 33
12 => address: 0x0000000000000000000000000000000000000000000000000000000000000000
13 => vector<vector<u8>>: 00
]
}
crypto
// Move bytecode v6
module b.crypto {
use 0000000000000000000000000000000000000000000000000000000000000002::ecdsa_k1;
use 0000000000000000000000000000000000000000000000000000000000000002::hash;
public(friend) ecdsa_pub_key_to_eth_address(Arg0: &vector<u8>): vector<u8> {
L1: loc0: vector<u8>
L2: loc1: vector<u8>
L3: loc2: vector<u8>
L4: loc3: vector<u8>
L5: loc4: u64
L6: loc5: u64
B0:
0: MoveLoc[0](Arg0: &vector<u8>)
1: Call ecdsa_k1::decompress_pubkey(&vector<u8>): vector<u8>
2: StLoc[2](loc1: vector<u8>)
3: LdU64(1)
4: LdConst[0](vector<u8>: "" /..)
5: StLoc[3](loc2: vector<u8>)
6: StLoc[5](loc4: u64)
B1:
7: CopyLoc[5](loc4: u64)
8: LdU64(65)
9: Lt
10: BrFalse(23)
B2:
11: Branch(12)
B3:
12: MutBorrowLoc[3](loc2: vector<u8>)
13: ImmBorrowLoc[2](loc1: vector<u8>)
14: CopyLoc[5](loc4: u64)
15: VecImmBorrow(4)
16: ReadRef
17: VecPushBack(4)
18: MoveLoc[5](loc4: u64)
19: LdU64(1)
20: Add
21: StLoc[5](loc4: u64)
22: Branch(7)
B4:
23: ImmBorrowLoc[3](loc2: vector<u8>)
24: Call hash::keccak256(&vector<u8>): vector<u8>
25: StLoc[4](loc3: vector<u8>)
26: LdConst[0](vector<u8>: "" /..)
27: StLoc[1](loc0: vector<u8>)
28: LdU64(12)
29: StLoc[6](loc5: u64)
B5:
30: CopyLoc[6](loc5: u64)
31: LdU64(32)
32: Lt
33: BrFalse(46)
B6:
34: Branch(35)
B7:
35: MutBorrowLoc[1](loc0: vector<u8>)
36: ImmBorrowLoc[4](loc3: vector<u8>)
37: CopyLoc[6](loc5: u64)
38: VecImmBorrow(4)
39: ReadRef
40: VecPushBack(4)
41: MoveLoc[6](loc5: u64)
42: LdU64(1)
43: Add
44: StLoc[6](loc5: u64)
45: Branch(30)
B8:
46: MoveLoc[1](loc0: vector<u8>)
47: Ret
}
Constants [
0 => vector<u8>: "" // interpreted as UTF8 string
]
}
limiter
// Move bytecode v6
module b.limiter {
use 000000000000000000000000000000000000000000000000000000000000000b::chain_ids;
use 000000000000000000000000000000000000000000000000000000000000000b::treasury;
use 0000000000000000000000000000000000000000000000000000000000000002::clock;
use 0000000000000000000000000000000000000000000000000000000000000002::event;
use 0000000000000000000000000000000000000000000000000000000000000002::vec_map;
use 0000000000000000000000000000000000000000000000000000000000000001::option;
use 0000000000000000000000000000000000000000000000000000000000000001::vector;
struct TransferLimiter has store {
transfer_limits: VecMap<BridgeRoute, u64>,
transfer_records: VecMap<BridgeRoute, TransferRecord>
}
struct TransferRecord has store {
hour_head: u64,
hour_tail: u64,
per_hour_amounts: vector<u64>,
total_amount: u64
}
struct UpdateRouteLimitEvent has copy, drop {
sending_chain: u8,
receiving_chain: u8,
new_limit: u64
}
public get_route_limit(Arg0: &TransferLimiter, Arg1: &BridgeRoute): u64 {
B0:
0: MoveLoc[0](Arg0: &TransferLimiter)
1: ImmBorrowField[0](TransferLimiter.transfer_limits: VecMap<BridgeRoute, u64>)
2: MoveLoc[1](Arg1: &BridgeRoute)
3: Call vec_map::get<BridgeRoute, u64>(&VecMap<BridgeRoute, u64>, &BridgeRoute): &u64
4: ReadRef
5: Ret
}
public(friend) new(): TransferLimiter {
B0:
0: Call initial_transfer_limits(): VecMap<BridgeRoute, u64>
1: Call vec_map::empty<BridgeRoute, TransferRecord>(): VecMap<BridgeRoute, TransferRecord>
2: Pack[0](TransferLimiter)
3: Ret
}
public(friend) check_and_record_sending_transfer<Ty0>(Arg0: &mut TransferLimiter, Arg1: &BridgeTreasury, Arg2: &Clock, Arg3: BridgeRoute, Arg4: u64): bool {
L5: loc0: u64
L6: loc1: u64
L7: loc2: u64
L8: loc3: u128
L9: loc4: &mut TransferRecord
L10: loc5: Option<u64>
L11: loc6: u128
B0:
0: CopyLoc[0](Arg0: &mut TransferLimiter)
1: ImmBorrowField[1](TransferLimiter.transfer_records: VecMap<BridgeRoute, TransferRecord>)
2: ImmBorrowLoc[3](Arg3: BridgeRoute)
3: Call vec_map::contains<BridgeRoute, TransferRecord>(&VecMap<BridgeRoute, TransferRecord>, &BridgeRoute): bool
4: Not
5: BrFalse(15)
B1:
6: CopyLoc[0](Arg0: &mut TransferLimiter)
7: MutBorrowField[1](TransferLimiter.transfer_records: VecMap<BridgeRoute, TransferRecord>)
8: CopyLoc[3](Arg3: BridgeRoute)
9: LdU64(0)
10: LdU64(0)
11: LdConst[3](vector<u64>: 00)
12: LdU64(0)
13: Pack[1](TransferRecord)
14: Call vec_map::insert<BridgeRoute, TransferRecord>(&mut VecMap<BridgeRoute, TransferRecord>, BridgeRoute, TransferRecord)
B2:
15: CopyLoc[0](Arg0: &mut TransferLimiter)
16: MutBorrowField[1](TransferLimiter.transfer_records: VecMap<BridgeRoute, TransferRecord>)
17: ImmBorrowLoc[3](Arg3: BridgeRoute)
18: Call vec_map::get_mut<BridgeRoute, TransferRecord>(&mut VecMap<BridgeRoute, TransferRecord>, &BridgeRoute): &mut TransferRecord
19: StLoc[9](loc4: &mut TransferRecord)
20: MoveLoc[2](Arg2: &Clock)
21: Call current_hour_since_epoch(&Clock): u64
22: StLoc[5](loc0: u64)
23: CopyLoc[9](loc4: &mut TransferRecord)
24: MoveLoc[5](loc0: u64)
25: Call adjust_transfer_records(&mut TransferRecord, u64)
26: MoveLoc[0](Arg0: &mut TransferLimiter)
27: ImmBorrowField[0](TransferLimiter.transfer_limits: VecMap<BridgeRoute, u64>)
28: ImmBorrowLoc[3](Arg3: BridgeRoute)
29: Call vec_map::try_get<BridgeRoute, u64>(&VecMap<BridgeRoute, u64>, &BridgeRoute): Option<u64>
30: StLoc[10](loc5: Option<u64>)
31: ImmBorrowLoc[10](loc5: Option<u64>)
32: Call option::is_some<u64>(&Option<u64>): bool
33: BrFalse(35)
B3:
34: Branch(41)
B4:
35: MoveLoc[1](Arg1: &BridgeTreasury)
36: Pop
37: MoveLoc[9](loc4: &mut TransferRecord)
38: Pop
39: LdConst[0](u64: 0)
40: Abort
B5:
41: MoveLoc[10](loc5: Option<u64>)
42: Call option::destroy_some<u64>(Option<u64>): u64
43: CastU128
44: CopyLoc[1](Arg1: &BridgeTreasury)
45: Call treasury::decimal_multiplier<Ty0>(&BridgeTreasury): u64
46: CastU128
47: Mul
48: StLoc[11](loc6: u128)
49: CopyLoc[1](Arg1: &BridgeTreasury)
50: Call treasury::notional_value<Ty0>(&BridgeTreasury): u64
51: CastU128
52: MoveLoc[4](Arg4: u64)
53: CastU128
54: Mul
55: StLoc[8](loc3: u128)
56: CopyLoc[9](loc4: &mut TransferRecord)
57: ImmBorrowField[2](TransferRecord.total_amount: u64)
58: ReadRef
59: CastU128
60: CopyLoc[1](Arg1: &BridgeTreasury)
61: Call treasury::decimal_multiplier<Ty0>(&BridgeTreasury): u64
62: CastU128
63: Mul
64: CopyLoc[8](loc3: u128)
65: Add
66: MoveLoc[11](loc6: u128)
67: Gt
68: BrFalse(75)
B6:
69: MoveLoc[1](Arg1: &BridgeTreasury)
70: Pop
71: MoveLoc[9](loc4: &mut TransferRecord)
72: Pop
73: LdFalse
74: Ret
B7:
75: MoveLoc[8](loc3: u128)
76: MoveLoc[1](Arg1: &BridgeTreasury)
77: Call treasury::decimal_multiplier<Ty0>(&BridgeTreasury): u64
78: CastU128
79: Div
80: CastU64
81: StLoc[7](loc2: u64)
82: CopyLoc[9](loc4: &mut TransferRecord)
83: MutBorrowField[3](TransferRecord.per_hour_amounts: vector<u64>)
84: VecPopBack(1)
85: CopyLoc[7](loc2: u64)
86: Add
87: StLoc[6](loc1: u64)
88: CopyLoc[9](loc4: &mut TransferRecord)
89: MutBorrowField[3](TransferRecord.per_hour_amounts: vector<u64>)
90: MoveLoc[6](loc1: u64)
91: VecPushBack(1)
92: CopyLoc[9](loc4: &mut TransferRecord)
93: ImmBorrowField[2](TransferRecord.total_amount: u64)
94: ReadRef
95: MoveLoc[7](loc2: u64)
96: Add
97: MoveLoc[9](loc4: &mut TransferRecord)
98: MutBorrowField[2](TransferRecord.total_amount: u64)
99: WriteRef
100: LdTrue
101: Ret
}
public(friend) update_route_limit(Arg0: &mut TransferLimiter, Arg1: &BridgeRoute, Arg2: u64) {
L3: loc0: u8
B0:
0: CopyLoc[1](Arg1: &BridgeRoute)
1: Call chain_ids::route_destination(&BridgeRoute): &u8
2: ReadRef
3: StLoc[3](loc0: u8)
4: CopyLoc[0](Arg0: &mut TransferLimiter)
5: ImmBorrowField[0](TransferLimiter.transfer_limits: VecMap<BridgeRoute, u64>)
6: CopyLoc[1](Arg1: &BridgeRoute)
7: Call vec_map::contains<BridgeRoute, u64>(&VecMap<BridgeRoute, u64>, &BridgeRoute): bool
8: Not
9: BrFalse(17)
B1:
10: MoveLoc[0](Arg0: &mut TransferLimiter)
11: MutBorrowField[0](TransferLimiter.transfer_limits: VecMap<BridgeRoute, u64>)
12: CopyLoc[1](Arg1: &BridgeRoute)
13: ReadRef
14: CopyLoc[2](Arg2: u64)
15: Call vec_map::insert<BridgeRoute, u64>(&mut VecMap<BridgeRoute, u64>, BridgeRoute, u64)
16: Branch(23)
B2:
17: CopyLoc[2](Arg2: u64)
18: MoveLoc[0](Arg0: &mut TransferLimiter)
19: MutBorrowField[0](TransferLimiter.transfer_limits: VecMap<BridgeRoute, u64>)
20: CopyLoc[1](Arg1: &BridgeRoute)
21: Call vec_map::get_mut<BridgeRoute, u64>(&mut VecMap<BridgeRoute, u64>, &BridgeRoute): &mut u64
22: WriteRef
B3:
23: MoveLoc[1](Arg1: &BridgeRoute)
24: Call chain_ids::route_source(&BridgeRoute): &u8
25: ReadRef
26: MoveLoc[3](loc0: u8)
27: MoveLoc[2](Arg2: u64)
28: Pack[2](UpdateRouteLimitEvent)
29: Call event::emit<UpdateRouteLimitEvent>(UpdateRouteLimitEvent)
30: Ret
}
current_hour_since_epoch(Arg0: &Clock): u64 {
B0:
0: MoveLoc[0](Arg0: &Clock)
1: Call clock::timestamp_ms(&Clock): u64
2: LdU64(3600000)
3: Div
4: Ret
}
adjust_transfer_records(Arg0: &mut TransferRecord, Arg1: u64) {
L2: loc0: u64
B0:
0: CopyLoc[0](Arg0: &mut TransferRecord)
1: ImmBorrowField[4](TransferRecord.hour_head: u64)
2: ReadRef
3: CopyLoc[1](Arg1: u64)
4: Eq
5: BrFalse(9)
B1:
6: MoveLoc[0](Arg0: &mut TransferRecord)
7: Pop
8: Ret
B2:
9: CopyLoc[1](Arg1: u64)
10: LdU64(23)
11: Sub
12: StLoc[2](loc0: u64)
13: CopyLoc[0](Arg0: &mut TransferRecord)
14: ImmBorrowField[4](TransferRecord.hour_head: u64)
15: ReadRef
16: CopyLoc[2](loc0: u64)
17: Lt
18: BrFalse(40)
B3:
19: LdConst[3](vector<u64>: 00)
20: CopyLoc[0](Arg0: &mut TransferRecord)
21: MutBorrowField[3](TransferRecord.per_hour_amounts: vector<u64>)
22: WriteRef
23: LdU64(0)
24: CopyLoc[0](Arg0: &mut TransferRecord)
25: MutBorrowField[2](TransferRecord.total_amount: u64)
26: WriteRef
27: CopyLoc[2](loc0: u64)
28: CopyLoc[0](Arg0: &mut TransferRecord)
29: MutBorrowField[5](TransferRecord.hour_tail: u64)
30: WriteRef
31: MoveLoc[2](loc0: u64)
32: CopyLoc[0](Arg0: &mut TransferRecord)
33: MutBorrowField[4](TransferRecord.hour_head: u64)
34: WriteRef
35: CopyLoc[0](Arg0: &mut TransferRecord)
36: MutBorrowField[3](TransferRecord.per_hour_amounts: vector<u64>)
37: LdU64(0)
38: VecPushBack(1)
39: Branch(66)
B4:
40: CopyLoc[0](Arg0: &mut TransferRecord)
41: ImmBorrowField[5](TransferRecord.hour_tail: u64)
42: ReadRef
43: CopyLoc[2](loc0: u64)
44: Lt
45: BrFalse(66)
B5:
46: CopyLoc[0](Arg0: &mut TransferRecord)
47: ImmBorrowField[2](TransferRecord.total_amount: u64)
48: ReadRef
49: CopyLoc[0](Arg0: &mut TransferRecord)
50: MutBorrowField[3](TransferRecord.per_hour_amounts: vector<u64>)
51: LdU64(0)
52: Call vector::remove<u64>(&mut vector<u64>, u64): u64
53: Sub
54: CopyLoc[0](Arg0: &mut TransferRecord)
55: MutBorrowField[2](TransferRecord.total_amount: u64)
56: WriteRef
57: CopyLoc[0](Arg0: &mut TransferRecord)
58: ImmBorrowField[5](TransferRecord.hour_tail: u64)
59: ReadRef
60: LdU64(1)
61: Add
62: CopyLoc[0](Arg0: &mut TransferRecord)
63: MutBorrowField[5](TransferRecord.hour_tail: u64)
64: WriteRef
65: Branch(40)
B6:
66: CopyLoc[0](Arg0: &mut TransferRecord)
67: ImmBorrowField[4](TransferRecord.hour_head: u64)
68: ReadRef
69: CopyLoc[1](Arg1: u64)
70: Lt
71: BrFalse(86)
B7:
72: Branch(73)
B8:
73: CopyLoc[0](Arg0: &mut TransferRecord)
74: MutBorrowField[3](TransferRecord.per_hour_amounts: vector<u64>)
75: LdU64(0)
76: VecPushBack(1)
77: CopyLoc[0](Arg0: &mut TransferRecord)
78: ImmBorrowField[4](TransferRecord.hour_head: u64)
79: ReadRef
80: LdU64(1)
81: Add
82: CopyLoc[0](Arg0: &mut TransferRecord)
83: MutBorrowField[4](TransferRecord.hour_head: u64)
84: WriteRef
85: Branch(66)
B9:
86: MoveLoc[0](Arg0: &mut TransferRecord)
87: Pop
88: Ret
}
initial_transfer_limits(): VecMap<BridgeRoute, u64> {
L0: loc0: VecMap<BridgeRoute, u64>
B0:
0: Call vec_map::empty<BridgeRoute, u64>(): VecMap<BridgeRoute, u64>
1: StLoc[0](loc0: VecMap<BridgeRoute, u64>)
2: MutBorrowLoc[0](loc0: VecMap<BridgeRoute, u64>)
3: Call chain_ids::eth_mainnet(): u8
4: Call chain_ids::safe_mainnet(): u8
5: Call chain_ids::get_route(u8, u8): BridgeRoute
6: LdU64(5000000)
7: LdConst[2](u64: 1000..)
8: Mul
9: Call vec_map::insert<BridgeRoute, u64>(&mut VecMap<BridgeRoute, u64>, BridgeRoute, u64)
10: MutBorrowLoc[0](loc0: VecMap<BridgeRoute, u64>)
11: Call chain_ids::eth_sepolia(): u8
12: Call chain_ids::safe_testnet(): u8
13: Call chain_ids::get_route(u8, u8): BridgeRoute
14: LdConst[1](u64: 1844..)
15: Call vec_map::insert<BridgeRoute, u64>(&mut VecMap<BridgeRoute, u64>, BridgeRoute, u64)
16: MutBorrowLoc[0](loc0: VecMap<BridgeRoute, u64>)
17: Call chain_ids::eth_sepolia(): u8
18: Call chain_ids::safe_custom(): u8
19: Call chain_ids::get_route(u8, u8): BridgeRoute
20: LdConst[1](u64: 1844..)
21: Call vec_map::insert<BridgeRoute, u64>(&mut VecMap<BridgeRoute, u64>, BridgeRoute, u64)
22: MutBorrowLoc[0](loc0: VecMap<BridgeRoute, u64>)
23: Call chain_ids::eth_custom(): u8
24: Call chain_ids::safe_testnet(): u8
25: Call chain_ids::get_route(u8, u8): BridgeRoute
26: LdConst[1](u64: 1844..)
27: Call vec_map::insert<BridgeRoute, u64>(&mut VecMap<BridgeRoute, u64>, BridgeRoute, u64)
28: MutBorrowLoc[0](loc0: VecMap<BridgeRoute, u64>)
29: Call chain_ids::eth_custom(): u8
30: Call chain_ids::safe_custom(): u8
31: Call chain_ids::get_route(u8, u8): BridgeRoute
32: LdConst[1](u64: 1844..)
33: Call vec_map::insert<BridgeRoute, u64>(&mut VecMap<BridgeRoute, u64>, BridgeRoute, u64)
34: MoveLoc[0](loc0: VecMap<BridgeRoute, u64>)
35: Ret
}
Constants [
0 => u64: 0
1 => u64: 18446744073709551615
2 => u64: 100000000
3 => vector<u64>: 00
]
}
message
// Move bytecode v6
module b.message {
use 000000000000000000000000000000000000000000000000000000000000000b::chain_ids;
use 000000000000000000000000000000000000000000000000000000000000000b::message_types;
use 0000000000000000000000000000000000000000000000000000000000000002::bcs;
use 0000000000000000000000000000000000000000000000000000000000000001::ascii;
use 0000000000000000000000000000000000000000000000000000000000000001::vector;
struct BridgeMessage has copy, drop, store {
message_type: u8,
message_version: u8,
seq_num: u64,
source_chain: u8,
payload: vector<u8>
}
struct BridgeMessageKey has copy, drop, store {
source_chain: u8,
message_type: u8,
bridge_seq_num: u64
}
struct TokenTransferPayload has drop {
sender_address: vector<u8>,
target_chain: u8,
target_address: vector<u8>,
token_type: u8,
amount: u64
}
struct EmergencyOp has drop {
op_type: u8
}
struct Blocklist has drop {
blocklist_type: u8,
validator_eth_addresses: vector<vector<u8>>
}
struct UpdateBridgeLimit has drop {
receiving_chain: u8,
sending_chain: u8,
limit: u64
}
struct UpdateAssetPrice has drop {
token_id: u8,
new_price: u64
}
struct AddTokenOnSafe has drop {
native_token: bool,
token_ids: vector<u8>,
token_type_names: vector<String>,
token_prices: vector<u64>
}
struct ParsedTokenTransferMessage has drop {
message_version: u8,
seq_num: u64,
source_chain: u8,
payload: vector<u8>,
parsed_payload: TokenTransferPayload
}
public extract_token_bridge_payload(Arg0: &BridgeMessage): TokenTransferPayload {
L1: loc0: vector<u8>
L2: loc1: u64
L3: loc2: BCS
L4: loc3: vector<u8>
L5: loc4: vector<u8>
L6: loc5: u8
L7: loc6: u8
B0:
0: MoveLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[0](BridgeMessage.payload: vector<u8>)
2: ReadRef
3: Call bcs::new(vector<u8>): BCS
4: StLoc[3](loc2: BCS)
5: MutBorrowLoc[3](loc2: BCS)
6: Call bcs::peel_vec_u8(&mut BCS): vector<u8>
7: StLoc[4](loc3: vector<u8>)
8: MutBorrowLoc[3](loc2: BCS)
9: Call bcs::peel_u8(&mut BCS): u8
10: StLoc[6](loc5: u8)
11: MutBorrowLoc[3](loc2: BCS)
12: Call bcs::peel_vec_u8(&mut BCS): vector<u8>
13: StLoc[5](loc4: vector<u8>)
14: MutBorrowLoc[3](loc2: BCS)
15: Call bcs::peel_u8(&mut BCS): u8
16: StLoc[7](loc6: u8)
17: MutBorrowLoc[3](loc2: BCS)
18: Call peel_u64_be(&mut BCS): u64
19: StLoc[2](loc1: u64)
20: CopyLoc[6](loc5: u8)
21: Call chain_ids::assert_valid_chain_id(u8)
22: MoveLoc[3](loc2: BCS)
23: Call bcs::into_remainder_bytes(BCS): vector<u8>
24: StLoc[1](loc0: vector<u8>)
25: ImmBorrowLoc[1](loc0: vector<u8>)
26: Call vector::is_empty<u8>(&vector<u8>): bool
27: BrFalse(29)
B1:
28: Branch(31)
B2:
29: LdConst[2](u64: 0)
30: Abort
B3:
31: MoveLoc[4](loc3: vector<u8>)
32: MoveLoc[6](loc5: u8)
33: MoveLoc[5](loc4: vector<u8>)
34: MoveLoc[7](loc6: u8)
35: MoveLoc[2](loc1: u64)
36: Pack[2](TokenTransferPayload)
37: Ret
}
public extract_emergency_op_payload(Arg0: &BridgeMessage): EmergencyOp {
B0:
0: CopyLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[0](BridgeMessage.payload: vector<u8>)
2: VecLen(17)
3: LdU64(1)
4: Eq
5: BrFalse(7)
B1:
6: Branch(11)
B2:
7: MoveLoc[0](Arg0: &BridgeMessage)
8: Pop
9: LdConst[2](u64: 0)
10: Abort
B3:
11: MoveLoc[0](Arg0: &BridgeMessage)
12: ImmBorrowField[0](BridgeMessage.payload: vector<u8>)
13: LdU64(0)
14: VecImmBorrow(17)
15: ReadRef
16: Pack[3](EmergencyOp)
17: Ret
}
public extract_blocklist_payload(Arg0: &BridgeMessage): Blocklist {
L1: loc0: vector<u8>
L2: loc1: vector<u8>
L3: loc2: u8
L4: loc3: BCS
L5: loc4: u8
L6: loc5: u64
L7: loc6: vector<vector<u8>>
B0:
0: MoveLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[0](BridgeMessage.payload: vector<u8>)
2: ReadRef
3: Call bcs::new(vector<u8>): BCS
4: StLoc[4](loc3: BCS)
5: MutBorrowLoc[4](loc3: BCS)
6: Call bcs::peel_u8(&mut BCS): u8
7: StLoc[5](loc4: u8)
8: MutBorrowLoc[4](loc3: BCS)
9: Call bcs::peel_u8(&mut BCS): u8
10: StLoc[3](loc2: u8)
11: CopyLoc[3](loc2: u8)
12: LdU8(0)
13: Neq
14: BrFalse(16)
B1:
15: Branch(18)
B2:
16: LdConst[4](u64: 2)
17: Abort
B3:
18: LdConst[10](vector<vector<u8>>: 00)
19: StLoc[7](loc6: vector<vector<u8>>)
B4:
20: CopyLoc[3](loc2: u8)
21: LdU8(0)
22: Gt
23: BrFalse(50)
B5:
24: LdConst[11](vector<u8>: "" /..)
25: LdU64(0)
26: StLoc[6](loc5: u64)
27: StLoc[2](loc1: vector<u8>)
28: Branch(29)
B6:
29: CopyLoc[6](loc5: u64)
30: LdConst[1](u64: 20)
31: Lt
32: BrFalse(42)
B7:
33: MutBorrowLoc[2](loc1: vector<u8>)
34: MutBorrowLoc[4](loc3: BCS)
35: Call bcs::peel_u8(&mut BCS): u8
36: VecPushBack(17)
37: MoveLoc[6](loc5: u64)
38: LdU64(1)
39: Add
40: StLoc[6](loc5: u64)
41: Branch(29)
B8:
42: MutBorrowLoc[7](loc6: vector<vector<u8>>)
43: MoveLoc[2](loc1: vector<u8>)
44: VecPushBack(8)
45: MoveLoc[3](loc2: u8)
46: LdU8(1)
47: Sub
48: StLoc[3](loc2: u8)
49: Branch(20)
B9:
50: MoveLoc[4](loc3: BCS)
51: Call bcs::into_remainder_bytes(BCS): vector<u8>
52: StLoc[1](loc0: vector<u8>)
53: ImmBorrowLoc[1](loc0: vector<u8>)
54: Call vector::is_empty<u8>(&vector<u8>): bool
55: BrFalse(57)
B10:
56: Branch(59)
B11:
57: LdConst[2](u64: 0)
58: Abort
B12:
59: MoveLoc[5](loc4: u8)
60: MoveLoc[7](loc6: vector<vector<u8>>)
61: Pack[4](Blocklist)
62: Ret
}
public extract_update_bridge_limit(Arg0: &BridgeMessage): UpdateBridgeLimit {
L1: loc0: vector<u8>
L2: loc1: BCS
L3: loc2: u64
L4: loc3: u8
B0:
0: CopyLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[0](BridgeMessage.payload: vector<u8>)
2: ReadRef
3: Call bcs::new(vector<u8>): BCS
4: StLoc[2](loc1: BCS)
5: MutBorrowLoc[2](loc1: BCS)
6: Call bcs::peel_u8(&mut BCS): u8
7: StLoc[4](loc3: u8)
8: MutBorrowLoc[2](loc1: BCS)
9: Call peel_u64_be(&mut BCS): u64
10: StLoc[3](loc2: u64)
11: CopyLoc[4](loc3: u8)
12: Call chain_ids::assert_valid_chain_id(u8)
13: MoveLoc[2](loc1: BCS)
14: Call bcs::into_remainder_bytes(BCS): vector<u8>
15: StLoc[1](loc0: vector<u8>)
16: ImmBorrowLoc[1](loc0: vector<u8>)
17: Call vector::is_empty<u8>(&vector<u8>): bool
18: BrFalse(20)
B1:
19: Branch(24)
B2:
20: MoveLoc[0](Arg0: &BridgeMessage)
21: Pop
22: LdConst[2](u64: 0)
23: Abort
B3:
24: MoveLoc[0](Arg0: &BridgeMessage)
25: ImmBorrowField[1](BridgeMessage.source_chain: u8)
26: ReadRef
27: MoveLoc[4](loc3: u8)
28: MoveLoc[3](loc2: u64)
29: Pack[5](UpdateBridgeLimit)
30: Ret
}
public extract_update_asset_price(Arg0: &BridgeMessage): UpdateAssetPrice {
L1: loc0: vector<u8>
L2: loc1: BCS
L3: loc2: u64
L4: loc3: u8
B0:
0: MoveLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[0](BridgeMessage.payload: vector<u8>)
2: ReadRef
3: Call bcs::new(vector<u8>): BCS
4: StLoc[2](loc1: BCS)
5: MutBorrowLoc[2](loc1: BCS)
6: Call bcs::peel_u8(&mut BCS): u8
7: StLoc[4](loc3: u8)
8: MutBorrowLoc[2](loc1: BCS)
9: Call peel_u64_be(&mut BCS): u64
10: StLoc[3](loc2: u64)
11: MoveLoc[2](loc1: BCS)
12: Call bcs::into_remainder_bytes(BCS): vector<u8>
13: StLoc[1](loc0: vector<u8>)
14: ImmBorrowLoc[1](loc0: vector<u8>)
15: Call vector::is_empty<u8>(&vector<u8>): bool
16: BrFalse(18)
B1:
17: Branch(20)
B2:
18: LdConst[2](u64: 0)
19: Abort
B3:
20: MoveLoc[4](loc3: u8)
21: MoveLoc[3](loc2: u64)
22: Pack[6](UpdateAssetPrice)
23: Ret
}
public extract_add_tokens_on_safe(Arg0: &BridgeMessage): AddTokenOnSafe {
L1: loc0: vector<u8>
L2: loc1: BCS
L3: loc2: u64
L4: loc3: bool
L5: loc4: vector<u8>
L6: loc5: vector<u64>
L7: loc6: vector<String>
L8: loc7: vector<vector<u8>>
B0:
0: MoveLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[0](BridgeMessage.payload: vector<u8>)
2: ReadRef
3: Call bcs::new(vector<u8>): BCS
4: StLoc[2](loc1: BCS)
5: MutBorrowLoc[2](loc1: BCS)
6: Call bcs::peel_bool(&mut BCS): bool
7: StLoc[4](loc3: bool)
8: MutBorrowLoc[2](loc1: BCS)
9: Call bcs::peel_vec_u8(&mut BCS): vector<u8>
10: StLoc[5](loc4: vector<u8>)
11: MutBorrowLoc[2](loc1: BCS)
12: Call bcs::peel_vec_vec_u8(&mut BCS): vector<vector<u8>>
13: StLoc[8](loc7: vector<vector<u8>>)
14: MutBorrowLoc[2](loc1: BCS)
15: Call bcs::peel_vec_u64(&mut BCS): vector<u64>
16: StLoc[6](loc5: vector<u64>)
17: LdU64(0)
18: StLoc[3](loc2: u64)
19: VecPack(39, 0)
20: StLoc[7](loc6: vector<String>)
B1:
21: CopyLoc[3](loc2: u64)
22: ImmBorrowLoc[8](loc7: vector<vector<u8>>)
23: VecLen(8)
24: Lt
25: BrFalse(39)
B2:
26: Branch(27)
B3:
27: MutBorrowLoc[7](loc6: vector<String>)
28: ImmBorrowLoc[8](loc7: vector<vector<u8>>)
29: CopyLoc[3](loc2: u64)
30: VecImmBorrow(8)
31: ReadRef
32: Call ascii::string(vector<u8>): String
33: VecPushBack(39)
34: MoveLoc[3](loc2: u64)
35: LdU64(1)
36: Add
37: StLoc[3](loc2: u64)
38: Branch(21)
B4:
39: MoveLoc[2](loc1: BCS)
40: Call bcs::into_remainder_bytes(BCS): vector<u8>
41: StLoc[1](loc0: vector<u8>)
42: ImmBorrowLoc[1](loc0: vector<u8>)
43: Call vector::is_empty<u8>(&vector<u8>): bool
44: BrFalse(46)
B5:
45: Branch(48)
B6:
46: LdConst[2](u64: 0)
47: Abort
B7:
48: MoveLoc[4](loc3: bool)
49: MoveLoc[5](loc4: vector<u8>)
50: MoveLoc[7](loc6: vector<String>)
51: MoveLoc[6](loc5: vector<u64>)
52: Pack[7](AddTokenOnSafe)
53: Ret
}
public serialize_message(Arg0: BridgeMessage): vector<u8> {
L1: loc0: vector<u8>
L2: loc1: vector<u8>
L3: loc2: u64
L4: loc3: u8
B0:
0: MoveLoc[0](Arg0: BridgeMessage)
1: Unpack[0](BridgeMessage)
2: StLoc[2](loc1: vector<u8>)
3: StLoc[4](loc3: u8)
4: StLoc[3](loc2: u64)
5: VecPack(17, 2)
6: StLoc[1](loc0: vector<u8>)
7: MutBorrowLoc[1](loc0: vector<u8>)
8: ImmBorrowLoc[3](loc2: u64)
9: Call bcs::to_bytes<u64>(&u64): vector<u8>
10: Call reverse_bytes(vector<u8>): vector<u8>
11: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
12: MutBorrowLoc[1](loc0: vector<u8>)
13: MoveLoc[4](loc3: u8)
14: VecPushBack(17)
15: MutBorrowLoc[1](loc0: vector<u8>)
16: MoveLoc[2](loc1: vector<u8>)
17: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
18: MoveLoc[1](loc0: vector<u8>)
19: Ret
}
public create_token_bridge_message(Arg0: u8, Arg1: u64, Arg2: vector<u8>, Arg3: u8, Arg4: vector<u8>, Arg5: u8, Arg6: u64): BridgeMessage {
L7: loc0: vector<u8>
B0:
0: CopyLoc[0](Arg0: u8)
1: Call chain_ids::assert_valid_chain_id(u8)
2: CopyLoc[3](Arg3: u8)
3: Call chain_ids::assert_valid_chain_id(u8)
4: LdConst[11](vector<u8>: "" /..)
5: StLoc[7](loc0: vector<u8>)
6: MutBorrowLoc[7](loc0: vector<u8>)
7: ImmBorrowLoc[2](Arg2: vector<u8>)
8: VecLen(17)
9: CastU8
10: VecPushBack(17)
11: MutBorrowLoc[7](loc0: vector<u8>)
12: MoveLoc[2](Arg2: vector<u8>)
13: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
14: MutBorrowLoc[7](loc0: vector<u8>)
15: MoveLoc[3](Arg3: u8)
16: VecPushBack(17)
17: MutBorrowLoc[7](loc0: vector<u8>)
18: ImmBorrowLoc[4](Arg4: vector<u8>)
19: VecLen(17)
20: CastU8
21: VecPushBack(17)
22: MutBorrowLoc[7](loc0: vector<u8>)
23: MoveLoc[4](Arg4: vector<u8>)
24: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
25: MutBorrowLoc[7](loc0: vector<u8>)
26: MoveLoc[5](Arg5: u8)
27: VecPushBack(17)
28: MutBorrowLoc[7](loc0: vector<u8>)
29: ImmBorrowLoc[6](Arg6: u64)
30: Call bcs::to_bytes<u64>(&u64): vector<u8>
31: Call reverse_bytes(vector<u8>): vector<u8>
32: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
33: ImmBorrowLoc[7](loc0: vector<u8>)
34: VecLen(17)
35: LdU64(64)
36: Eq
37: BrFalse(39)
B1:
38: Branch(41)
B2:
39: LdConst[7](u64: 5)
40: Abort
B3:
41: Call message_types::token(): u8
42: LdConst[0](u8: 1)
43: MoveLoc[1](Arg1: u64)
44: MoveLoc[0](Arg0: u8)
45: MoveLoc[7](loc0: vector<u8>)
46: Pack[0](BridgeMessage)
47: Ret
}
public create_emergency_op_message(Arg0: u8, Arg1: u64, Arg2: u8): BridgeMessage {
B0:
0: CopyLoc[0](Arg0: u8)
1: Call chain_ids::assert_valid_chain_id(u8)
2: Call message_types::emergency_op(): u8
3: LdConst[0](u8: 1)
4: MoveLoc[1](Arg1: u64)
5: MoveLoc[0](Arg0: u8)
6: MoveLoc[2](Arg2: u8)
7: VecPack(17, 1)
8: Pack[0](BridgeMessage)
9: Ret
}
public create_blocklist_message(Arg0: u8, Arg1: u64, Arg2: u8, Arg3: vector<vector<u8>>): BridgeMessage {
L4: loc0: vector<u8>
L5: loc1: u64
L6: loc2: u64
L7: loc3: vector<u8>
B0:
0: CopyLoc[0](Arg0: u8)
1: Call chain_ids::assert_valid_chain_id(u8)
2: ImmBorrowLoc[3](Arg3: vector<vector<u8>>)
3: VecLen(8)
4: StLoc[5](loc1: u64)
5: MoveLoc[2](Arg2: u8)
6: CopyLoc[5](loc1: u64)
7: CastU8
8: VecPack(17, 2)
9: StLoc[7](loc3: vector<u8>)
10: LdU64(0)
11: StLoc[6](loc2: u64)
B1:
12: CopyLoc[6](loc2: u64)
13: CopyLoc[5](loc1: u64)
14: Lt
15: BrFalse(38)
B2:
16: Branch(17)
B3:
17: ImmBorrowLoc[3](Arg3: vector<vector<u8>>)
18: CopyLoc[6](loc2: u64)
19: VecImmBorrow(8)
20: ReadRef
21: StLoc[4](loc0: vector<u8>)
22: ImmBorrowLoc[4](loc0: vector<u8>)
23: VecLen(17)
24: LdConst[1](u64: 20)
25: Eq
26: BrFalse(28)
B4:
27: Branch(30)
B5:
28: LdConst[3](u64: 1)
29: Abort
B6:
30: MutBorrowLoc[7](loc3: vector<u8>)
31: MoveLoc[4](loc0: vector<u8>)
32: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
33: MoveLoc[6](loc2: u64)
34: LdU64(1)
35: Add
36: StLoc[6](loc2: u64)
37: Branch(12)
B7:
38: Call message_types::committee_blocklist(): u8
39: LdConst[0](u8: 1)
40: MoveLoc[1](Arg1: u64)
41: MoveLoc[0](Arg0: u8)
42: MoveLoc[7](loc3: vector<u8>)
43: Pack[0](BridgeMessage)
44: Ret
}
public create_update_bridge_limit_message(Arg0: u8, Arg1: u64, Arg2: u8, Arg3: u64): BridgeMessage {
L4: loc0: vector<u8>
B0:
0: CopyLoc[0](Arg0: u8)
1: Call chain_ids::assert_valid_chain_id(u8)
2: CopyLoc[2](Arg2: u8)
3: Call chain_ids::assert_valid_chain_id(u8)
4: MoveLoc[2](Arg2: u8)
5: VecPack(17, 1)
6: StLoc[4](loc0: vector<u8>)
7: MutBorrowLoc[4](loc0: vector<u8>)
8: ImmBorrowLoc[3](Arg3: u64)
9: Call bcs::to_bytes<u64>(&u64): vector<u8>
10: Call reverse_bytes(vector<u8>): vector<u8>
11: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
12: Call message_types::update_bridge_limit(): u8
13: LdConst[0](u8: 1)
14: MoveLoc[1](Arg1: u64)
15: MoveLoc[0](Arg0: u8)
16: MoveLoc[4](loc0: vector<u8>)
17: Pack[0](BridgeMessage)
18: Ret
}
public create_update_asset_price_message(Arg0: u8, Arg1: u8, Arg2: u64, Arg3: u64): BridgeMessage {
L4: loc0: vector<u8>
B0:
0: CopyLoc[1](Arg1: u8)
1: Call chain_ids::assert_valid_chain_id(u8)
2: MoveLoc[0](Arg0: u8)
3: VecPack(17, 1)
4: StLoc[4](loc0: vector<u8>)
5: MutBorrowLoc[4](loc0: vector<u8>)
6: ImmBorrowLoc[3](Arg3: u64)
7: Call bcs::to_bytes<u64>(&u64): vector<u8>
8: Call reverse_bytes(vector<u8>): vector<u8>
9: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
10: Call message_types::update_asset_price(): u8
11: LdConst[0](u8: 1)
12: MoveLoc[2](Arg2: u64)
13: MoveLoc[1](Arg1: u8)
14: MoveLoc[4](loc0: vector<u8>)
15: Pack[0](BridgeMessage)
16: Ret
}
public create_add_tokens_on_safe_message(Arg0: u8, Arg1: u64, Arg2: bool, Arg3: vector<u8>, Arg4: vector<String>, Arg5: vector<u64>): BridgeMessage {
L6: loc0: vector<u8>
B0:
0: CopyLoc[0](Arg0: u8)
1: Call chain_ids::assert_valid_chain_id(u8)
2: ImmBorrowLoc[2](Arg2: bool)
3: Call bcs::to_bytes<bool>(&bool): vector<u8>
4: StLoc[6](loc0: vector<u8>)
5: MutBorrowLoc[6](loc0: vector<u8>)
6: ImmBorrowLoc[3](Arg3: vector<u8>)
7: Call bcs::to_bytes<vector<u8>>(&vector<u8>): vector<u8>
8: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
9: MutBorrowLoc[6](loc0: vector<u8>)
10: ImmBorrowLoc[4](Arg4: vector<String>)
11: Call bcs::to_bytes<vector<String>>(&vector<String>): vector<u8>
12: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
13: MutBorrowLoc[6](loc0: vector<u8>)
14: ImmBorrowLoc[5](Arg5: vector<u64>)
15: Call bcs::to_bytes<vector<u64>>(&vector<u64>): vector<u8>
16: Call vector::append<u8>(&mut vector<u8>, vector<u8>)
17: Call message_types::add_tokens_on_safe(): u8
18: LdConst[0](u8: 1)
19: MoveLoc[1](Arg1: u64)
20: MoveLoc[0](Arg0: u8)
21: MoveLoc[6](loc0: vector<u8>)
22: Pack[0](BridgeMessage)
23: Ret
}
public create_key(Arg0: u8, Arg1: u8, Arg2: u64): BridgeMessageKey {
B0:
0: MoveLoc[0](Arg0: u8)
1: MoveLoc[1](Arg1: u8)
2: MoveLoc[2](Arg2: u64)
3: Pack[1](BridgeMessageKey)
4: Ret
}
public key(Arg0: &BridgeMessage): BridgeMessageKey {
B0:
0: CopyLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[1](BridgeMessage.source_chain: u8)
2: ReadRef
3: CopyLoc[0](Arg0: &BridgeMessage)
4: ImmBorrowField[2](BridgeMessage.message_type: u8)
5: ReadRef
6: MoveLoc[0](Arg0: &BridgeMessage)
7: ImmBorrowField[3](BridgeMessage.seq_num: u64)
8: ReadRef
9: Call create_key(u8, u8, u64): BridgeMessageKey
10: Ret
}
public message_version(Arg0: &BridgeMessage): u8 {
B0:
0: MoveLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[4](BridgeMessage.message_version: u8)
2: ReadRef
3: Ret
}
public message_type(Arg0: &BridgeMessage): u8 {
B0:
0: MoveLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[2](BridgeMessage.message_type: u8)
2: ReadRef
3: Ret
}
public seq_num(Arg0: &BridgeMessage): u64 {
B0:
0: MoveLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[3](BridgeMessage.seq_num: u64)
2: ReadRef
3: Ret
}
public source_chain(Arg0: &BridgeMessage): u8 {
B0:
0: MoveLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[1](BridgeMessage.source_chain: u8)
2: ReadRef
3: Ret
}
public payload(Arg0: &BridgeMessage): vector<u8> {
B0:
0: MoveLoc[0](Arg0: &BridgeMessage)
1: ImmBorrowField[0](BridgeMessage.payload: vector<u8>)
2: ReadRef
3: Ret
}
public token_target_chain(Arg0: &TokenTransferPayload): u8 {
B0:
0: MoveLoc[0](Arg0: &TokenTransferPayload)
1: ImmBorrowField[5](TokenTransferPayload.target_chain: u8)
2: ReadRef
3: Ret
}
public token_target_address(Arg0: &TokenTransferPayload): vector<u8> {
B0:
0: MoveLoc[0](Arg0: &TokenTransferPayload)
1: ImmBorrowField[6](TokenTransferPayload.target_address: vector<u8>)
2: ReadRef
3: Ret
}
public token_type(Arg0: &TokenTransferPayload): u8 {
B0:
0: MoveLoc[0](Arg0: &TokenTransferPayload)
1: ImmBorrowField[7](TokenTransferPayload.token_type: u8)
2: ReadRef
3: Ret
}
public token_amount(Arg0: &TokenTransferPayload): u64 {
B0:
0: MoveLoc[0](Arg0: &TokenTransferPayload)
1: ImmBorrowField[8](TokenTransferPayload.amount: u64)
2: ReadRef
3: Ret
}
public emergency_op_type(Arg0: &EmergencyOp): u8 {
B0:
0: MoveLoc[0](Arg0: &EmergencyOp)
1: ImmBorrowField[9](EmergencyOp.op_type: u8)
2: ReadRef
3: Ret
}
public blocklist_type(Arg0: &Blocklist): u8 {
B0:
0: MoveLoc[0](Arg0: &Blocklist)
1: ImmBorrowField[10](Blocklist.blocklist_type: u8)
2: ReadRef
3: Ret
}
public blocklist_validator_addresses(Arg0: &Blocklist): &vector<vector<u8>> {
B0:
0: MoveLoc[0](Arg0: &Blocklist)
1: ImmBorrowField[11](Blocklist.validator_eth_addresses: vector<vector<u8>>)
2: Ret
}
public update_bridge_limit_payload_sending_chain(Arg0: &UpdateBridgeLimit): u8 {
B0:
0: MoveLoc[0](Arg0: &UpdateBridgeLimit)
1: ImmBorrowField[12](UpdateBridgeLimit.sending_chain: u8)
2: ReadRef
3: Ret
}
public update_bridge_limit_payload_receiving_chain(Arg0: &UpdateBridgeLimit): u8 {
B0:
0: MoveLoc[0](Arg0: &UpdateBridgeLimit)
1: ImmBorrowField[13](UpdateBridgeLimit.receiving_chain: u8)
2: ReadRef
3: Ret
}
public update_bridge_limit_payload_limit(Arg0: &UpdateBridgeLimit): u64 {
B0:
0: MoveLoc[0](Arg0: &UpdateBridgeLimit)
1: ImmBorrowField[14](UpdateBridgeLimit.limit: u64)
2: ReadRef
3: Ret
}
public update_asset_price_payload_token_id(Arg0: &UpdateAssetPrice): u8 {
B0:
0: MoveLoc[0](Arg0: &UpdateAssetPrice)
1: ImmBorrowField[15](UpdateAssetPrice.token_id: u8)
2: ReadRef
3: Ret
}
public update_asset_price_payload_new_price(Arg0: &UpdateAssetPrice): u64 {
B0:
0: MoveLoc[0](Arg0: &UpdateAssetPrice)
1: ImmBorrowField[16](UpdateAssetPrice.new_price: u64)
2: ReadRef
3: Ret
}
public is_native(Arg0: &AddTokenOnSafe): bool {
B0:
0: MoveLoc[0](Arg0: &AddTokenOnSafe)
1: ImmBorrowField[17](AddTokenOnSafe.native_token: bool)
2: ReadRef
3: Ret
}
public token_ids(Arg0: &AddTokenOnSafe): vector<u8> {
B0:
0: MoveLoc[0](Arg0: &AddTokenOnSafe)
1: ImmBorrowField[18](AddTokenOnSafe.token_ids: vector<u8>)
2: ReadRef
3: Ret
}
public token_type_names(Arg0: &AddTokenOnSafe): vector<String> {
B0:
0: MoveLoc[0](Arg0: &AddTokenOnSafe)
1: ImmBorrowField[19](AddTokenOnSafe.token_type_names: vector<String>)
2: ReadRef
3: Ret
}
public token_prices(Arg0: &AddTokenOnSafe): vector<u64> {
B0:
0: MoveLoc[0](Arg0: &AddTokenOnSafe)
1: ImmBorrowField[20](AddTokenOnSafe.token_prices: vector<u64>)
2: ReadRef
3: Ret
}
public emergency_op_pause(): u8 {
B0:
0: LdConst[9](u8: 0)
1: Ret
}
public emergency_op_unpause(): u8 {
B0:
0: LdConst[0](u8: 1)
1: Ret
}
public required_voting_power(Arg0: &BridgeMessage): u64 {
L1: loc0: u64
L2: loc1: u64
L3: loc2: u64
L4: loc3: u64
L5: loc4: u64
L6: loc5: u64
L7: loc6: u8
L8: loc7: EmergencyOp
B0:
0: CopyLoc[0](Arg0: &BridgeMessage)
1: Call message_type(&BridgeMessage): u8
2: StLoc[7](loc6: u8)
3: CopyLoc[7](loc6: u8)
4: Call message_types::token(): u8
5: Eq
6: BrFalse(12)
B1:
7: MoveLoc[0](Arg0: &BridgeMessage)
8: Pop
9: LdU64(3334)
10: StLoc[6](loc5: u64)
11: Branch(82)
B2:
12: CopyLoc[7](loc6: u8)
13: Call message_types::emergency_op(): u8
14: Eq
15: BrFalse(42)
B3:
16: MoveLoc[0](Arg0: &BridgeMessage)
17: Call extract_emergency_op_payload(&BridgeMessage): EmergencyOp
18: StLoc[8](loc7: EmergencyOp)
19: ImmBorrowLoc[8](loc7: EmergencyOp)
20: ImmBorrowField[9](EmergencyOp.op_type: u8)
21: ReadRef
22: LdConst[9](u8: 0)
23: Eq
24: BrFalse(28)
B4:
25: LdU64(450)
26: StLoc[1](loc0: u64)
27: Branch(39)
B5:
28: ImmBorrowLoc[8](loc7: EmergencyOp)
29: ImmBorrowField[9](EmergencyOp.op_type: u8)
30: ReadRef
31: LdConst[0](u8: 1)
32: Eq
33: BrFalse(35)
B6:
34: Branch(37)
B7:
35: LdConst[6](u64: 4)
36: Abort
B8:
37: LdU64(5001)
38: StLoc[1](loc0: u64)
B9:
39: MoveLoc[1](loc0: u64)
40: StLoc[5](loc4: u64)
41: Branch(80)
B10:
42: MoveLoc[0](Arg0: &BridgeMessage)
43: Pop
44: CopyLoc[7](loc6: u8)
45: Call message_types::committee_blocklist(): u8
46: Eq
47: BrFalse(51)
B11:
48: LdU64(5001)
49: StLoc[4](loc3: u64)
50: Branch(78)
B12:
51: CopyLoc[7](loc6: u8)
52: Call message_types::update_asset_price(): u8
53: Eq
54: BrFalse(58)
B13:
55: LdU64(5001)
56: StLoc[3](loc2: u64)
57: Branch(76)
B14:
58: CopyLoc[7](loc6: u8)
59: Call message_types::update_bridge_limit(): u8
60: Eq
61: BrFalse(65)
B15:
62: LdU64(5001)
63: StLoc[2](loc1: u64)
64: Branch(74)
B16:
65: MoveLoc[7](loc6: u8)
66: Call message_types::add_tokens_on_safe(): u8
67: Eq
68: BrFalse(70)
B17:
69: Branch(72)
B18:
70: LdConst[5](u64: 3)
71: Abort
B19:
72: LdU64(5001)
73: StLoc[2](loc1: u64)
B20:
74: MoveLoc[2](loc1: u64)
75: StLoc[3](loc2: u64)
B21:
76: MoveLoc[3](loc2: u64)
77: StLoc[4](loc3: u64)
B22:
78: MoveLoc[4](loc3: u64)
79: StLoc[5](loc4: u64)
B23:
80: MoveLoc[5](loc4: u64)
81: StLoc[6](loc5: u64)
B24:
82: MoveLoc[6](loc5: u64)
83: Ret
}
public to_parsed_token_transfer_message(Arg0: &BridgeMessage): ParsedTokenTransferMessage {
L1: loc0: TokenTransferPayload
B0:
0: CopyLoc[0](Arg0: &BridgeMessage)
1: Call message_type(&BridgeMessage): u8
2: Call message_types::token(): u8
3: Eq
4: BrFalse(6)
B1:
5: Branch(10)
B2:
6: MoveLoc[0](Arg0: &BridgeMessage)
7: Pop
8: LdConst[8](u64: 6)
9: Abort
B3:
10: CopyLoc[0](Arg0: &BridgeMessage)
11: Call extract_token_bridge_payload(&BridgeMessage): TokenTransferPayload
12: StLoc[1](loc0: TokenTransferPayload)
13: CopyLoc[0](Arg0: &BridgeMessage)
14: Call message_version(&BridgeMessage): u8
15: CopyLoc[0](Arg0: &BridgeMessage)
16: Call seq_num(&BridgeMessage): u64
17: CopyLoc[0](Arg0: &BridgeMessage)
18: Call source_chain(&BridgeMessage): u8
19: MoveLoc[0](Arg0: &BridgeMessage)
20: Call payload(&BridgeMessage): vector<u8>
21: MoveLoc[1](loc0: TokenTransferPayload)
22: Pack[8](ParsedTokenTransferMessage)
23: Ret
}
reverse_bytes(Arg0: vector<u8>): vector<u8> {
B0:
0: MutBorrowLoc[0](Arg0: vector<u8>)
1: Call vector::reverse<u8>(&mut vector<u8>)
2: MoveLoc[0](Arg0: vector<u8>)
3: Ret
}
peel_u64_be(Arg0: &mut BCS): u64 {
L1: loc0: u64
L2: loc1: u8
L3: loc2: u64
B0:
0: LdU64(0)
1: LdU8(64)
2: StLoc[2](loc1: u8)
3: StLoc[3](loc2: u64)
B1:
4: CopyLoc[2](loc1: u8)
5: LdU8(0)
6: Gt
7: BrFalse(24)
B2:
8: Branch(9)
B3:
9: MoveLoc[2](loc1: u8)
10: LdU8(8)
11: Sub
12: StLoc[2](loc1: u8)
13: CopyLoc[0](Arg0: &mut BCS)
14: Call bcs::peel_u8(&mut BCS): u8
15: CastU64
16: StLoc[1](loc0: u64)
17: MoveLoc[3](loc2: u64)
18: MoveLoc[1](loc0: u64)
19: CopyLoc[2](loc1: u8)
20: Shl
21: Add
22: StLoc[3](loc2: u64)
23: Branch(4)
B4:
24: MoveLoc[0](Arg0: &mut BCS)
25: Pop
26: MoveLoc[3](loc2: u64)
27: Ret
}
Constants [
0 => u8: 1
1 => u64: 20
2 => u64: 0
3 => u64: 1
4 => u64: 2
5 => u64: 3
6 => u64: 4
7 => u64: 5
8 => u64: 6
9 => u8: 0
10 => vector<vector<u8>>: 00
11 => vector<u8>: "" // interpreted as UTF8 string
]
}
message_types
// Move bytecode v6
module b.message_types {
public token(): u8 {
B0:
0: LdConst[0](u8: 0)
1: Ret
}
public committee_blocklist(): u8 {
B0:
0: LdConst[1](u8: 1)
1: Ret
}
public emergency_op(): u8 {
B0:
0: LdConst[2](u8: 2)
1: Ret
}
public update_bridge_limit(): u8 {
B0:
0: LdConst[3](u8: 3)
1: Ret
}
public update_asset_price(): u8 {
B0:
0: LdConst[4](u8: 4)
1: Ret
}
public add_tokens_on_safe(): u8 {
B0:
0: LdConst[5](u8: 6)
1: Ret
}
Constants [
0 => u8: 0
1 => u8: 1
2 => u8: 2
3 => u8: 3
4 => u8: 4
5 => u8: 6
]
}
treasury
// Move bytecode v6
module b.treasury {
use 0000000000000000000000000000000000000000000000000000000000000002::address;
use 0000000000000000000000000000000000000000000000000000000000000002::bag;
use 0000000000000000000000000000000000000000000000000000000000000002::coin;
use 0000000000000000000000000000000000000000000000000000000000000002::event;
use 0000000000000000000000000000000000000000000000000000000000000002::hex;
use 0000000000000000000000000000000000000000000000000000000000000002::object;
use 0000000000000000000000000000000000000000000000000000000000000002::object_bag;
use 0000000000000000000000000000000000000000000000000000000000000002::package;
use 0000000000000000000000000000000000000000000000000000000000000002::transfer;
use 0000000000000000000000000000000000000000000000000000000000000002::tx_context;
use 0000000000000000000000000000000000000000000000000000000000000002::vec_map;
use 0000000000000000000000000000000000000000000000000000000000000001::ascii;
use 0000000000000000000000000000000000000000000000000000000000000001::option;
use 0000000000000000000000000000000000000000000000000000000000000001::type_name;
use 0000000000000000000000000000000000000000000000000000000000000001::u64;
struct BridgeTreasury has store {
treasuries: ObjectBag,
supported_tokens: VecMap<TypeName, BridgeTokenMetadata>,
id_token_type_map: VecMap<u8, TypeName>,
waiting_room: Bag
}
struct BridgeTokenMetadata has copy, drop, store {
id: u8,
decimal_multiplier: u64,
notional_value: u64,
native_token: bool
}
struct ForeignTokenRegistration has store {
type_name: TypeName,
uc: UpgradeCap,
decimal: u8
}
struct UpdateTokenPriceEvent has copy, drop {
token_id: u8,
new_price: u64
}
struct NewTokenEvent has copy, drop {
token_id: u8,
type_name: TypeName,
native_token: bool,
decimal_multiplier: u64,
notional_value: u64
}
struct TokenRegistrationEvent has copy, drop {
type_name: TypeName,
decimal: u8,
native_token: bool
}
public token_id<Ty0>(Arg0: &BridgeTreasury): u8 {
L1: loc0: BridgeTokenMetadata
B0:
0: MoveLoc[0](Arg0: &BridgeTreasury)
1: Call get_token_metadata<Ty0>(&BridgeTreasury): BridgeTokenMetadata
2: StLoc[1](loc0: BridgeTokenMetadata)
3: ImmBorrowLoc[1](loc0: BridgeTokenMetadata)
4: ImmBorrowField[0](BridgeTokenMetadata.id: u8)
5: ReadRef
6: Ret
}
public decimal_multiplier<Ty0>(Arg0: &BridgeTreasury): u64 {
L1: loc0: BridgeTokenMetadata
B0:
0: MoveLoc[0](Arg0: &BridgeTreasury)
1: Call get_token_metadata<Ty0>(&BridgeTreasury): BridgeTokenMetadata
2: StLoc[1](loc0: BridgeTokenMetadata)
3: ImmBorrowLoc[1](loc0: BridgeTokenMetadata)
4: ImmBorrowField[1](BridgeTokenMetadata.decimal_multiplier: u64)
5: ReadRef
6: Ret
}
public notional_value<Ty0>(Arg0: &BridgeTreasury): u64 {
L1: loc0: BridgeTokenMetadata
B0:
0: MoveLoc[0](Arg0: &BridgeTreasury)
1: Call get_token_metadata<Ty0>(&BridgeTreasury): BridgeTokenMetadata
2: StLoc[1](loc0: BridgeTokenMetadata)
3: ImmBorrowLoc[1](loc0: BridgeTokenMetadata)
4: ImmBorrowField[2](BridgeTokenMetadata.notional_value: u64)
5: ReadRef
6: Ret
}
public(friend) register_foreign_token<Ty0>(Arg0: &mut BridgeTreasury, Arg1: TreasuryCap<Ty0>, Arg2: UpgradeCap, Arg3: &CoinMetadata<Ty0>) {
L4: loc0: ID
L5: loc1: address
L6: loc2: ForeignTokenRegistration
L7: loc3: TypeName
B0:
0: ImmBorrowLoc[1](Arg1: TreasuryCap<Ty0>)
1: Call coin::total_supply<Ty0>(&TreasuryCap<Ty0>): u64
2: LdU64(0)
3: Eq
4: BrFalse(6)
B1:
5: Branch(12)
B2:
6: MoveLoc[0](Arg0: &mut BridgeTreasury)
7: Pop
8: MoveLoc[3](Arg3: &CoinMetadata<Ty0>)
9: Pop
10: LdConst[2](u64: 3)
11: Abort
B3:
12: Call type_name::get<Ty0>(): TypeName
13: StLoc[7](loc3: TypeName)
14: ImmBorrowLoc[7](loc3: TypeName)
15: Call type_name::get_address(&TypeName): String
16: Call ascii::into_bytes(String): vector<u8>
17: Call hex::decode(vector<u8>): vector<u8>
18: Call address::from_bytes(vector<u8>): address
19: StLoc[5](loc1: address)
20: ImmBorrowLoc[2](Arg2: UpgradeCap)
21: Call package::upgrade_package(&UpgradeCap): ID
22: StLoc[4](loc0: ID)
23: ImmBorrowLoc[4](loc0: ID)
24: Call object::id_to_address(&ID): address
25: MoveLoc[5](loc1: address)
26: Eq
27: BrFalse(29)
B4:
28: Branch(35)
B5:
29: MoveLoc[0](Arg0: &mut BridgeTreasury)
30: Pop
31: MoveLoc[3](Arg3: &CoinMetadata<Ty0>)
32: Pop
33: LdConst[1](u64: 2)
34: Abort
B6:
35: CopyLoc[7](loc3: TypeName)
36: MoveLoc[2](Arg2: UpgradeCap)
37: CopyLoc[3](Arg3: &CoinMetadata<Ty0>)
38: Call coin::get_decimals<Ty0>(&CoinMetadata<Ty0>): u8
39: Pack[2](ForeignTokenRegistration)
40: StLoc[6](loc2: ForeignTokenRegistration)
41: CopyLoc[0](Arg0: &mut BridgeTreasury)
42: MutBorrowField[3](BridgeTreasury.waiting_room: Bag)
43: CopyLoc[7](loc3: TypeName)
44: Call type_name::into_string(TypeName): String
45: MoveLoc[6](loc2: ForeignTokenRegistration)
46: Call bag::add<String, ForeignTokenRegistration>(&mut Bag, String, ForeignTokenRegistration)
47: MoveLoc[0](Arg0: &mut BridgeTreasury)
48: MutBorrowField[4](BridgeTreasury.treasuries: ObjectBag)
49: CopyLoc[7](loc3: TypeName)
50: MoveLoc[1](Arg1: TreasuryCap<Ty0>)
51: Call object_bag::add<TypeName, TreasuryCap<Ty0>>(&mut ObjectBag, TypeName, TreasuryCap<Ty0>)
52: MoveLoc[7](loc3: TypeName)
53: MoveLoc[3](Arg3: &CoinMetadata<Ty0>)
54: Call coin::get_decimals<Ty0>(&CoinMetadata<Ty0>): u8
55: LdFalse
56: Pack[5](TokenRegistrationEvent)
57: Call event::emit<TokenRegistrationEvent>(TokenRegistrationEvent)
58: Ret
}
public(friend) add_new_token(Arg0: &mut BridgeTreasury, Arg1: String, Arg2: u8, Arg3: bool, Arg4: u64) {
L5: loc0: u8
L6: loc1: u64
L7: loc2: TypeName
L8: loc3: UpgradeCap
B0:
0: CopyLoc[3](Arg3: bool)
1: Not
2: BrFalse(48)
B1:
3: CopyLoc[4](Arg4: u64)
4: LdU64(0)
5: Gt
6: BrFalse(8)
B2:
7: Branch(12)
B3:
8: MoveLoc[0](Arg0: &mut BridgeTreasury)
9: Pop
10: LdConst[3](u64: 4)
11: Abort
B4:
12: CopyLoc[0](Arg0: &mut BridgeTreasury)
13: MutBorrowField[3](BridgeTreasury.waiting_room: Bag)
14: MoveLoc[1](Arg1: String)
15: Call bag::remove<String, ForeignTokenRegistration>(&mut Bag, String): ForeignTokenRegistration
16: Unpack[2](ForeignTokenRegistration)
17: StLoc[5](loc0: u8)
18: StLoc[8](loc3: UpgradeCap)
19: StLoc[7](loc2: TypeName)
20: LdU64(10)
21: MoveLoc[5](loc0: u8)
22: Call u64::pow(u64, u8): u64
23: StLoc[6](loc1: u64)
24: CopyLoc[0](Arg0: &mut BridgeTreasury)
25: MutBorrowField[5](BridgeTreasury.supported_tokens: VecMap<TypeName, BridgeTokenMetadata>)
26: CopyLoc[7](loc2: TypeName)
27: CopyLoc[2](Arg2: u8)
28: CopyLoc[6](loc1: u64)
29: CopyLoc[4](Arg4: u64)
30: CopyLoc[3](Arg3: bool)
31: Pack[1](BridgeTokenMetadata)
32: Call vec_map::insert<TypeName, BridgeTokenMetadata>(&mut VecMap<TypeName, BridgeTokenMetadata>, TypeName, BridgeTokenMetadata)
33: MoveLoc[0](Arg0: &mut BridgeTreasury)
34: MutBorrowField[6](BridgeTreasury.id_token_type_map: VecMap<u8, TypeName>)
35: CopyLoc[2](Arg2: u8)
36: CopyLoc[7](loc2: TypeName)
37: Call vec_map::insert<u8, TypeName>(&mut VecMap<u8, TypeName>, u8, TypeName)
38: MoveLoc[8](loc3: UpgradeCap)
39: Call transfer::public_freeze_object<UpgradeCap>(UpgradeCap)
40: MoveLoc[2](Arg2: u8)
41: MoveLoc[7](loc2: TypeName)
42: MoveLoc[3](Arg3: bool)
43: MoveLoc[6](loc1: u64)
44: MoveLoc[4](Arg4: u64)
45: Pack[4](NewTokenEvent)
46: Call event::emit<NewTokenEvent>(NewTokenEvent)
47: Branch(50)
B5:
48: MoveLoc[0](Arg0: &mut BridgeTreasury)
49: Pop
B6:
50: Ret
}
public(friend) create(Arg0: &mut TxContext): BridgeTreasury {
B0:
0: CopyLoc[0](Arg0: &mut TxContext)
1: Call object_bag::new(&mut TxContext): ObjectBag
2: Call vec_map::empty<TypeName, BridgeTokenMetadata>(): VecMap<TypeName, BridgeTokenMetadata>
3: Call vec_map::empty<u8, TypeName>(): VecMap<u8, TypeName>
4: MoveLoc[0](Arg0: &mut TxContext)
5: Call bag::new(&mut TxContext): Bag
6: Pack[0](BridgeTreasury)
7: Ret
}
public(friend) burn<Ty0>(Arg0: &mut BridgeTreasury, Arg1: Coin<Ty0>) {
B0:
0: MoveLoc[0](Arg0: &mut BridgeTreasury)
1: MutBorrowField[4](BridgeTreasury.treasuries: ObjectBag)
2: Call type_name::get<Ty0>(): TypeName
3: Call object_bag::borrow_mut<TypeName, TreasuryCap<Ty0>>(&mut ObjectBag, TypeName): &mut TreasuryCap<Ty0>
4: MoveLoc[1](Arg1: Coin<Ty0>)
5: Call coin::burn<Ty0>(&mut TreasuryCap<Ty0>, Coin<Ty0>): u64
6: Pop
7: Ret
}
public(friend) mint<Ty0>(Arg0: &mut BridgeTreasury, Arg1: u64, Arg2: &mut TxContext): Coin<Ty0> {
B0:
0: MoveLoc[0](Arg0: &mut BridgeTreasury)
1: MutBorrowField[4](BridgeTreasury.treasuries: ObjectBag)
2: Call type_name::get<Ty0>(): TypeName
3: Call object_bag::borrow_mut<TypeName, TreasuryCap<Ty0>>(&mut ObjectBag, TypeName): &mut TreasuryCap<Ty0>
4: MoveLoc[1](Arg1: u64)
5: MoveLoc[2](Arg2: &mut TxContext)
6: Call coin::mint<Ty0>(&mut TreasuryCap<Ty0>, u64, &mut TxContext): Coin<Ty0>
7: Ret
}
public(friend) update_asset_notional_price(Arg0: &mut BridgeTreasury, Arg1: u8, Arg2: u64) {
L3: loc0: &mut BridgeTokenMetadata
L4: loc1: Option<TypeName>
L5: loc2: TypeName
B0:
0: CopyLoc[0](Arg0: &mut BridgeTreasury)
1: ImmBorrowField[6](BridgeTreasury.id_token_type_map: VecMap<u8, TypeName>)
2: ImmBorrowLoc[1](Arg1: u8)
3: Call vec_map::try_get<u8, TypeName>(&VecMap<u8, TypeName>, &u8): Option<TypeName>
4: StLoc[4](loc1: Option<TypeName>)
5: ImmBorrowLoc[4](loc1: Option<TypeName>)
6: Call option::is_some<TypeName>(&Option<TypeName>): bool
7: BrFalse(9)
B1:
8: Branch(13)
B2:
9: MoveLoc[0](Arg0: &mut BridgeTreasury)
10: Pop
11: LdConst[0](u64: 1)
12: Abort
B3:
13: CopyLoc[2](Arg2: u64)
14: LdU64(0)
15: Gt
16: BrFalse(18)
B4:
17: Branch(22)
B5:
18: MoveLoc[0](Arg0: &mut BridgeTreasury)
19: Pop
20: LdConst[3](u64: 4)
21: Abort
B6:
22: MoveLoc[4](loc1: Option<TypeName>)
23: Call option::destroy_some<TypeName>(Option<TypeName>): TypeName
24: StLoc[5](loc2: TypeName)
25: MoveLoc[0](Arg0: &mut BridgeTreasury)
26: MutBorrowField[5](BridgeTreasury.supported_tokens: VecMap<TypeName, BridgeTokenMetadata>)
27: ImmBorrowLoc[5](loc2: TypeName)
28: Call vec_map::get_mut<TypeName, BridgeTokenMetadata>(&mut VecMap<TypeName, BridgeTokenMetadata>, &TypeName): &mut BridgeTokenMetadata
29: StLoc[3](loc0: &mut BridgeTokenMetadata)
30: CopyLoc[2](Arg2: u64)
31: MoveLoc[3](loc0: &mut BridgeTokenMetadata)
32: MutBorrowField[2](BridgeTokenMetadata.notional_value: u64)
33: WriteRef
34: MoveLoc[1](Arg1: u8)
35: MoveLoc[2](Arg2: u64)
36: Pack[3](UpdateTokenPriceEvent)
37: Call event::emit<UpdateTokenPriceEvent>(UpdateTokenPriceEvent)
38: Ret
}
get_token_metadata<Ty0>(Arg0: &BridgeTreasury): BridgeTokenMetadata {
L1: loc0: TypeName
L2: loc1: Option<BridgeTokenMetadata>
B0:
0: Call type_name::get<Ty0>(): TypeName
1: StLoc[1](loc0: TypeName)
2: MoveLoc[0](Arg0: &BridgeTreasury)
3: ImmBorrowField[5](BridgeTreasury.supported_tokens: VecMap<TypeName, BridgeTokenMetadata>)
4: ImmBorrowLoc[1](loc0: TypeName)
5: Call vec_map::try_get<TypeName, BridgeTokenMetadata>(&VecMap<TypeName, BridgeTokenMetadata>, &TypeName): Option<BridgeTokenMetadata>
6: StLoc[2](loc1: Option<BridgeTokenMetadata>)
7: ImmBorrowLoc[2](loc1: Option<BridgeTokenMetadata>)
8: Call option::is_some<BridgeTokenMetadata>(&Option<BridgeTokenMetadata>): bool
9: BrFalse(11)
B1:
10: Branch(13)
B2:
11: LdConst[0](u64: 1)
12: Abort
B3:
13: MoveLoc[2](loc1: Option<BridgeTokenMetadata>)
14: Call option::destroy_some<BridgeTokenMetadata>(Option<BridgeTokenMetadata>): BridgeTokenMetadata
15: Ret
}
Constants [
0 => u64: 1
1 => u64: 2
2 => u64: 3
3 => u64: 4
]
}
SafeCoin