Skip to content

Commit f213e93

Browse files
committed
solana: add endpoint_payload to EndpointMessage
1 parent ef70885 commit f213e93

File tree

7 files changed

+43
-17
lines changed

7 files changed

+43
-17
lines changed

solana/programs/example-native-token-transfers/src/instructions/release_outbound.rs

+1
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ pub fn release_outbound(ctx: Context<ReleaseOutbound>, args: ReleaseOutboundArgs
103103
to_chain: accs.outbox_item.recipient_chain,
104104
},
105105
},
106+
vec![],
106107
);
107108

108109
if accs.wormhole_bridge.fee() > 0 {

solana/programs/example-native-token-transfers/src/messages.rs

+25-5
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ pub struct EndpointMessage<E: Endpoint, A: AnchorDeserialize + AnchorSerialize +
182182
_phantom: PhantomData<E>,
183183
// TODO: check sibling registration at the manager level
184184
pub message_data: EndpointMessageData<A>,
185+
pub endpoint_payload: Vec<u8>,
185186
}
186187

187188
impl<E: Endpoint, A: AnchorDeserialize + AnchorSerialize + Space + Clone> std::ops::Deref
@@ -244,6 +245,7 @@ where
244245
source_manager: self.source_manager,
245246
manager_payload: self.manager_payload.clone(),
246247
},
248+
endpoint_payload: self.endpoint_payload.clone(),
247249
}
248250
}
249251
}
@@ -252,13 +254,18 @@ impl<E: Endpoint, A> EndpointMessage<E, A>
252254
where
253255
A: AnchorDeserialize + AnchorSerialize + Space + Clone,
254256
{
255-
pub fn new(source_manager: [u8; 32], manager_payload: ManagerMessage<A>) -> Self {
257+
pub fn new(
258+
source_manager: [u8; 32],
259+
manager_payload: ManagerMessage<A>,
260+
endpoint_payload: Vec<u8>,
261+
) -> Self {
256262
Self {
257263
_phantom: PhantomData,
258264
message_data: EndpointMessageData {
259265
source_manager,
260266
manager_payload,
261267
},
268+
endpoint_payload,
262269
}
263270
}
264271
}
@@ -294,8 +301,15 @@ where
294301
// consumes the expected amount of bytes
295302
let _manager_payload_len: u16 = Readable::read(reader)?;
296303
let manager_payload = ManagerMessage::read(reader)?;
297-
298-
Ok(EndpointMessage::new(source_manager, manager_payload))
304+
let endpoint_payload_len: u16 = Readable::read(reader)?;
305+
let mut endpoint_payload = vec![0; endpoint_payload_len as usize];
306+
reader.read_exact(&mut endpoint_payload)?;
307+
308+
Ok(EndpointMessage::new(
309+
source_manager,
310+
manager_payload,
311+
endpoint_payload,
312+
))
299313
}
300314
}
301315

@@ -321,6 +335,7 @@ where
321335
source_manager,
322336
manager_payload,
323337
},
338+
endpoint_payload,
324339
} = self;
325340

326341
E::PREFIX.write(writer)?;
@@ -331,7 +346,11 @@ where
331346
// a better API would be
332347
// foo.write_with_prefix_be::<u16>(writer)
333348
// which writes the length as a big endian u16.
334-
manager_payload.write(writer)
349+
manager_payload.write(writer)?;
350+
let len: u16 = u16::try_from(endpoint_payload.len()).expect("u16 overflow");
351+
len.write(writer)?;
352+
writer.write_all(endpoint_payload)?;
353+
Ok(())
335354
}
336355
}
337356

@@ -376,7 +395,7 @@ mod test {
376395
//
377396
#[test]
378397
fn test_deserialize_endpoint_message() {
379-
let data = hex::decode("9945ff10042942fafabe00000000000000000000000000000000000000000000000000000079000000367999a1014667921341234300000000000000000000000000000000000000000000000000004f994e545407000000000012d687beefface00000000000000000000000000000000000000000000000000000000feebcafe000000000000000000000000000000000000000000000000000000000011").unwrap();
398+
let data = hex::decode("9945ff10042942fafabe00000000000000000000000000000000000000000000000000000079000000367999a1014667921341234300000000000000000000000000000000000000000000000000004f994e545407000000000012d687beefface00000000000000000000000000000000000000000000000000000000feebcafe0000000000000000000000000000000000000000000000000000000000110000").unwrap();
380399
let mut vec = &data[..];
381400
let message: EndpointMessage<WormholeEndpoint, NativeTokenTransfer> =
382401
TypePrefixedPayload::read_payload(&mut vec).unwrap();
@@ -411,6 +430,7 @@ mod test {
411430
},
412431
},
413432
},
433+
endpoint_payload: vec![],
414434
};
415435
assert_eq!(message, expected);
416436
assert_eq!(vec.len(), 0);

solana/programs/example-native-token-transfers/tests/cancel_flow.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ async fn post_transfer_vaa(
116116
},
117117
};
118118
let endpoint_message: EndpointMessage<WormholeEndpoint, NativeTokenTransfer> =
119-
EndpointMessage::new(OTHER_MANAGER, manager_message.clone());
119+
EndpointMessage::new(OTHER_MANAGER, manager_message.clone(), vec![]);
120120

121121
let vaa = Vaa {
122122
version: 1,

solana/programs/example-native-token-transfers/tests/sdk/accounts.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,11 @@ impl NTT {
101101
manager_message: ManagerMessage<NativeTokenTransfer>,
102102
) -> Pubkey {
103103
let mut hasher = Keccak256::new();
104-
hasher.update(&chain.to_be_bytes());
104+
hasher.update(chain.to_be_bytes());
105105
hasher.update(&TypePrefixedPayload::to_vec_payload(&manager_message));
106106

107107
let (inbox_item, _) = Pubkey::find_program_address(
108-
&[
109-
InboxItem::SEED_PREFIX,
110-
&hasher.finalize(),
111-
],
108+
&[InboxItem::SEED_PREFIX, &hasher.finalize()],
112109
&self.program,
113110
);
114111
inbox_item

solana/programs/example-native-token-transfers/tests/transfer.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ async fn test_transfer(ctx: &mut ProgramTestContext, test_data: &TestData, mode:
185185
to: [1u8; 32],
186186
to_chain: ChainId { id: 2 },
187187
}
188-
}
188+
},
189+
vec![]
189190
)
190191
);
191192

solana/tests/example-native-token-transfer.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,9 @@ describe('example-native-token-transfers', () => {
159159
new NormalizedAmount(BigInt(10000), 8),
160160
toChainId('solana'),
161161
user.publicKey.toBuffer()
162-
)
163-
)
162+
),
163+
),
164+
endpointPayload: Buffer.alloc(0)
164165
}
165166

166167
const serialized = WormholeEndpointMessage.serialize(sendingEndpointMessage, a => ManagerMessage.serialize(a, NativeTokenTransfer.serialize))

solana/ts/sdk/payloads/common.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ export class EndpointMessage<A> {
55
static prefix: Buffer
66
sourceManager: Buffer
77
managerPayload: ManagerMessage<A>
8+
endpointPayload: Buffer
89

9-
constructor(sourceManager: Buffer, managerPayload: ManagerMessage<A>) {
10+
constructor(sourceManager: Buffer, managerPayload: ManagerMessage<A>, endpointPayload: Buffer) {
1011
this.sourceManager = sourceManager
1112
this.managerPayload = managerPayload
13+
this.endpointPayload = endpointPayload
1214
}
1315

1416
static deserialize<A>(data: Buffer, deserializer: (data: Buffer) => ManagerMessage<A>): EndpointMessage<A> {
@@ -22,13 +24,17 @@ export class EndpointMessage<A> {
2224
const sourceManager = data.subarray(4, 36)
2325
const managerPayloadLen = data.readUInt16BE(36)
2426
const managerPayload = deserializer(data.subarray(38, 38 + managerPayloadLen))
25-
return new EndpointMessage(sourceManager, managerPayload)
27+
const endpointPayloadLen = data.readUInt16BE(38 + managerPayloadLen)
28+
const endpointPayload = data.subarray(40 + managerPayloadLen, 40 + managerPayloadLen + endpointPayloadLen)
29+
return new EndpointMessage(sourceManager, managerPayload, endpointPayload)
2630
}
2731

2832
static serialize<A>(msg: EndpointMessage<A>, serializer: (payload: ManagerMessage<A>) => Buffer): Buffer {
2933
const payload = serializer(msg.managerPayload)
3034
assert(msg.sourceManager.length == 32, 'sourceManager must be 32 bytes')
31-
const buffer = Buffer.concat([this.prefix, msg.sourceManager, new BN(payload.length).toBuffer('be', 2), payload])
35+
const payloadLen = new BN(payload.length).toBuffer('be', 2)
36+
const endpointPayloadLen = new BN(msg.endpointPayload.length).toBuffer('be', 2)
37+
const buffer = Buffer.concat([this.prefix, msg.sourceManager, payloadLen, payload, endpointPayloadLen, msg.endpointPayload])
3238
return buffer
3339
}
3440
}

0 commit comments

Comments
 (0)