Example #1
0
 def run(self, tx, contract, block):
     if tx.value < 1000 * block.basefee:
         stop("Insufficient fee")
     to = tx.data[0]
     value = tx.value - 1000 * block.basefee
     if block.account_balance(to) == 0:
         mktx(to, value, 0, 0)
     else:
         mktx(tx.sender, value, 0, 0)
Example #2
0
    def run(self, tx, contract, block):
        if tx.value < MIN_FEE * block.basefee:
            stop("Insufficient fee")

        state = contract.storage[I_STATUS]
        if state == S_START and tx.value >= PRICE_ETHER:
            contract.storage[I_STATUS] = S_CUSTOMER_PAID
            contract.storage[I_CUSTOMER_ADDRESS] = tx.sender
            contract.storage[I_CUSTOMER_PAID_AMOUNT] = tx.value
            contract.storage[I_CUSTOMER_PAID_TS] = block.timestamp
        elif state == S_CUSTOMER_PAID:
            if tx.sender == SHIPPER:
                contract.storage[I_STATUS] = S_SHIPPED
                mktx(MERCHANT, contract.storage[I_CUSTOMER_PAID_AMOUNT], 0, 0)
            elif block.timestamp >= contract.storage[I_CUSTOMER_PAID_TS] + CONFIRMATION_TIMEOUT:
                contract.storage[I_STATUS] = S_REFUNDED
                mktx(contract.storage[I_CUSTOMER_ADDRESS], contract.storage[I_CUSTOMER_PAID_AMOUNT], 0, 0)
        else:
            stop("Invalid state transition")
Example #3
0
    def run(self, tx, contract, block):
        if tx.value < 100 * block.basefee:
            stop("Insufficient fee")

        state = contract.storage[I_STATE]
        if state == S_START:
            contract.storage[I_PARTNER_1] = tx.sender
            contract.storage[I_PARTNER_2] = tx.data[0]
            contract.storage[I_STATE] = S_PROPOSED
            stop("Proposed")
        partner_1 = contract.storage[I_PARTNER_1]
        partner_2 = contract.storage[I_PARTNER_2]

        if state == S_PROPOSED:
            if tx.sender == partner_2 and tx.data[0] == partner_1:
                contract.storage[I_STATE] = S_MARRIED
                stop("Married")
            if tx.sender == partner_1 and tx.data[0] == partner_1:
                if block.timestamp < C_CANCEL_PERIOD:
                    stop("Cant cancel early")
                contract.storage[I_STATE] = S_START
                mktx(tx.sender, block.account_balance(contract.address), 0, 0)
                stop("Cancelled")
            stop("Invalid during proposal")
        if state == S_MARRIED and tx.sender == partner_1 or tx.sender == partner_2:
            if tx.data[0] == TX_WITHDRAW:
                creator = contract.storage[I_WITHDRAW_CREATOR]
                if (creator != 0 and contract.storage[I_WITHDRAW_TO] == tx.data[1] and
                        contract.storage[I_WITHDRAW_AMOUNT] == tx.data[2] and creator != tx.sender):
                    mktx(tx.data[1], tx.data[2], 0, 0)
                    contract.storage[I_WITHDRAW_TO] = 0
                    contract.storage[I_WITHDRAW_AMOUNT] = 0
                    contract.storage[I_WITHDRAW_CREATOR] = 0
                    stop("Withdrawed")
                else:
                    contract.storage[I_WITHDRAW_TO] = tx.data[1]
                    contract.storage[I_WITHDRAW_AMOUNT] = tx.data[2]
                    contract.storage[I_WITHDRAW_CREATOR] = tx.sender
                    stop("Withdraw requested")
            if tx.data[0] == TX_DIVORCE:
                creator = contract.storage[I_DIVORCE_CREATOR]
                if creator != 0 and creator != tx.sender:
                    balance = block.account_balance(contract.address)
                    mktx(partner_1, balance / 2, 0, 0)
                    mktx(partner_2, balance / 2, 0, 0)
                    contract.storage[I_STATE] = S_DIVORCED
                    stop("Divorced")
                else:
                    contract.storage[I_DIVORCE_CREATOR] = tx.sender
                    stop("Divorce requested")
            stop("Invalid during marriage")
        stop("Should be divorced")
Example #4
0
    def run(self, tx, contract, block):
        if tx.value < MIN_FEE * block.basefee:
            stop("Insufficient fee")

        state = contract.storage[I_STATUS]
        if state == S_START and tx.value >= PRICE_ETHER:
            contract.storage[I_STATUS] = S_CUSTOMER_PAID
            contract.storage[I_CUSTOMER_ADDRESS] = tx.sender
            contract.storage[I_CUSTOMER_PAID_AMOUNT] = tx.value
            contract.storage[I_CUSTOMER_PAID_TS] = block.timestamp
        elif state == S_CUSTOMER_PAID:
            if tx.sender == SHIPPER:
                contract.storage[I_STATUS] = S_SHIPPED
                mktx(MERCHANT, contract.storage[I_CUSTOMER_PAID_AMOUNT], 0, 0)
            elif block.timestamp >= contract.storage[
                    I_CUSTOMER_PAID_TS] + CONFIRMATION_TIMEOUT:
                contract.storage[I_STATUS] = S_REFUNDED
                mktx(contract.storage[I_CUSTOMER_ADDRESS],
                     contract.storage[I_CUSTOMER_PAID_AMOUNT], 0, 0)
        else:
            stop("Invalid state transition")
 def run(self, tx, contract, block):
     if tx.value < block.basefee * STARTFEE:
         stop("Insufficient fee")
     if tx.datan == 0 or tx.sender != VIEWER :
         stop("Fill tank")
     from_block = tx.data[1] #Must be in attempt range
     to_block   = tx.data[1] + ATTEMPT_CNT
     if block.number < from_block or block.number > to_block :
         stop("Outside period")
     # Messages here are actually sent by server, punish command is also requesting
     #  command for viewer.
     command = tx.data[0]
     if command == CMD_PUNISH :
         if 2*tx.value > tx.data[3] :
             stop("Over punish")
         mktx(DESTRUCTION_ADDR,2*tx.value, 0,[])
         stop("Punish")
     #Note, the server predicts if it loses and doesnt bother, of course.
     if command == CMD_REDEEM :
         if block.parenthash < DIFFICULTY : 
             stop("Lost lottery")
         mktx(tx.data[2], tx.data[3], 0,[])
         stop("Got reward")
Example #6
0
    def run(self, tx, contract, block):
        if tx.value < MIN_FEE * block.basefee:
            stop("Insufficient fee")

        customer = contract.storage[I_CUSTOMER]

        if tx.sender == MERCHANT:
            if block.account_balance(contract.address) < MIN_BALANCE:
                stop("Below funds of operation")
            if tx.data[0] == C_ALLOW:
                if customer != 0:  # ..when earlier customer still busy.
                    stop("Customer change blocked")
                contract.storage[I_CUSTOMER] = tx.data[1]
                contract.storage[I_TOTAL] = tx.data[2]
                contract.storage[I_INCENTIVE] = tx.data[3]
                stop("Customer allowed")
            if tx.data[0] == C_REFUND and customer != 0:
                refund = contract.storage[I_PAID]
                refund += contract.storage[
                    I_PAID] * MIN_BALANCE / contract.storage[I_TOTAL]

                mktx(customer,
                     min(refund, contract.storage[I_TOTAL] + MIN_BALANCE), 0,
                     [])
                contract.storage[I_CUSTOMER] = 0
                contract.storage[I_TOTAL] = 0
                contract.storage[I_INCENTIVE] = 0
                contract.storage[I_PAID] = 0
                stop("Customer refunded")
            stop("Merchant topping up")

        if tx.sender == customer:
            contract.storage[I_PAID] = contract.storage[
                I_PAID] + tx.value - MIN_FEE * block.basefee
            if tx.datan == 1 and tx.data[0] == C_SATISFIED:
                if contract.storage[I_PAID] <= contract.storage[I_TOTAL]:
                    stop("Customer didnt pay enough")
                incentive = contract.storage[I_INCENTIVE]
                mktx(MERCHANT, contract.storage[I_PAID] - incentive, 0, [])
                mktx(customer, incentive, 0, [])
                contract.storage[I_CUSTOMER] = 0
                contract.storage[I_TOTAL] = 0
                contract.storage[I_INCENTIVE] = 0
                contract.storage[I_PAID] = 0
                stop("Customer paid and happy")
            stop("Customer paid(part)")
        stop("Donation")
Example #7
0
    def run(self, tx, contract, block):
        if tx.value < MIN_FEE * block.basefee:
            stop("Insufficient fee")

        customer = contract.storage[I_CUSTOMER]

        if tx.sender == MERCHANT:
            if block.account_balance(contract.address) < MIN_BALANCE:
                stop("Below funds of operation")
            if tx.data[0] == C_ALLOW:
                if customer != 0:  # ..when earlier customer still busy.
                    stop("Customer change blocked")
                contract.storage[I_CUSTOMER]  = tx.data[1]
                contract.storage[I_TOTAL]     = tx.data[2]
                contract.storage[I_INCENTIVE] = tx.data[3]
                stop("Customer allowed")
            if tx.data[0] == C_REFUND and customer != 0:
                refund =  contract.storage[I_PAID]
                refund += contract.storage[I_PAID]*MIN_BALANCE/contract.storage[I_TOTAL]

                mktx(customer, min(refund, contract.storage[I_TOTAL]+MIN_BALANCE), 0, [])
                contract.storage[I_CUSTOMER]  = 0
                contract.storage[I_TOTAL]     = 0
                contract.storage[I_INCENTIVE] = 0
                contract.storage[I_PAID]      = 0
                stop("Customer refunded")
            stop("Merchant topping up")

        if tx.sender == customer:
            contract.storage[I_PAID] = contract.storage[I_PAID] + tx.value - MIN_FEE*block.basefee
            if tx.datan == 1 and tx.data[0] == C_SATISFIED:
                if contract.storage[I_PAID] <= contract.storage[I_TOTAL]:
                    stop("Customer didnt pay enough")
                incentive = contract.storage[I_INCENTIVE]
                mktx(MERCHANT, contract.storage[I_PAID]-incentive, 0, [])
                mktx(customer, incentive, 0, [])
                contract.storage[I_CUSTOMER]  = 0
                contract.storage[I_TOTAL]     = 0
                contract.storage[I_INCENTIVE] = 0
                contract.storage[I_PAID]      = 0
                stop("Customer paid and happy")
            stop("Customer paid(part)")
        stop("Donation")
Example #8
0
 def run(self, tx, contract, block):
     if tx.value < 200 * block.basefee:
         stop("Insufficient fee")
     if contract.storage[1000] == 0:
         if tx.value < 1000 * 10 ** 18:
             stop("Insufficient value")
         contract.storage[1000] = 1  # XXX Bug in contract example flag should be set
         contract.storage[1001] = 998 * block.contract_storage(D)[I]
         contract.storage[1002] = block.timestamp + 30 * 86400
         contract.storage[1003] = tx.sender
         log("Contract initialized")
     else:
         ethervalue = contract.storage[1001] / block.contract_storage(D)[I]
         log("Ether Value = %s" % ethervalue)
         if ethervalue >= 5000:  # XXX Bug in contract example, value shouldn't be times 10 ** 18
             mktx(contract.storage[1003], 5000 * 10 ** 18, 0, 0)
         elif block.timestamp > contract.storage[1002]:
             # XXX Bug in contract example, values should be times 10 ** 18
             mktx(contract.storage[1003], ethervalue * 10 ** 18, 0, 0)
             mktx(A, (5000 - ethervalue) * 10 ** 18, 0, 0)