// ExampleLowLevelTransaction creates and signs a simple transaction, and then // encodes it into a hex string capable of being submitted to stellar-core. // // It uses the low-level xdr facilities to create the transaction. func ExampleLowLevelTransaction() { spub, spriv, err := GenerateKeyFromSeed("s3Fy8h5LEcYVE8aofthKWHeJpygbntw5HgcekFw93K6XqTW4gEx") if err != nil { log.Fatal(err) } dpub, _, err := GenerateKeyFromSeed("sfkPCKA6XgaeHZH3NE57i3QrjVcw61c1noWQCgnHa6KJP2BrbXD") if err != nil { log.Fatal(err) } op := xdr.PaymentOp{ Destination: dpub.KeyData(), Currency: xdr.NewCurrencyCurrencyTypeNative(), Amount: 50 * 10000000, } tx := xdr.Transaction{ SourceAccount: spub.KeyData(), Fee: 10, SeqNum: xdr.SequenceNumber(1), Memo: xdr.NewMemoMemoNone(), Operations: []xdr.Operation{ {Body: xdr.NewOperationBodyPayment(op)}, }, } var txBytes bytes.Buffer _, err = xdr.Marshal(&txBytes, tx) if err != nil { log.Fatal(err) } txHash := Hash(txBytes.Bytes()) signature := spriv.Sign(txHash[:]) ds := xdr.DecoratedSignature{ Hint: spriv.Hint(), Signature: xdr.Uint512(signature), } txe := xdr.TransactionEnvelope{ Tx: tx, Signatures: []xdr.DecoratedSignature{ds}, } var txeBytes bytes.Buffer _, err = xdr.Marshal(&txeBytes, txe) if err != nil { log.Fatal(err) } txeHex := hex.EncodeToString(txeBytes.Bytes()) fmt.Printf("tx hex: %s", txeHex) // Output: tx hex: 3658fe7598d20c7a6de3297f84bc52bd2a1ec8c0f1f6c5b41cc1c7571b4331f00000000a000000000000000100000000000000000000000100000000000000012d24692ed08bbf679ba199448870d2191e876fecd92fdd9f6d274da4e6de134100000000000000001dcd650000000001dd302d0c0cee527cf02f6a0aec6916966298712914c63e3c57de74a6e27c29ea234a555fcc36533417afe4e1147815a42529fbca3429bc7caf0a06dc6b383ca6e9d4d80f }
func TestTransactionMutators(t *testing.T) { Convey("TransactionBuilder Mutators:", t, func() { b := TransactionBuilder{} Convey("Defaults works", func() { b.Mutate(Defaults{}) So(b.TX.Fee, ShouldEqual, 10) So(b.TX.Memo, ShouldResemble, xdr.NewMemoMemoNone()) }) Convey("PaymentBuilder appends its payment to the operation list", func() { b.Mutate(Payment()) So(len(b.TX.Operations), ShouldEqual, 1) }) Convey("SourceAccount sets the transaction's SourceAccount correctly", func() { address := "gLtaC2yiJs3r8YE2bTiVfFs9Mi5KdRoLNLUA45HYVy4iNd7S9p" aid, _ := stellarbase.AddressToAccountId(address) b.Mutate(SourceAccount{address}) So(b.TX.SourceAccount, ShouldEqual, aid) So(b.Err, ShouldBeNil) }) Convey("SourceAccount sets an error for invalid addresses", func() { address := "foo" b.Mutate(SourceAccount{address}) So(b.Err, ShouldNotBeNil) }) Convey("Sequence sets the transaction's Sequence correctly", func() { b.Mutate(Sequence{1}) So(b.TX.SeqNum, ShouldEqual, 1) b.Mutate(Sequence{12345}) So(b.TX.SeqNum, ShouldEqual, 12345) }) }) }
// MutateTransaction for SourceAccount sets the transaction's SourceAccount // to the pubilic key for the address provided func (m Defaults) MutateTransaction(o *xdr.Transaction) error { o.Fee = 10 o.Memo = xdr.NewMemoMemoNone() return nil }