Asset contract is now upgradable
This commit is contained in:
parent
2513fa2e17
commit
ec64c2e0e1
|
@ -1,6 +1,5 @@
|
|||
import flask
|
||||
import pbc_client
|
||||
import pbcabi
|
||||
import base64
|
||||
import dataclasses
|
||||
import requests_cache
|
||||
|
|
|
@ -4,21 +4,20 @@
|
|||
#[macro_use]
|
||||
extern crate pbc_contract_codegen;
|
||||
|
||||
use pbc_contract_common::address::Address;
|
||||
use pbc_contract_common::context::ContractContext;
|
||||
use pbc_contract_common::events::EventGroup;
|
||||
use pbc_contract_common::zk::{SecretVarId, ZkInputDef, ZkState, ZkStateChange};
|
||||
use pbc_zk::Sbi8;
|
||||
use pbc_zk::Sbu8;
|
||||
use read_write_rpc_derive::ReadWriteRPC;
|
||||
use read_write_state_derive::ReadWriteState;
|
||||
use pbc_contract_common::avl_tree_map::AvlTreeMap;
|
||||
use pbc_traits::{ReadRPC, WriteRPC, ReadWriteState};
|
||||
use create_type_spec_derive::CreateTypeSpec;
|
||||
use std::fmt::Debug;
|
||||
|
||||
use notamon_common::{AssetId, Permission, Permissions};
|
||||
|
||||
mod zk_compute;
|
||||
mod upgrade;
|
||||
|
||||
/// Metadata for secret-shared assets.
|
||||
#[derive(ReadWriteState, ReadWriteRPC, Debug)]
|
||||
|
@ -70,7 +69,7 @@ pub fn set_asset(
|
|||
) -> (
|
||||
AssetContractState,
|
||||
Vec<EventGroup>,
|
||||
ZkInputDef<AssetMetadata, Vec<Sbi8>>,
|
||||
ZkInputDef<AssetMetadata, Vec<Sbu8>>,
|
||||
) {
|
||||
state.permissions.assert_has_permission(&context.sender, Role::UPLOADER {});
|
||||
let input_def = ZkInputDef::with_metadata_and_size(Some(SHORTNAME_SET_ASSET_INPUTTED), AssetMetadata { asset_id }, asset_length * 8);
|
||||
|
|
21
rust/notamon-asset-contract/src/upgrade.rs
Normal file
21
rust/notamon-asset-contract/src/upgrade.rs
Normal file
|
@ -0,0 +1,21 @@
|
|||
//! Upgrade logic for allowing upgrade.
|
||||
|
||||
use crate::{AssetContractState, Role};
|
||||
use pbc_contract_codegen::upgrade_is_allowed;
|
||||
use pbc_contract_common::context::ContractContext;
|
||||
use pbc_contract_common::upgrade::ContractHashes;
|
||||
|
||||
/// Checks whether the upgrade is allowed.
|
||||
///
|
||||
/// This contract allows the [`ContractState::upgrader`] to upgrade the contract at any time.
|
||||
#[upgrade_is_allowed]
|
||||
pub fn is_upgrade_allowed(
|
||||
context: ContractContext,
|
||||
state: AssetContractState,
|
||||
_old_contract_hashes: ContractHashes,
|
||||
_new_contract_hashes: ContractHashes,
|
||||
_new_contract_rpc: Vec<u8>,
|
||||
) -> bool {
|
||||
state.permissions.assert_has_permission(&context.sender, Role::ADMIN {});
|
||||
true
|
||||
}
|
|
@ -34,7 +34,7 @@ pub struct Permissions<KeyT: ReadWriteState> {
|
|||
permissions: AvlTreeMap<KeyT, Permission>,
|
||||
}
|
||||
|
||||
impl <KeyT: ReadWriteState> Permissions<KeyT> {
|
||||
impl <KeyT: ReadWriteState + Copy> Permissions<KeyT> {
|
||||
|
||||
pub fn new () -> Self {
|
||||
Self { permissions: AvlTreeMap::new() }
|
||||
|
@ -44,15 +44,19 @@ impl <KeyT: ReadWriteState> Permissions<KeyT> {
|
|||
self.permissions.insert(permission_key, permission);
|
||||
}
|
||||
|
||||
pub fn get_permission(&self, permission: &KeyT) -> Permission {
|
||||
self.permissions.get(permission).unwrap_or(Permission::NONE)
|
||||
pub fn get_permission(&self, permission: KeyT) -> Permission {
|
||||
self.permissions.get(&permission).unwrap_or(Permission::NONE)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
impl <KeyT: ReadWriteState + Debug> Permissions<KeyT> {
|
||||
impl <KeyT: ReadWriteState + Debug + Copy> Permissions<KeyT> {
|
||||
pub fn has_permission(&self, address: &Address, permission: KeyT) -> bool {
|
||||
self.get_permission(permission).allows(address)
|
||||
}
|
||||
|
||||
pub fn assert_has_permission(&self, address: &Address, permission: KeyT) {
|
||||
if !self.get_permission(&permission).allows(address) {
|
||||
if !self.has_permission(address, permission) {
|
||||
panic!("User {address} does not have permission: {permission:?}");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user