Aptos improvements (#1079)
* More documentation on the upgrade procedure and mainnet init * Add profiling utility for aptos * Reuse contract manager logic to sync guardian sets * Add documentation for sui gas profiling
This commit is contained in:
parent
0c25fccce5
commit
f224486ae2
|
@ -46,6 +46,22 @@ npm run cli init-pyth -- <seed> -n testnet \
|
|||
--data-source-emitter-addresses e101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa71
|
||||
```
|
||||
|
||||
The following is a sample mainnet config:
|
||||
|
||||
```bash
|
||||
npm run cli init-pyth -- <seed> -n mainnet \
|
||||
--stale-price-threshold 60 \
|
||||
--update-fee 1 \
|
||||
--governance-emitter-chain-id 1 \
|
||||
--governance-emitter-address 5635979a221c34931e32620b9293a463065555ea71fe97cd6237ade875b12e9e \
|
||||
--data-source-chain-ids 1 \
|
||||
--data-source-chain-ids 26 \
|
||||
--data-source-chain-ids 26 \
|
||||
--data-source-emitter-addresses 6bb14509a612f01fbbc4cffeebd4bbfb492a86df717ebe92eb6df432a3f00a25 \
|
||||
--data-source-emitter-addresses f8cd23c2ab91237730770bbea08d61005cdda0984348f3f6eecb559638c0bba0 \
|
||||
--data-source-emitter-addresses e101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa71
|
||||
```
|
||||
|
||||
Note that the `data-source-chain-ids` are paired with `data-source-emitter-addresses` and their order matters.
|
||||
|
||||
# Upgrade process:
|
||||
|
@ -55,6 +71,7 @@ The following steps are needed to upgrade our aptos contracts:
|
|||
- Generate the hash for the new contract build
|
||||
- Create a governance proposal, proposing the aptos package to be upgraded to this specific hash
|
||||
- Approve and execute the governance proposal
|
||||
- Submit the created wormhole VAA to the contract to allow an upgrade with the specified hash.
|
||||
- Run the upgrade transaction and publish the new package
|
||||
|
||||
## Generating the new contract hash:
|
||||
|
@ -65,6 +82,42 @@ Run the following command to generate the new hash, this will assume the default
|
|||
npm run cli hash-contracts -- ../contracts
|
||||
```
|
||||
|
||||
## Creating a proposal
|
||||
|
||||
Here are sample steps you can take to create a proposal via the contract manager shell (`npm run shell` in contract manager package):
|
||||
|
||||
```js
|
||||
let wallet = await loadHotWallet("/path/to/solana/wallet.json");
|
||||
let vault =
|
||||
DefaultStore.vaults.devnet_6baWtW1zTUVMSJHJQVxDUXWzqrQeYBr6mu31j3bTKwY3;
|
||||
await vault.connect(wallet);
|
||||
let payload =
|
||||
DefaultStore.chains.aptos_testnet.generateGovernanceUpgradePayload(
|
||||
"CONTRACT_HASH_TO_USE"
|
||||
);
|
||||
await vault.proposeWormholeMessage([payload]);
|
||||
```
|
||||
|
||||
## VAA submission
|
||||
|
||||
After the approval process, you can fetch the VAA for the transaction and execute it by running:
|
||||
|
||||
```js
|
||||
import { SubmittedWormholeMessage } from "./src/governance";
|
||||
let msg = await SubmittedWormholeMessage.fromTransactionSignature(
|
||||
"tx_signature",
|
||||
"devnet or mainnet-beta"
|
||||
);
|
||||
let vaa = await msg.fetchVaa();
|
||||
let contract =
|
||||
DefaultStore.contracts
|
||||
.aptos_testnet_0x7e783b349d3e89cf5931af376ebeadbfab855b3fa239b7ada8f5a92fbea6b387;
|
||||
await contract.executeGovernanceInstruction(
|
||||
"private-key-of-account-inaptos",
|
||||
vaa
|
||||
);
|
||||
```
|
||||
|
||||
## Upgrading the contract
|
||||
|
||||
To upgrade the contract after the governance vaa was executed run:
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
[package]
|
||||
name = "Profiler"
|
||||
version = "0.0.1"
|
||||
upgrade_policy = "compatible"
|
||||
|
||||
[dependencies]
|
||||
Pyth = { git = "https://github.com/pyth-network/pyth-crosschain.git", addr_subst = { "pyth" = "0x7e783b349d3e89cf5931af376ebeadbfab855b3fa239b7ada8f5a92fbea6b387" }, subdir = "target_chains/aptos/contracts", rev = "main" }
|
||||
|
||||
[addresses]
|
||||
pyth = "0x7e783b349d3e89cf5931af376ebeadbfab855b3fa239b7ada8f5a92fbea6b387"
|
||||
deployer = "0xb31e712b26fd295357355f6845e77c888298636609e93bc9b05f0f604049f434"
|
||||
wormhole = "0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625"
|
|
@ -0,0 +1,11 @@
|
|||
# Gas Profiling Utilities
|
||||
|
||||
You can compile and run a simple script in this package to profile gas consumption on a deployed pyth contract.
|
||||
Here are the steps:
|
||||
|
||||
1. Run `aptos move compile` to compile the script
|
||||
2. Run the following to simulate the transaction and create a gas profile:
|
||||
```
|
||||
aptos move run-script --compiled-script-path build/Profiler/bytecode_scripts/main.mv --args hex:<update_data_payload_in_hex> --profile-gas
|
||||
```
|
||||
3. Open the created svg files in the `gas-profiling` folder to inspect gas consumption by each module and function
|
|
@ -0,0 +1,9 @@
|
|||
script {
|
||||
use pyth::pyth;
|
||||
|
||||
|
||||
fun main(src: &signer, payload:vector<u8>) {
|
||||
let payload:vector<vector<u8>> = vector[payload];
|
||||
pyth::update_price_feeds_with_funder(src,payload);
|
||||
}
|
||||
}
|
|
@ -1,52 +1,17 @@
|
|||
// run this script with truffle exec
|
||||
|
||||
const jsonfile = require("jsonfile");
|
||||
const WormholeReceiver = artifacts.require("WormholeReceiver");
|
||||
const WormholeReceiverImplementationFullABI = jsonfile.readFileSync(
|
||||
"../build/contracts/ReceiverImplementation.json"
|
||||
).abi;
|
||||
|
||||
const GUARDIAN_SET_UPGRADE_1_VAA =
|
||||
"010000000001007ac31b282c2aeeeb37f3385ee0de5f8e421d30b9e5ae8ba3d4375c1c77a86e77159bb697d9c456d6f8c02d22a94b1279b65b0d6a9957e7d3857423845ac758e300610ac1d2000000030001000000000000000000000000000000000000000000000000000000000000000400000000000005390000000000000000000000000000000000000000000000000000000000436f7265020000000000011358cc3ae5c097b213ce3c81979e1b9f9570746aa5ff6cb952589bde862c25ef4392132fb9d4a42157114de8460193bdf3a2fcf81f86a09765f4762fd1107a0086b32d7a0977926a205131d8731d39cbeb8c82b2fd82faed2711d59af0f2499d16e726f6b211b39756c042441be6d8650b69b54ebe715e234354ce5b4d348fb74b958e8966e2ec3dbd4958a7cdeb5f7389fa26941519f0863349c223b73a6ddee774a3bf913953d695260d88bc1aa25a4eee363ef0000ac0076727b35fbea2dac28fee5ccb0fea768eaf45ced136b9d9e24903464ae889f5c8a723fc14f93124b7c738843cbb89e864c862c38cddcccf95d2cc37a4dc036a8d232b48f62cdd4731412f4890da798f6896a3331f64b48c12d1d57fd9cbe7081171aa1be1d36cafe3867910f99c09e347899c19c38192b6e7387ccd768277c17dab1b7a5027c0b3cf178e21ad2e77ae06711549cfbb1f9c7a9d8096e85e1487f35515d02a92753504a8d75471b9f49edb6fbebc898f403e4773e95feb15e80c9a99c8348d";
|
||||
const GUARDIAN_SET_UPGRADE_2_VAA =
|
||||
"01000000010d0012e6b39c6da90c5dfd3c228edbb78c7a4c97c488ff8a346d161a91db067e51d638c17216f368aa9bdf4836b8645a98018ca67d2fec87d769cabfdf2406bf790a0002ef42b288091a670ef3556596f4f47323717882881eaf38e03345078d07a156f312b785b64dae6e9a87e3d32872f59cb1931f728cecf511762981baf48303668f0103cef2616b84c4e511ff03329e0853f1bd7ee9ac5ba71d70a4d76108bddf94f69c2a8a84e4ee94065e8003c334e899184943634e12043d0dda78d93996da073d190104e76d166b9dac98f602107cc4b44ac82868faf00b63df7d24f177aa391e050902413b71046434e67c770b19aecdf7fce1d1435ea0be7262e3e4c18f50ddc8175c0105d9450e8216d741e0206a50f93b750a47e0a258b80eb8fed1314cc300b3d905092de25cd36d366097b7103ae2d184121329ba3aa2d7c6cc53273f11af14798110010687477c8deec89d36a23e7948feb074df95362fc8dcbd8ae910ac556a1dee1e755c56b9db5d710c940938ed79bc1895a3646523a58bc55f475a23435a373ecfdd0107fb06734864f79def4e192497362513171530daea81f07fbb9f698afe7e66c6d44db21323144f2657d4a5386a954bb94eef9f64148c33aef6e477eafa2c5c984c01088769e82216310d1827d9bd48645ec23e90de4ef8a8de99e2d351d1df318608566248d80cdc83bdcac382b3c30c670352be87f9069aab5037d0b747208eae9c650109e9796497ff9106d0d1c62e184d83716282870cef61a1ee13d6fc485b521adcce255c96f7d1bca8d8e7e7d454b65783a830bddc9d94092091a268d311ecd84c26010c468c9fb6d41026841ff9f8d7368fa309d4dbea3ea4bbd2feccf94a92cc8a20a226338a8e2126cd16f70eaf15b4fc9be2c3fa19def14e071956a605e9d1ac4162010e23fcb6bd445b7c25afb722250c1acbc061ed964ba9de1326609ae012acdfb96942b2a102a2de99ab96327859a34a2b49a767dbdb62e0a1fb26af60fe44fd496a00106bb0bac77ac68b347645f2fb1ad789ea9bd76fb9b2324f25ae06f97e65246f142df717f662e73948317182c62ce87d79c73def0dba12e5242dfc038382812cfe00126da03c5e56cb15aeeceadc1e17a45753ab4dc0ec7bf6a75ca03143ed4a294f6f61bc3f478a457833e43084ecd7c985bf2f55a55f168aac0e030fc49e845e497101626e9d9a5d9e343f00010000000000000000000000000000000000000000000000000000000000000004c1759167c43f501c2000000000000000000000000000000000000000000000000000000000436f7265020000000000021358cc3ae5c097b213ce3c81979e1b9f9570746aa5ff6cb952589bde862c25ef4392132fb9d4a42157114de8460193bdf3a2fcf81f86a09765f4762fd1107a0086b32d7a0977926a205131d8731d39cbeb8c82b2fd82faed2711d59af0f2499d16e726f6b211b39756c042441be6d8650b69b54ebe715e234354ce5b4d348fb74b958e8966e2ec3dbd4958a7cd66b9590e1c41e0b226937bf9217d1d67fd4e91f574a3bf913953d695260d88bc1aa25a4eee363ef0000ac0076727b35fbea2dac28fee5ccb0fea768eaf45ced136b9d9e24903464ae889f5c8a723fc14f93124b7c738843cbb89e864c862c38cddcccf95d2cc37a4dc036a8d232b48f62cdd4731412f4890da798f6896a3331f64b48c12d1d57fd9cbe7081171aa1be1d36cafe3867910f99c09e347899c19c38192b6e7387ccd768277c17dab1b7a5027c0b3cf178e21ad2e77ae06711549cfbb1f9c7a9d8096e85e1487f35515d02a92753504a8d75471b9f49edb6fbebc898f403e4773e95feb15e80c9a99c8348d";
|
||||
const GUARDIAN_SET_UPGRADE_3_VAA =
|
||||
"01000000020d00ce45474d9e1b1e7790a2d210871e195db53a70ffd6f237cfe70e2686a32859ac43c84a332267a8ef66f59719cf91cc8df0101fd7c36aa1878d5139241660edc0010375cc906156ae530786661c0cd9aef444747bc3d8d5aa84cac6a6d2933d4e1a031cffa30383d4af8131e929d9f203f460b07309a647d6cd32ab1cc7724089392c000452305156cfc90343128f97e499311b5cae174f488ff22fbc09591991a0a73d8e6af3afb8a5968441d3ab8437836407481739e9850ad5c95e6acfcc871e951bc30105a7956eefc23e7c945a1966d5ddbe9e4be376c2f54e45e3d5da88c2f8692510c7429b1ea860ae94d929bd97e84923a18187e777aa3db419813a80deb84cc8d22b00061b2a4f3d2666608e0aa96737689e3ba5793810ff3a52ff28ad57d8efb20967735dc5537a2e43ef10f583d144c12a1606542c207f5b79af08c38656d3ac40713301086b62c8e130af3411b3c0d91b5b50dcb01ed5f293963f901fc36e7b0e50114dce203373b32eb45971cef8288e5d928d0ed51cd86e2a3006b0af6a65c396c009080009e93ab4d2c8228901a5f4525934000b2c26d1dc679a05e47fdf0ff3231d98fbc207103159ff4116df2832eea69b38275283434e6cd4a4af04d25fa7a82990b707010aa643f4cf615dfff06ffd65830f7f6cf6512dabc3690d5d9e210fdc712842dc2708b8b2c22e224c99280cd25e5e8bfb40e3d1c55b8c41774e287c1e2c352aecfc010b89c1e85faa20a30601964ccc6a79c0ae53cfd26fb10863db37783428cd91390a163346558239db3cd9d420cfe423a0df84c84399790e2e308011b4b63e6b8015010ca31dcb564ac81a053a268d8090e72097f94f366711d0c5d13815af1ec7d47e662e2d1bde22678113d15963da100b668ba26c0c325970d07114b83c5698f46097010dc9fda39c0d592d9ed92cd22b5425cc6b37430e236f02d0d1f8a2ef45a00bde26223c0a6eb363c8b25fd3bf57234a1d9364976cefb8360e755a267cbbb674b39501108db01e444ab1003dd8b6c96f8eb77958b40ba7a85fefecf32ad00b7a47c0ae7524216262495977e09c0989dd50f280c21453d3756843608eacd17f4fdfe47600001261025228ef5af837cb060bcd986fcfa84ccef75b3fa100468cfd24e7fadf99163938f3b841a33496c2706d0208faab088bd155b2e20fd74c625bb1cc8c43677a0163c53c409e0c5dfa000100000000000000000000000000000000000000000000000000000000000000046c5a054d7833d1e42000000000000000000000000000000000000000000000000000000000436f7265020000000000031358cc3ae5c097b213ce3c81979e1b9f9570746aa5ff6cb952589bde862c25ef4392132fb9d4a42157114de8460193bdf3a2fcf81f86a09765f4762fd1107a0086b32d7a0977926a205131d8731d39cbeb8c82b2fd82faed2711d59af0f2499d16e726f6b211b39756c042441be6d8650b69b54ebe715e234354ce5b4d348fb74b958e8966e2ec3dbd4958a7cd15e7caf07c4e3dc8e7c469f92c8cd88fb8005a2074a3bf913953d695260d88bc1aa25a4eee363ef0000ac0076727b35fbea2dac28fee5ccb0fea768eaf45ced136b9d9e24903464ae889f5c8a723fc14f93124b7c738843cbb89e864c862c38cddcccf95d2cc37a4dc036a8d232b48f62cdd4731412f4890da798f6896a3331f64b48c12d1d57fd9cbe7081171aa1be1d36cafe3867910f99c09e347899c19c38192b6e7387ccd768277c17dab1b7a5027c0b3cf178e21ad2e77ae06711549cfbb1f9c7a9d8096e85e1487f35515d02a92753504a8d75471b9f49edb6fbebc898f403e4773e95feb15e80c9a99c8348d";
|
||||
|
||||
const { WormholeEvmContract, DefaultStore } = require("contract_manager");
|
||||
const { Wallet } = require("ethers");
|
||||
module.exports = async function (callback) {
|
||||
try {
|
||||
const accounts = await web3.eth.getAccounts();
|
||||
const initialized = new web3.eth.Contract(
|
||||
WormholeReceiverImplementationFullABI,
|
||||
const contract = new WormholeEvmContract(
|
||||
DefaultStore.chains[process.env.MIGRATIONS_NETWORK],
|
||||
WormholeReceiver.address
|
||||
);
|
||||
// Upgrade set 0 to set 1
|
||||
console.log("Upgrading to guardian set 1.");
|
||||
await initialized.methods
|
||||
.submitNewGuardianSet("0x" + GUARDIAN_SET_UPGRADE_1_VAA)
|
||||
.send({
|
||||
value: 0,
|
||||
from: accounts[0],
|
||||
gasLimit: 2000000,
|
||||
});
|
||||
// Upgrade set 1 to set 2
|
||||
console.log("Upgrading to guardian set 2.");
|
||||
await initialized.methods
|
||||
.submitNewGuardianSet("0x" + GUARDIAN_SET_UPGRADE_2_VAA)
|
||||
.send({
|
||||
value: 0,
|
||||
from: accounts[0],
|
||||
gasLimit: 2000000,
|
||||
});
|
||||
// Upgrade set 2 to set 3
|
||||
console.log("Upgrading to guardian set 3.");
|
||||
await initialized.methods
|
||||
.submitNewGuardianSet("0x" + GUARDIAN_SET_UPGRADE_3_VAA)
|
||||
.send({
|
||||
value: 0,
|
||||
from: accounts[0],
|
||||
gasLimit: 2000000,
|
||||
});
|
||||
const wallet = Wallet.fromMnemonic(process.env.MNEMONIC);
|
||||
const privateKey = wallet.privateKey.replace("0x", "");
|
||||
await contract.syncMainnetGuardianSets(privateKey);
|
||||
console.log("Updated the guardian set successfully.");
|
||||
callback();
|
||||
} catch (e) {
|
||||
|
|
|
@ -5,3 +5,14 @@ Contracts are compiled with sui cli version `sui 1.0.0-09b208149` that can be in
|
|||
```commandline
|
||||
cargo install --locked --git https://github.com/MystenLabs/sui.git --rev 09b2081498366df936abae26eea4b2d5cafb2788 sui sui-faucet
|
||||
```
|
||||
|
||||
## Gas Profiling
|
||||
|
||||
Using the [`sui-tool` binary](https://github.com/MystenLabs/sui/pull/12680), you can profile gas usage of transactions by running:
|
||||
|
||||
```bash
|
||||
env MOVE_VM_PROFILE=1 ./sui-tool replay --rpc https://fullnode.mainnet.sui.io:443 tx -t <tx-signature>
|
||||
```
|
||||
|
||||
`sui-tool` gas profiling works only when built with debug profile and should be compiled by your own (you can't use the precompiled binary).
|
||||
We suggest benchmarking on mainnet or where the number of wormhole signature checks is the same as on mainnet.
|
||||
|
|
Loading…
Reference in New Issue