-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathERC4626.lua
More file actions
69 lines (57 loc) · 2.02 KB
/
ERC4626.lua
File metadata and controls
69 lines (57 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
-- 定义Vault对象
Vault = {}
Vault.__index = Vault
function Vault:new(assetBalance, totalShares)
local instance = {
assetBalance = assetBalance or 0, -- 金库的资产总量
totalShares = totalShares or 0, -- 金库的总股份
shares = {} -- 每个用户的股份
}
setmetatable(instance, Vault)
return instance
end
function Vault:deposit(amount, user)
if amount <= 0 then
return "Amount must be greater than zero"
end
-- 计算股份数量
local sharesToMint = 0
if self.totalShares == 0 then
sharesToMint = amount -- 初始股份等于存入的资产
else
sharesToMint = (amount * self.totalShares) / self.assetBalance
end
-- 更新金库的资产和股份
self.assetBalance = self.assetBalance + amount
self.totalShares = self.totalShares + sharesToMint
self.shares[user] = (self.shares[user] or 0) + sharesToMint
return sharesToMint
end
-- 提取资产,返回资产数量
function Vault:withdraw(shares, user)
local userShares = self.shares[user] or 0
if shares > userShares then
return "Insufficient shares"
end
-- 计算提取的资产数量
local assetsToWithdraw = (shares * self.assetBalance) / self.totalShares
-- 更新金库的资产和股份
self.assetBalance = self.assetBalance - assetsToWithdraw
self.totalShares = self.totalShares - shares
self.shares[user] = userShares - shares
return assetsToWithdraw
end
-- 查询用户的股份
function Vault:getShares(user)
return self.shares[user] or 0
end
-- 查询金库的资产总量
function Vault:getAssetBalance()
return self.assetBalance
end
-- 示例用法
local vault = Vault:new(1000, 100) -- 初始资产为1000,股份为100
print("User1 deposits 500 assets and receives shares:", vault:deposit(500, "User1"))
print("User1 total shares:", vault:getShares("User1"))
print("User1 withdraws 50 shares and receives assets:", vault:withdraw(50, "User1"))
print("Vault's asset balance:", vault:getAssetBalance())