module Blockchain.SampleTransactions where import Prelude hiding (EQ) import qualified Data.ByteString as B import Blockchain.Data.Address import Blockchain.Data.Transaction import Blockchain.Constants import Blockchain.JCommand import Blockchain.Util import Blockchain.VM.Code import Blockchain.VM.Labels import Blockchain.VM.Opcodes --import Debug.Trace createContract::Integer->Integer->Code->Transaction createContract val gl code = ContractCreationTX { tNonce = 0, gasPrice = 0x9184e72a000, tGasLimit = gl, value = val, tInit = code } createMessage::Integer->Integer->Address->B.ByteString->Transaction createMessage val gl toAddr theData = MessageTX { tNonce = 0, gasPrice = 0x9184e72a000, tGasLimit = gl, to = toAddr, value = val, tData = theData } ---------------------- simpleTX::Transaction simpleTX = createContract 0 550 $ compile [ PUSH [2], PUSH [0], MSTORE, PUSH [0x20], PUSH [0], RETURN ] outOfGasTX::Transaction outOfGasTX = createContract 3 522 $ compile [ PUSH [1], PUSH [0], MSTORE ] simpleStorageTX::Transaction simpleStorageTX = createContract 3 1000 $ compile [ PUSH [1], PUSH [0], SSTORE ] createInit::[JCommand]->[JCommand]->Code createInit initFunc contract = -- trace (intercalate "-" $ show <$> contract) $ -- trace (intercalate "\n " $ fmap show $ snd $ jcompile $ initFunc ++ [ReturnCode contract]) $ do compile $ lcompile $ snd $ jcompile $ initFunc ++ [ReturnCode $ compile $ lcompile $ snd $ jcompile contract] createContractTX::Transaction createContractTX = createContract (1000*finney) 1000 $ createInit [] [ PermStorage (Number 0) :=: Input 0 ] sendMessageTX::Transaction sendMessageTX = createMessage (1000*finney) 1000 (Address 0x9f840fe058ce3d84e319b8c747accc1e52f69426) (B.pack $ word256ToBytes 0x1234) paymentContract::Transaction paymentContract = createContract (1000*finney) 2000 $ createInit [ PermStorage Caller :=: Number 1000 ] ( let toAddr = Input (0*32) fromAddr = Caller val = Input (1*32) in [ If (PermVal fromAddr :>=: val) [ PermStorage fromAddr :=: PermVal fromAddr - val, PermStorage toAddr :=: PermVal toAddr + val ] ] ) sendCoinTX::Transaction sendCoinTX = createMessage 0 2000 (Address 0x9f840fe058ce3d84e319b8c747accc1e52f69426) (B.pack $ word256ToBytes 0x1 ++ word256ToBytes 500) keyValuePublisher::Transaction keyValuePublisher = createContract (1000*finney) 2000 $ createInit [ PermStorage 69 :=: Caller ] ( let inputP = MemStorage (Number 0) inputPr = MemVal (Number 0) in [ If (Caller :==: PermVal (Number 69)) [ While (inputPr :<: CallDataSize) [ PermStorage (Input inputPr) :=: Input (inputPr + 32), inputP :=: inputPr + 64 ] ] ] ) sendKeyVal::Transaction sendKeyVal = createMessage 0 2000 (Address 0x9f840fe058ce3d84e319b8c747accc1e52f69426) (B.pack $ word256ToBytes 1000 ++ word256ToBytes 2000 ++ word256ToBytes 1234 ++ word256ToBytes 1) {- (when (= (caller) @@69) (for {} (< @i (calldatasize)) [i](+ @i 64) [[ (calldataload @i) ]] (calldataload (+ @i 32)) ) -} mysteryCode::[Operation] mysteryCode = [ PUSH [3,144], DUP1, PUSH [0,14], PUSH [0], CODECOPY, PUSH [3,158], JUMP, PUSH [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], PUSH [32], MSTORE, PUSH [0], PUSH [64], MSTORE, PUSH [1], PUSH [96], MSTORE, PUSH [2], PUSH [128], MSTORE, PUSH [3], PUSH [160], MSTORE, PUSH [0], PUSH [192], MSTORE, PUSH [1], PUSH [224], MSTORE, PUSH [2], PUSH [1,0], MSTORE, PUSH [0], PUSH [1,32], MSTORE, PUSH [1], PUSH [1,64], MSTORE, PUSH [2], PUSH [1,96], MSTORE, PUSH [3], PUSH [1,128], MSTORE, PUSH [3], PUSH [1,160], MSTORE, PUSH [32], CALLDATASIZE, DIV, PUSH [1,192], MSTORE, PUSH [1,160], MLOAD, PUSH [1,128], MLOAD, ADD, PUSH [1,192], MLOAD, SLT, ISZERO, PUSH [0,136], JUMPI, PUSH [1,64], MLOAD, PUSH [1,224], MSTORE, PUSH [32], PUSH [1,224], CALLCODE, JUMPDEST, PUSH [0], PUSH [1,128], MLOAD, PUSH [1,160], MLOAD, PUSH [1,192], MLOAD, SUB, SMOD, EQ, ISZERO, ISZERO, PUSH [0,174], JUMPI, PUSH [1,64], MLOAD, PUSH [2,0], MSTORE, PUSH [32], PUSH [2,0], CALLCODE, JUMPDEST, PUSH [1,128], MLOAD, PUSH [1,160], MLOAD, PUSH [1,192], MLOAD, SUB, SDIV, PUSH [2,32], MSTORE, PUSH [0], PUSH [2,64], MSTORE, PUSH [2], PUSH [1,160], MLOAD, ADD, PUSH [32], MUL, CALLDATALOAD, PUSH [2,96], MSTORE, PUSH [0], PUSH [2,128], MSTORE, JUMPDEST, PUSH [2,32], MLOAD, PUSH [2,64], MLOAD, SLT, ISZERO, PUSH [1,155], JUMPI, PUSH [1], PUSH [1,160], MLOAD, PUSH [1,128], MLOAD, PUSH [2,64], MLOAD, MUL, ADD, ADD, PUSH [32], MUL, CALLDATALOAD, PUSH [2,160], MSTORE, PUSH [2], PUSH [1,160], MLOAD, PUSH [1,128], MLOAD, PUSH [2,64], MLOAD, MUL, ADD, ADD, PUSH [32], MUL, CALLDATALOAD, PUSH [2,192], MSTORE, PUSH [2,96], MLOAD, PUSH [2,192], MLOAD, EQ, ISZERO, ISZERO, PUSH [1,80], JUMPI, PUSH [2,192], MLOAD, PUSH [2,96], MSTORE, PUSH [0], PUSH [2,128], MLOAD, EQ, ISZERO, ISZERO, PUSH [1,79], JUMPI, PUSH [1,96], MLOAD, PUSH [2,224], MSTORE, PUSH [32], PUSH [2,224], CALLCODE, JUMPDEST, JUMPDEST, PUSH [2,160], MLOAD, PUSH [2,128], MLOAD, ADD, PUSH [2,128], MSTORE, PUSH [1], PUSH [2,32], MLOAD, SUB, PUSH [2,64], MLOAD, EQ, ISZERO, PUSH [1,139], JUMPI, PUSH [0], PUSH [2,128], MLOAD, EQ, ISZERO, ISZERO, PUSH [1,138], JUMPI, PUSH [1,96], MLOAD, PUSH [3,0], MSTORE, PUSH [32], PUSH [3,0], CALLCODE, JUMPDEST, JUMPDEST, PUSH [1], PUSH [2,64], MLOAD, ADD, PUSH [2,64], MSTORE, PUSH [0,220], JUMP, JUMPDEST, PUSH [32], MLOAD, SLOAD, PUSH [3,32], MSTORE, PUSH [1], PUSH [32], MLOAD, SLOAD, ADD, PUSH [32], MLOAD, SSTORE, PUSH [32], CALLDATALOAD, PUSH [3,64], MSTORE, PUSH [64], CALLDATALOAD, PUSH [3,96], MSTORE, PUSH [255,255,255,255,255,255,255,255], PUSH [3,128], MSTORE, PUSH [3,64], MLOAD, PUSH [64], MLOAD, PUSH [1,0,0,0,0,0,0,0,0], PUSH [3,128], MLOAD, MUL, PUSH [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], PUSH [3,32], MLOAD, MUL, ADD, ADD, SSTORE, PUSH [3,96], MLOAD, PUSH [96], MLOAD, PUSH [1,0,0,0,0,0,0,0,0], PUSH [3,128], MLOAD, MUL, PUSH [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], PUSH [3,32], MLOAD, MUL, ADD, ADD, SSTORE, NUMBER, PUSH [128], MLOAD, PUSH [1,0,0,0,0,0,0,0,0], PUSH [3,128], MLOAD, MUL, PUSH [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], PUSH [3,32], MLOAD, MUL, ADD, ADD, SSTORE, TIMESTAMP, PUSH [160], MLOAD, PUSH [1,0,0,0,0,0,0,0,0], PUSH [3,128], MLOAD, MUL, PUSH [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], PUSH [3,32], MLOAD, MUL, ADD, ADD, SSTORE, PUSH [0], PUSH [2,64], MSTORE, JUMPDEST, PUSH [2,32], MLOAD, PUSH [2,64], MLOAD, SLT, ISZERO, PUSH [3,129], JUMPI, PUSH [1,160], MLOAD, PUSH [1,128], MLOAD, PUSH [2,64], MLOAD, MUL, ADD, PUSH [32], MUL, CALLDATALOAD, PUSH [3,160], MSTORE, PUSH [1], PUSH [1,160], MLOAD, PUSH [1,128], MLOAD, PUSH [2,64], MLOAD, MUL, ADD, ADD, PUSH [32], MUL, CALLDATALOAD, PUSH [2,160], MSTORE, PUSH [2], PUSH [1,160], MLOAD, PUSH [1,128], MLOAD, PUSH [2,64], MLOAD, MUL, ADD, ADD, PUSH [32], MUL, CALLDATALOAD, PUSH [2,192], MSTORE, PUSH [3,160], MLOAD, PUSH [192], MLOAD, PUSH [1,0,0,0,0,0,0,0,0], PUSH [2,64], MLOAD, MUL, PUSH [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], PUSH [3,32], MLOAD, MUL, ADD, ADD, SSTORE, PUSH [2,160], MLOAD, PUSH [224], MLOAD, PUSH [1,0,0,0,0,0,0,0,0], PUSH [2,64], MLOAD, MUL, PUSH [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], PUSH [3,32], MLOAD, MUL, ADD, ADD, SSTORE, PUSH [2,192], MLOAD, PUSH [1,0], MLOAD, PUSH [1,0,0,0,0,0,0,0,0], PUSH [2,64], MLOAD, MUL, PUSH [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], PUSH [3,32], MLOAD, MUL, ADD, ADD, SSTORE, PUSH [1], PUSH [2,64], MLOAD, ADD, PUSH [2,64], MSTORE, PUSH [2,138], JUMP, JUMPDEST, PUSH [1,32], MLOAD, PUSH [3,192], MSTORE, PUSH [32], PUSH [3,192], CALLCODE, JUMPDEST, PUSH [0], CALLCODE ] createMysteryContract::Transaction createMysteryContract = ContractCreationTX { tNonce = 0, gasPrice = 0x9184e72a000, tGasLimit = 8000, value = 0, tInit = compile mysteryCode }