Smart Contract

TheFabricantFBRCAirdrop

A.7752ea736384322f.TheFabricantFBRCAirdrop

Deployed

4h ago
Feb 28, 2026, 08:14:46 PM UTC

Dependents

0 imports
1import FungibleToken from 0xf233dcee88fe0abe
2import FBRC from 0xfc91de5e6566cc7c
3
4// This contract allows an admin to allocate airdrop amounts to addresses
5// allowing these addresses to receive FBRC by calling claimFBRC
6pub contract TheFabricantFBRCAirdrop{
7
8    pub event AddressClaimAdded(address: Address, claimName: String, claimAmount: UFix64)
9    
10    pub event AddressClaimed(address: Address, claimName: String, claimAmount: UFix64)
11
12    pub event MinterChanged(address: Address)
13
14    // dictionary of addresses and the amount they can currently claim
15    access(self) var addressClaim: {Address: {String: ClaimStruct}}
16
17    access(contract) var fbrcMinterCapability: Capability<&FBRC.Administrator>?
18
19    pub let AdminStoragePath: StoragePath
20    pub let ClaimerStoragePath: StoragePath
21
22    pub struct ClaimStruct {
23
24        pub let claimAmount: UFix64
25        pub var hasClaimed: Bool
26
27        init (
28            claimAmount: UFix64
29        ){
30            self.claimAmount = claimAmount
31            self.hasClaimed = false
32        }
33
34        pub fun setToHasClaimed() {
35            pre {
36                self.hasClaimed == false:
37                "amount has been claimed"
38            }
39            self.hasClaimed = true
40        }
41    }
42    
43    pub resource Admin{
44
45        //add claim to address map
46        pub fun addClaim(address: Address, claimName: String, claimAmount: UFix64){
47            let claimStruct = ClaimStruct(claimAmount: claimAmount)
48            //case1: address not in mapping
49            if(TheFabricantFBRCAirdrop.addressClaim[address] == nil){
50                let map: {String: ClaimStruct} = {}
51                map[claimName] = claimStruct
52                TheFabricantFBRCAirdrop.addressClaim[address] = map
53                emit AddressClaimAdded(address: address, claimName: claimName, claimAmount: claimAmount)
54            //case2: address in mapping and claimName not in mapping
55            } else if(TheFabricantFBRCAirdrop.addressClaim[address]![claimName] == nil) {
56                let map = TheFabricantFBRCAirdrop.addressClaim[address]!
57                map[claimName] = claimStruct
58                TheFabricantFBRCAirdrop.addressClaim[address] = map  
59                emit AddressClaimAdded(address: address, claimName: claimName, claimAmount: claimAmount)  
60            //case3: address in mapping and claimName in mapping          
61            } else {
62                panic("claim is already in claimlist")
63            }
64        }
65
66        // change contract royalty address
67        pub fun setFBRCMinterCap(fbrcMinterCap: Capability<&FBRC.Administrator>) {
68            pre {
69                fbrcMinterCap.borrow() != nil: 
70                    "Admin Minter Capability invalid"
71            }
72            TheFabricantFBRCAirdrop.fbrcMinterCapability = fbrcMinterCap
73            emit MinterChanged(address: fbrcMinterCap.address)
74        }
75
76        pub fun createNewAdmin(): @Admin {
77            return <-create Admin()
78        }
79
80    }
81
82    pub resource Claimer {
83
84        //users can claim FBRC if they have minted an item
85        pub fun claimFBRC(claimName: String, fbrcCap: Capability<&FBRC.Vault{FungibleToken.Receiver}>) {     
86            
87            //Make sure the address has a claimable amount of FBRC
88            pre {
89                TheFabricantFBRCAirdrop.addressClaim[self.owner!.address] != nil:
90                    "this address has no claimable FBRC"
91                TheFabricantFBRCAirdrop.addressClaim[self.owner!.address]![claimName] != nil:
92                    "this address has no claimable FBRC for this claim"            
93                TheFabricantFBRCAirdrop.addressClaim[self.owner!.address]![claimName]!.hasClaimed == false:
94                    "this address has already claimed this"
95            }
96            
97            // get claimAddress
98            let claimAddress = self.owner!.address
99
100            // get claimAmount
101            let claimAmount = TheFabricantFBRCAirdrop.addressClaim[claimAddress]![claimName]!.claimAmount
102
103            let claimStruct = TheFabricantFBRCAirdrop.addressClaim[claimAddress]![claimName]!
104
105            // set hasClaimed to be true
106            claimStruct.setToHasClaimed()
107
108            // reinsert to addressClaim map
109            let map = TheFabricantFBRCAirdrop.addressClaim[claimAddress]!
110            map[claimName] = claimStruct
111            TheFabricantFBRCAirdrop.addressClaim[claimAddress] = map
112
113            //mint fbrc from contract minter resource
114            let fbrcAdmin = TheFabricantFBRCAirdrop.fbrcMinterCapability!.borrow()!
115            
116            let fbrcMinter <- fbrcAdmin.createNewMinter(allowedAmount: claimAmount)
117        
118            let mintedVault <- fbrcMinter.mintTokens(amount: claimAmount)
119
120            let recipientFBRCVault = fbrcCap.borrow()??
121                                        panic("FBRC Vault Capability invalid")
122
123            //deposit fbrc to claimer's fbrc vault
124            recipientFBRCVault.deposit(from: <- mintedVault)
125
126            destroy fbrcMinter
127            emit AddressClaimed(address: claimAddress, claimName: claimName, claimAmount: claimAmount)
128        }
129
130        // destructor
131        //
132        destroy () {}
133
134        // initializer
135        //
136        init () {}
137    }
138
139    pub fun createNewClaimer(): @Claimer {
140        return <-create Claimer()
141    }
142
143    // getter function for addressClaim
144    pub fun getAddressClaim(): {Address: {String: ClaimStruct}} {
145        return TheFabricantFBRCAirdrop.addressClaim
146    }
147    
148    init() {
149        self.fbrcMinterCapability = nil
150        self.addressClaim = {}
151        self.AdminStoragePath = /storage/FBRCAirdropAdmin0021
152        self.ClaimerStoragePath = /storage/FBRCAirdropClaimer0021
153        self.account.save<@Admin>(<- create Admin(), to: self.AdminStoragePath)
154    }
155}