Skip to content

Commit cc9da9c

Browse files
fix database assets
1 parent 3a9106c commit cc9da9c

File tree

9 files changed

+85
-31
lines changed

9 files changed

+85
-31
lines changed

postgres/migrations/03_assets.sql

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ CREATE TABLE "assets"."evm_metadata" (
2727
"last_modification_at" TIMESTAMP(6) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
2828
"asset_id" uuid NOT NULL,
2929
"address" CHAR(42) UNIQUE NOT NULL,
30-
"name" VARCHAR(128),
31-
"symbol" VARCHAR(8),
32-
"decimals" text
30+
"name" VARCHAR(128) NOT NULL,
31+
"symbol" VARCHAR(8) NOT NULL,
32+
"decimals" text NOT NULL
3333
);
3434
ALTER TABLE "assets"."evm_metadata" ADD FOREIGN KEY ("asset_id") REFERENCES "assets"."asset" ("id");
3535
CREATE OR REPLACE FUNCTION assets_evm_metadata_changed_trigger()

server/Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/blockchain/src/database/managers/assets.rs

+14-12
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ impl AssetsManager {
1616
sqlx::query_as!(
1717
Asset,
1818
r#"
19-
SELECT
20-
id,
21-
address as "address: Address",
22-
decimals as "decimals: Fraction"
23-
FROM assets
24-
WHERE address = $1
19+
SELECT
20+
a.id,
21+
em.address as "address: Address",
22+
em.decimals as "decimals: Fraction"
23+
FROM "assets"."asset" a
24+
JOIN "assets"."evm_metadata" em ON a.id = em.asset_id
25+
WHERE em.address = $1
2526
"#,
2627
address.to_string()
2728
)
@@ -33,12 +34,13 @@ impl AssetsManager {
3334
sqlx::query_as!(
3435
Asset,
3536
r#"
36-
SELECT
37-
id,
38-
address as "address: Address",
39-
decimals as "decimals: Fraction"
40-
FROM assets
41-
WHERE id = $1
37+
SELECT
38+
a.id,
39+
em.address as "address: Address",
40+
em.decimals as "decimals: Fraction"
41+
FROM "assets"."asset" a
42+
JOIN "assets"."evm_metadata" em ON a.id = em.asset_id
43+
WHERE a.id = $1
4244
"#,
4345
id
4446
)

server/blockchain/src/database/managers/deposits.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use crate::database::projections::deposit::{Deposit, DepositInsert};
22
use chrono::Utc;
3-
use evm::address::Address;
4-
use evm::txhash::TxHash;
3+
use evm::{address::Address, txhash::TxHash, confirmations_counter::Confirmations};
54
use fraction::Fraction;
65
use sqlx::{postgres::PgQueryResult, Postgres, Transaction};
76

@@ -17,10 +16,10 @@ impl DepositsManager {
1716
sqlx::query_as!(
1817
Deposit,
1918
r#"
20-
INSERT INTO deposits
19+
INSERT INTO "assets"."deposit_evm_metadata"
2120
(created_at, last_modification_at, owner, spender, asset, amount, tx_hash, confirmations)
2221
VALUES
23-
($1, $2, $3, $4, $5, $6::fraction, $7, $8::fraction)
22+
($1, $2, $3, $4, $5, $6::fraction, $7, $8::confirmations)
2423
RETURNING
2524
id,
2625
created_at,
@@ -30,7 +29,7 @@ impl DepositsManager {
3029
asset as "asset: Address",
3130
amount as "amount: Fraction",
3231
tx_hash as "tx_hash: TxHash",
33-
confirmations as "confirmations: Fraction"
32+
confirmations as "confirmations: Confirmations"
3433
"#,
3534
now,
3635
now,

server/blockchain/src/database/projections/deposit.rs

+8-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
use chrono::{DateTime, Utc};
22
use ethers::prelude::LogMeta;
3-
use evm::{address::Address, txhash::TxHash};
4-
use fraction::{num_traits::One, Fraction};
5-
use num_bigint::BigInt;
3+
use evm::{address::Address, txhash::TxHash, confirmations_counter::Confirmations};
4+
use fraction::Fraction;
65
use num_traits::Zero;
76
use serde::{Deserialize, Serialize};
87
use sqlx::{Postgres, Transaction};
@@ -15,7 +14,7 @@ use crate::{
1514
database::managers::{assets::AssetsManager, users::UsersManager, valuts::ValutsManager},
1615
engine_base,
1716
};
18-
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)]
17+
#[derive(Debug, Serialize, Deserialize, Clone, Hash)]
1918
pub struct Deposit {
2019
pub id: Uuid,
2120
pub created_at: DateTime<Utc>,
@@ -25,7 +24,7 @@ pub struct Deposit {
2524
pub asset: Address,
2625
pub amount: Fraction,
2726
pub tx_hash: TxHash,
28-
pub confirmations: Fraction,
27+
pub confirmations: Confirmations,
2928
}
3029

3130
impl Deposit {
@@ -56,12 +55,12 @@ impl Deposit {
5655
}
5756

5857
impl Confirmable for Deposit {
59-
fn set(&mut self, confirmations: BigInt) {
60-
let (_, denom) = self.confirmations.0.clone().into();
61-
self.confirmations = Fraction::from_raw((confirmations, denom)).unwrap_or_default()
58+
fn set(&mut self, actual: u64) {
59+
let desired = self.confirmations.desired();
60+
self.confirmations = Confirmations::from_raw(actual, desired);
6261
}
6362
fn is_confirmed(&self) -> bool {
64-
self.confirmations >= Fraction::one()
63+
self.confirmations.actual() >= self.confirmations.desired()
6564
}
6665
}
6766

server/blockchain/src/database/projections/mod.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use chrono::{DateTime, Utc};
2-
use num_bigint::BigInt;
32

43
pub mod asset;
54
pub mod deposit;
@@ -8,7 +7,7 @@ pub mod valut;
87
pub mod withdraw;
98

109
pub trait Confirmable {
11-
fn set(&mut self, confirmations: BigInt);
10+
fn set(&mut self, confirmations: u64);
1211
fn is_confirmed(&self) -> bool;
1312
}
1413

server/types/evm/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ edition = "2021"
66

77
[dependencies]
88
ethereum-types = "0.14.1"
9+
num-bigint = { version = "0.4.3", features = ["serde", "arbitrary", "quickcheck"] }
910
prefix-hex = "0.7.1"
1011
serde = { version = "1.0.183", features = ["derive"] }
1112
sqlx = { version = "0.7.1", features = [
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
use num_bigint::BigInt;
2+
use serde::{Deserialize, Serialize};
3+
use sqlx::{
4+
database::HasValueRef, postgres::PgArgumentBuffer, types::BigDecimal, Database, Decode, Encode,
5+
Postgres, Type, TypeInfo,
6+
};
7+
8+
#[derive(Debug, Clone, Hash, Default, Deserialize, Serialize)]
9+
pub struct Confirmations {
10+
actual: BigInt,
11+
desired: BigInt,
12+
}
13+
impl Confirmations {
14+
pub fn new(desired: BigInt) -> Self {
15+
Confirmations {
16+
actual: BigInt::from(0),
17+
desired,
18+
}
19+
}
20+
21+
pub fn from_raw(actual: BigInt, desired: BigInt) -> Self {
22+
Confirmations { actual, desired }
23+
}
24+
25+
pub fn to_tuple_string(&self) -> String {
26+
format!("({},{})", self.actual, self.desired)
27+
}
28+
29+
pub fn actual(&self) -> &BigInt {
30+
&self.actual
31+
}
32+
33+
pub fn desired(&self) -> &BigInt {
34+
&self.desired
35+
}
36+
}
37+
impl<'r, DB: Database> Decode<'r, DB> for Confirmations
38+
where
39+
(BigDecimal, BigDecimal): Decode<'r, DB>,
40+
{
41+
fn decode(
42+
value: <DB as HasValueRef<'r>>::ValueRef,
43+
) -> Result<Self, Box<dyn std::error::Error + 'static + Send + Sync>> {
44+
let (actual, desired) = <(BigDecimal, BigDecimal) as Decode<DB>>::decode(value)?;
45+
46+
let (actual_bigint, actual_exp) = actual.into_bigint_and_exponent();
47+
let (desired_bigint, desired_exp) = desired.into_bigint_and_exponent();
48+
let actual = actual_bigint * BigInt::from(10).pow(TryInto::try_into(-actual_exp)?);
49+
let desired = desired_bigint * BigInt::from(10).pow(TryInto::try_into(-desired_exp)?);
50+
Ok(Confirmations::from_raw(actual, desired))
51+
}
52+
}

server/types/evm/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
pub mod address;
2+
pub mod confirmations_counter;
23
pub mod txhash;

0 commit comments

Comments
 (0)