change uuid to vm_id and app_id

This commit is contained in:
ghe0 2025-07-12 23:27:34 +03:00
parent dc8d33d487
commit 4d0a219f07
Signed by: ghe0
GPG Key ID: 451028EE56A0FBB4
21 changed files with 117 additions and 994 deletions

2
Cargo.lock generated

@ -1011,7 +1011,7 @@ dependencies = [
[[package]]
name = "detee-shared"
version = "0.1.0"
source = "git+ssh://git@gitea.detee.cloud/testnet/proto?branch=main#4753a17fa29393b3f99b6dfcdcec48d935e6ebd9"
source = "git+ssh://git@gitea.detee.cloud/testnet/proto?branch=remove_uuid#6765cafd68664dcfa269dd776039532eb4253e8a"
dependencies = [
"bincode 2.0.1",
"prost",

@ -15,7 +15,7 @@ serde_yaml = "0.9.34"
surrealdb = "2.2.2"
tokio = { version = "1.44.2", features = ["macros", "rt-multi-thread"] }
tonic = { version = "0.12", features = ["tls"] }
detee-shared = { git = "ssh://git@gitea.detee.cloud/testnet/proto", branch = "main" }
detee-shared = { git = "ssh://git@gitea.detee.cloud/testnet/proto", branch = "remove_uuid" }
ed25519-dalek = "2.1.1"
bs58 = "0.5.1"
tokio-stream = "0.1.17"

@ -1,338 +0,0 @@
accounts:
fY3NNjvFTeR1FBh5nXV3ujX7zZqrm3eBUWGEiG75TK1:
balance: 1000000000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
FBMWVqME3t1i4R6zWyDQGUuiTeruZ1TxLhTmhaEcFypZ:
balance: 181560160000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
CLYyE6id5876DW69LHDynuH6TjJPvWRBTQC5XDZ6jfT1:
balance: 25000000000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
db5ZB6uDbF1mUUgeggBZ9XKbi3mUfX6WHkBpbwUHJpB:
balance: 25000000000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
49JBVzmgsQbUURHzAWax2gxo6jmukqbEQzP97YeeNQyu:
balance: 1076960680000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
HQyGWpiteHbxjszngZvmiX7ZFZAmF6nFjEraBa1M6bbM:
balance: 979410300000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
E3bgXsWvgichXeC6AqULJCZDp7FbEdTxBD67UaYVWf9y:
balance: 21121600000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL:
balance: 1156240000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
45Pyv9hRfub43NyRrYv95MhZs1Wrm8sj3RhBvA3F1Bvr:
balance: 933585660000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
H21Shi4iE7vgfjWEQNvzmpmBMJSaiZ17PYUcdNoAoKNc:
balance: 109066280000
tmp_locked: 453600000
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK:
balance: 2565079420000
tmp_locked: 547200000
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB:
balance: 7063640000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS:
balance: 13535509680000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
E27C967A84DEAA3339B4D57C1A7321E4906772244BBECCE25356D0EA6F851086:
balance: 100000000000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
DwfL5iFu32xh2YMCUxg63OeaThLRqehDAumiP9q6zuuX:
balance: 74660380000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
DXXkYSnhP3ijsHYxkedcuMomEyc122WaAbkDX7SaGuUS:
balance: 20293420000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
Bb5Xfkk4fc5i4GiTEgChwMb1ToWDQ5uzGtgD6yKTQYAy:
balance: 99979600000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
5hx2f3odEx6sXqCY6FEAv6bBm3BXdhJ97G6X7uScsLAj:
balance: 94473640000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
3BNggj8ZTsoSjfAGdPfmcU2Gobm2qcTEBg9iHXEUPe1t:
balance: 9978460000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
B981xPHmHthfKr15J9uJ64qd9zt2KsdiEuDRR7UUCGWi:
balance: 99980200000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
Cnkvn3WuHYfTzh1YK1TAv2VD25sNvstJNnQtxjcdQSL7:
balance: 11021340000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
operators:
x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK:
escrow: 5489633280000
email: gheo@detee.ltd
banned_users: []
vm_nodes:
- 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f
- 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9
app_nodes: []
BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS:
escrow: 5091906400000
email: first_on_detee@proton.me
banned_users: []
vm_nodes:
- DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
- 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
- Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
app_nodes: []
7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB:
escrow: 5500000000000
email: nmohammed@detee.ltd
banned_users: []
vm_nodes: []
app_nodes:
- BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg
vm_nodes:
- public_key: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
country: FR
region: Île-de-France
city: Paris
ip: 156.146.63.215
avail_mem_mb: 117000
avail_vcpus: 40
avail_storage_gbs: 410
avail_ipv4: 2
avail_ipv6: 0
avail_ports: 20000
max_ports_per_vm: 5
price: 20000
reports: {}
offline_minutes: 0
- public_key: 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
country: US
region: California
city: San Jose
ip: 149.36.48.99
avail_mem_mb: 121000
avail_vcpus: 42
avail_storage_gbs: 400
avail_ipv4: 23
avail_ipv6: 0
avail_ports: 20000
max_ports_per_vm: 5
price: 20000
reports: {}
offline_minutes: 0
- public_key: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
country: CA
region: British Columbia
city: Vancouver
ip: 149.22.95.1
avail_mem_mb: 106400
avail_vcpus: 42
avail_storage_gbs: 400
avail_ipv4: 25
avail_ipv6: 0
avail_ports: 19999
max_ports_per_vm: 5
price: 20000
reports: {}
offline_minutes: 0
- public_key: 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f
operator_wallet: x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK
country: CA
region: Quebec
city: Montréal
ip: 184.107.169.199
avail_mem_mb: 29000
avail_vcpus: 30
avail_storage_gbs: 700
avail_ipv4: 0
avail_ipv6: 0
avail_ports: 19999
max_ports_per_vm: 5
price: 18000
reports: {}
offline_minutes: 0
vm_contracts:
- uuid: dbe09a11-0bcf-472e-9f27-9a4939ea2226
hostname: detee-fr
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
exposed_ports: []
public_ipv4: 156.146.63.217
public_ipv6: ''
disk_size_gb: 10
vcpus: 4
memory_mb: 4000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-05-16T11:07:53.903282009Z
updated_at: 2025-05-16T11:07:53.903282959Z
price_per_unit: 20000
locked_nano: 24513120000
collected_at: 2025-06-26T11:32:59.521517733Z
- uuid: 338312387c6e4e5ebec015277d27c21d
hostname: sofenty-staging
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
exposed_ports: []
public_ipv4: 149.22.95.3
public_ipv6: ''
disk_size_gb: 10
vcpus: 2
memory_mb: 4000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-06-12T23:20:23.797184848Z
updated_at: 2025-06-12T23:20:23.797185855Z
price_per_unit: 20000
locked_nano: 17703920000
collected_at: 2025-06-26T11:32:59.521538185Z
- uuid: 46656273dc964fdeaec2fd1efd49fc12
hostname: sofenty-scraper-bot
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
exposed_ports:
- 36057
public_ipv4: ''
public_ipv6: ''
disk_size_gb: 10
vcpus: 2
memory_mb: 4000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-06-17T11:12:18.659422501Z
updated_at: 2025-06-17T11:12:18.659423285Z
price_per_unit: 20000
locked_nano: 14299320000
collected_at: 2025-06-26T11:32:59.521547200Z
- uuid: 1b3365a15fe64b8aa283bb7883c62e09
hostname: detee-us
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
exposed_ports: []
public_ipv4: 149.36.48.100
public_ipv6: ''
disk_size_gb: 10
vcpus: 4
memory_mb: 4000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-06-18T10:51:17.699206021Z
updated_at: 2025-06-18T10:51:17.699206835Z
price_per_unit: 20000
locked_nano: 26552160000
collected_at: 2025-06-26T11:32:59.521554160Z
- uuid: b11ad0fcfc194f5490d64f5a72574dc8
hostname: brain-backups
admin_pubkey: 45Pyv9hRfub43NyRrYv95MhZs1Wrm8sj3RhBvA3F1Bvr
node_pubkey: 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f
exposed_ports:
- 38175
public_ipv4: ''
public_ipv6: ''
disk_size_gb: 30
vcpus: 1
memory_mb: 1000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-06-18T13:59:30.713579315Z
updated_at: 2025-06-18T13:59:30.713580515Z
price_per_unit: 20000
locked_nano: 11638260000
collected_at: 2025-06-26T11:32:59.521562057Z
- uuid: 89237736b97047beac3611e25e26408e
hostname: brain-staging
admin_pubkey: 45Pyv9hRfub43NyRrYv95MhZs1Wrm8sj3RhBvA3F1Bvr
node_pubkey: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
exposed_ports: []
public_ipv4: 156.146.63.216
public_ipv6: ''
disk_size_gb: 20
vcpus: 2
memory_mb: 4000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-06-18T14:00:48.016735075Z
updated_at: 2025-06-18T14:00:48.016736647Z
price_per_unit: 20000
locked_nano: 32466740000
collected_at: 2025-06-26T11:32:59.521568755Z
app_nodes:
- node_pubkey: BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg
operator_wallet: 7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB
country: DE
region: Hesse
city: Frankfurt am Main
ip: 212.95.45.139
avail_mem_mb: 16000
avail_vcpus: 16
avail_storage_mb: 200000
avail_no_of_port: 20000
max_ports_per_app: 9
price: 20000
reports: {}
offline_minutes: 0
app_contracts: []

@ -324,10 +324,10 @@ impl From<ActiveApp> for DeletedApp {
}
impl ActiveApp {
pub async fn get_by_uuid(db: &Surreal<Client>, uuid: &str) -> Result<Option<Self>, Error> {
pub async fn get_by_app_id(db: &Surreal<Client>, app_id: &str) -> Result<Option<Self>, Error> {
let contract: Option<Self> = db
.query("select * from $active_app_id;".to_string())
.bind(("active_app_id", RecordId::from((ACTIVE_APP, uuid))))
.bind(("active_app_id", RecordId::from((ACTIVE_APP, app_id))))
.await?
.take(0)?;
Ok(contract)
@ -337,7 +337,7 @@ impl ActiveApp {
db: &Surreal<Client>,
new_app_res: app_proto::NewAppRes,
) -> Result<(), Error> {
let new_app_req = match NewAppReq::get(db, &new_app_res.uuid).await? {
let new_app_req = match NewAppReq::get(db, &new_app_res.app_id).await? {
Some(r) => r,
None => return Ok(()),
};
@ -349,7 +349,7 @@ impl ActiveApp {
.collect::<Vec<(u32, u32)>>();
let active_app = Self {
id: RecordId::from((ACTIVE_APP, &new_app_res.uuid)),
id: RecordId::from((ACTIVE_APP, &new_app_res.app_id)),
admin: new_app_req.admin,
app_node: new_app_req.app_node,
app_name: new_app_req.app_name,
@ -371,7 +371,7 @@ impl ActiveApp {
let locked_nano = active_app.locked_nano;
let _: Vec<ActiveApp> = db.insert(()).relation(active_app).await?;
NewAppReq::delete(db, &new_app_res.uuid).await?;
NewAppReq::delete(db, &new_app_res.app_id).await?;
db.query(format!("UPDATE {ACCOUNT}:{admin_account} SET tmp_locked -= {locked_nano};"))
.await?;
@ -440,7 +440,7 @@ impl WrappedAppResp {
if let Some(error_on_newapp_req) = error.take::<Option<db::ErrorFromTable>>(0)? {
if !error_on_newapp_req.error.is_empty() {
let app_daemon_err = NewAppRes {
uuid: app_id.to_string(),
app_id: app_id.to_string(),
error: error_on_newapp_req.error,
..Default::default()
};
@ -462,7 +462,7 @@ impl WrappedAppResp {
Ok(err_notif) =>{
if err_notif.action == surrealdb::Action::Update && !err_notif.data.error.is_empty(){
let app_daemon_err = NewAppRes {
uuid: app_id.to_string(),
app_id: app_id.to_string(),
error: err_notif.data.error,
..Default::default()
};
@ -537,10 +537,10 @@ impl From<ActiveAppWithNode> for ActiveApp {
}
impl ActiveAppWithNode {
pub async fn get_by_uuid(db: &Surreal<Client>, uuid: &str) -> Result<Option<Self>, Error> {
pub async fn get_by_app_id(db: &Surreal<Client>, app_id: &str) -> Result<Option<Self>, Error> {
let contract: Option<Self> = db
.query(format!("select * from {ACTIVE_APP} where id = $uuid_input fetch out;"))
.bind(("uuid_input", RecordId::from((ACTIVE_APP, uuid))))
.query(format!("select * from {ACTIVE_APP} where id = $app_id_input fetch out;"))
.bind(("app_id_input", RecordId::from((ACTIVE_APP, app_id))))
.await?
.take(0)?;

@ -335,13 +335,13 @@ impl Operator {
pub async fn kick_contract(
db: &Surreal<Client>,
operator_wallet: &str,
contract_uuid: &str,
contract_id: &str,
reason: &str,
) -> Result<u64, Error> {
let (contract_id, operator_id, admin_id, app_or_vm) =
if let Some(active_vm) = ActiveVmWithNode::get_by_uuid(db, contract_uuid).await? {
if let Some(active_vm) = ActiveVmWithNode::get_by_id(db, contract_id).await? {
(active_vm.id, active_vm.vm_node.operator, active_vm.admin, "vm")
} else if let Some(active_app) = ActiveAppWithNode::get_by_uuid(db, contract_uuid).await? {
} else if let Some(active_app) = ActiveAppWithNode::get_by_app_id(db, contract_id).await? {
(active_app.id, active_app.app_node.operator, active_app.admin, "app")
} else {
return Err(Error::ContractNotFound);

@ -446,10 +446,10 @@ impl ActiveVm {
self.total_units() * self.price_per_unit
}
pub async fn get_by_uuid(db: &Surreal<Client>, uuid: &str) -> Result<Option<Self>, Error> {
pub async fn get_by_id(db: &Surreal<Client>, vm_id: &str) -> Result<Option<Self>, Error> {
let contract: Option<Self> = db
.query("select * from $active_vm_id;".to_string())
.bind(("active_vm_id", RecordId::from((ACTIVE_VM, uuid))))
.bind(("active_vm_id", RecordId::from((ACTIVE_VM, vm_id))))
.await?
.take(0)?;
Ok(contract)
@ -523,7 +523,7 @@ impl ActiveVm {
None => return Ok(()),
};
let mut active_vm = match Self::get_by_uuid(db, id).await? {
let mut active_vm = match Self::get_by_id(db, id).await? {
Some(vm) => vm,
None => return Ok(()),
};
@ -751,7 +751,7 @@ impl UpdateVmReq {
/// returns Some(true) if hw update is needed and got submitted
/// returns error if something happened with the DB
pub async fn request_hw_update(mut self, db: &Surreal<Client>) -> Result<Option<bool>, Error> {
let contract = ActiveVm::get_by_uuid(db, &self.id.key().to_string()).await?;
let contract = ActiveVm::get_by_id(db, &self.id.key().to_string()).await?;
if contract.is_none() {
return Ok(None);
@ -842,9 +842,9 @@ impl From<ActiveVm> for DeletedVm {
}
impl DeletedVm {
pub async fn get_by_uuid(db: &Surreal<Client>, uuid: &str) -> Result<Option<Self>, Error> {
pub async fn get_by_id(db: &Surreal<Client>, vm_id: &str) -> Result<Option<Self>, Error> {
let contract: Option<Self> =
db.query(format!("select * from {DELETED_VM}:{uuid};")).await?.take(0)?;
db.query(format!("select * from {DELETED_VM}:{vm_id};")).await?.take(0)?;
Ok(contract)
}
@ -949,10 +949,10 @@ impl From<ActiveVmWithNode> for ActiveVm {
}
impl ActiveVmWithNode {
pub async fn get_by_uuid(db: &Surreal<Client>, uuid: &str) -> Result<Option<Self>, Error> {
pub async fn get_by_id(db: &Surreal<Client>, vm_id: &str) -> Result<Option<Self>, Error> {
let contract: Option<Self> = db
.query(format!("select * from {ACTIVE_VM} where id = $uuid_input fetch out;"))
.bind(("uuid_input", RecordId::from((ACTIVE_VM, uuid))))
.query(format!("select * from {ACTIVE_VM} where id = $vm_id fetch out;"))
.bind(("vm_id", RecordId::from((ACTIVE_VM, vm_id))))
.await?
.take(0)?;
Ok(contract)

@ -146,7 +146,7 @@ impl BrainAppDaemon for AppDaemonServer {
if !new_app_resp.error.is_empty() {
db::NewAppReq::submit_error(
&self.db,
&new_app_resp.uuid,
&new_app_resp.app_id,
new_app_resp.error,
)
.await?;
@ -242,7 +242,7 @@ impl BrainAppCli for AppCliServer {
async fn delete_app(&self, req: Request<DelAppReq>) -> Result<Response<Empty>, Status> {
let req = check_sig_from_req(req)?;
let app_node = db::ActiveApp::get_by_uuid(&self.db, &req.uuid)
let app_node = db::ActiveApp::get_by_app_id(&self.db, &req.app_id)
.await?
.ok_or(Status::permission_denied("Unauthorized"))?
.app_node;
@ -252,11 +252,11 @@ impl BrainAppCli for AppCliServer {
return Err(redirect);
}
info!("delete_app process starting for {:?}", req);
match ActiveApp::delete(&self.db, &req.admin_pubkey, &req.uuid).await {
match ActiveApp::delete(&self.db, &req.admin_pubkey, &req.app_id).await {
Ok(()) => Ok(Response::new(Empty {})),
Err(db::Error::AccessDenied) => Err(Status::permission_denied("Unauthorized")),
Err(e) => {
log::error!("Error deleting app contract {}: {e}", &req.uuid);
log::error!("Error deleting app contract {}: {e}", &req.app_id);
Err(Status::unknown(
"Unknown error. Please try again or contact the DeTEE devs team.",
))
@ -273,9 +273,9 @@ impl BrainAppCli for AppCliServer {
let mut app_contracts = Vec::new();
if !req.uuid.is_empty() {
if !req.app_id.is_empty() {
if let Some(app_contract) =
db::ActiveAppWithNode::get_by_uuid(&self.db, &req.uuid).await?
db::ActiveAppWithNode::get_by_app_id(&self.db, &req.app_id).await?
{
if app_contract.admin.key().to_string() == req.admin_pubkey
|| app_contract.app_node.operator.key().to_string() == req.admin_pubkey

@ -7,7 +7,7 @@ use detee_shared::common_proto::{Empty, Pubkey};
use detee_shared::general_proto::brain_general_cli_server::BrainGeneralCli;
use detee_shared::general_proto::{
Account, AccountBalance, AirdropReq, BanUserReq, InspectOperatorResp, KickReq, KickResp,
ListOperatorsResp, RegOperatorReq, ReportNodeReq, SlashReq,
ListOperatorsResp, RecommendedVersions, RegOperatorReq, ReportNodeReq, SlashReq,
};
use detee_shared::vm_proto::VmContract;
use surrealdb::engine::remote::ws::Client;
@ -47,7 +47,7 @@ impl BrainGeneralCli for GeneralCliServer {
async fn report_node(&self, req: Request<ReportNodeReq>) -> Result<Response<Empty>, Status> {
let req = check_sig_from_req(req)?;
let (account, node, contract_id) =
match db::ActiveVmWithNode::get_by_uuid(&self.db, &req.contract).await? {
match db::ActiveVmWithNode::get_by_id(&self.db, &req.contract).await? {
Some(vm_contract)
if vm_contract.admin.key().to_string() == req.admin_pubkey
&& vm_contract.vm_node.id.key().to_string() == req.node_pubkey =>
@ -55,7 +55,8 @@ impl BrainGeneralCli for GeneralCliServer {
(vm_contract.admin, vm_contract.vm_node.id, vm_contract.id.to_string())
}
_ => {
match db::app::ActiveAppWithNode::get_by_uuid(&self.db, &req.contract).await? {
match db::app::ActiveAppWithNode::get_by_app_id(&self.db, &req.contract).await?
{
Some(app_contract)
if app_contract.admin.key().to_string() == req.admin_pubkey
&& app_contract.app_node.id.key().to_string()
@ -129,9 +130,8 @@ impl BrainGeneralCli for GeneralCliServer {
async fn kick_contract(&self, req: Request<KickReq>) -> Result<Response<KickResp>, Status> {
let req = check_sig_from_req(req)?;
log::info!("Kicking contract: {}, by: {}", req.contract_uuid, req.operator_wallet);
match db::kick_contract(&self.db, &req.operator_wallet, &req.contract_uuid, &req.reason)
.await
log::info!("Kicking contract: {}, by: {}", req.contract_id, req.operator_wallet);
match db::kick_contract(&self.db, &req.operator_wallet, &req.contract_id, &req.reason).await
{
Ok(nano_credits) => Ok(Response::new(KickResp { nano_credits })),
Err(e)
@ -228,4 +228,16 @@ impl BrainGeneralCli for GeneralCliServer {
let output_stream = ReceiverStream::new(rx);
Ok(Response::new(Box::pin(output_stream)))
}
async fn get_recommended_versions(
&self,
_: Request<Empty>,
) -> Result<Response<RecommendedVersions>, Status> {
Ok(Response::new(RecommendedVersions {
cli: "0.1.1".to_string(),
brain: env!("CARGO_PKG_VERSION").to_string(),
snp_daemon: "0.1.0".to_string(),
sgx_daemon: "0.1.0".to_string(),
}))
}
}

@ -54,7 +54,7 @@ impl From<NewVmReq> for db::NewVmReq {
impl From<db::NewVmReq> for NewVmReq {
fn from(new_vm_req: db::NewVmReq) -> Self {
Self {
uuid: new_vm_req.id.key().to_string(),
vm_id: new_vm_req.id.key().to_string(),
hostname: new_vm_req.hostname,
admin_pubkey: new_vm_req.admin.key().to_string(),
node_pubkey: new_vm_req.vm_node.key().to_string(),
@ -77,10 +77,10 @@ impl From<db::NewVmReq> for NewVmReq {
impl From<db::WrappedMeasurement> for NewVmResp {
fn from(resp: db::WrappedMeasurement) -> Self {
match resp {
db::WrappedMeasurement::Args(uuid, args) => {
Self { uuid, error: String::new(), args: Some(args) }
db::WrappedMeasurement::Args(vm_id, args) => {
Self { vm_id, error: String::new(), args: Some(args) }
}
db::WrappedMeasurement::Error(uuid, error) => NewVmResp { uuid, error, args: None },
db::WrappedMeasurement::Error(vm_id, error) => NewVmResp { vm_id, error, args: None },
}
}
}
@ -89,10 +89,10 @@ impl From<db::WrappedMeasurement> for NewVmResp {
impl From<db::WrappedMeasurement> for UpdateVmResp {
fn from(resp: db::WrappedMeasurement) -> Self {
match resp {
db::WrappedMeasurement::Args(uuid, args) => {
Self { uuid, error: String::new(), args: Some(args) }
db::WrappedMeasurement::Args(vm_id, args) => {
Self { vm_id, error: String::new(), args: Some(args) }
}
db::WrappedMeasurement::Error(uuid, error) => Self { uuid, error, args: None },
db::WrappedMeasurement::Error(vm_id, error) => Self { vm_id, error, args: None },
}
}
}
@ -100,7 +100,7 @@ impl From<db::WrappedMeasurement> for UpdateVmResp {
impl From<UpdateVmReq> for db::UpdateVmReq {
fn from(new_vm_req: UpdateVmReq) -> Self {
Self {
id: RecordId::from((NEW_VM_REQ, new_vm_req.uuid)),
id: RecordId::from((NEW_VM_REQ, new_vm_req.vm_id)),
admin: RecordId::from((ACCOUNT, new_vm_req.admin_pubkey)),
// vm_node gets modified later, and only if the db::UpdateVmReq is required
vm_node: RecordId::from((VM_NODE, String::new())),
@ -120,7 +120,7 @@ impl From<UpdateVmReq> for db::UpdateVmReq {
impl From<db::UpdateVmReq> for UpdateVmReq {
fn from(update_vm_req: db::UpdateVmReq) -> Self {
Self {
uuid: update_vm_req.id.key().to_string(),
vm_id: update_vm_req.id.key().to_string(),
// daemon does not care about VM hostname
hostname: String::new(),
admin_pubkey: update_vm_req.admin.key().to_string(),
@ -138,7 +138,7 @@ impl From<db::UpdateVmReq> for UpdateVmReq {
impl From<db::DeletedVm> for DeleteVmReq {
fn from(delete_vm_req: db::DeletedVm) -> Self {
Self {
uuid: delete_vm_req.id.key().to_string(),
vm_id: delete_vm_req.id.key().to_string(),
admin_pubkey: delete_vm_req.admin.key().to_string(),
}
}
@ -167,7 +167,7 @@ impl From<db::ActiveVmWithNode> for VmContract {
exposed_ports.push(port.0);
}
VmContract {
uuid: db_c.id.key().to_string(),
vm_id: db_c.id.key().to_string(),
hostname: db_c.hostname.clone(),
admin_pubkey: db_c.admin.key().to_string(),
node_pubkey: db_c.vm_node.id.key().to_string(),
@ -292,7 +292,7 @@ impl From<db::ActiveAppWithNode> for AppContract {
Some(hex::decode(value.mr_enclave.clone()).unwrap_or_default());
AppContract {
uuid: value.id.key().to_string(),
app_id: value.id.key().to_string(),
package_url: value.package_url,
admin_pubkey: value.admin.key().to_string(),
node_pubkey: value.app_node.id.key().to_string(),
@ -365,7 +365,7 @@ impl From<db::NewAppReq> for NewAppReq {
package_url: value.package_url,
node_pubkey: value.app_node.key().to_string(),
resource: Some(resource),
uuid: value.id.key().to_string(),
app_id: value.id.key().to_string(),
admin_pubkey: value.admin.key().to_string(),
price_per_unit: value.price_per_unit,
locked_nano: value.locked_nano,
@ -378,7 +378,7 @@ impl From<db::NewAppReq> for NewAppReq {
impl From<db::DeletedApp> for DelAppReq {
fn from(value: db::DeletedApp) -> Self {
Self { uuid: value.id.key().to_string(), admin_pubkey: value.admin.key().to_string() }
Self { app_id: value.id.key().to_string(), admin_pubkey: value.admin.key().to_string() }
}
}
@ -415,7 +415,7 @@ impl From<db::ActiveApp> for NewAppRes {
.map(|(h, g)| MappedPort { host_port: *h, guest_port: *g })
.collect();
Self {
uuid: val.id.key().to_string(),
app_id: val.id.key().to_string(),
ip_address: val.host_ipv4,
mapped_ports,
error: String::new(),

@ -155,7 +155,7 @@ impl BrainVmDaemon for VmDaemonServer {
if !new_vm_resp.error.is_empty() {
db::NewVmReq::submit_error(
&self.db,
&new_vm_resp.uuid,
&new_vm_resp.vm_id,
new_vm_resp.error,
)
.await?;
@ -163,12 +163,12 @@ impl BrainVmDaemon for VmDaemonServer {
db::upsert_record(
&self.db,
"measurement_args",
&new_vm_resp.uuid,
&new_vm_resp.vm_id,
new_vm_resp.args.clone(),
)
.await?;
if let Some(args) = new_vm_resp.args {
db::ActiveVm::activate(&self.db, &new_vm_resp.uuid, args).await?;
db::ActiveVm::activate(&self.db, &new_vm_resp.vm_id, args).await?;
}
}
}
@ -176,7 +176,7 @@ impl BrainVmDaemon for VmDaemonServer {
if !update_vm_resp.error.is_empty() {
db::UpdateVmReq::submit_error(
&self.db,
&update_vm_resp.uuid,
&update_vm_resp.vm_id,
update_vm_resp.error,
)
.await?;
@ -184,11 +184,11 @@ impl BrainVmDaemon for VmDaemonServer {
db::upsert_record(
&self.db,
"measurement_args",
&update_vm_resp.uuid,
&update_vm_resp.vm_id,
update_vm_resp.args.clone(),
)
.await?;
db::ActiveVm::update(&self.db, &update_vm_resp.uuid).await?;
db::ActiveVm::update(&self.db, &update_vm_resp.vm_id).await?;
}
}
Some(vm_daemon_message::Msg::VmNodeResources(node_resources)) => {
@ -286,13 +286,13 @@ impl BrainVmCli for VmCliServer {
let mut hostname_changed = false;
if !req.hostname.is_empty() {
hostname_changed =
db::ActiveVm::change_hostname(&self.db, &req.uuid, &req.hostname).await?;
db::ActiveVm::change_hostname(&self.db, &req.vm_id, &req.hostname).await?;
}
let hw_change_submitted = db_req.request_hw_update(&self.db).await?;
if hw_change_submitted.is_none() {
return Ok(Response::new(UpdateVmResp {
uuid: req.uuid.clone(),
vm_id: req.vm_id.clone(),
error: "VM Contract does not exist.".to_string(),
args: None,
}));
@ -301,7 +301,7 @@ impl BrainVmCli for VmCliServer {
if !hostname_changed && !hw_change_needed {
return Ok(Response::new(UpdateVmResp {
uuid: req.uuid.clone(),
vm_id: req.vm_id.clone(),
error: "No modification required".to_string(),
args: None,
}));
@ -310,7 +310,7 @@ impl BrainVmCli for VmCliServer {
// if only the hostname got changed, return a confirmation
if !hw_change_needed {
return Ok(Response::new(UpdateVmResp {
uuid: req.uuid.clone(),
vm_id: req.vm_id.clone(),
error: String::new(),
args: None,
}));
@ -339,7 +339,7 @@ impl BrainVmCli for VmCliServer {
async fn extend_vm(&self, req: Request<ExtendVmReq>) -> Result<Response<Empty>, Status> {
let req = check_sig_from_req(req)?;
match db::ActiveVm::extend_time(&self.db, &req.uuid, &req.admin_pubkey, req.locked_nano)
match db::ActiveVm::extend_time(&self.db, &req.vm_id, &req.admin_pubkey, req.locked_nano)
.await
{
Ok(()) => Ok(Response::new(Empty {})),
@ -354,7 +354,7 @@ impl BrainVmCli for VmCliServer {
Err(Status::failed_precondition(e.to_string()))
}
Err(e) => {
log::error!("Error extending VM contract {}: {e}", &req.uuid);
log::error!("Error extending VM contract {}: {e}", &req.vm_id);
Err(Status::unknown(format!("Could not extend contract: {e}")))
}
}
@ -362,7 +362,7 @@ impl BrainVmCli for VmCliServer {
async fn delete_vm(&self, req: Request<DeleteVmReq>) -> Result<Response<Empty>, Status> {
let req = check_sig_from_req(req)?;
let vm_node = db::ActiveVm::get_by_uuid(&self.db, &req.uuid)
let vm_node = db::ActiveVm::get_by_id(&self.db, &req.vm_id)
.await?
.ok_or(Status::permission_denied("Unauthorized"))?
.vm_node;
@ -371,11 +371,11 @@ impl BrainVmCli for VmCliServer {
log::info!("redirect: {redirect}");
return Err(redirect);
}
match db::ActiveVm::delete(&self.db, &req.admin_pubkey, &req.uuid).await {
match db::ActiveVm::delete(&self.db, &req.admin_pubkey, &req.vm_id).await {
Ok(()) => Ok(Response::new(Empty {})),
Err(db::Error::AccessDenied) => Err(Status::permission_denied("Unauthorized")),
Err(e) => {
log::error!("Error deleting VM contract {}: {e}", &req.uuid);
log::error!("Error deleting VM contract {}: {e}", &req.vm_id);
Err(Status::unknown(
"Unknown error. Please try again or contact the DeTEE devs team.",
))
@ -393,9 +393,9 @@ impl BrainVmCli for VmCliServer {
req.wallet, req.as_operator
);
let mut contracts = Vec::new();
if !req.uuid.is_empty() {
if !req.vm_id.is_empty() {
if let Some(specific_contract) =
db::ActiveVmWithNode::get_by_uuid(&self.db, &req.uuid).await?
db::ActiveVmWithNode::get_by_id(&self.db, &req.vm_id).await?
{
if specific_contract.admin.key().to_string() == req.wallet
|| specific_contract.vm_node.operator.key().to_string() == req.wallet

@ -26,7 +26,7 @@ pub async fn create_new_app(
client_app_cli.new_app(key.sign_request(new_app_req.clone())?).await?.into_inner();
assert!(new_app_resp.error.is_empty());
assert!(new_app_resp.uuid.len() == 40);
assert!(new_app_resp.app_id.len() == 40);
Ok(new_app_resp)
}

@ -127,7 +127,7 @@ pub async fn daemon_engine(
.collect::<Vec<MappedPort>>();
let res_data = NewAppRes {
uuid: new_app_req.uuid,
app_id: new_app_req.app_id,
mapped_ports,
ip_address: "127.0.0.1".to_string(),
error: new_app_err.clone().unwrap_or_default(),
@ -139,7 +139,7 @@ pub async fn daemon_engine(
tx.send(res).await?;
}
Some(app_proto::brain_message_app::Msg::DeleteAppReq(del_app_req)) => {
println!("MOCK_APP_DAEMON::delete app request for {}", del_app_req.uuid);
println!("MOCK_APP_DAEMON::delete app request for {}", del_app_req.app_id);
}
None => todo!(),
}

@ -33,19 +33,19 @@ pub async fn create_new_vm(
let new_vm_resp = client_vm_cli.new_vm(key.sign_request(new_vm_req)?).await?.into_inner();
assert!(new_vm_resp.error.is_empty());
assert!(new_vm_resp.uuid.len() == 40);
assert!(new_vm_resp.vm_id.len() == 40);
// wait for update db
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
let vm_req_db: Option<db::NewVmReq> = db.select((NEW_VM_REQ, new_vm_resp.uuid.clone())).await?;
let vm_req_db: Option<db::NewVmReq> = db.select((NEW_VM_REQ, new_vm_resp.vm_id.clone())).await?;
if let Some(new_vm_req) = vm_req_db {
panic!("New VM request found in DB: {:?}", new_vm_req);
}
let active_vm_op: Option<db::ActiveVm> =
db.select((ACTIVE_VM, new_vm_resp.uuid.clone())).await?;
db.select((ACTIVE_VM, new_vm_resp.vm_id.clone())).await?;
let active_vm = active_vm_op.ok_or(anyhow!("Not found active vm in db"))?;
Ok(active_vm.id.key().to_string())
@ -159,7 +159,7 @@ pub async fn user_list_vm_contracts(
brain_channel: &Channel,
key: &Key,
as_operator: bool,
uuid: &str,
vm_id: &str,
) -> Result<Vec<vm_proto::VmContract>> {
let mut cli_client = BrainVmCliClient::new(brain_channel.clone());
let mut stream = cli_client
@ -167,7 +167,7 @@ pub async fn user_list_vm_contracts(
key.sign_request(vm_proto::ListVmContractsReq {
wallet: key.pubkey.clone(),
as_operator,
uuid: uuid.to_string(),
vm_id: vm_id.to_string(),
})
.unwrap(),
)

@ -128,7 +128,7 @@ pub async fn daemon_engine(
});
let new_vm_resp = vm_proto::NewVmResp {
uuid: new_vm_req.uuid.clone(),
vm_id: new_vm_req.vm_id.clone(),
args,
error: new_vm_err.clone().unwrap_or_default(),
};
@ -142,7 +142,7 @@ pub async fn daemon_engine(
todo!()
}
Some(vm_proto::brain_vm_message::Msg::DeleteVm(del_vm_req)) => {
println!("MOCK_VM_DAEMON::delete vm request for {}", del_vm_req.uuid);
println!("MOCK_VM_DAEMON::delete vm request for {}", del_vm_req.vm_id);
}
None => todo!(),
}

@ -19,7 +19,7 @@ async fn test_new_app_db_tx() {
ports: vec![ 8080 ],
},
),
uuid: "".to_string(),
app_id: "".to_string(),
admin_pubkey: "H21Shi4iE7vgfjWEQNvzmpmBMJSaiZ17PYUcdNoAoKNc".to_string(),
price_per_unit: 200000,
locked_nano: 152400000,

@ -57,7 +57,7 @@ async fn test_app_creation() {
.unwrap()
.into_inner();
let active_app =
db.select::<Option<db::ActiveApp>>((ACTIVE_APP, new_app_resp.uuid)).await.unwrap();
db.select::<Option<db::ActiveApp>>((ACTIVE_APP, new_app_resp.app_id)).await.unwrap();
assert!(active_app.is_some());
let daemon_key_02 =
@ -73,7 +73,7 @@ async fn test_app_creation() {
assert!(!new_app_resp.error.is_empty());
let app_req_db =
db.select::<Option<db::NewAppReq>>((NEW_APP_REQ, new_app_resp.uuid)).await.unwrap();
db.select::<Option<db::NewAppReq>>((NEW_APP_REQ, new_app_resp.app_id)).await.unwrap();
assert!(!app_req_db.unwrap().error.is_empty());
@ -90,7 +90,7 @@ async fn test_app_creation() {
assert!(new_app_resp.error.is_empty());
let active_app =
db.select::<Option<db::ActiveApp>>((ACTIVE_APP, new_app_resp.uuid)).await.unwrap();
db.select::<Option<db::ActiveApp>>((ACTIVE_APP, new_app_resp.app_id)).await.unwrap();
assert!(active_app.is_some());
tokio::time::sleep(std::time::Duration::from_millis(300)).await;
@ -144,7 +144,7 @@ async fn test_app_deletion() {
let mut client_app_cli = BrainAppCliClient::new(brain_channel.clone());
let del_app_req = DelAppReq { admin_pubkey: key.pubkey.clone(), uuid: new_app_res.uuid };
let del_app_req = DelAppReq { admin_pubkey: key.pubkey.clone(), app_id: new_app_res.app_id };
let _ = client_app_cli.delete_app(key.sign_request(del_app_req).unwrap()).await.unwrap();
let key_02 = Key::new();
@ -152,7 +152,7 @@ async fn test_app_deletion() {
// delete random app
let mut del_app_req = DelAppReq {
admin_pubkey: key_02.pubkey.clone(),
uuid: "9ae3VH8nJg2i8pqTQ6mJtvYuS2kd9n1XLLco8GUPfT95".to_string(),
app_id: "9ae3VH8nJg2i8pqTQ6mJtvYuS2kd9n1XLLco8GUPfT95".to_string(),
};
let del_err = client_app_cli
@ -163,7 +163,7 @@ async fn test_app_deletion() {
assert_eq!(del_err.message(), "Unauthorized");
let new_app_res_02 = create_new_app(&key, &daemon_key, &brain_channel).await.unwrap();
del_app_req.uuid = new_app_res_02.uuid;
del_app_req.app_id = new_app_res_02.app_id;
let del_err = client_app_cli
.delete_app(key_02.sign_request(del_app_req.clone()).unwrap())
@ -179,14 +179,14 @@ async fn test_app_deletion() {
let new_app_res_03 = create_new_app(&key_03, &daemon_key, &brain_channel).await.unwrap();
let del_app_req =
DelAppReq { admin_pubkey: key_03.pubkey.clone(), uuid: new_app_res_03.uuid.clone() };
DelAppReq { admin_pubkey: key_03.pubkey.clone(), app_id: new_app_res_03.app_id.clone() };
let _ = client_app_cli.delete_app(key_03.sign_request(del_app_req).unwrap()).await.unwrap();
let acc: db::Account = db.select((ACCOUNT, key_03.pubkey.clone())).await.unwrap().unwrap();
assert_eq!(acc.balance, 10 * TOKEN_DECIMAL);
let deleted_app =
db.select::<Option<db::DeletedApp>>((DELETED_APP, new_app_res_03.uuid)).await.unwrap();
db.select::<Option<db::DeletedApp>>((DELETED_APP, new_app_res_03.app_id)).await.unwrap();
assert!(deleted_app.is_some());
}

@ -54,7 +54,7 @@ async fn test_brain_message() {
cli_client.new_app(cli_key.sign_request(req).unwrap()).await.unwrap().into_inner();
assert!(new_app_resp.error.is_empty());
assert!(new_app_resp.uuid.len() == 40);
assert!(new_app_resp.app_id.len() == 40);
}
#[tokio::test]

@ -129,7 +129,7 @@ async fn test_report_node() {
let key = Key::new();
let report_error =
report_node(&key, &brain_channel, &daemon_key, "uuid", "reason").await.err().unwrap();
report_node(&key, &brain_channel, &daemon_key, "thisIsNotAnID", "reason").await.err().unwrap();
log::info!("Report error: {:?}", report_error);
assert!(report_error.to_string().contains("No contract found by this ID."));
@ -264,12 +264,12 @@ async fn test_kick_contract() {
*/
let db_conn = prepare_test_db().await.unwrap();
let contract_uuid = "5af49a714c64a82ef50e574b023b2a0ef0405ed";
let contract_id = "5af49a714c64a82ef50e574b023b2a0ef0405ed";
let operator_wallet = "7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB";
let reason = "'; THROW 'Injected error'; --"; // sql injection query
let kick_response =
surreal_brain::db::general::kick_contract(&db_conn, operator_wallet, contract_uuid, reason)
surreal_brain::db::general::kick_contract(&db_conn, operator_wallet, contract_id, reason)
.await;
match kick_response {
Ok(refund_amount) => {

@ -70,7 +70,7 @@ async fn test_vm_creation() {
assert!(!new_vm_resp.error.is_empty());
let vm_req_db: Option<db::NewVmReq> =
db.select((NEW_VM_REQ, new_vm_resp.uuid.clone())).await.unwrap();
db.select((NEW_VM_REQ, new_vm_resp.vm_id.clone())).await.unwrap();
if let Some(new_vm_req) = vm_req_db {
assert!(!new_vm_req.error.is_empty());
@ -88,7 +88,7 @@ async fn test_vm_creation() {
assert!(new_vm_resp.error.is_empty());
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
let active_vm: Option<db::ActiveVm> = db.select((ACTIVE_VM, new_vm_resp.uuid)).await.unwrap();
let active_vm: Option<db::ActiveVm> = db.select((ACTIVE_VM, new_vm_resp.vm_id)).await.unwrap();
assert!(active_vm.is_some());
let acc_db: db::Account = db.select((ACCOUNT, key.pubkey.clone())).await.unwrap().unwrap();
@ -139,11 +139,11 @@ async fn test_vm_deletion() {
let key = Key::new();
airdrop(&brain_channel, &key.pubkey, 10).await.unwrap();
let new_vm_uuid = create_new_vm(&db, &key, &daemon_key, &brain_channel).await.unwrap();
let new_vm_id = create_new_vm(&db, &key, &daemon_key, &brain_channel).await.unwrap();
let mut client_vm_cli = BrainVmCliClient::new(brain_channel.clone());
let del_app_req = DeleteVmReq { admin_pubkey: key.pubkey.clone(), uuid: new_vm_uuid };
let del_app_req = DeleteVmReq { admin_pubkey: key.pubkey.clone(), vm_id: new_vm_id };
let _ = client_vm_cli.delete_vm(key.sign_request(del_app_req).unwrap()).await.unwrap();
let key_02 = Key::new();
@ -151,7 +151,7 @@ async fn test_vm_deletion() {
// delete random vm
let mut del_vm_req = DeleteVmReq {
admin_pubkey: key_02.pubkey.clone(),
uuid: "9ae3VH8nJg2i8pqTQ6mJtvYuS2kd9n1XLLco8GUPfT95".to_string(),
vm_id: "9ae3VH8nJg2i8pqTQ6mJtvYuS2kd9n1XLLco8GUPfT95".to_string(),
};
let del_err = client_vm_cli
@ -161,8 +161,8 @@ async fn test_vm_deletion() {
.unwrap();
assert_eq!(del_err.message(), "Unauthorized");
let new_vm_uuid_02 = create_new_vm(&db, &key, &daemon_key, &brain_channel).await.unwrap();
del_vm_req.uuid = new_vm_uuid_02;
let new_vm_id_02 = create_new_vm(&db, &key, &daemon_key, &brain_channel).await.unwrap();
del_vm_req.vm_id = new_vm_id_02;
let del_err = client_vm_cli
.delete_vm(key_02.sign_request(del_vm_req.clone()).unwrap())
@ -175,17 +175,17 @@ async fn test_vm_deletion() {
let key_03 = Key::new();
airdrop(&brain_channel, &key_03.pubkey, 10).await.unwrap();
let new_vm_uuid_03 = create_new_vm(&db, &key_03, &daemon_key, &brain_channel).await.unwrap();
let new_vm_id_03 = create_new_vm(&db, &key_03, &daemon_key, &brain_channel).await.unwrap();
let del_vm_req =
DeleteVmReq { admin_pubkey: key_03.pubkey.clone(), uuid: new_vm_uuid_03.clone() };
DeleteVmReq { admin_pubkey: key_03.pubkey.clone(), vm_id: new_vm_id_03.clone() };
let _ = client_vm_cli.delete_vm(key_03.sign_request(del_vm_req).unwrap()).await.unwrap();
let acc: db::Account = db.select((ACCOUNT, key_03.pubkey.clone())).await.unwrap().unwrap();
assert_eq!(acc.balance, 10 * TOKEN_DECIMAL);
let deleted_vm =
db.select::<Option<db::DeletedVm>>((DELETED_VM, new_vm_uuid_03)).await.unwrap();
db.select::<Option<db::DeletedVm>>((DELETED_VM, new_vm_id_03)).await.unwrap();
assert!(deleted_vm.is_some());
}
@ -201,7 +201,7 @@ async fn test_list_vm_contracts() {
let pubkey = key.pubkey.clone();
let req_data =
ListVmContractsReq { wallet: pubkey, uuid: String::from("uuid"), as_operator: false };
ListVmContractsReq { wallet: pubkey, vm_id: String::from("vm_id"), as_operator: false };
let mut grpc_stream =
client.list_vm_contracts(key.sign_request(req_data).unwrap()).await.unwrap().into_inner();
@ -253,7 +253,7 @@ async fn test_extend_vm() {
let mut req = ExtendVmReq {
admin_pubkey: key.pubkey.clone(),
uuid: "foooooooo".to_string(),
vm_id: "foooooooo".to_string(),
locked_nano: u64::MAX,
};
@ -266,7 +266,7 @@ async fn test_extend_vm() {
cli_client.extend_vm(key.sign_request(req.clone()).unwrap()).await.err().unwrap();
assert!(err_precondition.to_string().contains("Contract not found"));
req.uuid = vm_contract_id.to_string();
req.vm_id = vm_contract_id.to_string();
let err_precondition =
cli_client.extend_vm(key.sign_request(req.clone()).unwrap()).await.err().unwrap();
assert!(err_precondition.to_string().contains("Insufficient funds"));

@ -49,7 +49,7 @@ async fn test_brain_message() {
cli_client.new_vm(cli_key.sign_request(req).unwrap()).await.unwrap().into_inner();
assert!(new_vm_resp.error.is_empty());
assert!(new_vm_resp.uuid.len() == 40);
assert!(new_vm_resp.vm_id.len() == 40);
assert!(new_vm_resp.args.is_some());
assert!(new_vm_resp.args.unwrap().exposed_ports.len() == 3);
}

@ -1,551 +0,0 @@
# SPDX-License-Identifier: Apache-2.0
accounts:
DXXkYSnhP3ijsHYxkedcuMomEyc122WaAbkDX7SaGuUS:
balance: 20293420000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL:
balance: 25949200000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
Cnkvn3WuHYfTzh1YK1TAv2VD25sNvstJNnQtxjcdQSL7:
balance: 4794480000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS:
balance: 4672207240000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
E3bgXsWvgichXeC6AqULJCZDp7FbEdTxBD67UaYVWf9y:
balance: 21121600000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
HQyGWpiteHbxjszngZvmiX7ZFZAmF6nFjEraBa1M6bbM:
balance: 979410300000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
H21Shi4iE7vgfjWEQNvzmpmBMJSaiZ17PYUcdNoAoKNc:
balance: 976000000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
45Pyv9hRfub43NyRrYv95MhZs1Wrm8sj3RhBvA3F1Bvr:
balance: 1670441080000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
49JBVzmgsQbUURHzAWax2gxo6jmukqbEQzP97YeeNQyu:
balance: 1076960680000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB:
balance: 3271040000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK:
balance: 554454460000
tmp_locked: 547200000
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
3BNggj8ZTsoSjfAGdPfmcU2Gobm2qcTEBg9iHXEUPe1t:
balance: 9978460000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
B981xPHmHthfKr15J9uJ64qd9zt2KsdiEuDRR7UUCGWi:
balance: 99980200000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
CLYyE6id5876DW69LHDynuH6TjJPvWRBTQC5XDZ6jfT1:
balance: 25000000000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
db5ZB6uDbF1mUUgeggBZ9XKbi3mUfX6WHkBpbwUHJpB:
balance: 25000000000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
fY3NNjvFTeR1FBh5nXV3ujX7zZqrm3eBUWGEiG75TK1:
balance: 1000000000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
FBMWVqME3t1i4R6zWyDQGUuiTeruZ1TxLhTmhaEcFypZ:
balance: 181560160000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX:
balance: 74660380000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
4qFJJJdRrSB9hCn8rrvYTXHLJg371ab36PJmZ4uxHjGQ:
balance: 25949200000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
Hv5q3enK249RUnLRLi9YNQMrPCRxvL2XnhznkzrtCmkG:
balance: 25949200000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
GmE4JH3bL4NpmzwKCBJemJzRTumJAnbcXLGqce5mREgS:
balance: 500000000000
tmp_locked: 0
kicked_for: []
last_kick: 1970-01-01T00:00:00Z
banned_by: []
operators:
BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS:
escrow: 5096692000000
email: first_on_detee@proton.me
banned_users: []
vm_nodes:
- HiyMp21zaBVbRCjDsD5hEjQnHeHv4e1gpUR6pVfHTKqv
- 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
- Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
- 4QbUXDM915RUFnHm3NiysLXFLk1WRGZvABwLNzx4tTEW
- DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
app_nodes: []
x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK:
escrow: 5499700480000
email: gheo@detee.ltd
banned_users: []
vm_nodes:
- 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f
- 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9
app_nodes: []
7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB:
escrow: 888888888899999
email: ""
banned_users: []
vm_nodes: []
app_nodes:
- BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg
4qFJJJdRrSB9hCn8rrvYTXHLJg371ab36PJmZ4uxHjGQ:
escrow: 5499700480000
email: "test_mock@operator"
banned_users: []
vm_nodes:
- 7fujZQeTme52RdXTLmQST5jBgAbvzic5iERtH5EWoYjk
app_nodes: []
Hv5q3enK249RUnLRLi9YNQMrPCRxvL2XnhznkzrtCmkG:
escrow: 5499700480000
email: "test_mock_extend@operator"
banned_users: []
vm_nodes:
- 8ue3VHMnJg2i8pwTQ6mJtvYuS2kd9n1XLLco8GUPfT95
app_nodes: []
vm_nodes:
- public_key: 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9
operator_wallet: x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK
country: GB
region: England
city: London
ip: 173.234.17.2
avail_mem_mb: 26000
avail_vcpus: 28
avail_storage_gbs: 680
avail_ipv4: 2
avail_ipv6: 65516
avail_ports: 19999
max_ports_per_vm: 5
price: 20000
reports: {}
offline_minutes: 0
- public_key: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
country: FR
region: Île-de-France
city: Paris
ip: 156.146.63.215
avail_mem_mb: 123000
avail_vcpus: 46
avail_storage_gbs: 440
avail_ipv4: 2
avail_ipv6: 0
avail_ports: 20000
max_ports_per_vm: 5
price: 20000
reports: {}
offline_minutes: 0
- public_key: 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f
operator_wallet: x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK
country: CA
region: Quebec
city: Montréal
ip: 184.107.169.199
avail_mem_mb: 30000
avail_vcpus: 31
avail_storage_gbs: 700
avail_ipv4: 0
avail_ipv6: 0
avail_ports: 20000
max_ports_per_vm: 5
price: 18000
reports: {}
offline_minutes: 0
- public_key: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
country: CA
region: British Columbia
city: Vancouver
ip: 149.22.95.1
avail_mem_mb: 109000
avail_vcpus: 45
avail_storage_gbs: 400
avail_ipv4: 25
avail_ipv6: 0
avail_ports: 20000
max_ports_per_vm: 5
price: 20000
reports: {}
offline_minutes: 0
- public_key: 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
country: US
region: California
city: San Jose
ip: 149.36.48.99
avail_mem_mb: 120000
avail_vcpus: 41
avail_storage_gbs: 390
avail_ipv4: 23
avail_ipv6: 0
avail_ports: 19999
max_ports_per_vm: 5
price: 20000
reports: {}
offline_minutes: 0
- public_key: HiyMp21zaBVbRCjDsD5hEjQnHeHv4e1gpUR6pVfHTKqv
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
country: CA
region: British Columbia
city: Vancouver
ip: 149.22.95.28
avail_mem_mb: 125000
avail_vcpus: 46
avail_storage_gbs: 400
avail_ipv4: 26
avail_ipv6: 0
avail_ports: 20000
max_ports_per_vm: 5
price: 20000
reports: {}
offline_minutes: 0
- public_key: 7fujZQeTme52RdXTLmQST5jBgAbvzic5iERtH5EWoYjk
operator_wallet: 4qFJJJdRrSB9hCn8rrvYTXHLJg371ab36PJmZ4uxHjGQ
country: GB
region: England
city: London
ip: 193.234.17.2
avail_mem_mb: 28000
avail_vcpus: 24
avail_storage_gbs: 1680
avail_ipv4: 1
avail_ipv6: 0
avail_ports: 19999
max_ports_per_vm: 10
price: 24000
reports: {}
offline_minutes: 0
- public_key: 8ue3VHMnJg2i8pwTQ6mJtvYuS2kd9n1XLLco8GUPfT95
operator_wallet: Hv5q3enK249RUnLRLi9YNQMrPCRxvL2XnhznkzrtCmkG
country: GB
region: England
city: London
ip: 193.234.17.2
avail_mem_mb: 28000
avail_vcpus: 24
avail_storage_gbs: 1680
avail_ipv4: 1
avail_ipv6: 0
avail_ports: 19999
max_ports_per_vm: 10
price: 24000
reports: {}
offline_minutes: 1
vm_contracts:
- uuid: 958165e3-dea8-407d-8c42-dd17002ef79c
hostname: detee-landing-fr
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
exposed_ports: []
public_ipv4: 156.146.63.216
public_ipv6: ""
disk_size_gb: 10240
vcpus: 2
memory_mb: 3000
kernel_sha: 3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151
dtrfs_sha: 3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b
created_at: 2025-02-28T23:19:41.769423466Z
updated_at: 2025-04-12T12:11:58.516768949Z
price_per_unit: 20000
locked_nano: 14875500000
collected_at: 2025-04-20T00:34:15.461165181Z
- uuid: e807a2fd-cf90-4a14-bc3a-89ce6dc59033
hostname: detee-landing-gb
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9
exposed_ports: []
public_ipv4: 173.234.136.154
public_ipv6: ""
disk_size_gb: 10240
vcpus: 2
memory_mb: 3000
kernel_sha: 3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151
dtrfs_sha: 3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b
created_at: 2025-03-06T19:51:39.595163157Z
updated_at: 2025-03-06T19:51:39.595163842Z
price_per_unit: 20000
locked_nano: 14875500000
collected_at: 2025-04-20T00:34:15.461181545Z
- uuid: 23094406-2307-4332-a642-acee718d0186
hostname: heroic-door
admin_pubkey: DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX
node_pubkey: 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9
exposed_ports:
- 38288
public_ipv4: ""
public_ipv6: ""
disk_size_gb: 10240
vcpus: 1
memory_mb: 1000
kernel_sha: 14e225e4aaf84cc2e0b5f64206121186ddebc4b378b886da3b2f7515dfd41692
dtrfs_sha: 03ce24dbbe917fdd4f6347e61036805ddbdded5044c272bab188ef9333093bee
created_at: 2025-03-12T16:28:24.749161605Z
updated_at: 2025-03-12T16:28:24.749162477Z
price_per_unit: 20000
locked_nano: 14134140000
collected_at: 2025-04-20T00:34:15.461191231Z
- uuid: 1f49a71c-f68c-4c64-a82e-f50e0ba0b574
hostname: astromech-wrench
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
exposed_ports: []
public_ipv4: 149.22.95.2
public_ipv6: ""
disk_size_gb: 10240
vcpus: 2
memory_mb: 3000
kernel_sha: 3a68709138bed09c16671949cf1f03acee95a08381ba84fc70fb586001fa6767
dtrfs_sha: 0bb93443f65c9f4379ed469f94794f5c1bf14d8905b0b2c56a125df4a9ebe83e
created_at: 2025-03-20T14:40:25.557753393Z
updated_at: 2025-03-20T14:40:25.557754242Z
price_per_unit: 20000
locked_nano: 11865620000
collected_at: 2025-04-20T00:34:15.461201690Z
- uuid: 16577f1c-9867-4a17-80a8-6cf0490f1270
hostname: sofenty
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
exposed_ports: []
public_ipv4: 156.146.63.217
public_ipv6: ""
disk_size_gb: 10240
vcpus: 2
memory_mb: 3000
kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542
dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45
created_at: 2025-04-07T22:57:57.646151746Z
updated_at: 2025-04-07T22:57:57.646152630Z
price_per_unit: 20000
locked_nano: 11867500000
collected_at: 2025-04-20T00:34:15.461211040Z
- uuid: 4b6e25ca-87ac-478b-8f16-aa8f5c44c704
hostname: cloaked-mailbox
admin_pubkey: DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX
node_pubkey: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
exposed_ports: []
public_ipv4: 149.22.95.2
public_ipv6: ""
disk_size_gb: 30
vcpus: 1
memory_mb: 1000
kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542
dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45
created_at: 2025-04-12T13:44:56.957037550Z
updated_at: 2025-04-12T13:44:56.957038546Z
price_per_unit: 20000
locked_nano: 11177760000
collected_at: 2025-04-20T00:34:15.461219779Z
- uuid: eb1a13ed-d782-4b71-8860-73540129cb7d
hostname: twenty
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
exposed_ports: []
public_ipv4: 149.36.48.100
public_ipv6: ""
disk_size_gb: 10240
vcpus: 4
memory_mb: 4000
kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542
dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45
created_at: 2025-04-15T00:46:35.622165457Z
updated_at: 2025-04-15T00:46:35.622166372Z
price_per_unit: 20000
locked_nano: 15570720000
collected_at: 2025-04-20T00:34:15.461230948Z
- uuid: 1bf36309-3774-4825-b023-b2a0ef0405ed
hostname: shadowy-hobo
admin_pubkey: x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK
node_pubkey: 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
exposed_ports:
- 46393
public_ipv4: ""
public_ipv6: ""
disk_size_gb: 10240
vcpus: 1
memory_mb: 1000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-04-16T20:37:57.176592933Z
updated_at: 2025-04-16T20:37:57.176594069Z
price_per_unit: 20000
locked_nano: 12730960000
collected_at: 2025-04-20T00:34:15.461240342Z
- uuid: 1d749a81-6c27-a22e-fa0e574-b023-a6afef040fe5
hostname: test-extend
admin_pubkey: GmE4JH3bL4NpmzwKCBJemJzRTumJAnbcXLGqce5mREgS
node_pubkey: 8ue3VHMnJg2i8pwTQ6mJtvYuS2kd9n1XLLco8GUPfT95
exposed_ports:
- 46393
public_ipv4: ""
public_ipv6: ""
disk_size_gb: 10240
vcpus: 1
memory_mb: 1000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-04-16T20:37:57.176592933Z
updated_at: 2025-04-16T20:37:57.176594069Z
price_per_unit: 20000
locked_nano: 60000
collected_at: 2025-04-20T00:34:15.461240342Z
- uuid: 5af49a71-4c64-a82e-f50e574-b023-b2a0ef0405ed
hostname: hallow-hobo
admin_pubkey: 4qFJJJdRrSB9hCn8rrvYTXHLJg371ab36PJmZ4uxHjGQ
node_pubkey: 7fujZQeTme52RdXTLmQST5jBgAbvzic5iERtH5EWoYjk
exposed_ports:
- 46393
public_ipv4: ""
public_ipv6: ""
disk_size_gb: 10240
vcpus: 1
memory_mb: 1000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-04-16T20:37:57.176592933Z
updated_at: 2025-04-16T20:37:57.176594069Z
price_per_unit: 20000
locked_nano: 12730960000
collected_at: 2025-04-20T00:34:15.461240342Z
app_nodes:
- node_pubkey: BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg
operator_wallet: 7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB
country: DE
region: Hesse
city: Frankfurt am Main
ip: 212.95.45.139
avail_mem_mb: 16000
avail_vcpus: 16
avail_storage_mb: 200000
avail_no_of_port: 20000
max_ports_per_app: 9
price: 20000
offline_minutes: 0
app_contracts:
- uuid: e3d01f25-2b2a-410b-80e3-12f44e474334
package_url: https://registry.detee.ltd/sgx/packages/base_package_2025-04-17_11-01-08.tar.gz
admin_pubkey: H21Shi4iE7vgfjWEQNvzmpmBMJSaiZ17PYUcdNoAoKNc
node_pubkey: BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg
mapped_ports:
- - 27158
- 34500
- - 28667
- 8080
host_ipv4: 212.95.45.139
disk_size_mb: 1000
vcpus: 1
memory_mb: 1000
created_at: 2025-04-21T11:27:28.833236909Z
updated_at: 2025-04-21T11:27:28.833237729Z
price_per_unit: 200000
locked_nano: 121200000
collected_at: 2025-04-21T11:28:24.905665571Z
hratls_pubkey: 7E0F887AA6BB9104EEC1066F454D4C2D9063D676715F55F919D3FBCEDC63240B
public_package_mr_enclave:
- 52
- 183
- 102
- 210
- 251
- 219
- 218
- 140
- 168
- 118
- 10
- 193
- 98
- 240
- 147
- 124
- 240
- 189
- 46
- 95
- 138
- 172
- 15
- 246
- 227
- 114
- 70
- 159
- 232
- 212
- 9
- 234
app_name: diligent-seahorse