switch from LP to credits

As part of open sourcing the software product, we should consider that
loyalty points are not the best language. Switching to "credits" makes
sense from a lot of points of view.

At the same time, this change allows an achitectural change towards
slots. Slots allow daemon resources to get booked based on the HW ratio
configured in the daemon config.
This commit is contained in:
ghe0 2025-06-24 01:45:07 +03:00
parent ee1b12f85f
commit ddba7a4f95
Signed by: ghe0
GPG Key ID: 451028EE56A0FBB4
16 changed files with 457 additions and 536 deletions

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=surreal_brain_app#0b195b4589e4ec689af7ddca27dc051716ecee78" source = "git+ssh://git@gitea.detee.cloud/testnet/proto?branch=credits-v2#6d377926408953e8da2c0f4c6625d4fb90ba7652"
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 = "surreal_brain_app" } detee-shared = { git = "ssh://git@gitea.detee.cloud/testnet/proto", branch = "credits-v2" }
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"

@ -1,80 +1,12 @@
# SPDX-License-Identifier: Apache-2.0
accounts: accounts:
DXXkYSnhP3ijsHYxkedcuMomEyc122WaAbkDX7SaGuUS: fY3NNjvFTeR1FBh5nXV3ujX7zZqrm3eBUWGEiG75TK1:
balance: 20293420000 balance: 1000000000
tmp_locked: 0 tmp_locked: 0
kicked_for: [] kicked_for: []
last_kick: 1970-01-01T00:00:00Z last_kick: 1970-01-01T00:00:00Z
banned_by: [] banned_by: []
FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL: FBMWVqME3t1i4R6zWyDQGUuiTeruZ1TxLhTmhaEcFypZ:
balance: 25949200000 balance: 181560160000
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 tmp_locked: 0
kicked_for: [] kicked_for: []
last_kick: 1970-01-01T00:00:00Z last_kick: 1970-01-01T00:00:00Z
@ -91,352 +23,316 @@ accounts:
kicked_for: [] kicked_for: []
last_kick: 1970-01-01T00:00:00Z last_kick: 1970-01-01T00:00:00Z
banned_by: [] banned_by: []
fY3NNjvFTeR1FBh5nXV3ujX7zZqrm3eBUWGEiG75TK1: 49JBVzmgsQbUURHzAWax2gxo6jmukqbEQzP97YeeNQyu:
balance: 1000000000 balance: 1076960680000
tmp_locked: 0 tmp_locked: 0
kicked_for: [] kicked_for: []
last_kick: 1970-01-01T00:00:00Z last_kick: 1970-01-01T00:00:00Z
banned_by: [] banned_by: []
FBMWVqME3t1i4R6zWyDQGUuiTeruZ1TxLhTmhaEcFypZ: HQyGWpiteHbxjszngZvmiX7ZFZAmF6nFjEraBa1M6bbM:
balance: 181560160000 balance: 979410300000
tmp_locked: 0 tmp_locked: 0
kicked_for: [] kicked_for: []
last_kick: 1970-01-01T00:00:00Z last_kick: 1970-01-01T00:00:00Z
banned_by: [] banned_by: []
DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX: 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 balance: 74660380000
tmp_locked: 0 tmp_locked: 0
kicked_for: [] kicked_for: []
last_kick: 1970-01-01T00:00:00Z last_kick: 1970-01-01T00:00:00Z
banned_by: [] 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: operators:
BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS:
escrow: 5096692000000
email: first_on_detee@proton.me
banned_users: []
vm_nodes:
- HiyMp21zaBVbRCjDsD5hEjQnHeHv4e1gpUR6pVfHTKqv
- 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
- Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
- 4QbUXDM915RUFnHm3NiysLXFLk1WRGZvABwLNzx4tTEW
- DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
app_nodes: []
x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK: x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK:
escrow: 5499700480000 escrow: 5489633280000
email: gheo@detee.ltd email: gheo@detee.ltd
banned_users: [] banned_users: []
vm_nodes: vm_nodes:
- 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f - 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f
- 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9 - 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9
app_nodes: []
BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS:
escrow: 5091906400000
email: first_on_detee@proton.me
banned_users: []
vm_nodes:
- DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
- 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
- Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
app_nodes: [] app_nodes: []
7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB: 7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB:
escrow: 888888888899999 escrow: 5500000000000
email: "" email: nmohammed@detee.ltd
banned_users: [] banned_users: []
vm_nodes: [] vm_nodes: []
app_nodes: app_nodes:
- BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg - BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg
vm_nodes: vm_nodes:
- public_key: 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9 - public_key: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
operator_wallet: x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
country: GB country: FR
region: England region: Île-de-France
city: London city: Paris
ip: 173.234.17.2 ip: 156.146.63.215
avail_mem_mb: 26000 avail_mem_mb: 117000
avail_vcpus: 28 avail_vcpus: 40
avail_storage_gbs: 680 avail_storage_gbs: 410
avail_ipv4: 2 avail_ipv4: 2
avail_ipv6: 65516 avail_ipv6: 0
avail_ports: 19999 avail_ports: 20000
max_ports_per_vm: 5 max_ports_per_vm: 5
price: 20000 price: 20000
reports: {} reports: {}
offline_minutes: 0 offline_minutes: 0
- public_key: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu - public_key: 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
country: FR country: US
region: Île-de-France region: California
city: Paris city: San Jose
ip: 156.146.63.215 ip: 149.36.48.99
avail_mem_mb: 123000 avail_mem_mb: 121000
avail_vcpus: 46 avail_vcpus: 42
avail_storage_gbs: 440 avail_storage_gbs: 400
avail_ipv4: 2 avail_ipv4: 23
avail_ipv6: 0 avail_ipv6: 0
avail_ports: 20000 avail_ports: 20000
max_ports_per_vm: 5 max_ports_per_vm: 5
price: 20000 price: 20000
reports: {} reports: {}
offline_minutes: 0 offline_minutes: 0
- public_key: 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f - public_key: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
operator_wallet: x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
country: CA country: CA
region: Quebec region: British Columbia
city: Montréal city: Vancouver
ip: 184.107.169.199 ip: 149.22.95.1
avail_mem_mb: 30000 avail_mem_mb: 106400
avail_vcpus: 31 avail_vcpus: 42
avail_storage_gbs: 700 avail_storage_gbs: 400
avail_ipv4: 0 avail_ipv4: 25
avail_ipv6: 0 avail_ipv6: 0
avail_ports: 20000 avail_ports: 19999
max_ports_per_vm: 5 max_ports_per_vm: 5
price: 18000 price: 20000
reports: {} reports: {}
offline_minutes: 0 offline_minutes: 0
- public_key: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb - public_key: 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS operator_wallet: x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK
country: CA country: CA
region: British Columbia region: Quebec
city: Vancouver city: Montréal
ip: 149.22.95.1 ip: 184.107.169.199
avail_mem_mb: 109000 avail_mem_mb: 29000
avail_vcpus: 45 avail_vcpus: 30
avail_storage_gbs: 400 avail_storage_gbs: 700
avail_ipv4: 25 avail_ipv4: 0
avail_ipv6: 0 avail_ipv6: 0
avail_ports: 20000 avail_ports: 19999
max_ports_per_vm: 5 max_ports_per_vm: 5
price: 20000 price: 18000
reports: {} reports: {}
offline_minutes: 0 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
vm_contracts: vm_contracts:
- uuid: 958165e3-dea8-407d-8c42-dd17002ef79c - uuid: dbe09a11-0bcf-472e-9f27-9a4939ea2226
hostname: detee-landing-fr hostname: detee-fr
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu node_pubkey: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
exposed_ports: [] exposed_ports: []
public_ipv4: 156.146.63.216 public_ipv4: 156.146.63.217
public_ipv6: "" public_ipv6: ''
disk_size_gb: 10 disk_size_gb: 10
vcpus: 2 vcpus: 4
memory_mb: 3000 memory_mb: 4000
kernel_sha: 3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151 kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: 3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-02-28T23:19:41.769423466Z created_at: 2025-05-16T11:07:53.903282009Z
updated_at: 2025-04-12T12:11:58.516768949Z updated_at: 2025-05-16T11:07:53.903282959Z
price_per_unit: 20000 price_per_unit: 20000
locked_nano: 14875500000 locked_nano: 24513120000
collected_at: 2025-04-20T00:34:15.461165181Z collected_at: 2025-06-26T11:32:59.521517733Z
- uuid: e807a2fd-cf90-4a14-bc3a-89ce6dc59033 - uuid: 338312387c6e4e5ebec015277d27c21d
hostname: detee-landing-gb hostname: sofenty-staging
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9 node_pubkey: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
exposed_ports: [] exposed_ports: []
public_ipv4: 173.234.136.154 public_ipv4: 149.22.95.3
public_ipv6: "" public_ipv6: ''
disk_size_gb: 10 disk_size_gb: 10
vcpus: 2 vcpus: 2
memory_mb: 3000 memory_mb: 4000
kernel_sha: 3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151 kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: 3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-03-06T19:51:39.595163157Z created_at: 2025-06-12T23:20:23.797184848Z
updated_at: 2025-03-06T19:51:39.595163842Z updated_at: 2025-06-12T23:20:23.797185855Z
price_per_unit: 20000 price_per_unit: 20000
locked_nano: 14875500000 locked_nano: 17703920000
collected_at: 2025-04-20T00:34:15.461181545Z collected_at: 2025-06-26T11:32:59.521538185Z
- uuid: 23094406-2307-4332-a642-acee718d0186 - uuid: 46656273dc964fdeaec2fd1efd49fc12
hostname: heroic-door hostname: sofenty-scraper-bot
admin_pubkey: DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9 node_pubkey: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
exposed_ports: exposed_ports:
- 38288 - 36057
public_ipv4: "" public_ipv4: ''
public_ipv6: "" public_ipv6: ''
disk_size_gb: 10 disk_size_gb: 10
vcpus: 1 vcpus: 2
memory_mb: 1000 memory_mb: 4000
kernel_sha: 14e225e4aaf84cc2e0b5f64206121186ddebc4b378b886da3b2f7515dfd41692 kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: 03ce24dbbe917fdd4f6347e61036805ddbdded5044c272bab188ef9333093bee dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-03-12T16:28:24.749161605Z created_at: 2025-06-17T11:12:18.659422501Z
updated_at: 2025-03-12T16:28:24.749162477Z updated_at: 2025-06-17T11:12:18.659423285Z
price_per_unit: 20000 price_per_unit: 20000
locked_nano: 14134140000 locked_nano: 14299320000
collected_at: 2025-04-20T00:34:15.461191231Z collected_at: 2025-06-26T11:32:59.521547200Z
- uuid: 1f49a71c-f68c-4c64-a82e-f50e0ba0b574 - uuid: 1b3365a15fe64b8aa283bb7883c62e09
hostname: astromech-wrench hostname: detee-us
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
node_pubkey: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb node_pubkey: 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
exposed_ports: [] exposed_ports: []
public_ipv4: 149.22.95.2 public_ipv4: 149.36.48.100
public_ipv6: "" public_ipv6: ''
disk_size_gb: 10 disk_size_gb: 10
vcpus: 2 vcpus: 4
memory_mb: 3000 memory_mb: 4000
kernel_sha: 3a68709138bed09c16671949cf1f03acee95a08381ba84fc70fb586001fa6767 kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: 0bb93443f65c9f4379ed469f94794f5c1bf14d8905b0b2c56a125df4a9ebe83e dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-03-20T14:40:25.557753393Z created_at: 2025-06-18T10:51:17.699206021Z
updated_at: 2025-03-20T14:40:25.557754242Z updated_at: 2025-06-18T10:51:17.699206835Z
price_per_unit: 20000 price_per_unit: 20000
locked_nano: 11865620000 locked_nano: 26552160000
collected_at: 2025-04-20T00:34:15.461201690Z collected_at: 2025-06-26T11:32:59.521554160Z
- uuid: 16577f1c-9867-4a17-80a8-6cf0490f1270 - uuid: b11ad0fcfc194f5490d64f5a72574dc8
hostname: sofenty hostname: brain-backups
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL admin_pubkey: 45Pyv9hRfub43NyRrYv95MhZs1Wrm8sj3RhBvA3F1Bvr
node_pubkey: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu node_pubkey: 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f
exposed_ports: [] exposed_ports:
public_ipv4: 156.146.63.217 - 38175
public_ipv6: "" public_ipv4: ''
disk_size_gb: 10 public_ipv6: ''
vcpus: 2 disk_size_gb: 30
memory_mb: 3000 vcpus: 1
kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542 memory_mb: 1000
dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45 kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
created_at: 2025-04-07T22:57:57.646151746Z dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
updated_at: 2025-04-07T22:57:57.646152630Z created_at: 2025-06-18T13:59:30.713579315Z
price_per_unit: 20000 updated_at: 2025-06-18T13:59:30.713580515Z
locked_nano: 11867500000 price_per_unit: 20000
collected_at: 2025-04-20T00:34:15.461211040Z locked_nano: 11638260000
- uuid: 4b6e25ca-87ac-478b-8f16-aa8f5c44c704 collected_at: 2025-06-26T11:32:59.521562057Z
hostname: cloaked-mailbox - uuid: 89237736b97047beac3611e25e26408e
admin_pubkey: DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX hostname: brain-staging
node_pubkey: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb admin_pubkey: 45Pyv9hRfub43NyRrYv95MhZs1Wrm8sj3RhBvA3F1Bvr
exposed_ports: [] node_pubkey: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
public_ipv4: 149.22.95.2 exposed_ports: []
public_ipv6: "" public_ipv4: 156.146.63.216
disk_size_gb: 30 public_ipv6: ''
vcpus: 1 disk_size_gb: 20
memory_mb: 1000 vcpus: 2
kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542 memory_mb: 4000
dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45 kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
created_at: 2025-04-12T13:44:56.957037550Z dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
updated_at: 2025-04-12T13:44:56.957038546Z created_at: 2025-06-18T14:00:48.016735075Z
price_per_unit: 20000 updated_at: 2025-06-18T14:00:48.016736647Z
locked_nano: 11177760000 price_per_unit: 20000
collected_at: 2025-04-20T00:34:15.461219779Z locked_nano: 32466740000
- uuid: eb1a13ed-d782-4b71-8860-73540129cb7d collected_at: 2025-06-26T11:32:59.521568755Z
hostname: twenty
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: 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: 10
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: app_nodes:
- node_pubkey: BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg - node_pubkey: BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg
operator_wallet: 7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB operator_wallet: 7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB
country: DE country: DE
region: Hesse region: Hesse
city: Frankfurt am Main city: Frankfurt am Main
ip: 212.95.45.139 ip: 212.95.45.139
avail_mem_mb: 16000 avail_mem_mb: 16000
avail_vcpus: 16 avail_vcpus: 16
avail_storage_mb: 200000 avail_storage_mb: 200000
avail_no_of_port: 20000 avail_no_of_port: 20000
max_ports_per_app: 9 max_ports_per_app: 9
price: 20000 price: 20000
offline_minutes: 0 reports: {}
app_contracts: offline_minutes: 0
- uuid: e3d01f25-2b2a-410b-80e3-12f44e474334 app_contracts: []
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

@ -12,7 +12,7 @@ server="$1"
exit 1 exit 1
} }
[[ "$server" == "testnet" ]] && server="root@prod-brain-1" [[ "$server" == "testnet" ]] && server="brain-testnet"
[[ "$server" == "staging" ]] && server="brain-staging" [[ "$server" == "staging" ]] && server="brain-staging"
cargo build --release --bin brain cargo build --release --bin brain

@ -50,7 +50,6 @@ pub const ID_ALPHABET: [char; 62] = [
]; ];
pub const TOKEN_DECIMAL: u64 = 1_000_000_000; pub const TOKEN_DECIMAL: u64 = 1_000_000_000;
pub const MIN_ESCROW: u64 = 5000 * TOKEN_DECIMAL;
pub const APP_DAEMON_TIMEOUT: u64 = 20; pub const APP_DAEMON_TIMEOUT: u64 = 20;
pub const VM_DAEMON_TIMEOUT: u64 = 10; pub const VM_DAEMON_TIMEOUT: u64 = 10;

@ -1,7 +1,7 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
use super::Error; use super::Error;
use crate::constants::{ACCOUNT, BAN, KICK, MIN_ESCROW, VM_NODE}; use crate::constants::{ACCOUNT, BAN, KICK, TOKEN_DECIMAL, VM_NODE};
use crate::db::prelude::*; use crate::db::prelude::*;
use crate::old_brain; use crate::old_brain;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -61,9 +61,7 @@ impl Account {
email: &str, email: &str,
escrow: u64, escrow: u64,
) -> Result<(), Error> { ) -> Result<(), Error> {
if escrow < MIN_ESCROW { let escrow = escrow * TOKEN_DECIMAL;
return Err(Error::MinimalEscrow);
}
let mut op_account = Self::get(db, wallet).await?; let mut op_account = Self::get(db, wallet).await?;
let op_total_balance = op_account.balance.saturating_add(op_account.escrow); let op_total_balance = op_account.balance.saturating_add(op_account.escrow);
if op_total_balance < escrow { if op_total_balance < escrow {

@ -5,7 +5,7 @@ pub mod general;
pub mod vm; pub mod vm;
use crate::constants::{ use crate::constants::{
APP_NODE, DB_SCHEMA_FILES, DEFAULT_ENDPOINT, DELETED_APP, DELETED_VM, MIN_ESCROW, NEW_APP_REQ, APP_NODE, DB_SCHEMA_FILES, DEFAULT_ENDPOINT, DELETED_APP, DELETED_VM, NEW_APP_REQ,
NEW_VM_REQ, UPDATE_VM_REQ, NEW_VM_REQ, UPDATE_VM_REQ,
}; };
use crate::old_brain; use crate::old_brain;
@ -33,8 +33,6 @@ pub enum Error {
UnknownTable(String), UnknownTable(String),
#[error("Daemon channel got closed: {0}")] #[error("Daemon channel got closed: {0}")]
AppDaemonConnection(#[from] tokio::sync::mpsc::error::SendError<AppDaemonMsg>), AppDaemonConnection(#[from] tokio::sync::mpsc::error::SendError<AppDaemonMsg>),
#[error("Minimum escrow amount is {MIN_ESCROW}")]
MinimalEscrow,
#[error("Insufficient funds, deposit more tokens")] #[error("Insufficient funds, deposit more tokens")]
InsufficientFunds, InsufficientFunds,
#[error("Contract not found")] #[error("Contract not found")]

@ -26,9 +26,9 @@ pub struct VmNode {
pub region: String, pub region: String,
pub city: String, pub city: String,
pub ip: String, pub ip: String,
pub avail_mem_mb: u32, pub avail_mem_mib: u32,
pub avail_vcpus: u32, pub avail_vcpus: u32,
pub avail_storage_gbs: u32, pub avail_storage_mib: u32,
pub avail_ipv4: u32, pub avail_ipv4: u32,
pub avail_ipv6: u32, pub avail_ipv6: u32,
pub avail_ports: u32, pub avail_ports: u32,
@ -59,9 +59,9 @@ impl VmNode {
#[derive(Serialize)] #[derive(Serialize)]
pub struct VmNodeResources { pub struct VmNodeResources {
pub avail_mem_mb: u32, pub avail_mem_mib: u32,
pub avail_vcpus: u32, pub avail_vcpus: u32,
pub avail_storage_gbs: u32, pub avail_storage_mib: u32,
pub avail_ipv4: u32, pub avail_ipv4: u32,
pub avail_ipv6: u32, pub avail_ipv6: u32,
pub avail_ports: u32, pub avail_ports: u32,
@ -83,9 +83,9 @@ pub struct VmNodeWithReports {
pub region: String, pub region: String,
pub city: String, pub city: String,
pub ip: String, pub ip: String,
pub avail_mem_mb: u32, pub avail_mem_mib: u64,
pub avail_vcpus: u32, pub avail_vcpus: u64,
pub avail_storage_gbs: u32, pub avail_storage_mib: u64,
pub avail_ipv4: u32, pub avail_ipv4: u32,
pub avail_ipv6: u32, pub avail_ipv6: u32,
pub avail_ports: u32, pub avail_ports: u32,
@ -106,15 +106,15 @@ impl VmNodeWithReports {
avail_ipv4 >= {} && avail_ipv4 >= {} &&
avail_ipv6 >= {} && avail_ipv6 >= {} &&
avail_vcpus >= {} && avail_vcpus >= {} &&
avail_mem_mb >= {} && avail_mem_mib >= {} &&
avail_storage_gbs >= {}\n", avail_storage_mib >= {}\n",
filters.free_ports, filters.free_ports,
filters.free_ports, filters.free_ports,
filters.offers_ipv4 as u32, filters.offers_ipv4 as u32,
filters.offers_ipv6 as u32, filters.offers_ipv6 as u32,
filters.vcpus, filters.vcpus,
filters.memory_mb, filters.memory_mib,
filters.storage_gb filters.storage_mib
); );
if !filters.city.is_empty() { if !filters.city.is_empty() {
query += &format!("&& city = '{}' ", filters.city); query += &format!("&& city = '{}' ", filters.city);
@ -170,9 +170,9 @@ pub struct NewVmReq {
pub extra_ports: Vec<u32>, pub extra_ports: Vec<u32>,
pub public_ipv4: bool, pub public_ipv4: bool,
pub public_ipv6: bool, pub public_ipv6: bool,
pub disk_size_gb: u32, pub disk_size_mib: u32,
pub vcpus: u32, pub vcpus: u32,
pub memory_mb: u32, pub memory_mib: u32,
pub dtrfs_url: String, pub dtrfs_url: String,
pub dtrfs_sha: String, pub dtrfs_sha: String,
pub kernel_sha: String, pub kernel_sha: String,
@ -266,7 +266,7 @@ impl NewVmReq {
->$new_vm_req ->$new_vm_req
->$vm_node ->$vm_node
CONTENT {{ CONTENT {{
created_at: time::now(), hostname: $hostname, vcpus: {}, memory_mb: {}, disk_size_gb: {}, created_at: time::now(), hostname: $hostname, vcpus: {}, memory_mib: {}, disk_size_mib: {},
extra_ports: {:?}, public_ipv4: {}, public_ipv6: {}, extra_ports: {:?}, public_ipv4: {}, public_ipv6: {},
dtrfs_url: $dtrfs_url, dtrfs_sha: $dtrfs_sha, kernel_url: $kernel_url, kernel_sha: $kernel_sha, dtrfs_url: $dtrfs_url, dtrfs_sha: $dtrfs_sha, kernel_url: $kernel_url, kernel_sha: $kernel_sha,
price_per_unit: {}, locked_nano: {locked_nano}, error: '' price_per_unit: {}, locked_nano: {locked_nano}, error: ''
@ -274,8 +274,8 @@ impl NewVmReq {
COMMIT TRANSACTION;", COMMIT TRANSACTION;",
self.vcpus, self.vcpus,
self.memory_mb, self.memory_mib,
self.disk_size_gb, self.disk_size_mib,
self.extra_ports, self.extra_ports,
self.public_ipv4, self.public_ipv4,
self.public_ipv6, self.public_ipv6,
@ -334,7 +334,7 @@ impl WrappedMeasurement {
_ => NEW_VM_REQ, _ => NEW_VM_REQ,
}; };
let mut resp = db let mut resp = db
.query(format!("live select error from {table} where id = {NEW_VM_REQ}:{vm_id};")) .query(format!("live select error from {table} where id = {table}:{vm_id};"))
.query(format!( .query(format!(
"live select * from measurement_args where id = measurement_args:{vm_id};" "live select * from measurement_args where id = measurement_args:{vm_id};"
)) ))
@ -404,9 +404,9 @@ pub struct ActiveVm {
pub mapped_ports: Vec<(u32, u32)>, pub mapped_ports: Vec<(u32, u32)>,
pub public_ipv4: String, pub public_ipv4: String,
pub public_ipv6: String, pub public_ipv6: String,
pub disk_size_gb: u32, pub disk_size_mib: u32,
pub vcpus: u32, pub vcpus: u32,
pub memory_mb: u32, pub memory_mib: u32,
pub dtrfs_sha: String, pub dtrfs_sha: String,
pub kernel_sha: String, pub kernel_sha: String,
pub created_at: Datetime, pub created_at: Datetime,
@ -422,8 +422,8 @@ impl ActiveVm {
// I tried, but this can be done better. // I tried, but this can be done better.
// Storage cost should also be based on tier // Storage cost should also be based on tier
(self.vcpus as u64 * 10) (self.vcpus as u64 * 10)
+ ((self.memory_mb + 256) as u64 / 200) + ((self.memory_mib + 256) as u64 / 200)
+ (self.disk_size_gb as u64 / 10) + (self.disk_size_mib as u64 / 10)
+ (!self.public_ipv4.is_empty() as u64 * 10) + (!self.public_ipv4.is_empty() as u64 * 10)
} }
@ -483,9 +483,9 @@ impl ActiveVm {
mapped_ports, mapped_ports,
public_ipv4, public_ipv4,
public_ipv6, public_ipv6,
disk_size_gb: new_vm_req.disk_size_gb, disk_size_mib: new_vm_req.disk_size_mib,
vcpus: new_vm_req.vcpus, vcpus: new_vm_req.vcpus,
memory_mb: new_vm_req.memory_mb, memory_mib: new_vm_req.memory_mib,
dtrfs_sha: new_vm_req.dtrfs_sha, dtrfs_sha: new_vm_req.dtrfs_sha,
kernel_sha: new_vm_req.kernel_sha, kernel_sha: new_vm_req.kernel_sha,
created_at: new_vm_req.created_at.clone(), created_at: new_vm_req.created_at.clone(),
@ -517,11 +517,11 @@ impl ActiveVm {
if update_vm_req.vcpus > 0 { if update_vm_req.vcpus > 0 {
active_vm.vcpus = update_vm_req.vcpus; active_vm.vcpus = update_vm_req.vcpus;
} }
if update_vm_req.memory_mb > 0 { if update_vm_req.memory_mib > 0 {
active_vm.memory_mb = update_vm_req.memory_mb; active_vm.memory_mib = update_vm_req.memory_mib;
} }
if update_vm_req.disk_size_gb > 0 { if update_vm_req.disk_size_mib > 0 {
active_vm.disk_size_gb = update_vm_req.disk_size_gb; active_vm.disk_size_mib = update_vm_req.disk_size_mib;
} }
if !update_vm_req.dtrfs_sha.is_empty() && !update_vm_req.kernel_sha.is_empty() { if !update_vm_req.dtrfs_sha.is_empty() && !update_vm_req.kernel_sha.is_empty() {
active_vm.dtrfs_sha = update_vm_req.dtrfs_sha; active_vm.dtrfs_sha = update_vm_req.dtrfs_sha;
@ -670,9 +670,9 @@ pub struct UpdateVmReq {
pub admin: RecordId, pub admin: RecordId,
#[serde(rename = "out")] #[serde(rename = "out")]
pub vm_node: RecordId, pub vm_node: RecordId,
pub disk_size_gb: u32, pub disk_size_mib: u32,
pub vcpus: u32, pub vcpus: u32,
pub memory_mb: u32, pub memory_mib: u32,
pub dtrfs_url: String, pub dtrfs_url: String,
pub dtrfs_sha: String, pub dtrfs_sha: String,
pub kernel_sha: String, pub kernel_sha: String,
@ -688,9 +688,9 @@ pub struct UpdateVmEvent {
pub admin: RecordId, pub admin: RecordId,
#[serde(rename = "out")] #[serde(rename = "out")]
pub vm_node: RecordId, pub vm_node: RecordId,
pub disk_size_gb: u32, pub disk_size_mib: u32,
pub vcpus: u32, pub vcpus: u32,
pub memory_mb: u32, pub memory_mib: u32,
pub dtrfs_url: String, pub dtrfs_url: String,
pub dtrfs_sha: String, pub dtrfs_sha: String,
pub kernel_sha: String, pub kernel_sha: String,
@ -704,9 +704,9 @@ impl From<UpdateVmReq> for UpdateVmEvent {
vm_id: RecordId::from((VM_UPDATE_EVENT, update_vm_req.id.key().to_string())), vm_id: RecordId::from((VM_UPDATE_EVENT, update_vm_req.id.key().to_string())),
admin: update_vm_req.admin, admin: update_vm_req.admin,
vm_node: update_vm_req.vm_node, vm_node: update_vm_req.vm_node,
disk_size_gb: update_vm_req.disk_size_gb, disk_size_mib: update_vm_req.disk_size_mib,
vcpus: update_vm_req.vcpus, vcpus: update_vm_req.vcpus,
memory_mb: update_vm_req.memory_mb, memory_mib: update_vm_req.memory_mib,
dtrfs_url: update_vm_req.dtrfs_url, dtrfs_url: update_vm_req.dtrfs_url,
dtrfs_sha: update_vm_req.dtrfs_sha, dtrfs_sha: update_vm_req.dtrfs_sha,
kernel_sha: update_vm_req.kernel_sha, kernel_sha: update_vm_req.kernel_sha,
@ -743,17 +743,32 @@ impl UpdateVmReq {
return Ok(None); return Ok(None);
} }
let contract = contract.unwrap(); let contract = contract.unwrap();
// this is needed cause TryFrom does not support await let mem_per_cpu = contract.memory_mib / contract.vcpus;
let disk_per_cpu = contract.disk_size_mib / contract.vcpus;
self.vm_node = contract.vm_node; self.vm_node = contract.vm_node;
if !((self.vcpus != 0 && contract.vcpus != self.vcpus) if !((self.vcpus != 0 && contract.vcpus != self.vcpus)
|| (self.memory_mb != 0 && contract.memory_mb != self.memory_mb) || (self.memory_mib != 0 && contract.memory_mib != self.memory_mib)
|| (!self.dtrfs_sha.is_empty() && contract.dtrfs_sha != self.dtrfs_sha) || (!self.dtrfs_sha.is_empty() && contract.dtrfs_sha != self.dtrfs_sha)
|| (self.disk_size_gb != 0 && contract.disk_size_gb != self.disk_size_gb)) || (self.disk_size_mib != 0 && contract.disk_size_mib != self.disk_size_mib))
{ {
return Ok(Some(false)); return Ok(Some(false));
} }
// Do not allow user to unbalance node resources
if self.vcpus == 0 {
self.vcpus = self.memory_mib / mem_per_cpu;
}
if self.memory_mib == 0 {
self.memory_mib = self.vcpus * mem_per_cpu;
}
if self.vcpus == 0 {
self.vcpus = self.disk_size_mib / disk_per_cpu;
}
if self.disk_size_mib == 0 {
self.disk_size_mib = self.vcpus * disk_per_cpu;
}
let _: Vec<Self> = db.insert(UPDATE_VM_REQ).relation(self).await?; let _: Vec<Self> = db.insert(UPDATE_VM_REQ).relation(self).await?;
Ok(Some(true)) Ok(Some(true))
} }
@ -764,6 +779,7 @@ impl UpdateVmReq {
error: String, error: String,
} }
let _: Option<Self> = db.update((UPDATE_VM_REQ, id)).merge(UpdateVmError { error }).await?; let _: Option<Self> = db.update((UPDATE_VM_REQ, id)).merge(UpdateVmError { error }).await?;
let _: Option<Self> = db.delete((UPDATE_VM_REQ, id)).await?;
Ok(()) Ok(())
} }
} }
@ -779,9 +795,9 @@ pub struct DeletedVm {
pub mapped_ports: Vec<(u32, u32)>, pub mapped_ports: Vec<(u32, u32)>,
pub public_ipv4: String, pub public_ipv4: String,
pub public_ipv6: String, pub public_ipv6: String,
pub disk_size_gb: u32, pub disk_size_mib: u32,
pub vcpus: u32, pub vcpus: u32,
pub memory_mb: u32, pub memory_mib: u32,
pub dtrfs_sha: String, pub dtrfs_sha: String,
pub kernel_sha: String, pub kernel_sha: String,
pub created_at: Datetime, pub created_at: Datetime,
@ -799,9 +815,9 @@ impl From<ActiveVm> for DeletedVm {
mapped_ports: active_vm.mapped_ports, mapped_ports: active_vm.mapped_ports,
public_ipv4: active_vm.public_ipv4, public_ipv4: active_vm.public_ipv4,
public_ipv6: active_vm.public_ipv6, public_ipv6: active_vm.public_ipv6,
disk_size_gb: active_vm.disk_size_gb, disk_size_mib: active_vm.disk_size_mib,
vcpus: active_vm.vcpus, vcpus: active_vm.vcpus,
memory_mb: active_vm.memory_mb, memory_mib: active_vm.memory_mib,
dtrfs_sha: active_vm.dtrfs_sha, dtrfs_sha: active_vm.dtrfs_sha,
kernel_sha: active_vm.kernel_sha, kernel_sha: active_vm.kernel_sha,
created_at: active_vm.created_at, created_at: active_vm.created_at,
@ -862,8 +878,8 @@ impl DeletedVm {
// I tried, but this can be done better. // I tried, but this can be done better.
// Storage cost should also be based on tier // Storage cost should also be based on tier
(self.vcpus as u64 * 10) (self.vcpus as u64 * 10)
+ ((self.memory_mb + 256) as u64 / 200) + ((self.memory_mib + 256) as u64 / 200)
+ (self.disk_size_gb as u64 / 10) + (self.disk_size_mib as u64 / 10)
+ (!self.public_ipv4.is_empty() as u64 * 10) + (!self.public_ipv4.is_empty() as u64 * 10)
} }
@ -884,9 +900,9 @@ pub struct ActiveVmWithNode {
pub mapped_ports: Vec<(u32, u32)>, pub mapped_ports: Vec<(u32, u32)>,
pub public_ipv4: String, pub public_ipv4: String,
pub public_ipv6: String, pub public_ipv6: String,
pub disk_size_gb: u32, pub disk_size_mib: u32,
pub vcpus: u32, pub vcpus: u32,
pub memory_mb: u32, pub memory_mib: u32,
pub dtrfs_sha: String, pub dtrfs_sha: String,
pub kernel_sha: String, pub kernel_sha: String,
pub created_at: Datetime, pub created_at: Datetime,
@ -905,9 +921,9 @@ impl From<ActiveVmWithNode> for ActiveVm {
mapped_ports: val.mapped_ports, mapped_ports: val.mapped_ports,
public_ipv4: val.public_ipv4, public_ipv4: val.public_ipv4,
public_ipv6: val.public_ipv6, public_ipv6: val.public_ipv6,
disk_size_gb: val.disk_size_gb, disk_size_mib: val.disk_size_mib,
vcpus: val.vcpus, vcpus: val.vcpus,
memory_mb: val.memory_mb, memory_mib: val.memory_mib,
dtrfs_sha: val.dtrfs_sha, dtrfs_sha: val.dtrfs_sha,
kernel_sha: val.kernel_sha, kernel_sha: val.kernel_sha,
created_at: val.created_at, created_at: val.created_at,
@ -974,8 +990,8 @@ impl ActiveVmWithNode {
// I tried, but this can be done better. // I tried, but this can be done better.
// Storage cost should also be based on tier // Storage cost should also be based on tier
(self.vcpus as u64 * 10) (self.vcpus as u64 * 10)
+ ((self.memory_mb + 256) as u64 / 200) + ((self.memory_mib + 256) as u64 / 200)
+ (self.disk_size_gb as u64 / 10) + (self.disk_size_mib as u64 / 1024 / 10)
+ (!self.public_ipv4.is_empty() as u64 * 10) + (!self.public_ipv4.is_empty() as u64 * 10)
} }
@ -1005,9 +1021,9 @@ impl From<&old_brain::BrainData> for Vec<VmNode> {
region: old_node.region.clone(), region: old_node.region.clone(),
city: old_node.city.clone(), city: old_node.city.clone(),
ip: old_node.ip.clone(), ip: old_node.ip.clone(),
avail_mem_mb: old_node.avail_mem_mb, avail_mem_mib: old_node.avail_mem_mb,
avail_vcpus: old_node.avail_vcpus, avail_vcpus: old_node.avail_vcpus,
avail_storage_gbs: old_node.avail_storage_gbs, avail_storage_mib: old_node.avail_storage_gbs,
avail_ipv4: old_node.avail_ipv4, avail_ipv4: old_node.avail_ipv4,
avail_ipv6: old_node.avail_ipv6, avail_ipv6: old_node.avail_ipv6,
avail_ports: old_node.avail_ports, avail_ports: old_node.avail_ports,
@ -1037,9 +1053,9 @@ impl From<&old_brain::BrainData> for Vec<ActiveVm> {
mapped_ports, mapped_ports,
public_ipv4: old_c.public_ipv4.clone(), public_ipv4: old_c.public_ipv4.clone(),
public_ipv6: old_c.public_ipv6.clone(), public_ipv6: old_c.public_ipv6.clone(),
disk_size_gb: old_c.disk_size_gb, disk_size_mib: old_c.disk_size_gb,
vcpus: old_c.vcpus, vcpus: old_c.vcpus,
memory_mb: old_c.memory_mb, memory_mib: old_c.memory_mb,
dtrfs_sha: old_c.dtrfs_sha.clone(), dtrfs_sha: old_c.dtrfs_sha.clone(),
kernel_sha: old_c.kernel_sha.clone(), kernel_sha: old_c.kernel_sha.clone(),
price_per_unit: old_c.price_per_unit, price_per_unit: old_c.price_per_unit,

@ -115,7 +115,7 @@ impl BrainGeneralCli for GeneralCliServer {
log::info!("Regitering new operator: {req:?}"); log::info!("Regitering new operator: {req:?}");
match db::Account::operator_reg(&self.db, &req.pubkey, &req.email, req.escrow).await { match db::Account::operator_reg(&self.db, &req.pubkey, &req.email, req.escrow).await {
Ok(()) => Ok(Response::new(Empty {})), Ok(()) => Ok(Response::new(Empty {})),
Err(e) if matches!(e, db::Error::InsufficientFunds | db::Error::MinimalEscrow) => { Err(e) if matches!(e, db::Error::InsufficientFunds) => {
Err(Status::failed_precondition(e.to_string())) Err(Status::failed_precondition(e.to_string()))
} }
Err(e) => { Err(e) => {
@ -133,7 +133,7 @@ impl BrainGeneralCli for GeneralCliServer {
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_uuid, &req.reason)
.await .await
{ {
Ok(nano_lp) => Ok(Response::new(KickResp { nano_lp })), Ok(nano_credits) => Ok(Response::new(KickResp { nano_credits })),
Err(e) Err(e)
if matches!( if matches!(
e, e,

@ -36,9 +36,9 @@ impl From<NewVmReq> for db::NewVmReq {
extra_ports: new_vm_req.extra_ports, extra_ports: new_vm_req.extra_ports,
public_ipv4: new_vm_req.public_ipv4, public_ipv4: new_vm_req.public_ipv4,
public_ipv6: new_vm_req.public_ipv6, public_ipv6: new_vm_req.public_ipv6,
disk_size_gb: new_vm_req.disk_size_gb, disk_size_mib: new_vm_req.disk_size_mib,
vcpus: new_vm_req.vcpus, vcpus: new_vm_req.vcpus,
memory_mb: new_vm_req.memory_mb, memory_mib: new_vm_req.memory_mib,
kernel_url: new_vm_req.kernel_url, kernel_url: new_vm_req.kernel_url,
kernel_sha: new_vm_req.kernel_sha, kernel_sha: new_vm_req.kernel_sha,
dtrfs_url: new_vm_req.dtrfs_url, dtrfs_url: new_vm_req.dtrfs_url,
@ -61,9 +61,9 @@ impl From<db::NewVmReq> for NewVmReq {
extra_ports: new_vm_req.extra_ports, extra_ports: new_vm_req.extra_ports,
public_ipv4: new_vm_req.public_ipv4, public_ipv4: new_vm_req.public_ipv4,
public_ipv6: new_vm_req.public_ipv6, public_ipv6: new_vm_req.public_ipv6,
disk_size_gb: new_vm_req.disk_size_gb, disk_size_mib: new_vm_req.disk_size_mib,
vcpus: new_vm_req.vcpus, vcpus: new_vm_req.vcpus,
memory_mb: new_vm_req.memory_mb, memory_mib: new_vm_req.memory_mib,
kernel_url: new_vm_req.kernel_url, kernel_url: new_vm_req.kernel_url,
kernel_sha: new_vm_req.kernel_sha, kernel_sha: new_vm_req.kernel_sha,
dtrfs_url: new_vm_req.dtrfs_url, dtrfs_url: new_vm_req.dtrfs_url,
@ -104,9 +104,9 @@ impl From<UpdateVmReq> for db::UpdateVmReq {
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())),
disk_size_gb: new_vm_req.disk_size_gb, disk_size_mib: new_vm_req.disk_size_mib,
vcpus: new_vm_req.vcpus, vcpus: new_vm_req.vcpus,
memory_mb: new_vm_req.memory_mb, memory_mib: new_vm_req.memory_mib,
kernel_url: new_vm_req.kernel_url, kernel_url: new_vm_req.kernel_url,
kernel_sha: new_vm_req.kernel_sha, kernel_sha: new_vm_req.kernel_sha,
dtrfs_url: new_vm_req.dtrfs_url, dtrfs_url: new_vm_req.dtrfs_url,
@ -124,9 +124,9 @@ impl From<db::UpdateVmReq> for UpdateVmReq {
// 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(),
disk_size_gb: update_vm_req.disk_size_gb, disk_size_mib: update_vm_req.disk_size_mib,
vcpus: update_vm_req.vcpus, vcpus: update_vm_req.vcpus,
memory_mb: update_vm_req.memory_mb, memory_mib: update_vm_req.memory_mib,
kernel_url: update_vm_req.kernel_url, kernel_url: update_vm_req.kernel_url,
kernel_sha: update_vm_req.kernel_sha, kernel_sha: update_vm_req.kernel_sha,
dtrfs_url: update_vm_req.dtrfs_url, dtrfs_url: update_vm_req.dtrfs_url,
@ -176,9 +176,9 @@ impl From<db::ActiveVmWithNode> for VmContract {
"{}, {}, {}", "{}, {}, {}",
db_c.vm_node.city, db_c.vm_node.region, db_c.vm_node.country db_c.vm_node.city, db_c.vm_node.region, db_c.vm_node.country
), ),
memory_mb: db_c.memory_mb, memory_mb: db_c.memory_mib,
vcpus: db_c.vcpus, vcpus: db_c.vcpus,
disk_size_gb: db_c.disk_size_gb, disk_size_gb: db_c.disk_size_mib,
mapped_ports: db_c mapped_ports: db_c
.mapped_ports .mapped_ports
.iter() .iter()
@ -230,6 +230,11 @@ impl From<db::VmNodeWithReports> for VmNodeListResp {
ip: vm_node.ip, ip: vm_node.ip,
reports: vm_node.reports.iter().map(|n| n.reason.clone()).collect(), reports: vm_node.reports.iter().map(|n| n.reason.clone()).collect(),
price: vm_node.price, price: vm_node.price,
vcpus: vm_node.avail_vcpus,
memory_mib: vm_node.avail_mem_mib,
disk_mib: vm_node.avail_storage_mib,
public_ipv4: vm_node.avail_ipv4 > 0,
public_ipv6: vm_node.avail_ipv6 > 0,
} }
} }
} }
@ -252,9 +257,9 @@ impl From<db::AppNodeWithReports> for AppNodeListResp {
impl From<VmNodeResources> for db::VmNodeResources { impl From<VmNodeResources> for db::VmNodeResources {
fn from(res: VmNodeResources) -> Self { fn from(res: VmNodeResources) -> Self {
Self { Self {
avail_mem_mb: res.avail_memory_mb, avail_mem_mib: res.avail_memory_mib,
avail_vcpus: res.avail_vcpus, avail_vcpus: res.avail_vcpus,
avail_storage_gbs: res.avail_storage_gb, avail_storage_mib: res.avail_storage_mib,
avail_ipv4: res.avail_ipv4, avail_ipv4: res.avail_ipv4,
avail_ipv6: res.avail_ipv6, avail_ipv6: res.avail_ipv6,
avail_ports: res.avail_ports, avail_ports: res.avail_ports,

@ -51,9 +51,9 @@ impl BrainVmDaemon for VmDaemonServer {
city: req.city, city: req.city,
ip: req.main_ip, ip: req.main_ip,
price: req.price, price: req.price,
avail_mem_mb: 0, avail_mem_mib: 0,
avail_vcpus: 0, avail_vcpus: 0,
avail_storage_gbs: 0, avail_storage_mib: 0,
avail_ipv4: 0, avail_ipv4: 0,
avail_ipv6: 0, avail_ipv6: 0,
avail_ports: 0, avail_ports: 0,
@ -273,10 +273,17 @@ impl BrainVmCli for VmCliServer {
let db_req: db::UpdateVmReq = req.clone().into(); let db_req: db::UpdateVmReq = req.clone().into();
if let Some(redirect) = db::check_pubsub_node(&self.db, db_req.vm_node.clone()).await? { println!("The node is {}", db_req.vm_node);
log::info!("redirect: {redirect}");
return Err(redirect); // TODO: vm_node is not known at this point. It is populated by `request_hw_update`.
} // As such, the pubsub node cannot be checked at this stage. This code should be moved,
// however we are not working on the redirect mechanic at the moment
//
// if let Some(redirect) = db::check_pubsub_node(&self.db, db_req.vm_node.clone()).await? {
// log::info!("redirect: {redirect}");
// return Err(redirect);
// }
let id = db_req.id.key().to_string(); let id = db_req.id.key().to_string();
let mut hostname_changed = false; let mut hostname_changed = false;

@ -6,7 +6,7 @@ DEFINE FUNCTION OVERWRITE fn::vm_price_per_minute(
LET $vm = (select * from $vm_id)[0]; LET $vm = (select * from $vm_id)[0];
LET $ip_price = IF $vm.public_ipv4.len() > 0 { 10 } ELSE { 0 }; LET $ip_price = IF $vm.public_ipv4.len() > 0 { 10 } ELSE { 0 };
RETURN ( RETURN (
($vm.vcpus * 10) + (($vm.memory_mb + 256) / 200) + ($vm.disk_size_gb / 10) + $ip_price) ($vm.vcpus * 10) + (($vm.memory_mib + 256) / 200) + ($vm.disk_size_mib / 1024 / 10) + $ip_price)
* $vm.price_per_unit; * $vm.price_per_unit;
}; };

@ -13,9 +13,9 @@ DEFINE FIELD country ON TABLE vm_node TYPE string;
DEFINE FIELD region ON TABLE vm_node TYPE string; DEFINE FIELD region ON TABLE vm_node TYPE string;
DEFINE FIELD city ON TABLE vm_node TYPE string; DEFINE FIELD city ON TABLE vm_node TYPE string;
DEFINE FIELD ip ON TABLE vm_node TYPE string; DEFINE FIELD ip ON TABLE vm_node TYPE string;
DEFINE FIELD avail_mem_mb ON TABLE vm_node TYPE int; DEFINE FIELD avail_mem_mib ON TABLE vm_node TYPE int;
DEFINE FIELD avail_vcpus ON TABLE vm_node TYPE int; DEFINE FIELD avail_vcpus ON TABLE vm_node TYPE int;
DEFINE FIELD avail_storage_gbs ON TABLE vm_node TYPE int; DEFINE FIELD avail_storage_mib ON TABLE vm_node TYPE int;
DEFINE FIELD avail_ipv4 ON TABLE vm_node TYPE int; DEFINE FIELD avail_ipv4 ON TABLE vm_node TYPE int;
DEFINE FIELD avail_ipv6 ON TABLE vm_node TYPE int; DEFINE FIELD avail_ipv6 ON TABLE vm_node TYPE int;
DEFINE FIELD avail_ports ON TABLE vm_node TYPE int; DEFINE FIELD avail_ports ON TABLE vm_node TYPE int;
@ -29,9 +29,9 @@ DEFINE FIELD hostname ON TABLE new_vm_req TYPE string;
DEFINE FIELD extra_ports ON TABLE new_vm_req TYPE array<int>; DEFINE FIELD extra_ports ON TABLE new_vm_req TYPE array<int>;
DEFINE FIELD public_ipv4 ON TABLE new_vm_req TYPE bool; DEFINE FIELD public_ipv4 ON TABLE new_vm_req TYPE bool;
DEFINE FIELD public_ipv6 ON TABLE new_vm_req TYPE bool; DEFINE FIELD public_ipv6 ON TABLE new_vm_req TYPE bool;
DEFINE FIELD disk_size_gb ON TABLE new_vm_req TYPE int; DEFINE FIELD disk_size_mib ON TABLE new_vm_req TYPE int;
DEFINE FIELD vcpus ON TABLE new_vm_req TYPE int; DEFINE FIELD vcpus ON TABLE new_vm_req TYPE int;
DEFINE FIELD memory_mb ON TABLE new_vm_req TYPE int; DEFINE FIELD memory_mib ON TABLE new_vm_req TYPE int;
DEFINE FIELD dtrfs_sha ON TABLE new_vm_req TYPE string; DEFINE FIELD dtrfs_sha ON TABLE new_vm_req TYPE string;
DEFINE FIELD dtrfs_url ON TABLE new_vm_req TYPE string; DEFINE FIELD dtrfs_url ON TABLE new_vm_req TYPE string;
DEFINE FIELD kernel_sha ON TABLE new_vm_req TYPE string; DEFINE FIELD kernel_sha ON TABLE new_vm_req TYPE string;
@ -46,9 +46,9 @@ DEFINE FIELD hostname ON TABLE active_vm TYPE string;
DEFINE FIELD mapped_ports ON TABLE active_vm TYPE array<[int, int]>; DEFINE FIELD mapped_ports ON TABLE active_vm TYPE array<[int, int]>;
DEFINE FIELD public_ipv4 ON TABLE active_vm TYPE string; DEFINE FIELD public_ipv4 ON TABLE active_vm TYPE string;
DEFINE FIELD public_ipv6 ON TABLE active_vm TYPE string; DEFINE FIELD public_ipv6 ON TABLE active_vm TYPE string;
DEFINE FIELD disk_size_gb ON TABLE active_vm TYPE int; DEFINE FIELD disk_size_mib ON TABLE active_vm TYPE int;
DEFINE FIELD vcpus ON TABLE active_vm TYPE int; DEFINE FIELD vcpus ON TABLE active_vm TYPE int;
DEFINE FIELD memory_mb ON TABLE active_vm TYPE int; DEFINE FIELD memory_mib ON TABLE active_vm TYPE int;
DEFINE FIELD dtrfs_sha ON TABLE active_vm TYPE string; DEFINE FIELD dtrfs_sha ON TABLE active_vm TYPE string;
DEFINE FIELD kernel_sha ON TABLE active_vm TYPE string; DEFINE FIELD kernel_sha ON TABLE active_vm TYPE string;
DEFINE FIELD created_at ON TABLE active_vm TYPE datetime; DEFINE FIELD created_at ON TABLE active_vm TYPE datetime;
@ -58,8 +58,8 @@ DEFINE FIELD collected_at ON TABLE active_vm TYPE datetime;
DEFINE TABLE update_vm_req TYPE RELATION FROM account TO vm_node SCHEMAFULL; DEFINE TABLE update_vm_req TYPE RELATION FROM account TO vm_node SCHEMAFULL;
DEFINE FIELD vcpus ON TABLE update_vm_req TYPE int; DEFINE FIELD vcpus ON TABLE update_vm_req TYPE int;
DEFINE FIELD memory_mb ON TABLE update_vm_req TYPE int; DEFINE FIELD memory_mib ON TABLE update_vm_req TYPE int;
DEFINE FIELD disk_size_gb ON TABLE update_vm_req TYPE int; DEFINE FIELD disk_size_mib ON TABLE update_vm_req TYPE int;
DEFINE FIELD dtrfs_sha ON TABLE update_vm_req TYPE string; DEFINE FIELD dtrfs_sha ON TABLE update_vm_req TYPE string;
DEFINE FIELD dtrfs_url ON TABLE update_vm_req TYPE string; DEFINE FIELD dtrfs_url ON TABLE update_vm_req TYPE string;
DEFINE FIELD kernel_sha ON TABLE update_vm_req TYPE string; DEFINE FIELD kernel_sha ON TABLE update_vm_req TYPE string;
@ -72,9 +72,9 @@ DEFINE FIELD hostname ON TABLE deleted_vm TYPE string;
DEFINE FIELD mapped_ports ON TABLE deleted_vm TYPE array<[int, int]>; DEFINE FIELD mapped_ports ON TABLE deleted_vm TYPE array<[int, int]>;
DEFINE FIELD public_ipv4 ON TABLE deleted_vm TYPE string; DEFINE FIELD public_ipv4 ON TABLE deleted_vm TYPE string;
DEFINE FIELD public_ipv6 ON TABLE deleted_vm TYPE string; DEFINE FIELD public_ipv6 ON TABLE deleted_vm TYPE string;
DEFINE FIELD disk_size_gb ON TABLE deleted_vm TYPE int; DEFINE FIELD disk_size_mib ON TABLE deleted_vm TYPE int;
DEFINE FIELD vcpus ON TABLE deleted_vm TYPE int; DEFINE FIELD vcpus ON TABLE deleted_vm TYPE int;
DEFINE FIELD memory_mb ON TABLE deleted_vm TYPE int; DEFINE FIELD memory_mib ON TABLE deleted_vm TYPE int;
DEFINE FIELD dtrfs_sha ON TABLE deleted_vm TYPE string; DEFINE FIELD dtrfs_sha ON TABLE deleted_vm TYPE string;
DEFINE FIELD kernel_sha ON TABLE deleted_vm TYPE string; DEFINE FIELD kernel_sha ON TABLE deleted_vm TYPE string;
DEFINE FIELD created_at ON TABLE deleted_vm TYPE datetime; DEFINE FIELD created_at ON TABLE deleted_vm TYPE datetime;

@ -10,9 +10,8 @@ FOR $contract IN (select * from active_vm fetch out) {
} ELSE { } ELSE {
$amount_due $amount_due
}; };
LET $escrow_multiplier = IF $operator.escrow < 5_000_000_000_000 { 1 } ELSE { 5 };
IF $node_is_online { IF $node_is_online {
UPDATE $operator.id SET balance += $amount_paid * $escrow_multiplier; UPDATE $operator.id SET balance += $amount_paid;
UPDATE $contract.id SET UPDATE $contract.id SET
locked_nano -= $amount_paid, locked_nano -= $amount_paid,
collected_at = time::now(); collected_at = time::now();
@ -23,7 +22,9 @@ FOR $contract IN (select * from active_vm fetch out) {
$amount_due $amount_due
}; };
UPDATE $operator.id SET escrow -= $compensation; UPDATE $operator.id SET escrow -= $compensation;
UPDATE $contract.in SET balance += $compensation; UPDATE $contract.id SET
locked_nano += $compensation,
collected_at = time::now();
}; };
IF $amount_paid >= $contract.locked_nano { IF $amount_paid >= $contract.locked_nano {
fn::delete_vm($contract.id); fn::delete_vm($contract.id);

@ -91,8 +91,8 @@ async fn test_vm_daemon_resource_msg() {
avail_ipv4: 2, avail_ipv4: 2,
avail_ipv6: 88, avail_ipv6: 88,
avail_vcpus: 4, avail_vcpus: 4,
avail_memory_mb: 8192, avail_memory_mib: 8192,
avail_storage_gb: 100, avail_storage_mib: 102400,
max_ports_per_vm: 5, max_ports_per_vm: 5,
}; };
@ -114,9 +114,9 @@ async fn test_vm_daemon_resource_msg() {
assert!(vm_node_opt.is_some()); assert!(vm_node_opt.is_some());
let db::VmNode { let db::VmNode {
avail_mem_mb, avail_mem_mib,
avail_vcpus, avail_vcpus,
avail_storage_gbs, avail_storage_mib,
avail_ports, avail_ports,
avail_ipv4, avail_ipv4,
avail_ipv6, avail_ipv6,
@ -124,9 +124,9 @@ async fn test_vm_daemon_resource_msg() {
.. ..
} = vm_node_opt.unwrap(); } = vm_node_opt.unwrap();
assert_eq!(avail_mem_mb, req_data.avail_memory_mb); assert_eq!(avail_mem_mib, req_data.avail_memory_mib);
assert_eq!(avail_vcpus, req_data.avail_vcpus); assert_eq!(avail_vcpus, req_data.avail_vcpus);
assert_eq!(avail_storage_gbs, req_data.avail_storage_gb); assert_eq!(avail_storage_mib, req_data.avail_storage_mib);
assert_eq!(avail_ports, req_data.avail_ports); assert_eq!(avail_ports, req_data.avail_ports);
assert_eq!(avail_ipv4, req_data.avail_ipv4); assert_eq!(avail_ipv4, req_data.avail_ipv4);
assert_eq!(avail_ipv6, req_data.avail_ipv6); assert_eq!(avail_ipv6, req_data.avail_ipv6);

@ -180,9 +180,9 @@ vm_nodes:
region: England region: England
city: London city: London
ip: 173.234.17.2 ip: 173.234.17.2
avail_mem_mb: 26000 avail_mem_mib: 26000
avail_vcpus: 28 avail_vcpus: 28
avail_storage_gbs: 680 avail_storage_mib: 680
avail_ipv4: 2 avail_ipv4: 2
avail_ipv6: 65516 avail_ipv6: 65516
avail_ports: 19999 avail_ports: 19999
@ -196,9 +196,9 @@ vm_nodes:
region: Île-de-France region: Île-de-France
city: Paris city: Paris
ip: 156.146.63.215 ip: 156.146.63.215
avail_mem_mb: 123000 avail_mem_mib: 123000
avail_vcpus: 46 avail_vcpus: 46
avail_storage_gbs: 440 avail_storage_mib: 440
avail_ipv4: 2 avail_ipv4: 2
avail_ipv6: 0 avail_ipv6: 0
avail_ports: 20000 avail_ports: 20000
@ -212,9 +212,9 @@ vm_nodes:
region: Quebec region: Quebec
city: Montréal city: Montréal
ip: 184.107.169.199 ip: 184.107.169.199
avail_mem_mb: 30000 avail_mem_mib: 30000
avail_vcpus: 31 avail_vcpus: 31
avail_storage_gbs: 700 avail_storage_mib: 700
avail_ipv4: 0 avail_ipv4: 0
avail_ipv6: 0 avail_ipv6: 0
avail_ports: 20000 avail_ports: 20000
@ -228,9 +228,9 @@ vm_nodes:
region: British Columbia region: British Columbia
city: Vancouver city: Vancouver
ip: 149.22.95.1 ip: 149.22.95.1
avail_mem_mb: 109000 avail_mem_mib: 109000
avail_vcpus: 45 avail_vcpus: 45
avail_storage_gbs: 400 avail_storage_mib: 400
avail_ipv4: 25 avail_ipv4: 25
avail_ipv6: 0 avail_ipv6: 0
avail_ports: 20000 avail_ports: 20000
@ -244,9 +244,9 @@ vm_nodes:
region: California region: California
city: San Jose city: San Jose
ip: 149.36.48.99 ip: 149.36.48.99
avail_mem_mb: 120000 avail_mem_mib: 120000
avail_vcpus: 41 avail_vcpus: 41
avail_storage_gbs: 390 avail_storage_mib: 390
avail_ipv4: 23 avail_ipv4: 23
avail_ipv6: 0 avail_ipv6: 0
avail_ports: 19999 avail_ports: 19999
@ -260,9 +260,9 @@ vm_nodes:
region: British Columbia region: British Columbia
city: Vancouver city: Vancouver
ip: 149.22.95.28 ip: 149.22.95.28
avail_mem_mb: 125000 avail_mem_mib: 125000
avail_vcpus: 46 avail_vcpus: 46
avail_storage_gbs: 400 avail_storage_mib: 400
avail_ipv4: 26 avail_ipv4: 26
avail_ipv6: 0 avail_ipv6: 0
avail_ports: 20000 avail_ports: 20000
@ -277,9 +277,9 @@ vm_nodes:
region: England region: England
city: London city: London
ip: 193.234.17.2 ip: 193.234.17.2
avail_mem_mb: 28000 avail_mem_mib: 28000
avail_vcpus: 24 avail_vcpus: 24
avail_storage_gbs: 1680 avail_storage_mib: 1680
avail_ipv4: 1 avail_ipv4: 1
avail_ipv6: 0 avail_ipv6: 0
avail_ports: 19999 avail_ports: 19999
@ -293,9 +293,9 @@ vm_nodes:
region: England region: England
city: London city: London
ip: 193.234.17.2 ip: 193.234.17.2
avail_mem_mb: 28000 avail_mem_mib: 28000
avail_vcpus: 24 avail_vcpus: 24
avail_storage_gbs: 1680 avail_storage_mib: 1680
avail_ipv4: 1 avail_ipv4: 1
avail_ipv6: 0 avail_ipv6: 0
avail_ports: 19999 avail_ports: 19999
@ -312,9 +312,9 @@ vm_contracts:
exposed_ports: [] exposed_ports: []
public_ipv4: 156.146.63.216 public_ipv4: 156.146.63.216
public_ipv6: "" public_ipv6: ""
disk_size_gb: 10 disk_size_mib: 10240
vcpus: 2 vcpus: 2
memory_mb: 3000 memory_mib: 3000
kernel_sha: 3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151 kernel_sha: 3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151
dtrfs_sha: 3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b dtrfs_sha: 3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b
created_at: 2025-02-28T23:19:41.769423466Z created_at: 2025-02-28T23:19:41.769423466Z
@ -329,9 +329,9 @@ vm_contracts:
exposed_ports: [] exposed_ports: []
public_ipv4: 173.234.136.154 public_ipv4: 173.234.136.154
public_ipv6: "" public_ipv6: ""
disk_size_gb: 10 disk_size_mib: 10240
vcpus: 2 vcpus: 2
memory_mb: 3000 memory_mib: 3000
kernel_sha: 3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151 kernel_sha: 3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151
dtrfs_sha: 3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b dtrfs_sha: 3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b
created_at: 2025-03-06T19:51:39.595163157Z created_at: 2025-03-06T19:51:39.595163157Z
@ -347,9 +347,9 @@ vm_contracts:
- 38288 - 38288
public_ipv4: "" public_ipv4: ""
public_ipv6: "" public_ipv6: ""
disk_size_gb: 10 disk_size_mib: 10240
vcpus: 1 vcpus: 1
memory_mb: 1000 memory_mib: 1000
kernel_sha: 14e225e4aaf84cc2e0b5f64206121186ddebc4b378b886da3b2f7515dfd41692 kernel_sha: 14e225e4aaf84cc2e0b5f64206121186ddebc4b378b886da3b2f7515dfd41692
dtrfs_sha: 03ce24dbbe917fdd4f6347e61036805ddbdded5044c272bab188ef9333093bee dtrfs_sha: 03ce24dbbe917fdd4f6347e61036805ddbdded5044c272bab188ef9333093bee
created_at: 2025-03-12T16:28:24.749161605Z created_at: 2025-03-12T16:28:24.749161605Z
@ -364,9 +364,9 @@ vm_contracts:
exposed_ports: [] exposed_ports: []
public_ipv4: 149.22.95.2 public_ipv4: 149.22.95.2
public_ipv6: "" public_ipv6: ""
disk_size_gb: 10 disk_size_mib: 10240
vcpus: 2 vcpus: 2
memory_mb: 3000 memory_mib: 3000
kernel_sha: 3a68709138bed09c16671949cf1f03acee95a08381ba84fc70fb586001fa6767 kernel_sha: 3a68709138bed09c16671949cf1f03acee95a08381ba84fc70fb586001fa6767
dtrfs_sha: 0bb93443f65c9f4379ed469f94794f5c1bf14d8905b0b2c56a125df4a9ebe83e dtrfs_sha: 0bb93443f65c9f4379ed469f94794f5c1bf14d8905b0b2c56a125df4a9ebe83e
created_at: 2025-03-20T14:40:25.557753393Z created_at: 2025-03-20T14:40:25.557753393Z
@ -381,9 +381,9 @@ vm_contracts:
exposed_ports: [] exposed_ports: []
public_ipv4: 156.146.63.217 public_ipv4: 156.146.63.217
public_ipv6: "" public_ipv6: ""
disk_size_gb: 10 disk_size_mib: 10240
vcpus: 2 vcpus: 2
memory_mb: 3000 memory_mib: 3000
kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542 kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542
dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45 dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45
created_at: 2025-04-07T22:57:57.646151746Z created_at: 2025-04-07T22:57:57.646151746Z
@ -398,9 +398,9 @@ vm_contracts:
exposed_ports: [] exposed_ports: []
public_ipv4: 149.22.95.2 public_ipv4: 149.22.95.2
public_ipv6: "" public_ipv6: ""
disk_size_gb: 30 disk_size_mib: 30
vcpus: 1 vcpus: 1
memory_mb: 1000 memory_mib: 1000
kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542 kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542
dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45 dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45
created_at: 2025-04-12T13:44:56.957037550Z created_at: 2025-04-12T13:44:56.957037550Z
@ -415,9 +415,9 @@ vm_contracts:
exposed_ports: [] exposed_ports: []
public_ipv4: 149.36.48.100 public_ipv4: 149.36.48.100
public_ipv6: "" public_ipv6: ""
disk_size_gb: 10 disk_size_mib: 10240
vcpus: 4 vcpus: 4
memory_mb: 4000 memory_mib: 4000
kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542 kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542
dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45 dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45
created_at: 2025-04-15T00:46:35.622165457Z created_at: 2025-04-15T00:46:35.622165457Z
@ -433,9 +433,9 @@ vm_contracts:
- 46393 - 46393
public_ipv4: "" public_ipv4: ""
public_ipv6: "" public_ipv6: ""
disk_size_gb: 10 disk_size_mib: 10240
vcpus: 1 vcpus: 1
memory_mb: 1000 memory_mib: 1000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919 kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990 dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-04-16T20:37:57.176592933Z created_at: 2025-04-16T20:37:57.176592933Z
@ -452,9 +452,9 @@ vm_contracts:
- 46393 - 46393
public_ipv4: "" public_ipv4: ""
public_ipv6: "" public_ipv6: ""
disk_size_gb: 10 disk_size_mib: 10240
vcpus: 1 vcpus: 1
memory_mb: 1000 memory_mib: 1000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919 kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990 dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-04-16T20:37:57.176592933Z created_at: 2025-04-16T20:37:57.176592933Z
@ -470,9 +470,9 @@ vm_contracts:
- 46393 - 46393
public_ipv4: "" public_ipv4: ""
public_ipv6: "" public_ipv6: ""
disk_size_gb: 10 disk_size_mib: 10240
vcpus: 1 vcpus: 1
memory_mb: 1000 memory_mib: 1000
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919 kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990 dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
created_at: 2025-04-16T20:37:57.176592933Z created_at: 2025-04-16T20:37:57.176592933Z
@ -480,6 +480,7 @@ vm_contracts:
price_per_unit: 20000 price_per_unit: 20000
locked_nano: 12730960000 locked_nano: 12730960000
collected_at: 2025-04-20T00:34:15.461240342Z collected_at: 2025-04-20T00:34:15.461240342Z
app_nodes: app_nodes:
- node_pubkey: BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg - node_pubkey: BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg
operator_wallet: 7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB operator_wallet: 7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB