Smart Contract
OpenEditionInitializer
A.befbaccb5032a457.OpenEditionInitializer
1import ContractInitializer from 0xbefbaccb5032a457
2import NFTMetadata from 0xbefbaccb5032a457
3import FlowtyDrops from 0xbefbaccb5032a457
4import NonFungibleToken from 0x1d7e57aa55817448
5import UniversalCollection from 0xbefbaccb5032a457
6
7access(all) contract OpenEditionInitializer: ContractInitializer {
8 access(all) fun initialize(contractAcct: auth(Storage, Contracts, Keys, Inbox, Capabilities) &Account, params: {String: AnyStruct}): NFTMetadata.InitializedCaps {
9 pre {
10 params["data"] != nil: "missing param data"
11 params["data"]!.getType() == Type<NFTMetadata.Metadata>(): "data param must be of type NFTMetadata.Metadata"
12 params["collectionInfo"] != nil: "missing param collectionInfo"
13 params["collectionInfo"]!.getType() == Type<NFTMetadata.CollectionInfo>(): "collectionInfo param must be of type NFTMetadata.CollectionInfo"
14 params["type"] != nil: "missing param type"
15 params["type"]!.getType() == Type<Type>(): "type param must be of type Type"
16 }
17
18 let data = params["data"]! as! NFTMetadata.Metadata
19 let collectionInfo = params["collectionInfo"]! as! NFTMetadata.CollectionInfo
20
21 let nftType = params["type"]! as! Type
22 let contractName = nftType.identifier.split(separator: ".")[2]
23
24 // do we have information to setup a drop as well?
25 if params.containsKey("dropDetails") && params.containsKey("phaseDetails") && params.containsKey("minterController") {
26 // extract expected keys
27 let minterCap = params["minterController"]! as! Capability<&{FlowtyDrops.Minter}>
28 let dropDetails = params["dropDetails"]! as! FlowtyDrops.DropDetails
29 let phaseDetails = params["phaseDetails"]! as! [FlowtyDrops.PhaseDetails]
30
31 assert(minterCap.check(), message: "invalid minter capability")
32 assert(CompositeType(dropDetails.nftType) != nil, message: "dropDetails.nftType must be a valid CompositeType")
33
34 let phases: @[FlowtyDrops.Phase] <- []
35 for p in phaseDetails {
36 phases.append(<- FlowtyDrops.createPhase(details: p))
37 }
38
39 let drop <- FlowtyDrops.createDrop(details: dropDetails, minterCap: minterCap, phases: <- phases)
40 if contractAcct.storage.borrow<&AnyResource>(from: FlowtyDrops.ContainerStoragePath) == nil {
41 contractAcct.storage.save(<- FlowtyDrops.createContainer(), to: FlowtyDrops.ContainerStoragePath)
42
43 contractAcct.capabilities.unpublish(FlowtyDrops.ContainerPublicPath)
44 contractAcct.capabilities.publish(
45 contractAcct.capabilities.storage.issue<&{FlowtyDrops.ContainerPublic}>(FlowtyDrops.ContainerStoragePath),
46 at: FlowtyDrops.ContainerPublicPath
47 )
48 }
49
50 let container = contractAcct.storage.borrow<auth(FlowtyDrops.Owner) &FlowtyDrops.Container>(from: FlowtyDrops.ContainerStoragePath)
51 ?? panic("drops container not found")
52 container.addDrop(<- drop)
53 }
54
55 let caps = NFTMetadata.initialize(acct: contractAcct, collectionInfo: collectionInfo, nftType: nftType)
56 caps.ownerCap.borrow()!.addMetadata(id: 0, data: data)
57
58 return caps
59 }
60}