Transaction

b1307f29d7aa2d67dd80142928eb2d986931577c555f081731fe006cd1db17d0
( - )
192,245
2021-04-14 22:54:20
1
5,971 B

4 Outputs

Total Output:
  • jrunM9{"in":0,"ref":["native://Jig","f97d4ac2a3d6f5ed09fad4a4f341619dc5a3773d9844ff95c99c5d4f8388de2f_o1","b44a203acd6215d2d24b33a41f730e9acf2591c4ae27ecafc8d88ef83da9ddea_o1?berry=5de5ca0a3a67ffa2ce87a6cf242df668a6137be63426ea655793cd934a39f659&hash=6b7481feb6dbf77edd16ac84b83d265452ea930fd38bae046baf872727612166&version=5"],"out":["b0cd00ee3694e52590b7875c88d14de8b11c28cebc0ac2e78bf6ae9eca8c6bcd","eb02bd17af59fc96ef9a290e5ef10452ee09f6a1881c6696cf7b1fef1a560c48"],"del":[],"cre":["mu97FuDfo5pg7w7rufebTJdfFKBekSkLJA","mu97FuDfo5pg7w7rufebTJdfFKBekSkLJA"],"exec":[{"op":"DEPLOY","data":["class MediaItem extends Jig {\n\tinit(ownerPubKey, props) {\n\t\texpect(caller).toBeInstanceOf(MediaDispenser);\n\t\texpect(ownerPubKey).toBeString();\n\t\tMediaItem.validateProps(props);\n\t\tthis.data = props;\n\t\tthis.owner = ownerPubKey;\n\t}\n\n\tsend(to, key, validationMsg) {\n\t\texpect(key).toBeString('Key is not a string');\n\t\texpect(key.length).toBeGreaterThan(0, 'Empty key is invalid');\n\t\texpect(validationMsg).toBeString('Validation msg is not a string');\n\t\texpect(validationMsg.length).toBeGreaterThan(0, 'Empty validation msg string is invalid');\n\n\t\t// TODO get PubKey.fromString working w/ Run\n\t\texpect(to).toBeString('Recipient is not a string');\n\t\texpect(to.length).toBeGreaterThan(0, 'Recipient is invalid');\n\n\t\tthis.owner = to;\n\t\tthis.data.key = key;\n\t\tthis.data.validationMsg = validationMsg;\n\t}\n\n\tstatic validateProps(props) {\n\t\tconst {\n\t\t\tItem,\n\t\t\tItemRequired,\n\t\t\tItemContent,\n\t\t\tItemContentRequired,\n\t\t\tMedia,\n\t\t\tMediaRequired,\n\t\t} = validation;\n\n\t\tfunction entriesLoop(obj, fn) {\n\t\t\tObject\n\t\t\t\t.entries(obj)\n\t\t\t\t.forEach(fn);\n\t\t}\n\n\t\tfunction validateRequired(obj, requiredList) {\n\t\t\treturn requiredList.every(key => expect(obj[key]).toBeDefined(`Missing required property \"${key}\". Obj: ${JSON.stringify(obj)}`));\n\t\t}\n\n\t\tvalidateRequired(props, ItemRequired);\n\n\t\tentriesLoop(props, ([key, val]) => {\n\t\t\texpect(val)[Item[key]]?.(`Item validation failed: Key \"${key}\" / Val: \"${val}\"`);\n\t\t});\n\n\t\tconst media = [\n\t\t\tprops.thumb,\n\t\t\t...props.content.map(c => c.media),\n\t\t];\n\n\t\tmedia.forEach(m => {\n\t\t\tvalidateRequired(m, MediaRequired);\n\n\t\t\tentriesLoop(m, ([key, val]) => {\n\t\t\t\tif(key === 'mimeType') {\n\t\t\t\t\texpect(MIME_TYPES.includes(val)).toBe(true, `Media mime type not recognized: ${val}`);\n\t\t\t\t} else {\n\t\t\t\t\texpect(val)[Media[key]](`Media item validation failed: Key \"${key}\" / Val: ${val}`);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tprops\n\t\t\t.content\n\t\t\t.forEach(c => {\n\t\t\t\tentriesLoop(c, ([key, val]) => {\n\t\t\t\t\tif(key !== 'media') {\n\t\t\t\t\t\tvalidateRequired(c, ItemContentRequired);\n\t\t\t\t\t\texpect(val)[ItemContent[key]]('Content validation failed: ', key, val);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t}\n}",{"deps":{"Jig":{"$jig":0},"MIME_TYPES":["application/epub+zip","application/pdf","audio/aac","audio/mpeg","audio/ogg","audio/wav","audio/webm","image/bmp","image/gif","image/jpeg","image/png","image/webp","video/mpeg","video/ogg","video/webm"],"MediaDispenser":{"$jig":4},"expect":{"$jig":1},"validation":{"Item":{"categories":"toBeArray","content":"toBeArray","creationDate":"toBeString","description":"toBeString","key":"toBeString","meta":"toBeObject","thumb":"toBeObject","title":"toBeString","type":"toBeString","validationMsg":"toBeString"},"ItemContent":{"description":"toBeString","title":"toBeString"},"ItemContentRequired":["title","description"],"ItemRequired":["creationDate","createdBy","title","type","description","thumb","content"],"ItemValidation":{"key":"toBeString","msg":"toBeString"},"Media":{"encrypted":"toBeBoolean","tx":"toBeString"},"MediaRequired":["tx"]}},"metadata":{"author":"DavidDoesStuff","description":"Media collection with public and private content.","emoji":"📖","image":{"$jig":2}}},"class MediaDispenser extends Jig {\n\tinit(ownerPubKey, props) {\n\t\tconst {\n\t\t\tmaxBatches = 0,\n\t\t\tmaxIssues = 0,\n\t\t\tmediaData,\n\t\t} = props;\n\n\t\texpect(maxBatches).toBeNumber();\n\t\texpect(maxIssues).toBeNumber();\n\t\texpect(ownerPubKey).toBeString();\n\n\t\tMediaItem.validateProps(mediaData);\n\n\t\tconst {\n\t\t\tcreationDate,\n\t\t\tcreatedBy,\n\t\t\tcategories,\n\t\t} = mediaData;\n\n\t\tObject.assign(this, {\n\t\t\towner: ownerPubKey,\n\t\t\tmediaData,\n\t\t\tdata: {\n\t\t\t\tcreationDate,\n\t\t\t\tbatchRuns: [],\n\t\t\t\tmediaData,\n\t\t\t\tcreatedBy,\n\t\t\t\tcategories,\n\t\t\t},\n\t\t});\n\t}\n\n\tsend(to) {\n\t\tthis.owner = to;\n\t}\n\n\tcreate(count) {\n\t\tconst data = this.data;\n\n\t\tif(data.maxBatches) {\n\t\t\texpect(data.batchRuns.length).toBeLessThan(data.maxBatches);\n\t\t}\n\n\t\tconst totalIssued = data.batchRuns.reduce((sum, issued) => sum + issued, 0);\n\n\t\tif(data.maxIssues) {\n\t\t\texpect(totalIssued + count).toBeLessThan(data.maxIssues);\n\t\t}\n\n\t\tconst batchNumber = data.batchRuns.length + 1;\n\t\tconst newIssues = [];\n\n\t\tfor(let x = 0; x < count; x++) {\n\t\t\tconst batchItemNumber = x + 1;\n\n\t\t\tnewIssues.push(new MediaItem(this.owner, {\n\t\t\t\tinstantiatedBy: this.origin,\n\t\t\t\tbatchNumber,\n\t\t\t\titemNumber: totalIssued + batchItemNumber,\n\t\t\t\tbatchItemNumber,\n\t\t\t\t...this.data.mediaData,\n\t\t\t}));\n\t\t}\n\n\t\tthis.data.batchRuns.push(count);\n\n\t\treturn newIssues;\n\t}\n}",{"deps":{"Jig":{"$dup":["1","deps","Jig"]},"MediaItem":{"$jig":3},"expect":{"$dup":["1","deps","expect"]}},"metadata":{"author":"DavidDoesStuff","description":"Creates and tracks media items.","emoji":"📖","image":{"$dup":["1","metadata","image"]}}}]}]}
    https://whatsonchain.com/tx/b1307f29d7aa2d67dd80142928eb2d986931577c555f081731fe006cd1db17d0