Smart Contract
TheFabricantFBRCAirdrop
A.7752ea736384322f.TheFabricantFBRCAirdrop
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}