Skip to content

Latest commit

 

History

History
109 lines (69 loc) · 42.7 KB

README.md

File metadata and controls

109 lines (69 loc) · 42.7 KB

Curta ^ Paradigm CTF 2023 Player NFTs

An NFT collection to commemorate players of the Curta team for their participation and performance in the 2023 Paradigm CTF.

In addition to displaying the team's results, the metadata of each token contains a 100% onchain-generated 1:38 minute long audio arrangement of "In the Hall of the Mountain King" by Edvard Grieg with 3 layered melody lines and a bass line at 117.1875 BPM.

curta-paradigm-2023-start.mp4

Onchain audio generation

Bytebeat generation

Definition [Source] Bytebeat music (or one-liner music) was invented in September 2011. They're generally a piece of rhythmic and somewhat melodic music with no score, no instruments, and no real oscillators. It's simply a single-line formula that defines a waveform as a function of time, processed (usually) 8000 times per second, resulting in an audible waveform with a 256-step resolution from silence (0) to full amplitude (256). If you put that formula into a program with a loop that increments time variable (t), you can generate the headerless unsigned 8 bit mono 8kHz audio stream on output, like in this application. Since these directly output a waveform, they have great performance in compiled languages and can often be ran on even the weakest embedded devices.

The following is a JavaScript bytebeat format implementation for the audio in this project (1:38 minute long audio arrangement of "In the Hall of the Mountain King" by Edvard Grieg with 3 layered melody lines and a bass line at 117.1875 BPM):

c='charCodeAt',u=(t>>18)%3,r=(t)=>t&256?t&255:256-(t&255),a=30*t*2**(("%'(*,(,,+'++*&**%'(*,(,1/,(,////"[c](t>>11&31)+[0,12,7,19][t>>16&3])/12-6),x=30*t*2**(("%,%,%,%,%,%,(/(/,3,3(0,3"[c](8*(t>>17&1?2:t>>15&1)+(t>>12&7)))/12-7),y=a*2,z=y*2,r(a)/(5-(u>1))+(u>0)/5*r(y)+(u>1)*(r(z)/5+r(x)/4)

Visualizer

The audio file for this project has a sample rate of 8000Hz, and each loop is $3\cdot2^{18}$ samples long, so to generate the audio file, compute the value returned by the expression for $\texttt{t}\in[0, 3\cdot2^{18}-1]$ (you can query any range, but this is what's outputted by this project). Then, concatenate the results and prefix it with a WAVE file header.

For practicality, the metadata returned by tokenURI accomplishes this with JavaScript, but the same result can be yielded directly from the smart contract via getSoundValueAt(uint256 _tick) and getAudioFileWavHeader().

Deployment

CurtaPCTF2023 was deployed on Ethereum at 0x6F2Df6c95D80e359a25b6a549037F3B70879B343 compiled with 1_000_000 optimization runs and solc version 0.8.21+commit.d9974bed through the ImmutableCreate2Factory at 0x0000000000FFe8B47B3e2130213B802212439497 with the salt

0x0000000000000000000000000000000000000000000000000000000000000000

and the bytecode

0x60806040523480156200001157600080fd5b50604051620046ae380380620046ae8339810160408190526200003491620000e9565b80604051806060016040528060258152602001620046896025913960408051808201909152601081526f504354467b43555237345f323032337d60801b60208201526000620000848382620001c0565b506001620000938282620001c0565b5050600680546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350506200028c565b600060208284031215620000fc57600080fd5b81516001600160a01b03811681146200011457600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200014657607f821691505b6020821081036200016757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001bb57600081815260208120601f850160051c81016020861015620001965750805b601f850160051c820191505b81811015620001b757828155600101620001a2565b5050505b505050565b81516001600160401b03811115620001dc57620001dc6200011b565b620001f481620001ed845462000131565b846200016d565b602080601f8311600181146200022c5760008415620002135750858301515b600019600386901b1c1916600185901b178555620001b7565b600085815260208120601f198616915b828110156200025d578886015182559484019460019091019084016200023c565b50858210156200027c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6143ed806200029c6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80636c0360eb116100d8578063b88d4fde1161008c578063e8a3d48511610066578063e8a3d48514610334578063e985e9c51461033c578063f2fde38b1461036a57600080fd5b8063b88d4fde14610306578063bd59342414610319578063c87b56dd1461032157600080fd5b80638da5cb5b116100bd5780638da5cb5b146102cb57806395d89b41146102eb578063a22cb465146102f357600080fd5b80636c0360eb146102a257806370a08231146102aa57600080fd5b806323b872dd1161012f57806342842e0e1161011457806342842e0e1461026957806355f804b31461027c5780636352211e1461028f57600080fd5b806323b872dd14610231578063333a70041461024457600080fd5b8063081812fc11610160578063081812fc146101b9578063095ea7b3146102145780631249c58b1461022957600080fd5b806301ffc9a71461017c57806306fdde03146101a4575b600080fd5b61018f61018a366004612752565b61037d565b60405190151581526020015b60405180910390f35b6101ac610462565b60405161019b91906127dd565b6101ef6101c73660046127f0565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b61022761022236600461282d565b6104f0565b005b61022761063f565b61022761023f366004612857565b610659565b6102576102523660046127f0565b610920565b60405160ff909116815260200161019b565b610227610277366004612857565b61092b565b61022761028a3660046128dc565b610a95565b6101ef61029d3660046127f0565b610b61565b6101ac610bf2565b6102bd6102b836600461291e565b610bff565b60405190815260200161019b565b6006546101ef9073ffffffffffffffffffffffffffffffffffffffff1681565b6101ac610ca7565b610227610301366004612939565b610cb4565b610227610314366004612975565b610d4b565b6101ac610ea5565b6101ac61032f3660046127f0565b610eb4565b6101ac610f5f565b61018f61034a3660046129e4565b600560209081526000928352604080842090915290825290205460ff1681565b61022761037836600461291e565b610fc8565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061041057507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061045c57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000805461046f90612a17565b80601f016020809104026020016040519081016040528092919081815260200182805461049b90612a17565b80156104e85780601f106104bd576101008083540402835291602001916104e8565b820191906000526020600020905b8154815290600101906020018083116104cb57829003601f168201915b505050505081565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610553575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b6105be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061064a336110ba565b90506106563382611487565b50565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff8481169116146106e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57524f4e475f46524f4d0000000000000000000000000000000000000000000060448201526064016105b5565b73ffffffffffffffffffffffffffffffffffffffff8216610766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016105b5565b3373ffffffffffffffffffffffffffffffffffffffff841614806107ba575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b806107e8575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b61084e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016105b5565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526002825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061045c82611620565b610936838383610659565b73ffffffffffffffffffffffffffffffffffffffff82163b1580610a2a57506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156109e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a069190612a6a565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610a90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016105b5565b505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610b16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016105b5565b6007610b23828483612b04565b507f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa8282604051610b55929190612c67565b60405180910390a15050565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610bed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f545f4d494e5445440000000000000000000000000000000000000000000060448201526064016105b5565b919050565b6007805461046f90612a17565b600073ffffffffffffffffffffffffffffffffffffffff8216610c7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f41444452455353000000000000000000000000000000000000000060448201526064016105b5565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6001805461046f90612a17565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d56858585610659565b73ffffffffffffffffffffffffffffffffffffffff84163b1580610e3857506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff86169063150b7a0290610dd19033908a90899089908990600401612c83565b6020604051808303816000875af1158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e149190612a6a565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610e9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016105b5565b5050505050565b6060610eaf6117f4565b905090565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16610f12576040517f1589363800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60078054610f1f90612a17565b159050610f56576007610f3183611814565b604051602001610f42929190612cea565b60405160208183030381529060405261045c565b61045c82611876565b6060610fa4604051806101a0016040528061017f8152602001613baf61017f9139604051602001610f909190612d8f565b6040516020818303038152906040526118fc565b604051602001610fb49190612e21565b604051602081830303815290604052905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314611049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016105b5565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b60007fffffffffffffffffffffffff9aa508d1eaff147572e36f7a951c470eb7587b8f73ffffffffffffffffffffffffffffffffffffffff83160161110157506000919050565b7fffffffffffffffffffffffff2bfa81f7462b7b28f3a68887b03e0927d2ba009973ffffffffffffffffffffffffffffffffffffffff83160161114657506001919050565b7fffffffffffffffffffffffffd21eb24da924da6801c37112b910a4df45c6f7dd73ffffffffffffffffffffffffffffffffffffffff83160161118b57506002919050565b7fffffffffffffffffffffffffeb7963940bf4438c1ba7de083d70286deae4c06673ffffffffffffffffffffffffffffffffffffffff8316016111d057506003919050565b7fffffffffffffffffffffffff917daab283b694533372f434efb5af488d2dd5e173ffffffffffffffffffffffffffffffffffffffff83160161121557506004919050565b7ffffffffffffffffffffffffff03c9c4ad1b6f8b5c6a4f8a597eb3470c817074273ffffffffffffffffffffffffffffffffffffffff83160161125a57506005919050565b7fffffffffffffffffffffffff2fb228b2f56fa17a8d8753c5742505232740717973ffffffffffffffffffffffffffffffffffffffff83160161129f57506006919050565b7fffffffffffffffffffffffff869ca4c79464299c9328fe7863cd1922e7e37ac173ffffffffffffffffffffffffffffffffffffffff8316016112e457506007919050565b7fffffffffffffffffffffffff688ca39f3a1c3d8774811a8fcf988a1978f6a2e773ffffffffffffffffffffffffffffffffffffffff83160161132957506008919050565b7fffffffffffffffffffffffffd7932d00852ecc845587c3cbaf7f1a506445f49273ffffffffffffffffffffffffffffffffffffffff83160161136e57506009919050565b7fffffffffffffffffffffffff862ce4035a02585b0ea4c989c2d1bb36627ee59473ffffffffffffffffffffffffffffffffffffffff8316016113b35750600a919050565b7fffffffffffffffffffffffff42014abc60a25134875e8007b99ba5742440a8db73ffffffffffffffffffffffffffffffffffffffff8316016113f85750600b919050565b7fffffffffffffffffffffffffdcf2ce1137a0bf9c5bfa4f06a421af63f2f574a373ffffffffffffffffffffffffffffffffffffffff83160161143d5750600c919050565b6040517f0fccfad700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016105b5565b73ffffffffffffffffffffffffffffffffffffffff8216611504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016105b5565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f4d494e54454400000000000000000000000000000000000060448201526064016105b5565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020908152604080832080546001019055848352600290915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000806116ac6753444835ec580000600c61167760ff6313070c006018600d8a901c161c8116907f2f2f2f2f2c282c2f312c282c2a2827252a2a262a2b2b272b2c2c282c2a28272560f860088b901c161c16612e95565b61168990670de0b6b3a7640000612ea8565b6116939190612f23565b61169d9190612f8b565b671bc16d674ec8000090611acf565b6116b784601e612fb2565b6116c19190612ea8565b90506000611735676124fee993bc0000600c600787821c166003600160118a901c8116146116f657600f89901c6001166116f9565b60025b61170492911b612e95565b77332c3028332c332c2f282f282c252c252c252c252c252c25901c60ff16670de0b6b3a76400006116899190612ea8565b61174085601e612fb2565b61174a9190612ea8565b90506000611759836002612ea8565b90506000611768826002612ea8565b9050600061177585611b07565b9050600061178285611b07565b9050600061178f85611b07565b9050600061179c85611b07565b905060006117af600360128d901c612fc9565b9050600060ff601486600185116005020285600186116004020201866000861160040202896001871160040102010104169050809a5050505050505050505050919050565b60606040518060600160405280602d8152602001613b82602d9139905090565b60606080604051019050602081016040526000815280600019835b928101926030600a8206018453600a90048061182f5750508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b6060600061188383611b33565b90506118d581604051806101a0016040528061017f8152602001613baf61017f91396118c16118b187611eb7565b604051602001610f909190612fdd565b84604051602001610f909493929190612ff9565b6040516020016118e59190612e21565b604051602081830303815290604052915050919050565b6060815160000361191b57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613d2e6040913990506000600260038551600261194c9190612e95565b61195691906131a8565b901b90506000611967826020612e95565b67ffffffffffffffff81111561197f5761197f612a87565b6040519080825280601f01601f1916602001820160405280156119a9576020820181803683370190505b509050818152600183018586518101602084015b81831015611a175760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b938201939093526004016119bd565b600389510660018114611a315760028114611a7b57611ac1565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe830152611ac1565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b509398975050505050505050565b6000611b00670de0b6b3a764000083611ae7866122a4565b611af19190612ea8565b611afb9190612f23565b612507565b9392505050565b6000670de0b6b3a764000082046101008116611b2a578060ff1661010003611b00565b60ff1692915050565b606081600003611b7657505060408051808201909152600981527f7375646f6c6162656c0000000000000000000000000000000000000000000000602082015290565b81600103611bb757505060408051808201909152600681527f4b616c7a616b0000000000000000000000000000000000000000000000000000602082015290565b81600203611bf857505060408051808201909152600481527f7365656e00000000000000000000000000000000000000000000000000000000602082015290565b81600303611c3957505060408051808201909152600881527f69676f726c696e65000000000000000000000000000000000000000000000000602082015290565b81600403611c7a57505060408051808201909152600481527f706f676f00000000000000000000000000000000000000000000000000000000602082015290565b81600503611cbb57505060408051808201909152600781527f706f70756c617200000000000000000000000000000000000000000000000000602082015290565b81600603611cfc57505060408051808201909152600a81527f6f72656e796f6d746f7600000000000000000000000000000000000000000000602082015290565b81600703611d3d57505060408051808201909152600581527f3078373936000000000000000000000000000000000000000000000000000000602082015290565b81600803611d7e57505060408051808201909152600781527f706c6f7463687900000000000000000000000000000000000000000000000000602082015290565b81600903611dbf57505060408051808201909152600781527f666f726167657200000000000000000000000000000000000000000000000000602082015290565b81600a03611e0057505060408051808201909152600a81527f686f727365666163747300000000000000000000000000000000000000000000602082015290565b81600b03611e4157505060408051808201909152600981527f6461746164616e6e650000000000000000000000000000000000000000000000602082015290565b81600c03611e8257505060408051808201909152600681527f62726f636b650000000000000000000000000000000000000000000000000000602082015290565b6040517f7e082e57000000000000000000000000000000000000000000000000000000008152600481018390526024016105b5565b606080604051806104800160405280610448815260200161373a6104489139611f186040518060400160405280600981526020017f7375646f6c6162656c0000000000000000000000000000000000000000000000815250856000146126ef565b611f5a6040518060400160405280600681526020017f4b616c7a616b0000000000000000000000000000000000000000000000000000815250866001146126ef565b611f9c6040518060400160405280600481526020017f7365656e00000000000000000000000000000000000000000000000000000000815250876002146126ef565b611fde6040518060400160405280600881526020017f69676f726c696e65000000000000000000000000000000000000000000000000815250886003146126ef565b6120206040518060400160405280600481526020017f706f676f00000000000000000000000000000000000000000000000000000000815250896004146126ef565b6120626040518060400160405280600781526020017f706f70756c6172000000000000000000000000000000000000000000000000008152508a6005146126ef565b6120a46040518060400160405280600a81526020017f6f72656e796f6d746f76000000000000000000000000000000000000000000008152508b6006146126ef565b6040516020016120bb9897969594939291906131bc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600582527f307837393600000000000000000000000000000000000000000000000000000060208301529150819061212790600786146126ef565b6121696040518060400160405280600781526020017f706c6f7463687900000000000000000000000000000000000000000000000000815250866008146126ef565b6121ab6040518060400160405280600781526020017f666f726167657200000000000000000000000000000000000000000000000000815250876009146126ef565b6121ed6040518060400160405280600a81526020017f686f72736566616374730000000000000000000000000000000000000000000081525088600a146126ef565b61222f6040518060400160405280600981526020017f6461746164616e6e65000000000000000000000000000000000000000000000081525089600b146126ef565b6122716040518060400160405280600581526020017f62726f636b0000000000000000000000000000000000000000000000000000008152508a600c146126ef565b60405180610680016040528061064a8152602001613d6e61064a91396040516020016118e5989796959493929190613478565b60008082136122bb57631615e6386000526004601cfd5b507ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be6fffffffffffffffffffffffffffffffff831160071b83811c67ffffffffffffffff1060061b1783811c63ffffffff1060051b1783811c61ffff1060041b1783811c60ff1060031b1783811c9190911c601f169190911a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361253557919050565b680755bf798b4a1bf1e582126125535763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6060816126fc5782611b00565b8260405160200161270d91906136a7565b604051602081830303815290604052905092915050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461065657600080fd5b60006020828403121561276457600080fd5b8135611b0081612724565b60005b8381101561278a578181015183820152602001612772565b50506000910152565b600081518084526127ab81602086016020860161276f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611b006020830184612793565b60006020828403121561280257600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610bed57600080fd5b6000806040838503121561284057600080fd5b61284983612809565b946020939093013593505050565b60008060006060848603121561286c57600080fd5b61287584612809565b925061288360208501612809565b9150604084013590509250925092565b60008083601f8401126128a557600080fd5b50813567ffffffffffffffff8111156128bd57600080fd5b6020830191508360208285010111156128d557600080fd5b9250929050565b600080602083850312156128ef57600080fd5b823567ffffffffffffffff81111561290657600080fd5b61291285828601612893565b90969095509350505050565b60006020828403121561293057600080fd5b611b0082612809565b6000806040838503121561294c57600080fd5b61295583612809565b91506020830135801515811461296a57600080fd5b809150509250929050565b60008060008060006080868803121561298d57600080fd5b61299686612809565b94506129a460208701612809565b935060408601359250606086013567ffffffffffffffff8111156129c757600080fd5b6129d388828901612893565b969995985093965092949392505050565b600080604083850312156129f757600080fd5b612a0083612809565b9150612a0e60208401612809565b90509250929050565b600181811c90821680612a2b57607f821691505b602082108103612a64577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215612a7c57600080fd5b8151611b0081612724565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610a9057600081815260208120601f850160051c81016020861015612add5750805b601f850160051c820191505b81811015612afc57828155600101612ae9565b505050505050565b67ffffffffffffffff831115612b1c57612b1c612a87565b612b3083612b2a8354612a17565b83612ab6565b6000601f841160018114612b825760008515612b4c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e9e565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015612bd15786850135825560209485019460019092019101612bb1565b5086821015612c0c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000612c7b602083018486612c1e565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152612cc3608083018486612c1e565b979650505050505050565b60008151612ce081856020860161276f565b9290920192915050565b6000808454612cf881612a17565b60018281168015612d105760018114612d4357612d72565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612d72565b8860005260208060002060005b85811015612d695781548a820152908401908201612d50565b50505082870194505b505050508351612d8681836020880161276f565b01949350505050565b7f7b226e616d65223a224375727461205e20506172616469676d2043544620323081527f323320506c61796572204e465473222c226465736372697074696f6e223a2200602082015260008251612ded81603f85016020870161276f565b7f227d000000000000000000000000000000000000000000000000000000000000603f939091019283015250604101919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612e5981601d85016020870161276f565b91909101601d0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561045c5761045c612e66565b808202600082127f800000000000000000000000000000000000000000000000000000000000000084141615612ee057612ee0612e66565b818105831482151761045c5761045c612e66565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612f3257612f32612ef4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615612f8657612f86612e66565b500590565b8181036000831280158383131683831282161715612fab57612fab612e66565b5092915050565b808202811582820484141761045c5761045c612e66565b600082612fd857612fd8612ef4565b500690565b60008251612fef81846020870161276f565b9190910192915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000815260008551613031816009850160208a0161276f565b7f20e28888204375727461205e20506172616469676d204354462032303233222c6009918401918201527f226465736372697074696f6e223a22000000000000000000000000000000000060298201528551613094816038840160208a0161276f565b7f222c22616e696d6174696f6e5f75726c223a22646174613a746578742f68746d603892909101918201527f6c3b636861727365743d7574662d383b6261736536342c000000000000000000605882015284516130f881606f84016020890161276f565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2250606f92909101918201527f6c61796572222c2276616c7565223a2200000000000000000000000000000000608f820152612cc3613159609f830186612cce565b7f227d2c7b2274726169745f74797065223a2259656172222c2276616c7565223a81527f323032337d5d7d00000000000000000000000000000000000000000000000000602082015260270190565b6000826131b7576131b7612ef4565b500490565b600089516131ce818460208e0161276f565b8951908301906131e2818360208e0161276f565b8082019150507f20e29482e29482535553504943494f555320434841524954592020202020202081527f3336392e3936e294820ae29482000000000000000000000000000000000000006020820152885161324481602d840160208d0161276f565b7f20202020e29482e2948246524545205245414c20455354415445202020202020602d92909101918201527f2020202020312e3734e294820ae2948200000000000000000000000000000000604d82015287516132a881605d840160208c0161276f565b7f202020202020e29482e29482475241494e53204f462053414e44202020202020605d92909101918201527f20202020203334332e3939e294820ae294820000000000000000000000000000607d82015261346961341a6134146133c56133bf61337061336a61331b608f89018f612cce565b7f2020e29482e2948244524f50504552202020202020202020202020202020202081527f203233332e3232e294820ae294820000000000000000000000000000000000006020820152602e0190565b8c612cce565b7f202020202020e29482e29482434f534d494320524144494154494f4e2020202081527f20202020202034332e3738e294820ae294820000000000000000000000000000602082015260320190565b89612cce565b7f202020e29482e29482445241474f4e20545952414e542020202020202020202081527f20203432352e3133e294820ae2948200000000000000000000000000000000006020820152602f0190565b86612cce565b7fe29482e29482484f5050494e4720494e544f20504c414345202020202020203381527f31362e3535e294820ae2948200000000000000000000000000000000000000006020820152602c0190565b9b9a5050505050505050505050565b6000895161348a818460208e0161276f565b89519083019061349e818360208e0161276f565b8082019150507f2020202020e29482e29482454e544552505249534520424c4f434b434841494e81527f202020203237312e3232e294820ae2948200000000000000000000000000000060208201528851613500816031840160208d0161276f565b7f202020e29482e294824441492b2b202020202020202020202020202020202020603192909101918201527f20203331362e3535e294820ae29482000000000000000000000000000000000060518201528751613564816060840160208c0161276f565b7f202020e29482e29482444f444f4e54203c7370616e20636c6173733d633e5b46606092909101918201527f4952535420424c4f4f445d3c2f7370616e3e20202020203233332e3130e2948260808201527f0ae294820000000000000000000000000000000000000000000000000000000060a08201526134696136a161369b61364c6136466135f760a487018d612cce565b7fe29482e294824f56454e2020202020202020202020202020202020202020203281527f38312e3930e294820ae2948200000000000000000000000000000000000000006020820152602c0190565b8a612cce565b7f20e29482e29482534b494c4c2042415345442047414d4520202020202020202081527f3231342e3033e294820ae29482000000000000000000000000000000000000006020820152602d0190565b87612cce565b85612cce565b7f3c7370616e20636c6173733d63207374796c653d666f6e742d7765696768743a81527f3930303b746578742d6465636f726174696f6e3a756e6465726c696e653e000060208201526000825161370581603e85016020870161276f565b7f3c2f7370616e3e00000000000000000000000000000000000000000000000000603e93909101928301525060450191905056fe3c7374796c653e627574746f6e7b6865696768743a323070783b6d617267696e3a30206175746f3b626f726465723a303b6261636b67726f756e643a233030453130303b637572736f723a706f696e7465723b636f6c6f723a233030307d627574746f6e3a686f7665727b746578742d6465636f726174696f6e3a756e6465726c696e657d2e627b77696474683a35313270787d2e637b636f6c6f723a233030653130307d2e617b706f736974696f6e3a6162736f6c7574653b6d617267696e3a6175746f20303b626f726465722d7261646975733a313030253b746f703a3670783b77696474683a313270783b6865696768743a313270787d3c2f7374796c653e3c626f6479207374796c653d77696474683a36343070783b6865696768743a36343070783b6d617267696e3a303e3c64697620636c6173733d62207374796c653d226865696768743a35313270783b6261636b67726f756e643a233136313631363b70616464696e673a36347078223e3c646976207374796c653d226261636b67726f756e643a233030303b626f726465722d7261646975733a3870783b6865696768743a34363470783b6f766572666c6f773a68696464656e3b626f726465723a31707820736f6c696420233334333433343b6d617267696e3a323070782030223e3c646976207374796c653d706f736974696f6e3a72656c61746976653b646973706c61793a666c65783b77696474683a35303070783b6865696768743a323470783b6261636b67726f756e643a236461646164613b70616464696e672d6c6566743a3670783b70616464696e672d72696768743a3670783e3c636f6465207374796c653d666f6e742d7765696768743a3630303b6d617267696e3a6175746f3b636f6c6f723a233438343834383e4375727461205e20506172616469676d2043544620323032333c2f636f64653e3c646976207374796c653d6261636b67726f756e643a236564366135653b6c6566743a36707820636c6173733d613e3c2f6469763e3c646976207374796c653d6261636b67726f756e643a236635626634663b6c6566743a3232707820636c6173733d613e3c2f6469763e3c646976207374796c653d6261636b67726f756e643a233632633535353b6c6566743a3338707820636c6173733d613e3c2f6469763e3c2f6469763e3c707265207374796c653d2277696474683a34393670783b6865696768743a32393270783b646973706c61793a666c65783b70616464696e673a307078203870783b636f6c6f723a236666663b6d617267696e3a30223e3c636f6465207374796c653d6d617267696e3a6175746f3ee2948c3c7370616e20636c6173733d633e4d454d424552533c2f7370616e3ee29480e29480e29480e29490e2948c3c7370616e20636c6173733d633e4348414c4c454e47455320434f4d504c455445443c2f7370616e3ee29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e294900ae29482524946462e00180057415645666d74201000000001000100401f0000401f000001001000646174610000180080416e204e465420636f6c6c656374696f6e20746f20636f6d6d656d6f7261746520706c6179657273206f6620746865204375727461207465616d20666f722074686569722070617274696369706174696f6e20616e6420706572666f726d616e636520696e20746865203230323320506172616469676d204354462e20496e206164646974696f6e20746f20646973706c6179696e6720746865207465616d277320726573756c74732c20746865206d65746164617461206f66206561636820746f6b656e20636f6e7461696e7320612031303025206f6e636861696e2d67656e65726174656420313a3338206d696e757465206c6f6e6720617564696f20617272616e67656d656e74206f66205c22496e207468652048616c6c206f6620746865204d6f756e7461696e204b696e675c222062792045647661726420477269656720776974682033206c617965726564206d656c6f6479206c696e657320616e6420612062617373206c696e65206174203131372e313837352042504d2e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f2020202020e29482e29482313030252020202020202020202020202020202020202020203230302e3635e294820ae2948220202020202020202020e29482e29482424c41434b20574f524c4420202020202020202020202020203138322e3830e294820ae2948220202020202020202020e29482e2948248454c4c4f20574f524c4420202020202020202020202020203133332e3232e294820ae29494e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29498e29494e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e294983c2f636f64653e3c2f7072653e3c64697620636c6173733d62207374796c653d646973706c61793a666c65783e3c627574746f6e2069643d623e3c636f64653e5b205375626d697420504354467b43555237345f323032337d205d3c2f636f64653e3c2f627574746f6e3e3c2f6469763e3c617564696f2069643d613e596f75722062726f7773657220646f6573206e6f7420737570706f72742074686520617564696f20656c656d656e743c2f617564696f3e3c64697620636c6173733d62207374796c653d706f736974696f6e3a72656c61746976653b6865696768743a31323870783e3c63616e7661732069643d64207374796c653d706f736974696f6e3a6162736f6c7574652077696474683d353132206865696768743d3132383e3c2f63616e7661733e3c6469762069643d63207374796c653d22626f726465723a2e35707820736f6c696420233030653130303b6865696768743a31323770783b706f736974696f6e3a6162736f6c7574653b6c6566743a30223e3c2f6469763e3c2f6469763e3c2f6469763e3c7363726970743e646f63756d656e742e676574456c656d656e744279496428226222292e6164644576656e744c697374656e65722822636c69636b222c28293d3e7b673d303b6a3d303b666f7228733d22222c743d303b743c332a322a2a31383b742b2b297b633d2263686172436f64654174222c753d28743e3e31382925332c723d2874293d3e74263235363f74263235353a3235362d287426323535292c613d33302a742a322a2a2828222527282a2c282c2c2b272b2b2a262a2a2527282a2c282c312f2c282c2f2f2f2f225b635d28743e3e3131263331292b5b302c31322c372c31395d5b743e3e313626335d292f31322d36292c783d33302a742a322a2a282822252c252c252c252c252c252c282f282f2c332c3328302c33225b635d28382a28743e3e313726313f323a743e3e31352631292b28743e3e313226372929292f31322d37292c793d612a322c7a3d792a323b732b3d537472696e672e66726f6d43686172436f64652828722861292f28352d28753e3129292b28753e30292f352a722879292b28753e31292a2872287a292f352b722878292f342929253235367c30297d613d646f63756d656e742e676574456c656d656e744279496428226122293b612e7372633d22646174613a617564696f2f7761763b6261736536342c556b6c47526934414741425851565a465a6d3130494241414141414241414541514238414145416641414142414167415a4746305951414147414341222b62746f612873293b612e706c617928293b736574496e74657276616c2828293d3e7b633d646f63756d656e742e676574456c656d656e744279496428226322293b632e7374796c652e6c6566743d284d6174682e6d696e283132382a672b3132382c6a2b2b292a3130302f313238292b2225223b7d2c3332293b683d28293d3e7b643d646f63756d656e742e676574456c656d656e744279496428226422292e676574436f6e746578742822326422293b642e636c6561725265637428302c302c3531322c313238293b642e66696c6c5374796c653d2223464646223b5b2e2e2e41727261792834303936295d2e6d617028285f2c69293d3e7b642e626567696e5061746828293b642e61726328692f382c3132382d732e63686172436f646541742833323736382a672b692a38292f322c312c302c322a4d6174682e5049293b642e66696c6c28293b7d293b672b2b3b6a3d303b7d3b6828293b736574496e74657276616c28682c34303936297d293c2f7363726970743ea2646970667358221220014028a5543be52c0f1d32e7068286c08c6bd65bd1b045bf34f55a45a8d5c19e64736f6c634300081500334375727461205e20506172616469676d20435446203230323320506c61796572204e4654730000000000000000000000005dd2083a0d68c4eb8fed93ef010d1b0d68b3880f

Local development

This project uses Foundry as its development/testing framework.

Installation

First, make sure you have Foundry installed. Then, run the following commands to clone the repo and install its dependencies:

git clone https://github.com/fiveoutofnine/curta-paradigm-2023.git
cd curta-paradigm-2023
forge install

Sample metadata art/audio generation

To test the metadata art output, follow the instructions in PrintCurtaPCTF2023ArtScript and run the following command:

forge script script/PrintCurtaPCTF2023Art.s.sol:PrintCurtaPCTF2023ArtScript -vvv

To test the metadata audio output, follow the instructions in PrintCurtaPCTF2023AudioScript and run the following command:

forge script script/PrintCurtaPCTF2023Audio.s.sol:PrintCurtaPCTF2023AudioScript -vvv

Deploying

  1. Configure the OWNER variable inside print-bytecode.sh, which will write the bytecode with constructor arguments to bytecode-with-constructor.txt.

  2. [Optional] Compute a create2 salt to deploy with. Here's some basic steps to do that with flood-protocol/maldon:

git clone https://github.com/flood-protocol/maldon.git
cd maldon
cargo install --path .
maldon --pattern $PATTERN $CREATE2_FACTORY_ADDRESS $CALLER $INIT_CODE_HASH
  1. Use a factory (e.g. 0x0000000000FFe8B47B3e2130213B802212439497) to deploy the bytecode to a deterministic address or just deploy the generated bytecode.

Verifying CurtaPCTF2023

To compute the constructor arguments, you can copy paste the last 64 characters from bytecode-with-constructor.txt (remember to run print-bytecode.sh with the correct constructor arguments set first) or run the following command:

cast abi-encode "constructor(address)" $OWNER

Then, to verify the contract on Etherscan, run the following command:

forge verify-contract --chain-id $CHAIN_ID --num-of-optimizations $NUM_OF_OPTIMIZATIONS --watch --compiler-version $COMPILER_VERSION $DEPLOY_ADDRESS src/CurtaPCTF2023.sol:CurtaPCTF2023 --constructor-args $CONSTRUCTOR_ARGS  --etherscan-api-key $ETHERSCAN_API_KEY --verifier "etherscan" --verifier-url "https://api.etherscan.io/api"

For example, 0x6F2Df6c95D80e359a25b6a549037F3B70879B343 was verified by running the following command:

forge verify-contract --chain-id 1 --num-of-optimizations 1000000 --watch --compiler-version "0.8.21+commit.d9974bed" "0x6F2Df6c95D80e359a25b6a549037F3B70879B343" src/CurtaPCTF2023.sol:CurtaPCTF2023 --constructor-args "0x0000000000000000000000005dd2083a0d68c4eb8fed93ef010d1b0d68b3880f" --etherscan-api-key $ETHERSCAN_API_KEY --verifier "etherscan" --verifier-url "https://api.etherscan.io/api"