Smart Contract

VroomToken

A.f887ece39166906e.VroomToken

Deployed

2d ago
Feb 25, 2026, 01:22:25 AM UTC

Dependents

174 imports
1/// "There was once a dream that was Rome. You could only whisper it. 
2/// Anything more than a whisper and it would vanish, it was so fragile. 
3/// (Marcus Aurelius)
4
5/// Gladiator (2000), directed by Ridley Scott
6
7/// Testnet
8/// import FungibleToken from 0xf233dcee88fe0abe
9
10/// Mainnet
11import FungibleToken from 0xf233dcee88fe0abe
12import MetadataViews from 0x1d7e57aa55817448
13import FungibleTokenMetadataViews from 0xf233dcee88fe0abe
14
15access(all) contract VroomToken: FungibleToken {
16
17    access(all) var totalSupply: UFix64
18
19    access(all) let VaultReceiverPath: PublicPath
20    access(all) let VaultBalancePath: PublicPath
21    access(all) let VaultStoragePath: StoragePath
22    access(all) let AdminStoragePath: StoragePath
23
24    access(all) event TokensMinted(amount: UFix64)
25    access(all) event TokensBurned(amount: UFix64)
26    access(all) event MinterCreated(allowedAmount: UFix64)
27    access(all) event BurnerCreated()
28
29    access(all) view fun getContractViews(resourceType: Type?): [Type] {
30        return [
31            Type<FungibleTokenMetadataViews.FTView>(),
32            Type<FungibleTokenMetadataViews.FTDisplay>(),
33            Type<FungibleTokenMetadataViews.FTVaultData>(),
34            Type<FungibleTokenMetadataViews.TotalSupply>()
35        ]
36    }
37
38    access(all) fun resolveContractView(resourceType: Type?, viewType: Type): AnyStruct? {
39        switch viewType {
40            case Type<FungibleTokenMetadataViews.FTView>():
41                return FungibleTokenMetadataViews.FTView(
42                    ftDisplay: self.resolveContractView(resourceType: nil, viewType: Type<FungibleTokenMetadataViews.FTDisplay>()) as! FungibleTokenMetadataViews.FTDisplay?,
43                    ftVaultData: self.resolveContractView(resourceType: nil, viewType: Type<FungibleTokenMetadataViews.FTVaultData>()) as! FungibleTokenMetadataViews.FTVaultData?
44                )
45            case Type<FungibleTokenMetadataViews.FTDisplay>():
46                let media = MetadataViews.Media(
47                        file: MetadataViews.HTTPFile(
48                        url: "https://i.imgur.com/YpAYTaN.png"
49                    ),
50                    mediaType: "image/png+xml"
51                )
52                let medias = MetadataViews.Medias([media])
53                return FungibleTokenMetadataViews.FTDisplay(
54                    name: "Vroom Token",
55                    symbol: "VROOM",
56                    description: "Vroom Token",
57                    externalURL: MetadataViews.ExternalURL("https://driverz.world/"),
58                    logos: medias,
59                    socials: {
60                        "twitter": MetadataViews.ExternalURL("https://twitter.com/DriverzWorld"),
61                        "discord": MetadataViews.ExternalURL("https://discord.gg/driverz"),
62                        "instagram": MetadataViews.ExternalURL("https://www.instagram.com/driverzworld")
63                    }
64                )
65            case Type<FungibleTokenMetadataViews.FTVaultData>():
66                return FungibleTokenMetadataViews.FTVaultData(
67                    storagePath: self.VaultStoragePath,
68                    receiverPath: self.VaultReceiverPath,
69                    metadataPath: self.VaultBalancePath,
70                    receiverLinkedType: Type<&Vault>(),
71                    metadataLinkedType: Type<&Vault>(),
72                    createEmptyVaultFunction: (fun(): @{FungibleToken.Vault} {
73                        return <- VroomToken.createEmptyVault(vaultType: Type<@Vault>())
74                    })
75                )
76            case Type<FungibleTokenMetadataViews.TotalSupply>():
77                return FungibleTokenMetadataViews.TotalSupply(
78                    totalSupply: VroomToken.totalSupply
79                )
80        }
81        return nil
82    }
83
84    access(all) resource Vault: FungibleToken.Vault {
85
86        access(all) var balance: UFix64
87
88        init(balance: UFix64) {
89            self.balance = balance
90        }
91
92        access(contract) fun burnCallback() {
93            if self.balance > 0.0 {
94                VroomToken.totalSupply = VroomToken.totalSupply - self.balance
95            }
96            self.balance = 0.0
97        }
98
99        access(all) view fun getViews(): [Type] {
100            return VroomToken.getContractViews(resourceType: nil)
101        }
102
103        access(all) fun resolveView(_ view: Type): AnyStruct? {
104            return VroomToken.resolveContractView(resourceType: nil, viewType: view)
105        }
106
107        access(all) view fun getSupportedVaultTypes(): {Type: Bool} {
108            let supportedTypes: {Type: Bool} = {}
109            supportedTypes[self.getType()] = true
110            return supportedTypes
111        }
112
113        access(all) view fun isSupportedVaultType(type: Type): Bool {
114            return self.getSupportedVaultTypes()[type] ?? false
115        }
116
117        access(all) view fun isAvailableToWithdraw(amount: UFix64): Bool {
118            return amount <= self.balance
119        }
120
121        access(FungibleToken.Withdraw) fun withdraw(amount: UFix64): @Vault {
122            self.balance = self.balance - amount
123            return <- create Vault(balance: amount)
124        }
125
126        access(all) fun deposit(from: @{FungibleToken.Vault}) {
127            let vault <- from as! @VroomToken.Vault
128            self.balance = self.balance + vault.balance
129            vault.balance = 0.0
130            destroy vault
131        }
132
133        access(all) fun createEmptyVault(): @Vault {
134            return <-create Vault(balance: 0.0)
135        }
136    }
137
138    access(all) fun createEmptyVault(vaultType: Type): @Vault {
139        return <- create Vault(balance: 0.0)
140    }
141
142    access(all) resource Minter {
143
144        access(all) var allowedAmount: UFix64
145
146        access(all) fun mintTokens(amount: UFix64): @VroomToken.Vault {
147            pre {
148                amount > 0.0: "Amount minted must be greater than zero"
149                amount <= self.allowedAmount: "Amount minted must be less than the allowed amount"
150            }
151            VroomToken.totalSupply = VroomToken.totalSupply + amount
152            self.allowedAmount = self.allowedAmount - amount
153            emit TokensMinted(amount: amount)
154            return <- create Vault(balance: amount)
155        }
156
157        init(allowedAmount: UFix64) {
158            self.allowedAmount = allowedAmount
159        }
160
161    }
162
163    access(all) resource Burner {}
164
165    access(all) resource Administrator {
166
167        access(all) fun createNewMinter(allowedAmount: UFix64): @Minter {
168            emit MinterCreated(allowedAmount: allowedAmount)
169            return <- create Minter(allowedAmount: allowedAmount)
170        }
171
172    }
173
174    init() {
175        self.totalSupply = 7777777777.0
176
177        self.VaultReceiverPath = /public/VroomTokenReceiver
178        self.VaultBalancePath = /public/VroomTokenBalance
179        self.VaultStoragePath = /storage/VroomTokenVault
180        self.AdminStoragePath = /storage/VroomTokenAdmin
181
182        let vault <- create Vault(balance: self.totalSupply)
183        emit TokensMinted(amount: vault.balance)
184
185        let exampleTokenCap = self.account.capabilities.storage.issue<&Vault>(self.VaultStoragePath)
186        self.account.capabilities.publish(exampleTokenCap, at: self.VaultBalancePath)
187        let receiverCap = self.account.capabilities.storage.issue<&Vault>(self.VaultStoragePath)
188        self.account.capabilities.publish(receiverCap, at: self.VaultReceiverPath)
189
190        self.account.storage.save(<-vault, to: self.VaultStoragePath)
191
192        let admin <- create Administrator()
193        self.account.storage.save(<-admin, to: self.AdminStoragePath)
194    }
195}