change uuid to vm_id and app_id
This commit is contained in:
		
							parent
							
								
									dc8d33d487
								
							
						
					
					
						commit
						67a0b2a1f4
					
				
							
								
								
									
										2
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -1011,7 +1011,7 @@ dependencies = [
 | 
				
			|||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "detee-shared"
 | 
					name = "detee-shared"
 | 
				
			||||||
version = "0.1.0"
 | 
					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#8b38d9a2b3406173fc7de2241c0e316c3e19e2b4"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "bincode 2.0.1",
 | 
					 "bincode 2.0.1",
 | 
				
			||||||
 "prost",
 | 
					 "prost",
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,7 @@ serde_yaml = "0.9.34"
 | 
				
			|||||||
surrealdb = "2.2.2"
 | 
					surrealdb = "2.2.2"
 | 
				
			||||||
tokio = { version = "1.44.2", features = ["macros", "rt-multi-thread"] }
 | 
					tokio = { version = "1.44.2", features = ["macros", "rt-multi-thread"] }
 | 
				
			||||||
tonic = { version = "0.12", features = ["tls"] }
 | 
					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"
 | 
					ed25519-dalek = "2.1.1"
 | 
				
			||||||
bs58 = "0.5.1"
 | 
					bs58 = "0.5.1"
 | 
				
			||||||
tokio-stream = "0.1.17"
 | 
					tokio-stream = "0.1.17"
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										338
									
								
								saved_data.yaml
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										338
									
								
								saved_data.yaml
									
									
									
									
									
								
							@ -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 {
 | 
					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
 | 
					        let contract: Option<Self> = db
 | 
				
			||||||
            .query("select * from $active_app_id;".to_string())
 | 
					            .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?
 | 
					            .await?
 | 
				
			||||||
            .take(0)?;
 | 
					            .take(0)?;
 | 
				
			||||||
        Ok(contract)
 | 
					        Ok(contract)
 | 
				
			||||||
@ -337,7 +337,7 @@ impl ActiveApp {
 | 
				
			|||||||
        db: &Surreal<Client>,
 | 
					        db: &Surreal<Client>,
 | 
				
			||||||
        new_app_res: app_proto::NewAppRes,
 | 
					        new_app_res: app_proto::NewAppRes,
 | 
				
			||||||
    ) -> Result<(), Error> {
 | 
					    ) -> 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,
 | 
					            Some(r) => r,
 | 
				
			||||||
            None => return Ok(()),
 | 
					            None => return Ok(()),
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
@ -349,7 +349,7 @@ impl ActiveApp {
 | 
				
			|||||||
            .collect::<Vec<(u32, u32)>>();
 | 
					            .collect::<Vec<(u32, u32)>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let active_app = Self {
 | 
					        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,
 | 
					            admin: new_app_req.admin,
 | 
				
			||||||
            app_node: new_app_req.app_node,
 | 
					            app_node: new_app_req.app_node,
 | 
				
			||||||
            app_name: new_app_req.app_name,
 | 
					            app_name: new_app_req.app_name,
 | 
				
			||||||
@ -371,7 +371,7 @@ impl ActiveApp {
 | 
				
			|||||||
        let locked_nano = active_app.locked_nano;
 | 
					        let locked_nano = active_app.locked_nano;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let _: Vec<ActiveApp> = db.insert(()).relation(active_app).await?;
 | 
					        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};"))
 | 
					        db.query(format!("UPDATE {ACCOUNT}:{admin_account} SET tmp_locked -= {locked_nano};"))
 | 
				
			||||||
            .await?;
 | 
					            .await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -440,7 +440,7 @@ impl WrappedAppResp {
 | 
				
			|||||||
        if let Some(error_on_newapp_req) = error.take::<Option<db::ErrorFromTable>>(0)? {
 | 
					        if let Some(error_on_newapp_req) = error.take::<Option<db::ErrorFromTable>>(0)? {
 | 
				
			||||||
            if !error_on_newapp_req.error.is_empty() {
 | 
					            if !error_on_newapp_req.error.is_empty() {
 | 
				
			||||||
                let app_daemon_err = NewAppRes {
 | 
					                let app_daemon_err = NewAppRes {
 | 
				
			||||||
                    uuid: app_id.to_string(),
 | 
					                    app_id: app_id.to_string(),
 | 
				
			||||||
                    error: error_on_newapp_req.error,
 | 
					                    error: error_on_newapp_req.error,
 | 
				
			||||||
                    ..Default::default()
 | 
					                    ..Default::default()
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
@ -462,7 +462,7 @@ impl WrappedAppResp {
 | 
				
			|||||||
                            Ok(err_notif) =>{
 | 
					                            Ok(err_notif) =>{
 | 
				
			||||||
                                if err_notif.action == surrealdb::Action::Update && !err_notif.data.error.is_empty(){
 | 
					                                if err_notif.action == surrealdb::Action::Update && !err_notif.data.error.is_empty(){
 | 
				
			||||||
                                let app_daemon_err = NewAppRes {
 | 
					                                let app_daemon_err = NewAppRes {
 | 
				
			||||||
                                        uuid: app_id.to_string(),
 | 
					                                        app_id: app_id.to_string(),
 | 
				
			||||||
                                        error: err_notif.data.error,
 | 
					                                        error: err_notif.data.error,
 | 
				
			||||||
                                        ..Default::default()
 | 
					                                        ..Default::default()
 | 
				
			||||||
                                    };
 | 
					                                    };
 | 
				
			||||||
@ -537,10 +537,10 @@ impl From<ActiveAppWithNode> for ActiveApp {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl ActiveAppWithNode {
 | 
					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
 | 
					        let contract: Option<Self> = db
 | 
				
			||||||
            .query(format!("select * from {ACTIVE_APP} where id = $uuid_input fetch out;"))
 | 
					            .query(format!("select * from {ACTIVE_APP} where id = $app_id_input fetch out;"))
 | 
				
			||||||
            .bind(("uuid_input", RecordId::from((ACTIVE_APP, uuid))))
 | 
					            .bind(("app_id_input", RecordId::from((ACTIVE_APP, app_id))))
 | 
				
			||||||
            .await?
 | 
					            .await?
 | 
				
			||||||
            .take(0)?;
 | 
					            .take(0)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -335,13 +335,13 @@ impl Operator {
 | 
				
			|||||||
pub async fn kick_contract(
 | 
					pub async fn kick_contract(
 | 
				
			||||||
    db: &Surreal<Client>,
 | 
					    db: &Surreal<Client>,
 | 
				
			||||||
    operator_wallet: &str,
 | 
					    operator_wallet: &str,
 | 
				
			||||||
    contract_uuid: &str,
 | 
					    contract_id: &str,
 | 
				
			||||||
    reason: &str,
 | 
					    reason: &str,
 | 
				
			||||||
) -> Result<u64, Error> {
 | 
					) -> Result<u64, Error> {
 | 
				
			||||||
    let (contract_id, operator_id, admin_id, app_or_vm) =
 | 
					    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")
 | 
					            (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")
 | 
					            (active_app.id, active_app.app_node.operator, active_app.admin, "app")
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            return Err(Error::ContractNotFound);
 | 
					            return Err(Error::ContractNotFound);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										18
									
								
								src/db/vm.rs
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										18
									
								
								src/db/vm.rs
									
									
									
									
									
								
							@ -446,10 +446,10 @@ impl ActiveVm {
 | 
				
			|||||||
        self.total_units() * self.price_per_unit
 | 
					        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
 | 
					        let contract: Option<Self> = db
 | 
				
			||||||
            .query("select * from $active_vm_id;".to_string())
 | 
					            .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?
 | 
					            .await?
 | 
				
			||||||
            .take(0)?;
 | 
					            .take(0)?;
 | 
				
			||||||
        Ok(contract)
 | 
					        Ok(contract)
 | 
				
			||||||
@ -523,7 +523,7 @@ impl ActiveVm {
 | 
				
			|||||||
            None => return Ok(()),
 | 
					            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,
 | 
					            Some(vm) => vm,
 | 
				
			||||||
            None => return Ok(()),
 | 
					            None => return Ok(()),
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
@ -751,7 +751,7 @@ impl UpdateVmReq {
 | 
				
			|||||||
    /// returns Some(true) if hw update is needed and got submitted
 | 
					    /// returns Some(true) if hw update is needed and got submitted
 | 
				
			||||||
    /// returns error if something happened with the DB
 | 
					    /// returns error if something happened with the DB
 | 
				
			||||||
    pub async fn request_hw_update(mut self, db: &Surreal<Client>) -> Result<Option<bool>, Error> {
 | 
					    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() {
 | 
					        if contract.is_none() {
 | 
				
			||||||
            return Ok(None);
 | 
					            return Ok(None);
 | 
				
			||||||
@ -842,9 +842,9 @@ impl From<ActiveVm> for DeletedVm {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl 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> =
 | 
					        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)
 | 
					        Ok(contract)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -949,10 +949,10 @@ impl From<ActiveVmWithNode> for ActiveVm {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl ActiveVmWithNode {
 | 
					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
 | 
					        let contract: Option<Self> = db
 | 
				
			||||||
            .query(format!("select * from {ACTIVE_VM} where id = $uuid_input fetch out;"))
 | 
					            .query(format!("select * from {ACTIVE_VM} where id = $vm_id fetch out;"))
 | 
				
			||||||
            .bind(("uuid_input", RecordId::from((ACTIVE_VM, uuid))))
 | 
					            .bind(("vm_id", RecordId::from((ACTIVE_VM, vm_id))))
 | 
				
			||||||
            .await?
 | 
					            .await?
 | 
				
			||||||
            .take(0)?;
 | 
					            .take(0)?;
 | 
				
			||||||
        Ok(contract)
 | 
					        Ok(contract)
 | 
				
			||||||
 | 
				
			|||||||
@ -146,7 +146,7 @@ impl BrainAppDaemon for AppDaemonServer {
 | 
				
			|||||||
                        if !new_app_resp.error.is_empty() {
 | 
					                        if !new_app_resp.error.is_empty() {
 | 
				
			||||||
                            db::NewAppReq::submit_error(
 | 
					                            db::NewAppReq::submit_error(
 | 
				
			||||||
                                &self.db,
 | 
					                                &self.db,
 | 
				
			||||||
                                &new_app_resp.uuid,
 | 
					                                &new_app_resp.app_id,
 | 
				
			||||||
                                new_app_resp.error,
 | 
					                                new_app_resp.error,
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                            .await?;
 | 
					                            .await?;
 | 
				
			||||||
@ -242,7 +242,7 @@ impl BrainAppCli for AppCliServer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    async fn delete_app(&self, req: Request<DelAppReq>) -> Result<Response<Empty>, Status> {
 | 
					    async fn delete_app(&self, req: Request<DelAppReq>) -> Result<Response<Empty>, Status> {
 | 
				
			||||||
        let req = check_sig_from_req(req)?;
 | 
					        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?
 | 
					            .await?
 | 
				
			||||||
            .ok_or(Status::permission_denied("Unauthorized"))?
 | 
					            .ok_or(Status::permission_denied("Unauthorized"))?
 | 
				
			||||||
            .app_node;
 | 
					            .app_node;
 | 
				
			||||||
@ -252,11 +252,11 @@ impl BrainAppCli for AppCliServer {
 | 
				
			|||||||
            return Err(redirect);
 | 
					            return Err(redirect);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        info!("delete_app process starting for {:?}", req);
 | 
					        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 {})),
 | 
					            Ok(()) => Ok(Response::new(Empty {})),
 | 
				
			||||||
            Err(db::Error::AccessDenied) => Err(Status::permission_denied("Unauthorized")),
 | 
					            Err(db::Error::AccessDenied) => Err(Status::permission_denied("Unauthorized")),
 | 
				
			||||||
            Err(e) => {
 | 
					            Err(e) => {
 | 
				
			||||||
                log::error!("Error deleting app contract {}: {e}", &req.uuid);
 | 
					                log::error!("Error deleting app contract {}: {e}", &req.app_id);
 | 
				
			||||||
                Err(Status::unknown(
 | 
					                Err(Status::unknown(
 | 
				
			||||||
                    "Unknown error. Please try again or contact the DeTEE devs team.",
 | 
					                    "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();
 | 
					        let mut app_contracts = Vec::new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if !req.uuid.is_empty() {
 | 
					        if !req.app_id.is_empty() {
 | 
				
			||||||
            if let Some(app_contract) =
 | 
					            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
 | 
					                if app_contract.admin.key().to_string() == req.admin_pubkey
 | 
				
			||||||
                    || app_contract.app_node.operator.key().to_string() == req.admin_pubkey
 | 
					                    || app_contract.app_node.operator.key().to_string() == req.admin_pubkey
 | 
				
			||||||
 | 
				
			|||||||
@ -47,7 +47,7 @@ impl BrainGeneralCli for GeneralCliServer {
 | 
				
			|||||||
    async fn report_node(&self, req: Request<ReportNodeReq>) -> Result<Response<Empty>, Status> {
 | 
					    async fn report_node(&self, req: Request<ReportNodeReq>) -> Result<Response<Empty>, Status> {
 | 
				
			||||||
        let req = check_sig_from_req(req)?;
 | 
					        let req = check_sig_from_req(req)?;
 | 
				
			||||||
        let (account, node, contract_id) =
 | 
					        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)
 | 
					                Some(vm_contract)
 | 
				
			||||||
                    if vm_contract.admin.key().to_string() == req.admin_pubkey
 | 
					                    if vm_contract.admin.key().to_string() == req.admin_pubkey
 | 
				
			||||||
                        && vm_contract.vm_node.id.key().to_string() == req.node_pubkey =>
 | 
					                        && vm_contract.vm_node.id.key().to_string() == req.node_pubkey =>
 | 
				
			||||||
@ -55,7 +55,7 @@ impl BrainGeneralCli for GeneralCliServer {
 | 
				
			|||||||
                    (vm_contract.admin, vm_contract.vm_node.id, vm_contract.id.to_string())
 | 
					                    (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)
 | 
					                        Some(app_contract)
 | 
				
			||||||
                            if app_contract.admin.key().to_string() == req.admin_pubkey
 | 
					                            if app_contract.admin.key().to_string() == req.admin_pubkey
 | 
				
			||||||
                                && app_contract.app_node.id.key().to_string()
 | 
					                                && app_contract.app_node.id.key().to_string()
 | 
				
			||||||
@ -129,8 +129,8 @@ impl BrainGeneralCli for GeneralCliServer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    async fn kick_contract(&self, req: Request<KickReq>) -> Result<Response<KickResp>, Status> {
 | 
					    async fn kick_contract(&self, req: Request<KickReq>) -> Result<Response<KickResp>, Status> {
 | 
				
			||||||
        let req = check_sig_from_req(req)?;
 | 
					        let req = check_sig_from_req(req)?;
 | 
				
			||||||
        log::info!("Kicking contract: {}, by: {}", req.contract_uuid, req.operator_wallet);
 | 
					        log::info!("Kicking contract: {}, by: {}", req.contract_id, req.operator_wallet);
 | 
				
			||||||
        match db::kick_contract(&self.db, &req.operator_wallet, &req.contract_uuid, &req.reason)
 | 
					        match db::kick_contract(&self.db, &req.operator_wallet, &req.contract_id, &req.reason)
 | 
				
			||||||
            .await
 | 
					            .await
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Ok(nano_credits) => Ok(Response::new(KickResp { nano_credits })),
 | 
					            Ok(nano_credits) => Ok(Response::new(KickResp { nano_credits })),
 | 
				
			||||||
 | 
				
			|||||||
@ -54,7 +54,7 @@ impl From<NewVmReq> for db::NewVmReq {
 | 
				
			|||||||
impl From<db::NewVmReq> for NewVmReq {
 | 
					impl From<db::NewVmReq> for NewVmReq {
 | 
				
			||||||
    fn from(new_vm_req: db::NewVmReq) -> Self {
 | 
					    fn from(new_vm_req: db::NewVmReq) -> Self {
 | 
				
			||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            uuid: new_vm_req.id.key().to_string(),
 | 
					            vm_id: new_vm_req.id.key().to_string(),
 | 
				
			||||||
            hostname: new_vm_req.hostname,
 | 
					            hostname: new_vm_req.hostname,
 | 
				
			||||||
            admin_pubkey: new_vm_req.admin.key().to_string(),
 | 
					            admin_pubkey: new_vm_req.admin.key().to_string(),
 | 
				
			||||||
            node_pubkey: new_vm_req.vm_node.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 {
 | 
					impl From<db::WrappedMeasurement> for NewVmResp {
 | 
				
			||||||
    fn from(resp: db::WrappedMeasurement) -> Self {
 | 
					    fn from(resp: db::WrappedMeasurement) -> Self {
 | 
				
			||||||
        match resp {
 | 
					        match resp {
 | 
				
			||||||
            db::WrappedMeasurement::Args(uuid, args) => {
 | 
					            db::WrappedMeasurement::Args(vm_id, args) => {
 | 
				
			||||||
                Self { uuid, error: String::new(), args: Some(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 {
 | 
					impl From<db::WrappedMeasurement> for UpdateVmResp {
 | 
				
			||||||
    fn from(resp: db::WrappedMeasurement) -> Self {
 | 
					    fn from(resp: db::WrappedMeasurement) -> Self {
 | 
				
			||||||
        match resp {
 | 
					        match resp {
 | 
				
			||||||
            db::WrappedMeasurement::Args(uuid, args) => {
 | 
					            db::WrappedMeasurement::Args(vm_id, args) => {
 | 
				
			||||||
                Self { uuid, error: String::new(), args: Some(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 {
 | 
					impl From<UpdateVmReq> for db::UpdateVmReq {
 | 
				
			||||||
    fn from(new_vm_req: UpdateVmReq) -> Self {
 | 
					    fn from(new_vm_req: UpdateVmReq) -> Self {
 | 
				
			||||||
        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)),
 | 
					            admin: RecordId::from((ACCOUNT, new_vm_req.admin_pubkey)),
 | 
				
			||||||
            // vm_node gets modified later, and only if the db::UpdateVmReq is required
 | 
					            // vm_node gets modified later, and only if the db::UpdateVmReq is required
 | 
				
			||||||
            vm_node: RecordId::from((VM_NODE, String::new())),
 | 
					            vm_node: RecordId::from((VM_NODE, String::new())),
 | 
				
			||||||
@ -120,7 +120,7 @@ impl From<UpdateVmReq> for db::UpdateVmReq {
 | 
				
			|||||||
impl From<db::UpdateVmReq> for UpdateVmReq {
 | 
					impl From<db::UpdateVmReq> for UpdateVmReq {
 | 
				
			||||||
    fn from(update_vm_req: db::UpdateVmReq) -> Self {
 | 
					    fn from(update_vm_req: db::UpdateVmReq) -> Self {
 | 
				
			||||||
        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
 | 
					            // daemon does not care about VM hostname
 | 
				
			||||||
            hostname: String::new(),
 | 
					            hostname: String::new(),
 | 
				
			||||||
            admin_pubkey: update_vm_req.admin.key().to_string(),
 | 
					            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 {
 | 
					impl From<db::DeletedVm> for DeleteVmReq {
 | 
				
			||||||
    fn from(delete_vm_req: db::DeletedVm) -> Self {
 | 
					    fn from(delete_vm_req: db::DeletedVm) -> Self {
 | 
				
			||||||
        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(),
 | 
					            admin_pubkey: delete_vm_req.admin.key().to_string(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -167,7 +167,7 @@ impl From<db::ActiveVmWithNode> for VmContract {
 | 
				
			|||||||
            exposed_ports.push(port.0);
 | 
					            exposed_ports.push(port.0);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        VmContract {
 | 
					        VmContract {
 | 
				
			||||||
            uuid: db_c.id.key().to_string(),
 | 
					            vm_id: db_c.id.key().to_string(),
 | 
				
			||||||
            hostname: db_c.hostname.clone(),
 | 
					            hostname: db_c.hostname.clone(),
 | 
				
			||||||
            admin_pubkey: db_c.admin.key().to_string(),
 | 
					            admin_pubkey: db_c.admin.key().to_string(),
 | 
				
			||||||
            node_pubkey: db_c.vm_node.id.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());
 | 
					            Some(hex::decode(value.mr_enclave.clone()).unwrap_or_default());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        AppContract {
 | 
					        AppContract {
 | 
				
			||||||
            uuid: value.id.key().to_string(),
 | 
					            app_id: value.id.key().to_string(),
 | 
				
			||||||
            package_url: value.package_url,
 | 
					            package_url: value.package_url,
 | 
				
			||||||
            admin_pubkey: value.admin.key().to_string(),
 | 
					            admin_pubkey: value.admin.key().to_string(),
 | 
				
			||||||
            node_pubkey: value.app_node.id.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,
 | 
					            package_url: value.package_url,
 | 
				
			||||||
            node_pubkey: value.app_node.key().to_string(),
 | 
					            node_pubkey: value.app_node.key().to_string(),
 | 
				
			||||||
            resource: Some(resource),
 | 
					            resource: Some(resource),
 | 
				
			||||||
            uuid: value.id.key().to_string(),
 | 
					            app_id: value.id.key().to_string(),
 | 
				
			||||||
            admin_pubkey: value.admin.key().to_string(),
 | 
					            admin_pubkey: value.admin.key().to_string(),
 | 
				
			||||||
            price_per_unit: value.price_per_unit,
 | 
					            price_per_unit: value.price_per_unit,
 | 
				
			||||||
            locked_nano: value.locked_nano,
 | 
					            locked_nano: value.locked_nano,
 | 
				
			||||||
@ -378,7 +378,7 @@ impl From<db::NewAppReq> for NewAppReq {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
impl From<db::DeletedApp> for DelAppReq {
 | 
					impl From<db::DeletedApp> for DelAppReq {
 | 
				
			||||||
    fn from(value: db::DeletedApp) -> Self {
 | 
					    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 })
 | 
					            .map(|(h, g)| MappedPort { host_port: *h, guest_port: *g })
 | 
				
			||||||
            .collect();
 | 
					            .collect();
 | 
				
			||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            uuid: val.id.key().to_string(),
 | 
					            app_id: val.id.key().to_string(),
 | 
				
			||||||
            ip_address: val.host_ipv4,
 | 
					            ip_address: val.host_ipv4,
 | 
				
			||||||
            mapped_ports,
 | 
					            mapped_ports,
 | 
				
			||||||
            error: String::new(),
 | 
					            error: String::new(),
 | 
				
			||||||
 | 
				
			|||||||
@ -155,7 +155,7 @@ impl BrainVmDaemon for VmDaemonServer {
 | 
				
			|||||||
                        if !new_vm_resp.error.is_empty() {
 | 
					                        if !new_vm_resp.error.is_empty() {
 | 
				
			||||||
                            db::NewVmReq::submit_error(
 | 
					                            db::NewVmReq::submit_error(
 | 
				
			||||||
                                &self.db,
 | 
					                                &self.db,
 | 
				
			||||||
                                &new_vm_resp.uuid,
 | 
					                                &new_vm_resp.vm_id,
 | 
				
			||||||
                                new_vm_resp.error,
 | 
					                                new_vm_resp.error,
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                            .await?;
 | 
					                            .await?;
 | 
				
			||||||
@ -163,12 +163,12 @@ impl BrainVmDaemon for VmDaemonServer {
 | 
				
			|||||||
                            db::upsert_record(
 | 
					                            db::upsert_record(
 | 
				
			||||||
                                &self.db,
 | 
					                                &self.db,
 | 
				
			||||||
                                "measurement_args",
 | 
					                                "measurement_args",
 | 
				
			||||||
                                &new_vm_resp.uuid,
 | 
					                                &new_vm_resp.vm_id,
 | 
				
			||||||
                                new_vm_resp.args.clone(),
 | 
					                                new_vm_resp.args.clone(),
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                            .await?;
 | 
					                            .await?;
 | 
				
			||||||
                            if let Some(args) = new_vm_resp.args {
 | 
					                            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() {
 | 
					                        if !update_vm_resp.error.is_empty() {
 | 
				
			||||||
                            db::UpdateVmReq::submit_error(
 | 
					                            db::UpdateVmReq::submit_error(
 | 
				
			||||||
                                &self.db,
 | 
					                                &self.db,
 | 
				
			||||||
                                &update_vm_resp.uuid,
 | 
					                                &update_vm_resp.vm_id,
 | 
				
			||||||
                                update_vm_resp.error,
 | 
					                                update_vm_resp.error,
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                            .await?;
 | 
					                            .await?;
 | 
				
			||||||
@ -184,11 +184,11 @@ impl BrainVmDaemon for VmDaemonServer {
 | 
				
			|||||||
                            db::upsert_record(
 | 
					                            db::upsert_record(
 | 
				
			||||||
                                &self.db,
 | 
					                                &self.db,
 | 
				
			||||||
                                "measurement_args",
 | 
					                                "measurement_args",
 | 
				
			||||||
                                &update_vm_resp.uuid,
 | 
					                                &update_vm_resp.vm_id,
 | 
				
			||||||
                                update_vm_resp.args.clone(),
 | 
					                                update_vm_resp.args.clone(),
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                            .await?;
 | 
					                            .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)) => {
 | 
					                    Some(vm_daemon_message::Msg::VmNodeResources(node_resources)) => {
 | 
				
			||||||
@ -286,13 +286,13 @@ impl BrainVmCli for VmCliServer {
 | 
				
			|||||||
        let mut hostname_changed = false;
 | 
					        let mut hostname_changed = false;
 | 
				
			||||||
        if !req.hostname.is_empty() {
 | 
					        if !req.hostname.is_empty() {
 | 
				
			||||||
            hostname_changed =
 | 
					            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?;
 | 
					        let hw_change_submitted = db_req.request_hw_update(&self.db).await?;
 | 
				
			||||||
        if hw_change_submitted.is_none() {
 | 
					        if hw_change_submitted.is_none() {
 | 
				
			||||||
            return Ok(Response::new(UpdateVmResp {
 | 
					            return Ok(Response::new(UpdateVmResp {
 | 
				
			||||||
                uuid: req.uuid.clone(),
 | 
					                vm_id: req.vm_id.clone(),
 | 
				
			||||||
                error: "VM Contract does not exist.".to_string(),
 | 
					                error: "VM Contract does not exist.".to_string(),
 | 
				
			||||||
                args: None,
 | 
					                args: None,
 | 
				
			||||||
            }));
 | 
					            }));
 | 
				
			||||||
@ -301,7 +301,7 @@ impl BrainVmCli for VmCliServer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        if !hostname_changed && !hw_change_needed {
 | 
					        if !hostname_changed && !hw_change_needed {
 | 
				
			||||||
            return Ok(Response::new(UpdateVmResp {
 | 
					            return Ok(Response::new(UpdateVmResp {
 | 
				
			||||||
                uuid: req.uuid.clone(),
 | 
					                vm_id: req.vm_id.clone(),
 | 
				
			||||||
                error: "No modification required".to_string(),
 | 
					                error: "No modification required".to_string(),
 | 
				
			||||||
                args: None,
 | 
					                args: None,
 | 
				
			||||||
            }));
 | 
					            }));
 | 
				
			||||||
@ -310,7 +310,7 @@ impl BrainVmCli for VmCliServer {
 | 
				
			|||||||
        // if only the hostname got changed, return a confirmation
 | 
					        // if only the hostname got changed, return a confirmation
 | 
				
			||||||
        if !hw_change_needed {
 | 
					        if !hw_change_needed {
 | 
				
			||||||
            return Ok(Response::new(UpdateVmResp {
 | 
					            return Ok(Response::new(UpdateVmResp {
 | 
				
			||||||
                uuid: req.uuid.clone(),
 | 
					                vm_id: req.vm_id.clone(),
 | 
				
			||||||
                error: String::new(),
 | 
					                error: String::new(),
 | 
				
			||||||
                args: None,
 | 
					                args: None,
 | 
				
			||||||
            }));
 | 
					            }));
 | 
				
			||||||
@ -339,7 +339,7 @@ impl BrainVmCli for VmCliServer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    async fn extend_vm(&self, req: Request<ExtendVmReq>) -> Result<Response<Empty>, Status> {
 | 
					    async fn extend_vm(&self, req: Request<ExtendVmReq>) -> Result<Response<Empty>, Status> {
 | 
				
			||||||
        let req = check_sig_from_req(req)?;
 | 
					        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
 | 
					            .await
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Ok(()) => Ok(Response::new(Empty {})),
 | 
					            Ok(()) => Ok(Response::new(Empty {})),
 | 
				
			||||||
@ -354,7 +354,7 @@ impl BrainVmCli for VmCliServer {
 | 
				
			|||||||
                Err(Status::failed_precondition(e.to_string()))
 | 
					                Err(Status::failed_precondition(e.to_string()))
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Err(e) => {
 | 
					            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}")))
 | 
					                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> {
 | 
					    async fn delete_vm(&self, req: Request<DeleteVmReq>) -> Result<Response<Empty>, Status> {
 | 
				
			||||||
        let req = check_sig_from_req(req)?;
 | 
					        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?
 | 
					            .await?
 | 
				
			||||||
            .ok_or(Status::permission_denied("Unauthorized"))?
 | 
					            .ok_or(Status::permission_denied("Unauthorized"))?
 | 
				
			||||||
            .vm_node;
 | 
					            .vm_node;
 | 
				
			||||||
@ -371,11 +371,11 @@ impl BrainVmCli for VmCliServer {
 | 
				
			|||||||
            log::info!("redirect: {redirect}");
 | 
					            log::info!("redirect: {redirect}");
 | 
				
			||||||
            return Err(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 {})),
 | 
					            Ok(()) => Ok(Response::new(Empty {})),
 | 
				
			||||||
            Err(db::Error::AccessDenied) => Err(Status::permission_denied("Unauthorized")),
 | 
					            Err(db::Error::AccessDenied) => Err(Status::permission_denied("Unauthorized")),
 | 
				
			||||||
            Err(e) => {
 | 
					            Err(e) => {
 | 
				
			||||||
                log::error!("Error deleting VM contract {}: {e}", &req.uuid);
 | 
					                log::error!("Error deleting VM contract {}: {e}", &req.vm_id);
 | 
				
			||||||
                Err(Status::unknown(
 | 
					                Err(Status::unknown(
 | 
				
			||||||
                    "Unknown error. Please try again or contact the DeTEE devs team.",
 | 
					                    "Unknown error. Please try again or contact the DeTEE devs team.",
 | 
				
			||||||
                ))
 | 
					                ))
 | 
				
			||||||
@ -393,9 +393,9 @@ impl BrainVmCli for VmCliServer {
 | 
				
			|||||||
            req.wallet, req.as_operator
 | 
					            req.wallet, req.as_operator
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        let mut contracts = Vec::new();
 | 
					        let mut contracts = Vec::new();
 | 
				
			||||||
        if !req.uuid.is_empty() {
 | 
					        if !req.vm_id.is_empty() {
 | 
				
			||||||
            if let Some(specific_contract) =
 | 
					            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
 | 
					                if specific_contract.admin.key().to_string() == req.wallet
 | 
				
			||||||
                    || specific_contract.vm_node.operator.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();
 | 
					        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.error.is_empty());
 | 
				
			||||||
    assert!(new_app_resp.uuid.len() == 40);
 | 
					    assert!(new_app_resp.app_id.len() == 40);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ok(new_app_resp)
 | 
					    Ok(new_app_resp)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -127,7 +127,7 @@ pub async fn daemon_engine(
 | 
				
			|||||||
                    .collect::<Vec<MappedPort>>();
 | 
					                    .collect::<Vec<MappedPort>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                let res_data = NewAppRes {
 | 
					                let res_data = NewAppRes {
 | 
				
			||||||
                    uuid: new_app_req.uuid,
 | 
					                    app_id: new_app_req.app_id,
 | 
				
			||||||
                    mapped_ports,
 | 
					                    mapped_ports,
 | 
				
			||||||
                    ip_address: "127.0.0.1".to_string(),
 | 
					                    ip_address: "127.0.0.1".to_string(),
 | 
				
			||||||
                    error: new_app_err.clone().unwrap_or_default(),
 | 
					                    error: new_app_err.clone().unwrap_or_default(),
 | 
				
			||||||
@ -139,7 +139,7 @@ pub async fn daemon_engine(
 | 
				
			|||||||
                tx.send(res).await?;
 | 
					                tx.send(res).await?;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Some(app_proto::brain_message_app::Msg::DeleteAppReq(del_app_req)) => {
 | 
					            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!(),
 | 
					            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();
 | 
					    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.error.is_empty());
 | 
				
			||||||
    assert!(new_vm_resp.uuid.len() == 40);
 | 
					    assert!(new_vm_resp.vm_id.len() == 40);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // wait for update db
 | 
					    // wait for update db
 | 
				
			||||||
    tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
 | 
					    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 {
 | 
					    if let Some(new_vm_req) = vm_req_db {
 | 
				
			||||||
        panic!("New VM request found in DB: {:?}", new_vm_req);
 | 
					        panic!("New VM request found in DB: {:?}", new_vm_req);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let active_vm_op: Option<db::ActiveVm> =
 | 
					    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"))?;
 | 
					    let active_vm = active_vm_op.ok_or(anyhow!("Not found active vm in db"))?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ok(active_vm.id.key().to_string())
 | 
					    Ok(active_vm.id.key().to_string())
 | 
				
			||||||
@ -159,7 +159,7 @@ pub async fn user_list_vm_contracts(
 | 
				
			|||||||
    brain_channel: &Channel,
 | 
					    brain_channel: &Channel,
 | 
				
			||||||
    key: &Key,
 | 
					    key: &Key,
 | 
				
			||||||
    as_operator: bool,
 | 
					    as_operator: bool,
 | 
				
			||||||
    uuid: &str,
 | 
					    vm_id: &str,
 | 
				
			||||||
) -> Result<Vec<vm_proto::VmContract>> {
 | 
					) -> Result<Vec<vm_proto::VmContract>> {
 | 
				
			||||||
    let mut cli_client = BrainVmCliClient::new(brain_channel.clone());
 | 
					    let mut cli_client = BrainVmCliClient::new(brain_channel.clone());
 | 
				
			||||||
    let mut stream = cli_client
 | 
					    let mut stream = cli_client
 | 
				
			||||||
@ -167,7 +167,7 @@ pub async fn user_list_vm_contracts(
 | 
				
			|||||||
            key.sign_request(vm_proto::ListVmContractsReq {
 | 
					            key.sign_request(vm_proto::ListVmContractsReq {
 | 
				
			||||||
                wallet: key.pubkey.clone(),
 | 
					                wallet: key.pubkey.clone(),
 | 
				
			||||||
                as_operator,
 | 
					                as_operator,
 | 
				
			||||||
                uuid: uuid.to_string(),
 | 
					                vm_id: vm_id.to_string(),
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
            .unwrap(),
 | 
					            .unwrap(),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
				
			|||||||
@ -128,7 +128,7 @@ pub async fn daemon_engine(
 | 
				
			|||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                let new_vm_resp = vm_proto::NewVmResp {
 | 
					                let new_vm_resp = vm_proto::NewVmResp {
 | 
				
			||||||
                    uuid: new_vm_req.uuid.clone(),
 | 
					                    vm_id: new_vm_req.vm_id.clone(),
 | 
				
			||||||
                    args,
 | 
					                    args,
 | 
				
			||||||
                    error: new_vm_err.clone().unwrap_or_default(),
 | 
					                    error: new_vm_err.clone().unwrap_or_default(),
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
@ -142,7 +142,7 @@ pub async fn daemon_engine(
 | 
				
			|||||||
                todo!()
 | 
					                todo!()
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Some(vm_proto::brain_vm_message::Msg::DeleteVm(del_vm_req)) => {
 | 
					            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!(),
 | 
					            None => todo!(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@ async fn test_new_app_db_tx() {
 | 
				
			|||||||
                ports: vec![ 8080 ],
 | 
					                ports: vec![ 8080 ],
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        uuid: "".to_string(),
 | 
					        app_id: "".to_string(),
 | 
				
			||||||
        admin_pubkey: "H21Shi4iE7vgfjWEQNvzmpmBMJSaiZ17PYUcdNoAoKNc".to_string(),
 | 
					        admin_pubkey: "H21Shi4iE7vgfjWEQNvzmpmBMJSaiZ17PYUcdNoAoKNc".to_string(),
 | 
				
			||||||
        price_per_unit: 200000,
 | 
					        price_per_unit: 200000,
 | 
				
			||||||
        locked_nano: 152400000,
 | 
					        locked_nano: 152400000,
 | 
				
			||||||
 | 
				
			|||||||
@ -57,7 +57,7 @@ async fn test_app_creation() {
 | 
				
			|||||||
        .unwrap()
 | 
					        .unwrap()
 | 
				
			||||||
        .into_inner();
 | 
					        .into_inner();
 | 
				
			||||||
    let active_app =
 | 
					    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());
 | 
					    assert!(active_app.is_some());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let daemon_key_02 =
 | 
					    let daemon_key_02 =
 | 
				
			||||||
@ -73,7 +73,7 @@ async fn test_app_creation() {
 | 
				
			|||||||
    assert!(!new_app_resp.error.is_empty());
 | 
					    assert!(!new_app_resp.error.is_empty());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let app_req_db =
 | 
					    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());
 | 
					    assert!(!app_req_db.unwrap().error.is_empty());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -90,7 +90,7 @@ async fn test_app_creation() {
 | 
				
			|||||||
    assert!(new_app_resp.error.is_empty());
 | 
					    assert!(new_app_resp.error.is_empty());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let active_app =
 | 
					    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());
 | 
					    assert!(active_app.is_some());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tokio::time::sleep(std::time::Duration::from_millis(300)).await;
 | 
					    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 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 _ = client_app_cli.delete_app(key.sign_request(del_app_req).unwrap()).await.unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let key_02 = Key::new();
 | 
					    let key_02 = Key::new();
 | 
				
			||||||
@ -152,7 +152,7 @@ async fn test_app_deletion() {
 | 
				
			|||||||
    // delete random app
 | 
					    // delete random app
 | 
				
			||||||
    let mut del_app_req = DelAppReq {
 | 
					    let mut del_app_req = DelAppReq {
 | 
				
			||||||
        admin_pubkey: key_02.pubkey.clone(),
 | 
					        admin_pubkey: key_02.pubkey.clone(),
 | 
				
			||||||
        uuid: "9ae3VH8nJg2i8pqTQ6mJtvYuS2kd9n1XLLco8GUPfT95".to_string(),
 | 
					        app_id: "9ae3VH8nJg2i8pqTQ6mJtvYuS2kd9n1XLLco8GUPfT95".to_string(),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let del_err = client_app_cli
 | 
					    let del_err = client_app_cli
 | 
				
			||||||
@ -163,7 +163,7 @@ async fn test_app_deletion() {
 | 
				
			|||||||
    assert_eq!(del_err.message(), "Unauthorized");
 | 
					    assert_eq!(del_err.message(), "Unauthorized");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let new_app_res_02 = create_new_app(&key, &daemon_key, &brain_channel).await.unwrap();
 | 
					    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
 | 
					    let del_err = client_app_cli
 | 
				
			||||||
        .delete_app(key_02.sign_request(del_app_req.clone()).unwrap())
 | 
					        .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 new_app_res_03 = create_new_app(&key_03, &daemon_key, &brain_channel).await.unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let del_app_req =
 | 
					    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 _ = 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();
 | 
					    let acc: db::Account = db.select((ACCOUNT, key_03.pubkey.clone())).await.unwrap().unwrap();
 | 
				
			||||||
    assert_eq!(acc.balance, 10 * TOKEN_DECIMAL);
 | 
					    assert_eq!(acc.balance, 10 * TOKEN_DECIMAL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let deleted_app =
 | 
					    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());
 | 
					    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();
 | 
					        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.error.is_empty());
 | 
				
			||||||
    assert!(new_app_resp.uuid.len() == 40);
 | 
					    assert!(new_app_resp.app_id.len() == 40);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[tokio::test]
 | 
					#[tokio::test]
 | 
				
			||||||
 | 
				
			|||||||
@ -129,7 +129,7 @@ async fn test_report_node() {
 | 
				
			|||||||
    let key = Key::new();
 | 
					    let key = Key::new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let report_error =
 | 
					    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);
 | 
					    log::info!("Report error: {:?}", report_error);
 | 
				
			||||||
    assert!(report_error.to_string().contains("No contract found by this ID."));
 | 
					    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 db_conn = prepare_test_db().await.unwrap();
 | 
				
			||||||
    let contract_uuid = "5af49a714c64a82ef50e574b023b2a0ef0405ed";
 | 
					    let contract_id = "5af49a714c64a82ef50e574b023b2a0ef0405ed";
 | 
				
			||||||
    let operator_wallet = "7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB";
 | 
					    let operator_wallet = "7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB";
 | 
				
			||||||
    let reason = "'; THROW 'Injected error'; --"; // sql injection query
 | 
					    let reason = "'; THROW 'Injected error'; --"; // sql injection query
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let kick_response =
 | 
					    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;
 | 
					            .await;
 | 
				
			||||||
    match kick_response {
 | 
					    match kick_response {
 | 
				
			||||||
        Ok(refund_amount) => {
 | 
					        Ok(refund_amount) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -70,7 +70,7 @@ async fn test_vm_creation() {
 | 
				
			|||||||
    assert!(!new_vm_resp.error.is_empty());
 | 
					    assert!(!new_vm_resp.error.is_empty());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let vm_req_db: Option<db::NewVmReq> =
 | 
					    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 {
 | 
					    if let Some(new_vm_req) = vm_req_db {
 | 
				
			||||||
        assert!(!new_vm_req.error.is_empty());
 | 
					        assert!(!new_vm_req.error.is_empty());
 | 
				
			||||||
@ -88,7 +88,7 @@ async fn test_vm_creation() {
 | 
				
			|||||||
    assert!(new_vm_resp.error.is_empty());
 | 
					    assert!(new_vm_resp.error.is_empty());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
 | 
					    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());
 | 
					    assert!(active_vm.is_some());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let acc_db: db::Account = db.select((ACCOUNT, key.pubkey.clone())).await.unwrap().unwrap();
 | 
					    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();
 | 
					    let key = Key::new();
 | 
				
			||||||
    airdrop(&brain_channel, &key.pubkey, 10).await.unwrap();
 | 
					    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 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 _ = client_vm_cli.delete_vm(key.sign_request(del_app_req).unwrap()).await.unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let key_02 = Key::new();
 | 
					    let key_02 = Key::new();
 | 
				
			||||||
@ -151,7 +151,7 @@ async fn test_vm_deletion() {
 | 
				
			|||||||
    // delete random vm
 | 
					    // delete random vm
 | 
				
			||||||
    let mut del_vm_req = DeleteVmReq {
 | 
					    let mut del_vm_req = DeleteVmReq {
 | 
				
			||||||
        admin_pubkey: key_02.pubkey.clone(),
 | 
					        admin_pubkey: key_02.pubkey.clone(),
 | 
				
			||||||
        uuid: "9ae3VH8nJg2i8pqTQ6mJtvYuS2kd9n1XLLco8GUPfT95".to_string(),
 | 
					        vm_id: "9ae3VH8nJg2i8pqTQ6mJtvYuS2kd9n1XLLco8GUPfT95".to_string(),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let del_err = client_vm_cli
 | 
					    let del_err = client_vm_cli
 | 
				
			||||||
@ -161,8 +161,8 @@ async fn test_vm_deletion() {
 | 
				
			|||||||
        .unwrap();
 | 
					        .unwrap();
 | 
				
			||||||
    assert_eq!(del_err.message(), "Unauthorized");
 | 
					    assert_eq!(del_err.message(), "Unauthorized");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let new_vm_uuid_02 = create_new_vm(&db, &key, &daemon_key, &brain_channel).await.unwrap();
 | 
					    let new_vm_id_02 = create_new_vm(&db, &key, &daemon_key, &brain_channel).await.unwrap();
 | 
				
			||||||
    del_vm_req.uuid = new_vm_uuid_02;
 | 
					    del_vm_req.vm_id = new_vm_id_02;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let del_err = client_vm_cli
 | 
					    let del_err = client_vm_cli
 | 
				
			||||||
        .delete_vm(key_02.sign_request(del_vm_req.clone()).unwrap())
 | 
					        .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();
 | 
					    let key_03 = Key::new();
 | 
				
			||||||
    airdrop(&brain_channel, &key_03.pubkey, 10).await.unwrap();
 | 
					    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 =
 | 
					    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 _ = 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();
 | 
					    let acc: db::Account = db.select((ACCOUNT, key_03.pubkey.clone())).await.unwrap().unwrap();
 | 
				
			||||||
    assert_eq!(acc.balance, 10 * TOKEN_DECIMAL);
 | 
					    assert_eq!(acc.balance, 10 * TOKEN_DECIMAL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let deleted_vm =
 | 
					    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());
 | 
					    assert!(deleted_vm.is_some());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -201,7 +201,7 @@ async fn test_list_vm_contracts() {
 | 
				
			|||||||
    let pubkey = key.pubkey.clone();
 | 
					    let pubkey = key.pubkey.clone();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let req_data =
 | 
					    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 =
 | 
					    let mut grpc_stream =
 | 
				
			||||||
        client.list_vm_contracts(key.sign_request(req_data).unwrap()).await.unwrap().into_inner();
 | 
					        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 {
 | 
					    let mut req = ExtendVmReq {
 | 
				
			||||||
        admin_pubkey: key.pubkey.clone(),
 | 
					        admin_pubkey: key.pubkey.clone(),
 | 
				
			||||||
        uuid: "foooooooo".to_string(),
 | 
					        vm_id: "foooooooo".to_string(),
 | 
				
			||||||
        locked_nano: u64::MAX,
 | 
					        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();
 | 
					        cli_client.extend_vm(key.sign_request(req.clone()).unwrap()).await.err().unwrap();
 | 
				
			||||||
    assert!(err_precondition.to_string().contains("Contract not found"));
 | 
					    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 =
 | 
					    let err_precondition =
 | 
				
			||||||
        cli_client.extend_vm(key.sign_request(req.clone()).unwrap()).await.err().unwrap();
 | 
					        cli_client.extend_vm(key.sign_request(req.clone()).unwrap()).await.err().unwrap();
 | 
				
			||||||
    assert!(err_precondition.to_string().contains("Insufficient funds"));
 | 
					    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();
 | 
					        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.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.is_some());
 | 
				
			||||||
    assert!(new_vm_resp.args.unwrap().exposed_ports.len() == 3);
 | 
					    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
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user