Smart Contract Details

Open on Dero Explorer
Internal ID:
46914
Block:
Timestamp:
2023-10-24 20:16:20 UTC (1.8 years ago)
Creator:
The Abyss (+33 more) (1396558)
Raw Data:
[{"name":"SC_ACTION","datatype":"U","value":1},{"name":"SC_CODE","datatype":"S","value":"//    Copyright 2022. Civilware. All rights reserved.\n//    Artificer NFA Market Standard (ART-NFA-MS1)\n\nFunction InitializePrivate() Uint64\n    10  IF EXISTS(\"owner\") == 0 THEN GOTO 300 ELSE GOTO 999\n    300 STORE(\"artificerFee\", 1)\n    310 STORE(\"royalty\", 3)\n    320 STORE(\"ownerCanUpdate\", 0)\n    330 STORE(\"nameHdr\", \"Desperado577\")\n    340 STORE(\"descrHdr\", \"Dero Desperados are a collection of NFT/NFAs created by G and Little Duck. Owning a Desperado G45 NFT will grant holders access to an Artificer standard NFA. NFA holders will be able to participate in a new utility on the Dero blockchain called Asset Duels on dReams app. ;;7b2272223a317d\")\n    350 STORE(\"typeHdr\", \"Image\")\n    360 STORE(\"iconURLHdr\", \"https://raw.githubusercontent.com/DeroDesperados/Desperados/main/Icons/Desperado577-IC.png\")\n    370 STORE(\"tagsHdr\", \"#NFT #NFA #Dero #Cowboys #Guns #Gunfight #AssetDuels\")\n    400 STORE(\"fileCheckC\", \"1cfee0d13d52bcd312998dd3cada06120d7fa7ad5829875ebab0d5b58631ddd8\")\n    410 STORE(\"fileCheckS\", \"1cab969c0b8434e43eb74104054a9dfbc2c57a74e6bb711094317c3d580bfe07\")\n    420 STORE(\"fileURL\", \"https://raw.githubusercontent.com/DeroDesperados/Desperados/main/Assets/Desperado577.png\")\n    430 STORE(\"fileSignURL\", \"https://raw.githubusercontent.com/DeroDesperados/Desperados/main/Sign/Desperado577.png.sign\")\n    440 STORE(\"coverURL\", \"https://raw.githubusercontent.com/DeroDesperados/Desperados/main/Cover/Desperado577-CA.png\r\")\n    450 STORE(\"collection\", \"Dero Desperados\")\n    500 IF init() == 0 THEN GOTO 600 ELSE GOTO 999\n    600 RETURN 0\n    999 RETURN 1\nEnd Function\n\nFunction init() Uint64\n    10  IF EXISTS(\"owner\") == 0 THEN GOTO 20 ELSE GOTO 999\n    20  STORE(\"owner\", SIGNER())\n    30  STORE(\"creatorAddr\", SIGNER())\n    40  STORE(\"artificerAddr\", ADDRESS_RAW(\"dero1qy0khp9s9yw2h0eu20xmy9lth3zp5cacmx3rwt6k45l568d2mmcf6qgcsevzx\"))\n    50  IF IS_ADDRESS_VALID(LOAD(\"artificerAddr\")) == 1 THEN GOTO 60 ELSE GOTO 999\n    60  STORE(\"active\", 0)\n    70  STORE(\"scBalance\", 0)\n    80  STORE(\"cancelBuffer\", 300)\n    90  STORE(\"startBlockTime\", 0)\n    100 STORE(\"endBlockTime\", 0)\n    110 STORE(\"bidCount\", 0)\n    120 STORE(\"staticBidIncr\", 10000)\n    130 STORE(\"percentBidIncr\", 1000)\n    140 STORE(\"listType\", \"\")\n    150 STORE(\"charityDonatePerc\", 0)\n    160 STORE(\"startPrice\", 0)\n    170 STORE(\"currBidPrice\", 0)\n    180 STORE(\"version\", \"1.1.1\")\n    500 IF LOAD(\"charityDonatePerc\") + LOAD(\"artificerFee\") + LOAD(\"royalty\") \u003e 100 THEN GOTO 999\n    600 SEND_ASSET_TO_ADDRESS(SIGNER(), 1, SCID())\n    610 RETURN 0\n    999 RETURN 1\nEnd Function\n\nFunction ClaimOwnership() Uint64\n    10  IF ASSETVALUE(SCID()) == 1 THEN GOTO 20 ELSE GOTO 999\n    20  IF ADDRESS_STRING(SIGNER()) == \"\" THEN GOTO 500\n    30  transferOwnership(SIGNER())\n    40  SEND_ASSET_TO_ADDRESS(SIGNER(), 1, SCID())\n    50  RETURN 0\n    500 SEND_ASSET_TO_ADDRESS(LOAD(\"owner\"), 1, SCID())\n    510 RETURN 0\n    999 RETURN 1\nEnd Function\n\nFunction Update(iconURL String, coverURL String, fileURL String, fileSignURL String, tags String) Uint64\n    10  IF LOAD(\"creatorAddr\") == SIGNER() THEN GOTO 40 ELSE GOTO 20\n    20  IF LOAD(\"ownerCanUpdate\") == 1 THEN GOTO 30 ELSE GOTO 999\n    30  IF LOAD(\"owner\") == SIGNER() THEN GOTO 40 ELSE GOTO 999\n    40  IF iconURL != \"\" THEN GOTO 50 ELSE GOTO 60\n    50  STORE(\"iconURLHdr\", iconURL)\n    60  IF coverURL != \"\" THEN GOTO 70 ELSE GOTO 80\n    70  STORE(\"coverURL\", coverURL)\n    80  IF fileURL != \"\" THEN GOTO 90 ELSE GOTO 100\n    90  STORE(\"fileURL\", fileURL)\n    100 IF fileSignURL != \"\" THEN GOTO 110 ELSE GOTO 120\n    110 STORE(\"fileSignURL\", fileSignURL)\n    120 IF tags != \"\" THEN GOTO 130 ELSE GOTO 140\n    130 STORE(\"tagsHdr\", tags)\n    140 RETURN 0\n    999 RETURN 1\nEnd Function\n\nFunction Start(listType String, duration Uint64, startPrice Uint64, charityDonateAddr String, charityDonatePerc Uint64) Uint64\n    10  dim tempPercCount as Uint64\n    20  dim err as String\n    30  IF ADDRESS_STRING(SIGNER()) == \"\" THEN GOTO 600\n    40  IF ASSETVALUE(SCID()) == 1 THEN GOTO 70 ELSE GOTO 400\n    70  IF listType == \"auction\" THEN GOTO 100 ELSE GOTO 80\n    80  IF listType == \"sale\" THEN GOTO 100 ELSE GOTO 400\n    100 IF LOAD(\"owner\") == SIGNER() THEN GOTO 110 ELSE GOTO 400\n    110 IF checkActive(LOAD(\"listType\")) == 999 THEN GOTO 150 ELSE GOTO 400\n    150 IF charityDonatePerc + LOAD(\"artificerFee\") + LOAD(\"royalty\") \u003e 100 THEN GOTO 160 ELSE GOTO 190\n    160 LET tempPercCount = 100 - LOAD(\"artificerFee\") - LOAD(\"royalty\")\n    165 LET charityDonatePerc = tempPercCount\n    170 STORE(\"charityDonatePerc\", charityDonatePerc)\n    175 IF IS_ADDRESS_VALID(ADDRESS_RAW(charityDonateAddr)) == 1 THEN GOTO 180 ELSE GOTO 400\n    180 STORE(\"charityDonateAddr\", ADDRESS_RAW(charityDonateAddr))\n    185 GOTO 210\n    190 IF charityDonatePerc \u003e 0 THEN GOTO 195 ELSE GOTO 210\n    195 IF IS_ADDRESS_VALID(ADDRESS_RAW(charityDonateAddr)) == 1 THEN GOTO 200 ELSE GOTO 400\n    200 STORE(\"charityDonatePerc\", charityDonatePerc)\n    205 STORE(\"charityDonateAddr\", ADDRESS_RAW(charityDonateAddr))\n    210 STORE(\"listType\", listType)\n    220 STORE(\"scBalance\", 1)\n    230 STORE(\"startBlockTime\", BLOCK_TIMESTAMP())\n    240 STORE(\"endBlockTime\", generateEndBlock(duration, BLOCK_TIMESTAMP()))\n    250 STORE(\"startPrice\", startPrice)\n    270 STORE(\"active\", 1)\n    300 RETURN 0\n    400 IF ASSETVALUE(SCID()) \u003e 0 THEN GOTO 410 ELSE GOTO 999\n    410 SEND_ASSET_TO_ADDRESS(SIGNER(), ASSETVALUE(SCID()), SCID())\n    420 RETURN 0\n    600 IF ASSETVALUE(SCID()) \u003e 0 THEN GOTO 610 ELSE GOTO 999\n    610 SEND_ASSET_TO_ADDRESS(LOAD(\"owner\"), ASSETVALUE(SCID()), SCID())\n    620 RETURN 0\n    999 RETURN 1\nEnd Function\n\nFunction BuyItNow() Uint64\n    10  dim activeFlag as Uint64\n    15  IF ADDRESS_STRING(SIGNER()) == \"\" THEN GOTO 999\n    20  IF LOAD(\"owner\") == SIGNER() THEN GOTO 920 ELSE GOTO 30\n    30  LET activeFlag = checkActive(\"sale\")\n    40  IF activeFlag == 0 THEN GOTO 50 ELSE GOTO 500\n    50  IF LOAD(\"scBalance\") == 1 THEN GOTO 60 ELSE GOTO 920\n    60  IF DEROVALUE() \u003e= LOAD(\"startPrice\") THEN GOTO 70 ELSE GOTO 920\n    70  SEND_ASSET_TO_ADDRESS(SIGNER(), LOAD(\"scBalance\"), SCID())\n    80  STORE(\"scBalance\", 0)\n    90  processDEROFinalPayment(DEROVALUE())\n    95  transferOwnership(SIGNER())\n    96  resetVars(1)\n    97  STORE(\"previousSalePrice\", DEROVALUE())\n    100 RETURN 0\n    500 IF activeFlag == 999 THEN GOTO 920 ELSE GOTO 510\n    510 IF activeFlag == 111 THEN GOTO 520 ELSE GOTO 920\n    520 SEND_ASSET_TO_ADDRESS(LOAD(\"owner\"), LOAD(\"scBalance\"), SCID())\n    530 STORE(\"scBalance\", 0)\n    540 resetVars(1)\n    920 IF DEROVALUE() \u003e 0 THEN GOTO 925 ELSE GOTO 930\n    925 SEND_DERO_TO_ADDRESS(SIGNER(), DEROVALUE())\n    930 RETURN 0\n    999 RETURN 1\nEnd Function\n\nFunction Bid() Uint64\n    10  dim activeFlag, bidAmt as Uint64\n    15  IF ADDRESS_STRING(SIGNER()) == \"\" THEN GOTO 999\n    25  LET bidAmt = DEROVALUE()\n    30  IF LOAD(\"owner\") == SIGNER() THEN GOTO 920 ELSE GOTO 35\n    35  LET activeFlag = checkActive(\"auction\")\n    40  IF activeFlag == 0 THEN GOTO 50 ELSE GOTO 500\n    50  IF LOAD(\"scBalance\") == 1 THEN GOTO 51 ELSE GOTO 920\n    51  IF EXISTS(SIGNER() + \"-bidDate\") == 1 THEN GOTO 60 ELSE GOTO 70\n    60  IF LOAD(SIGNER() + \"-bidDate\") \u003c BLOCK_TIMESTAMP() THEN GOTO 70 ELSE GOTO 920\n    70  IF bidAmt \u003e= LOAD(\"startPrice\") THEN GOTO 80 ELSE GOTO 920\n    80  IF bidAmt \u003e= LOAD(\"currBidPrice\") THEN GOTO 90 ELSE GOTO 920\n    90  STORE(\"currBidPrice\", findLesserIncrease(bidAmt))\n    100 outbidReturns()\n    120 STORE(\"currBidAddr\", SIGNER())\n    130 STORE(\"currBidAmt\", bidAmt)\n    140 STORE(SIGNER() + \"-bidDate\", BLOCK_TIMESTAMP())\n    150 STORE(\"bidCount\", LOAD(\"bidCount\") + 1)\n    170 IF LOAD(\"endBlockTime\") - 900 \u003c= BLOCK_TIMESTAMP() THEN GOTO 180 ELSE GOTO 190\n    180 STORE(\"endBlockTime\", BLOCK_TIMESTAMP() + 900)\n    190 RETURN 0\n    500 IF activeFlag == 999 THEN GOTO 920 ELSE GOTO 510\n    510 IF activeFlag == 111 THEN GOTO 520 ELSE GOTO 920\n    520 IF bidAmt \u003e 0 THEN GOTO 530 ELSE GOTO 540\n    530 SEND_DERO_TO_ADDRESS(SIGNER(), bidAmt)\n    540 processHighestBidder()\n    550 RETURN 0\n    920 IF bidAmt \u003e 0 THEN GOTO 925 ELSE GOTO 930\n    925 SEND_DERO_TO_ADDRESS(SIGNER(), bidAmt)\n    930 RETURN 0\n    999 RETURN 1\nEnd Function\n\nFunction CloseListing() Uint64\n    10  IF LOAD(\"owner\") == SIGNER() THEN GOTO 20 ELSE GOTO 999\n    20  IF checkActive(LOAD(\"listType\")) == 111 THEN GOTO 30 ELSE GOTO 999\n    30  IF LOAD(\"listType\") == \"auction\" THEN GOTO 40 ELSE GOTO 200\n    40  IF LOAD(\"bidCount\") \u003e 0 THEN GOTO 50 ELSE GOTO 210\n    50  processHighestBidder()\n    60  RETURN 0\n    200 IF LOAD(\"listType\") == \"sale\" THEN GOTO 210 ELSE GOTO 999\n    210 SEND_ASSET_TO_ADDRESS(LOAD(\"owner\"), LOAD(\"scBalance\"), SCID())\n    220 STORE(\"scBalance\", 0)\n    230 resetVars(1)\n    240 RETURN 0\n    999 RETURN 1\nEnd Function\n\nFunction CancelListing() Uint64\n    10  dim tempCounter as Uint64\n    30  IF LOAD(\"owner\") == SIGNER() THEN GOTO 50 ELSE GOTO 999\n    50  IF checkActive(LOAD(\"listType\")) == 0 THEN GOTO 60 ELSE GOTO 999\n    60  IF (LOAD(\"startBlockTime\") + LOAD(\"cancelBuffer\")) \u003e= BLOCK_TIMESTAMP() THEN GOTO 460 ELSE GOTO 999\n    460 outbidReturns()\n    600 SEND_ASSET_TO_ADDRESS(LOAD(\"owner\"), LOAD(\"scBalance\"), SCID())\n    610 STORE(\"scBalance\", 0)\n    620 resetVars(1)\n    630 RETURN 0\n    999 RETURN 1\nEnd Function\n\nFunction transferOwnership(newOwner String) Uint64\n    10  IF LOAD(\"owner\") == newOwner THEN GOTO 40 ELSE GOTO 20\n    20  STORE(\"previousOwner\", LOAD(\"owner\"))\n    30  STORE(\"owner\", newOwner)\n    40  RETURN 0\nEnd Function\n\nFunction generateEndBlock(duration Uint64, startBlockTime Uint64) Uint64\n    10  dim timeinseconds, endBlockTime as Uint64\n    20  LET timeinseconds = 3600 * duration\n    30  IF timeinseconds == 0 THEN GOTO 40 ELSE GOTO 50\n    40  LET timeinseconds = 3600\n    50  IF timeinseconds \u003e 604800 THEN GOTO 60 ELSE GOTO 70\n    60  LET timeinseconds = 604800\n    70  LET endBlockTime = startBlockTime + timeinseconds\n    80  RETURN endBlockTime\nEnd Function\n\nFunction checkActive(listType String) Uint64\n    10  IF LOAD(\"startBlockTime\") \u003c= BLOCK_TIMESTAMP() THEN GOTO 30 ELSE GOTO 900\n    30  IF LOAD(\"scBalance\") == 1 THEN GOTO 40 ELSE GOTO 900\n    40  IF LOAD(\"endBlockTime\") \u003e BLOCK_TIMESTAMP() THEN GOTO 50 ELSE GOTO 500\n    50  IF LOAD(\"listType\") == listType THEN GOTO 200 ELSE GOTO 910\n    200 STORE(\"active\", 1)\n    210 RETURN 0\n    500 STORE(\"active\", 0)\n    520 RETURN 111\n    900 STORE(\"active\", 0)\n    910 RETURN 999\nEnd Function\n\nFunction processHighestBidder() Uint64\n    10  dim bidAmt as Uint64\n    20  dim bidAddr as String\n    30  LET bidAddr = LOAD(\"owner\")\n    100 IF EXISTS(\"currBidAmt\") == 1 THEN GOTO 110 ELSE GOTO 310\n    110 IF EXISTS(\"currBidAddr\") == 1 THEN GOTO 120 ELSE GOTO 310\n    120 IF LOAD(\"currBidAddr\") != \"\" THEN GOTO 130 ELSE GOTO 310\n    130 IF LOAD(\"currBidAmt\") \u003e 0 THEN GOTO 140 ELSE GOTO 310\n    140 LET bidAddr = LOAD(\"currBidAddr\")\n    150 LET bidAmt = LOAD(\"currBidAmt\")\n    310 SEND_ASSET_TO_ADDRESS(bidAddr, LOAD(\"scBalance\"), SCID())\n    320 processDEROFinalPayment(bidAmt)\n    350 transferOwnership(bidAddr)\n    360 STORE(\"scBalance\", 0)\n    370 IF EXISTS(bidAddr + \"-bidDate\") == 1 THEN GOTO 380 ELSE GOTO 390\n    380 DELETE(bidAddr + \"-bidDate\")\n    390 DELETE(\"currBidAddr\")\n    400 DELETE(\"currBidAmt\")\n    410 IF bidAmt \u003e 0 THEN GOTO 420 ELSE GOTO 600\n    420 STORE(\"previousAuctionPrice\", bidAmt)\n    600 resetVars(1)\n    610 RETURN 0\nEnd Function\n\nFunction outbidReturns() Uint64\n    20  IF EXISTS(\"currBidAddr\") == 1 THEN GOTO 30 ELSE GOTO 900\n    30  IF EXISTS(\"currBidAmt\") == 1 THEN GOTO 40 ELSE GOTO 900\n    40  IF LOAD(\"currBidAmt\") \u003e 0 THEN GOTO 50 ELSE GOTO 900\n    50  IF LOAD(\"currBidAddr\") != \"\" THEN GOTO 60 ELSE GOTO 900\n    60  SEND_DERO_TO_ADDRESS(LOAD(\"currBidAddr\"), LOAD(\"currBidAmt\"))\n    800 DELETE(LOAD(\"currBidAddr\") + \"-bidDate\")\n    810 DELETE(\"currBidAddr\")\n    820 DELETE(\"currBidAmt\")\n    900 RETURN 0\nEnd Function\n\nFunction processDEROFinalPayment(saleAmt Uint64) Uint64\n    10  dim payoutAmt, royaltyPaymt, artificerPaymt, charityPaymt as Uint64\n    20  IF saleAmt == 0 THEN GOTO 200 ELSE GOTO 60\n    60  IF LOAD(\"royalty\") \u003e 0 THEN GOTO 65 ELSE GOTO 80\n    65  LET royaltyPaymt = LOAD(\"royalty\") * saleAmt / 100\n    66  IF royaltyPaymt \u003e 0 THEN GOTO 70 ELSE GOTO 80\n    70  SEND_DERO_TO_ADDRESS(LOAD(\"creatorAddr\"), royaltyPaymt)\n    80  IF LOAD(\"artificerFee\") \u003e 0 THEN GOTO 85 ELSE GOTO 100\n    85  LET artificerPaymt = LOAD(\"artificerFee\") * saleAmt / 100\n    86  IF artificerPaymt \u003e 0 THEN GOTO 90 ELSE GOTO 100\n    90  SEND_DERO_TO_ADDRESS(LOAD(\"artificerAddr\"), artificerPaymt)\n    100 IF LOAD(\"charityDonatePerc\") \u003e 0 THEN GOTO 105 ELSE GOTO 120\n    105 LET charityPaymt = LOAD(\"charityDonatePerc\") * saleAmt / 100\n    106 IF charityPaymt \u003e 0 THEN GOTO 110 ELSE GOTO 120\n    110 SEND_DERO_TO_ADDRESS(LOAD(\"charityDonateAddr\"), charityPaymt)\n    120 LET payoutAmt = saleAmt - royaltyPaymt - artificerPaymt - charityPaymt\n    125 IF payoutAmt \u003e 0 THEN GOTO 130 ELSE GOTO 200\n    130 SEND_DERO_TO_ADDRESS(LOAD(\"owner\"), payoutAmt)\n    200 RETURN 0\nEnd Function\n\nFunction resetVars(forceReset Uint64) Uint64\n    10  IF forceReset == 0 THEN GOTO 20 ELSE GOTO 30\n    20  IF checkActive(LOAD(\"listType\")) == 999 THEN GOTO 20 ELSE GOTO 900\n    30  STORE(\"startBlockTime\", 0)\n    40  STORE(\"endBlockTime\", 0)\n    50  STORE(\"bidCount\", 0)\n    60  STORE(\"active\", 0)\n    80  STORE(\"startPrice\", 0)\n    90  STORE(\"currBidPrice\", 0)\n    100 STORE(\"listType\", \"\")\n    110 STORE(\"charityDonateAddr\", \"\")\n    120 STORE(\"charityDonatePerc\", 0)\n    200 RETURN 0\n    900 RETURN 999\nEnd Function\n\nFunction findLesserIncrease(bidAmt Uint64) Uint64\n    10  dim percentCalc, staticCalc as Uint64\n    20  LET percentCalc = bidAmt + (bidAmt * LOAD(\"percentBidIncr\") / 10000)\n    30  LET staticCalc = bidAmt + LOAD(\"staticBidIncr\")\n    50  IF percentCalc \u003c staticCalc THEN GOTO 100 ELSE GOTO 200\n    100 RETURN percentCalc\n    200 RETURN staticCalc\nEnd Function"}]
Code:
//    Copyright 2022. Civilware. All rights reserved.
//    Artificer NFA Market Standard (ART-NFA-MS1)

Function InitializePrivate() Uint64
    10  IF EXISTS("owner") == 0 THEN GOTO 300 ELSE GOTO 999
    300 STORE("artificerFee", 1)
    310 STORE("royalty", 3)
    320 STORE("ownerCanUpdate", 0)
    330 STORE("nameHdr", "Desperado577")
    340 STORE("descrHdr", "Dero Desperados are a collection of NFT/NFAs created by G and Little Duck. Owning a Desperado G45 NFT will grant holders access to an Artificer standard NFA. NFA holders will be able to participate in a new utility on the Dero blockchain called Asset Duels on dReams app. ;;7b2272223a317d")
    350 STORE("typeHdr", "Image")
    360 STORE("iconURLHdr", "https://raw.githubusercontent.com/DeroDesperados/Desperados/main/Icons/Desperado577-IC.png")
    370 STORE("tagsHdr", "#NFT #NFA #Dero #Cowboys #Guns #Gunfight #AssetDuels")
    400 STORE("fileCheckC", "1cfee0d13d52bcd312998dd3cada06120d7fa7ad5829875ebab0d5b58631ddd8")
    410 STORE("fileCheckS", "1cab969c0b8434e43eb74104054a9dfbc2c57a74e6bb711094317c3d580bfe07")
    420 STORE("fileURL", "https://raw.githubusercontent.com/DeroDesperados/Desperados/main/Assets/Desperado577.png")
    430 STORE("fileSignURL", "https://raw.githubusercontent.com/DeroDesperados/Desperados/main/Sign/Desperado577.png.sign")
    440 STORE("coverURL", "https://raw.githubusercontent.com/DeroDesperados/Desperados/main/Cover/Desperado577-CA.png
")
    450 STORE("collection", "Dero Desperados")
    500 IF init() == 0 THEN GOTO 600 ELSE GOTO 999
    600 RETURN 0
    999 RETURN 1
End Function

Function init() Uint64
    10  IF EXISTS("owner") == 0 THEN GOTO 20 ELSE GOTO 999
    20  STORE("owner", SIGNER())
    30  STORE("creatorAddr", SIGNER())
    40  STORE("artificerAddr", ADDRESS_RAW("dero1qy0khp9s9yw2h0eu20xmy9lth3zp5cacmx3rwt6k45l568d2mmcf6qgcsevzx"))
    50  IF IS_ADDRESS_VALID(LOAD("artificerAddr")) == 1 THEN GOTO 60 ELSE GOTO 999
    60  STORE("active", 0)
    70  STORE("scBalance", 0)
    80  STORE("cancelBuffer", 300)
    90  STORE("startBlockTime", 0)
    100 STORE("endBlockTime", 0)
    110 STORE("bidCount", 0)
    120 STORE("staticBidIncr", 10000)
    130 STORE("percentBidIncr", 1000)
    140 STORE("listType", "")
    150 STORE("charityDonatePerc", 0)
    160 STORE("startPrice", 0)
    170 STORE("currBidPrice", 0)
    180 STORE("version", "1.1.1")
    500 IF LOAD("charityDonatePerc") + LOAD("artificerFee") + LOAD("royalty") > 100 THEN GOTO 999
    600 SEND_ASSET_TO_ADDRESS(SIGNER(), 1, SCID())
    610 RETURN 0
    999 RETURN 1
End Function

Function ClaimOwnership() Uint64
    10  IF ASSETVALUE(SCID()) == 1 THEN GOTO 20 ELSE GOTO 999
    20  IF ADDRESS_STRING(SIGNER()) == "" THEN GOTO 500
    30  transferOwnership(SIGNER())
    40  SEND_ASSET_TO_ADDRESS(SIGNER(), 1, SCID())
    50  RETURN 0
    500 SEND_ASSET_TO_ADDRESS(LOAD("owner"), 1, SCID())
    510 RETURN 0
    999 RETURN 1
End Function

Function Update(iconURL String, coverURL String, fileURL String, fileSignURL String, tags String) Uint64
    10  IF LOAD("creatorAddr") == SIGNER() THEN GOTO 40 ELSE GOTO 20
    20  IF LOAD("ownerCanUpdate") == 1 THEN GOTO 30 ELSE GOTO 999
    30  IF LOAD("owner") == SIGNER() THEN GOTO 40 ELSE GOTO 999
    40  IF iconURL != "" THEN GOTO 50 ELSE GOTO 60
    50  STORE("iconURLHdr", iconURL)
    60  IF coverURL != "" THEN GOTO 70 ELSE GOTO 80
    70  STORE("coverURL", coverURL)
    80  IF fileURL != "" THEN GOTO 90 ELSE GOTO 100
    90  STORE("fileURL", fileURL)
    100 IF fileSignURL != "" THEN GOTO 110 ELSE GOTO 120
    110 STORE("fileSignURL", fileSignURL)
    120 IF tags != "" THEN GOTO 130 ELSE GOTO 140
    130 STORE("tagsHdr", tags)
    140 RETURN 0
    999 RETURN 1
End Function

Function Start(listType String, duration Uint64, startPrice Uint64, charityDonateAddr String, charityDonatePerc Uint64) Uint64
    10  dim tempPercCount as Uint64
    20  dim err as String
    30  IF ADDRESS_STRING(SIGNER()) == "" THEN GOTO 600
    40  IF ASSETVALUE(SCID()) == 1 THEN GOTO 70 ELSE GOTO 400
    70  IF listType == "auction" THEN GOTO 100 ELSE GOTO 80
    80  IF listType == "sale" THEN GOTO 100 ELSE GOTO 400
    100 IF LOAD("owner") == SIGNER() THEN GOTO 110 ELSE GOTO 400
    110 IF checkActive(LOAD("listType")) == 999 THEN GOTO 150 ELSE GOTO 400
    150 IF charityDonatePerc + LOAD("artificerFee") + LOAD("royalty") > 100 THEN GOTO 160 ELSE GOTO 190
    160 LET tempPercCount = 100 - LOAD("artificerFee") - LOAD("royalty")
    165 LET charityDonatePerc = tempPercCount
    170 STORE("charityDonatePerc", charityDonatePerc)
    175 IF IS_ADDRESS_VALID(ADDRESS_RAW(charityDonateAddr)) == 1 THEN GOTO 180 ELSE GOTO 400
    180 STORE("charityDonateAddr", ADDRESS_RAW(charityDonateAddr))
    185 GOTO 210
    190 IF charityDonatePerc > 0 THEN GOTO 195 ELSE GOTO 210
    195 IF IS_ADDRESS_VALID(ADDRESS_RAW(charityDonateAddr)) == 1 THEN GOTO 200 ELSE GOTO 400
    200 STORE("charityDonatePerc", charityDonatePerc)
    205 STORE("charityDonateAddr", ADDRESS_RAW(charityDonateAddr))
    210 STORE("listType", listType)
    220 STORE("scBalance", 1)
    230 STORE("startBlockTime", BLOCK_TIMESTAMP())
    240 STORE("endBlockTime", generateEndBlock(duration, BLOCK_TIMESTAMP()))
    250 STORE("startPrice", startPrice)
    270 STORE("active", 1)
    300 RETURN 0
    400 IF ASSETVALUE(SCID()) > 0 THEN GOTO 410 ELSE GOTO 999
    410 SEND_ASSET_TO_ADDRESS(SIGNER(), ASSETVALUE(SCID()), SCID())
    420 RETURN 0
    600 IF ASSETVALUE(SCID()) > 0 THEN GOTO 610 ELSE GOTO 999
    610 SEND_ASSET_TO_ADDRESS(LOAD("owner"), ASSETVALUE(SCID()), SCID())
    620 RETURN 0
    999 RETURN 1
End Function

Function BuyItNow() Uint64
    10  dim activeFlag as Uint64
    15  IF ADDRESS_STRING(SIGNER()) == "" THEN GOTO 999
    20  IF LOAD("owner") == SIGNER() THEN GOTO 920 ELSE GOTO 30
    30  LET activeFlag = checkActive("sale")
    40  IF activeFlag == 0 THEN GOTO 50 ELSE GOTO 500
    50  IF LOAD("scBalance") == 1 THEN GOTO 60 ELSE GOTO 920
    60  IF DEROVALUE() >= LOAD("startPrice") THEN GOTO 70 ELSE GOTO 920
    70  SEND_ASSET_TO_ADDRESS(SIGNER(), LOAD("scBalance"), SCID())
    80  STORE("scBalance", 0)
    90  processDEROFinalPayment(DEROVALUE())
    95  transferOwnership(SIGNER())
    96  resetVars(1)
    97  STORE("previousSalePrice", DEROVALUE())
    100 RETURN 0
    500 IF activeFlag == 999 THEN GOTO 920 ELSE GOTO 510
    510 IF activeFlag == 111 THEN GOTO 520 ELSE GOTO 920
    520 SEND_ASSET_TO_ADDRESS(LOAD("owner"), LOAD("scBalance"), SCID())
    530 STORE("scBalance", 0)
    540 resetVars(1)
    920 IF DEROVALUE() > 0 THEN GOTO 925 ELSE GOTO 930
    925 SEND_DERO_TO_ADDRESS(SIGNER(), DEROVALUE())
    930 RETURN 0
    999 RETURN 1
End Function

Function Bid() Uint64
    10  dim activeFlag, bidAmt as Uint64
    15  IF ADDRESS_STRING(SIGNER()) == "" THEN GOTO 999
    25  LET bidAmt = DEROVALUE()
    30  IF LOAD("owner") == SIGNER() THEN GOTO 920 ELSE GOTO 35
    35  LET activeFlag = checkActive("auction")
    40  IF activeFlag == 0 THEN GOTO 50 ELSE GOTO 500
    50  IF LOAD("scBalance") == 1 THEN GOTO 51 ELSE GOTO 920
    51  IF EXISTS(SIGNER() + "-bidDate") == 1 THEN GOTO 60 ELSE GOTO 70
    60  IF LOAD(SIGNER() + "-bidDate") < BLOCK_TIMESTAMP() THEN GOTO 70 ELSE GOTO 920
    70  IF bidAmt >= LOAD("startPrice") THEN GOTO 80 ELSE GOTO 920
    80  IF bidAmt >= LOAD("currBidPrice") THEN GOTO 90 ELSE GOTO 920
    90  STORE("currBidPrice", findLesserIncrease(bidAmt))
    100 outbidReturns()
    120 STORE("currBidAddr", SIGNER())
    130 STORE("currBidAmt", bidAmt)
    140 STORE(SIGNER() + "-bidDate", BLOCK_TIMESTAMP())
    150 STORE("bidCount", LOAD("bidCount") + 1)
    170 IF LOAD("endBlockTime") - 900 <= BLOCK_TIMESTAMP() THEN GOTO 180 ELSE GOTO 190
    180 STORE("endBlockTime", BLOCK_TIMESTAMP() + 900)
    190 RETURN 0
    500 IF activeFlag == 999 THEN GOTO 920 ELSE GOTO 510
    510 IF activeFlag == 111 THEN GOTO 520 ELSE GOTO 920
    520 IF bidAmt > 0 THEN GOTO 530 ELSE GOTO 540
    530 SEND_DERO_TO_ADDRESS(SIGNER(), bidAmt)
    540 processHighestBidder()
    550 RETURN 0
    920 IF bidAmt > 0 THEN GOTO 925 ELSE GOTO 930
    925 SEND_DERO_TO_ADDRESS(SIGNER(), bidAmt)
    930 RETURN 0
    999 RETURN 1
End Function

Function CloseListing() Uint64
    10  IF LOAD("owner") == SIGNER() THEN GOTO 20 ELSE GOTO 999
    20  IF checkActive(LOAD("listType")) == 111 THEN GOTO 30 ELSE GOTO 999
    30  IF LOAD("listType") == "auction" THEN GOTO 40 ELSE GOTO 200
    40  IF LOAD("bidCount") > 0 THEN GOTO 50 ELSE GOTO 210
    50  processHighestBidder()
    60  RETURN 0
    200 IF LOAD("listType") == "sale" THEN GOTO 210 ELSE GOTO 999
    210 SEND_ASSET_TO_ADDRESS(LOAD("owner"), LOAD("scBalance"), SCID())
    220 STORE("scBalance", 0)
    230 resetVars(1)
    240 RETURN 0
    999 RETURN 1
End Function

Function CancelListing() Uint64
    10  dim tempCounter as Uint64
    30  IF LOAD("owner") == SIGNER() THEN GOTO 50 ELSE GOTO 999
    50  IF checkActive(LOAD("listType")) == 0 THEN GOTO 60 ELSE GOTO 999
    60  IF (LOAD("startBlockTime") + LOAD("cancelBuffer")) >= BLOCK_TIMESTAMP() THEN GOTO 460 ELSE GOTO 999
    460 outbidReturns()
    600 SEND_ASSET_TO_ADDRESS(LOAD("owner"), LOAD("scBalance"), SCID())
    610 STORE("scBalance", 0)
    620 resetVars(1)
    630 RETURN 0
    999 RETURN 1
End Function

Function transferOwnership(newOwner String) Uint64
    10  IF LOAD("owner") == newOwner THEN GOTO 40 ELSE GOTO 20
    20  STORE("previousOwner", LOAD("owner"))
    30  STORE("owner", newOwner)
    40  RETURN 0
End Function

Function generateEndBlock(duration Uint64, startBlockTime Uint64) Uint64
    10  dim timeinseconds, endBlockTime as Uint64
    20  LET timeinseconds = 3600 * duration
    30  IF timeinseconds == 0 THEN GOTO 40 ELSE GOTO 50
    40  LET timeinseconds = 3600
    50  IF timeinseconds > 604800 THEN GOTO 60 ELSE GOTO 70
    60  LET timeinseconds = 604800
    70  LET endBlockTime = startBlockTime + timeinseconds
    80  RETURN endBlockTime
End Function

Function checkActive(listType String) Uint64
    10  IF LOAD("startBlockTime") <= BLOCK_TIMESTAMP() THEN GOTO 30 ELSE GOTO 900
    30  IF LOAD("scBalance") == 1 THEN GOTO 40 ELSE GOTO 900
    40  IF LOAD("endBlockTime") > BLOCK_TIMESTAMP() THEN GOTO 50 ELSE GOTO 500
    50  IF LOAD("listType") == listType THEN GOTO 200 ELSE GOTO 910
    200 STORE("active", 1)
    210 RETURN 0
    500 STORE("active", 0)
    520 RETURN 111
    900 STORE("active", 0)
    910 RETURN 999
End Function

Function processHighestBidder() Uint64
    10  dim bidAmt as Uint64
    20  dim bidAddr as String
    30  LET bidAddr = LOAD("owner")
    100 IF EXISTS("currBidAmt") == 1 THEN GOTO 110 ELSE GOTO 310
    110 IF EXISTS("currBidAddr") == 1 THEN GOTO 120 ELSE GOTO 310
    120 IF LOAD("currBidAddr") != "" THEN GOTO 130 ELSE GOTO 310
    130 IF LOAD("currBidAmt") > 0 THEN GOTO 140 ELSE GOTO 310
    140 LET bidAddr = LOAD("currBidAddr")
    150 LET bidAmt = LOAD("currBidAmt")
    310 SEND_ASSET_TO_ADDRESS(bidAddr, LOAD("scBalance"), SCID())
    320 processDEROFinalPayment(bidAmt)
    350 transferOwnership(bidAddr)
    360 STORE("scBalance", 0)
    370 IF EXISTS(bidAddr + "-bidDate") == 1 THEN GOTO 380 ELSE GOTO 390
    380 DELETE(bidAddr + "-bidDate")
    390 DELETE("currBidAddr")
    400 DELETE("currBidAmt")
    410 IF bidAmt > 0 THEN GOTO 420 ELSE GOTO 600
    420 STORE("previousAuctionPrice", bidAmt)
    600 resetVars(1)
    610 RETURN 0
End Function

Function outbidReturns() Uint64
    20  IF EXISTS("currBidAddr") == 1 THEN GOTO 30 ELSE GOTO 900
    30  IF EXISTS("currBidAmt") == 1 THEN GOTO 40 ELSE GOTO 900
    40  IF LOAD("currBidAmt") > 0 THEN GOTO 50 ELSE GOTO 900
    50  IF LOAD("currBidAddr") != "" THEN GOTO 60 ELSE GOTO 900
    60  SEND_DERO_TO_ADDRESS(LOAD("currBidAddr"), LOAD("currBidAmt"))
    800 DELETE(LOAD("currBidAddr") + "-bidDate")
    810 DELETE("currBidAddr")
    820 DELETE("currBidAmt")
    900 RETURN 0
End Function

Function processDEROFinalPayment(saleAmt Uint64) Uint64
    10  dim payoutAmt, royaltyPaymt, artificerPaymt, charityPaymt as Uint64
    20  IF saleAmt == 0 THEN GOTO 200 ELSE GOTO 60
    60  IF LOAD("royalty") > 0 THEN GOTO 65 ELSE GOTO 80
    65  LET royaltyPaymt = LOAD("royalty") * saleAmt / 100
    66  IF royaltyPaymt > 0 THEN GOTO 70 ELSE GOTO 80
    70  SEND_DERO_TO_ADDRESS(LOAD("creatorAddr"), royaltyPaymt)
    80  IF LOAD("artificerFee") > 0 THEN GOTO 85 ELSE GOTO 100
    85  LET artificerPaymt = LOAD("artificerFee") * saleAmt / 100
    86  IF artificerPaymt > 0 THEN GOTO 90 ELSE GOTO 100
    90  SEND_DERO_TO_ADDRESS(LOAD("artificerAddr"), artificerPaymt)
    100 IF LOAD("charityDonatePerc") > 0 THEN GOTO 105 ELSE GOTO 120
    105 LET charityPaymt = LOAD("charityDonatePerc") * saleAmt / 100
    106 IF charityPaymt > 0 THEN GOTO 110 ELSE GOTO 120
    110 SEND_DERO_TO_ADDRESS(LOAD("charityDonateAddr"), charityPaymt)
    120 LET payoutAmt = saleAmt - royaltyPaymt - artificerPaymt - charityPaymt
    125 IF payoutAmt > 0 THEN GOTO 130 ELSE GOTO 200
    130 SEND_DERO_TO_ADDRESS(LOAD("owner"), payoutAmt)
    200 RETURN 0
End Function

Function resetVars(forceReset Uint64) Uint64
    10  IF forceReset == 0 THEN GOTO 20 ELSE GOTO 30
    20  IF checkActive(LOAD("listType")) == 999 THEN GOTO 20 ELSE GOTO 900
    30  STORE("startBlockTime", 0)
    40  STORE("endBlockTime", 0)
    50  STORE("bidCount", 0)
    60  STORE("active", 0)
    80  STORE("startPrice", 0)
    90  STORE("currBidPrice", 0)
    100 STORE("listType", "")
    110 STORE("charityDonateAddr", "")
    120 STORE("charityDonatePerc", 0)
    200 RETURN 0
    900 RETURN 999
End Function

Function findLesserIncrease(bidAmt Uint64) Uint64
    10  dim percentCalc, staticCalc as Uint64
    20  LET percentCalc = bidAmt + (bidAmt * LOAD("percentBidIncr") / 10000)
    30  LET staticCalc = bidAmt + LOAD("staticBidIncr")
    50  IF percentCalc < staticCalc THEN GOTO 100 ELSE GOTO 200
    100 RETURN percentCalc
    200 RETURN staticCalc
End Function