@layerzerolabs/protocol-stellar-v2 0.2.19 → 0.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +245 -222
- package/.turbo/turbo-lint.log +77 -70
- package/.turbo/turbo-test.log +1385 -1221
- package/Cargo.lock +13 -3
- package/Cargo.toml +2 -0
- package/contracts/ERROR_SPEC.md +8 -1
- package/contracts/common-macros/src/contract_ttl.rs +18 -7
- package/contracts/common-macros/src/lib.rs +4 -4
- package/contracts/common-macros/src/tests/contract_ttl.rs +1 -1
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +2 -1
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +7 -12
- package/contracts/common-macros/src/upgradeable.rs +15 -21
- package/contracts/message-libs/uln-302/src/events.rs +4 -0
- package/contracts/message-libs/uln-302/src/send_uln.rs +22 -6
- package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +38 -64
- package/contracts/oapps/counter/Cargo.toml +1 -0
- package/contracts/oapps/counter/integration_tests/setup_uln.rs +1 -1
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +113 -65
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +111 -82
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +293 -65
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +331 -56
- package/contracts/oapps/oft/src/extensions/oft_fee.rs +18 -2
- package/contracts/oapps/oft/src/extensions/pausable.rs +19 -4
- package/contracts/oapps/oft/src/extensions/rate_limiter.rs +52 -28
- package/contracts/oapps/oft/src/oft.rs +29 -41
- package/contracts/oapps/oft/src/oft_types/mint_burn.rs +3 -25
- package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -2
- package/contracts/oapps/oft-core/src/oft_core.rs +247 -207
- package/contracts/oapps/oft-core/src/tests/test_utils.rs +4 -4
- package/contracts/upgrader/src/lib.rs +30 -57
- package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
- package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
- package/contracts/upgrader/src/tests/test_upgrader.rs +44 -35
- package/contracts/utils/src/buffer_reader.rs +1 -0
- package/contracts/utils/src/errors.rs +3 -1
- package/contracts/utils/src/tests/upgradeable.rs +372 -175
- package/contracts/utils/src/ttl_configurable.rs +3 -3
- package/contracts/utils/src/upgradeable.rs +48 -23
- package/contracts/workers/dvn/Cargo.toml +1 -0
- package/contracts/workers/dvn/src/auth.rs +12 -42
- package/contracts/workers/dvn/src/dvn.rs +16 -31
- package/contracts/workers/dvn/src/errors.rs +0 -1
- package/contracts/workers/dvn/src/interfaces/dvn.rs +35 -0
- package/contracts/workers/dvn/src/lib.rs +4 -3
- package/contracts/workers/dvn/src/tests/auth.rs +1 -1
- package/contracts/workers/dvn/src/tests/dvn.rs +19 -15
- package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -4
- package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +1 -3
- package/contracts/workers/dvn/src/tests/setup.rs +5 -9
- package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -1
- package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +3 -5
- package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +2 -3
- package/contracts/workers/executor/Cargo.toml +1 -0
- package/contracts/workers/executor/src/executor.rs +15 -26
- package/contracts/workers/executor-fee-lib/Cargo.toml +2 -1
- package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +63 -5
- package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
- package/contracts/workers/executor-fee-lib/src/lib.rs +3 -0
- package/contracts/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +701 -0
- package/contracts/workers/executor-fee-lib/src/tests/executor_option.rs +370 -0
- package/contracts/workers/executor-fee-lib/src/tests/mod.rs +4 -0
- package/contracts/workers/executor-fee-lib/src/tests/setup.rs +60 -0
- package/contracts/workers/executor-helper/src/lib.rs +3 -0
- package/contracts/workers/executor-helper/src/tests/executor_helper.rs +184 -0
- package/contracts/workers/executor-helper/src/tests/mod.rs +2 -0
- package/contracts/workers/executor-helper/src/tests/setup.rs +366 -0
- package/contracts/workers/fee-lib-interfaces/Cargo.toml +14 -0
- package/contracts/workers/{worker/src/interfaces/mod.rs → fee-lib-interfaces/src/lib.rs} +4 -3
- package/contracts/workers/price-feed/Cargo.toml +2 -1
- package/contracts/workers/price-feed/src/events.rs +1 -1
- package/contracts/workers/price-feed/src/lib.rs +3 -0
- package/contracts/workers/price-feed/src/price_feed.rs +6 -12
- package/contracts/workers/price-feed/src/storage.rs +1 -1
- package/contracts/workers/price-feed/src/tests/mod.rs +2 -0
- package/contracts/workers/price-feed/src/tests/price_feed.rs +869 -0
- package/contracts/workers/price-feed/src/tests/setup.rs +70 -0
- package/contracts/workers/price-feed/src/types.rs +1 -1
- package/contracts/workers/worker/src/errors.rs +0 -3
- package/contracts/workers/worker/src/lib.rs +0 -2
- package/contracts/workers/worker/src/storage.rs +32 -29
- package/contracts/workers/worker/src/tests/setup.rs +1 -7
- package/contracts/workers/worker/src/tests/worker.rs +50 -42
- package/contracts/workers/worker/src/worker.rs +49 -58
- package/package.json +3 -3
- package/sdk/.turbo/turbo-test.log +220 -218
- package/sdk/dist/generated/bml.d.ts +12 -4
- package/sdk/dist/generated/bml.js +8 -6
- package/sdk/dist/generated/counter.d.ts +12 -4
- package/sdk/dist/generated/counter.js +8 -6
- package/sdk/dist/generated/dvn.d.ts +404 -365
- package/sdk/dist/generated/dvn.js +55 -53
- package/sdk/dist/generated/dvn_fee_lib.d.ts +224 -268
- package/sdk/dist/generated/dvn_fee_lib.js +22 -53
- package/sdk/dist/generated/endpoint.d.ts +12 -4
- package/sdk/dist/generated/endpoint.js +8 -6
- package/sdk/dist/generated/executor.d.ts +370 -326
- package/sdk/dist/generated/executor.js +47 -44
- package/sdk/dist/generated/executor_fee_lib.d.ts +258 -302
- package/sdk/dist/generated/executor_fee_lib.js +21 -52
- package/sdk/dist/generated/executor_helper.d.ts +26 -190
- package/sdk/dist/generated/executor_helper.js +22 -27
- package/sdk/dist/generated/layerzero_view.d.ts +1271 -0
- package/sdk/dist/generated/layerzero_view.js +294 -0
- package/sdk/dist/generated/oft.d.ts +49 -40
- package/sdk/dist/generated/oft.js +25 -23
- package/sdk/dist/generated/price_feed.d.ts +225 -269
- package/sdk/dist/generated/price_feed.js +22 -53
- package/sdk/dist/generated/sml.d.ts +12 -4
- package/sdk/dist/generated/sml.js +8 -6
- package/sdk/dist/generated/treasury.d.ts +12 -4
- package/sdk/dist/generated/treasury.js +8 -6
- package/sdk/dist/generated/uln302.d.ts +12 -4
- package/sdk/dist/generated/uln302.js +10 -8
- package/sdk/dist/generated/upgrader.d.ts +189 -18
- package/sdk/dist/generated/upgrader.js +84 -4
- package/sdk/dist/index.d.ts +1 -0
- package/sdk/dist/index.js +2 -0
- package/sdk/package.json +1 -1
- package/sdk/src/index.ts +3 -0
- package/sdk/test/oft-sml.test.ts +4 -4
- package/sdk/test/upgrader.test.ts +2 -3
- package/tools/ts-bindings-gen/src/main.rs +2 -1
- /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/dvn_fee_lib.rs +0 -0
- /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/executor_fee_lib.rs +0 -0
- /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/price_feed.rs +0 -0
|
@@ -2,45 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
//! # Upgrader Contract
|
|
4
4
|
//!
|
|
5
|
-
//! A stateless utility contract for performing upgrade and migrate operations
|
|
6
|
-
//!
|
|
7
|
-
//! This contract provides a convenient way to upgrade other contracts, especially useful for
|
|
8
|
-
//! performing upgrade+migrate atomically in a single transaction.
|
|
5
|
+
//! A stateless utility contract for performing atomic upgrade and migrate operations
|
|
6
|
+
//! on contracts implementing the [`Upgradeable`](utils::upgradeable::Upgradeable) trait.
|
|
9
7
|
//!
|
|
10
8
|
//! ## Security Model
|
|
11
9
|
//!
|
|
12
|
-
//! The Upgrader is
|
|
13
|
-
//!
|
|
14
|
-
//!
|
|
10
|
+
//! The Upgrader is permissionless - anyone can call it, but security is enforced by the
|
|
11
|
+
//! target contract's authorization checks. The target contract's `#[only_auth]` guard
|
|
12
|
+
//! ensures only its authorizer can successfully upgrade it.
|
|
15
13
|
//!
|
|
16
14
|
//! ## Usage
|
|
17
15
|
//!
|
|
18
|
-
//! Deploy this contract once, then anyone can use it to upgrade contracts they own.
|
|
19
|
-
//!
|
|
20
16
|
//! ```ignore
|
|
21
|
-
//! // Deploy upgrader (no initialization needed)
|
|
22
|
-
//! let upgrader_id = env.register(Upgrader, ());
|
|
23
17
|
//! let upgrader = UpgraderClient::new(&env, &upgrader_id);
|
|
24
|
-
//!
|
|
25
|
-
//!
|
|
26
|
-
//! upgrader.upgrade(&target_contract, &new_wasm_hash);
|
|
27
|
-
//!
|
|
28
|
-
//! // Or upgrade and migrate in one transaction
|
|
29
|
-
//! let migration_data = vec![&env, val1, val2];
|
|
30
|
-
//! upgrader.upgrade_and_migrate(&target_contract, &new_wasm_hash, migration_data);
|
|
18
|
+
//! let migration_data = my_data.to_xdr(&env);
|
|
19
|
+
//! upgrader.upgrade_and_migrate(&target_contract, &new_wasm_hash, &migration_data);
|
|
31
20
|
//! ```
|
|
32
21
|
|
|
33
|
-
use soroban_sdk::{contract,
|
|
34
|
-
|
|
35
|
-
/// Symbol for the migrate function call
|
|
36
|
-
pub const MIGRATE: Symbol = symbol_short!("migrate");
|
|
37
|
-
|
|
38
|
-
/// Trait representing an upgradeable contract's interface
|
|
39
|
-
#[contractclient(name = "UpgradeableContractClient")]
|
|
40
|
-
pub trait UpgradeableContract {
|
|
41
|
-
/// Upgrades the contract to new WASM bytecode
|
|
42
|
-
fn upgrade(env: &Env, new_wasm_hash: BytesN<32>);
|
|
43
|
-
}
|
|
22
|
+
use soroban_sdk::{contract, contractimpl, xdr::ToXdr, Address, Bytes, BytesN, Env};
|
|
23
|
+
use utils::upgradeable::UpgradeableClient;
|
|
44
24
|
|
|
45
25
|
/// Upgrader contract for managing upgrades of other contracts.
|
|
46
26
|
///
|
|
@@ -51,46 +31,39 @@ pub struct Upgrader;
|
|
|
51
31
|
|
|
52
32
|
#[contractimpl]
|
|
53
33
|
impl Upgrader {
|
|
54
|
-
///
|
|
34
|
+
/// Upgrades a target contract without custom migration data.
|
|
35
|
+
///
|
|
36
|
+
/// This is a convenience wrapper that calls `upgrade_and_migrate` with empty migration data.
|
|
37
|
+
///
|
|
38
|
+
/// # Arguments
|
|
39
|
+
/// * `contract_address` - The address of the contract to upgrade
|
|
40
|
+
/// * `wasm_hash` - The hash of the new WASM bytecode
|
|
41
|
+
pub fn upgrade(env: &Env, contract_address: &Address, wasm_hash: &BytesN<32>) {
|
|
42
|
+
Self::upgrade_and_migrate(env, contract_address, wasm_hash, &().to_xdr(env));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/// Upgrades a target contract and runs its migration in a single transaction.
|
|
55
46
|
///
|
|
56
47
|
/// The caller must be authorized as the authorizer of the target contract.
|
|
57
48
|
/// This is enforced by the target contract's `#[only_auth]` check.
|
|
58
49
|
///
|
|
59
|
-
/// This is useful for atomic upgrades where you want to ensure the migration
|
|
60
|
-
/// happens immediately after the upgrade, or the entire operation fails.
|
|
61
|
-
///
|
|
62
50
|
/// # Arguments
|
|
63
51
|
/// * `contract_address` - The address of the contract to upgrade
|
|
64
52
|
/// * `wasm_hash` - The hash of the new WASM bytecode
|
|
65
|
-
/// * `migration_data` -
|
|
66
|
-
///
|
|
53
|
+
/// * `migration_data` - XDR-encoded bytes to pass to the migrate function.
|
|
54
|
+
/// Use `value.to_xdr(&env)` to encode the target contract's MigrationData type.
|
|
67
55
|
///
|
|
68
56
|
/// # Example
|
|
69
57
|
/// ```ignore
|
|
70
|
-
///
|
|
71
|
-
///
|
|
72
|
-
/// &env,
|
|
73
|
-
/// 42u32.into_val(&env),
|
|
74
|
-
/// true.into_val(&env),
|
|
75
|
-
/// ];
|
|
76
|
-
/// upgrader.upgrade_and_migrate(&contract_addr, &wasm_hash, migration_data);
|
|
58
|
+
/// let migration_data = my_data.to_xdr(&env);
|
|
59
|
+
/// upgrader.upgrade_and_migrate(&contract_addr, &wasm_hash, &migration_data);
|
|
77
60
|
/// ```
|
|
78
|
-
pub fn upgrade_and_migrate(
|
|
79
|
-
env
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
migration_data: Vec<soroban_sdk::Val>,
|
|
83
|
-
) {
|
|
84
|
-
let contract_client = UpgradeableContractClient::new(env, contract_address);
|
|
85
|
-
|
|
86
|
-
// First upgrade the contract
|
|
87
|
-
contract_client.upgrade(&wasm_hash);
|
|
88
|
-
|
|
89
|
-
// Then call migrate with the provided data
|
|
90
|
-
// We use invoke_contract because the migration data type is unknown to this contract
|
|
91
|
-
env.invoke_contract::<()>(contract_address, &MIGRATE, migration_data);
|
|
61
|
+
pub fn upgrade_and_migrate(env: &Env, contract_address: &Address, wasm_hash: &BytesN<32>, migration_data: &Bytes) {
|
|
62
|
+
let client = UpgradeableClient::new(env, contract_address);
|
|
63
|
+
client.upgrade(wasm_hash);
|
|
64
|
+
client.migrate(migration_data);
|
|
92
65
|
}
|
|
93
66
|
}
|
|
94
67
|
|
|
95
68
|
#[cfg(test)]
|
|
96
|
-
mod tests;
|
|
69
|
+
mod tests;
|
|
Binary file
|
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
extern crate std;
|
|
2
2
|
|
|
3
|
-
use soroban_sdk::{contractclient, testutils::Address as _, Address, BytesN, Env
|
|
3
|
+
use soroban_sdk::{contractclient, testutils::Address as _, xdr::ToXdr, Address, BytesN, Env};
|
|
4
4
|
|
|
5
5
|
use crate::{Upgrader, UpgraderClient};
|
|
6
6
|
|
|
@@ -17,16 +17,20 @@ trait TestUpgradeableContract2 {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
mod contract_v1 {
|
|
20
|
-
|
|
21
|
-
// #[upgradeable]
|
|
22
|
-
// #[ownable]
|
|
23
|
-
// pub struct TestUpgradeableContract;
|
|
20
|
+
//#![no_std]
|
|
24
21
|
|
|
25
|
-
//
|
|
26
|
-
//
|
|
22
|
+
// use soroban_sdk::{contractimpl, Env, Symbol, Address, contractclient};
|
|
23
|
+
// use utils::{ upgradeable::UpgradeableInternal};
|
|
24
|
+
// use common_macros::lz_contract;
|
|
27
25
|
|
|
28
|
-
//
|
|
29
|
-
//
|
|
26
|
+
// #[lz_contract(upgradeable)]
|
|
27
|
+
// pub struct DummyContract;
|
|
28
|
+
|
|
29
|
+
// impl UpgradeableInternal for DummyContract {
|
|
30
|
+
// type MigrationData = u32;
|
|
31
|
+
|
|
32
|
+
// fn __migrate(env: &Env, migration_data: &Self::MigrationData) {
|
|
33
|
+
// env.storage().instance().set(&Symbol::new(env, "counter2"), migration_data);
|
|
30
34
|
// }
|
|
31
35
|
// }
|
|
32
36
|
|
|
@@ -35,34 +39,37 @@ mod contract_v1 {
|
|
|
35
39
|
// fn counter(env: &Env) -> u32;
|
|
36
40
|
// }
|
|
37
41
|
|
|
38
|
-
// #[
|
|
39
|
-
// impl TestUpgradeable for
|
|
42
|
+
// #[contractimpl]
|
|
43
|
+
// impl TestUpgradeable for DummyContract {
|
|
40
44
|
// fn counter(env: &Env) -> u32 {
|
|
41
45
|
// env.storage().instance().get(&Symbol::new(env, "counter")).unwrap_or(0)
|
|
42
46
|
// }
|
|
43
47
|
// }
|
|
44
48
|
|
|
45
|
-
// #[
|
|
46
|
-
// impl
|
|
49
|
+
// #[contractimpl]
|
|
50
|
+
// impl DummyContract {
|
|
47
51
|
// pub fn __constructor(env: &Env, owner: &Address) {
|
|
48
52
|
// Self::init_owner(env, owner);
|
|
49
53
|
// env.storage().instance().set(&Symbol::new(env, "counter"), &1_u32);
|
|
50
54
|
// }
|
|
51
55
|
// }
|
|
52
|
-
use super::MigrationData;
|
|
53
56
|
soroban_sdk::contractimport!(file = "./src/tests/test_data/test_upgradeable_contract1.wasm");
|
|
54
57
|
}
|
|
55
58
|
mod contract_v2 {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
//
|
|
59
|
-
//
|
|
59
|
+
//#![no_std]
|
|
60
|
+
|
|
61
|
+
// use soroban_sdk::{contractimpl, Env, Symbol, Address, contractclient};
|
|
62
|
+
// use utils::{ upgradeable::UpgradeableInternal};
|
|
63
|
+
// use common_macros::lz_contract;
|
|
64
|
+
|
|
65
|
+
// #[lz_contract(upgradeable)]
|
|
66
|
+
// pub struct DummyContract;
|
|
60
67
|
|
|
61
|
-
// impl UpgradeableInternal for
|
|
62
|
-
// type MigrationData =
|
|
68
|
+
// impl UpgradeableInternal for DummyContract {
|
|
69
|
+
// type MigrationData = u32;
|
|
63
70
|
|
|
64
|
-
// fn
|
|
65
|
-
// env.storage().instance().set(&Symbol::new(env, "counter2"),
|
|
71
|
+
// fn __migrate(env: &Env, migration_data: &Self::MigrationData) {
|
|
72
|
+
// env.storage().instance().set(&Symbol::new(env, "counter2"), migration_data);
|
|
66
73
|
// }
|
|
67
74
|
// }
|
|
68
75
|
|
|
@@ -72,8 +79,8 @@ mod contract_v2 {
|
|
|
72
79
|
// fn counter2(env: &Env) -> u32;
|
|
73
80
|
// }
|
|
74
81
|
|
|
75
|
-
// #[
|
|
76
|
-
// impl TestUpgradeable for
|
|
82
|
+
// #[contractimpl]
|
|
83
|
+
// impl TestUpgradeable for DummyContract {
|
|
77
84
|
// fn counter(env: &Env) -> u32 {
|
|
78
85
|
// env.storage().instance().get(&Symbol::new(env, "counter")).unwrap_or(0)
|
|
79
86
|
// }
|
|
@@ -82,7 +89,14 @@ mod contract_v2 {
|
|
|
82
89
|
// env.storage().instance().get(&Symbol::new(env, "counter2")).unwrap_or(0)
|
|
83
90
|
// }
|
|
84
91
|
// }
|
|
85
|
-
|
|
92
|
+
|
|
93
|
+
// #[contractimpl]
|
|
94
|
+
// impl DummyContract {
|
|
95
|
+
// pub fn __constructor(env: &Env, owner: &Address) {
|
|
96
|
+
// Self::init_owner(env, owner);
|
|
97
|
+
// env.storage().instance().set(&Symbol::new(env, "counter"), &1_u32);
|
|
98
|
+
// }
|
|
99
|
+
// }
|
|
86
100
|
soroban_sdk::contractimport!(file = "./src/tests/test_data/test_upgradeable_contract2.wasm");
|
|
87
101
|
}
|
|
88
102
|
|
|
@@ -90,9 +104,6 @@ fn install_new_wasm(e: &Env) -> BytesN<32> {
|
|
|
90
104
|
e.deployer().upload_contract_wasm(contract_v2::WASM)
|
|
91
105
|
}
|
|
92
106
|
|
|
93
|
-
#[allow(dead_code)]
|
|
94
|
-
type MigrationData = ();
|
|
95
|
-
|
|
96
107
|
#[test]
|
|
97
108
|
fn test_upgrade_with_upgrader() {
|
|
98
109
|
let e = Env::default();
|
|
@@ -107,14 +118,12 @@ fn test_upgrade_with_upgrader() {
|
|
|
107
118
|
let upgrader_client = UpgraderClient::new(&e, &upgrader);
|
|
108
119
|
|
|
109
120
|
let new_wasm_hash = install_new_wasm(&e);
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
&soroban_sdk::vec![&e, ().try_into_val(&e).unwrap()],
|
|
115
|
-
);
|
|
121
|
+
let counter_value = 2_u32;
|
|
122
|
+
// Encode migration data as XDR bytes
|
|
123
|
+
let migration_data = counter_value.to_xdr(&e);
|
|
124
|
+
upgrader_client.upgrade_and_migrate(&contract_id, &new_wasm_hash, &migration_data);
|
|
116
125
|
|
|
117
126
|
let client_v2 = TestUpgradeableContractClient2::new(&e, &contract_id);
|
|
118
127
|
|
|
119
|
-
assert_eq!(client_v2.counter2(),
|
|
128
|
+
assert_eq!(client_v2.counter2(), counter_value);
|
|
120
129
|
}
|
|
@@ -44,7 +44,9 @@ pub enum BytesExtError {
|
|
|
44
44
|
/// UpgradeableError: 1050-1059
|
|
45
45
|
#[contract_error]
|
|
46
46
|
pub enum UpgradeableError {
|
|
47
|
-
|
|
47
|
+
InvalidMigrationData = 1050,
|
|
48
|
+
MigrationNotAllowed,
|
|
49
|
+
UpgradesFrozen,
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
/// MultisigError: 1060-1069
|