Update Wormhole solidity contract
This commit is contained in:
parent
b3832ab8c7
commit
bb2e3be463
|
@ -78,18 +78,18 @@ contract Wormhole {
|
||||||
// Load 4 bytes starting from index 1
|
// Load 4 bytes starting from index 1
|
||||||
uint32 vaa_guardian_set_index = vaa.toUint32(1);
|
uint32 vaa_guardian_set_index = vaa.toUint32(1);
|
||||||
|
|
||||||
uint256 signature = vaa.toUint256(2);
|
uint256 signature = vaa.toUint256(5);
|
||||||
address sig_address = vaa.toAddress(34);
|
address sig_address = vaa.toAddress(37);
|
||||||
|
|
||||||
// Load 4 bytes starting from index 77
|
// Load 4 bytes starting from index 77
|
||||||
uint32 timestamp = vaa.toUint32(77);
|
uint32 timestamp = vaa.toUint32(57);
|
||||||
|
|
||||||
// Verify that the VAA is still valid
|
// Verify that the VAA is still valid
|
||||||
// TODO: the clock on Solana can't be trusted
|
// TODO: the clock on Solana can't be trusted
|
||||||
require(timestamp + vaa_expiry < block.timestamp, "VAA has expired");
|
require(timestamp + vaa_expiry < block.timestamp, "VAA has expired");
|
||||||
|
|
||||||
// Hash the body
|
// Hash the body
|
||||||
bytes32 hash = keccak256(vaa.slice(77, vaa.length - 77));
|
bytes32 hash = keccak256(vaa.slice(57, vaa.length - 57));
|
||||||
require(!consumedVAAs[hash], "VAA was already executed");
|
require(!consumedVAAs[hash], "VAA was already executed");
|
||||||
|
|
||||||
GuardianSet memory guardian_set = guardian_sets[vaa_guardian_set_index];
|
GuardianSet memory guardian_set = guardian_sets[vaa_guardian_set_index];
|
||||||
|
@ -102,11 +102,11 @@ contract Wormhole {
|
||||||
uint256(hash),
|
uint256(hash),
|
||||||
sig_address
|
sig_address
|
||||||
),
|
),
|
||||||
"VAA signataure invalid");
|
"VAA signature invalid");
|
||||||
|
|
||||||
uint8 action = vaa.toUint8(81);
|
uint8 action = vaa.toUint8(61);
|
||||||
uint8 payload_len = vaa.toUint8(82);
|
uint8 payload_len = vaa.toUint8(62);
|
||||||
bytes memory payload = vaa.slice(83, payload_len);
|
bytes memory payload = vaa.slice(63, payload_len);
|
||||||
|
|
||||||
// Process VAA
|
// Process VAA
|
||||||
if (action == 0x01) {
|
if (action == 0x01) {
|
||||||
|
@ -140,22 +140,23 @@ contract Wormhole {
|
||||||
}
|
}
|
||||||
|
|
||||||
function vaaTransfer(bytes memory data) private {
|
function vaaTransfer(bytes memory data) private {
|
||||||
//uint64 nonce = data.toUint64(0);
|
//uint32 nonce = data.toUint64(0);
|
||||||
uint8 source_chain = data.toUint8(8);
|
uint8 source_chain = data.toUint8(4);
|
||||||
|
|
||||||
uint8 target_chain = data.toUint8(9);
|
uint8 target_chain = data.toUint8(5);
|
||||||
//bytes32 target_address = data.toBytes32(10);
|
//bytes32 source_address = data.toBytes32(6);
|
||||||
address target_address = data.toAddress(10 + 12);
|
//bytes32 target_address = data.toBytes32(38);
|
||||||
|
address target_address = data.toAddress(38 + 12);
|
||||||
|
|
||||||
uint8 token_chain = data.toUint8(42);
|
uint8 token_chain = data.toUint8(70);
|
||||||
//bytes32 token_address = data.toBytes32(43);
|
//bytes32 token_address = data.toBytes32(71);
|
||||||
uint256 amount = data.toUint8(75);
|
uint256 amount = data.toUint256(103);
|
||||||
|
|
||||||
require(source_chain != target_chain, "same chain transfers are not supported");
|
require(source_chain != target_chain, "same chain transfers are not supported");
|
||||||
require(target_chain == CHAIN_ID, "transfer must be incoming");
|
require(target_chain == CHAIN_ID, "transfer must be incoming");
|
||||||
|
|
||||||
if (token_chain != CHAIN_ID) {
|
if (token_chain != CHAIN_ID) {
|
||||||
bytes32 token_address = data.toBytes32(43);
|
bytes32 token_address = data.toBytes32(71);
|
||||||
bytes32 asset_id = keccak256(abi.encodePacked(token_chain, token_address));
|
bytes32 asset_id = keccak256(abi.encodePacked(token_chain, token_address));
|
||||||
|
|
||||||
// if yes: mint to address
|
// if yes: mint to address
|
||||||
|
@ -167,7 +168,7 @@ contract Wormhole {
|
||||||
|
|
||||||
WrappedAsset(wrapped_asset).mint(target_address, amount);
|
WrappedAsset(wrapped_asset).mint(target_address, amount);
|
||||||
} else {
|
} else {
|
||||||
address token_address = data.toAddress(43 + 12);
|
address token_address = data.toAddress(71 + 12);
|
||||||
|
|
||||||
IERC20(token_address).safeTransfer(target_address, amount);
|
IERC20(token_address).safeTransfer(target_address, amount);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue