Example #1
0
        public void ReceivePay(PayMessage pay)
        {
            if (pay.Sequence != Sequence)
            {
                throw new MicroPaymentException("Out of order payment");
            }
            var expectedTotalAmount = Paid + pay.Amount;

            Arguments.Assert(pay.Payment, false, expectedTotalAmount, FundCoin);
            var sig = Arguments.ExtractSignature(Arguments.Payer, pay.Payment);

            if (!sig.Check(Arguments.Payer.PaymentPubKey, Arguments.Redeem, pay.Payment, 0))
            {
                throw new MicroPaymentException("Invalid signature");
            }
            Sequence++;
            Payment = pay.Payment;
            Paid    = Paid + pay.Amount;
        }
Example #2
0
        public PayMessage Pay(Money amount, Key payerKey)
        {
            var sequence = Sequence;

            Sequence++;

            var toPay = Paid + amount;
            var pay   = Arguments.CreatePayment(toPay, FundCoin);

            Arguments.Assert(pay, false, Paid + amount, FundCoin);
            pay     = MicroChannelArguments.SignPayment(pay, payerKey, FundCoin);
            Payment = pay;
            Paid    = toPay;
            return(new PayMessage()
            {
                Sequence = sequence,
                Amount = amount,
                Payment = pay
            });
        }
Example #3
0
        public OpenChannelAckMessage AckOpenChannel(OpenChannelMessage openMsg,
                                                    Key payeeKey)
        {
            if (payeeKey.PubKey != Arguments.Payee.PaymentPubKey)
            {
                throw new ArgumentException("Invalid payeeKey", "payeeKey");
            }

            Arguments.Assert(openMsg.UnsignedRefund, true, Arguments.Fees);
            var fundCoin = new Coin(openMsg.UnsignedRefund.Inputs[0].PrevOut, new TxOut(Arguments.Amount + Arguments.Fees, Arguments.Redeem.Hash)).ToScriptCoin(Arguments.Redeem);

            var signed =
                new TransactionBuilder()
                .AddCoins(fundCoin)
                .AddKeys(payeeKey)
                .SignTransaction(openMsg.UnsignedRefund);

            Refund = signed;
            return(new OpenChannelAckMessage()
            {
                SignedRefund = signed
            });
        }