1
0

Asset contract is now upgradable

This commit is contained in:
Jon Michael Aanes 2025-04-09 22:09:15 +02:00
parent 2513fa2e17
commit ec64c2e0e1
4 changed files with 33 additions and 10 deletions

View File

@ -1,6 +1,5 @@
import flask import flask
import pbc_client import pbc_client
import pbcabi
import base64 import base64
import dataclasses import dataclasses
import requests_cache import requests_cache

View File

@ -4,21 +4,20 @@
#[macro_use] #[macro_use]
extern crate pbc_contract_codegen; extern crate pbc_contract_codegen;
use pbc_contract_common::address::Address;
use pbc_contract_common::context::ContractContext; use pbc_contract_common::context::ContractContext;
use pbc_contract_common::events::EventGroup; use pbc_contract_common::events::EventGroup;
use pbc_contract_common::zk::{SecretVarId, ZkInputDef, ZkState, ZkStateChange}; 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_rpc_derive::ReadWriteRPC;
use read_write_state_derive::ReadWriteState; use read_write_state_derive::ReadWriteState;
use pbc_contract_common::avl_tree_map::AvlTreeMap; use pbc_contract_common::avl_tree_map::AvlTreeMap;
use pbc_traits::{ReadRPC, WriteRPC, ReadWriteState};
use create_type_spec_derive::CreateTypeSpec; use create_type_spec_derive::CreateTypeSpec;
use std::fmt::Debug; use std::fmt::Debug;
use notamon_common::{AssetId, Permission, Permissions}; use notamon_common::{AssetId, Permission, Permissions};
mod zk_compute; mod zk_compute;
mod upgrade;
/// Metadata for secret-shared assets. /// Metadata for secret-shared assets.
#[derive(ReadWriteState, ReadWriteRPC, Debug)] #[derive(ReadWriteState, ReadWriteRPC, Debug)]
@ -70,7 +69,7 @@ pub fn set_asset(
) -> ( ) -> (
AssetContractState, AssetContractState,
Vec<EventGroup>, Vec<EventGroup>,
ZkInputDef<AssetMetadata, Vec<Sbi8>>, ZkInputDef<AssetMetadata, Vec<Sbu8>>,
) { ) {
state.permissions.assert_has_permission(&context.sender, Role::UPLOADER {}); 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); let input_def = ZkInputDef::with_metadata_and_size(Some(SHORTNAME_SET_ASSET_INPUTTED), AssetMetadata { asset_id }, asset_length * 8);

View 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
}

View File

@ -34,7 +34,7 @@ pub struct Permissions<KeyT: ReadWriteState> {
permissions: AvlTreeMap<KeyT, Permission>, permissions: AvlTreeMap<KeyT, Permission>,
} }
impl <KeyT: ReadWriteState> Permissions<KeyT> { impl <KeyT: ReadWriteState + Copy> Permissions<KeyT> {
pub fn new () -> Self { pub fn new () -> Self {
Self { permissions: AvlTreeMap::new() } Self { permissions: AvlTreeMap::new() }
@ -44,15 +44,19 @@ impl <KeyT: ReadWriteState> Permissions<KeyT> {
self.permissions.insert(permission_key, permission); self.permissions.insert(permission_key, permission);
} }
pub fn get_permission(&self, permission: &KeyT) -> Permission { pub fn get_permission(&self, permission: KeyT) -> Permission {
self.permissions.get(permission).unwrap_or(Permission::NONE) 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) { 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:?}"); panic!("User {address} does not have permission: {permission:?}");
} }
} }