This commit is contained in:
2025-09-17 14:41:42 +02:00
parent a65c0c9cf1
commit dfa68f6893
21 changed files with 1 additions and 19 deletions

View File

@@ -0,0 +1,123 @@
module finance
// AssetType defines the type of blockchain asset
pub enum AssetType {
erc20 // ERC-20 token standard
erc721 // ERC-721 NFT standard
erc1155 // ERC-1155 Multi-token standard
native // Native blockchain asset (e.g., ETH, BTC)
}
// Asset represents a digital asset or token
@[heap]
pub struct Asset {
pub mut:
id u32 // Unique asset ID
name string // Name of the asset
description string // Description of the asset
amount f64 // Amount of the asset
address string // Address of the asset on the blockchain or bank
asset_type AssetType // Type of the asset
decimals u8 // Number of decimals of the asset (default 18)
created_at u64 // Creation timestamp
updated_at u64 // Last update timestamp
}
// new creates a new Asset with default values
pub fn Asset.new() Asset {
return Asset{
id: 0
name: ''
description: ''
amount: 0.0
address: ''
asset_type: .native
decimals: 18
created_at: 0
updated_at: 0
}
}
// name sets the name of the asset (builder pattern)
pub fn (mut a Asset) name(name string) Asset {
a.name = name
return a
}
// description sets the description of the asset (builder pattern)
pub fn (mut a Asset) description(description string) Asset {
a.description = description
return a
}
// amount sets the amount of the asset (builder pattern)
pub fn (mut a Asset) amount(amount f64) Asset {
a.amount = amount
return a
}
// address sets the address of the asset on the blockchain (builder pattern)
pub fn (mut a Asset) address(address string) Asset {
a.address = address
return a
}
// asset_type sets the type of the asset (builder pattern)
pub fn (mut a Asset) asset_type(asset_type AssetType) Asset {
a.asset_type = asset_type
return a
}
// decimals sets the number of decimals of the asset (builder pattern)
pub fn (mut a Asset) decimals(decimals u8) Asset {
a.decimals = decimals
return a
}
// formatted_amount returns the formatted amount with proper decimal places
pub fn (a Asset) formatted_amount() string {
factor := f64(1)
for _ in 0 .. a.decimals {
factor *= 10
}
formatted_amount := (a.amount * factor).round() / factor
// Format with the specified number of decimal places
if a.decimals == 0 {
return '${formatted_amount:.0f}'
} else if a.decimals == 1 {
return '${formatted_amount:.1f}'
} else if a.decimals == 2 {
return '${formatted_amount:.2f}'
} else if a.decimals == 3 {
return '${formatted_amount:.3f}'
} else if a.decimals == 4 {
return '${formatted_amount:.4f}'
} else {
// For more than 4 decimals, use string manipulation
str_amount := formatted_amount.str()
if str_amount.contains('.') {
parts := str_amount.split('.')
if parts.len == 2 {
decimal_part := parts[1]
if decimal_part.len > a.decimals {
return '${parts[0]}.${decimal_part[..a.decimals]}'
}
}
}
return str_amount
}
}
// transfer_to transfers amount to another asset
pub fn (mut a Asset) transfer_to(mut target Asset, amount f64) ! {
if amount <= 0.0 {
return error('Transfer amount must be positive')
}
if a.amount < amount {
return error('Insufficient balance for transfer')
}
a.amount -= amount
target.amount += amount
}