Smart Contract

OpenEditionInitializer

A.befbaccb5032a457.OpenEditionInitializer

Deployed

1h ago
Feb 28, 2026, 09:42:23 PM UTC

Dependents

0 imports
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}