From 46cc931dbdb9566462419ffb477721aedf6071de Mon Sep 17 00:00:00 2001 From: Molly Karcher Date: Fri, 7 Jun 2024 15:24:19 -0400 Subject: [PATCH] Remove internal API reference --- .../horizon/internal/docs/SDK_API_GUIDE.md | 17 - .../internal/docs/plans/images/adapters.png | Bin 38559 -> 0 bytes .../docs/plans/images/historyarchive.png | Bin 82839 -> 0 bytes .../horizon/internal/docs/plans/images/io.png | Bin 86548 -> 0 bytes .../docs/plans/images/ledgerbackend.png | Bin 57458 -> 0 bytes .../internal/docs/plans/images/pipeline.png | Bin 64608 -> 0 bytes .../internal/docs/plans/images/system.png | Bin 59201 -> 0 bytes .../internal/docs/plans/new_horizon_ingest.md | 181 ---- .../reference/endpoints/accounts-single.md | 164 ---- .../docs/reference/endpoints/accounts.md | 177 ---- .../docs/reference/endpoints/assets-all.md | 159 ---- .../reference/endpoints/data-for-account.md | 63 -- .../docs/reference/endpoints/effects-all.md | 133 --- .../endpoints/effects-for-account.md | 124 --- .../reference/endpoints/effects-for-ledger.md | 143 --- .../endpoints/effects-for-operation.md | 142 --- .../endpoints/effects-for-transaction.md | 142 --- .../docs/reference/endpoints/fee-stats.md | 124 --- .../docs/reference/endpoints/ledgers-all.md | 205 ----- .../reference/endpoints/ledgers-single.md | 92 -- .../docs/reference/endpoints/metrics.md | 126 --- .../docs/reference/endpoints/offer-details.md | 71 -- .../reference/endpoints/offers-for-account.md | 131 --- .../docs/reference/endpoints/offers.md | 122 --- .../reference/endpoints/operations-all.md | 192 ---- .../endpoints/operations-for-account.md | 162 ---- .../endpoints/operations-for-ledger.md | 140 --- .../endpoints/operations-for-transaction.md | 115 --- .../reference/endpoints/operations-single.md | 97 -- .../reference/endpoints/orderbook-details.md | 118 --- .../endpoints/path-finding-strict-receive.md | 103 --- .../endpoints/path-finding-strict-send.md | 105 --- .../docs/reference/endpoints/path-finding.md | 106 --- .../docs/reference/endpoints/payments-all.md | 198 ----- .../endpoints/payments-for-account.md | 168 ---- .../endpoints/payments-for-ledger.md | 119 --- .../endpoints/payments-for-transaction.md | 124 --- .../reference/endpoints/trade_aggregations.md | 155 ---- .../reference/endpoints/trades-for-account.md | 140 --- .../reference/endpoints/trades-for-offer.md | 139 --- .../docs/reference/endpoints/trades.md | 178 ---- .../reference/endpoints/transactions-all.md | 189 ---- .../endpoints/transactions-create.md | 132 --- .../endpoints/transactions-for-account.md | 166 ---- .../endpoints/transactions-for-ledger.md | 222 ----- .../endpoints/transactions-single.md | 112 --- .../horizon/internal/docs/reference/errors.md | 32 - .../docs/reference/errors/bad-request.md | 44 - .../docs/reference/errors/before-history.md | 41 - .../docs/reference/errors/not-acceptable.md | 42 - .../docs/reference/errors/not-found.md | 45 - .../docs/reference/errors/not-implemented.md | 41 - .../reference/errors/rate-limit-exceeded.md | 41 - .../docs/reference/errors/server-error.md | 48 - .../docs/reference/errors/stale-history.md | 39 - .../internal/docs/reference/errors/timeout.md | 49 - .../reference/errors/transaction-failed.md | 83 -- .../reference/errors/transaction-malformed.md | 53 -- .../horizon/internal/docs/reference/paging.md | 12 - .../internal/docs/reference/rate-limiting.md | 27 - .../horizon/internal/docs/reference/readme.md | 26 - .../docs/reference/resources/account.md | 199 ----- .../docs/reference/resources/asset.md | 72 -- .../internal/docs/reference/resources/data.md | 22 - .../docs/reference/resources/effect.md | 132 --- .../docs/reference/resources/ledger.md | 100 --- .../docs/reference/resources/offer.md | 81 -- .../docs/reference/resources/operation.md | 840 ------------------ .../docs/reference/resources/orderbook.md | 50 -- .../internal/docs/reference/resources/page.md | 92 -- .../internal/docs/reference/resources/path.md | 54 -- .../docs/reference/resources/trade.md | 66 -- .../reference/resources/trade_aggregation.md | 39 - .../docs/reference/resources/transaction.md | 119 --- .../internal/docs/reference/responses.md | 75 -- .../internal/docs/reference/streaming.md | 20 - .../tutorials/follow-received-payments.md | 213 ----- .../horizon/internal/docs/reference/xdr.md | 26 - 78 files changed, 8319 deletions(-) delete mode 100644 services/horizon/internal/docs/SDK_API_GUIDE.md delete mode 100644 services/horizon/internal/docs/plans/images/adapters.png delete mode 100644 services/horizon/internal/docs/plans/images/historyarchive.png delete mode 100644 services/horizon/internal/docs/plans/images/io.png delete mode 100644 services/horizon/internal/docs/plans/images/ledgerbackend.png delete mode 100644 services/horizon/internal/docs/plans/images/pipeline.png delete mode 100644 services/horizon/internal/docs/plans/images/system.png delete mode 100644 services/horizon/internal/docs/plans/new_horizon_ingest.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/accounts-single.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/accounts.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/assets-all.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/data-for-account.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/effects-all.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/effects-for-account.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/effects-for-ledger.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/effects-for-operation.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/effects-for-transaction.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/fee-stats.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/ledgers-all.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/ledgers-single.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/metrics.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/offer-details.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/offers-for-account.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/offers.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/operations-all.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/operations-for-account.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/operations-for-ledger.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/operations-for-transaction.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/operations-single.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/orderbook-details.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/path-finding-strict-receive.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/path-finding-strict-send.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/path-finding.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/payments-all.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/payments-for-account.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/payments-for-ledger.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/payments-for-transaction.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/trade_aggregations.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/trades-for-account.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/trades-for-offer.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/trades.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/transactions-all.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/transactions-create.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/transactions-for-account.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/transactions-for-ledger.md delete mode 100644 services/horizon/internal/docs/reference/endpoints/transactions-single.md delete mode 100644 services/horizon/internal/docs/reference/errors.md delete mode 100644 services/horizon/internal/docs/reference/errors/bad-request.md delete mode 100644 services/horizon/internal/docs/reference/errors/before-history.md delete mode 100644 services/horizon/internal/docs/reference/errors/not-acceptable.md delete mode 100644 services/horizon/internal/docs/reference/errors/not-found.md delete mode 100644 services/horizon/internal/docs/reference/errors/not-implemented.md delete mode 100644 services/horizon/internal/docs/reference/errors/rate-limit-exceeded.md delete mode 100644 services/horizon/internal/docs/reference/errors/server-error.md delete mode 100644 services/horizon/internal/docs/reference/errors/stale-history.md delete mode 100644 services/horizon/internal/docs/reference/errors/timeout.md delete mode 100644 services/horizon/internal/docs/reference/errors/transaction-failed.md delete mode 100644 services/horizon/internal/docs/reference/errors/transaction-malformed.md delete mode 100644 services/horizon/internal/docs/reference/paging.md delete mode 100644 services/horizon/internal/docs/reference/rate-limiting.md delete mode 100644 services/horizon/internal/docs/reference/readme.md delete mode 100644 services/horizon/internal/docs/reference/resources/account.md delete mode 100644 services/horizon/internal/docs/reference/resources/asset.md delete mode 100644 services/horizon/internal/docs/reference/resources/data.md delete mode 100644 services/horizon/internal/docs/reference/resources/effect.md delete mode 100644 services/horizon/internal/docs/reference/resources/ledger.md delete mode 100644 services/horizon/internal/docs/reference/resources/offer.md delete mode 100644 services/horizon/internal/docs/reference/resources/operation.md delete mode 100644 services/horizon/internal/docs/reference/resources/orderbook.md delete mode 100644 services/horizon/internal/docs/reference/resources/page.md delete mode 100644 services/horizon/internal/docs/reference/resources/path.md delete mode 100644 services/horizon/internal/docs/reference/resources/trade.md delete mode 100644 services/horizon/internal/docs/reference/resources/trade_aggregation.md delete mode 100644 services/horizon/internal/docs/reference/resources/transaction.md delete mode 100644 services/horizon/internal/docs/reference/responses.md delete mode 100644 services/horizon/internal/docs/reference/streaming.md delete mode 100644 services/horizon/internal/docs/reference/tutorials/follow-received-payments.md delete mode 100644 services/horizon/internal/docs/reference/xdr.md diff --git a/services/horizon/internal/docs/SDK_API_GUIDE.md b/services/horizon/internal/docs/SDK_API_GUIDE.md deleted file mode 100644 index bc8268ddb1..0000000000 --- a/services/horizon/internal/docs/SDK_API_GUIDE.md +++ /dev/null @@ -1,17 +0,0 @@ -# **Horizon SDK and API Guide** - -Now, let's get familiar with Horizon's API, SDK and the tooling around them. The [API documentation](https://developers.stellar.org/api/) is particularly useful and you will find yourself consulting it often. - -Spend a few hours reading before getting your hands dirty writing code: - -- Skim through the [developer documentation](https://developers.stellar.org/docs/) in general. -- Try to understand what an [Account](https://developers.stellar.org/docs/glossary/accounts/) is. -- Try to understand what a [Ledger](https://developers.stellar.org/docs/glossary/ledger/), [Transaction](https://developers.stellar.org/docs/glossary/transactions/) and [Operation](https://developers.stellar.org/docs/glossary/operations/) is and their hierarchical nature. Make sure you understand how sequence numbers work. -- Go through the different [Operation](https://developers.stellar.org/docs/start/list-of-operations/) types. Take a look at the Go SDK machinery for the [Account Creation](https://godoc.org/github.com/stellar/go/txnbuild#CreateAccount) and [Payment](https://godoc.org/github.com/stellar/go/txnbuild#Payment) operations and read the documentation examples. -- You will use the Testnet network frequently during Horizon's development. Get familiar with [what it is and how it is useful](https://developers.stellar.org/docs/glossary/testnet/). Try to understand what [Friendbot](https://github.com/stellar/go/tree/master/services/friendbot) is. -- Read Horizon's API [introduction](https://developers.stellar.org/api/introduction/) and make sure you understand what's HAL and XDR. Also, make sure you understand how streaming responses work. -- Get familiar with Horizon's REST API endpoints. There are two type of endpoints: - - **Querying Endpoints**. They give you information about the network status. The output is based on the information obtained from Core or derived from it. These endpoints refer to resources. These resources can: - - Exist in the Stellar network. Take a look at the [endpoints associated with each resource](https://developers.stellar.org/api/resources/). - - Are abstractions which don't exist in the Stellar network but they are useful to the end user. Take a look at their [endpoints](https://developers.stellar.org/api/aggregations/). - - **Submission Endpoints**. There is only one, the [transaction submission endpoint](https://www.stellar.org/developers/horizon/reference/endpoints/transactions-create.html). You will be using it explicitly next. \ No newline at end of file diff --git a/services/horizon/internal/docs/plans/images/adapters.png b/services/horizon/internal/docs/plans/images/adapters.png deleted file mode 100644 index 807cd4624299d6d381016d22622e209a721bee89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38559 zcmagGbyQbR)b>qxcS(15cT0b1kPhkYZjkO&TDnU@O1e8llf`NgT1AjT;V1Ofjn;!jOV0h|Q5)vx! zB_v2yoE<(|*_wlaX@{kHL9449;-0o9kFg^C`9t-G^v|EzZZL`6sk|ied~!J2qF{tz zI2{e2A3yuuEIHkj3E_fGsH>Wp(FUUg z)}G--W!DksMpqD$xFh6&6XwBSh-PgOzALjaH3eV0*nM6#_reqXd}^Wkx&Ed3`BiuC zd1$&5Oq84T<~;faIpmxROeM23F$E8dwVYL-RhZft)2BNl5`qwJb4Zb>HkN~@ZjxKL zu7A_01a%VztQ3wCg9;4Hgiv8O`Vu*C8_lrW4r$$AY@PK`Fs8{D^1VNp<4LfWdsvv1 ztqCq(^!<~BQg^`c)jdP9B*I;Ev)>ZEI*izKV*b~@*U9y}fb`m_pCbH{YjSX3Gk)4V zAjL07C%|1QDg>VUw#27$#o!w~aSS;`lMKN58dXMaa*G6y^5~Kfb96(P>WCx-@x`-S0SSCb*$eQCCn-q;NOQfZ_R$|mpnspFm-Rh5=bW%U3Rm1@C$)}IWo zBDpvA`r9^z&@-L1yTDUQ?ViXBc>`pKLY2FtjzV6@aNHLd!aTUL9Dh(rFDM2R@} zy1UJ2lBI6PWsfZ|zTZxRhFhLyF*$#fR%;UTxdonR1^MPYlbOLxtM_;xvpZ?4@I1xs zM`d)R27dC|E=OL#Q)e#OE{Dj0;fRvpfeE7_YLTFU2aBn^`W^~C*?jMZO8|q00%K43 zmH)KA-ae0kB62K-aR)`g{^?~|*`Xp8X~XE@!SLWl4dKqAX~6Cp4xGe@2xd%-_DR6K zLhH`ZPHF9(0{jEXac6B+zT+R;N5d>;g}R^leJ_clGLI3Mrk~ilGmK(bH)v5(aO5D( z!A0EG=;KwT%AV_PM4t9g_r$I!z2Su7{P(d_lN%Q56o zi{M8i%nP+uh(r;J;B023ta{s0jmlr*wm+}Dez*y^KZ^&guJ;aapz&&cK~Xwd6^g`= zEb3C_9=yt>Xtb-CTy>g%UA}O5et5;R61lT`aZobjzM!v%^}=0>J`()~A-rX0Mp%#P z<%0Q|Ep__s<1~q#`-hv*Zs*_^84@d*-5pu!QGRvc z%9xDc6S_%+Cz-JuV3Jtm@QIPU!Ms7G(wwBaXddYC zXcC{C`iM;6;S=U$aVSMp5z3I7FxbCWNx^NL8sQS2r%&>}^l z_eUfJThzjjpl?SbDAZNaFSRIzpMyBy$$}XVOOvc9RGens19KJRN7N6l z7UL=WzCM3N+!6D`NSn0)58IQg%_Nv@I71>sP62ZVa%8TRQ)5qKTVqb+`$nopEvwwAiP`l%$-S$6S=Yz?k^Sn~*eRxIj+xQv53>=| zBn34kr$xCRyV*an;<4YcnX!K{ZW(0l|73<`HfM2VK4v61`g8m)2fmkb#B2m>EM?F& zu`JgrC^JYWaVe57sP)S|^(8N2l2mAa3RMbK?l!_G>nMw+y{5hn&(sVr(5n*MiP!( zW<%Ol_)g|dXn$sZ%opt!`WOEf4R8>+Opt33br4Umr?r?;D1Z!J*8y}kt+aVPp6vI zf!17?rL0w`<(!SeDb63o6+idel;S|@_YHC`deO?G9}XKATDZHo-+$NjQI$~{R4$R; zEv#;_ueA?3u@KS`iZW9eLka0~&2>ML>neZFl2f}6NWmI=(cb{YLBmCozqr>C$cUMFg?+gT@_y+jh`KS54 zc<1?^9l0HuU5PysotAblhEjXEhMLBa4|ldSH@|J!?-?AutVj$~jGB7J@8yIFb>tA` zY$YvAMA_$N^YpGxP>p9ST@3l$;T1b6E4+UD~abou`TGQNIkD&ss^%?nAdz zy}iy6%0w%?8v$QM4EbKSKx5Nqg}uvv{G=6_5&~`rH zeepaxKgYzO`6U-77oS$03Y~_WdYHU)WDX4rF3v zNL*y*Z(MR*np}09+xigcCM@FyH=TmM{ZDec8uJygi=j0doE+S{-$a=rnGmajsy6Ma z?LrpEt3AHiH1ez_bb^+Dtb+WL??1jUJynf;AZ$*yXZaJ^&Jn<~cA{RQwR`Bpe4FF3 zK3CQ7(zIxB{CVV=Nm)Io5xEq( z5%q+){aXET|BnUC5{As3Q9ex%{BBr6S&!i- zion-w=lHhE}}s2`}0X$+O`mBu@w{hM!uFCoVxlH%J*4vV)-1U|-mg!%Z# zVs%n#qH4mzui#bvT<7SriG|;)8VG|6M_42U)!Dcqr>HDA)zrLVIn1h)ggUgC_~RGNnlMA*i;KdH!m32 zil4ybGM((*MNr_XQUaMcZdsIx#3q}%whq0P9?T0jxP%1xx0&^Q34CI9IyS9Zh;L{& z{z~T6g}+_e`F-!7LV`WXxQw+D(WY71P@RO}?IWdzAHT~LiGSrXw=`QB;T|p;S*AZ@ z@KtTEb`@RH43ppPurAaMZmWhd*jze6P!y@s*EMYV;C6Fxu#bMVaKlg2P?Nwq%%FoJ{9Vm5jzWoV< zT4l2??4CNhl|RdM{dE!b`ETO8Yb9GwOCGBE^YY^ zA3Cq44pp2l-td$(6IqVikABZtHSjGgDBRg;`tYY&<|JnI-HC16?rQ(Sb>8B@#f+;uUCl2>Hz2z#H*a5R4^1a`-;*cb8Jgrt_1wcwynswy-iC~``ODAO9-~ET z+Y`C40Zr9}wzfxohA5HZ6L|yEY8lYMy^V&PRU8ILL4d z>I9J~fz;qt4>Tt<>NL&O-)S;vcr30h;DuQPMc{m2_;lm+&O;ylk46XC^C(ON(y;XR z*!@_M4A%^t&;6OnOumeeRpgbuw!XGi$DBu0M7-}JmEcOucjK9Rt8af3{23K;zNPen z@oM!XOfd8P=}QJo1DSJrfQzW2(R-DTj*_2jN|iD!d65M%smTWmI%O^gJ^RxJ{=^0( zvZnIpHrA(mlT7;8VRfo294t5PTs_L%Wj91F+;`HQ&*=qOa5~9h*Tmhte)RMR_KIdE8w~I)Hst$|;%t3fq%p}Pidb>po~^LP1QDCJk2$Q%5KXF&p}uZ)j(_{ z(C;5x`1uli(eH#%P@^5**W0)2ZW18_aSZ+=VkCkaf)7H?C#=YkC}Au_w85xFxeQs~ zl(An_-zq+gXc5S2jU1(Ukr5)U+GlMsZIxiNV|igMryQm1q@tFdl{fY@r&%>&x#3(R z60{L0dpw@JRAyF&&C@Sx&Ji!XpV^+an{8O|DI+QEGFGv(G!5lwvuIzGoHko%{5975 zW!(2?!OxkMsD<)H{$A-$|c%> zZfRSmx!K0pYD|^;@B5?s0%UnJEi-ttu(HNdo@`HJ{hDt)ihj#?^jPr~BPDpYd`fmv3Zm2sHi#WXmA~Pf}v2zvh zIWVC>VNzB&woqtt0ucPJ7onp8ZbW zPSBp#z9?Kd541rcD)NQ0vto0U-)75aR`NLVeH2N0MF$-drvsf5hJ&mUma^{YqH#x+ z7gV_wzp>r;5q%*#{*t4|Ta9wUODvV+(5`hy`y}^d10fVlB_7oCUFsA0W`S0JeZL>2 zE0vTxx<{3qUz$G+2jwzjIwK2>NO3|{>DN1{GR0OED$u<0xVXM%h#L<`O}9c%M)kJV zpymZvf}Y}|sXHdK8X1R_3qv&RD5j?Vf}tJs@t5Ox-YeexFUWfJdXK+#1buJjd^#@& z688L9h2=X>pQVQzz#D^h#QJ}bNO(kGhXurOMwiD^_eu75M)Am5$|uQHFAX+#38qq2 zkwWHXx*P2qIo{~mujJQKj6+`y@N zE!R1`9Ue-zYP0F{H6yFBY3Cv+uf8qp&xg+kqfIu4G69daL-xlcpU(#&AdJ9{0!d`S zp!47r0wK>}j7jmg0##LDt3zbgkhKG+&|oRQV?Rrl!nHwNOXQ+8!a;`;l0!N{pA!#9 zUy0{PO%$epGE2!CdHIor5C%Jm5Nm^elF>_)bALgqCT59q$kY7VsaQ*^;6DGnJ*D3lXUwT3h}wM;a0 z)&0w63V#)7R{6_PSb2Q;7^nI922~$gNaR^CgrFCvkZ^!U!9MFIOHrGYk*e}bCF;+{ zUlYrSe4c!o{IRWYEim7kJdJL7ebT(#d{C44{SJH^o`Z+nU#P*WgZ9Nd#4W}BdicqC z$&(9KBoF)N`lknEs0HOVl;f5KY7ObOZ3!&ALDVmz&I`WWbQbI^`?a>h8+)I7Mx~sn zq6WLt44C7q)J5(OT@{<2GDjLnY$R}xyRex^blLP%4Fy_XPHs1poOy-*$4ysN{iTS!%-esoCZX01yG!%EeU-r?kx&%XvoC$pcJMJZTW z_9Q;(TN<{Q_s!CJjJPT|6DdDwZ#-`aJkqNXsRa~ine&^U6YCANW_s+^26Q@s`>Yp| zziw=A;ul?+&ts3I#w*`ziOpkMXiOr{4=gw>hybdavy;-Le@|CV-tB|`cN^Hl@xmGTF|ydTiWj%t>BlK1u+QuE@MjFR zHJ)s?#DaKiVxmyQ$uI5Mq;{=c_Tk`meCK=jZBbG0sNU$c$ee%5v-bV|Q-gV!d072S zef@*{uGUV?ipECy^TGLi5LY=@c2j86s13*A(_!^t*dglTV!-J0&70Rt2C z^Ark_#h{ zl9CEKn|JMfzjxuvVCBR>m^hldBV2M4o*vjqzqA0HnJD?1B2I}>mPlZ%(V ztFb4Oy$i*Ejr`wsB+Xq+ovj>QtsLx0-`X`cad2}LA}4=)(Et4Tub<|gR{!rw_AdX1 z1q_ho?F;FGz{@)Y-*PS~5 z?@kU@-v52)|2p&UPC=Hp0sOB4{Wn{Gj{?&rj3CJJKT|J^pqYJB0R|=t_Fhs<-4pyM z8#;qhs(vuJL;p8wbN_ZNBua#7U0DC0KPVzwI6mDQj3?gR8;&jCnI<+)7*9@MZ>tTS zHqfP%>@?i26((IL75Z-7v^3<*wnQ4(RmmHq&ftZ_A$u-c4+evZR&s3i!v7z^PZU#G>q8*KA%pG)_w+c5%JlkLi~BK4Qu3 z5yu5mtika@#EBx3u0@qYBm9tZgdzf$=|-oO?#9+&<38DZI~zzb1p(JmU>zjxi2nDi zBUBW+qm)KW?Bn0FYjBNV5PstXgVjxD-PR zI?=u*uIqNZaPfD=?%;0j+NkFpZv7if{o7!c3Y>oY8;oc-cIqM|Flu1%L1}Lzm&c7q z-2LzBwWyK9|2s?a6u>MMMGuC#{5MOEQrm8S?*f;}D?+zi9L8eGE?f<*s8{1(xz|f6 zq4)i?yytl4dM}#Kq|u+L9cTFA$kX{ry8kP&o;QZS#)UptS1d||?fK&&1wERR^M9>c z>Oei2MG+WseoM01igWYST*o~fFtNyV^8K{4Ezmx_ zztYSg zl?(X2jlfBH@@@8jd0>X(uPl9eTzw5E33y_AdN{0cqxzj0l(;)BLxP+e@Zx1bz1jZm zZH+lXwSff*AJJCd;*MTVNuY)~4dBxdd9DT3xupLw^uOO;pHow|OJ32?(#OWpcbz`# z$2DwpV)4oFy%_FooK^aO^R;+&*`e#5lHhsYSs$kI9MU29-&eX<1*bmE=gtmoEFf5r zyYybVYI4U1M59rgmak{>{Rq|D>ac>WKG$Y2x&vxIqPnw8<2d3+a$vqqT95>ZI zo_vp3?~OZ(oxgH&dPepeq z^vl#JOBWFg3Q=icX~)ekhNr7p<%0=BP`g9tz4Z1Ui(J1HT;D~*fakOGK@!-RKLM}L zse?-vx$p4y+1^>-Qymfe9HFa(D<~$NLZa}BrXK0qR27|nYS@TkuzulLwrx0@k!LCU z{>t|^03@T87PzpQHaq^DW{6CBe>YFw17~Da`*_-Am|JwN^zwWfa47V$8Ovk9zGRlX z-#`n29B|yUc);O5tH7a1a1+H)Eo+9rc1_4?6u2_Ue^^OB8-{C8I(b;tY*2qO!f^Op zH%R<>C?&U8!uzvBXKT37#Sq23VevCY&sy_ZFe3FRV?)e}LtQ@({ixvOSm7i!#d=Fb z)W&dD`aoT+-aS*-)5WmQX-9f7xWk2Y{TT0NOk`2>^UX5Ns^6{tNW`5ybF10K0HH(a z=NPEus^%5l)8UH$0!nren4L05sdby7-?aw4K}5+5W$36ejUM_zgHhV90ksnZkez{!r;b zA~M6uw~EHrvknx)1L+c+0%1e(EBc~mOSFlsS%>^{9N$jH+&dBcj#7buzQI@$7*zJ2 z>D-t+4E)w2e|G4S{VX;qkYJs`950>>8cwI4`8&ngzMnlY)Mj>!=!m^$6;sn1W?WuY9F;x)g{a{)k~*t2 zRsc04i=%45zlPCxBTlRj2$&)x7V;MxbwL?!Wlf6)A7bBWhlr;g!9|uy#xM*JxhN=N z7{tKnl$3|D6yKfof9Vh^L9)2qoBX>Hx5z{vXL8&HKul@2fUGhJnyXl@|ON@rDp;R zb&$Dz(E1lz@&@1daS*G>qVF$6{r}#4wLL^WRNYjs!==Y0d~*5^%mmO&3uJz7*sS|X z&I=qy?*97Qn0<)o>JeGl(yo0nChpun%=kd6A~oq492RzouF*`Zi97T6(v@h@^qd?6 z=#P!1{}&c_DO8kwY+%zpI@Jq{r<|h@&_BZum7=vq{}%!YgS@eHEl9W301VE16^>>W~oSx@;7&v0S1Pb3*3Ev5kSKn>OF6o)Bmur^o=$M<&Z%C8lbAtbt zN1Fx8LQsXZ?}eVPW{-D33>#@5?8~g$f#7a66)*fiJ3a`Yi|TFr=k`0V^^xBz{*T9w z8<8~OG&!CHj2Vx75Xe$_r~(0p&s^#d77G;UdwVz`uP?Vzru^#t+LzW^S<{prvb-Fq1#XZ{aBIJa9$%w{NcWz zv{e-I0i0y@fRoPo;~>K{4*u@>x+VY_=&+{|XVdG;Bg1RMq_BV(iW zu|weMIR-7nhoJCVrtrRj3j2!ZX4&h-C`*mj$m8{*p|U-&LauZO{#+RpH>6DFzFg6` zH87mR!Q!*vQ&A-=a%YAElRcVr+WE-5EpbPcuE+i(`w>8DL3}|^NAkjQvn;D(5KrcW zsy{*YF}n#+938hZIkr#GjmP$J^KMWoF744KFR6c0tzx$&l~x=)x z{xE<%sYlp6a^2*?wF*cu*&OJ!;l#_=OfW>ra_6JP9!|JLslE6`IZ%^~8KOsOY(cK-iT-h5GPn5|D7&j|Er=)T+ z$gqwfj7-JU`9*2E^uOJg?TmpGK4bAB*;;h_Tl)+9y(HV7`UVuHLY`A*z1c{@bzVQt z2gWCWqL45ZIYDSeKf{|{5w7k5IE62eym|ppXP&N2_dHXn9f1E{B#tpOZs1em_B{q~ zl?GVYD8r-$J=xV>L+SSp@L^4L1qAdb?oJ9n#zZH@9Q6P}%OT$14eCI8?Utwcq?Gsv zdMPS67FZ}cqz!xJqwnkUt?>w5$($QL!974)lGsY^#2mX{T&&x*47{XjzNPi`0(!C1 zo|a<4=IbJ^nHk0afeoYEu0szzjl${i$1%1+BzE0tnGJDTY=TX@Z%foevSN$A27cG` zwZqh(OS@uJu12yjLrFA4*)gUqUj9-Dz?#tbp#3%-?E8o7!}Nh>!W2x(LK+vjRALmC z_A_y#KPV<0wA3-;?!T;P+~}ja-XPQ$i%9Mx5HsU-_Bvvc<|aM0?{!46MDPl>>L7@G zj_R(7p}G69)U<1{cISRL5C!q0pP_4H2YQ`Z!x?GD)df9kn_0Mm={xmfuLA-K@%3&{ zq%m>u>oU?iy!UKbd;qS_gzjY7Fl!L8_ZLSQwQi@$KWlfVyQPrMy02G%KbZ;h!IH^I zlpuI-pWpz8HDQf-L<&L59M<<<;=+1RhYXSof|Mjg$D;@b-aa&ve?6A{RJpC92I76~t5 zXoyk2(4=GJQxm>?Z*_sJI!ayWtkJSvvp&H`AjT~CEEJG}Aj(M2`%PHT8%|wg4~A)S z70gmH2*_%yH7Ikn2kBV0xPoa8h0$z24uuoiXjGCpO%kLUla2Hg91sw#!-e?h_&QP% ziJXxUi!3Bn`Z5ajJYD9#&bex{a0D#i^{cWbmQAMM*2m+qiTC~@z}`Nb>p;&#;fyN3 zh*~U_F2s1>ceQ-=vnn0khYe74NZBTIh>Hdyw!6>?H`2GBf1tpn5fmJj+K^1tPAaw7 z`Z-TpHjDX;%VW`@C@{wcipb_xgeXwhl4N_?^x;s8F$Clk#Mo1*VsB|HwIwhp;Ij*2 zwn?ar2J(e2h9AqU>Ryt0q%z){qzu;IWt4JQk8N-PV)7u1MBAi(VvbI`FLYnv7)-4c zt-TwG&!<jil?87>=`EKOFbE9tXr@XE%$j!PNM>YafpF-Jk(+484kGuKz>Xh$|3T zOVq*@aqD5>(HP2!Q#kfI;|GA_#6e{yy z+vS*nS2#ZVcmcN5Nt=OZj(=er;jW9<#s8lp#tU&xYUE8*VQNBr!NmED0bws(5S4iD z^N*`R0CUq8LRGJ;q-qHkIGaWh

b8-okrs?O^@3Az2dmH@!aa_|J7e_k6WF1VKZ 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 diff --git a/services/horizon/internal/docs/plans/images/io.png b/services/horizon/internal/docs/plans/images/io.png deleted file mode 100644 index 5f49556fb4997073202c08389dfd1f18cdcfb542..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86548 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 diff --git a/services/horizon/internal/docs/plans/images/ledgerbackend.png b/services/horizon/internal/docs/plans/images/ledgerbackend.png deleted file mode 100644 index 39990c77dabd24b6b6095a13a77e313b078bfdf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57458 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

!&*0M%wL*y1!q!utU*+U z=fW#-sv%?znliDHBhg-M*RPMb?YF`b%E@$@Ul|Ilr8sz6&jGn$Z@fl-ue515B)t!c zCQ5+``hZCE{+nNHV2lp2r0L76FAvdP>q7UZUOT<$+aiL!>x`IyK_!#IzGS-^;x+KH zwf^|_fR=B*4F+XK2=Px~P^>`K4GJkfx9<*1NOhTS_?*J;va9=|3G8OQ)&p0)^yx=V zZXv#m`^-G*==|Y%Y*QU;9Z)m^e(>;21IjMcp93BK7D3sHbdYudNGQ=U$~ch>BKcQq zA~*X^PDRC)AyUqA8u{78A)JXN%PRCbqy^nI@o+>!7n&1N{0c4~wSmRZ5+kPNiRwdv z;AamAP@iPGpB!@Q^*J=ANkZ_OdanESD+J_1MT&Yl^)^~

eSHMPnsq^xakniRtj{ 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�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 Gf&UNox^Ub8 diff --git a/services/horizon/internal/docs/plans/new_horizon_ingest.md b/services/horizon/internal/docs/plans/new_horizon_ingest.md deleted file mode 100644 index 615d671948..0000000000 --- a/services/horizon/internal/docs/plans/new_horizon_ingest.md +++ /dev/null @@ -1,181 +0,0 @@ -# New Horizon Ingest - -This describes the goals, design, and implementation plan for the new Horizon ingestion system. - -## Project Goals - -- Handle need for Horizon to re-ingest, catch up after outage, or fill gaps -- No more stellar-core DB access from Horizon -- Full history ingestion of Stellar Public Network ledger shouldn’t take longer than 24h on x1.32xlarge AWS machine -- Horizon maintains own state of the ledger. Order books, at least, need to be kept in-memory to allow fast pathfinding. -- Multi-writer ingestion is provided for re-ingestion (speed) and for ledger stream (high availability) -- Ingestion is a collection of micro-services (trade aggregations, trades, txn history, etc…) -- Support plugins, so 3rd parties can implement custom ingestion schemes and easily plug them in -- Can run as standalone process, separate from Horizon -- Has clear API for building clients on top of it - -## Design - -### Inputs - -The ingestion system will read data from two sources: - -1. A History Archive [1](https://www.stellar.org/developers/stellar-core/software/admin.html#history-archives),[2](https://github.com/stellar/stellar-core/blob/master/docs/history.md), which is generated by `stellar-core` and provides a complete copy of a recent [ledger](https://www.stellar.org/developers/guides/concepts/ledger.html) as well as a history of `TransactionResult` XDR objects, which in turn contain [operation results](https://github.com/stellar/stellar-core/blob/master/src/xdr/Stellar-transaction.x#L382-L834). -2. A full ledger reader, which provides random and up-to-date access to the transaction sets & [`TransactionMeta`](https://github.com/stellar/stellar-core/blob/master/src/xdr/Stellar-ledger.x#L271-L318) in each ledger close. `TransactionMeta` info is essential for keeping a view of the ledger state up to date, as it describes the changes to ledger state that result from each operation. - -#### History Archive Reader - -The ingestion system needs to provide a full copy of current ledger state so that Horizon and other consumers of the ingestion system have no need to access the `stellar-core` database. The history archive reader allows ingestion to read the (near) current ledger state from a history archive. The advantage of this approach is that ingestion puts no load on the `stellar-core` database to pull in ledger state, since it reads entirely from a history archive, which is often stored in S3 or a separate file system. - -For context, a `stellar-core` can be configured to write out a history archive, which stores snapshots of the ledger state every 64 ledgers (approximately every 5 minutes). We envision that an administrator will run a `stellar-core`, configure it to write out a history archive, and then point the ingestion system at that history archive. This has two advantages: - -1. The ingestion does not put load on any external service (like SDF's history archives) -2. The administrator does not need to trust third party history archives - -Typically, the ingestion system will only access the history archive on startup to get a full copy of ledger state, and will then keep that copy of ledger state up to date using data from the separate ledger transaction set backend. However, the ingestion system could access older snapshots to construct a history of ledger state, or it could periodically re-ingest the full ledger state to detect any errors that accumulate over time from updating the ledger state. - -The history archive reader supports multiple backends to handle different ways that a history archive can be stored: - -1. S3 backend -2. HTTP backend -3. File backend - -UML Class diagram - -![History Archive Reader Class Diagram](images/historyarchive.png) - -Example of reading a history archive using `stellar-core`: - -```sh -wget http://history.stellar.org/prd/core-live/core_live_001/results/01/4d/f7/results-014df7ff.xdr.gz -gunzip results-014df7ff.xdr.gz -~/src/stellar-core/src/stellar-core dump-xdr results-014df7ff.xdr | head -n 40 -``` - -#### Full Ledger Reader - -The ingestion system needs a way to keep the current ledger state up to date, as well as a way to construct a history of events (typically transactions, operations, and effects) that have occurred over time on the Stellar network. The full ledger reader provides this ability. Specifically, it allows the ingestion system to access a stream of transaction metadata that encode state changes that happen as a result of every transaction. This information is missing from the history archives, and is also updated after every ledger close (vs. after every 64 in the history archives). The full ledger reader also has access to transaction sets for each ledger. - -Here's a summary of the features provided by the full ledger reader vs. the history archive reader: - -| Reader | txn resultsets | ledger state snapshots | transaction metadata | near-realtime (updates at every ledger close) | -| --- |:---:|:---:|:---:|:---:| -| history archive | X | X | | | -| full ledger | X | | X | X | - -The long term plan for the full ledger reader is for `stellar-core` to write transaction metadata out to an S3 bucket, which will allow the following: - -1. Reading transaction metadata without creating load on `stellar-core`'s database -2. Fast, parallel access to historical transaction metadata (allowing fast `CATCHUP_COMPLETE` ingestion) -3. Multiple `stellar-core`s writing the latest update to the same S3 object. This allows redundancy: one `stellar-core` can fail, and the stream of S3 objects will continue uninterrupted. - -However, this requires a change to `stellar-core`, which is estimated to happen in Q3 2019. Until then, the ingestion system will read from the `txfeehistory` and [`txhistory`](https://github.com/stellar/stellar-core/blob/master/src/transactions/TransactionFrame.cpp#L683) tables in the `stellar-core` database as it does currently. Unfortunately, we won't get any of the benefits listed above until the change is made to `stellar-core`. - -The full ledger reader will support multiple backends: - -1. `stellar-core` database reader (this will be implemented first, and is exactly what happens now) -2. File backend -3. S3 backend - -UML Class diagram - -![Full Ledger Reader Class Diagram](images/ledgerbackend.png) - -### Data Transformation - -The ingestion system has a data transformation pipeline in between its inputs (full ledger backend + history archive backend), and its outputs. - -#### Input Adapters - -The first step is to adapt the format of the data flowing from the two input backends into a format & interface that is easy for the ingestion system to use for both random access, and accessing the latest data. - -UML Class diagram - -![Input Adapters Class Diagram](images/adapters.png) - -Notes: - -- the `HistoryArchiveAdapter` supports both reading a ledger transaction result set via `GetLedger()` and reading ledger state via `GetState()`. -- Both adapters support `GetLatestLedgerSequence()`, which allows a consumer to look up the most recent ledger information in the backend. -- The adapters, rather than returning state and ledgers as objects stored in memory, return them as `ReadCloser` objects. This is because the ledger state or a particular transaction state may not fit in memory, and must be processed as a stream. - -Both `ReadCloser` and `WriteCloser` interfaces include `Close()` method. When `Close()` is called on `ReadCloser` it tells the reader that no more data is needed and it should stop streaming, ex. close buffered channels, close network connections, etc. When `Close` is is called on `WriteCloser` it means that no more data will be written to it. This is especially helpful when writer is writing to a pipe so the reader on the other end knows that no more objects will be streamed and can return `EOF`. - -The `ReadCloser` structs come from the `ingest/io` package, shown in the UML class diagram below: - -![IO package](images/io.png) - -#### Ingestion Pipeline - -At the center of ingestion is a `Pipeline`, which is initialized with a series of processors for each kind of data that ingestion handles (ledger state, a full ledger update, and an archive ledger update). Each processor implements a function that reads data from a `ReadCloser`, processes/filters it, and writes it to a `WriteCloser`. A few example processors: - -- A processor that passes on only information about a certain account -- A processor that only looks at certain kinds of events, such as offers being placed -- A processor sending a mobile notification for incoming payments -- A processor saving data to a database or in-memory store. - -See the rough UML diagram: - -![Filter package](images/pipeline.png) - -Notes: - -- The processors form a tree and are processed from root to leaves. -- Processing does not change the type of the data, but it can remove or change fields in the data -- Processors can write/read artifacts (ex. average balances) in a `Store` that is shared between all processors in a pipeline. `Store` is ephemeral, its contents is removed when pipeline processing is done. - -### Tying it all together - -The ingestion system can run as a stand-alone process or as part of a larger process like Horizon. It can handle three different kinds of sessions: - -- `IngestRangeSession`: ingest data over a range of ledgers. Used for ingesting historical data in parallel -- `LiveSession`: ingest the latest ledgers as soon as the close. This is the standard operating mode for a live Horizon instance -- `CheckpointsOnlySession`: ingest only history archive checkpoint data. - -Sessions are responsible for coordinating pipelines and ensuring data is in sync. When processors write to a single storage type, keeping data in sync is trivial. For example, for Postgres processors can share a single transaction object and commit when processing is done. However, there's also a significant challenge keeping data in sync when processors are writing to different storage types: any read operation that reads across stores or across data updated by multiple `Processes`s is at risk of reading inconsistent values. `System` or `Session` objects (TBD) should be responsible by keeping different stores in sync. For example: they can ensure that all queries sent to stores have the latest ledger sequence that was successfully saved all stores appended. This probably requires stores to keep data for the two (2) latest ledgers. - -![ingest package](images/system.png) - -## Open questions - -There are several open questions, and the design above isn't comprehensive. A few questions below: - -- What is the story around ingestion plugins? How do developers use the ingestion system in their own projects? -- How do we enable ingestion via multiple languages? -- Will we split Horizon into an ingestion process and an API server process, or keep a single process? -- Should a stand-alone ingestion process expose an RPC server or a more standard REST API? - - What's the exact API that an ingestion server exposes? -- Where is parallel ingestion logic handled? -- How exactly do we organize `Store`s, `ProcessingPipeline`, and `Process`es? -- How do we keep reads from multiple stores consistent? -- How do we make the `Store`s and `Process`es in `ingest/stores` reusable? - -## Implementation Plan - -This gives an overview of how we could move Horizon over to using the new ingestion system. - -### As we implement components - -We can create a command-line tool that computes basic stats and exercises all the components of ingestion to prove that they work together. For example, the tool can compute the total number of accounts every 5 minutes, or compute the number of transactions per second. - -### The proof of concept - -We can implement [accounts for signer](https://github.com/stellar/go/issues/432) using the new ingestion system. It's a good candidate because it's something we urgently need, and it's a new feature, so we don't risk breaking anything existing if there's an issue with the system. - -### Chunks that can be broken off and implemented separately - -- The projects below depend on the `io` package interfaces, which should be pretty minimal to add. -- History Archive Backend and History Archive Adapter (Nikhil is already on this) - - command-line tool takes a history archive file and prints out basic stats like # of accounts and transactions per second -- `DatabaseBackend` implementation of `LedgerBackend` and `LedgerBackendAdapter` - - command-line tool takes a database URI and computes stats like # of transactions in the latest ledger (it runs live and updates with each new ledger in the `DatabaseBackend`) -- `ingest/pipeline`: - - command-line tool that implements a few demo processors and given a DB URL and/or a historyarchive file location, streams out the data that passes the filter - -Once the above are all done, put together a basic ingestion server as laid out in the top-level `ingest` package. - -At this point, we'll have a full end-to-end implementation! Next, we start filling in the extra features we didn't need for the proof of concept. Once it's reasonably stable, we can release Horizon with the new `accoutns for signer` feature to get some real-world testing. - -### Porting the rest of Horizon over - -Once the proof of concept is functional, tables / features can be ported over one by one. Features that depend on `stellar-core` tables currently can be moved to equivalent tables maintained by Horizon. I imagine most features will still use postgres, but a few, such as pathfinding, will need in-memory storage for speed. If pathfinding can maintain a copy of order books [in memory](https://github.com/stellar/go/issues/849) it should run orders of magnitude faster. Horizon should be split out into a microservices architecture, with each feature implemented using a different `StateInitProcess` or `LedgerProcess` object. diff --git a/services/horizon/internal/docs/reference/endpoints/accounts-single.md b/services/horizon/internal/docs/reference/endpoints/accounts-single.md deleted file mode 100644 index ca0ccfdcf9..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/accounts-single.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -title: Account Details -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=accounts&endpoint=single -replacement: https://developers.stellar.org/api/resources/accounts/single/ ---- - -Returns information and links relating to a single [account](../resources/account.md). - -The balances section in the returned JSON will also list all the -[trustlines](https://www.stellar.org/developers/learn/concepts/assets.html) this account -established. Note this will only return trustlines that have the necessary authorization to work. -Meaning if an account `A` trusts another account `B` that has the -[authorization required](https://www.stellar.org/developers/guides/concepts/accounts.html#flags) -flag set, the trustline won't show up until account `B` -[allows](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#allow-trust) -account `A` to hold its assets. - -## Request - -``` -GET /accounts/{account} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `account` | required, string | Account ID | GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.accounts() - .accountId("GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB") - .call() - .then(function (accountResult) { - console.log(accountResult); - }) - .catch(function (err) { - console.error(err); - }) -``` - -## Response - -This endpoint responds with the details of a single account for a given ID. See [account resource](../resources/account.md) for reference. - -### Example Response -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB" - }, - "transactions": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/transactions{?cursor,limit,order}", - "templated": true - }, - "operations": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/operations{?cursor,limit,order}", - "templated": true - }, - "payments": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/payments{?cursor,limit,order}", - "templated": true - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/effects{?cursor,limit,order}", - "templated": true - }, - "offers": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/offers{?cursor,limit,order}", - "templated": true - }, - "trades": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/trades{?cursor,limit,order}", - "templated": true - }, - "data": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/data/{key}", - "templated": true - } - }, - "id": "GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB", - "paging_token": "", - "account_id": "GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB", - "sequence": 7275146318446606, - "last_modified_ledger": 22379074, - "subentry_count": 4, - "thresholds": { - "low_threshold": 0, - "med_threshold": 0, - "high_threshold": 0 - }, - "flags": { - "auth_required": false, - "auth_revocable": false, - "auth_immutable": false - }, - "balances": [ - { - "balance": "1000000.0000000", - "limit": "922337203685.4775807", - "buying_liabilities": "0.0000000", - "selling_liabilities": "0.0000000", - "last_modified_ledger": 632070, - "is_authorized": true, - "asset_type": "credit_alphanum4", - "asset_code": "FOO", - "asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR" - }, - { - "balance": "10000.0000000", - "buying_liabilities": "0.0000000", - "selling_liabilities": "0.0000000", - "asset_type": "native" - } - ], - "signers": [ - { - "public_key": "GDLEPBJBC2VSKJCLJB264F2WDK63X4NKOG774A3QWVH2U6PERGDPUCS4", - "weight": 1, - "key": "GDLEPBJBC2VSKJCLJB264F2WDK63X4NKOG774A3QWVH2U6PERGDPUCS4", - "type": "ed25519_public_key" - }, - { - "public_key": "GBPOFUJUHOFTZHMZ63H5GE6NX5KVKQRD6N3I2E5AL3T2UG7HSLPLXN2K", - "weight": 1, - "key": "GBPOFUJUHOFTZHMZ63H5GE6NX5KVKQRD6N3I2E5AL3T2UG7HSLPLXN2K", - "type": "sha256_hash" - }, - { - "public_key": "GDUDIN23QQTB23Q3Q6GUL6I7CEAQY4CWCFVRXFWPF4UJAQO47SPUFCXG", - "weight": 1, - "key": "GDUDIN23QQTB23Q3Q6GUL6I7CEAQY4CWCFVRXFWPF4UJAQO47SPUFCXG", - "type": "preauth_tx" - }, - { - "public_key": "GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB", - "weight": 1, - "key": "GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB", - "type": "ed25519_public_key" - } - ], - "data": { - "best_friend": "c3Ryb29weQ==" - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no account whose ID matches the `account` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/accounts.md b/services/horizon/internal/docs/reference/endpoints/accounts.md deleted file mode 100644 index 29bfd2bd40..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/accounts.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: Accounts -replacement: https://developers.stellar.org/api/resources/accounts/ ---- - -This endpoint allows filtering accounts who have a given `signer` or have a trustline to an `asset`. The result is a list of [accounts](../resources/account.md). - -To find all accounts who are trustees to an asset, pass the query parameter `asset` using the canonical representation for an issued assets which is `Code:IssuerAccountID`. Read more about canonical representation of assets in [SEP-0011](https://github.com/stellar/stellar-protocol/blob/0c675fb3a482183dcf0f5db79c12685acf82a95c/ecosystem/sep-0011.md#values). - -### Notes -- The default behavior when filtering by `asset` is to return accounts with `authorized` and `unauthorized` trustlines. - -## Request - -``` -GET /accounts{?signer,asset,cursor,limit,order} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `?signer` | optional, string | Account ID | GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB | -| `?asset` | optional, string | An issued asset represented as "Code:IssuerAccountID". | `USD:GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V,native` | -| `?cursor` | optional, default _null_ | A paging token, specifying where to start returning records from. | `GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/accounts?signer=GBPOFUJUHOFTZHMZ63H5GE6NX5KVKQRD6N3I2E5AL3T2UG7HSLPLXN2K" -``` - - - - - - - - - - - - - - - - - -## Response - -This endpoint responds with the details of all accounts matching the filters. See [account resource](../resources/account.md) for reference. - -### Example Response -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/accounts?cursor=\u0026limit=10\u0026order=asc\u0026signer=GBPOFUJUHOFTZHMZ63H5GE6NX5KVKQRD6N3I2E5AL3T2UG7HSLPLXN2K" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/accounts?cursor=GDRREYWHQWJDICNH4SAH4TT2JRBYRPTDYIMLK4UWBDT3X3ZVVYT6I4UQ\u0026limit=10\u0026order=asc\u0026signer=GBPOFUJUHOFTZHMZ63H5GE6NX5KVKQRD6N3I2E5AL3T2UG7HSLPLXN2K" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/accounts?cursor=GDRREYWHQWJDICNH4SAH4TT2JRBYRPTDYIMLK4UWBDT3X3ZVVYT6I4UQ\u0026limit=10\u0026order=desc\u0026signer=GBPOFUJUHOFTZHMZ63H5GE6NX5KVKQRD6N3I2E5AL3T2UG7HSLPLXN2K" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB" - }, - "transactions": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/transactions{?cursor,limit,order}", - "templated": true - }, - "operations": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/operations{?cursor,limit,order}", - "templated": true - }, - "payments": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/payments{?cursor,limit,order}", - "templated": true - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/effects{?cursor,limit,order}", - "templated": true - }, - "offers": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/offers{?cursor,limit,order}", - "templated": true - }, - "trades": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/trades{?cursor,limit,order}", - "templated": true - }, - "data": { - "href": "https://horizon-testnet.stellar.org/accounts/GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB/data/{key}", - "templated": true - } - }, - "id": "GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB", - "paging_token": "", - "account_id": "GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB", - "sequence": 7275146318446606, - "last_modified_ledger": 22379074, - "subentry_count": 4, - "thresholds": { - "low_threshold": 0, - "med_threshold": 0, - "high_threshold": 0 - }, - "flags": { - "auth_required": false, - "auth_revocable": false, - "auth_immutable": false - }, - "balances": [ - { - "balance": "1000000.0000000", - "limit": "922337203685.4775807", - "buying_liabilities": "0.0000000", - "selling_liabilities": "0.0000000", - "last_modified_ledger": 632070, - "asset_type": "credit_alphanum4", - "asset_code": "FOO", - "asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR", - "is_authorized": true - }, - { - "balance": "10000.0000000", - "buying_liabilities": "0.0000000", - "selling_liabilities": "0.0000000", - "asset_type": "native" - } - ], - "signers": [ - { - "public_key": "GDLEPBJBC2VSKJCLJB264F2WDK63X4NKOG774A3QWVH2U6PERGDPUCS4", - "weight": 1, - "key": "GDLEPBJBC2VSKJCLJB264F2WDK63X4NKOG774A3QWVH2U6PERGDPUCS4", - "type": "ed25519_public_key" - }, - { - "public_key": "GBPOFUJUHOFTZHMZ63H5GE6NX5KVKQRD6N3I2E5AL3T2UG7HSLPLXN2K", - "weight": 1, - "key": "GBPOFUJUHOFTZHMZ63H5GE6NX5KVKQRD6N3I2E5AL3T2UG7HSLPLXN2K", - "type": "sha256_hash" - }, - { - "public_key": "GDUDIN23QQTB23Q3Q6GUL6I7CEAQY4CWCFVRXFWPF4UJAQO47SPUFCXG", - "weight": 1, - "key": "GDUDIN23QQTB23Q3Q6GUL6I7CEAQY4CWCFVRXFWPF4UJAQO47SPUFCXG", - "type": "preauth_tx" - }, - { - "public_key": "GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB", - "weight": 1, - "key": "GD42RQNXTRIW6YR3E2HXV5T2AI27LBRHOERV2JIYNFMXOBA234SWLQQB", - "type": "ed25519_public_key" - } - ], - "data": { - "best_friend": "c3Ryb29weQ==" - } - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). diff --git a/services/horizon/internal/docs/reference/endpoints/assets-all.md b/services/horizon/internal/docs/reference/endpoints/assets-all.md deleted file mode 100644 index c5281a6b32..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/assets-all.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -title: All Assets -clientData: - laboratoryUrl: -replacement: https://developers.stellar.org/api/resources/assets/ ---- - -This endpoint represents all [assets](../resources/asset.md). -It will give you all the assets in the system along with various statistics about each. - -## Request - -``` -GET /assets{?asset_code,asset_issuer,cursor,limit,order} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `?asset_code` | optional, string, default _null_ | Code of the Asset to filter by | `USD` | -| `?asset_issuer` | optional, string, default _null_ | Issuer of the Asset to filter by | `GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36` | -| `?cursor` | optional, any, default _null_ | A paging token, specifying where to start returning records from. | `1` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc", ordered by asset_code then by asset_issuer. | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -# Retrieve the 200 assets, ordered alphabetically: -curl "https://horizon-testnet.stellar.org/assets?limit=200" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.assets() - .call() - .then(function (result) { - console.log(result.records); - }) - .catch(function (err) { - console.log(err) - }) -``` - -## Response - -If called normally this endpoint responds with a [page](../resources/page.md) of assets. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "/assets?order=asc\u0026limit=10\u0026cursor=" - }, - "next": { - "href": "/assets?order=asc\u0026limit=10\u0026cursor=3" - }, - "prev": { - "href": "/assets?order=desc\u0026limit=10\u0026cursor=1" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "toml": { - "href": "https://www.stellar.org/.well-known/stellar.toml" - } - }, - "asset_type": "credit_alphanum12", - "asset_code": "BANANA", - "asset_issuer": "GDSBCQO34HWPGUGQSP3QBFEXVTSR2PW46UIGTHVWGWJGQKH3AFNHXHXN", - "paging_token": "BANANA_GDSBCQO34HWPGUGQSP3QBFEXVTSR2PW46UIGTHVWGWJGQKH3AFNHXHXN_credit_alphanum4", - "accounts": { - "authorized": 2126, - "authorized_to_maintain_liabilities": 32, - "unauthorized": 5, - "claimable_balances": 18 - }, - "balances": { - "authorized": "10000.0000000", - "authorized_to_maintain_liabilities": "3000.0000000", - "unauthorized": "4000.0000000", - "claimable_balances": "2380.0000000" - }, - "flags": { - "auth_required": true, - "auth_revocable": false - } - }, - { - "_links": { - "toml": { - "href": "https://www.stellar.org/.well-known/stellar.toml" - } - }, - "asset_type": "credit_alphanum4", - "asset_code": "BTC", - "asset_issuer": "GBAUUA74H4XOQYRSOW2RZUA4QL5PB37U3JS5NE3RTB2ELJVMIF5RLMAG", - "paging_token": "BTC_GBAUUA74H4XOQYRSOW2RZUA4QL5PB37U3JS5NE3RTB2ELJVMIF5RLMAG_credit_alphanum4", - "accounts": { - "authorized": 32, - "authorized_to_maintain_liabilities": 124, - "unauthorized": 6, - "claimable_balances": 18 - }, - "balances": { - "authorized": "5000.0000000", - "authorized_to_maintain_liabilities": "8000.0000000", - "unauthorized": "2000.0000000", - "claimable_balances": "1200.0000000" - }, - "flags": { - "auth_required": false, - "auth_revocable": false - } - }, - { - "_links": { - "toml": { - "href": "https://www.stellar.org/.well-known/stellar.toml" - } - }, - "asset_type": "credit_alphanum4", - "asset_code": "USD", - "asset_issuer": "GBAUUA74H4XOQYRSOW2RZUA4QL5PB37U3JS5NE3RTB2ELJVMIF5RLMAG", - "paging_token": "USD_GBAUUA74H4XOQYRSOW2RZUA4QL5PB37U3JS5NE3RTB2ELJVMIF5RLMAG_credit_alphanum4", - "accounts": { - "authorized": 91547871, - "authorized_to_maintain_liabilities": 45773935, - "unauthorized": 22886967, - "claimable_balances": 11443483 - }, - "balances": { - "authorized": "1000000000.0000000", - "authorized_to_maintain_liabilities": "500000000.0000000", - "unauthorized": "250000000.0000000", - "claimable_balances": "12500000.0000000" - }, - "flags": { - "auth_required": false, - "auth_revocable": false - } - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/data-for-account.md b/services/horizon/internal/docs/reference/endpoints/data-for-account.md deleted file mode 100644 index 98ff017623..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/data-for-account.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: Data for Account -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=data&endpoint=for_account -replacement: https://developers.stellar.org/api/resources/accounts/data/ ---- - -This endpoint represents a single [data](../resources/data.md) associated with a given [account](../resources/account.md). - -## Request - -``` -GET /accounts/{account}/data/{key} -``` - -### Arguments - -| name | notes | description | example | -| ------ | ------- | ----------- | ------- | -| `key`| required, string | Key name | `user-id`| - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/accounts/GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36/data/user-id" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.accounts() - .accountId("GAKLBGHNHFQ3BMUYG5KU4BEWO6EYQHZHAXEWC33W34PH2RBHZDSQBD75") - .call() - .then(function (account) { - return account.data({key: 'user-id'}) - }) - .then(function(dataValue) { - console.log(dataValue) - }) - .catch(function (err) { - console.log(err) - }) -``` - -## Response - -This endpoint responds with a value of the data field for the given account. See [data resource](../resources/data.md) for reference. - -### Example Response - -```json -{ - "value": "MTAw" -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no account whose ID matches the `account` argument or there is no data field with a given key. diff --git a/services/horizon/internal/docs/reference/endpoints/effects-all.md b/services/horizon/internal/docs/reference/endpoints/effects-all.md deleted file mode 100644 index 3150ed6fd7..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/effects-all.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: All Effects -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=effects&endpoint=all -replacement: https://developers.stellar.org/api/resources/effects/list/ ---- - -This endpoint represents all [effects](../resources/effect.md). - -This endpoint can also be used in [streaming](../streaming.md) mode so it is possible to use it to listen for new effects as transactions happen in the Stellar network. -If called in streaming mode Horizon will start at the earliest known effect unless a `cursor` is set. In that case it will start from the `cursor`. You can also set `cursor` value to `now` to only stream effects created since your request time. - -## Request - -``` -GET /effects{?cursor,limit,order} -``` - -## Arguments - -| name | notes | description | example | -| ------ | ------- | ----------- | ------- | -| `?cursor` | optional, default _null_ | A paging token, specifying where to start returning records from. When streaming this can be set to `now` to stream object created since your request time. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/effects" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.effects() - .call() - .then(function (effectResults) { - //page 1 - console.log(effectResults.records) - }) - .catch(function (err) { - console.log(err) - }) -``` - -### JavaScript Streaming Example - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var effectHandler = function (effectResponse) { - console.log(effectResponse); -}; - -var es = server.effects() - .cursor('now') - .stream({ - onmessage: effectHandler - }) -``` - -## Response - -The list of effects. - -### Example Response - -```json -{ - "_embedded": { - "records": [ - { - "_links": { - "operation": { - "href": "/operations/279172878337" - }, - "precedes": { - "href": "/effects?cursor=279172878337-1\u0026order=asc" - }, - "succeeds": { - "href": "/effects?cursor=279172878337-1\u0026order=desc" - } - }, - "account": "GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K", - "paging_token": "279172878337-1", - "starting_balance": "10000000.0", - "type_i": 0, - "type": "account_created" - }, - { - "_links": { - "operation": { - "href": "/operations/279172878337" - }, - "precedes": { - "href": "/effects?cursor=279172878337-2\u0026order=asc" - }, - "succeeds": { - "href": "/effects?cursor=279172878337-2\u0026order=desc" - } - }, - "account": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", - "amount": "10000000.0", - "asset_type": "native", - "paging_token": "279172878337-2", - "type_i": 3, - "type": "account_debited" - } - ] - }, - "_links": { - "next": { - "href": "/effects?order=asc\u0026limit=2\u0026cursor=279172878337-2" - }, - "prev": { - "href": "/effects?order=desc\u0026limit=2\u0026cursor=279172878337-1" - }, - "self": { - "href": "/effects?order=asc\u0026limit=2\u0026cursor=" - } - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there are no effects for the given account. diff --git a/services/horizon/internal/docs/reference/endpoints/effects-for-account.md b/services/horizon/internal/docs/reference/endpoints/effects-for-account.md deleted file mode 100644 index b60fbdacd8..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/effects-for-account.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: Effects for Account -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=effects&endpoint=for_account -replacement: https://developers.stellar.org/api/resources/accounts/effects/ ---- - -This endpoint represents all [effects](../resources/effect.md) that changed a given -[account](../resources/account.md). It will return relevant effects from the creation of the -account to the current ledger. - -This endpoint can also be used in [streaming](../streaming.md) mode so it is possible to use it to -listen for new effects as transactions happen in the Stellar network. -If called in streaming mode Horizon will start at the earliest known effect unless a `cursor` is -set. In that case it will start from the `cursor`. You can also set `cursor` value to `now` to only -stream effects created since your request time. - -## Request - -``` -GET /accounts/{account}/effects{?cursor,limit,order} -``` - -## Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `account` | required, string | Account ID | `GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36` | -| `?cursor` | optional, default _null_ | A paging token, specifying where to start returning records from. When streaming this can be set to `now` to stream object created since your request time. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/accounts/GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36/effects?limit=1" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.effects() - .forAccount("GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36") - .call() - .then(function (effectResults) { - // page 1 - console.log(effectResults.records) - }) - .catch(function (err) { - console.log(err) - }) -``` - -### JavaScript Streaming Example - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var effectHandler = function (effectResponse) { - console.log(effectResponse); -}; - -var es = server.effects() - .forAccount("GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36") - .cursor('now') - .stream({ - onmessage: effectHandler - }) -``` - -## Response - -The list of effects. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/accounts/GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36/effects?cursor=&limit=1&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/accounts/GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36/effects?cursor=1919197546291201-1&limit=1&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/accounts/GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36/effects?cursor=1919197546291201-1&limit=1&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=1919197546291201-1" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=1919197546291201-1" - } - }, - "id": "0001919197546291201-0000000001", - "paging_token": "1919197546291201-1", - "account": "GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36", - "type": "account_created", - "type_i": 0, - "created_at": "2019-03-25T22:43:38Z", - "starting_balance": "10000.0000000" - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there are no effects for the given account. diff --git a/services/horizon/internal/docs/reference/endpoints/effects-for-ledger.md b/services/horizon/internal/docs/reference/endpoints/effects-for-ledger.md deleted file mode 100644 index a40f49e1f2..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/effects-for-ledger.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: Effects for Ledger -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=effects&endpoint=for_ledger ---- - -Effects are the specific ways that the ledger was changed by any operation. - -This endpoint represents all [effects](../resources/effect.md) that occurred in the given [ledger](../resources/ledger.md). - -## Request - -``` -GET /ledgers/{sequence}/effects{?cursor,limit,order} -``` - -## Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `sequence` | required, number | Ledger Sequence Number | `680777` | -| `?cursor` | optional, default _null_ | A paging token, specifying where to start returning records from. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/ledgers/680777/effects?limit=1" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.effects() - .forLedger("680777") - .call() - .then(function (effectResults) { - //page 1 - console.log(effectResults.records) - }) - .catch(function (err) { - console.log(err) - }) - -``` - -## Response - -This endpoint responds with a list of effects that occurred in the ledger. See [effect resource](../resources/effect.md) for reference. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/ledgers/680777/effects?cursor=&limit=10&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/ledgers/680777/effects?cursor=2923914950873089-3&limit=10&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/ledgers/680777/effects?cursor=2923914950873089-1&limit=10&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/2923914950873089" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=2923914950873089-1" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=2923914950873089-1" - } - }, - "id": "0002923914950873089-0000000001", - "paging_token": "2923914950873089-1", - "account": "GC4ALQ3GTT5BTHTOULHCJGAT4P3MUSPLU4OEE74BAVIJ6K443O6RVLRT", - "type": "account_created", - "type_i": 0, - "created_at": "2019-04-08T20:47:22Z", - "starting_balance": "10000.0000000" - }, - { - "_links": { - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/2923914950873089" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=2923914950873089-2" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=2923914950873089-2" - } - }, - "id": "0002923914950873089-0000000002", - "paging_token": "2923914950873089-2", - "account": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "type": "account_debited", - "type_i": 3, - "created_at": "2019-04-08T20:47:22Z", - "asset_type": "native", - "amount": "10000.0000000" - }, - { - "_links": { - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/2923914950873089" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=2923914950873089-3" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=2923914950873089-3" - } - }, - "id": "0002923914950873089-0000000003", - "paging_token": "2923914950873089-3", - "account": "GC4ALQ3GTT5BTHTOULHCJGAT4P3MUSPLU4OEE74BAVIJ6K443O6RVLRT", - "type": "signer_created", - "type_i": 10, - "created_at": "2019-04-08T20:47:22Z", - "weight": 1, - "public_key": "GC4ALQ3GTT5BTHTOULHCJGAT4P3MUSPLU4OEE74BAVIJ6K443O6RVLRT", - "key": "" - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there are no effects for a given ledger. diff --git a/services/horizon/internal/docs/reference/endpoints/effects-for-operation.md b/services/horizon/internal/docs/reference/endpoints/effects-for-operation.md deleted file mode 100644 index dd6b880442..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/effects-for-operation.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: Effects for Operation -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=effects&endpoint=for_operation -replacement: https://developers.stellar.org/api/resources/operations/effects/ ---- - -This endpoint represents all [effects](../resources/effect.md) that occurred as a result of a given [operation](../resources/operation.md). - -## Request - -``` -GET /operations/{id}/effects{?cursor,limit,order} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `id` | required, number | An operation ID | `1919197546291201` | -| `?cursor` | optional, default _null_ | A paging token, specifying where to start returning records from. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/operations/1919197546291201/effects" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.effects() - .forOperation("1919197546291201") - .call() - .then(function (effectResults) { - // page 1 - console.log(effectResults.records) - }) - .catch(function (err) { - console.log(err) - }) - -``` - -## Response - -This endpoint responds with a list of effects on the ledger as a result of a given operation. See [effect resource](../resources/effect.md) for reference. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201/effects?cursor=&limit=10&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201/effects?cursor=1919197546291201-3&limit=10&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201/effects?cursor=1919197546291201-1&limit=10&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=1919197546291201-1" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=1919197546291201-1" - } - }, - "id": "0001919197546291201-0000000001", - "paging_token": "1919197546291201-1", - "account": "GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF", - "type": "account_created", - "type_i": 0, - "created_at": "2019-03-25T22:43:38Z", - "starting_balance": "10000.0000000" - }, - { - "_links": { - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=1919197546291201-2" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=1919197546291201-2" - } - }, - "id": "0001919197546291201-0000000002", - "paging_token": "1919197546291201-2", - "account": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "type": "account_debited", - "type_i": 3, - "created_at": "2019-03-25T22:43:38Z", - "asset_type": "native", - "amount": "10000.0000000" - }, - { - "_links": { - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=1919197546291201-3" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=1919197546291201-3" - } - }, - "id": "0001919197546291201-0000000003", - "paging_token": "1919197546291201-3", - "account": "GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF", - "type": "signer_created", - "type_i": 10, - "created_at": "2019-03-25T22:43:38Z", - "weight": 1, - "public_key": "GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF", - "key": "" - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` errors will be returned if there are no effects for operation whose ID matches the `id` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/effects-for-transaction.md b/services/horizon/internal/docs/reference/endpoints/effects-for-transaction.md deleted file mode 100644 index 8bdc302d1b..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/effects-for-transaction.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: Effects for Transaction -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=effects&endpoint=for_transaction -replacement: https://developers.stellar.org/api/resources/transactions/effects/ ---- - -This endpoint represents all [effects](../resources/effect.md) that occurred as a result of a given [transaction](../resources/transaction.md). - -## Request - -``` -GET /transactions/{hash}/effects{?cursor,limit,order} -``` - -## Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `hash` | required, string | A transaction hash, hex-encoded, lowercase. | `7e2050abc676003efc3eaadd623c927f753b7a6c37f50864bf284f4e1510d088` | -| `?cursor` | optional, default _null_ | A paging token, specifying where to start returning records from. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/transactions/7e2050abc676003efc3eaadd623c927f753b7a6c37f50864bf284f4e1510d088/effects?limit=1" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.effects() - .forTransaction("7e2050abc676003efc3eaadd623c927f753b7a6c37f50864bf284f4e1510d088") - .call() - .then(function (effectResults) { - //page 1 - console.log(effectResults.records) - }) - .catch(function (err) { - console.log(err) - }) - -``` - -## Response - -This endpoint responds with a list of effects on the ledger as a result of a given transaction. See [effect resource](../resources/effect.md) for reference. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/transactions/7e2050abc676003efc3eaadd623c927f753b7a6c37f50864bf284f4e1510d088/effects?cursor=&limit=10&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/transactions/7e2050abc676003efc3eaadd623c927f753b7a6c37f50864bf284f4e1510d088/effects?cursor=1919197546291201-3&limit=10&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/transactions/7e2050abc676003efc3eaadd623c927f753b7a6c37f50864bf284f4e1510d088/effects?cursor=1919197546291201-1&limit=10&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=1919197546291201-1" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=1919197546291201-1" - } - }, - "id": "0001919197546291201-0000000001", - "paging_token": "1919197546291201-1", - "account": "GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF", - "type": "account_created", - "type_i": 0, - "created_at": "2019-03-25T22:43:38Z", - "starting_balance": "10000.0000000" - }, - { - "_links": { - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=1919197546291201-2" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=1919197546291201-2" - } - }, - "id": "0001919197546291201-0000000002", - "paging_token": "1919197546291201-2", - "account": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "type": "account_debited", - "type_i": 3, - "created_at": "2019-03-25T22:43:38Z", - "asset_type": "native", - "amount": "10000.0000000" - }, - { - "_links": { - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=1919197546291201-3" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=1919197546291201-3" - } - }, - "id": "0001919197546291201-0000000003", - "paging_token": "1919197546291201-3", - "account": "GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF", - "type": "signer_created", - "type_i": 10, - "created_at": "2019-03-25T22:43:38Z", - "weight": 1, - "public_key": "GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF", - "key": "" - } - ] - } -} -``` - -## Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there are no effects for transaction whose hash matches the `hash` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/fee-stats.md b/services/horizon/internal/docs/reference/endpoints/fee-stats.md deleted file mode 100644 index 1f8be226fc..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/fee-stats.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: Fee Stats -clientData: - laboratoryUrl: -replacement: https://developers.stellar.org/api/aggregations/fee-stats/ ---- - -This endpoint gives useful information about per-operation fee stats in the last 5 ledgers. It can be used to -predict a fee set on the transaction that will be submitted to the network. - -## Request - -``` -GET /fee_stats -``` - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/fee_stats" -``` - -## Response - -Response contains the following fields: - -| Field | | -| - | - | -| last_ledger | Last ledger sequence number | -| last_ledger_base_fee | Base fee as defined in the last ledger | -| ledger_capacity_usage | Average capacity usage over the last 5 ledgers. (0 is no usage, 1.0 is completely full ledgers) | -| fee_charged | fee charged object | -| max_fee | max fee object | - -### Fee Charged Object - -Information about the fee charged for transactions in the last 5 ledgers. - -| Field | | -| - | - | -| min | Minimum fee charged over the last 5 ledgers. | -| mode | Mode fee charged over the last 5 ledgers. | -| p10 | 10th percentile fee charged over the last 5 ledgers. | -| p20 | 20th percentile fee charged over the last 5 ledgers. | -| p30 | 30th percentile fee charged over the last 5 ledgers. | -| p40 | 40th percentile fee charged over the last 5 ledgers. | -| p50 | 50th percentile fee charged over the last 5 ledgers. | -| p60 | 60th percentile fee charged over the last 5 ledgers. | -| p70 | 70th percentile fee charged over the last 5 ledgers. | -| p80 | 80th percentile fee charged over the last 5 ledgers. | -| p90 | 90th percentile fee charged over the last 5 ledgers. | -| p95 | 95th percentile fee charged over the last 5 ledgers. | -| p99 | 99th percentile fee charged over the last 5 ledgers. | - -Note: The difference between `fee_charged` and `max_fee` is that the former -represents the actual fee paid for the transaction while `max_fee` represents -the maximum bid the transaction creator was willing to pay for the transaction. - -### Max Fee Object - -Information about max fee bid for transactions over the last 5 ledgers. - -| Field | | -| - | - | -| min | Minimum (lowest) value of the maximum fee bid over the last 5 ledgers. | -| mode | Mode max fee over the last 5 ledgers. | -| p10 | 10th percentile max fee over the last 5 ledgers. | -| p20 | 20th percentile max fee over the last 5 ledgers. | -| p30 | 30th percentile max fee over the last 5 ledgers. | -| p40 | 40th percentile max fee over the last 5 ledgers. | -| p50 | 50th percentile max fee over the last 5 ledgers. | -| p60 | 60th percentile max fee over the last 5 ledgers. | -| p70 | 70th percentile max fee over the last 5 ledgers. | -| p80 | 80th percentile max fee over the last 5 ledgers. | -| p90 | 90th percentile max fee over the last 5 ledgers. | -| p95 | 95th percentile max fee over the last 5 ledgers. | -| p99 | 99th percentile max fee over the last 5 ledgers. | - - -### Example Response - -```json -{ - "last_ledger": "22606298", - "last_ledger_base_fee": "100", - "ledger_capacity_usage": "0.97", - "fee_charged": { - "max": "100", - "min": "100", - "mode": "100", - "p10": "100", - "p20": "100", - "p30": "100", - "p40": "100", - "p50": "100", - "p60": "100", - "p70": "100", - "p80": "100", - "p90": "100", - "p95": "100", - "p99": "100" - }, - "max_fee": { - "max": "100000", - "min": "100", - "mode": "100", - "p10": "100", - "p20": "100", - "p30": "100", - "p40": "100", - "p50": "100", - "p60": "100", - "p70": "100", - "p80": "100", - "p90": "15000", - "p95": "100000", - "p99": "100000" - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/ledgers-all.md b/services/horizon/internal/docs/reference/endpoints/ledgers-all.md deleted file mode 100644 index 242c0df697..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/ledgers-all.md +++ /dev/null @@ -1,205 +0,0 @@ ---- -title: All Ledgers -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=ledgers&endpoint=all -replacement: https://developers.stellar.org/api/resources/ledgers/ ---- - -This endpoint represents all [ledgers](../resources/ledger.md). -This endpoint can also be used in [streaming](../streaming.md) mode so it is possible to use it to get notifications as ledgers are closed by the Stellar network. -If called in streaming mode Horizon will start at the earliest known ledger unless a `cursor` is set. In that case it will start from the `cursor`. You can also set `cursor` value to `now` to only stream ledgers created since your request time. - -## Request - -``` -GET /ledgers{?cursor,limit,order} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `?cursor` | optional, any, default _null_ | A paging token, specifying where to start returning records from. When streaming this can be set to `now` to stream object created since your request time. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -# Retrieve the 200 latest ledgers, ordered chronologically -curl "https://horizon-testnet.stellar.org/ledgers?limit=200&order=desc" -``` - -### JavaScript Example Request - -```javascript -server.ledgers() - .call() - .then(function (ledgerResult) { - // page 1 - console.log(ledgerResult.records) - return ledgerResult.next() - }) - .then(function (ledgerResult) { - // page 2 - console.log(ledgerResult.records) - }) - .catch(function(err) { - console.log(err) - }) -``` - - -### JavaScript Streaming Example - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var ledgerHandler = function (ledgerResponse) { - console.log(ledgerResponse); -}; - -var es = server.ledgers() - .cursor('now') - .stream({ - onmessage: ledgerHandler -}) -``` - -## Response - -This endpoint responds with a list of ledgers. See [ledger resource](../resources/ledger.md) for reference. - -### Example Response - -```json -{ - "_embedded": { - "records": [ - { - "_links": { - "effects": { - "href": "/ledgers/1/effects/{?cursor,limit,order}", - "templated": true - }, - "operations": { - "href": "/ledgers/1/operations/{?cursor,limit,order}", - "templated": true - }, - "self": { - "href": "/ledgers/1" - }, - "transactions": { - "href": "/ledgers/1/transactions/{?cursor,limit,order}", - "templated": true - } - }, - "id": "e8e10918f9c000c73119abe54cf089f59f9015cc93c49ccf00b5e8b9afb6e6b1", - "paging_token": "4294967296", - "hash": "e8e10918f9c000c73119abe54cf089f59f9015cc93c49ccf00b5e8b9afb6e6b1", - "sequence": 1, - "transaction_count": 0, - "successful_transaction_count": 0, - "failed_transaction_count": 0, - "operation_count": 0, - "tx_set_operation_count": 0, - "closed_at": "1970-01-01T00:00:00Z", - "total_coins": "100000000000.0000000", - "fee_pool": "0.0000000", - "base_fee_in_stroops": 100, - "base_reserve_in_stroops": 100000000, - "max_tx_set_size": 50 - }, - { - "_links": { - "effects": { - "href": "/ledgers/2/effects/{?cursor,limit,order}", - "templated": true - }, - "operations": { - "href": "/ledgers/2/operations/{?cursor,limit,order}", - "templated": true - }, - "self": { - "href": "/ledgers/2" - }, - "transactions": { - "href": "/ledgers/2/transactions/{?cursor,limit,order}", - "templated": true - } - }, - "id": "e12e5809ab8c59d8256e691cb48a024dd43960bc15902d9661cd627962b2bc71", - "paging_token": "8589934592", - "hash": "e12e5809ab8c59d8256e691cb48a024dd43960bc15902d9661cd627962b2bc71", - "prev_hash": "e8e10918f9c000c73119abe54cf089f59f9015cc93c49ccf00b5e8b9afb6e6b1", - "sequence": 2, - "transaction_count": 0, - "successful_transaction_count": 0, - "failed_transaction_count": 0, - "operation_count": 0, - "closed_at": "2015-07-16T23:49:00Z", - "total_coins": "100000000000.0000000", - "fee_pool": "0.0000000", - "base_fee_in_stroops": 100, - "base_reserve_in_stroops": 100000000, - "max_tx_set_size": 100 - } - ] - }, - "_links": { - "next": { - "href": "/ledgers?order=asc&limit=2&cursor=8589934592" - }, - "prev": { - "href": "/ledgers?order=desc&limit=2&cursor=4294967296" - }, - "self": { - "href": "/ledgers?order=asc&limit=2&cursor=" - } - } -} -``` - -### Example Streaming Event - -```json -{ - "_links": { - "effects": { - "href": "/ledgers/69859/effects/{?cursor,limit,order}", - "templated": true - }, - "operations": { - "href": "/ledgers/69859/operations/{?cursor,limit,order}", - "templated": true - }, - "self": { - "href": "/ledgers/69859" - }, - "transactions": { - "href": "/ledgers/69859/transactions/{?cursor,limit,order}", - "templated": true - } - }, - "id": "4db1e4f145e9ee75162040d26284795e0697e2e84084624e7c6c723ebbf80118", - "paging_token": "300042120331264", - "hash": "4db1e4f145e9ee75162040d26284795e0697e2e84084624e7c6c723ebbf80118", - "prev_hash": "4b0b8bace3b2438b2404776ce57643966855487ba6384724a3c664c7aa4cd9e4", - "sequence": 69859, - "transaction_count": 0, - "successful_transaction_count": 0, - "failed_transaction_count": 0, - "operation_count": 0, - "closed_at": "2015-07-20T15:51:52Z", - "total_coins": "100000000000.0000000", - "fee_pool": "0.0025600", - "base_fee_in_stroops": 100, - "base_reserve_in_stroops": "100000000", - "max_tx_set_size": 50 -} -``` - -## Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/ledgers-single.md b/services/horizon/internal/docs/reference/endpoints/ledgers-single.md deleted file mode 100644 index f16c9485d8..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/ledgers-single.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Ledger Details -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=ledgers&endpoint=single -replacement: https://developers.stellar.org/api/resources/ledgers/single/ ---- - -The ledger details endpoint provides information on a single [ledger](../resources/ledger.md). - -## Request - -``` -GET /ledgers/{sequence} -``` - -### Arguments - -| name | notes | description | example | -| ------ | ------- | ----------- | ------- | -| `sequence` | required, number | Ledger Sequence | `69859` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/ledgers/69859" -``` - -### JavaScript Example Request - -```js -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.ledgers() - .ledger('69858') - .call() - .then(function(ledgerResult) { - console.log(ledgerResult) - }) - .catch(function(err) { - console.log(err) - }) - -``` -## Response - -This endpoint responds with a single Ledger. See [ledger resource](../resources/ledger.md) for reference. - -### Example Response - -```json -{ - "_links": { - "effects": { - "href": "/ledgers/69859/effects/{?cursor,limit,order}", - "templated": true - }, - "operations": { - "href": "/ledgers/69859/operations/{?cursor,limit,order}", - "templated": true - }, - "self": { - "href": "/ledgers/69859" - }, - "transactions": { - "href": "/ledgers/69859/transactions/{?cursor,limit,order}", - "templated": true - } - }, - "id": "4db1e4f145e9ee75162040d26284795e0697e2e84084624e7c6c723ebbf80118", - "paging_token": "300042120331264", - "hash": "4db1e4f145e9ee75162040d26284795e0697e2e84084624e7c6c723ebbf80118", - "prev_hash": "4b0b8bace3b2438b2404776ce57643966855487ba6384724a3c664c7aa4cd9e4", - "sequence": 69859, - "transaction_count": 0, - "successful_transaction_count": 0, - "failed_transaction_count": 0, - "operation_count": 0, - "tx_set_operation_count": 0, - "closed_at": "2015-07-20T15:51:52Z", - "total_coins": "100000000000.0000000", - "fee_pool": "0.0025600", - "base_fee_in_stroops": 100, - "base_reserve_in_stroops": 100000000, - "max_tx_set_size": 50 -} -``` - -## Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no ledger whose sequence number matches the `sequence` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/metrics.md b/services/horizon/internal/docs/reference/endpoints/metrics.md deleted file mode 100644 index c0d1fba62b..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/metrics.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: Metrics ---- - -The metrics endpoint returns a host of [Prometheus](https://prometheus.io/) metrics for monitoring the health of the underlying Horizon process. - -There is an [official Grafana Dashboard](https://grafana.com/grafana/dashboards/13793) to easily visualize those metrics. - -Since Horizon 1.0.0 this endpoint is not part of the public API. It's available in the internal server (listening on the internal port set via `ADMIN_PORT` env variable or `--admin-port` CLI param). - -## Request - -``` -GET /metrics -``` - -### curl Example Request - -Assuming a local Horizon instance is running with an admin port of 9090 (i.e. `ADMIN_PORT=9090` env variable or `--admin-port=9090`) - -```sh -curl "https://localhost:9090/metrics" -``` - - -## Response - -The `/metrics` endpoint returns a [Prometheus text-formated](https://prometheus.io/docs/instrumenting/exposition_formats/#text-based-format) response. It is meant to be scraped by Prometheus. - -Below, each section of related data points are grouped together and annotated (***note**: this endpoint returns ALL this data in one response*). - - -#### Goroutines - -Horizon utilizes Go's built in concurrency primitives ([goroutines](https://gobyexample.com/goroutines) and [channels](https://gobyexample.com/channels)). The `goroutine` metric monitors the number of currently running goroutines on this Horizon's process. - - -#### History - -Horizon maintains its own database (postgres), a verbose and user friendly account of activity on the Stellar network. - -| Metric | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------------------------------ | -| history.elder_ledger | The sequence number of the oldest ledger recorded in Horizon's database. | -| history.latest_ledger | The sequence number of the youngest (most recent) ledger recorded in Horizon's database. | -| history.open_connections | The number of open connections to the Horizon database. | - - -#### Ingester - -Ingester represents metrics specific to Horizon's [ingestion](https://github.com/stellar/go/blob/master/services/horizon/internal/docs/reference/admin.md#ingesting-stellar-core-data) process, or the process by which Horizon consumes transaction results from a connected Stellar Core instance. - -| Metric | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------------------------------ | -| ingester.clear_ledger | The count and rate of clearing (per ledger) for this Horizon process. | -| ingester.ingest_ledger | The count and rate of ingestion (per ledger) for this Horizon process. | - -These metrics contain useful [sub metrics](#sub-metrics). - - -#### Logging - -Horizon utilizes the standard `debug`, `error`, etc. levels of logging. This metric outputs stats for each level of log message produced, useful for a high-level monitoring of "is my Horizon instance functioning properly?" In order of increasing severity: - -* logging.debug -* logging.info -* logging.warning -* logging.error -* logging.panic - -These metrics contain useful [sub metrics](#sub-metrics). - -#### Requests - -Requests represent an overview of Horizon's incoming traffic. - -These metrics contain useful [sub metrics](#sub-metrics). - -| Metric | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------------------------------ | -| requests.failed | Failed requests are those that return a status code in [400, 600). | -| requests.succeeded | Successful requests are those that return a status code in [200, 400). | -| requests.total | Total number of received requests. | - -#### Stellar Core -As noted above, Horizon relies on Stellar Core to stay in sync with the Stellar network. These metrics are specific to the underlying Stellar Core instance. - -| Metric | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------------------------------ | -| stellar_core.latest_ledger | The sequence number of the latest (most recent) ledger recorded in Stellar Core's database. | -| stellar_core.open_connections | The number of open connections to the Stellar Core postgres database. | - -#### Transaction Submission - -Horizon does not submit transactions directly to the Stellar network. Instead, it sequences transactions and sends the base64 encoded, XDR serialized blob to its connected Stellar Core instance. - -##### Horizon Transaction Sequencing and Submission - -The following is a simplified version of the transaction submission process that glosses over the finer details. To dive deeper, check out the [source code](https://github.com/stellar/go/tree/master/services/horizon/internal/txsub). - -Horizon's sequencing mechanism consists of a [manager](https://github.com/stellar/go/blob/master/services/horizon/internal/txsub/sequence/manager.go) that keeps track of [submission queues](https://github.com/stellar/go/blob/master/services/horizon/internal/txsub/sequence/queue.go) for a set of addresses. A submission queue is a priority queue, prioritized by minimum transaction sequence number, that holds a set of pending transactions for an account. A pending transaction is represented as an object with a sequence number and a channel. Periodically, this queue is updated, popping off finished transactions, sending down the transaction's channel a successful/failure response. - -These metrics contain useful [sub metrics](#sub-metrics). - - -| Metric | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------------------------------ | -| txsub.buffered | The count of submissions buffered behind this Horizon's submission queue. | -| txsub.failed | The rate of failed transactions that have been submitted to this Horizon. | -| txsub.open | The count of "open" submissions (i.e.) submissions whose transactions haven't been confirmed successful or failed. | -| txsub.succeeded | The rate of successful transactions that have been submitted to this Horizon. | -| txsub.total | Both the rate and count of all transactions submitted to this Horizon. | - -### Sub Metrics -Various sub metrics related to a certain metric's performance. - -| Metric | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------------------------------ | -| `1m.rate`, `5min.rate`, `etc.` | The per-minute moving average rate of events per second at the given time interval. | -| `75%`, `95%`, `etc.` | Counts at different percentiles. | -| `count` | Sum total of a certain metric value. | -| `max`, `mean`, `etc.` | Common statistic calculations. | - - - - diff --git a/services/horizon/internal/docs/reference/endpoints/offer-details.md b/services/horizon/internal/docs/reference/endpoints/offer-details.md deleted file mode 100644 index 978d88f5f4..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/offer-details.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Offer Details -replacement: https://developers.stellar.org/api/resources/offers/ ---- - -Returns information and links relating to a single [offer](../resources/offer.md). - -## Request - -``` -GET /offers/{offer} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `offer` | required, string | Offer ID | `126628073` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/offers/1347876" -``` - - - -## Response - -This endpoint responds with the details of a single offer for a given ID. See [offer resource](../resources/offer.md) for reference. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/offers/1347876" - }, - "offer_maker": { - "href": "https://horizon-testnet.stellar.org/accounts/GAQHWQYBBW272OOXNQMMLCA5WY2XAZPODGB7Q3S5OKKIXVESKO55ZQ7C" - } - }, - "id": "1347876", - "paging_token": "1347876", - "seller": "GAQHWQYBBW272OOXNQMMLCA5WY2XAZPODGB7Q3S5OKKIXVESKO55ZQ7C", - "selling": { - "asset_type": "credit_alphanum4", - "asset_code": "DSQ", - "asset_issuer": "GBDQPTQJDATT7Z7EO4COS4IMYXH44RDLLI6N6WIL5BZABGMUOVMLWMQF" - }, - "buying": { - "asset_type": "credit_alphanum4", - "asset_code": "USD", - "asset_issuer": "GAA4MFNZGUPJAVLWWG6G5XZJFZDHLKQNG3Q6KB24BAD6JHNNVXDCF4XG" - }, - "amount": "60.4544008", - "price_r": { - "n": 84293, - "d": 2000000 - }, - "price": "0.0421465", - "last_modified_ledger": 1429506, - "last_modified_time": "2019-10-29T22:08:23Z" -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no offer whose ID matches the `offer` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/offers-for-account.md b/services/horizon/internal/docs/reference/endpoints/offers-for-account.md deleted file mode 100644 index 906e302b6a..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/offers-for-account.md +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: Offers for Account -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=offers&endpoint=for_account -replacement: https://developers.stellar.org/api/resources/accounts/offers/ ---- - -People on the Stellar network can make [offers](../resources/offer.md) to buy or sell assets. This -endpoint represents all the offers a particular account makes. - -This endpoint can also be used in [streaming](../streaming.md) mode so it is possible to use it to -listen as offers are processed in the Stellar network. If called in streaming mode Horizon will -start at the earliest known offer unless a `cursor` is set. In that case it will start from the -`cursor`. You can also set `cursor` value to `now` to only stream offers created since your request -time. - -## Request - -``` -GET /accounts/{account}/offers{?cursor,limit,order} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `account` | required, string | Account ID | `GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF` | -| `?cursor` | optional, any, default _null_ | A paging token, specifying where to start returning records from. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/accounts/GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF/offers" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.offers('accounts', 'GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF') - .call() - .then(function (offerResult) { - console.log(offerResult); - }) - .catch(function (err) { - console.error(err); - }) -``` - -### JavaScript Streaming Example - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var offerHandler = function (offerResponse) { - console.log(offerResponse); -}; - -var es = server.offers('accounts', 'GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF') - .cursor('now') - .stream({ - onmessage: offerHandler - }) -``` - -## Response - -The list of offers. - -**Note:** a response of 200 with an empty records array may either mean there are no offers for -`account_id` or `account_id` does not exist. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/accounts/GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF/offers?cursor=&limit=10&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/accounts/GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF/offers?cursor=5443256&limit=10&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/accounts/GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF/offers?cursor=5443256&limit=10&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/offers/5443256" - }, - "offer_maker": { - "href": "https://horizon-testnet.stellar.org/accounts/GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF" - } - }, - "id": "5443256", - "paging_token": "5443256", - "seller": "GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF", - "selling": { - "asset_type": "native" - }, - "buying": { - "asset_type": "credit_alphanum4", - "asset_code": "FOO", - "asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR" - }, - "amount": "10.0000000", - "price_r": { - "n": 1, - "d": 1 - }, - "price": "1.0000000", - "last_modified_ledger": 694974, - "last_modified_time": "2019-04-09T17:14:22Z" - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/offers.md b/services/horizon/internal/docs/reference/endpoints/offers.md deleted file mode 100644 index 6f8273487e..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/offers.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: Offers -replacement: https://developers.stellar.org/api/resources/offers/list/ ---- - -People on the Stellar network can make [offers](../resources/offer.md) to buy or sell assets. This -endpoint represents all the current offers, allowing filtering by `seller`, `selling_asset` or `buying_asset`. - -## Request - -``` -GET /offers{?selling_asset_type,selling_asset_issuer,selling_asset_code,buying_asset_type,buying_asset_issuer,buying_asset_code,seller,cursor,limit,order} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `?seller` | optional, string | Account ID of the offer creator | `GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36` | -| `?selling` | optional, string | Asset being sold | `native` or `EUR:GD6VWBXI6NY3AOOR55RLVQ4MNIDSXE5JSAVXUTF35FRRI72LYPI3WL6Z` | -| `?buying` | optional, string | Asset being bought | `native` or `USD:GD6VWBXI6NY3AOOR55RLVQ4MNIDSXE5JSAVXUTF35FRRI72LYPI3WL6Z` | -| `?cursor` | optional, any, default _null_ | A paging token, specifying where to start returning records from. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/offers{?selling_asset_type,selling_asset_issuer,selling_asset_code,buying_asset_type,buying_asset_issuer,buying_asset_code,seller,cursor,limit,order}" -``` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## Response - -The list of offers. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/offers?cursor=&limit=10&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/offers?cursor=5443256&limit=10&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/offers?cursor=5443256&limit=10&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/offers/5443256" - }, - "offer_maker": { - "href": "https://horizon-testnet.stellar.org/" - } - }, - "id": "5443256", - "paging_token": "5443256", - "seller": "GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF", - "selling": { - "asset_type": "native" - }, - "buying": { - "asset_type": "credit_alphanum4", - "asset_code": "FOO", - "asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR" - }, - "amount": "10.0000000", - "price_r": { - "n": 1, - "d": 1 - }, - "price": "1.0000000", - "last_modified_ledger": 694974, - "last_modified_time": "2019-04-09T17:14:22Z" - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/operations-all.md b/services/horizon/internal/docs/reference/endpoints/operations-all.md deleted file mode 100644 index c44f9f4fc6..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/operations-all.md +++ /dev/null @@ -1,192 +0,0 @@ ---- -title: All Operations -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=operations&endpoint=all -replacement: https://developers.stellar.org/api/resources/operations/ ---- - -This endpoint represents [operations](../resources/operation.md) that are part of successfully validated [transactions](../resources/transaction.md). -Please note that this endpoint returns operations that are part of failed transactions if `include_failed` parameter is `true` -and Horizon is ingesting failed transactions. -This endpoint can also be used in [streaming](../streaming.md) mode so it is possible to use it to listen as operations are processed in the Stellar network. -If called in streaming mode Horizon will start at the earliest known operation unless a `cursor` is set. In that case it will start from the `cursor`. You can also set `cursor` value to `now` to only stream operations created since your request time. - -## Request - -``` -GET /operations{?cursor,limit,order,include_failed} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `?cursor` | optional, any, default _null_ | A paging token, specifying where to start returning records from. When streaming this can be set to `now` to stream object created since your request time. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | -| `?include_failed` | optional, bool, default: `false` | Set to `true` to include operations of failed transactions in results. | `true` | -| `?join` | optional, string, default: _null_ | Set to `transactions` to include the transactions which created each of the operations in the response. | `transactions` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/operations?limit=200&order=desc" -``` - -### JavaScript Example Request - -```js -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.operations() - .call() - .then(function (operationsResult) { - //page 1 - console.log(operationsResult.records) - return operationsResult.next() - }) - .then(function (operationsResult) { - //page 2 - console.log(operationsResult.records) - }) - .catch(function (err) { - console.log(err) - }) -``` - -### JavaScript Streaming Example - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var operationHandler = function (operationResponse) { - console.log(operationResponse); -}; - -var es = server.operations() - .cursor('now') - .stream({ - onmessage: operationHandler - }) -``` - -## Response - -This endpoint responds with a list of operations. See [operation resource](../resources/operation.md) for reference. - -### Example Response - -```json -{ - "_embedded": { - "records": [ - { - "_links": { - "effects": { - "href": "/operations/77309415424/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=77309415424&order=asc" - }, - "self": { - "href": "/operations/77309415424" - }, - "succeeds": { - "href": "/operations?cursor=77309415424&order=desc" - }, - "transactions": { - "href": "/transactions/77309415424" - } - }, - "account": "GBIA4FH6TV64KSPDAJCNUQSM7PFL4ILGUVJDPCLUOPJ7ONMKBBVUQHRO", - "funder": "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ", - "id": 77309415424, - "paging_token": "77309415424", - "starting_balance": "1000.0000000", - "transaction_successful": true, - "type_i": 0, - "type": "create_account" - }, - { - "_links": { - "effects": { - "href": "/operations/463856472064/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=463856472064&order=asc" - }, - "self": { - "href": "/operations/463856472064" - }, - "succeeds": { - "href": "/operations?cursor=463856472064&order=desc" - }, - "transactions": { - "href": "/transactions/463856472064" - } - }, - "account": "GC2ADYAIPKYQRGGUFYBV2ODJ54PY6VZUPKNCWWNX2C7FCJYKU4ZZNKVL", - "funder": "GBIA4FH6TV64KSPDAJCNUQSM7PFL4ILGUVJDPCLUOPJ7ONMKBBVUQHRO", - "id": 463856472064, - "paging_token": "463856472064", - "starting_balance": "1000.0000000", - "transaction_successful": true, - "type_i": 0, - "type": "create_account" - } - ] - }, - "_links": { - "next": { - "href": "/operations?order=asc&limit=2&cursor=463856472064" - }, - "prev": { - "href": "/operations?order=desc&limit=2&cursor=77309415424" - }, - "self": { - "href": "/operations?order=asc&limit=2&cursor=" - } - } -} -``` - -### Example Streaming Event - -```json -{ - "_links": { - "effects": { - "href": "/operations/77309415424/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=77309415424&order=asc" - }, - "self": { - "href": "/operations/77309415424" - }, - "succeeds": { - "href": "/operations?cursor=77309415424&order=desc" - }, - "transactions": { - "href": "/transactions/77309415424" - } - }, - "account": "GBIA4FH6TV64KSPDAJCNUQSM7PFL4ILGUVJDPCLUOPJ7ONMKBBVUQHRO", - "funder": "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ", - "id": 77309415424, - "paging_token": "77309415424", - "starting_balance": "1000.0000000", - "transaction_successful": true, - "type_i": 0, - "type": "create_account" -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/operations-for-account.md b/services/horizon/internal/docs/reference/endpoints/operations-for-account.md deleted file mode 100644 index 0b44988134..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/operations-for-account.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: Operations for Account -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=operations&endpoint=for_account -replacement: https://developers.stellar.org/api/resources/accounts/offers/ ---- - -This endpoint represents successful [operations](../resources/operation.md) that were included in valid [transactions](../resources/transaction.md) that affected a particular [account](../resources/account.md). - -This endpoint can also be used in [streaming](../streaming.md) mode so it is possible to use it to listen for new operations that affect a given account as they happen. -If called in streaming mode Horizon will start at the earliest known operation unless a `cursor` is set. In that case it will start from the `cursor`. You can also set `cursor` value to `now` to only stream operations created since your request time. - -## Request - -``` -GET /accounts/{account}/operations{?cursor,limit,order,include_failed} -``` - -### Arguments - -| name | notes | description | example | -| ------ | ------- | ----------- | ------- | -| `account`| required, string | Account ID | `GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36`| -| `?cursor`| optional, default _null_ | A paging token, specifying where to start returning records from. When streaming this can be set to `now` to stream object created since your request time. | `12884905984` | -| `?order` | optional, string, default `asc`| The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` -| `?include_failed` | optional, bool, default: `false` | Set to `true` to include operations of failed transactions in results. | `true` | | -| `?join` | optional, string, default: _null_ | Set to `transactions` to include the transactions which created each of the operations in the response. | `transactions` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/accounts/GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36/operations" -``` - -### JavaScript Example Request - -```js -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.operations() - .forAccount("GAKLBGHNHFQ3BMUYG5KU4BEWO6EYQHZHAXEWC33W34PH2RBHZDSQBD75") - .call() - .then(function (operationsResult) { - console.log(operationsResult.records) - }) - .catch(function (err) { - console.log(err) - }) -``` - -### JavaScript Streaming Example - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var operationHandler = function (operationResponse) { - console.log(operationResponse); -}; - -var es = server.operations() - .forAccount("GAKLBGHNHFQ3BMUYG5KU4BEWO6EYQHZHAXEWC33W34PH2RBHZDSQBD75") - .cursor('now') - .stream({ - onmessage: operationHandler - }) -``` - -## Response - -This endpoint responds with a list of operations that affected the given account. See [operation resource](../resources/operation.md) for reference. - -### Example Response - -```json -{ - "_embedded": { - "records": [ - { - "_links": { - "effects": { - "href": "/operations/46316927324160/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=46316927324160&order=asc" - }, - "self": { - "href": "/operations/46316927324160" - }, - "succeeds": { - "href": "/operations?cursor=46316927324160&order=desc" - }, - "transactions": { - "href": "/transactions/46316927324160" - } - }, - "account": "GBBM6BKZPEHWYO3E3YKREDPQXMS4VK35YLNU7NFBRI26RAN7GI5POFBB", - "funder": "GBIA4FH6TV64KSPDAJCNUQSM7PFL4ILGUVJDPCLUOPJ7ONMKBBVUQHRO", - "id": 46316927324160, - "paging_token": "46316927324160", - "starting_balance": 1e+09, - "transaction_successful": true, - "type_i": 0, - "type": "create_account" - } - ] - }, - "_links": { - "next": { - "href": "/accounts/GBBM6BKZPEHWYO3E3YKREDPQXMS4VK35YLNU7NFBRI26RAN7GI5POFBB/operations?order=asc&limit=10&cursor=46316927324160" - }, - "prev": { - "href": "/accounts/GBBM6BKZPEHWYO3E3YKREDPQXMS4VK35YLNU7NFBRI26RAN7GI5POFBB/operations?order=desc&limit=10&cursor=46316927324160" - }, - "self": { - "href": "/accounts/GBBM6BKZPEHWYO3E3YKREDPQXMS4VK35YLNU7NFBRI26RAN7GI5POFBB/operations?order=asc&limit=10&cursor=" - } - } -} -``` - -### Example Streaming Event - -```json -{ - "_links": { - "effects": { - "href": "/operations/77309415424/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=77309415424&order=asc" - }, - "self": { - "href": "/operations/77309415424" - }, - "succeeds": { - "href": "/operations?cursor=77309415424&order=desc" - }, - "transactions": { - "href": "/transactions/77309415424" - } - }, - "account": "GBIA4FH6TV64KSPDAJCNUQSM7PFL4ILGUVJDPCLUOPJ7ONMKBBVUQHRO", - "funder": "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ", - "id": 77309415424, - "paging_token": "77309415424", - "starting_balance": "1000.0000000", - "transaction_successful": true, - "type_i": 0, - "type": "create_account" -} -``` - - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no account whose ID matches the `account` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/operations-for-ledger.md b/services/horizon/internal/docs/reference/endpoints/operations-for-ledger.md deleted file mode 100644 index 85155a5726..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/operations-for-ledger.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -title: Operations for Ledger -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=operations&endpoint=for_ledger -replacement: https://developers.stellar.org/api/resources/ledgers/operations/ ---- - -This endpoint returns successful [operations](../resources/operation.md) that occurred in a given [ledger](../resources/ledger.md). - -## Request - -``` -GET /ledgers/{sequence}/operations{?cursor,limit,order,include_failed} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `sequence` | required, number | Ledger Sequence | `681637` | -| `?cursor` | optional, default _null_ | A paging token, specifying where to start returning records from. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` | -| `?include_failed` | optional, bool, default: `false` | Set to `true` to include operations of failed transactions in results. | `true` | -| `?join` | optional, string, default: _null_ | Set to `transactions` to include the transactions which created each of the operations in the response. | `transactions` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/ledgers/681637/operations?limit=1" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.operations() - .forLedger("681637") - .call() - .then(function (operationsResult) { - console.log(operationsResult.records); - }) - .catch(function (err) { - console.log(err) - }) -``` - -## Response - -This endpoint responds with a list of operations in a given ledger. See [operation resource](../resources/operation.md) for reference. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/ledgers/681637/operations?cursor=&limit=10&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/ledgers/681637/operations?cursor=2927608622751745&limit=10&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/ledgers/681637/operations?cursor=2927608622747649&limit=10&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/operations/2927608622747649" - }, - "transaction": { - "href": "https://horizon-testnet.stellar.org/transactions/4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a" - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/operations/2927608622747649/effects" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=2927608622747649" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=2927608622747649" - } - }, - "id": "2927608622747649", - "paging_token": "2927608622747649", - "transaction_successful": true, - "source_account": "GCGXZPH2QNKJP4GI2J77EFQQUMP3NYY4PCUZ4UPKHR2XYBKRUYKQ2DS6", - "type": "payment", - "type_i": 1, - "created_at": "2019-04-08T21:59:27Z", - "transaction_hash": "4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a", - "asset_type": "native", - "from": "GCGXZPH2QNKJP4GI2J77EFQQUMP3NYY4PCUZ4UPKHR2XYBKRUYKQ2DS6", - "to": "GDGEQS64ISS6Y2KDM5V67B6LXALJX4E7VE4MIA54NANSUX5MKGKBZM5G", - "amount": "404.0000000" - }, - { - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/operations/2927608622751745" - }, - "transaction": { - "href": "https://horizon-testnet.stellar.org/transactions/fdabcee816bd439dd1d20bcb0abab5aa939c15cca5fccc1db060ba6096a5e0ed" - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/operations/2927608622751745/effects" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=2927608622751745" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=2927608622751745" - } - }, - "id": "2927608622751745", - "paging_token": "2927608622751745", - "transaction_successful": true, - "source_account": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "type": "create_account", - "type_i": 0, - "created_at": "2019-04-08T21:59:27Z", - "transaction_hash": "fdabcee816bd439dd1d20bcb0abab5aa939c15cca5fccc1db060ba6096a5e0ed", - "starting_balance": "10000.0000000", - "funder": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "account": "GCD5UL3DHC5TQRQVJKFTM66CLFTHGULOQ2HEAXNSA2JWUGBCT36BP55F" - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no ledger whose ID matches the `id` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/operations-for-transaction.md b/services/horizon/internal/docs/reference/endpoints/operations-for-transaction.md deleted file mode 100644 index 14ef13f850..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/operations-for-transaction.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Operations for Transaction -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=operations&endpoint=for_transaction -replacement: https://developers.stellar.org/api/resources/transactions/operations/ ---- - -This endpoint represents successful [operations](../resources/operation.md) that are part of a given [transaction](../resources/transaction.md). - -### Warning - failed transactions - -The "Operations for Transaction" endpoint returns a list of operations in a successful or failed -transaction. Make sure to always check the operation status in this endpoint using -`transaction_successful` field! - -## Request - -``` -GET /transactions/{hash}/operations{?cursor,limit,order} -``` - -## Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `hash` | required, string | A transaction hash, hex-encoded, lowercase. | `4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a` | -| `?cursor` | optional, default _null_ | A paging token, specifying where to start returning records from. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` | -| `?join` | optional, string, default: _null_ | Set to `transactions` to include the transactions which created each of the operations in the response. | `transactions` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/transactions/4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a/operations?limit=1" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.operations() - .forTransaction("4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a") - .call() - .then(function (operationsResult) { - console.log(operationsResult.records); - }) - .catch(function (err) { - console.log(err) - }) -``` - -## Response - -This endpoint responds with a list of operations that are part of a given transaction. See [operation resource](../resources/operation.md) for reference. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/transactions/4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a/operations?cursor=&limit=10&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/transactions/4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a/operations?cursor=2927608622747649&limit=10&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/transactions/4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a/operations?cursor=2927608622747649&limit=10&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/operations/2927608622747649" - }, - "transaction": { - "href": "https://horizon-testnet.stellar.org/transactions/4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a" - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/operations/2927608622747649/effects" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=2927608622747649" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=2927608622747649" - } - }, - "id": "2927608622747649", - "paging_token": "2927608622747649", - "transaction_successful": true, - "source_account": "GCGXZPH2QNKJP4GI2J77EFQQUMP3NYY4PCUZ4UPKHR2XYBKRUYKQ2DS6", - "type": "payment", - "type_i": 1, - "created_at": "2019-04-08T21:59:27Z", - "transaction_hash": "4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a", - "asset_type": "native", - "from": "GCGXZPH2QNKJP4GI2J77EFQQUMP3NYY4PCUZ4UPKHR2XYBKRUYKQ2DS6", - "to": "GDGEQS64ISS6Y2KDM5V67B6LXALJX4E7VE4MIA54NANSUX5MKGKBZM5G", - "amount": "404.0000000" - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no account whose ID matches the `hash` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/operations-single.md b/services/horizon/internal/docs/reference/endpoints/operations-single.md deleted file mode 100644 index 2693cd4d41..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/operations-single.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: Operation Details -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=operations&endpoint=single -replacement: https://developers.stellar.org/api/resources/operations/single/ ---- - -The operation details endpoint provides information on a single -[operation](../resources/operation.md). The operation ID provided in the `id` argument specifies -which operation to load. - -### Warning - failed transactions - -Operations can be part of successful or failed transactions (failed transactions are also included -in Stellar ledger). Always check operation status using `transaction_successful` field! - -## Request - -``` -GET /operations/{id} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `id` | required, number | An operation ID. | 2927608622747649 | -| `?join` | optional, string, default: _null_ | Set to `transactions` to include the transactions which created each of the operations in the response. | `transactions` | - -### curl Example Request - -```sh -curl https://horizon-testnet.stellar.org/operations/2927608622747649 -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.operations() - .operation('2927608622747649') - .call() - .then(function (operationsResult) { - console.log(operationsResult) - }) - .catch(function (err) { - console.log(err) - }) -``` - -## Response - -This endpoint responds with a single Operation. See [operation resource](../resources/operation.md) for reference. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/operations/2927608622747649" - }, - "transaction": { - "href": "https://horizon-testnet.stellar.org/transactions/4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a" - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/operations/2927608622747649/effects" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=2927608622747649" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=2927608622747649" - } - }, - "id": "2927608622747649", - "paging_token": "2927608622747649", - "transaction_successful": true, - "source_account": "GCGXZPH2QNKJP4GI2J77EFQQUMP3NYY4PCUZ4UPKHR2XYBKRUYKQ2DS6", - "type": "payment", - "type_i": 1, - "created_at": "2019-04-08T21:59:27Z", - "transaction_hash": "4a3365180521e16b478d9f0c9198b97a9434fc9cb07b34f83ecc32fc54d0ca8a", - "asset_type": "native", - "from": "GCGXZPH2QNKJP4GI2J77EFQQUMP3NYY4PCUZ4UPKHR2XYBKRUYKQ2DS6", - "to": "GDGEQS64ISS6Y2KDM5V67B6LXALJX4E7VE4MIA54NANSUX5MKGKBZM5G", - "amount": "404.0000000" -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if the - there is no operation that matches the ID argument, i.e. the operation does not exist. diff --git a/services/horizon/internal/docs/reference/endpoints/orderbook-details.md b/services/horizon/internal/docs/reference/endpoints/orderbook-details.md deleted file mode 100644 index f408aef7df..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/orderbook-details.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: Orderbook Details -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=order_book&endpoint=details -replacement: https://developers.stellar.org/api/aggregations/order-books/ ---- - -People on the Stellar network can make [offers](../resources/offer.md) to buy or sell assets. -These offers are summarized by the assets being bought and sold in -[orderbooks](../resources/orderbook.md). - -Horizon will return, for each orderbook, a summary of the orderbook and the bids and asks -associated with that orderbook. - -This endpoint can also be used in [streaming](../streaming.md) mode so it is possible to use it to -listen as offers are processed in the Stellar network. If called in streaming mode Horizon will -start at the earliest known offer unless a `cursor` is set. In that case it will start from the -`cursor`. You can also set `cursor` value to `now` to only stream offers created since your request -time. - -## Request - -``` -GET /order_book?selling_asset_type={selling_asset_type}&selling_asset_code={selling_asset_code}&selling_asset_issuer={selling_asset_issuer}&buying_asset_type={buying_asset_type}&buying_asset_code={buying_asset_code}&buying_asset_issuer={buying_asset_issuer}&limit={limit} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `selling_asset_type` | required, string | Type of the Asset being sold | `native` | -| `selling_asset_code` | optional, string | Code of the Asset being sold | `USD` | -| `selling_asset_issuer` | optional, string | Account ID of the issuer of the Asset being sold | `GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36` | -| `buying_asset_type` | required, string | Type of the Asset being bought | `credit_alphanum4` | -| `buying_asset_code` | optional, string | Code of the Asset being bought | `BTC` | -| `buying_asset_issuer` | optional, string | Account ID of the issuer of the Asset being bought | `GD6VWBXI6NY3AOOR55RLVQ4MNIDSXE5JSAVXUTF35FRRI72LYPI3WL6Z` | -| `limit` | optional, string | Limit the number of items returned | `20` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/order_book?selling_asset_type=native&buying_asset_type=credit_alphanum4&buying_asset_code=FOO&buying_asset_issuer=GBAUUA74H4XOQYRSOW2RZUA4QL5PB37U3JS5NE3RTB2ELJVMIF5RLMAG&limit=20" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.orderbook(new StellarSdk.Asset.native(), new StellarSdk.Asset('FOO', 'GBAUUA74H4XOQYRSOW2RZUA4QL5PB37U3JS5NE3RTB2ELJVMIF5RLMAG')) - .call() - .then(function(resp) { - console.log(resp); - }) - .catch(function(err) { - console.log(err); - }) -``` - -### JavaScript Streaming Example - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var orderbookHandler = function (orderbookResponse) { - console.log(orderbookResponse); -}; - -var es = server.orderbook(new StellarSdk.Asset.native(), new StellarSdk.Asset('FOO', 'GBAUUA74H4XOQYRSOW2RZUA4QL5PB37U3JS5NE3RTB2ELJVMIF5RLMAG')) - .cursor('now') - .stream({ - onmessage: orderbookHandler - }) -``` - -## Response - -The summary of the orderbook and its bids and asks. - -## Example Response -```json -{ - "bids": [ - { - "price_r": { - "n": 100000000, - "d": 12953367 - }, - "price": "7.7200005", - "amount": "12.0000000" - } - ], - "asks": [ - { - "price_r": { - "n": 194, - "d": 25 - }, - "price": "7.7600000", - "amount": "238.4804125" - } - ], - "base": { - "asset_type": "native" - }, - "counter": { - "asset_type": "credit_alphanum4", - "asset_code": "FOO", - "asset_issuer": "GBAUUA74H4XOQYRSOW2RZUA4QL5PB37U3JS5NE3RTB2ELJVMIF5RLMAG" - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/path-finding-strict-receive.md b/services/horizon/internal/docs/reference/endpoints/path-finding-strict-receive.md deleted file mode 100644 index 8e8444878d..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/path-finding-strict-receive.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Strict Receive Payment Paths -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=paths&endpoint=all -replacement: https://developers.stellar.org/api/aggregations/paths/strict-receive/ ---- - -The Stellar Network allows payments to be made across assets through _path payments_. A path -payment specifies a series of assets to route a payment through, from source asset (the asset -debited from the payer) to destination asset (the asset credited to the payee). - -A [Path Payment Strict Receive](../../../guides/concepts/list-of-operations.html#path-payment-strict-receive) allows a user to specify the *amount of the asset received*. The amount sent varies based on offers in the order books. If you would like to search for a path specifying the amount to be sent, use the [Find Payment Paths (Strict Send)](./path-finding-strict-send.html). - -A strict receive path search is specified using: - -- The source account id or source assets. -- The asset and amount that the destination account should receive. - -As part of the search, horizon will load a list of assets available to the source account id and -will find any payment paths from those source assets to the desired destination asset. The search's -amount parameter will be used to determine if a given path can satisfy a payment of the -desired amount. - -## Request - -``` -GET /paths/strict-receive?source_account={sa}&destination_asset_type={at}&destination_asset_code={ac}&destination_asset_issuer={di}&destination_amount={amount}&destination_account={da} -``` - -## Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `?source_account` | string | The sender's account id. Any returned path must use an asset that the sender has a trustline to. | `GARSFJNXJIHO6ULUBK3DBYKVSIZE7SC72S5DYBCHU7DKL22UXKVD7MXP` | -| `?source_assets` | string | A comma separated list of assets. Any returned path must use an asset included in this list | `USD:GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V,native` | -| `?destination_account` | string | The destination account that any returned path should use | `GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V` | -| `?destination_asset_type` | string | The type of the destination asset | `credit_alphanum4` | -| `?destination_asset_code` | required if `destination_asset_type` is not `native`, string | The destination asset code, if destination_asset_type is not "native" | `USD` | -| `?destination_asset_issuer` | required if `destination_asset_type` is not `native`, string | The issuer for the destination asset, if destination_asset_type is not "native" | `GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V` | -| `?destination_amount` | string | The amount, denominated in the destination asset, that any returned path should be able to satisfy | `10.1` | - -The endpoint will not allow requests which provide both a `source_account` and a `source_assets` parameter. All requests must provide one or the other. -The assets in `source_assets` are expected to be encoded using the following format: - -XLM should be represented as `"native"`. Issued assets should be represented as `"Code:IssuerAccountID"`. `"Code"` must consist of alphanumeric ASCII characters. - - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/paths/strict-receive?destination_account=GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V&source_account=GARSFJNXJIHO6ULUBK3DBYKVSIZE7SC72S5DYBCHU7DKL22UXKVD7MXP&destination_asset_type=native&destination_amount=20" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var sourceAccount = "GARSFJNXJIHO6ULUBK3DBYKVSIZE7SC72S5DYBCHU7DKL22UXKVD7MXP"; -var destinationAsset = StellarSdk.Asset.native(); -var destinationAmount = "20"; - -server.paths(sourceAccount, destinationAsset, destinationAmount) - .call() - .then(function (pathResult) { - console.log(pathResult.records); - }) - .catch(function (err) { - console.log(err) - }) -``` - -## Response - -This endpoint responds with a page of path resources. See [path resource](../resources/path.md) for reference. - -### Example Response - -```json -{ - "_embedded": { - "records": [ - { - "source_asset_type": "credit_alphanum4", - "source_asset_code": "FOO", - "source_asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR", - "source_amount": "100.0000000", - "destination_asset_type": "credit_alphanum4", - "destination_asset_code": "FOO", - "destination_asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR", - "destination_amount": "100.0000000", - "path": [] - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if no paths could be found to fulfill this payment request diff --git a/services/horizon/internal/docs/reference/endpoints/path-finding-strict-send.md b/services/horizon/internal/docs/reference/endpoints/path-finding-strict-send.md deleted file mode 100644 index ff2ad9d444..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/path-finding-strict-send.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: Strict Send Payment Paths -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=paths&endpoint=all -replacement: https://developers.stellar.org/api/aggregations/paths/strict-send/ ---- - -The Stellar Network allows payments to be made across assets through _path payments_. A path -payment specifies a series of assets to route a payment through, from source asset (the asset -debited from the payer) to destination asset (the asset credited to the payee). - -A [Path Payment Strict Send](../../../guides/concepts/list-of-operations.html#path-payment-strict-send) allows a user to specify the amount of the asset to send. The amount received will vary based on offers in the order books. - - -A path payment strict send search is specified using: - -- The destination account id or destination assets. -- The source asset. -- The source amount. - -As part of the search, horizon will load a list of assets available to the source account id or use the assets passed in the request and will find any payment paths from those source assets to the desired destination asset. The source's amount parameter will be used to determine if a given path can satisfy a payment of the desired amount. - -## Request - -``` -https://horizon-testnet.stellar.org/paths/strict-send?&source_amount={sa}&source_asset_type={at}&source_asset_code={ac}&source_asset_issuer={ai}&destination_account={da} -``` - -## Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `?source_amount` | string | The amount, denominated in the source asset, that any returned path should be able to satisfy | `10.1` | -| `?source_asset_type` | string | The type of the source asset | `credit_alphanum4` | -| `?source_asset_code` | string, required if `source_asset_type` is not `native`, string | The source asset code, if source_asset_type is not "native" | `USD` | -| `?source_asset_issuer` | string, required if `source_asset_type` is not `native`, string | The issuer for the source asset, if source_asset_type is not "native" | `GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V` | -| `?destination_account` | string optional | The destination account that any returned path should use | `GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V` | -| `?destination_assets` | string optional | A comma separated list of assets. Any returned path must use an asset included in this list | `USD:GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V,native` | - -The endpoint will not allow requests which provide both a `destination_account` and `destination_assets` parameter. All requests must provide one or the other. -The assets in `destination_assets` are expected to be encoded using the following format: - -XLM should be represented as `"native"`. Issued assets should be represented as `"Code:IssuerAccountID"`. `"Code"` must consist of alphanumeric ASCII characters. - - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/paths/strict-send?&source_amount=10&source_asset_type=native&destination_assets=MXN:GC2GFGZ5CZCFCDJSQF3YYEAYBOS3ZREXJSPU7LUJ7JU3LP3BQNHY7YKS" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var sourceAsset = StellarSdk.Asset.native(); -var sourceAmount = "20"; -var destinationAsset = new StellarSdk.Asset( - 'USD', - 'GDSBCQO34HWPGUGQSP3QBFEXVTSR2PW46UIGTHVWGWJGQKH3AFNHXHXN' -) - - -server.strictSendPaths(sourceAsset, sourceAmount, [destinationAsset]) - .call() - .then(function (pathResult) { - console.log(pathResult.records); - }) - .catch(function (err) { - console.log(err) - }) -``` - -## Response - -This endpoint responds with a page of path resources. See [path resource](../resources/path.md) for reference. - -### Example Response - -```json -{ - "_embedded": { - "records": [ - { - "source_asset_type": "credit_alphanum4", - "source_asset_code": "FOO", - "source_asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR", - "source_amount": "100.0000000", - "destination_asset_type": "credit_alphanum4", - "destination_asset_code": "FOO", - "destination_asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR", - "destination_amount": "100.0000000", - "path": [] - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if no paths could be found to fulfill this payment request diff --git a/services/horizon/internal/docs/reference/endpoints/path-finding.md b/services/horizon/internal/docs/reference/endpoints/path-finding.md deleted file mode 100644 index 356ec40f0f..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/path-finding.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: Find Payment Paths -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=paths&endpoint=all -replacement: https://developers.stellar.org/api/aggregations/paths/ ---- - -**Note**: This endpoint will be deprecated, use [/path/strict-receive](./path-finding-strict-receive.md) instead. There are no differences between both endpoints, `/paths` is an alias for `/path/strict-receive`. - - -The Stellar Network allows payments to be made across assets through _path payments_. A path -payment specifies a series of assets to route a payment through, from source asset (the asset -debited from the payer) to destination asset (the asset credited to the payee). - -A path search is specified using: - -- The destination account id -- The source account id -- The asset and amount that the destination account should receive - -As part of the search, horizon will load a list of assets available to the source account id and -will find any payment paths from those source assets to the desired destination asset. The search's -amount parameter will be used to determine if there a given path can satisfy a payment of the -desired amount. - -## Request - -``` -GET /paths?destination_account={da}&source_account={sa}&destination_asset_type={at}&destination_asset_code={ac}&destination_asset_issuer={di}&destination_amount={amount} -``` - -## Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `?destination_account` | string | The destination account that any returned path should use | `GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V` | -| `?destination_asset_type` | string | The type of the destination asset | `credit_alphanum4` | -| `?destination_asset_code` | string | The destination asset code, if destination_asset_type is not "native" | `USD` | -| `?destination_asset_issuer` | string | The issuer for the destination, if destination_asset_type is not "native" | `GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V` | -| `?destination_amount` | string | The amount, denominated in the destination asset, that any returned path should be able to satisfy | `10.1` | -| `?source_account` | string | The sender's account id. Any returned path must use a source that the sender can hold | `GARSFJNXJIHO6ULUBK3DBYKVSIZE7SC72S5DYBCHU7DKL22UXKVD7MXP` | -| `?source_assets` | string | A comma separated list of assets. Any returned path must use a source included in this list | `USD:GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V,native` | - -The endpoint will not allow requests which provide both a `source_account` and a `source_assets` parameter. All requests must provide one or the other. -The assets in `source_assets` are expected to be encoded using the following format: - -The native asset should be represented as `"native"`. Issued assets should be represented as `"Code:IssuerAccountID"`. `"Code"` must consist of alphanumeric ASCII characters. - - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/paths?destination_account=GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V&source_account=GARSFJNXJIHO6ULUBK3DBYKVSIZE7SC72S5DYBCHU7DKL22UXKVD7MXP&destination_asset_type=native&destination_amount=20" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var source_account = "GARSFJNXJIHO6ULUBK3DBYKVSIZE7SC72S5DYBCHU7DKL22UXKVD7MXP"; -var destination_account = "GAEDTJ4PPEFVW5XV2S7LUXBEHNQMX5Q2GM562RJGOQG7GVCE5H3HIB4V"; -var destination_asset = StellarSdk.Asset.native(); -var destination_amount = "20"; - -server.paths(source_account, destination_account, destination_asset, destination_amount) - .call() - .then(function (pathResult) { - console.log(pathResult.records); - }) - .catch(function (err) { - console.log(err) - }) -``` - -## Response - -This endpoint responds with a page of path resources. See [path resource](../resources/path.md) for reference. - -### Example Response - -```json -{ - "_embedded": { - "records": [ - { - "source_asset_type": "credit_alphanum4", - "source_asset_code": "FOO", - "source_asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR", - "source_amount": "100.0000000", - "destination_asset_type": "credit_alphanum4", - "destination_asset_code": "FOO", - "destination_asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR", - "destination_amount": "100.0000000", - "path": [] - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if no paths could be found to fulfill this payment request diff --git a/services/horizon/internal/docs/reference/endpoints/payments-all.md b/services/horizon/internal/docs/reference/endpoints/payments-all.md deleted file mode 100644 index 4df10b3c81..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/payments-all.md +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: All Payments -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=payments&endpoint=all ---- - -This endpoint represents all payment-related [operations](../resources/operation.md) that are part -of validated [transactions](../resources/transaction.md). This endpoint can also be used in -[streaming](../streaming.md) mode so it is possible to use it to listen for new payments as they -get made in the Stellar network. - -If called in streaming mode Horizon will start at the earliest known payment unless a `cursor` is -set. In that case it will start from the `cursor`. You can also set `cursor` value to `now` to only -stream payments created since your request time. - -The operations that can be returned in by this endpoint are: -- `create_account` -- `payment` -- `path_payment` -- `account_merge` - -## Request - -``` -GET /payments{?cursor,limit,order,include_failed} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `?cursor` | optional, any, default _null_ | A paging token, specifying where to start returning records from. When streaming this can be set to `now` to stream object created since your request time. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | -| `?include_failed` | optional, bool, default: `false` | Set to `true` to include payments of failed transactions in results. | `true` | -| `?join` | optional, string, default: _null_ | Set to `transactions` to include the transactions which created each of the payments in the response. | `transactions` | - -### curl Example Request - -```sh -# Retrieve the first 200 payments, ordered chronologically. -curl "https://horizon-testnet.stellar.org/payments?limit=200" -``` - -```sh -# Retrieve a page of payments to occur immediately before the transaction -# specified by the paging token "1234". -curl "https://horizon-testnet.stellar.org/payments?cursor=1234&order=desc" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.payments() - .call() - .then(function (paymentResults) { - console.log(paymentResults.records) - }) - .catch(function (err) { - console.log(err) - }) -``` - -### JavaScript Streaming Example - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var paymentHandler = function (paymentResponse) { - console.log(paymentResponse); -}; - -var es = server.payments() - .cursor('now') - .stream({ - onmessage: paymentHandler - }) -``` - -## Response - -This endpoint responds with a list of payments. See [operation resource](../resources/operation.md) for more information about operations (and payment operations). - -### Example Response - -```json -{ - "_embedded": { - "records": [ - { - "_links": { - "effects": { - "href": "/operations/77309415424/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=77309415424&order=asc" - }, - "self": { - "href": "/operations/77309415424" - }, - "succeeds": { - "href": "/operations?cursor=77309415424&order=desc" - }, - "transactions": { - "href": "/transactions/77309415424" - } - }, - "account": "GBIA4FH6TV64KSPDAJCNUQSM7PFL4ILGUVJDPCLUOPJ7ONMKBBVUQHRO", - "funder": "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ", - "id": 77309415424, - "paging_token": "77309415424", - "starting_balance": 1e+14, - "type_i": 0, - "type": "create_account" - }, - { - "_links": { - "effects": { - "href": "/operations/463856472064/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=463856472064&order=asc" - }, - "self": { - "href": "/operations/463856472064" - }, - "succeeds": { - "href": "/operations?cursor=463856472064&order=desc" - }, - "transactions": { - "href": "/transactions/463856472064" - } - }, - "account": "GC2ADYAIPKYQRGGUFYBV2ODJ54PY6VZUPKNCWWNX2C7FCJYKU4ZZNKVL", - "funder": "GBIA4FH6TV64KSPDAJCNUQSM7PFL4ILGUVJDPCLUOPJ7ONMKBBVUQHRO", - "id": 463856472064, - "paging_token": "463856472064", - "starting_balance": 1e+09, - "type_i": 0, - "type": "create_account" - } - ] - }, - "_links": { - "next": { - "href": "?order=asc&limit=2&cursor=463856472064" - }, - "prev": { - "href": "?order=desc&limit=2&cursor=77309415424" - }, - "self": { - "href": "?order=asc&limit=2&cursor=" - } - } -} -``` - -### Example Streaming Event - -```json -{ - "_links": { - "effects": { - "href": "/operations/77309415424/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=77309415424&order=asc" - }, - "self": { - "href": "/operations/77309415424" - }, - "succeeds": { - "href": "/operations?cursor=77309415424&order=desc" - }, - "transactions": { - "href": "/transactions/77309415424" - } - }, - "account": "GBIA4FH6TV64KSPDAJCNUQSM7PFL4ILGUVJDPCLUOPJ7ONMKBBVUQHRO", - "funder": "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ", - "id": 77309415424, - "paging_token": "77309415424", - "starting_balance": 1e+14, - "type_i": 0, - "type": "create_account" -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/payments-for-account.md b/services/horizon/internal/docs/reference/endpoints/payments-for-account.md deleted file mode 100644 index 3bd6bd4bb6..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/payments-for-account.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: Payments for Account -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=payments&endpoint=for_account -replacement: https://developers.stellar.org/api/resources/accounts/payments/ ---- - -This endpoint responds with a collection of payment-related operations where the given -[account](../resources/account.md) was either the sender or receiver. - -This endpoint can also be used in [streaming](../streaming.md) mode so it is possible to use it to -listen for new payments to or from an account as they get made in the Stellar network. -If called in streaming mode Horizon will start at the earliest known payment unless a `cursor` is -set. In that case it will start from the `cursor`. You can also set `cursor` value to `now` to only -stream payments created since your request time. - -The operations that can be returned in by this endpoint are: -- `create_account` -- `payment` -- `path_payment` -- `account_merge` - -## Request - -``` -GET /accounts/{id}/payments{?cursor,limit,order} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `id` | required, string | The account id of the account used to constrain results. | `GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ` | -| `?cursor` | optional, default _null_ | A payment paging token specifying from where to begin results. When streaming this can be set to `now` to stream object created since your request time. | `8589934592` | -| `?limit` | optional, number, default `10` | Specifies the count of records at most to return. | `200` | -| `?order` | optional, string, default `asc` | Specifies order of returned results. `asc` means older payments first, `desc` mean newer payments first. | `desc` | -| `?include_failed` | optional, bool, default: `false` | Set to `true` to include payments of failed transactions in results. | `true` | -| `?join` | optional, string, default: _null_ | Set to `transactions` to include the transactions which created each of the payments in the response. | `transactions` | - -### curl Example Request - -```bash -# Retrieve the 25 latest payments for a specific account. -curl "https://horizon-testnet.stellar.org/accounts/GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ/payments?limit=25&order=desc" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.payments() - .forAccount("GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ") - .call() - .then(function (accountResult) { - console.log(accountResult); - }) - .catch(function (err) { - console.error(err); - }) -``` - -### JavaScript Streaming Example - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var paymentHandler = function (paymentResponse) { - console.log(paymentResponse); -}; - -var es = server.payments() - .forAccount("GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ") - .cursor('now') - .stream({ - onmessage: paymentHandler - }) -``` - -## Response - -This endpoint responds with a [page](../resources/page.md) of [payment operations](../resources/operation.md). - -### Example Response - -```json -{"_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "/operations/12884905984" - }, - "transaction": { - "href": "/transaction/6391dd190f15f7d1665ba53c63842e368f485651a53d8d852ed442a446d1c69a" - }, - "precedes": { - "href": "/accounts/GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ/payments?cursor=12884905984&order=asc{?limit}", - "templated": true - }, - "succeeds": { - "href": "/accounts/GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ/payments?cursor=12884905984&order=desc{?limit}", - "templated": true - } - }, - "id": 12884905984, - "paging_token": "12884905984", - "type_i": 0, - "type": "payment", - "sender": "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ", - "receiver": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", - "asset": { - "code": "XLM" - }, - "amount": 1000000000, - "amount_f": 100.00 - } - ] -}, -"_links": { - "next": { - "href": "/accounts/GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ/payments?cursor=12884905984&order=asc{?limit}", - "templated": true - }, - "self": { - "href": "/accounts/GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ/payments" - } -} -} -``` - -### Example Streaming Event - -```json -{ - "_links": { - "effects": { - "href": "/operations/77309415424/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=77309415424&order=asc" - }, - "self": { - "href": "/operations/77309415424" - }, - "succeeds": { - "href": "/operations?cursor=77309415424&order=desc" - }, - "transactions": { - "href": "/transactions/77309415424" - } - }, - "account": "GBIA4FH6TV64KSPDAJCNUQSM7PFL4ILGUVJDPCLUOPJ7ONMKBBVUQHRO", - "funder": "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ", - "id": 77309415424, - "paging_token": "77309415424", - "starting_balance": 1e+14, - "type_i": 0, - "type": "create_account" -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/payments-for-ledger.md b/services/horizon/internal/docs/reference/endpoints/payments-for-ledger.md deleted file mode 100644 index 52cc95ffb6..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/payments-for-ledger.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: Payments for Ledger -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=payments&endpoint=for_ledger -replacement: https://developers.stellar.org/api/resources/ledgers/payments/ ---- - -This endpoint represents all payment-related [operations](../resources/operation.md) that are part -of a valid [transactions](../resources/transaction.md) in a given [ledger](../resources/ledger.md). - -The operations that can be returned in by this endpoint are: -- `create_account` -- `payment` -- `path_payment` -- `account_merge` - -## Request - -``` -GET /ledgers/{id}/payments{?cursor,limit,order,include_failed} -``` - -### Arguments - -| name | notes | description | example | -| ------ | ------- | ----------- | ------- | -| `id` | required, number | Ledger ID | `696960` | -| `?cursor` | optional, default _null_ | A paging token, specifying where to start returning records from. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` | -| `?include_failed` | optional, bool, default: `false` | Set to `true` to include payments of failed transactions in results. | `true` | -| `?join` | optional, string, default: _null_ | Set to `transactions` to include the transactions which created each of the payments in the response. | `transactions` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/ledgers/696960/payments?limit=1" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.payments() - .forLedger("696960") - .call() - .then(function (paymentResult) { - console.log(paymentResult) - }) - .catch(function (err) { - console.log(err) - }) -``` - -## Response - -This endpoint responds with a list of payment operations in a given ledger. See [operation -resource](../resources/operation.md) for more information about operations (and payment -operations). - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/ledgers/696960/payments?cursor=&limit=1&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/ledgers/696960/payments?cursor=2993420406628353&limit=1&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/ledgers/696960/payments?cursor=2993420406628353&limit=1&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/operations/2993420406628353" - }, - "transaction": { - "href": "https://horizon-testnet.stellar.org/transactions/f65278b36875d170e865853838da400515f59ca23836f072e8d62cac18b803e5" - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/operations/2993420406628353/effects" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=2993420406628353" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=2993420406628353" - } - }, - "id": "2993420406628353", - "paging_token": "2993420406628353", - "transaction_successful": true, - "source_account": "GAYB4GWPX2HUWR5QE7YX77QY6TSNFZIJZTYX2TDRW6YX6332BGD5SEAK", - "type": "payment", - "type_i": 1, - "created_at": "2019-04-09T20:00:54Z", - "transaction_hash": "f65278b36875d170e865853838da400515f59ca23836f072e8d62cac18b803e5", - "asset_type": "native", - "from": "GAYB4GWPX2HUWR5QE7YX77QY6TSNFZIJZTYX2TDRW6YX6332BGD5SEAK", - "to": "GDGEQS64ISS6Y2KDM5V67B6LXALJX4E7VE4MIA54NANSUX5MKGKBZM5G", - "amount": "293.0000000" - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no ledger whose ID matches the `id` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/payments-for-transaction.md b/services/horizon/internal/docs/reference/endpoints/payments-for-transaction.md deleted file mode 100644 index 29b557eb4c..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/payments-for-transaction.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: Payments for Transaction -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=payments&endpoint=for_transaction ---- - -This endpoint represents all payment-related [operations](../resources/operation.md) that are part -of a given [transaction](../resources/transaction.md). - -The operations that can be returned in by this endpoint are: -- `create_account` -- `payment` -- `path_payment` -- `account_merge` - -### Warning - failed transactions - -"Payments for Transaction" endpoint returns list of payments of successful or failed transactions -(that are also included in Stellar ledger). Always check the payment status in this endpoint using -`transaction_successful` field! - -## Request - -``` -GET /transactions/{hash}/payments{?cursor,limit,order} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `hash` | required, string | A transaction hash, hex-encoded, lowercase. | `f65278b36875d170e865853838da400515f59ca23836f072e8d62cac18b803e5` | -| `?cursor` | optional, default _null_ | A paging token, specifying where to start returning records from. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` | -| `?join` | optional, string, default: _null_ | Set to `transactions` to include the transactions which created each of the payments in the response. | `transactions` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/transactions/f65278b36875d170e865853838da400515f59ca23836f072e8d62cac18b803e5/payments" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.payments() - .forTransaction("f65278b36875d170e865853838da400515f59ca23836f072e8d62cac18b803e5") - .call() - .then(function (paymentResult) { - console.log(paymentResult.records); - }) - .catch(function (err) { - console.log(err); - }) -``` - -## Response - -This endpoint responds with a list of payments operations that are part of a given transaction. See -[operation resource](../resources/operation.md) for more information about operations (and payment -operations). - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/transactions/f65278b36875d170e865853838da400515f59ca23836f072e8d62cac18b803e5/payments?cursor=&limit=10&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/transactions/f65278b36875d170e865853838da400515f59ca23836f072e8d62cac18b803e5/payments?cursor=2993420406628353&limit=10&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/transactions/f65278b36875d170e865853838da400515f59ca23836f072e8d62cac18b803e5/payments?cursor=2993420406628353&limit=10&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/operations/2993420406628353" - }, - "transaction": { - "href": "https://horizon-testnet.stellar.org/transactions/f65278b36875d170e865853838da400515f59ca23836f072e8d62cac18b803e5" - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/operations/2993420406628353/effects" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=2993420406628353" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=2993420406628353" - } - }, - "id": "2993420406628353", - "paging_token": "2993420406628353", - "transaction_successful": true, - "source_account": "GAYB4GWPX2HUWR5QE7YX77QY6TSNFZIJZTYX2TDRW6YX6332BGD5SEAK", - "type": "payment", - "type_i": 1, - "created_at": "2019-04-09T20:00:54Z", - "transaction_hash": "f65278b36875d170e865853838da400515f59ca23836f072e8d62cac18b803e5", - "asset_type": "native", - "from": "GAYB4GWPX2HUWR5QE7YX77QY6TSNFZIJZTYX2TDRW6YX6332BGD5SEAK", - "to": "GDGEQS64ISS6Y2KDM5V67B6LXALJX4E7VE4MIA54NANSUX5MKGKBZM5G", - "amount": "293.0000000" - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no - transaction whose ID matches the `hash` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/trade_aggregations.md b/services/horizon/internal/docs/reference/endpoints/trade_aggregations.md deleted file mode 100644 index 47a4c3fef8..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/trade_aggregations.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -title: Trade Aggregations -replacement: https://developers.stellar.org/api/aggregations/trade-aggregations/ ---- - -Trade Aggregations are catered specifically for developers of trading clients. They facilitate -efficient gathering of historical trade data. This is done by dividing a given time range into -segments and aggregating statistics, for a given asset pair (`base`, `counter`) over each of these -segments. - -The duration of the segments is specified with the `resolution` parameter. The start and end of the -time range are given by `startTime` and `endTime` respectively, which are both rounded to the -nearest multiple of `resolution` since epoch. - -The individual segments are also aligned with multiples of `resolution` since epoch. If you want to -change this alignment, the segments can be offset by specifying the `offset` parameter. - - -## Request - -``` -GET /trade_aggregations?base_asset_type={base_asset_type}&base_asset_code={base_asset_code}&base_asset_issuer={base_asset_issuer}&counter_asset_type={counter_asset_type}&counter_asset_code={counter_asset_code}&counter_asset_issuer={counter_asset_issuer} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `start_time` | long | lower time boundary represented as millis since epoch | 1512689100000 | -| `end_time` | long | upper time boundary represented as millis since epoch | 1512775500000 | -| `resolution` | long | segment duration as millis. *Supported values are 1 minute (60000), 5 minutes (300000), 15 minutes (900000), 1 hour (3600000), 1 day (86400000) and 1 week (604800000).* | 300000 | -| `offset` | long | segments can be offset using this parameter. Expressed in milliseconds. Can only be used if the resolution is greater than 1 hour. *Value must be in whole hours, less than the provided resolution, and less than 24 hours.* | 3600000 (1 hour) | -| `base_asset_type` | string | Type of base asset | `native` | -| `base_asset_code` | string | Code of base asset, not required if type is `native` | `USD` | -| `base_asset_issuer` | string | Issuer of base asset, not required if type is `native` | 'GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36' | -| `counter_asset_type` | string | Type of counter asset | `credit_alphanum4` | -| `counter_asset_code` | string | Code of counter asset, not required if type is `native` | `BTC` | -| `counter_asset_issuer` | string | Issuer of counter asset, not required if type is `native` | 'GATEMHCCKCY67ZUCKTROYN24ZYT5GK4EQZ65JJLDHKHRUZI3EUEKMTCH' | -| `?order` | optional, string, default `asc` | The order, in terms of timeline, in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | - -### curl Example Request -```sh -curl https://horizon.stellar.org/trade_aggregations?base_asset_type=native&counter_asset_code=SLT&counter_asset_issuer=GCKA6K5PCQ6PNF5RQBF7PQDJWRHO6UOGFMRLK3DYHDOI244V47XKQ4GP&counter_asset_type=credit_alphanum4&limit=200&order=asc&resolution=3600000&start_time=1517521726000&end_time=1517532526000 -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon.stellar.org'); - -var base = new StellarSdk.Asset.native(); -var counter = new StellarSdk.Asset("SLT", "GCKA6K5PCQ6PNF5RQBF7PQDJWRHO6UOGFMRLK3DYHDOI244V47XKQ4GP"); -var startTime = 1517521726000; -var endTime = 1517532526000; -var resolution = 3600000; -var offset = 0; - -server.tradeAggregation(base, counter, startTime, endTime, resolution, offset) - .call() - .then(function (tradeAggregation) { - console.log(tradeAggregation); - }) - .catch(function (err) { - console.log(err); - }) -``` - -## Response - -A list of collected trade aggregations. - -Note -- Segments that fit into the time range but have 0 trades in them, will not be included. -- Partial segments, in the beginning and end of the time range, will not be included. Thus if your - start time is noon Wednesday, your end time is noon Thursday, and your resolution is one day, you - will not receive back any data. Instead, you would want to either start at midnight Wednesday and - midnight Thursday, or shorten the resolution interval to better cover your time frame. - -### Example Response -```json -{ - "_links": { - "self": { - "href": "https://horizon.stellar.org/trade_aggregations?base_asset_type=native\u0026counter_asset_code=SLT\u0026counter_asset_issuer=GCKA6K5PCQ6PNF5RQBF7PQDJWRHO6UOGFMRLK3DYHDOI244V47XKQ4GP\u0026counter_asset_type=credit_alphanum4\u0026limit=200\u0026order=asc\u0026resolution=3600000\u0026start_time=1517521726000\u0026end_time=1517532526000" - }, - "next": { - "href": "https://horizon.stellar.org/trade_aggregations?base_asset_type=native\u0026counter_asset_code=SLT\u0026counter_asset_issuer=GCKA6K5PCQ6PNF5RQBF7PQDJWRHO6UOGFMRLK3DYHDOI244V47XKQ4GP\u0026counter_asset_type=credit_alphanum4\u0026end_time=1517532526000\u0026limit=200\u0026order=asc\u0026resolution=3600000\u0026start_time=1517529600000" - } - }, - "_embedded": { - "records": [ - { - "timestamp": 1517522400000, - "trade_count": 26, - "base_volume": "27575.0201596", - "counter_volume": "5085.6410385", - "avg": "0.1844293", - "high": "0.1915709", - "high_r": { - "N": 50, - "D": 261 - }, - "low": "0.1506024", - "low_r": { - "N": 25, - "D": 166 - }, - "open": "0.1724138", - "open_r": { - "N": 5, - "D": 29 - }, - "close": "0.1506024", - "close_r": { - "N": 25, - "D": 166 - } - }, - { - "timestamp": 1517526000000, - "trade_count": 15, - "base_volume": "3913.8224543", - "counter_volume": "719.4993608", - "avg": "0.1838355", - "high": "0.1960784", - "high_r": { - "N": 10, - "D": 51 - }, - "low": "0.1506024", - "low_r": { - "N": 25, - "D": 166 - }, - "open": "0.1869159", - "open_r": { - "N": 20, - "D": 107 - }, - "close": "0.1515152", - "close_r": { - "N": 5, - "D": 33 - } - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/trades-for-account.md b/services/horizon/internal/docs/reference/endpoints/trades-for-account.md deleted file mode 100644 index 1290ac68ab..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/trades-for-account.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -title: Trades for Account -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=trades&endpoint=for_account -replacement: https://developers.stellar.org/api/resources/accounts/trades/ ---- - -This endpoint represents all [trades](../resources/trade.md) that affect a given [account](../resources/account.md). - -This endpoint can also be used in [streaming](../streaming.md) mode, making it possible to listen for new trades that affect the given account as they occur on the Stellar network. -If called in streaming mode Horizon will start at the earliest known trade unless a `cursor` is set. In that case it will start from the `cursor`. You can also set `cursor` value to `now` to only stream trades created since your request time. - -## Request - -``` -GET /accounts/{account_id}/trades{?cursor,limit,order} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `account_id` | required, string | ID of an account | GBYTR4MC5JAX4ALGUBJD7EIKZVM7CUGWKXIUJMRSMK573XH2O7VAK3SR | -| `?cursor` | optional, any, default _null_ | A paging token, specifying where to start returning records from. When streaming this can be set to `now` to stream object created since your request time. | 12884905984 | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/accounts/GBYTR4MC5JAX4ALGUBJD7EIKZVM7CUGWKXIUJMRSMK573XH2O7VAK3SR/trades?limit=1" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.trades() - .forAccount("GBYTR4MC5JAX4ALGUBJD7EIKZVM7CUGWKXIUJMRSMK573XH2O7VAK3SR") - .call() - .then(function (accountResult) { - console.log(accountResult); - }) - .catch(function (err) { - console.error(err); - }) -``` - - -## Response - -This endpoint responds with a list of trades that changed a given account's state. See the [trade resource](../resources/trade.md) for reference. - -### Example Response -```json -{ - "_links": { - "self": { - "href": "/accounts/GBYTR4MC5JAX4ALGUBJD7EIKZVM7CUGWKXIUJMRSMK573XH2O7VAK3SR/trades?cursor=\u0026limit=1\u0026order=asc" - }, - "next": { - "href": "/accounts/GBYTR4MC5JAX4ALGUBJD7EIKZVM7CUGWKXIUJMRSMK573XH2O7VAK3SR/trades?cursor=940258535411713-0\u0026limit=1\u0026order=asc" - }, - "prev": { - "href": "/accounts/GBYTR4MC5JAX4ALGUBJD7EIKZVM7CUGWKXIUJMRSMK573XH2O7VAK3SR/trades?cursor=940258535411713-0\u0026limit=1\u0026order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "" - }, - "base": { - "href": "/accounts/GBYTR4MC5JAX4ALGUBJD7EIKZVM7CUGWKXIUJMRSMK573XH2O7VAK3SR" - }, - "counter": { - "href": "/accounts/GBOOAYCAJIN7YCUUAHEQJJARNQMRUP4P2WXVO6P4KAMAB27NGA3CYTZU" - }, - "operation": { - "href": "/operations/940258535411713" - } - }, - "id": "940258535411713-0", - "paging_token": "940258535411713-0", - "ledger_close_time": "2017-03-30T13:20:41Z", - "offer_id": "8", - "base_offer_id": "8", - "base_account": "GBYTR4MC5JAX4ALGUBJD7EIKZVM7CUGWKXIUJMRSMK573XH2O7VAK3SR", - "base_amount": "1.0000000", - "base_asset_type": "credit_alphanum4", - "base_asset_code": "BTC", - "base_asset_issuer": "GB6FN4C7ZLWKENAOZDLZOQHNIOK4RDMV6EKLR53LWCHEBR6LVXOEKDZH", - "counter_offer_id": "4611686044197195777", - "counter_account": "GBOOAYCAJIN7YCUUAHEQJJARNQMRUP4P2WXVO6P4KAMAB27NGA3CYTZU", - "counter_amount": "1.0000000", - "counter_asset_type": "native", - "base_is_seller": true, - "price": { - "n": 1, - "d": 1 - } - } - ] - } -} -``` - -## Example Streaming Event -``` -{ - _links: - { self: { href: '' }, - base: { href: '/accounts/GDICGE2CFCNM3ZWRUVOWDJB2RAO667UE7WOSJJ2Z3IMISUA7CJZCE3KO' }, - counter: { href: '/accounts/GBILENMVJPVPEPXUPUPRBUEAME5OUQWAHIGZAX7TQX65NIQW3G3DGUYX' }, - operation: { href: '/operations/47274327069954049' } }, - id: '47274327069954049-0', - paging_token: '47274327069954049-0', - ledger_close_time: '2018-09-12T00:00:34Z', - offer_id: '711437', - base_account: 'GDICGE2CFCNM3ZWRUVOWDJB2RAO667UE7WOSJJ2Z3IMISUA7CJZCE3KO', - base_amount: '13.0000000', - base_asset_type: 'native', - counter_account: 'GBILENMVJPVPEPXUPUPRBUEAME5OUQWAHIGZAX7TQX65NIQW3G3DGUYX', - counter_amount: '13.0000000', - counter_asset_type: 'credit_alphanum4', - counter_asset_code: 'CNY', - counter_asset_issuer: 'GAREELUB43IRHWEASCFBLKHURCGMHE5IF6XSE7EXDLACYHGRHM43RFOX', - base_is_seller: true, - price: { n: 1, d: 1 } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no account whose ID matches the `account_id` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/trades-for-offer.md b/services/horizon/internal/docs/reference/endpoints/trades-for-offer.md deleted file mode 100644 index e6533e1cc1..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/trades-for-offer.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Trades for Offer -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=trades&endpoint=for_offer ---- - -This endpoint represents all [trades](../resources/trade.md) for a given [offer](../resources/offer.md). - -This endpoint can also be used in [streaming](../streaming.md) mode, making it possible to listen for new trades for the given offer as they occur on the Stellar network. -If called in streaming mode Horizon will start at the earliest known trade unless a `cursor` is set. In that case it will start from the `cursor`. You can also set `cursor` value to `now` to only stream trades created since your request time. -## Request - -``` -GET /offers/{offer_id}/trades{?cursor,limit,order} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `offer_id` | required, number | ID of an offer | 323223 | -| `?cursor` | optional, any, default _null_ | A paging token, specifying where to start returning records from. | 12884905984 | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/offers/323223/trades" -``` - -### JavaScript Example Request - -```js -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.trades() - .forOffer(323223) - .call() - .then(function (tradesResult) { - console.log(tradesResult); - }) - .catch(function (err) { - console.error(err); - }) -``` - - -## Response - -This endpoint responds with a list of trades that consumed a given offer. See the [trade resource](../resources/trade.md) for reference. - -### Example Response -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/offers/323223/trades?cursor=\u0026limit=10\u0026order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/offers/323223/trades?cursor=35789107779080193-0\u0026limit=10\u0026order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/offers/323223/trades?cursor=35789107779080193-0\u0026limit=10\u0026order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "" - }, - "base": { - "href": "https://horizon-testnet.stellar.org/accounts/GDRCFIQAUEFUQ6GXF5DPRO2M77E4UB7RW7EWI2FTKOW7CWYKZCHSI75K" - }, - "counter": { - "href": "https://horizon-testnet.stellar.org/accounts/GCUD7CBKTQI4D7ZR7IKHMGXZKKVABML7XFBHV4AIYBOEN5UQFZ5DSPPT" - }, - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/35789107779080193" - } - }, - "id": "35789107779080193-0", - "paging_token": "35789107779080193-0", - "ledger_close_time": "2018-04-08T05:58:37Z", - "base_offer_id": "323223", - "base_account": "GDRCFIQAUEFUQ6GXF5DPRO2M77E4UB7RW7EWI2FTKOW7CWYKZCHSI75K", - "base_amount": "912.6607285", - "base_asset_type": "native", - "counter_offer_id": "4611686044197195777", - "counter_account": "GCUD7CBKTQI4D7ZR7IKHMGXZKKVABML7XFBHV4AIYBOEN5UQFZ5DSPPT", - "counter_amount": "16.5200719", - "counter_asset_type": "credit_alphanum4", - "counter_asset_code": "CM10", - "counter_asset_issuer": "GBUJJAYHS64L4RDHPLURQJUKSHHPINSAYXYVMWPEF4LECHDKB2EFMKBX", - "base_is_seller": true, - "price": { - "n": 18101, - "d": 1000000 - } - } - ] - } -} -``` - -## Example Streaming Event -```cgo -{ _links: - { self: { href: '' }, - base: - { href: '/accounts/GDJNMHET4DTS7HUHU7IG5DB274OSMHUYA7TRRKOD6ZABHPUW5YWJ4SUD' }, - counter: - { href: '/accounts/GCALYDRCCJEUPMV24TAX2N2N3IBX7NUUYZNM7I5FQS5GIEQ4A7EVKUOP' }, - operation: { href: '/operations/47261068505915393' } }, - id: '47261068505915393-0', - paging_token: '47261068505915393-0', - ledger_close_time: '2018-09-11T19:42:04Z', - offer_id: '734529', - base_account: 'GDJNMHET4DTS7HUHU7IG5DB274OSMHUYA7TRRKOD6ZABHPUW5YWJ4SUD', - base_amount: '0.0175999', - base_asset_type: 'credit_alphanum4', - base_asset_code: 'BOC', - base_asset_issuer: 'GCTS32RGWRH6RJM62UVZ4UT5ZN5L6B2D3LPGO6Z2NM2EOGVQA7TA6SKO', - counter_account: 'GCALYDRCCJEUPMV24TAX2N2N3IBX7NUUYZNM7I5FQS5GIEQ4A7EVKUOP', - counter_amount: '0.0199998', - counter_asset_type: 'credit_alphanum4', - counter_asset_code: 'ABC', - counter_asset_issuer: 'GCTS32RGWRH6RJM62UVZ4UT5ZN5L6B2D3LPGO6Z2NM2EOGVQA7TA6SKO', - base_is_seller: true, - price: { n: 2840909, d: 2500000 } -} -``` -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no offer whose ID matches the `offer_id` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/trades.md b/services/horizon/internal/docs/reference/endpoints/trades.md deleted file mode 100644 index ab7760f3e9..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/trades.md +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: Trades -replacement: https://developers.stellar.org/api/resources/trades/ ---- - -People on the Stellar network can make [offers](../resources/offer.md) to buy or sell assets. When -an offer is fully or partially fulfilled, a [trade](../resources/trade.md) happens. - -Trades can be filtered for a specific orderbook, defined by an asset pair: `base` and `counter`. - -This endpoint can also be used in [streaming](../streaming.md) mode, making it possible to listen -for new trades as they occur on the Stellar network. - -If called in streaming mode Horizon will start at the earliest known trade unless a `cursor` is -set. In that case it will start from the `cursor`. You can also set `cursor` value to `now` to only -stream trades created since your request time. - -## Request - -``` -GET /trades?base_asset_type={base_asset_type}&base_asset_code={base_asset_code}&base_asset_issuer={base_asset_issuer}&counter_asset_type={counter_asset_type}&counter_asset_code={counter_asset_code}&counter_asset_issuer={counter_asset_issuer} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `base_asset_type` | optional, string | Type of base asset | `native` | -| `base_asset_code` | optional, string | Code of base asset, not required if type is `native` | `USD` | -| `base_asset_issuer` | optional, string | Issuer of base asset, not required if type is `native` | 'GA2HGBJIJKI6O4XEM7CZWY5PS6GKSXL6D34ERAJYQSPYA6X6AI7HYW36' | -| `counter_asset_type` | optional, string | Type of counter asset | `credit_alphanum4` | -| `counter_asset_code` | optional, string | Code of counter asset, not required if type is `native` | `BTC` | -| `counter_asset_issuer` | optional, string | Issuer of counter asset, not required if type is `native` | 'GD6VWBXI6NY3AOOR55RLVQ4MNIDSXE5JSAVXUTF35FRRI72LYPI3WL6Z' | -| `offer_id` | optional, string | filter for by a specific offer id | `283606` | -| `?cursor` | optional, any, default _null_ | A paging token, specifying where to start returning records from. | `12884905984` | -| `?order` | optional, string, default `asc` | The order, in terms of timeline, in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | - -### curl Example Request -```sh -curl https://horizon.stellar.org/trades?base_asset_type=native&counter_asset_code=SLT&counter_asset_issuer=GCKA6K5PCQ6PNF5RQBF7PQDJWRHO6UOGFMRLK3DYHDOI244V47XKQ4GP&counter_asset_type=credit_alphanum4&limit=2&order=desc -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.trades() - .call() - .then(function (tradesResult) { - console.log(tradesResult.records); - }) - .catch(function (err) { - console.log(err) - }) -``` - -### JavaScript Example Streaming Request - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var tradesHandler = function (tradeResponse) { - console.log(tradeResponse); -}; - -var es = server.trades() - .cursor('now') - .stream({ - onmessage: tradesHandler -}) -``` - -## Response - -The list of trades. `base` and `counter` in the records will match the asset pair filter order. If an asset pair is not specified, the order is arbitrary. - -### Example Response -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/trades?cursor=&limit=10&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/trades?cursor=6025839120434-0&limit=10&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/trades?cursor=6012954218535-0&limit=10&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "" - }, - "base": { - "href": "https://horizon-testnet.stellar.org/accounts/GAQHWQYBBW272OOXNQMMLCA5WY2XAZPODGB7Q3S5OKKIXVESKO55ZQ7C" - }, - "counter": { - "href": "https://horizon-testnet.stellar.org/accounts/GCYN7MI6VXVRP74KR6MKBAW2ELLCXL6QCY5H4YQ62HVWZWMCE6Y232UC" - }, - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/6012954218535" - } - }, - "id": "6012954218535-0", - "paging_token": "6012954218535-0", - "ledger_close_time": "2019-02-27T11:54:53Z", - "offer_id": "37", - "base_offer_id": "4611692031381606439", - "base_account": "GAQHWQYBBW272OOXNQMMLCA5WY2XAZPODGB7Q3S5OKKIXVESKO55ZQ7C", - "base_amount": "25.6687300", - "base_asset_type": "credit_alphanum4", - "base_asset_code": "DSQ", - "base_asset_issuer": "GBDQPTQJDATT7Z7EO4COS4IMYXH44RDLLI6N6WIL5BZABGMUOVMLWMQF", - "counter_offer_id": "37", - "counter_account": "GCYN7MI6VXVRP74KR6MKBAW2ELLCXL6QCY5H4YQ62HVWZWMCE6Y232UC", - "counter_amount": "1.0265563", - "counter_asset_type": "credit_alphanum4", - "counter_asset_code": "USD", - "counter_asset_issuer": "GAA4MFNZGUPJAVLWWG6G5XZJFZDHLKQNG3Q6KB24BAD6JHNNVXDCF4XG", - "base_is_seller": false, - "price": { - "n": 10000000, - "d": 250046977 - } - }, - { - "_links": { - "self": { - "href": "" - }, - "base": { - "href": "https://horizon-testnet.stellar.org/accounts/GAQHWQYBBW272OOXNQMMLCA5WY2XAZPODGB7Q3S5OKKIXVESKO55ZQ7C" - }, - "counter": { - "href": "https://horizon-testnet.stellar.org/accounts/GCYN7MI6VXVRP74KR6MKBAW2ELLCXL6QCY5H4YQ62HVWZWMCE6Y232UC" - }, - "operation": { - "href": "https://horizon-testnet.stellar.org/operations/6025839120385" - } - }, - "id": "6025839120385-0", - "paging_token": "6025839120385-0", - "ledger_close_time": "2019-02-27T11:55:09Z", - "offer_id": "1", - "base_offer_id": "4611692044266508289", - "base_account": "GAQHWQYBBW272OOXNQMMLCA5WY2XAZPODGB7Q3S5OKKIXVESKO55ZQ7C", - "base_amount": "1434.4442973", - "base_asset_type": "credit_alphanum4", - "base_asset_code": "DSQ", - "base_asset_issuer": "GBDQPTQJDATT7Z7EO4COS4IMYXH44RDLLI6N6WIL5BZABGMUOVMLWMQF", - "counter_offer_id": "1", - "counter_account": "GCYN7MI6VXVRP74KR6MKBAW2ELLCXL6QCY5H4YQ62HVWZWMCE6Y232UC", - "counter_amount": "0.5622050", - "counter_asset_type": "credit_alphanum4", - "counter_asset_code": "SXRT", - "counter_asset_issuer": "GAIOQ3UYK5NYIZY5ZFAG4JBN4O37NAVFKZM5YDYEB6YEFBZSZ5KDCUFO", - "base_is_seller": false, - "price": { - "n": 642706, - "d": 1639839483 - } - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/transactions-all.md b/services/horizon/internal/docs/reference/endpoints/transactions-all.md deleted file mode 100644 index aac65c4950..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/transactions-all.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -title: All Transactions -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=transactions&endpoint=all -replacement: https://developers.stellar.org/api/resources/transactions/single/ ---- - -This endpoint represents all successful [transactions](../resources/transaction.md). -Please note that this endpoint returns failed transactions that are included in the ledger if -`include_failed` parameter is `true` and Horizon is ingesting failed transactions. -This endpoint can also be used in [streaming](../streaming.md) mode. This makes it possible to use -it to listen for new transactions as they get made in the Stellar network. If called in streaming -mode Horizon will start at the earliest known transaction unless a `cursor` is set. In that case it -will start from the `cursor`. You can also set `cursor` value to `now` to only stream transaction -created since your request time. - -## Request - -``` -GET /transactions{?cursor,limit,order,include_failed} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `?cursor` | optional, any, default _null_ | A paging token, specifying where to start returning records from. When streaming this can be set to `now` to stream object created since your request time. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | -| `?include_failed` | optional, bool, default: `false` | Set to `true` to include failed transactions in results. | `true` | - -### curl Example Request - -```sh -# Retrieve the 200 latest transactions, ordered chronologically: -curl "https://horizon-testnet.stellar.org/transactions?limit=200&order=desc" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.transactions() - .call() - .then(function (transactionResult) { - //page 1 - console.log(transactionResult.records); - return transactionResult.next(); - }) - .then(function (transactionResult) { - console.log(transactionResult.records); - }) - .catch(function (err) { - console.log(err) - }) -``` - -### JavaScript Streaming Example - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var txHandler = function (txResponse) { - console.log(txResponse); -}; - -var es = server.transactions() - .cursor('now') - .stream({ - onmessage: txHandler - }) -``` - -## Response - -If called normally this endpoint responds with a [page](../resources/page.md) of transactions. -If called in streaming mode the transaction resources are returned individually. -See [transaction resource](../resources/transaction.md) for reference. - -### Example Response - -```json -{ - "_embedded": { - "records": [ - { - "_links": { - "account": { - "href": "/accounts/GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K" - }, - "effects": { - "href": "/transactions/fa78cb43d72171fdb2c6376be12d57daa787b1fa1a9fdd0e9453e1f41ee5f15a/effects{?cursor,limit,order}", - "templated": true - }, - "ledger": { - "href": "/ledgers/146970" - }, - "operations": { - "href": "/transactions/fa78cb43d72171fdb2c6376be12d57daa787b1fa1a9fdd0e9453e1f41ee5f15a/operations{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/transactions?cursor=631231343497216\u0026order=asc" - }, - "self": { - "href": "/transactions/fa78cb43d72171fdb2c6376be12d57daa787b1fa1a9fdd0e9453e1f41ee5f15a" - }, - "succeeds": { - "href": "/transactions?cursor=631231343497216\u0026order=desc" - } - }, - "id": "fa78cb43d72171fdb2c6376be12d57daa787b1fa1a9fdd0e9453e1f41ee5f15a", - "paging_token": "631231343497216", - "successful": true, - "hash": "fa78cb43d72171fdb2c6376be12d57daa787b1fa1a9fdd0e9453e1f41ee5f15a", - "ledger": 146970, - "created_at": "2015-09-24T10:07:09Z", - "account": "GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K", - "account_sequence": 279172874343, - "max_fee": 100, - "fee_charged": 100, - "operation_count": 1, - "envelope_xdr": "AAAAAGXNhLrhGtltTwCpmqlarh7s1DB2hIkbP//jgzn4Fos/AAAACgAAAEEAAABnAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA2ddmTOFAgr21Crs2RXRGLhiAKxicZb/IERyEZL/Y2kUAAAAXSHboAAAAAAAAAAAB+BaLPwAAAECDEEZmzbgBr5fc3mfJsCjWPDtL6H8/vf16me121CC09ONyWJZnw0PUvp4qusmRwC6ZKfLDdk8F3Rq41s+yOgQD", - "result_xdr": "AAAAAAAAAAoAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=", - "result_meta_xdr": "AAAAAAAAAAEAAAACAAAAAAACPhoAAAAAAAAAANnXZkzhQIK9tQq7NkV0Ri4YgCsYnGW/yBEchGS/2NpFAAAAF0h26AAAAj4aAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQACPhoAAAAAAAAAAGXNhLrhGtltTwCpmqlarh7s1DB2hIkbP//jgzn4Fos/AABT8kS2c/oAAABBAAAAZwAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA" - }, - { - "_links": { - "account": { - "href": "/accounts/GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K" - }, - "effects": { - "href": "/transactions/90ad6cfc9b0911bdbf202cace78ae7ecf50989c424288670dadb69bf8237c1b3/effects{?cursor,limit,order}", - "templated": true - }, - "ledger": { - "href": "/ledgers/144798" - }, - "operations": { - "href": "/transactions/90ad6cfc9b0911bdbf202cace78ae7ecf50989c424288670dadb69bf8237c1b3/operations{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/transactions?cursor=621902674530304\u0026order=asc" - }, - "self": { - "href": "/transactions/90ad6cfc9b0911bdbf202cace78ae7ecf50989c424288670dadb69bf8237c1b3" - }, - "succeeds": { - "href": "/transactions?cursor=621902674530304\u0026order=desc" - } - }, - "id": "90ad6cfc9b0911bdbf202cace78ae7ecf50989c424288670dadb69bf8237c1b3", - "paging_token": "621902674530304", - "successful": false, - "hash": "90ad6cfc9b0911bdbf202cace78ae7ecf50989c424288670dadb69bf8237c1b3", - "ledger": 144798, - "created_at": "2015-09-24T07:49:38Z", - "account": "GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K", - "account_sequence": 279172874342, - "max_fee": 100, - "fee_charged": 100, - "operation_count": 1, - "envelope_xdr": "AAAAAGXNhLrhGtltTwCpmqlarh7s1DB2hIkbP//jgzn4Fos/AAAACgAAAEEAAABmAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAMPT7P7buwqnMueFS4NV10vE2q3C/mcAy4jx03/RdSGsAAAAXSHboAAAAAAAAAAAB+BaLPwAAAEBPWWMNSWyPBbQlhRheXyvAFDVx1rnf68fdDOUHPdDIkHdUczBpzvCjpdgwhQ2NYOX5ga1ZgOIWLy789YNnuIcL", - "result_xdr": "AAAAAAAAAAoAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=", - "result_meta_xdr": "AAAAAAAAAAEAAAACAAAAAAACNZ4AAAAAAAAAADD0+z+27sKpzLnhUuDVddLxNqtwv5nAMuI8dN/0XUhrAAAAF0h26AAAAjWeAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQACNZ4AAAAAAAAAAGXNhLrhGtltTwCpmqlarh7s1DB2hIkbP//jgzn4Fos/AABUCY0tXAQAAABBAAAAZgAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA" - } - ] - }, - "_links": { - "next": { - "href": "/transactions?order=desc\u0026limit=2\u0026cursor=621902674530304" - }, - "prev": { - "href": "/transactions?order=asc\u0026limit=2\u0026cursor=631231343497216" - }, - "self": { - "href": "/transactions?order=desc\u0026limit=2\u0026cursor=" - } - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#standard-errors). diff --git a/services/horizon/internal/docs/reference/endpoints/transactions-create.md b/services/horizon/internal/docs/reference/endpoints/transactions-create.md deleted file mode 100644 index 1801bb5c12..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/transactions-create.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: Post Transaction -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=transactions&endpoint=create -replacement: https://developers.stellar.org/api/resources/transactions/post/ ---- - -Posts a new [transaction](../resources/transaction.md) to the Stellar Network. -Note that creating a valid transaction and signing it properly is the -responsibility of your client library. - -Transaction submission and the subsequent validation and inclusion into the -Stellar Network's ledger is a [complicated and asynchronous -process](https://www.stellar.org/developers/learn/concepts/transactions.html#life-cycle). -To reduce the complexity, horizon manages these asynchronous processes for the -client and will wait to hear results from the Stellar Network before returning -an HTTP response to a client. - -Transaction submission to horizon aims to be -[idempotent](https://en.wikipedia.org/wiki/Idempotence#Computer_science_meaning): -a client can submit a given transaction to horizon more than once and horizon -will behave the same each time. If the transaction has already been -successfully applied to the ledger, horizon will simply return the saved result -and not attempt to submit the transaction again. Only in cases where a -transaction's status is unknown (and thus will have a chance of being included -into a ledger) will a resubmission to the network occur. - -Information about [building transactions](https://www.stellar.org/developers/js-stellar-base/reference/building-transactions.html) in JavaScript. - -### Timeout - -If you are encountering this error it means that either: - -* Horizon has not received a confirmation from the Core server that the transaction you are trying to submit to the network was included in a ledger in a timely manner or: -* Horizon has not sent a response to a reverse-proxy before in a specified time. - -The former case may happen because there was no room for your transaction in the 3 consecutive ledgers. In such case, Core server removes a transaction from a queue. To solve this you can either: - -* Keep resubmitting the same transaction (with the same sequence number) and wait until it finally is added to a new ledger or: -* Increase the [fee](../../../guides/concepts/fees.html). - -## Request - -``` -POST /transactions -``` - -### Arguments - -| name | loc | notes | example | description | -| ---- | ---- | -------- | ---------------------- | ----------- | -| `tx` | body | required | `AAAAAO`....`f4yDBA==` | Base64 representation of transaction envelope [XDR](../xdr.md) | - - -### curl Example Request - -```sh -curl -X POST \ - -F "tx=AAAAAOo1QK/3upA74NLkdq4Io3DQAQZPi4TVhuDnvCYQTKIVAAAACgAAH8AAAAABAAAAAAAAAAAAAAABAAAAAQAAAADqNUCv97qQO+DS5HauCKNw0AEGT4uE1Ybg57wmEEyiFQAAAAEAAAAAZc2EuuEa2W1PAKmaqVquHuzUMHaEiRs//+ODOfgWiz8AAAAAAAAAAAAAA+gAAAAAAAAAARBMohUAAABAPnnZL8uPlS+c/AM02r4EbxnZuXmP6pQHvSGmxdOb0SzyfDB2jUKjDtL+NC7zcMIyw4NjTa9Ebp4lvONEf4yDBA==" \ - "https://horizon-testnet.stellar.org/transactions" -``` - -## Response - -A successful response (i.e. any response with a successful HTTP response code) -indicates that the transaction was successful and has been included into the -ledger. - -If the transaction failed or errored, then an error response will be returned. Please see the errors section below. - -### Attributes - -The response will include all fields from the [transaction resource](../resources/transaction.md). - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/transactions/264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c" - }, - "account": { - "href": "https://horizon-testnet.stellar.org/accounts/GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR" - }, - "ledger": { - "href": "https://horizon-testnet.stellar.org/ledgers/697121" - }, - "operations": { - "href": "https://horizon-testnet.stellar.org/transactions/264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c/operations{?cursor,limit,order}", - "templated": true - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/transactions/264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/transactions?order=asc&cursor=2994111896358912" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/transactions?order=desc&cursor=2994111896358912" - } - }, - "id": "264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c", - "paging_token": "2994111896358912", - "successful": true, - "hash": "264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c", - "ledger": 697121, - "created_at": "2019-04-09T20:14:25Z", - "source_account": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "fee_account": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "source_account_sequence": "4660039994869", - "fee_charged": 100, - "max_fee": 100, - "operation_count": 1, - "envelope_xdr": "AAAAABB90WssODNIgi6BHveqzxTRmIpvAFRyVNM+Hm2GVuCcAAAAZAAABD0AB031AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAFIMRkFZ9gZifhRSlklQpsz/9P04Earv0dzS3MkIM1cYAAAAXSHboAAAAAAAAAAABhlbgnAAAAEA+biIjrDy8yi+SvhFElIdWGBRYlDscnSSHkPchePy2JYDJn4wvJYDBumXI7/NmttUey3+cGWbBFfnnWh1H5EoD", - "result_xdr": "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=", - "result_meta_xdr": "AAAAAQAAAAIAAAADAAqjIQAAAAAAAAAAEH3Rayw4M0iCLoEe96rPFNGYim8AVHJU0z4ebYZW4JwBOLmYhGq/IAAABD0AB030AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAqjIQAAAAAAAAAAEH3Rayw4M0iCLoEe96rPFNGYim8AVHJU0z4ebYZW4JwBOLmYhGq/IAAABD0AB031AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMACqMhAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uZiEar8gAAAEPQAHTfUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACqMhAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uYE789cgAAAEPQAHTfUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAACqMhAAAAAAAAAAAUgxGQVn2BmJ+FFKWSVCmzP/0/TgRqu/R3NLcyQgzVxgAAABdIdugAAAqjIQAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", - "fee_meta_xdr": "AAAAAgAAAAMACqMgAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uZiEar+EAAAEPQAHTfQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACqMhAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uZiEar8gAAAEPQAHTfQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", - "memo_type": "none", - "signatures": [ - "Pm4iI6w8vMovkr4RRJSHVhgUWJQ7HJ0kh5D3IXj8tiWAyZ+MLyWAwbplyO/zZrbVHst/nBlmwRX551odR+RKAw==" - ] -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard_Errors). -- [transaction_failed](../errors/transaction-failed.md): The transaction failed and could not be applied to the ledger. -- [transaction_malformed](../errors/transaction-malformed.md): The transaction could not be decoded and was not submitted to the network. -- [timeout](../errors/timeout.md): No response from the Core server in a timely manner. Please check "Timeout" section above. diff --git a/services/horizon/internal/docs/reference/endpoints/transactions-for-account.md b/services/horizon/internal/docs/reference/endpoints/transactions-for-account.md deleted file mode 100644 index 375c281698..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/transactions-for-account.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: Transactions for Account -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=transactions&endpoint=for_account -replacement: https://developers.stellar.org/api/resources/accounts/transactions/ ---- - -This endpoint represents successful [transactions](../resources/transaction.md) that affected a -given [account](../resources/account.md). This endpoint can also be used in -[streaming](../streaming.md) mode so it is possible to use it to listen for new transactions that -affect a given account as they get made in the Stellar network. - -If called in streaming mode Horizon will start at the earliest known transaction unless a `cursor` -is set. In that case it will start from the `cursor`. You can also set `cursor` value to `now` to -only stream transaction created since your request time. - -## Request - -``` -GET /accounts/{account_id}/transactions{?cursor,limit,order,include_failed} -``` - -### Arguments - -| name | notes | description | example | -| ---- | ----- | ----------- | ------- | -| `account_id` | required, string | ID of an account | GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K | -| `?cursor` | optional, any, default _null_ | A paging token, specifying where to start returning records from. When streaming this can be set to `now` to stream object created since your request time. | 12884905984 | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default: `10` | Maximum number of records to return. | `200` | -| `?include_failed` | optional, bool, default: `false` | Set to `true` to include failed transactions in results. | `true` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/accounts/GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K/transactions?limit=1" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.transactions() - .forAccount("GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K") - .call() - .then(function (accountResult) { - console.log(accountResult); - }) - .catch(function (err) { - console.error(err); - }) -``` - -### JavaScript Streaming Example - -```javascript -var StellarSdk = require('stellar-sdk') -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -var txHandler = function (txResponse) { - console.log(txResponse); -}; - -var es = server.transactions() - .forAccount("GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K") - .cursor('now') - .stream({ - onmessage: txHandler - }) -``` - -## Response - -This endpoint responds with a list of transactions that changed a given account's state. See -[transaction resource](../resources/transaction.md) for reference. - -### Example Response -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/accounts/GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF/payments?cursor=&limit=10&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/accounts/GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF/payments?cursor=2714719978786817&limit=10&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/accounts/GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF/payments?cursor=1919197546291201&limit=10&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201" - }, - "transaction": { - "href": "https://horizon-testnet.stellar.org/transactions/7e2050abc676003efc3eaadd623c927f753b7a6c37f50864bf284f4e1510d088" - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/operations/1919197546291201/effects" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=1919197546291201" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=1919197546291201" - } - }, - "id": "1919197546291201", - "paging_token": "1919197546291201", - "transaction_successful": true, - "source_account": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "type": "create_account", - "type_i": 0, - "created_at": "2019-03-25T22:43:38Z", - "transaction_hash": "7e2050abc676003efc3eaadd623c927f753b7a6c37f50864bf284f4e1510d088", - "starting_balance": "10000.0000000", - "funder": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "account": "GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF" - }, - { - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/operations/2714719978786817" - }, - "transaction": { - "href": "https://horizon-testnet.stellar.org/transactions/7cea6abe90654578b42ee696e823187d89d91daa157a1077b542ee7c77413ce3" - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/operations/2714719978786817/effects" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/effects?order=desc&cursor=2714719978786817" - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/effects?order=asc&cursor=2714719978786817" - } - }, - "id": "2714719978786817", - "paging_token": "2714719978786817", - "transaction_successful": true, - "source_account": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR", - "type": "payment", - "type_i": 1, - "created_at": "2019-04-05T23:07:42Z", - "transaction_hash": "7cea6abe90654578b42ee696e823187d89d91daa157a1077b542ee7c77413ce3", - "asset_type": "credit_alphanum4", - "asset_code": "FOO", - "asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR", - "from": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR", - "to": "GBYUUJHG6F4EPJGNLERINATVQLNDOFRUD7SGJZ26YZLG5PAYLG7XUSGF", - "amount": "1000000.0000000" - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no account whose ID matches the `account_id` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/transactions-for-ledger.md b/services/horizon/internal/docs/reference/endpoints/transactions-for-ledger.md deleted file mode 100644 index 7f1f5e4693..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/transactions-for-ledger.md +++ /dev/null @@ -1,222 +0,0 @@ ---- -title: Transactions for Ledger -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=transactions&endpoint=for_ledger -replacement: https://developers.stellar.org/api/resources/ledgers/transactions/ ---- - -This endpoint represents successful [transactions](../resources/transaction.md) in a given [ledger](../resources/ledger.md). - -## Request - -``` -GET /ledgers/{id}/transactions{?cursor,limit,order,include_failed} -``` - -### Arguments - -| name | notes | description | example | -| ------ | ------- | ----------- | ------- | -| `id` | required, number | Ledger ID | `697121` | -| `?cursor` | optional, default _null_ | A paging token, specifying where to start returning records from. | `12884905984` | -| `?order` | optional, string, default `asc` | The order in which to return rows, "asc" or "desc". | `asc` | -| `?limit` | optional, number, default `10` | Maximum number of records to return. | `200` | -| `?include_failed` | optional, bool, default: `false` | Set to `true` to include failed transactions in results. | `true` | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/ledgers/697121/transactions?limit=1" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.transactions() - .forLedger("697121") - .limit("1") - .call() - .then(function (accountResults) { - console.log(accountResults.records) - }) - .catch(function (err) { - console.log(err) - }) -``` - -## Response - -This endpoint responds with a list of transactions in a given ledger. See [transaction -resource](../resources/transaction.md) for reference. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/ledgers/697121/transactions?cursor=&limit=10&order=asc" - }, - "next": { - "href": "https://horizon-testnet.stellar.org/ledgers/697121/transactions?cursor=2994111896367104&limit=10&order=asc" - }, - "prev": { - "href": "https://horizon-testnet.stellar.org/ledgers/697121/transactions?cursor=2994111896358912&limit=10&order=desc" - } - }, - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/transactions/264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c" - }, - "account": { - "href": "https://horizon-testnet.stellar.org/accounts/GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR" - }, - "ledger": { - "href": "https://horizon-testnet.stellar.org/ledgers/697121" - }, - "operations": { - "href": "https://horizon-testnet.stellar.org/transactions/264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c/operations{?cursor,limit,order}", - "templated": true - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/transactions/264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/transactions?order=asc&cursor=2994111896358912" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/transactions?order=desc&cursor=2994111896358912" - } - }, - "id": "264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c", - "paging_token": "2994111896358912", - "successful": true, - "hash": "264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c", - "ledger": 697121, - "created_at": "2019-04-09T20:14:25Z", - "source_account": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "source_account_sequence": "4660039994869", - "fee_charged": 100, - "max_fee": 100, - "operation_count": 1, - "envelope_xdr": "AAAAABB90WssODNIgi6BHveqzxTRmIpvAFRyVNM+Hm2GVuCcAAAAZAAABD0AB031AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAFIMRkFZ9gZifhRSlklQpsz/9P04Earv0dzS3MkIM1cYAAAAXSHboAAAAAAAAAAABhlbgnAAAAEA+biIjrDy8yi+SvhFElIdWGBRYlDscnSSHkPchePy2JYDJn4wvJYDBumXI7/NmttUey3+cGWbBFfnnWh1H5EoD", - "result_xdr": "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=", - "result_meta_xdr": "AAAAAQAAAAIAAAADAAqjIQAAAAAAAAAAEH3Rayw4M0iCLoEe96rPFNGYim8AVHJU0z4ebYZW4JwBOLmYhGq/IAAABD0AB030AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAqjIQAAAAAAAAAAEH3Rayw4M0iCLoEe96rPFNGYim8AVHJU0z4ebYZW4JwBOLmYhGq/IAAABD0AB031AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMACqMhAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uZiEar8gAAAEPQAHTfUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACqMhAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uYE789cgAAAEPQAHTfUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAACqMhAAAAAAAAAAAUgxGQVn2BmJ+FFKWSVCmzP/0/TgRqu/R3NLcyQgzVxgAAABdIdugAAAqjIQAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", - "fee_meta_xdr": "AAAAAgAAAAMACqMgAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uZiEar+EAAAEPQAHTfQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACqMhAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uZiEar8gAAAEPQAHTfQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", - "memo_type": "none", - "signatures": [ - "Pm4iI6w8vMovkr4RRJSHVhgUWJQ7HJ0kh5D3IXj8tiWAyZ+MLyWAwbplyO/zZrbVHst/nBlmwRX551odR+RKAw==" - ] - }, - { - "memo": "2A1V6J5703G47XHY", - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/transactions/f175108e5c64619705b112a99fa32884dfa0511d9a8986aade87905b08eabe5b" - }, - "account": { - "href": "https://horizon-testnet.stellar.org/accounts/GAZ4A54KE6MTMXYEPM7T3IDLZWGNCCKB5ME422NZ3MAMTHWWP37RPEBW" - }, - "ledger": { - "href": "https://horizon-testnet.stellar.org/ledgers/697121" - }, - "operations": { - "href": "https://horizon-testnet.stellar.org/transactions/f175108e5c64619705b112a99fa32884dfa0511d9a8986aade87905b08eabe5b/operations{?cursor,limit,order}", - "templated": true - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/transactions/f175108e5c64619705b112a99fa32884dfa0511d9a8986aade87905b08eabe5b/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/transactions?order=asc&cursor=2994111896363008" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/transactions?order=desc&cursor=2994111896363008" - } - }, - "id": "f175108e5c64619705b112a99fa32884dfa0511d9a8986aade87905b08eabe5b", - "paging_token": "2994111896363008", - "successful": true, - "hash": "f175108e5c64619705b112a99fa32884dfa0511d9a8986aade87905b08eabe5b", - "ledger": 697121, - "created_at": "2019-04-09T20:14:25Z", - "source_account": "GAZ4A54KE6MTMXYEPM7T3IDLZWGNCCKB5ME422NZ3MAMTHWWP37RPEBW", - "source_account_sequence": "2994107601387521", - "fee_charged": 100, - "max_fee": 100, - "operation_count": 1, - "envelope_xdr": "AAAAADPAd4onmTZfBHs/PaBrzYzRCUHrCc1pudsAyZ7Wfv8XAAAAZAAKoyAAAAABAAAAAAAAAAEAAAAQMkExVjZKNTcwM0c0N1hIWQAAAAEAAAABAAAAADPAd4onmTZfBHs/PaBrzYzRCUHrCc1pudsAyZ7Wfv8XAAAAAQAAAADMSEvcRKXsaUNna++Hy7gWm/CfqTjEA7xoGypfrFGUHAAAAAAAAAAAhFKDAAAAAAAAAAAB1n7/FwAAAEBJdXuYg13Glzx1RinVCXd/cc1usrhU/0f5HFZ7lyIR8kS3T6PRrW78TQDNqXz+ukUiPwlB1A8MqxoW/SAL5FIB", - "result_xdr": "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=", - "result_meta_xdr": "AAAAAQAAAAIAAAADAAqjIQAAAAAAAAAAM8B3iieZNl8Eez89oGvNjNEJQesJzWm52wDJntZ+/xcAAAAXSHbnnAAKoyAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAqjIQAAAAAAAAAAM8B3iieZNl8Eez89oGvNjNEJQesJzWm52wDJntZ+/xcAAAAXSHbnnAAKoyAAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMACqMgAAAAAAAAAADMSEvcRKXsaUNna++Hy7gWm/CfqTjEA7xoGypfrFGUHAAAAANViducAABeBgAAoRQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACqMhAAAAAAAAAADMSEvcRKXsaUNna++Hy7gWm/CfqTjEA7xoGypfrFGUHAAAAAPZ3F6cAABeBgAAoRQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAMACqMhAAAAAAAAAAAzwHeKJ5k2XwR7Pz2ga82M0QlB6wnNabnbAMme1n7/FwAAABdIduecAAqjIAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACqMhAAAAAAAAAAAzwHeKJ5k2XwR7Pz2ga82M0QlB6wnNabnbAMme1n7/FwAAABbEJGScAAqjIAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", - "fee_meta_xdr": "AAAAAgAAAAMACqMgAAAAAAAAAAAzwHeKJ5k2XwR7Pz2ga82M0QlB6wnNabnbAMme1n7/FwAAABdIdugAAAqjIAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACqMhAAAAAAAAAAAzwHeKJ5k2XwR7Pz2ga82M0QlB6wnNabnbAMme1n7/FwAAABdIduecAAqjIAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", - "memo_type": "text", - "signatures": [ - "SXV7mINdxpc8dUYp1Ql3f3HNbrK4VP9H+RxWe5ciEfJEt0+j0a1u/E0Azal8/rpFIj8JQdQPDKsaFv0gC+RSAQ==" - ] - }, - { - "memo": "WHALE", - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/transactions/83b6ebf4b3aec5b36cab14ae0f438a23487746857903a9e0bb002564b4641e25" - }, - "account": { - "href": "https://horizon-testnet.stellar.org/accounts/GABRMXDIJCTDSMPC67J64NSAMWRSYXVCXYTXVFC73DTHBKELHNKWANXP" - }, - "ledger": { - "href": "https://horizon-testnet.stellar.org/ledgers/697121" - }, - "operations": { - "href": "https://horizon-testnet.stellar.org/transactions/83b6ebf4b3aec5b36cab14ae0f438a23487746857903a9e0bb002564b4641e25/operations{?cursor,limit,order}", - "templated": true - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/transactions/83b6ebf4b3aec5b36cab14ae0f438a23487746857903a9e0bb002564b4641e25/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/transactions?order=asc&cursor=2994111896367104" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/transactions?order=desc&cursor=2994111896367104" - } - }, - "id": "83b6ebf4b3aec5b36cab14ae0f438a23487746857903a9e0bb002564b4641e25", - "paging_token": "2994111896367104", - "successful": true, - "hash": "83b6ebf4b3aec5b36cab14ae0f438a23487746857903a9e0bb002564b4641e25", - "ledger": 697121, - "created_at": "2019-04-09T20:14:25Z", - "source_account": "GABRMXDIJCTDSMPC67J64NSAMWRSYXVCXYTXVFC73DTHBKELHNKWANXP", - "source_account_sequence": "122518237256298", - "fee_charged": 100, - "max_fee": 100, - "operation_count": 1, - "envelope_xdr": "AAAAAAMWXGhIpjkx4vfT7jZAZaMsXqK+J3qUX9jmcKiLO1VgAAAAZAAAb24AAppqAAAAAQAAAAAAAAAAAAAAAFys/kkAAAABAAAABVdIQUxFAAAAAAAAAQAAAAAAAAAAAAAAAKrN4k6edFMb0WEyPzEEjWUAji0pvvALw+BAH4OnekA5AAAAAAcnDgAAAAAAAAAAAYs7VWAAAABAYd9uIm+TjIcAjTU90YJoNg/r+6PU3Uss7ewUb1w3yMa+HyoSvDq8sDz/SYmDBH7F+0ACIeBF4kkVEKVBJMh0AQ==", - "result_xdr": "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=", - "result_meta_xdr": "AAAAAQAAAAIAAAADAAqjIQAAAAAAAAAAAxZcaEimOTHi99PuNkBloyxeor4nepRf2OZwqIs7VWAAJBMYWVFGqAAAb24AApppAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAqjIQAAAAAAAAAAAxZcaEimOTHi99PuNkBloyxeor4nepRf2OZwqIs7VWAAJBMYWVFGqAAAb24AAppqAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMACqMhAAAAAAAAAAADFlxoSKY5MeL30+42QGWjLF6ivid6lF/Y5nCoiztVYAAkExhZUUaoAABvbgACmmoAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACqMhAAAAAAAAAAADFlxoSKY5MeL30+42QGWjLF6ivid6lF/Y5nCoiztVYAAkExhSKjioAABvbgACmmoAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAACqMhAAAAAAAAAACqzeJOnnRTG9FhMj8xBI1lAI4tKb7wC8PgQB+Dp3pAOQAAAAAHJw4AAAqjIQAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", - "fee_meta_xdr": "AAAAAgAAAAMACqMfAAAAAAAAAAADFlxoSKY5MeL30+42QGWjLF6ivid6lF/Y5nCoiztVYAAkExhZUUcMAABvbgACmmkAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACqMhAAAAAAAAAAADFlxoSKY5MeL30+42QGWjLF6ivid6lF/Y5nCoiztVYAAkExhZUUaoAABvbgACmmkAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", - "memo_type": "text", - "signatures": [ - "Yd9uIm+TjIcAjTU90YJoNg/r+6PU3Uss7ewUb1w3yMa+HyoSvDq8sDz/SYmDBH7F+0ACIeBF4kkVEKVBJMh0AQ==" - ], - "valid_after": "1970-01-01T00:00:00Z", - "valid_before": "2019-04-09T20:19:21Z" - } - ] - } -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no ledgers whose sequence matches the `id` argument. diff --git a/services/horizon/internal/docs/reference/endpoints/transactions-single.md b/services/horizon/internal/docs/reference/endpoints/transactions-single.md deleted file mode 100644 index 99aa29e376..0000000000 --- a/services/horizon/internal/docs/reference/endpoints/transactions-single.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: Transaction Details -clientData: - laboratoryUrl: https://www.stellar.org/laboratory/#explorer?resource=transactions&endpoint=single -replacement: https://developers.stellar.org/api/resources/transactions/single/ ---- - -The transaction details endpoint provides information on a single -[transaction](../resources/transaction.md). The transaction hash provided in the `hash` argument -specifies which transaction to load. - -### Warning - failed transactions - -Transaction can be successful or failed (failed transactions are also included in Stellar ledger). -Always check it's status using `successful` field! - -## Request - -``` -GET /transactions/{hash} -``` - -### Arguments - -| name | notes | description | example | -| ------ | ------- | ----------- | ------- | -| `hash` | required, string | A transaction hash, hex-encoded, lowercase. | 264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c | - -### curl Example Request - -```sh -curl "https://horizon-testnet.stellar.org/transactions/264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c" -``` - -### JavaScript Example Request - -```javascript -var StellarSdk = require('stellar-sdk'); -var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); - -server.transactions() - .transaction("264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c") - .call() - .then(function (transactionResult) { - console.log(transactionResult) - }) - .catch(function (err) { - console.log(err) - }) -``` - -## Response - -This endpoint responds with a single Transaction. See [transaction resource](../resources/transaction.md) for reference. - -### Example Response - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/transactions/264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c" - }, - "account": { - "href": "https://horizon-testnet.stellar.org/accounts/GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR" - }, - "ledger": { - "href": "https://horizon-testnet.stellar.org/ledgers/697121" - }, - "operations": { - "href": "https://horizon-testnet.stellar.org/transactions/264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c/operations{?cursor,limit,order}", - "templated": true - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/transactions/264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/transactions?order=asc&cursor=2994111896358912" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/transactions?order=desc&cursor=2994111896358912" - } - }, - "id": "264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c", - "paging_token": "2994111896358912", - "successful": true, - "hash": "264226cb06af3b86299031884175155e67a02e0a8ad0b3ab3a88b409a8c09d5c", - "ledger": 697121, - "created_at": "2019-04-09T20:14:25Z", - "source_account": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "fee_account": "GAIH3ULLFQ4DGSECF2AR555KZ4KNDGEKN4AFI4SU2M7B43MGK3QJZNSR", - "source_account_sequence": "4660039994869", - "fee_charged": 100, - "max_fee": 100, - "operation_count": 1, - "envelope_xdr": "AAAAABB90WssODNIgi6BHveqzxTRmIpvAFRyVNM+Hm2GVuCcAAAAZAAABD0AB031AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAFIMRkFZ9gZifhRSlklQpsz/9P04Earv0dzS3MkIM1cYAAAAXSHboAAAAAAAAAAABhlbgnAAAAEA+biIjrDy8yi+SvhFElIdWGBRYlDscnSSHkPchePy2JYDJn4wvJYDBumXI7/NmttUey3+cGWbBFfnnWh1H5EoD", - "result_xdr": "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=", - "result_meta_xdr": "AAAAAQAAAAIAAAADAAqjIQAAAAAAAAAAEH3Rayw4M0iCLoEe96rPFNGYim8AVHJU0z4ebYZW4JwBOLmYhGq/IAAABD0AB030AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAqjIQAAAAAAAAAAEH3Rayw4M0iCLoEe96rPFNGYim8AVHJU0z4ebYZW4JwBOLmYhGq/IAAABD0AB031AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMACqMhAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uZiEar8gAAAEPQAHTfUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACqMhAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uYE789cgAAAEPQAHTfUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAACqMhAAAAAAAAAAAUgxGQVn2BmJ+FFKWSVCmzP/0/TgRqu/R3NLcyQgzVxgAAABdIdugAAAqjIQAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", - "fee_meta_xdr": "AAAAAgAAAAMACqMgAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uZiEar+EAAAEPQAHTfQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACqMhAAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAE4uZiEar8gAAAEPQAHTfQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", - "memo_type": "none", - "signatures": [ - "Pm4iI6w8vMovkr4RRJSHVhgUWJQ7HJ0kh5D3IXj8tiWAyZ+MLyWAwbplyO/zZrbVHst/nBlmwRX551odR+RKAw==" - ] -} -``` - -## Possible Errors - -- The [standard errors](../errors.md#Standard-Errors). -- [not_found](../errors/not-found.md): A `not_found` error will be returned if there is no - transaction whose ID matches the `hash` argument. diff --git a/services/horizon/internal/docs/reference/errors.md b/services/horizon/internal/docs/reference/errors.md deleted file mode 100644 index f95a922a4e..0000000000 --- a/services/horizon/internal/docs/reference/errors.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Errors -replacement: https://developers.stellar.org/api/errors/ ---- - -In the event that an error occurs while processing a request to horizon, an -**error** response will be returned to the client. This error response will -contain information detailing why the request couldn't complete successfully. - -Like HAL for successful responses, horizon uses a standard to specify how we -communicate errors to the client. Specifically, horizon uses the [Problem -Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) draft specification. The specification is short, so we recommend -you read it. In summary, when an error occurs on the server we respond with a -json document with the following attributes: - -| name | type | description | -| -------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -| type | url | The identifier for the error, expressed as a url. Visiting the url in a web browser will redirect you to the additional documentation for the problem. | -| title | string | A short title describing the error. | -| status | number | An HTTP status code that maps to the error. An error that is triggered due to client input will be in the 400-499 range of status code, for example. | -| detail | string | A longer description of the error meant the further explain the error to developers. | -| instance | string | A token that uniquely identifies this request. Allows server administrators to correlate a client report with server log files | - - -## Standard Errors - -There are a set of errors that can occur in any request to horizon which we -call **standard errors**. These errors are: - -- [Server Error](../reference/errors/server-error.md) -- [Rate Limit Exceeded](../reference/errors/rate-limit-exceeded.md) -- [Forbidden](../reference/errors/forbidden.md) diff --git a/services/horizon/internal/docs/reference/errors/bad-request.md b/services/horizon/internal/docs/reference/errors/bad-request.md deleted file mode 100644 index 56cf369136..0000000000 --- a/services/horizon/internal/docs/reference/errors/bad-request.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Bad Request -replacement: https://developers.stellar.org/api/errors/http-status-codes/standard/ ---- - -If Horizon cannot understand a request due to invalid parameters, it will return a `bad_request` -error. This is analogous to the -[HTTP 400 Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes). - -If you are encountering this error, check the `invalid_field` attribute on the `extras` object to -see what field is triggering the error. - -## Attributes - -As with all errors Horizon returns, `bad_request` follows the -[Problem Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) -draft specification guide and thus has the following attributes: - -| Attribute | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `type` | URL | The identifier for the error. This is a URL that can be visited in the browser.| -| `title` | String | A short title describing the error. | -| `status` | Number | An HTTP status code that maps to the error. | -| `detail` | String | A more detailed description of the error. | - -## Example - -```shell -$ curl -X GET "https://horizon-testnet.stellar.org/ledgers?limit=invalidlimit" -{ - "type": "https://stellar.org/horizon-errors/bad_request", - "title": "Bad Request", - "status": 400, - "detail": "The request you sent was invalid in some way", - "extras": { - "invalid_field": "limit", - "reason": "unparseable value" - } -} -``` - -## Related - -- [Malformed Transaction](./transaction-malformed.md) diff --git a/services/horizon/internal/docs/reference/errors/before-history.md b/services/horizon/internal/docs/reference/errors/before-history.md deleted file mode 100644 index 2e1dd7cc68..0000000000 --- a/services/horizon/internal/docs/reference/errors/before-history.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Before History -replacement: https://developers.stellar.org/api/errors/http-status-codes/horizon-specific/ ---- - -A horizon server may be configured to only keep a portion of the stellar network's history stored -within its database. This error will be returned when a client requests a piece of information -(such as a page of transactions or a single operation) that the server can positively identify as -falling outside the range of recorded history. - -This error returns a -[HTTP 410 Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes). - -## Attributes - -As with all errors Horizon returns, `before_history` follows the -[Problem Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) -draft specification guide and thus has the following attributes: - -| Attribute | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `type` | URL | The identifier for the error. This is a URL that can be visited in the browser.| -| `title` | String | A short title describing the error. | -| `status` | Number | An HTTP status code that maps to the error. | -| `detail` | String | A more detailed description of the error. | - -## Example - -```shell -$ curl -X GET "https://horizon-testnet.stellar.org/transactions?cursor=1&order=desc" -{ - "type": "https://stellar.org/horizon-errors/before_history", - "title": "Data Requested Is Before Recorded History", - "status": 410, - "detail": "This horizon instance is configured to only track a portion of the stellar network's latest history. This request is asking for results prior to the recorded history known to this horizon instance." -} -``` - -## Related - -- [Not Found](./not-found.md) diff --git a/services/horizon/internal/docs/reference/errors/not-acceptable.md b/services/horizon/internal/docs/reference/errors/not-acceptable.md deleted file mode 100644 index d58305492a..0000000000 --- a/services/horizon/internal/docs/reference/errors/not-acceptable.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Not Acceptable -replacement: https://developers.stellar.org/api/errors/http-status-codes/standard/ ---- - -When your client only accepts certain formats of data from Horizon and Horizon cannot fulfill that -request, Horizon will return a `not_acceptable` error. This is analogous to a -[HTTP 406 Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes). - -For example, if your client only accepts an XML response (`Accept: application/xml`), Horizon will -respond with a `not_acceptable` error. - -If you are encountering this error, please check to make sure the criteria for content you’ll -accept is correct. - -## Attributes - -As with all errors Horizon returns, `not_acceptable` follows the -[Problem Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) -draft specification guide and thus has the following attributes: - -| Attribute | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `type` | URL | The identifier for the error. This is a URL that can be visited in the browser.| -| `title` | String | A short title describing the error. | -| `status` | Number | An HTTP status code that maps to the error. | -| `detail` | String | A more detailed description of the error. | - -## Example - -```shell -$ curl -X GET -H "Accept: application/xml" "https://horizon-testnet.stellar.org/accounts/GALWEV6GY73RJ255JC7XUOZ2L7WZ5JJDTKATB2MUK7F3S67DVT2A6R5G" -{ - "type": "https://stellar.org/horizon-errors/not_acceptable", - "title": "An acceptable response content-type could not be provided for this request", - "status": 406 -} -``` - -## Related - -- [Not Found](./not-found.md) diff --git a/services/horizon/internal/docs/reference/errors/not-found.md b/services/horizon/internal/docs/reference/errors/not-found.md deleted file mode 100644 index f431b5eef2..0000000000 --- a/services/horizon/internal/docs/reference/errors/not-found.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: Not Found -replacement: https://developers.stellar.org/api/errors/http-status-codes/standard/ ---- - -When Horizon can't find whatever data you are requesting, it will return a `not_found` error. This -is similar to a -[HTTP 404 Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes) error -response. - -Incorrect URL path parameters or missing data are the common reasons for this error. If you -navigate using a link from a valid response, you should never receive this error message. - -## Attributes - -As with all errors Horizon returns, `not_found` follows the -[Problem Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) -draft specification guide and thus has the following attributes: - -| Attribute | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `type` | URL | The identifier for the error. This is a URL that can be visited in the browser.| -| `title` | String | A short title describing the error. | -| `status` | Number | An HTTP status code that maps to the error. | -| `detail` | String | A more detailed description of the error. | - -## Example - -```shell -$ curl -X GET "https://horizon-testnet.stellar.org/accounts/accountthatdoesntexist" -{ - "type": "https://stellar.org/horizon-errors/bad_request", - "title": "Bad Request", - "status": 400, - "detail": "The request you sent was invalid in some way", - "extras": { - "invalid_field": "account_id", - "reason": "invalid address" - } -} -``` - -## Related - -- [Not Acceptable](./not-acceptable.md) diff --git a/services/horizon/internal/docs/reference/errors/not-implemented.md b/services/horizon/internal/docs/reference/errors/not-implemented.md deleted file mode 100644 index 41d1852ede..0000000000 --- a/services/horizon/internal/docs/reference/errors/not-implemented.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Not Implemented -replacement: https://developers.stellar.org/api/errors/http-status-codes/standard/ ---- - -If your [request method](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html) is not supported by -Horizon, Horizon will return a `not_implemented` error. Likewise, if functionality that is intended -but does not exist (thus reserving the endpoint for future use), it will also return a -`not_implemented` error. This is analogous to a -[HTTP 501 Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes). - -If you are encountering this error, Horizon does not have the functionality you are requesting. - -## Attributes - -As with all errors Horizon returns, `not_implemented` follows the -[Problem Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) -draft specification guide and thus has the following attributes: - -| Attribute | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `type` | URL | The identifier for the error. This is a URL that can be visited in the browser.| -| `title` | String | A short title describing the error. | -| `status` | Number | An HTTP status code that maps to the error. | -| `detail` | String | A more detailed description of the error. | - -## Example - -```shell -$ curl -X GET "https://horizon-testnet.stellar.org/offers/1234" -{ - "type": "https://stellar.org/horizon-errors/not_implemented", - "title": "Resource Not Yet Implemented", - "status": 404, - "detail": "While the requested URL is expected to eventually point to a valid resource, the work to implement the resource has not yet been completed." -} -``` - -## Related - -- [Server Error](./server-error.md) diff --git a/services/horizon/internal/docs/reference/errors/rate-limit-exceeded.md b/services/horizon/internal/docs/reference/errors/rate-limit-exceeded.md deleted file mode 100644 index 1a6399466e..0000000000 --- a/services/horizon/internal/docs/reference/errors/rate-limit-exceeded.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Rate Limit Exceeded -replacement: https://developers.stellar.org/api/errors/http-status-codes/standard/ ---- - -When a single user makes too many requests to Horizon in a one hour time frame, Horizon returns a -`rate_limit_exceeded` error. By default, Horizon allows 3600 requests per hour -- an average of one -request per second. This is analogous to a -[HTTP 429 Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes). - -If you are encountering this error, please reduce your request speed. Here are some strategies for -doing so: -* For collection endpoints, try specifying larger page sizes. -* Try streaming responses to watch for new data instead of pulling data every time. -* Cache immutable data, such as transaction details, locally. - -See the [Rate Limiting Guide](../../reference/rate-limiting.md) for more info. - -## Attributes - -As with all errors Horizon returns, `rate_limit_exceeded` follows the -[Problem Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) -draft specification guide and thus has the following attributes: - -| Attribute | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `type` | URL | The identifier for the error. This is a URL that can be visited in the browser.| -| `title` | String | A short title describing the error. | -| `status` | Number | An HTTP status code that maps to the error. | -| `detail` | String | A more detailed description of the error. | - -## Example - -```json -{ - "type": "https://stellar.org/horizon-errors/rate_limit_exceeded", - "title": "Rate Limit Exceeded", - "status": 429, - "details": "The rate limit for the requesting IP address is over its alloted limit. The allowed limit and requests left per time period are communicated to clients via the http response headers 'X-RateLimit-*' headers." -} -``` diff --git a/services/horizon/internal/docs/reference/errors/server-error.md b/services/horizon/internal/docs/reference/errors/server-error.md deleted file mode 100644 index 7fe88bef91..0000000000 --- a/services/horizon/internal/docs/reference/errors/server-error.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Internal Server Error -replacement: https://developers.stellar.org/api/errors/http-status-codes/standard/ ---- - -If there's an internal error within Horizon, Horizon will return a -`server_error` response. This response is a catch-all, and can refer to many -possible errors in the Horizon server: a configuration mistake, a database -connection error, etc. This is analogous to a -[HTTP 500 Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes). - -Horizon does not expose information such as stack traces or raw error messages -to a client, as doing so may reveal sensitive configuration data such as secret -keys. If you are encountering this error on a server you control, please check the -Horizon log files for more details. The logs should contain detailed -information to help you discover the root issue. - -If you are encountering this error on the public Stellar infrastructure, please -report an error on [Horizon's issue tracker](https://github.com/stellar/go/issues) -and include as much information about the request that triggered the response -as you can (especially the time of the request). - -## Attributes - -As with all errors Horizon returns, `server_error` follows the -[Problem Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) -draft specification guide and thus has the following attributes: - -| Attribute | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `type` | URL | The identifier for the error. This is a URL that can be visited in the browser.| -| `title` | String | A short title describing the error. | -| `status` | Number | An HTTP status code that maps to the error. | -| `detail` | String | A more detailed description of the error. | - -## Examples -```json -{ - "type": "https://stellar.org/horizon-errors/server_error", - "title": "Internal Server Error", - "status": 500, - "details": "An error occurred while processing this request. This is usually due to a bug within the server software. Trying this request again may succeed if the bug is transient, otherwise please report this issue to the issue tracker at: https://github.com/stellar/go/issues. Please include this response in your issue." -} -``` - -## Related - -- [Not Implemented](./not-implemented.md) diff --git a/services/horizon/internal/docs/reference/errors/stale-history.md b/services/horizon/internal/docs/reference/errors/stale-history.md deleted file mode 100644 index 041ef11723..0000000000 --- a/services/horizon/internal/docs/reference/errors/stale-history.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Stale History -replacement: https://developers.stellar.org/api/errors/http-status-codes/horizon-specific/ ---- - -A horizon server may be configured to reject historical requests when the history is known to be -further out of date than the configured threshold. In such cases, this error is returned. To -resolve this error (provided you are the horizon instance's operator) please ensure that the -ingestion system is running correctly and importing new ledgers. This error returns a -[HTTP 503 Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes). - -## Attributes - -As with all errors Horizon returns, `stale_history` follows the -[Problem Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) -draft specification guide and thus has the following attributes: - -| Attribute | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `type` | URL | The identifier for the error. This is a URL that can be visited in the browser.| -| `title` | String | A short title describing the error. | -| `status` | Number | An HTTP status code that maps to the error. | -| `detail` | String | A more detailed description of the error. | - -## Example - -```json -{ - - "type": "https://stellar.org/horizon-errors/stale_history", - "title": "Historical DB Is Too Stale", - "status": 503, - "detail": "This horizon instance is configured to reject client requests when it can determine that the history database is lagging too far behind the connected instance of stellar-core. If you operate this server, please ensure that the ingestion system is properly running." -} -``` - -## Related - -- [Internal Server Error](./server-error.md) diff --git a/services/horizon/internal/docs/reference/errors/timeout.md b/services/horizon/internal/docs/reference/errors/timeout.md deleted file mode 100644 index dca8cf4d64..0000000000 --- a/services/horizon/internal/docs/reference/errors/timeout.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: Timeout -replacement: https://developers.stellar.org/api/errors/http-status-codes/horizon-specific/ ---- - -If you are encountering this error it means that either: - -* Horizon has not received a confirmation from the Stellar Core server that the transaction you are - trying to submit to the network was included in a ledger in a timely manner. -* Horizon has not sent a response to a reverse-proxy before a specified amount of time has elapsed. - -The former case may happen because there was no room for your transaction for 3 consecutive -ledgers. This is because Stellar Core removes each submitted transaction from a queue. To solve -this you can: - -* Keep resubmitting the same transaction (with the same sequence number) and wait until it finally - is added to a new ledger. -* Increase the [fee](../../../guides/concepts/fees.md) in order to prioritize the transaction. - -This error returns a -[HTTP 504 Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes). - -## Attributes - -As with all errors Horizon returns, `timeout` follows the -[Problem Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) -draft specification guide and thus has the following attributes: - -| Attribute | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `type` | URL | The identifier for the error. This is a URL that can be visited in the browser.| -| `title` | String | A short title describing the error. | -| `status` | Number | An HTTP status code that maps to the error. | -| `detail` | String | A more detailed description of the error. | - -## Example -```json -{ - "type": "https://stellar.org/horizon-errors/timeout", - "title": "Timeout", - "status": 504, - "detail": "Your request timed out before completing. Please try your request again. If you are submitting a transaction make sure you are sending exactly the same transaction (with the same sequence number)." -} -``` - -## Related - -- [Not Acceptable](./not-acceptable.md) -- [Transaction Failed](./transaction-failed.md) diff --git a/services/horizon/internal/docs/reference/errors/transaction-failed.md b/services/horizon/internal/docs/reference/errors/transaction-failed.md deleted file mode 100644 index fa84178d3a..0000000000 --- a/services/horizon/internal/docs/reference/errors/transaction-failed.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Transaction Failed -replacement: https://developers.stellar.org/api/errors/http-status-codes/horizon-specific/ ---- - -The `transaction_failed` error occurs when a client submits a transaction that was well-formed but -was not included into the ledger due to some other failure. For example, a transaction may fail if: - -- The source account for transaction cannot pay the minimum fee. -- The sequence number is incorrect. -- One of the contained operations has failed such as a payment operation that overdraws on the - paying account. - -In almost every case, this error indicates that the transaction submitted in the initial request -will never succeed. There is one exception: a transaction that fails with the `tx_bad_seq` result -code (as expressed in the `result_code` field of the error) may become valid in the future if the -sequence number it used was too high. - -This error returns a -[HTTP 400 Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes). - -## Attributes - -As with all errors Horizon returns, `transaction_failed` follows the -[Problem Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) -draft specification guide and thus has the following attributes: - -| Attribute | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `type` | URL | The identifier for the error. This is a URL that can be visited in the browser.| -| `title` | String | A short title describing the error. | -| `status` | Number | An HTTP status code that maps to the error. | -| `detail` | String | A more detailed description of the error. | - -In addition, the following additional data is provided in the `extras` field of the error: - -| Attribute | Type | Description | -|----------------------------|--------|-----------------------------------------------------------------------------------------------------------------------------| -| `envelope_xdr` | String | A base64-encoded representation of the TransactionEnvelope XDR whose failure triggered this response. | -| `result_xdr` | String | A base64-encoded representation of the TransactionResult XDR returned by stellar-core when submitting this transaction. | -| `result_codes.transaction` | String | The transaction result code returned by Stellar Core. | -| `result_codes.operations` | Array | An array of strings, representing the operation result codes for each operation in the submitted transaction, if available. | - - -## Examples - -### No Source Account -```json -{ - "type": "https://stellar.org/horizon-errors/transaction_failed", - "title": "Transaction Failed", - "status": 400, - "detail": "The transaction failed when submitted to the stellar network. The `extras.result_codes` field on this response contains further details. Descriptions of each code can be found at: https://www.stellar.org/developers/learn/concepts/list-of-operations.html", - "extras": { - "envelope_xdr": "AAAAANNVpdQ9vctZdAJ67sFmNe1KDzaj51dAdkW3vKKM51H3AAAAZAAAAABJlgLSAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAA01Wl1D29y1l0AnruwWY17UoPNqPnV0B2Rbe8ooznUfcAAAAAAAAAAAL68IAAAAAAAAAAAA==", - "result_codes": { - "transaction": "tx_no_source_account" - }, - "result_xdr": "AAAAAAAAAAD////4AAAAAA==" - } -} -``` - -### Bad Authentication -```json -{ - "type": "https://stellar.org/horizon-errors/transaction_failed", - "title": "Transaction Failed", - "status": 400, - "detail": "The transaction failed when submitted to the stellar network. The `extras.result_codes` field on this response contains further details. Descriptions of each code can be found at: https://www.stellar.org/developers/learn/concepts/list-of-operations.html", - "extras": { - "envelope_xdr": "AAAAAPORy3CoX6ox2ilbeiVjBA5WlpCSZRcjZ7VE9Wf4QVk7AAAAZAAAQz0AAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAA85HLcKhfqjHaKVt6JWMEDlaWkJJlFyNntUT1Z/hBWTsAAAAAAAAAAAL68IAAAAAAAAAAARN17BEAAABAA9Ad7OKc7y60NT/JuobaHOfmuq8KbZqcV6G/es94u9yT84fi0aI7tJsFMOyy8cZ4meY3Nn908OU+KfRWV40UCw==", - "result_codes": { - "transaction": "tx_bad_auth" - }, - "result_xdr": "AAAAAAAAAGT////6AAAAAA==" - } -} -``` - -## Related - -- [Transaction Malformed](./transaction-malformed.md) diff --git a/services/horizon/internal/docs/reference/errors/transaction-malformed.md b/services/horizon/internal/docs/reference/errors/transaction-malformed.md deleted file mode 100644 index 24983047c0..0000000000 --- a/services/horizon/internal/docs/reference/errors/transaction-malformed.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Transaction Malformed -replacement: https://developers.stellar.org/api/errors/http-status-codes/horizon-specific/ ---- - -When you submit a malformed transaction to Horizon, Horizon will return a `transaction_malformed` -error. There are many ways in which a transaction could be malformed, including: - -- You submitted an empty string. -- Your base64-encoded string is invalid. -- Your [XDR](../xdr.md) structure is invalid. -- You have leftover bytes in your [XDR](../xdr.md) structure. - -If you are encountering this error, please check the contents of the transaction you are -submitting. This error returns a -[HTTP 400 Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes). - -## Attributes - -As with all errors Horizon returns, `transaction_malformed` follows the -[Problem Details for HTTP APIs](https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00) -draft specification guide and thus has the following attributes: - -| Attribute | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `type` | URL | The identifier for the error. This is a URL that can be visited in the browser.| -| `title` | String | A short title describing the error. | -| `status` | Number | An HTTP status code that maps to the error. | -| `detail` | String | A more detailed description of the error. | - -In addition, the following additional data is provided in the `extras` field of the error: - -| Attribute | Type | Description | -|----------------|--------|----------------------------------------------------| -| `envelope_xdr` | String | The submitted data that was malformed in some way. | - -## Example - -```json -{ - "type": "https://stellar.org/horizon-errors/transaction_malformed", - "title": "Transaction Malformed", - "status": 400, - "detail": "Horizon could not decode the transaction envelope in this request. A transaction should be an XDR TransactionEnvelope struct encoded using base64. The envelope read from this request is echoed in the `extras.envelope_xdr` field of this response for your convenience.", - "extras": { - "envelope_xdr": "BBBBBPORy3CoX6ox2ilbeiVjBA5WlpCSZRcjZ7VE9Wf4QVk7AAAAZAAAQz0AAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAA85HLcKhfqjHaKVt6JWMEDlaWkJJlFyNntUT1Z/hBWTsAAAAAAAAAAAL68IAAAAAAAAAAARN17BEAAABAA9Ad7OKc7y60NT/JuobaHOfmuq8KbZqcV6G/es94u9yT84fi0aI7tJsFMOyy8cZ4meY3Nn908OU+KfRWV40UCw==" - } -} -``` - -## Related - -- [Bad Request](./bad-request.md) diff --git a/services/horizon/internal/docs/reference/paging.md b/services/horizon/internal/docs/reference/paging.md deleted file mode 100644 index d2c8db0dda..0000000000 --- a/services/horizon/internal/docs/reference/paging.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Paging -replacement: https://developers.stellar.org/api/introduction/pagination/ ---- - -The Stellar network contains a lot of data and it would be infeasible to return it all at once. The paging system allows -a user to request a "page" of data containing only a limited number of results. Then, the user can use the paging system -to request results adjacent to the current page where they left off at. - -Read about the [page resource](../reference/resources/page.md) for information on the paging system's usage and representation. - - diff --git a/services/horizon/internal/docs/reference/rate-limiting.md b/services/horizon/internal/docs/reference/rate-limiting.md deleted file mode 100644 index 642412fbed..0000000000 --- a/services/horizon/internal/docs/reference/rate-limiting.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Rate Limiting -replacement: https://developers.stellar.org/api/introduction/rate-limiting/ ---- - -In order to provide service stability, Horizon limits the number of requests a -client (single IP) can perform within a one hour window. By default this is set to 3600 -requests per hour—an average of one request per second. Also, while streaming -every update of the stream (what happens every time there's a new ledger) is -counted. Ex. if there were 12 new ledgers in a minute, 12 requests will be -subtracted from the limit. - -Horizon is using [GCRA](https://brandur.org/rate-limiting#gcra) algorithm. - -## Response headers for rate limiting - -Every response from Horizon sets advisory headers to inform clients of their -standing with rate limiting system: - -| Header | Description | -| ----------------------- | ------------------------------------------------------------------------ | -| `X-RateLimit-Limit` | The maximum number of requests that the current client can make in one hour. | -| `X-RateLimit-Remaining` | The number of remaining requests for the current window. | -| `X-RateLimit-Reset` | Seconds until a new window starts. | - -In addition, a `Retry-After` header will be set when the current client is being -throttled. diff --git a/services/horizon/internal/docs/reference/readme.md b/services/horizon/internal/docs/reference/readme.md deleted file mode 100644 index 0e4f4cbc32..0000000000 --- a/services/horizon/internal/docs/reference/readme.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Overview ---- - -Horizon is an API server for the Stellar ecosystem. It acts as the interface between [stellar-core](https://github.com/stellar/stellar-core) and applications that want to access the Stellar network. It allows you to submit transactions to the network, check the status of accounts, subscribe to event streams, etc. See [an overview of the Stellar ecosystem](https://www.stellar.org/developers/guides/) for details of where Horizon fits in. - -Horizon provides a RESTful API to allow client applications to interact with the Stellar network. You can communicate with Horizon using cURL or just your web browser. However, if you're building a client application, you'll likely want to use a Stellar SDK in the language of your client. -SDF provides a [JavaScript SDK](https://www.stellar.org/developers/js-stellar-sdk/reference/index.html) for clients to use to interact with Horizon. - -SDF runs a instance of Horizon that is connected to the test net: [https://horizon-testnet.stellar.org/](https://horizon-testnet.stellar.org/) and one that is connected to the public Stellar network: -[https://horizon.stellar.org/](https://horizon.stellar.org/). - -## Libraries - -SDF maintained libraries:
-- [JavaScript](https://github.com/stellar/js-stellar-sdk) -- [Go](https://github.com/stellar/go/tree/master/clients/horizonclient) -- [Java](https://github.com/stellar/java-stellar-sdk) - -Community maintained libraries for interacting with Horizon in other languages:
-- [Python](https://github.com/StellarCN/py-stellar-base) -- [C# .NET Core 2.x](https://github.com/elucidsoft/dotnetcore-stellar-sdk) -- [Ruby](https://github.com/astroband/ruby-stellar-sdk) -- [iOS and macOS](https://github.com/Soneso/stellar-ios-mac-sdk) -- [Scala SDK](https://github.com/synesso/scala-stellar-sdk) -- [C++ SDK](https://github.com/bnogalm/StellarQtSDK) diff --git a/services/horizon/internal/docs/reference/resources/account.md b/services/horizon/internal/docs/reference/resources/account.md deleted file mode 100644 index 8e90e78f77..0000000000 --- a/services/horizon/internal/docs/reference/resources/account.md +++ /dev/null @@ -1,199 +0,0 @@ ---- -title: Account -replacement: https://developers.stellar.org/api/resources/accounts/ ---- - -In the Stellar network, users interact using **accounts** which can be controlled by a corresponding keypair that can authorize transactions. One can create a new account with the [Create Account](./operation.md#create-account) operation. - -To learn more about the concept of accounts in the Stellar network, take a look at the [Stellar account concept guide](https://www.stellar.org/developers/learn/concepts/accounts.html). - -When horizon returns information about an account it uses the following format: - -## Attributes -| Attribute | Type | Description | -|----------------|------------------|------------------------------------------------------------------------------------------------------------------------ | -| id | string | The canonical id of this account, suitable for use as the :id parameter for url templates that require an account's ID. | -| account_id | string | The account's public key encoded into a base32 string representation. | -| sequence | number | The current sequence number that can be used when submitting a transaction from this account. | -| subentry_count | number | The number of [account subentries](https://www.stellar.org/developers/guides/concepts/ledger.html#ledger-entries). | -| balances | array of objects | An array of the native asset or credits this account holds. | -| thresholds | object | An object of account thresholds. | -| flags | object | The flags denote the enabling/disabling of certain asset issuer privileges. | -| signers | array of objects | An array of [account signers](https://www.stellar.org/developers/guides/concepts/multi-sig.html#additional-signing-keys) with their weights. | -| data | object | An array of account [data](./data.md) fields. | - -### Signer Object -| Attribute | Type | Description | -|------------|--------|------------------------------------------------------------------------------------------------------------------| -| weight | number | The numerical weight of a signer, necessary to determine whether a transaction meets the threshold requirements. | -| key | string | Different depending on the type of the signer. | -| type | string | See below. | - -### Possible Signer Types -| Type | Description | -|--------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| ed25519_public_key | A normal Stellar public key. | -| sha256_hash | The SHA256 hash of some arbitrary `x`. Adding a signature of this type allows anyone who knows `x` to sign a transaction from this account. *Note: Once this transaction is broadcast, `x` will be known publicly.* | -| preauth_tx | The hash of a pre-authorized transaction. This signer is automatically removed from the account when a matching transaction is properly applied. | -### Balances Object -| Attribute | Type | | -|---------------------|------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| balance | string | How much of an asset is owned. | -| buying_liabilities | string | The total amount of an asset offered to buy aggregated over all offers owned by this account. | -| selling_liabilities | string | The total amount of an asset offered to sell aggregated over all offers owned by this account. | -| limit | optional, number | The maximum amount of an asset that this account is willing to accept (this is specified when an account opens a trustline). | -| asset_type | string | Either native, credit_alphanum4, or credit_alphanum12. | -| asset_code | optional, string | The code for the asset. | -| asset_issuer | optional, string | The stellar address of the given asset's issuer. | -| is_authorized | optional, bool | The trustline status for an `auth_required` asset. If true, the issuer of the asset has granted the account permission to send, receive, buy, or sell the asset. If false, the issuer has not, so the account cannot send, receive, buy, or sell the asset. | - -### Flag Object -| Attribute | Type | | -|----------------|------|--------------------------------------------------------------------------------------------------------------------------------| -| auth_immutable | bool | With this setting, none of the following authorization flags can be changed. | -| auth_required | bool | With this setting, an anchor must approve anyone who wants to hold its asset. | -| auth_revocable | bool | With this setting, an anchor can set the authorize flag of an existing trustline to freeze the assets held by an asset holder. | - -### Threshold Object -| Attribute | Type | | -|----------------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| low_threshold | number | The weight required for a valid transaction including the [Allow Trust][allow_trust] and [Bump Sequence][bump_seq] operations. | -| med_threshold | number | The weight required for a valid transaction including the [Create Account][create_acc], [Payment][payment], [Path Payment Strict Send][path_payment_send], [Path Payment Strict Receive][path_payment_receive], [Manage Buy Offer][manage_buy_offer], [Manage Sell Offer][manage_sell_offer], [Create Passive Sell Offer][passive_sell_offer], [Change Trust][change_trust], [Inflation][inflation], and [Manage Data][manage_data] operations. | -| high_threshold | number | The weight required for a valid transaction including the [Account Merge][account_merge] and [Set Options]() operations. | - -[account_merge]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#account-merge -[allow_trust]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#allow-trust -[bump_seq]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#bump-sequence -[change_trust]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#change-trust -[create_acc]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#create-account -[inflation]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#inflation -[manage_data]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#manage-data -[manage_buy_offer]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#manage-buy-offer -[manage_sell_offer]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#manage-sell-offer -[passive_sell_offer]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#create-passive-sell-offer -[path_payment_receive]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#path-payment-strict-receive -[path_payment_send]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#path-payment-strict-send -[payment]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#payment -[set_options]: https://www.stellar.org/developers/guides/concepts/list-of-operations.html#set-options - -## Links -| rel | Example | Description | `templated` | -|--------------|---------------------------------------------------------------------------------------------------------|--------------------------------------------------------------|-------------| -| data | `/accounts/GAOEWNUEKXKNGB2AAOX6S6FEP6QKCFTU7KJH647XTXQXTMOAUATX2VF5/data/{key}` | [Data fields](./data.md) related to this account | true | -| effects | `/accounts/GAOEWNUEKXKNGB2AAOX6S6FEP6QKCFTU7KJH647XTXQXTMOAUATX2VF5/effects/{?cursor,limit,order}` | The [effects](./effect.md) related to this account | true | -| offers | `/accounts/GAOEWNUEKXKNGB2AAOX6S6FEP6QKCFTU7KJH647XTXQXTMOAUATX2VF5/offers/{?cursor,limit,order}` | The [offers](./offer.md) related to this account | true | -| operations | `/accounts/GAOEWNUEKXKNGB2AAOX6S6FEP6QKCFTU7KJH647XTXQXTMOAUATX2VF5/operations/{?cursor,limit,order}` | The [operations](./operation.md) related to this account | true | -| payments | `/accounts/GAOEWNUEKXKNGB2AAOX6S6FEP6QKCFTU7KJH647XTXQXTMOAUATX2VF5/payments/{?cursor,limit,order}` | The [payments](./payment.md) related to this account | true | -| trades | `/accounts/GAOEWNUEKXKNGB2AAOX6S6FEP6QKCFTU7KJH647XTXQXTMOAUATX2VF5/trades/{?cursor,limit,order}` | The [trades](./trade.md) related to this account | true | -| transactions | `/accounts/GAOEWNUEKXKNGB2AAOX6S6FEP6QKCFTU7KJH647XTXQXTMOAUATX2VF5/transactions/{?cursor,limit,order}` | The [transactions](./transaction.md) related to this account | true | - -## Example - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/accounts/GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW" - }, - "transactions": { - "href": "https://horizon-testnet.stellar.org/accounts/GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW/transactions{?cursor,limit,order}", - "templated": true - }, - "operations": { - "href": "https://horizon-testnet.stellar.org/accounts/GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW/operations{?cursor,limit,order}", - "templated": true - }, - "payments": { - "href": "https://horizon-testnet.stellar.org/accounts/GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW/payments{?cursor,limit,order}", - "templated": true - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/accounts/GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW/effects{?cursor,limit,order}", - "templated": true - }, - "offers": { - "href": "https://horizon-testnet.stellar.org/accounts/GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW/offers{?cursor,limit,order}", - "templated": true - }, - "trades": { - "href": "https://horizon-testnet.stellar.org/accounts/GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW/trades{?cursor,limit,order}", - "templated": true - }, - "data": { - "href": "https://horizon-testnet.stellar.org/accounts/GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW/data/{key}", - "templated": true - } - }, - "id": "GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW", - "paging_token": "", - "account_id": "GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW", - "sequence": "43692723777044483", - "subentry_count": 3, - "thresholds": { - "low_threshold": 0, - "med_threshold": 0, - "high_threshold": 0 - }, - "flags": { - "auth_required": false, - "auth_revocable": false, - "auth_immutable": false - }, - "balances": [ - { - "balance": "1000000.0000000", - "limit": "922337203685.4775807", - "buying_liabilities": "0.0000000", - "selling_liabilities": "0.0000000", - "last_modified_ledger": 632070, - "asset_type": "credit_alphanum4", - "asset_code": "FOO", - "asset_issuer": "GAGLYFZJMN5HEULSTH5CIGPOPAVUYPG5YSWIYDJMAPIECYEBPM2TA3QR" - }, - { - "balance": "10000.0000000", - "buying_liabilities": "0.0000000", - "selling_liabilities": "0.0000000", - "asset_type": "native" - } - ], - "signers": [ - { - "public_key": "GDLEPBJBC2VSKJCLJB264F2WDK63X4NKOG774A3QWVH2U6PERGDPUCS4", - "weight": 1, - "key": "GDLEPBJBC2VSKJCLJB264F2WDK63X4NKOG774A3QWVH2U6PERGDPUCS4", - "type": "ed25519_public_key" - }, - { - "public_key": "XCPNCUKYDHPMMH6TMHK73K5VP5A6ZTQ2L7Q74JR3TDANNFB3TMRS5OKG", - "weight": 1, - "key": "XCPNCUKYDHPMMH6TMHK73K5VP5A6ZTQ2L7Q74JR3TDANNFB3TMRS5OKG", - "type": "sha256_hash" - }, - { - "public_key": "TABGGIW6EXOVOSNJ2O27U2DUX7RWHSRBGOKQLGYDTOXPANEX6LXBX7O7", - "weight": 1, - "key": "TABGGIW6EXOVOSNJ2O27U2DUX7RWHSRBGOKQLGYDTOXPANEX6LXBX7O7", - "type": "preauth_tx" - }, - { - "public_key": "GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW", - "weight": 1, - "key": "GBWRID7MPYUDBTNQPEHUN4XOBVVDPJOHYXAVW3UTOD2RG7BDAY6O3PHW", - "type": "ed25519_public_key" - } - ], - "data": {} -} -``` - -## Endpoints -| Resource | Type | Resource URI Template | -|------------------------------------------------------------------|------------|--------------------------------------| -| [Account Details](../endpoints/accounts-single.md) | Single | `/accounts/:id` | -| [Account Data](../endpoints/data-for-account.md) | Single | `/accounts/:id/data/:key` | -| [Account Transactions](../endpoints/transactions-for-account.md) | Collection | `/accounts/:account_id/transactions` | -| [Account Operations](../endpoints/operations-for-account.md) | Collection | `/accounts/:account_id/operations` | -| [Account Payments](../endpoints/payments-for-account.md) | Collection | `/accounts/:account_id/payments` | -| [Account Effects](../endpoints/effects-for-account.md) | Collection | `/accounts/:account_id/effects` | -| [Account Offers](../endpoints/offers-for-account.md) | Collection | `/accounts/:account_id/offers` | diff --git a/services/horizon/internal/docs/reference/resources/asset.md b/services/horizon/internal/docs/reference/resources/asset.md deleted file mode 100644 index 730b0de73a..0000000000 --- a/services/horizon/internal/docs/reference/resources/asset.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Asset -replacement: https://developers.stellar.org/api/resources/assets/ ---- - -**Assets** are the units that are traded on the Stellar Network. - -An asset consists of an type, code, and issuer. - -To learn more about the concept of assets in the Stellar network, take a look at the [Stellar assets concept guide](https://www.stellar.org/developers/guides/concepts/assets.html). - -## Attributes - -| Attribute | Type | | -| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ | -| asset_type | string | The type of this asset: "credit_alphanum4", or "credit_alphanum12". | -| asset_code | string | The code of this asset. | -| asset_issuer | string | The issuer of this asset. | -| accounts | object | The number of accounts and claimable balances holding this asset. Accounts are summarized by each state of the trust line flags. | -| balances | object | The number of units of credit issued, summarized by each state of the trust line flags, or if they are in a claimable balance. | -| flags | object | The flags denote the enabling/disabling of certain asset issuer privileges. | -| paging_token | string | A [paging token](./page.md) suitable for use as the `cursor` parameter to transaction collection resources. | - -#### Flag Object -| Attribute | Type | | -| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ | -| auth_immutable | bool | With this setting, none of the following authorization flags can be changed. | -| auth_required | bool | With this setting, an anchor must approve anyone who wants to hold its asset. | -| auth_revocable | bool | With this setting, an anchor can set the authorize flag of an existing trustline to freeze the assets held by an asset holder. | - -## Links -| rel | Example | Description -|--------------|---------------------------------------------------------------------------------------------------|------------------------------------------------------------ -| toml | `https://www.stellar.org/.well-known/stellar.toml`| Link to the TOML file for this issuer | - -## Example - -```json -{ - "_links": { - "toml": { - "href": "https://www.stellar.org/.well-known/stellar.toml" - } - }, - "asset_type": "credit_alphanum4", - "asset_code": "USD", - "asset_issuer": "GBAUUA74H4XOQYRSOW2RZUA4QL5PB37U3JS5NE3RTB2ELJVMIF5RLMAG", - "paging_token": "USD_GBAUUA74H4XOQYRSOW2RZUA4QL5PB37U3JS5NE3RTB2ELJVMIF5RLMAG_credit_alphanum4", - "accounts": { - "authorized": 91547871, - "authorized_to_maintain_liabilities": 45773935, - "unauthorized": 22886967, - "claimable_balances": 11443483 - }, - "balances": { - "authorized": "100.0000000", - "authorized_to_maintain_liabilities": "50.0000000", - "unauthorized": "25.0000000", - "claimable_balances": "12.5000000" - }, - "flags": { - "auth_required": false, - "auth_revocable": false - } -} -``` - -## Endpoints - -| Resource | Type | Resource URI Template | -| ---------------------------------------- | ---------- | ---------------------------- | -| [All Assets](../endpoints/assets-all.md) | Collection | `/assets` (`GET`) | diff --git a/services/horizon/internal/docs/reference/resources/data.md b/services/horizon/internal/docs/reference/resources/data.md deleted file mode 100644 index fb79d26d7b..0000000000 --- a/services/horizon/internal/docs/reference/resources/data.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Data -replacement: https://developers.stellar.org/api/resources/accounts/data/ ---- - -Each account in Stellar network can contain multiple key/value pairs associated with it. Horizon can be used to retrieve value of each data key. - -When horizon returns information about a single account data key it uses the following format: - -## Attributes - -| Attribute | Type | | -| --- | --- | --- | -| value | base64-encoded string | The base64-encoded value for the key | - -## Example - -```json -{ - "value": "MTAw" -} -``` diff --git a/services/horizon/internal/docs/reference/resources/effect.md b/services/horizon/internal/docs/reference/resources/effect.md deleted file mode 100644 index 8eb2c29452..0000000000 --- a/services/horizon/internal/docs/reference/resources/effect.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: Effect -replacement: https://developers.stellar.org/api/resources/effects/ ---- - -A successful operation will yield zero or more **effects**. These effects -represent specific changes that occur in the ledger, but are not necessarily -directly reflected in the [ledger](https://www.stellar.org/developers/learn/concepts/ledger.html) or [history](https://github.com/stellar/stellar-core/blob/master/docs/history.md), as [transactions](https://www.stellar.org/developers/learn/concepts/transactions.html) and [operations](https://www.stellar.org/developers/learn/concepts/operations.html) are. - -## Effect types - -We can distinguish 6 effect groups: -- Account effects -- Signer effects -- Trustline effects -- Trading effects -- Data effects -- Misc effects - -### Account effects - -| Type | Operation | -|---------------------------------------|------------------------------------------------------| -| Account Created | create_account | -| Account Removed | merge_account | -| Account Credited | create_account, payment, path_payment, merge_account | -| Account Debited | create_account, payment, path_payment, merge_account | -| Account Thresholds Updated | set_options | -| Account Home Domain Updated | set_options | -| Account Flags Updated | set_options | -| Account Inflation Destination Updated | set_options | - -### Signer effects - -| Type | Operation | -|----------------|-------------| -| Signer Created | set_options | -| Signer Removed | set_options | -| Signer Updated | set_options | - -### Trustline effects - -| Type | Operation | -|------------------------|---------------------------| -| Trustline Created | change_trust | -| Trustline Removed | change_trust | -| Trustline Updated | change_trust, allow_trust | -| Trustline Authorized | allow_trust | -| Trustline Deauthorized | allow_trust | - -### Trading effects - -| Type | Operation | -|---------------|------------------------------------------------------------------------------| -| Offer Created | manage_buy_offer, manage_sell_offer, create_passive_sell_offer | -| Offer Removed | manage_buy_offer, manage_sell_offer, create_passive_sell_offer, path_payment | -| Offer Updated | manage_buy_offer, manage_sell_offer, create_passive_sell_offer, path_payment | -| Trade | manage_buy_offer, manage_sell_offer, create_passive_sell_offer, path_payment | -### Data effects - -| Type | Operation | -|--------------|-------------| -| Data Created | manage_data | -| Data Removed | manage_data | -| Data Updated | manage_data | -### Misc effects - -| Type | Operation | -|-----------------|---------------| -| Sequence Bumped | bump_sequence | - -## Attributes - -Attributes depend on effect type. - -## Links - -| rel | Example | Relation | -|-----------|---------------------------------------------------------------|-----------------------------------| -| self | `/effects?order=asc\u0026limit=1` | | -| prev | `/effects?order=desc\u0026limit=1\u0026cursor=141733924865-1` | | -| next | `/effects?order=asc\u0026limit=1\u0026cursor=141733924865-1` | | -| operation | `/operations/141733924865` | Operation that created the effect | - -## Example - -```json -{ - "_embedded": { - "records": [ - { - "_links": { - "operation": { - "href": "/operations/141733924865" - }, - "precedes": { - "href": "/effects?cursor=141733924865-1\u0026order=asc" - }, - "succeeds": { - "href": "/effects?cursor=141733924865-1\u0026order=desc" - } - }, - "account": "GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K", - "paging_token": "141733924865-1", - "starting_balance": "10000000.0", - "type_i": 0, - "type": "account_created" - } - ] - }, - "_links": { - "next": { - "href": "/effects?order=asc\u0026limit=1\u0026cursor=141733924865-1" - }, - "prev": { - "href": "/effects?order=desc\u0026limit=1\u0026cursor=141733924865-1" - }, - "self": { - "href": "/effects?order=asc\u0026limit=1\u0026cursor=" - } - } -} -``` - -## Endpoints - -| Resource | Type | Resource URI Template | -|--------------------------------------------------------------------------------------------------------------------------------------------|------------|---------------------------------| -| [All Effects](https://github.com/stellar/go/blob/master/services/horizon/internal/docs/reference/endpoints/effects-all.md) | Collection | `/effects` | -| [Operation Effects](https://github.com/stellar/go/blob/master/services/horizon/internal/docs/reference/endpoints/effects-for-operation.md) | Collection | `/operations/:id/effects` | -| [Account Effects](https://github.com/stellar/go/blob/master/services/horizon/internal/docs/reference/endpoints/effects-for-account.md) | Collection | `/accounts/:account_id/effects` | -| [Ledger Effects](https://github.com/stellar/go/blob/master/services/horizon/internal/docs/reference/endpoints/effects-for-ledger.md) | Collection | `/ledgers/:ledger_id/effects` | diff --git a/services/horizon/internal/docs/reference/resources/ledger.md b/services/horizon/internal/docs/reference/resources/ledger.md deleted file mode 100644 index 23632cc1da..0000000000 --- a/services/horizon/internal/docs/reference/resources/ledger.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Ledger -replacement: https://developers.stellar.org/api/resources/ledgers/ ---- - -A **ledger** resource contains information about a given ledger. - -To learn more about the concept of ledgers in the Stellar network, take a look at the [Stellar ledger concept guide](https://www.stellar.org/developers/learn/concepts/ledger.html). - -## Attributes - -| Attribute | Type | | -|------------------------------|--------|------------------------------------------------------------------------------------------------------------------------------| -| id | string | The id is a unique identifier for this ledger. | -| paging_token | number | A [paging token](./page.md) suitable for use as a `cursor` parameter. | -| hash | string | A hex-encoded, lowercase SHA-256 hash of the ledger's [XDR](../../learn/xdr.md)-encoded form. | -| prev_hash | string | The hash of the ledger that chronologically came before this one. | -| sequence | number | Sequence number of this ledger, suitable for use as the as the :id parameter for url templates that require a ledger number. | -| successful_transaction_count | number | The number of successful transactions in this ledger. | -| failed_transaction_count | number | The number of failed transactions in this ledger. | -| operation_count | number | The number of operations applied in this ledger. | -| tx_set_operation_count | number | The number of operations in this ledger. This number includes operations from failed and successful transactions. | -| closed_at | string | An [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) formatted string of when this ledger was closed. | -| total_coins | string | The total number of lumens in circulation. | -| fee_pool | string | The sum of all transaction fees *(in lumens)* since the last inflation operation. They are redistributed during [inflation]. | -| base_fee | number | The [fee] the network charges per operation in a transaction. | -| base_reserve | string | The [reserve][fee] the network uses when calculating an account's minimum balance. | -| max_tx_set_size | number | The maximum number of transactions validators have agreed to process in a given ledger. | -| protocol_version | number | The protocol version that the stellar network was running when this ledger was committed. | -| header_xdr | string | A base64 encoded string of the raw `LedgerHeader` xdr struct for this ledger. | -| base_fee_in_stroops | number | The [fee] the network charges per operation in a transaction. Expressed in stroops. | -| base_reserve_in_stroops | number | The [reserve][fee] the network uses when calculating an account's minimum balance. Expressed in stroops. | - -## Links -| | Example | Relation | templated | -|--------------|---------------------------------------------------|---------------------------------|-----------| -| self | `/ledgers/500` | | | -| effects | `/ledgers/500/effects/{?cursor,limit,order}` | The effects in this transaction | true | -| operations | `/ledgers/500/operations/{?cursor,limit,order}` | The operations in this ledger | true | -| transactions | `/ledgers/500/transactions/{?cursor,limit,order}` | The transactions in this ledger | true | - - -## Example - -```json -{ - "_links": { - "effects": { - "href": "/ledgers/500/effects/{?cursor,limit,order}", - "templated": true - }, - "operations": { - "href": "/ledgers/500/operations/{?cursor,limit,order}", - "templated": true - }, - "self": { - "href": "/ledgers/500" - }, - "transactions": { - "href": "/ledgers/500/transactions/{?cursor,limit,order}", - "templated": true - } - }, - "id": "689f00d4824b8e69330bf4ad7eb10092ff2f8fdb76d4668a41eebb9469ef7f30", - "paging_token": "2147483648000", - "hash": "689f00d4824b8e69330bf4ad7eb10092ff2f8fdb76d4668a41eebb9469ef7f30", - "prev_hash": "b608e110c7cc58200c912140f121af50dc5ef407aabd53b76e1741080aca1cf0", - "sequence": 500, - "transaction_count": 0, - "successful_transaction_count": 0, - "failed_transaction_count": 0, - "operation_count": 0, - "tx_set_operation_count": 0, - "closed_at": "2015-07-09T21:39:28Z", - "total_coins": "100000000000.0000000", - "fee_pool": "0.0025600", - "base_fee": 100, - "base_reserve": "10.0000000", - "max_tx_set_size": 50, - "protocol_version": 8, - "header_xdr": "...", - "base_fee_in_stroops": 100, - "base_reserve_in_stroops": 100000000 -} -``` - -## Endpoints -| Resource | Type | Resource URI Template | -|-------------------------|------------|------------------------------------| -| [All ledgers](../endpoints/ledgers-all.md) | Collection | `/ledgers` | -| [Single Ledger](../endpoints/ledgers-single.md) | Single | `/ledgers/:id` | -| [Ledger Transactions](../endpoints/transactions-for-ledger.md) | Collection | `/ledgers/:ledger_id/transactions` | -| [Ledger Operations](../endpoints/operations-for-ledger.md) | Collection | `/ledgers/:ledger_id/operations` | -| [Ledger Payments](../endpoints/payments-for-ledger.md) | Collection | `/ledgers/:ledger_id/payments` | -| [Ledger Effects](../endpoints/effects-for-ledger.md) | Collection | `/ledgers/:ledger_id/effects` | - - - -[inflation]: https://www.stellar.org/developers/learn/concepts/inflation.html -[fee]: https://www.stellar.org/developers/learn/concepts/fees.html diff --git a/services/horizon/internal/docs/reference/resources/offer.md b/services/horizon/internal/docs/reference/resources/offer.md deleted file mode 100644 index 14c2a8cb96..0000000000 --- a/services/horizon/internal/docs/reference/resources/offer.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Offer -replacement: https://developers.stellar.org/api/resources/offers/ ---- - -Accounts on the Stellar network can make [offers](http://stellar.org/developers/learn/concepts/exchange.html) to buy or sell assets. Users can create offers with the [Manage Offer](http://stellar.org/developers/learn/concepts/list-of-operations.html) operation. - -Horizon only returns offers that belong to a particular account. When it does, it uses the following format: - -## Attributes -| Attribute | Type | | -|----------------------|-------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------| -| id | string | The ID of this offer. | -| paging_token | string | A [paging token](./page.md) suitable for use as a `cursor` parameter. | -| seller | string | Account id of the account making this offer. | -| selling | [Asset](http://stellar.org/developers/learn/concepts/assets.html) | The Asset this offer wants to sell. | -| buying | [Asset](http://stellar.org/developers/learn/concepts/assets.html) | The Asset this offer wants to buy. | -| amount | string | The amount of `selling` the account making this offer is willing to sell. | -| price_r | object | An object of a number numerator and number denominator that represent the buy and sell price of the currencies on offer. | -| price | string | How many units of `buying` it takes to get 1 unit of `selling`. A number representing the decimal form of `price_r`. | -| last_modified_ledger | integer | sequence number for the latest ledger in which this offer was modified. | -| last_modified_time | string | An ISO 8601 formatted string of last modification time. | - -#### Price_r Object -Price_r is a more precise representation of a bid/ask offer. - -| Attribute | Type | | -|-----------|--------|------------------| -| n | number | The numerator. | -| d | number | The denominator. | - -Thus to get price you would take n / d. - - - -## Links -| rel | Example | Description | `templated` | -|--------|------------------------------------------|---------------------------------------------------------|-------------| -| seller | `/accounts/{seller}?cursor,limit,order}` | Link to details about the account that made this offer. | true | - -## Example - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/offers/2611" - }, - "offer_maker": { - "href": "https://horizon-testnet.stellar.org/accounts/GDG3NOK5YI7A4FCBHE6SKI4L65R7UPRBZUZVBT44IBTQBWGUSTJDDKBQ" - } - }, - "id": "2611", - "paging_token": "2611", - "seller": "GDG3NOK5YI7A4FCBHE6SKI4L65R7UPRBZUZVBT44IBTQBWGUSTJDDKBQ", - "selling": { - "asset_type": "credit_alphanum12", - "asset_code": "USD", - "asset_issuer": "GCL3BJDFYQ2KAV7ARC4YCTERNJFOBOBQXSG556TX4YMOPKGEDV5K6LCQ" - }, - "buying": { - "asset_type": "native" - }, - "amount": "1.0000000", - "price_r": { - "n": 1463518003, - "d": 25041627 - }, - "price": "58.4434072", - "last_modified_ledger": 196458, - "last_modified_time": "2020-02-10T18:51:42Z" -} -``` - -## Endpoints - -| Resource | Type | Resource URI Template | -|------------------------------------------------------|------------|--------------------------------| -| [Offers](../endpoints/offers.md) | Collection | `/offers` | -| [Account Offers](../endpoints/offers-for-account.md) | Collection | `/accounts/:account_id/offers` | -| [Offers Details](../endpoints/offer-details.md) | Single | `/offers/:offer_id` | diff --git a/services/horizon/internal/docs/reference/resources/operation.md b/services/horizon/internal/docs/reference/resources/operation.md deleted file mode 100644 index 887bd277c2..0000000000 --- a/services/horizon/internal/docs/reference/resources/operation.md +++ /dev/null @@ -1,840 +0,0 @@ ---- -title: Operation -replacement: https://developers.stellar.org/api/resources/operations/ ---- - -[Operations](https://www.stellar.org/developers/learn/concepts/operations.html) are objects that represent a desired change to the ledger: payments, -offers to exchange currency, changes made to account options, etc. Operations -are submitted to the Stellar network grouped in a [Transaction](./transaction.md). - -To learn more about the concept of operations in the Stellar network, take a look at the [Stellar operations concept guide](https://www.stellar.org/developers/learn/concepts/operations.html). - -## Operation Types - -| type | type_i | description | -|---------------------------------------------------------|--------|------------------------------------------------------------------------------------------------------------| -| [CREATE_ACCOUNT](#create-account) | 0 | Creates a new account in Stellar network. | -| [PAYMENT](#payment) | 1 | Sends a simple payment between two accounts in Stellar network. | -| [PATH_PAYMENT_STRICT_RECEIVE](#path-payment) | 2 | Sends a path payment strict receive between two accounts in the Stellar network. | -| [PATH_PAYMENT_STRICT_SEND](#path-payment-strict-send) | 13 | Sends a path payment strict send between two accounts in the Stellar network. | -| [MANAGE_SELL_OFFER](#manage-sell-offer) | 3 | Creates, updates or deletes a sell offer in the Stellar network. | -| [MANAGE_BUY_OFFER](#manage-buy-offer) | 12 | Creates, updates or deletes a buy offer in the Stellar network. | -| [CREATE_PASSIVE_SELL_OFFER](#create-passive-sell-offer) | 4 | Creates an offer that won't consume a counter offer that exactly matches this offer. | -| [SET_OPTIONS](#set-options) | 5 | Sets account options (inflation destination, adding signers, etc.) | -| [CHANGE_TRUST](#change-trust) | 6 | Creates, updates or deletes a trust line. | -| [ALLOW_TRUST](#allow-trust) | 7 | Updates the "authorized" flag of an existing trust line this is called by the issuer of the related asset. | -| [ACCOUNT_MERGE](#account-merge) | 8 | Deletes account and transfers remaining balance to destination account. | -| [INFLATION](#inflation) | 9 | Runs inflation. | -| [MANAGE_DATA](#manage-data) | 10 | Set, modify or delete a Data Entry (name/value pair) for an account. | -| [BUMP_SEQUENCE](#bump-sequence) | 11 | Bumps forward the sequence number of an account. | - - -Every operation type shares a set of common attributes and links, some operations also contain -additional attributes and links specific to that operation type. - - - -## Common Attributes - -| | Type | | -|------------------------|--------|-----------------------------------------------------------------------------------------------------------------------------| -| id | number | The canonical id of this operation, suitable for use as the :id parameter for url templates that require an operation's ID. | -| paging_token | any | A [paging token](./page.md) suitable for use as a `cursor` parameter. | -| transaction_successful | bool | Indicates if this operation is part of successful transaction. | -| type | string | A string representation of the type of operation. | -| type_i | number | Specifies the type of operation, See "Types" section below for reference. | - -## Common Links - -| | Relation | -|-------------|---------------------------------------------------------------------------| -| self | Relative link to the current operation | -| succeeds | Relative link to the list of operations succeeding the current operation. | -| precedes | Relative link to the list of operations preceding the current operation. | -| effects | The effects this operation triggered | -| transaction | The transaction this operation is part of | - - -Each operation type will have a different set of attributes, in addition to the -common attributes listed above. - -
-### Create Account - -Create Account operation represents a new account creation. - -#### Attributes - -| Field | Type | Description | -|------------------|--------|------------------------------------| -| account | string | A new account that was funded. | -| funder | string | Account that funded a new account. | -| starting_balance | string | Amount the account was funded. | - - -#### Example -```json -{ - "_links": { - "effects": { - "href": "/operations/402494270214144/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=402494270214144&order=asc" - }, - "self": { - "href": "/operations/402494270214144" - }, - "succeeds": { - "href": "/operations?cursor=402494270214144&order=desc" - }, - "transactions": { - "href": "/transactions/402494270214144" - } - }, - "account": "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ", - "funder": "GBIA4FH6TV64KSPDAJCNUQSM7PFL4ILGUVJDPCLUOPJ7ONMKBBVUQHRO", - "id": "402494270214144", - "paging_token": "402494270214144", - "starting_balance": "10000.0", - "type_i": 0, - "type": "create_account" -} -``` - - -### Payment - -A payment operation represents a payment from one account to another. This payment -can be either a simple native asset payment or a fiat asset payment. - -#### Attributes - -| Field | Type | Description | -|--------------|--------|----------------------------------------------| -| from | string | Sender of a payment. | -| to | string | Destination of a payment. | -| asset_type | string | Asset type (native / alphanum4 / alphanum12) | -| asset_code | string | Code of the destination asset. | -| asset_issuer | string | Asset issuer. | -| amount | string | Amount sent. | - -#### Links - -| | Example | Relation | -|----------|--------------------------------------------------------------------|-------------------| -| sender | /accounts/GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2 | Sending account | -| receiver | /accounts/GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ | Receiving account | - -#### Example - -```json -{ - "_links": { - "effects": { - "href": "/operations/58402965295104/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=58402965295104&order=asc" - }, - "self": { - "href": "/operations/58402965295104" - }, - "succeeds": { - "href": "/operations?cursor=58402965295104&order=desc" - }, - "transactions": { - "href": "/transactions/58402965295104" - } - }, - "amount": "200.0", - "asset_type": "native", - "from": "GAKLBGHNHFQ3BMUYG5KU4BEWO6EYQHZHAXEWC33W34PH2RBHZDSQBD75", - "id": "58402965295104", - "paging_token": "58402965295104", - "to": "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ", - "transaction_successful": true, - "type_i": 1, - "type": "payment" -} -``` - - -### Path Payment Strict Receive - -A path payment strict receive operation represents a payment from one account to another through a path. This type of payment starts as one type of asset and ends as another type of asset. There can be other assets that are traded into and out of along the path. - - -#### Attributes - -| Field | Type | Description | -|---------------------|-------------------------------|-----------------------------------------------------------------------------| -| from | string | Sender of a payment. | -| to | string | Destination of a payment. | -| asset_code | string | Code of the destination asset. | -| asset_issuer | string | Destination asset issuer. | -| asset_type | string | Destination asset type (native / alphanum4 / alphanum12) | -| amount | string | Amount received. | -| source_asset_code | string | Code of the source asset. | -| source_asset_issuer | string | Source asset issuer. | -| source_asset_type | string | Source asset type (native / alphanum4 / alphanum12) | -| source_max | string | Max send amount. | -| source_amount | string | Amount sent. | -| path | array of [Assets](./asset.md) | Additional hops the operation went through to get to the destination asset. | - -#### Example - -```json -{ - "_links": { - "effects": { - "href": "/operations/25769807873/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=25769807873\u0026order=asc" - }, - "self": { - "href": "/operations/25769807873" - }, - "succeeds": { - "href": "/operations?cursor=25769807873\u0026order=desc" - }, - "transaction": { - "href": "/transactions/25769807872" - } - }, - "amount": "10.0", - "asset_code": "EUR", - "asset_issuer": "GCQPYGH4K57XBDENKKX55KDTWOTK5WDWRQOH2LHEDX3EKVIQRLMESGBG", - "asset_type": "credit_alphanum4", - "from": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", - "id": "25769807873", - "paging_token": "25769807873", - "source_asset_code": "USD", - "source_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", - "source_asset_type": "credit_alphanum4", - "source_amount": "10.0", - "source_max": "10.0", - "to": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", - "transaction_successful": true, - "type_i": 2, - "type": "path_payment_strict_receive" -} -``` - - -### Path Payment Strict Send - -A path payment strict send operation represents a payment from one account to another through a path. This type of payment starts as one type of asset and ends as another type of asset. There can be other assets that are traded into and out of along the path. - -Unlike [path payment strict receive](#path-payment), this operation sends precisely the source amount, ensuring that the destination account receives at least the minimum specified amount (the amount received will vary based on offers in the order books). - - -#### Attributes - -| Field | Type | Description | -|---------------------|-------------------------------|-----------------------------------------------------------------------------| -| from | string | Sender of a payment. | -| to | string | Destination of a payment. | -| asset_type | string | Destination asset type (native / alphanum4 / alphanum12) | -| asset_code | string | Code of the destination asset. | -| asset_issuer | string | Destination asset issuer. | -| amount | string | Amount received. | -| source_asset_type | string | Source asset type (native / alphanum4 / alphanum12) | -| source_asset_code | string | Source asset code. | -| source_asset_issuer | string | Source asset issuer. | -| source_amount | string | Amount sent. | -| destination_min | string | The minimum amount of destination asset expected to be received. | -| path | array of [Assets](./asset.md) | Additional hops the operation went through to get to the destination asset. | - - -#### Example - -```json -{ - "_links": { - "self": { - "href": "/operations/120903307907612673" - }, - "transaction": { - "href": "/transactions/f60f32eff7f1dd0649cfe2986955d12f6ff45288357fe1526600642ea1b418aa" - }, - "effects": { - "href": "/operations/120903307907612673/effects" - }, - "succeeds": { - "href": "/effects?order=desc&cursor=120903307907612673" - }, - "precedes": { - "href": "/effects?order=asc&cursor=120903307907612673" - } - }, - "id": "120903307907612673", - "paging_token": "120903307907612673", - "transaction_successful": true, - "source_account": "GCXVEEBWI4YMRK6AFJQSEUBYDQL4PZ24ECAPJE2ZIAPIQZLZIBAX3LIF", - "type": "path_payment_strict_send", - "type_i": 13, - "created_at": "2020-02-09T20:32:53Z", - "transaction_hash": "f60f32eff7f1dd0649cfe2986955d12f6ff45288357fe1526600642ea1b418aa", - "asset_type": "native", - "from": "GCXVEEBWI4YMRK6AFJQSEUBYDQL4PZ24ECAPJE2ZIAPIQZLZIBAX3LIF", - "to": "GCXVEEBWI4YMRK6AFJQSEUBYDQL4PZ24ECAPJE2ZIAPIQZLZIBAX3LIF", - "amount": "0.0859000", - "path": [ - - ], - "source_amount": "1000.0000000", - "destination_min": "0.0859000", - "source_asset_type": "credit_alphanum4", - "source_asset_code": "KIN", - "source_asset_issuer": "GBDEVU63Y6NTHJQQZIKVTC23NWLQVP3WJ2RI2OTSJTNYOIGICST6DUXR" -} -``` - - -### Manage Sell Offer - -A "Manage Sell Offer" operation can create, update or delete a sell -offer to trade assets in the Stellar network. -It specifies an issuer, a price and amount of a given asset to -buy or sell. - -When this operation is applied to the ledger, trades can potentially be executed if -this offer crosses others that already exist in the ledger. - -In the event that there are not enough crossing orders to fill the order completely -a new "Offer" object will be created in the ledger. As other accounts make -offers or payments, this offer can potentially be filled. - -#### Sell Offer vs. Buy Offer - -A [sell offer](#manage-sell-offer) specifies a certain amount of the `selling` asset that should be sold in exchange for the maximum quantity of the `buying` asset. It additionally only crosses offers where the price is higher than `price`. - -A [buy offer](#manage-buy-offer) specifies a certain amount of the `buying` asset that should be bought in exchange for the minimum quantity of the `selling` asset. It additionally only crosses offers where the price is lower than `price`. - -Both will fill only partially (or not at all) if there are few (or no) offers that cross them. - -#### Attributes - -| Field | Type | Description | -|----------------------|--------|---------------------------------------------------------| -| offer_id | string | Offer ID. | -| amount | string | Amount of asset to be sold. | -| buying_asset_code | string | The code of asset to buy. | -| buying_asset_issuer | string | The issuer of asset to buy. | -| buying_asset_type | string | Type of asset to buy (native / alphanum4 / alphanum12) | -| price | string | Price of selling_asset in units of buying_asset | -| price_r | Object | n: price numerator, d: price denominator | -| selling_asset_code | string | The code of asset to sell. | -| selling_asset_issuer | string | The issuer of asset to sell. | -| selling_asset_type | string | Type of asset to sell (native / alphanum4 / alphanum12) | - -#### Example - -```json -{ - "_links": { - "effects": { - "href": "/operations/592323234762753/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=592323234762753\u0026order=asc" - }, - "self": { - "href": "/operations/592323234762753" - }, - "succeeds": { - "href": "/operations?cursor=592323234762753\u0026order=desc" - }, - "transaction": { - "href": "/transactions/592323234762752" - } - }, - "amount": "100.0", - "buying_asset_code": "CHP", - "buying_asset_issuer": "GAC2ZUXVI5266NMMGDPBMXHH4BTZKJ7MMTGXRZGX2R5YLMFRYLJ7U5EA", - "buying_asset_type": "credit_alphanum4", - "id": "592323234762753", - "offer_id": "8", - "paging_token": "592323234762753", - "price": "2.0", - "price_r": { - "d": 1, - "n": 2 - }, - "selling_asset_code": "YEN", - "selling_asset_issuer": "GDVXG2FMFFSUMMMBIUEMWPZAIU2FNCH7QNGJMWRXRD6K5FZK5KJS4DDR", - "selling_asset_type": "credit_alphanum4", - "transaction_successful": true, - "type_i": 3, - "type": "manage_sell_offer" -} -``` - - -### Manage Buy Offer - -A "Manage Buy Offer" operation can create, update or delete a buy -offer to trade assets in the Stellar network. -It specifies an issuer, a price and amount of a given asset to -buy or sell. - -When this operation is applied to the ledger, trades can potentially be executed if -this offer crosses others that already exist in the ledger. - -In the event that there are not enough crossing orders to fill the order completely -a new "Offer" object will be created in the ledger. As other accounts make -offers or payments, this offer can potentially be filled. - -#### Attributes - -| Field | Type | Description | -|----------------------|--------|---------------------------------------------------------------| -| offer_id | string | Offer ID. | -| buy_amount | string | Amount of asset to be bought. | -| buying_asset_code | string | The code of asset to buy. | -| buying_asset_issuer | string | The issuer of asset to buy. | -| buying_asset_type | string | Type of asset to buy (native / alphanum4 / alphanum12) | -| price | string | Price of thing being bought in terms of what you are selling. | -| price_r | Object | n: price numerator, d: price denominator | -| selling_asset_code | string | The code of asset to sell. | -| selling_asset_issuer | string | The issuer of asset to sell. | -| selling_asset_type | string | Type of asset to sell (native / alphanum4 / alphanum12) | -#### Example - -```json -{ - "_links": { - "effects": { - "href": "/operations/592323234762753/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=592323234762753\u0026order=asc" - }, - "self": { - "href": "/operations/592323234762753" - }, - "succeeds": { - "href": "/operations?cursor=592323234762753\u0026order=desc" - }, - "transaction": { - "href": "/transactions/592323234762752" - } - }, - "amount": "100.0", - "buying_asset_code": "CHP", - "buying_asset_issuer": "GAC2ZUXVI5266NMMGDPBMXHH4BTZKJ7MMTGXRZGX2R5YLMFRYLJ7U5EA", - "buying_asset_type": "credit_alphanum4", - "id": "592323234762753", - "offer_id": "8", - "paging_token": "592323234762753", - "price": "2.0", - "price_r": { - "d": 1, - "n": 2 - }, - "selling_asset_code": "YEN", - "selling_asset_issuer": "GDVXG2FMFFSUMMMBIUEMWPZAIU2FNCH7QNGJMWRXRD6K5FZK5KJS4DDR", - "selling_asset_type": "credit_alphanum4", - "transaction_successful": true, - "type_i": 12, - "type": "manage_buy_offer" -} -``` - - -### Create Passive Sell Offer - -“Create Passive Sell Offer” operation creates an offer that won't consume a counter offer that exactly matches this offer. This is useful for offers just used as 1:1 exchanges for path payments. Use Manage Sell Offer to manage this offer after using this operation to create it. - -#### Attributes - -As in [Manage Sell Offer](#manage-sell-offer) operation. - -#### Example - -```json -{ - "_links": { - "effects": { - "href": "/operations/1127729562914817/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=1127729562914817\u0026order=asc" - }, - "self": { - "href": "/operations/1127729562914817" - }, - "succeeds": { - "href": "/operations?cursor=1127729562914817\u0026order=desc" - }, - "transaction": { - "href": "/transactions/1127729562914816" - } - }, - "amount": "11.27827", - "buying_asset_code": "USD", - "buying_asset_issuer": "GDS5JW5E6DRSSN5XK4LW7E6VUMFKKE2HU5WCOVFTO7P2RP7OXVCBLJ3Y", - "buying_asset_type": "credit_alphanum4", - "id": "1127729562914817", - "offer_id": "9", - "paging_token": "1127729562914817", - "price": "1.0", - "price_r": { - "d": 1, - "n": 1 - }, - "selling_asset_type": "native", - "transaction_successful": true, - "type_i": 4, - "type": "create_passive_sell_offer" -} -``` - - - -### Set Options - -Use “Set Options” operation to set following options to your account: -* Set/clear account flags: - * AUTH_REQUIRED_FLAG (0x1) - if set, TrustLines are created with authorized set to `false` requiring the issuer to set it for each TrustLine. - * AUTH_REVOCABLE_FLAG (0x2) - if set, the authorized flag in TrustLines can be cleared. Otherwise, authorization cannot be revoked. -* Set the account’s inflation destination. -* Add new signers to the account. -* Set home domain. - - -#### Attributes - -| Field | Type | Description | -|-------------------|--------|------------------------------------------------------------------------------| -| signer_key | string | The public key of the new signer. | -| signer_weight | int | The weight of the new signer (1-255). | -| master_key_weight | int | The weight of the master key (1-255). | -| low_threshold | int | The sum weight for the low threshold. | -| med_threshold | int | The sum weight for the medium threshold. | -| high_threshold | int | The sum weight for the high threshold. | -| home_domain | string | The home domain used for reverse federation lookup | -| set_flags | array | The array of numeric values of flags that has been set in this operation | -| set_flags_s | array | The array of string values of flags that has been set in this operation | -| clear_flags | array | The array of numeric values of flags that has been cleared in this operation | -| clear_flags_s | array | The array of string values of flags that has been cleared in this operation | - - -#### Example - -```json -{ - "_links": { - "effects": { - "href": "/operations/696867033714691/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=696867033714691\u0026order=asc" - }, - "self": { - "href": "/operations/696867033714691" - }, - "succeeds": { - "href": "/operations?cursor=696867033714691\u0026order=desc" - }, - "transaction": { - "href": "/transactions/696867033714688" - } - }, - "high_threshold": 3, - "home_domain": "stellar.org", - "id": "696867033714691", - "low_threshold": 0, - "med_threshold": 3, - "paging_token": "696867033714691", - "set_flags": [ - 1 - ], - "set_flags_s": [ - "auth_required_flag" - ], - "transaction_successful": true, - "type_i": 5, - "type": "set_options" -} -``` - - -### Change Trust - -Use “Change Trust” operation to create/update/delete a trust line from the source account to another. The issuer being trusted and the asset code are in the given Asset object. - -#### Attributes - -| Field | Type | Description | -|--------------|--------|----------------------------------------------| -| asset_code | string | Asset code. | -| asset_issuer | string | Asset issuer. | -| asset_type | string | Asset type (native / alphanum4 / alphanum12) | -| trustee | string | Trustee account. | -| trustor | string | Trustor account. | -| limit | string | The limit for the asset. | - -#### Example - -```json -{ - "_links": { - "effects": { - "href": "/operations/574731048718337/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=574731048718337\u0026order=asc" - }, - "self": { - "href": "/operations/574731048718337" - }, - "succeeds": { - "href": "/operations?cursor=574731048718337\u0026order=desc" - }, - "transaction": { - "href": "/transactions/574731048718336" - } - }, - "asset_code": "CHP", - "asset_issuer": "GAC2ZUXVI5266NMMGDPBMXHH4BTZKJ7MMTGXRZGX2R5YLMFRYLJ7U5EA", - "asset_type": "credit_alphanum4", - "id": "574731048718337", - "limit": "5.0", - "paging_token": "574731048718337", - "trustee": "GAC2ZUXVI5266NMMGDPBMXHH4BTZKJ7MMTGXRZGX2R5YLMFRYLJ7U5EA", - "trustor": "GDVXG2FMFFSUMMMBIUEMWPZAIU2FNCH7QNGJMWRXRD6K5FZK5KJS4DDR", - "transaction_successful": true, - "type_i": 6, - "type": "change_trust" -} -``` - - -### Allow Trust - -Updates the "authorized" flag of an existing trust line this is called by the issuer of the asset. - -Heads up! Unless the issuing account has `AUTH_REVOCABLE_FLAG` set than the "authorized" flag can only be set and never cleared. - -#### Attributes - -| Field | Type | Description | -|--------------|--------|---------------------------------------------------------| -| asset_code | string | Asset code. | -| asset_issuer | string | Asset issuer. | -| asset_type | string | Asset type (native / alphanum4 / alphanum12) | -| authorize | bool | `true` when allowing trust, `false` when revoking trust | -| trustee | string | Trustee account. | -| trustor | string | Trustor account. | - -#### Example - -```json -{ - "_links": { - "effects": { - "href": "/operations/34359742465/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=34359742465\u0026order=asc" - }, - "self": { - "href": "/operations/34359742465" - }, - "succeeds": { - "href": "/operations?cursor=34359742465\u0026order=desc" - }, - "transaction": { - "href": "/transactions/34359742464" - } - }, - "asset_code": "USD", - "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", - "asset_type": "credit_alphanum4", - "authorize": true, - "id": "34359742465", - "paging_token": "34359742465", - "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", - "trustor": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", - "transaction_successful": true, - "type_i": 7, - "type": "allow_trust" -} -``` - - -### Account Merge - -Removes the account and transfers all remaining XLM to the destination account. - -#### Attributes - -| Field | Type | Description | -|-------|--------|-------------------------------------------------------------| -| into | string | Account ID where funds of deleted account were transferred. | - -#### Example -```json -{ - "_links": { - "effects": { - "href": "/operations/799357838299137/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=799357838299137\u0026order=asc" - }, - "self": { - "href": "/operations/799357838299137" - }, - "succeeds": { - "href": "/operations?cursor=799357838299137\u0026order=desc" - }, - "transaction": { - "href": "/transactions/799357838299136" - } - }, - "account": "GBCR5OVQ54S2EKHLBZMK6VYMTXZHXN3T45Y6PRX4PX4FXDMJJGY4FD42", - "id": "799357838299137", - "into": "GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K", - "paging_token": "799357838299137", - "transaction_successful": true, - "type_i": 8, - "type": "account_merge" -} -``` - - -### Inflation - -Runs inflation. - -#### Example - -```json -{ - "_links": { - "effects": { - "href": "/operations/12884914177/effects/{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "/operations?cursor=12884914177\u0026order=asc" - }, - "self": { - "href": "/operations/12884914177" - }, - "succeeds": { - "href": "/operations?cursor=12884914177\u0026order=desc" - }, - "transaction": { - "href": "/transactions/12884914176" - } - }, - "id": "12884914177", - "paging_token": "12884914177", - "transaction_successful": true, - "type_i": 9, - "type": "inflation" -} -``` - - -### Manage Data - -Set, modify or delete a Data Entry (name/value pair) for an account. - -#### Example - -```json -{ - "_links": { - "self": { - "href": "/operations/5250180907536385" - }, - "transaction": { - "href": "/transactions/e0710d3e410fe6b1ba77fcfec9e3789e94ff29b2424f1f4bf51e530dbbdf221c" - }, - "effects": { - "href": "/operations/5250180907536385/effects" - }, - "succeeds": { - "href": "/effects?order=desc&cursor=5250180907536385" - }, - "precedes": { - "href": "/effects?order=asc&cursor=5250180907536385" - } - }, - "id": "5250180907536385", - "paging_token": "5250180907536385", - "source_account": "GCGG3CIRBG2TTBR4HYZJ7JLDRFKZIYOAHFXRWLU62CA2QN52P2SUQNPJ", - "type": "manage_data", - "type_i": 10, - "transaction_successful": true, - "name": "lang", - "value": "aW5kb25lc2lhbg==" -} -``` - - -### Bump Sequence - -Bumps forward the sequence number of the source account of the operation, allowing it to invalidate any transactions with a smaller sequence number. - -#### Attributes - -| Field | Type | Description | -|--------|--------|-------------------------------------------------------------------| -| bumpTo | number | Desired value for the operation’s source account sequence number. | - -#### Example -```json -{ - "_links": { - "self": { - "href": "/operations/1743756726273" - }, - "transaction": { - "href": "/transactions/328436a8dffaf6ca33c08a93279234c7d3eaf1c028804152614187dc76b7168d" - }, - "effects": { - "href": "/operations/1743756726273/effects" - }, - "succeeds": { - "href": "/effects?order=desc&cursor=1743756726273" - }, - "precedes": { - "href": "/effects?order=asc&cursor=1743756726273" - } - }, - "id": "1743756726273", - "paging_token": "1743756726273", - "source_account": "GBHPJ3VMVT3X7Y6HIIAPK7YPTZCF3CWO4557BKGX2GVO4O7EZHIBELLH", - "type": "bump_sequence", - "type_i": 11, - "transaction_hash": "328436a8dffaf6ca33c08a93279234c7d3eaf1c028804152614187dc76b7168d", - "bump_to": "1273737228" -} -``` - -## Endpoints - -| Resource | Type | Resource URI Template | -|----------------------------------------------------|------------|-------------------------------------------------| -| [All Operations](../endpoints/operations-all.md) | Collection | `/operations` | -| [Operations Details](../endpoints/operations-single.md) | Single | `/operations/:id` | -| [Ledger Operations](../endpoints/operations-for-ledger.md) | Collection | `/ledgers/{id}/operations{?cursor,limit,order}` | -| [Account Operations](../endpoints/operations-for-account.md) | Collection | `/accounts/:account_id/operations` | -| [Account Payments](../endpoints/payments-for-account.md) | Collection | `/accounts/:account_id/payments` | diff --git a/services/horizon/internal/docs/reference/resources/orderbook.md b/services/horizon/internal/docs/reference/resources/orderbook.md deleted file mode 100644 index c7e1e78b30..0000000000 --- a/services/horizon/internal/docs/reference/resources/orderbook.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Orderbook -replacement: https://developers.stellar.org/api/aggregations/order-books/ ---- - -[Orderbooks](https://www.stellar.org/developers/learn/concepts/exchange.html) are collections of offers for each issuer and currency pairs. Let's say you wanted to exchange EUR issued by a particular bank for BTC issued by a particular exchange. You would look at the orderbook and see who is buying `foo_bank/EUR` and selling `baz_exchange/BTC` and at what prices. - -## Attributes -| Attribute | Type | | -|--------------|------------------|------------------------------------------------------------------------------------------------------------------------| -| bids | object | Array of {`price_r`, `price`, `amount`} objects (see [offers](./offer.md)). These represent prices and amounts accounts are willing to buy for the given `selling` and `buying` pair. | -| asks | object | Array of {`price_r`, `price`, `amount`} objects (see [offers](./offer.md)). These represent prices and amounts accounts are willing to sell for the given `selling` and `buying` pair.| -| base | [Asset](http://stellar.org/developers/learn/concepts/assets.html) | The Asset this offer wants to sell.| -| counter | [Asset](http://stellar.org/developers/learn/concepts/assets.html) | The Asset this offer wants to buy.| - -#### Bid Object -| Attribute | Type | | -| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ | -| price_r | object | An object of a number numerator and number denominator that represents the bid price. | -| price | string | The bid price of the asset. A number representing the decimal form of price_r | -| amount | string | The amount of asset bid offer. | - -#### Ask Object -| Attribute | Type | | -| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ | -| price_r | object | An object of a number numerator and number denominator that represents the ask price. | -| price | string | The ask price of the asset. A number representing the decimal form of price_r | -| amount | string | The amount of asset ask offer. | - -#### Price_r Object -Price_r is a more precise representation of a bid/ask offer. - -| Attribute | Type | | -| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ | -| n | number | The numerator. | -| d | number | The denominator. | - -Thus to get price you would take n / d. - -## Links - -This resource has no links. - - -## Endpoints - -| Resource | Type | Resource URI Template | -|--------------------------|------------|--------------------------------------| -| [Orderbook Details](../endpoints/orderbook-details.md) | Single | `/orderbook?{orderbook_params}` | -| [Trades](../endpoints/trades.md) | Collection | `/trades?{orderbook_params}` | diff --git a/services/horizon/internal/docs/reference/resources/page.md b/services/horizon/internal/docs/reference/resources/page.md deleted file mode 100644 index 6c90db63bf..0000000000 --- a/services/horizon/internal/docs/reference/resources/page.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Page -replacement: https://developers.stellar.org/api/introduction/pagination/page-arguments/ ---- - -Pages represent a subset of a larger collection of objects. -As an example, it would be unfeasible to provide the -[All Transactions](../endpoints/transactions-all.md) endpoint without paging. Over time there -will be millions of transactions in the Stellar network's ledger and returning -them all over a single request would be unfeasible. - -## Attributes - -A page itself exposes no attributes. It is merely a container for embedded -records and some links to aid in iterating the entire collection the page is -part of. - -## Cursor -A `cursor` is a number that points to a specific location in a collection of resources. - -The `cursor` attribute itself is an opaque value meaning that users should not try to parse it. - -## Embedded Resources - -A page contains an embedded set of `records`, regardless of the contained resource. - -## Links - -A page provides a couple of links to ease in iteration. - -| | Example | Relation | -| ---- | ------------------------------------------------------ | ---------------------------- | -| self | `/transactions` | | -| prev | `/transactions?cursor=12884905984&order=desc&limit=10` | The previous page of results | -| next | `/transactions?cursor=12884905984&order=asc&limit=10` | The next page of results | - -## Example - -```json -{ - "_embedded": { - "records": [ - { - "_links": { - "self": { - "href": "/operations/12884905984" - }, - "transaction": { - "href": "/transaction/6391dd190f15f7d1665ba53c63842e368f485651a53d8d852ed442a446d1c69a" - }, - "precedes": { - "href": "/account/GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ/payments?cursor=12884905984&order=asc{?limit}", - "templated": true - }, - "succeeds": { - "href": "/account/GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ/payments?cursor=12884905984&order=desc{?limit}", - "templated": true - } - }, - "id": 12884905984, - "paging_token": "12884905984", - "type_i": 0, - "type": "payment", - "sender": "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ", - "receiver": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", - "asset": { - "code": "XLM" - }, - "amount": 1000000000, - "amount_f": 100.00 - } - ] - }, - "_links": { - "next": { - "href": "/account/GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ/payments?cursor=12884905984&order=asc&limit=100" - }, - "prev": { - "href": "/account/GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ/payments?cursor=12884905984&order=desc&limit=100" - }, - "self": { - "href": "/account/GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ/payments?limit=100" - } - } -} - -``` - -## Endpoints - -Any endpoint that provides a collection of resources will represent them as pages. - diff --git a/services/horizon/internal/docs/reference/resources/path.md b/services/horizon/internal/docs/reference/resources/path.md deleted file mode 100644 index 20c87b2bc9..0000000000 --- a/services/horizon/internal/docs/reference/resources/path.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Payment Path -replacement: https://developers.stellar.org/api/aggregations/paths/ ---- - -A **path** resource contains information about a payment path. A path can be used by code to populate necessary fields on path payment operation, such as `path` and `sendMax`. - - -## Attributes -| Attribute | Type | | -|--------------------------|------------------|--------------------------------------------------------------------------------------------------------------------------------| -| path | array of objects | An array of assets that represents the intermediary assets this path hops through | -| source_amount | string | An estimated cost for making a payment of destination_amount on this path. Suitable for use in a path payments `sendMax` field | -| destination_amount | string | The destination amount specified in the search that found this path | -| destination_asset_type | string | The type for the destination asset specified in the search that found this path | -| destination_asset_code | optional, string | The code for the destination asset specified in the search that found this path | -| destination_asset_issuer | optional, string | The issuer for the destination asset specified in the search that found this path | -| source_asset_type | string | The type for the source asset specified in the search that found this path | -| source_asset_code | optional, string | The code for the source asset specified in the search that found this path | -| source_asset_issuer | optional, string | The issuer for the source asset specified in the search that found this path | - -#### Asset Object -| Attribute | Type | | -|--------------|------------------|------------------------------------------------------------------------------------------------------------------------ -| asset_code | optional, string | The code for the asset. | -| asset_type | string | Either native, credit_alphanum4, or credit_alphanum12. | -| asset_issuer | optional, string | The stellar address of the given asset's issuer. | - -## Example - -```json -{ - "destination_amount": "20.0000000", - "destination_asset_code": "EUR", - "destination_asset_issuer": "GDSBCQO34HWPGUGQSP3QBFEXVTSR2PW46UIGTHVWGWJGQKH3AFNHXHXN", - "destination_asset_type": "credit_alphanum4", - "path": [ - { - "asset_code": "1", - "asset_issuer": "GDSBCQO34HWPGUGQSP3QBFEXVTSR2PW46UIGTHVWGWJGQKH3AFNHXHXN", - "asset_type": "credit_alphanum4" - } - ], - "source_amount": "20.0000000", - "source_asset_code": "USD", - "source_asset_issuer": "GDSBCQO34HWPGUGQSP3QBFEXVTSR2PW46UIGTHVWGWJGQKH3AFNHXHXN", - "source_asset_type": "credit_alphanum4" -} -``` - -## Endpoints -| Resource | Type | Resource URI Template | -|------------------------------------------|------------|-----------------------| -| [Find Payment Paths](../endpoints/path-finding.md) | Collection | `/paths` | diff --git a/services/horizon/internal/docs/reference/resources/trade.md b/services/horizon/internal/docs/reference/resources/trade.md deleted file mode 100644 index 08434dcd63..0000000000 --- a/services/horizon/internal/docs/reference/resources/trade.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Trade ---- - -A trade represents a fulfilled offer. For example, let's say that there exists an offer to sell 9 `foo_bank/EUR` for 3 `baz_exchange/BTC` and you make an offer to buy 3 `foo_bank/EUR` for 1 `baz_exchange/BTC`. Since your offer and the existing one cross, a trade happens. After the trade completes: - -- you are 3 `foo_bank/EUR` richer and 1 `baz_exchange/BTC` poorer -- the maker of the other offer is 1 `baz_exchange/BTC` richer and 3 `foo_bank/EUR` poorer -- your offer is completely fulfilled and no longer exists -- the other offer is partially fulfilled and becomes an offer to sell 6 `foo_bank/EUR` for 2 `baz_exchange/BTC`. The price of that offer doesn't change, but the amount does. - -Trades can also be caused by successful [path payments](https://www.stellar.org/developers/learn/concepts/exchange.html), because path payments involve fulfilling offers. - -Payments are one-way in that afterwards, the source account has a smaller balance and the destination account of the payment has a bigger one. Trades are two-way; both accounts increase and decrease their balances. - -A trade occurs between two parties - `base` and `counter`. Which is either arbitrary or determined by the calling query. - -## Attributes -| Attribute | Type | | -|--------------|------------------|------------------------------------------------------------------------------------------------------------------------| -| id | string | The ID of this trade. | -| paging_token | string | A [paging token](./page.md) suitable for use as a `cursor` parameter.| -| ledger_close_time | string | An ISO 8601 formatted string of when the ledger with this trade was closed.| -| offer_id | string | DEPRECATED. the sell offer id. -| base_account | string | base party of this trade| -| base_offer_id | string | the base offer id. If this offer was immediately fully consumed this will be a synthetic id -| base_amount | string | amount of base asset that was moved from `base_account` to `counter_account`| -| base_asset_type | string | type of base asset| -| base_asset_code | string | code of base asset| -| base_asset_issuer | string | issuer of base asset| -| counter_offer_id | string | the counter offer id. If this offer was immediately fully consumed this will be a synthetic id -| counter_account | string | counter party of this trade| -| counter_amount | string | amount of counter asset that was moved from `counter_account` to `base_account`| -| counter_asset_type | string | type of counter asset| -| counter_asset_code | string | code of counter asset| -| counter_asset_issuer | string | issuer of counter asset| -| price | object | original offer price, expressed as a rational number. example: {n:7, d:3} -| base_is_seller | boolean | indicates which party of the trade made the sell offer| - -#### Price Object -Price is a precise representation of a bid/ask offer. - -| Attribute | Type | | -| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ | -| n | number | The numerator. | -| d | number | The denominator. | - -Thus to get price you would take n / d. - -#### Synthetic Offer Ids -Offer ids in the horizon trade resource (base_offer_id, counter_offer_id) are synthetic and don't always reflect the respective stellar-core offer ids. This is due to the fact that stellar-core does not assign offer ids when an offer gets filled immediately. In these cases, Horizon synthetically generates an offer id for the buying offer, based on the total order id of the offer operation. This allows wallets to aggregate historical trades based on offer ids without adding special handling for edge cases. The exact encoding can be found [here](https://github.com/stellar/go/blob/master/services/horizon/internal/db2/history/synt_offer_id.go). - -## Links - -| rel | Example | Description | `templated` | -|--------------|---------------------------------------------------------------------------------------------------|------------------------------------------------------------|-------------| -| base | `/accounts/{base_account}` | Link to details about the base account| true | -| counter | `/accounts/{counter_account}` | Link to details about the counter account | true | -| operation | `/operation/{operation_id}` | Link to the operation of the assets bought and sold. | true | - -## Endpoints - -| Resource | Type | Resource URI Template | -|--------------------------|------------|--------------------------------------| -| [Trades](../endpoints/trades.md) | Collection | `/trades` | -| [Account Trades](../endpoints/trades-for-account.md) | Collection | `/accounts/:account_id/trades` | diff --git a/services/horizon/internal/docs/reference/resources/trade_aggregation.md b/services/horizon/internal/docs/reference/resources/trade_aggregation.md deleted file mode 100644 index d1019e7f0c..0000000000 --- a/services/horizon/internal/docs/reference/resources/trade_aggregation.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Trade Aggregation -replacement: https://developers.stellar.org/api/aggregations/trade-aggregations/ ---- - -A Trade Aggregation represents aggregated statistics on an asset pair (`base` and `counter`) for a specific time period. - -## Attributes -| Attribute | Type | | -|--------------|------------------|------------------------------------------------------------------------------------------------------------------------| -| timestamp | string | start time for this trade_aggregation. Represented as milliseconds since epoch.| -| trade_count | int | total number of trades aggregated.| -| base_volume | string | total volume of `base` asset.| -| counter_volume | string | total volume of `counter` asset.| -| avg | string | weighted average price of `counter` asset in terms of `base` asset.| -| high | string | highest price for this time period.| -| high_r | object | highest price for this time period as a rational number.| -| low | string | lowest price for this time period.| -| low_r | object | lowest price for this time period as a rational number.| -| open | string | price as seen on first trade aggregated.| -| open_r | object | price as seen on first trade aggregated as a rational number.| -| close | string | price as seen on last trade aggregated.| -| close_r | object | price as seen on last trade aggregated as a rational number.| - -#### Price_r Object -Price_r (high_r, low_r, open_r, close_r) is a more precise representation of a bid/ask offer. - -| Attribute | Type | | -| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ | -| n | number | The numerator. | -| d | number | The denominator. | - -Thus to get price you would take n / d. - -## Endpoints - -| Resource | Type | Resource URI Template | -|--------------------------|------------|--------------------------------------| -| [Trade Aggregations](../endpoints/trade_aggregations.md) | Collection | `/trade_aggregations?{orderbook_params}` | diff --git a/services/horizon/internal/docs/reference/resources/transaction.md b/services/horizon/internal/docs/reference/resources/transaction.md deleted file mode 100644 index ac4c5b488b..0000000000 --- a/services/horizon/internal/docs/reference/resources/transaction.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: Transaction -replacement: https://developers.stellar.org/api/resources/transactions/ ---- - -**Transactions** are the basic unit of change in the Stellar Network. - -A transaction is a grouping of [operations](./operation.md). - -To learn more about the concept of transactions in the Stellar network, take a look at the [Stellar transactions concept guide](https://www.stellar.org/developers/learn/concepts/transactions.html). - -## Attributes - -| Attribute | Type | | -|-------------------------|--------------------------|--------------------------------------------------------------------------------------------------------------------------------| -| id | string | The canonical id of this transaction, suitable for use as the :id parameter for url templates that require a transaction's ID. | -| paging_token | string | A [paging token](./page.md) suitable for use as the `cursor` parameter to transaction collection resources. | -| successful | bool | Indicates if transaction was successful or not. | -| hash | string | A hex-encoded, lowercase SHA-256 hash of the transaction's [XDR](../../learn/xdr.md)-encoded form. | -| ledger | number | Sequence number of the ledger in which this transaction was applied. | -| created_at | ISO8601 string | | -| fee_account | string | The account which paid for the transaction fees | -| source_account | string | | -| source_account_sequence | string | | -| max_fee | number | The the maximum fee the fee account was willing to pay. | -| fee_charged | number | The fee paid by the fee account of this transaction when the transaction was applied to the ledger. | -| operation_count | number | The number of operations that are contained within this transaction. | -| envelope_xdr | string | A base64 encoded string of the raw `TransactionEnvelope` xdr struct for this transaction | -| result_xdr | string | A base64 encoded string of the raw `TransactionResult` xdr struct for this transaction | -| result_meta_xdr | string | A base64 encoded string of the raw `TransactionMeta` xdr struct for this transaction | -| fee_meta_xdr | string | A base64 encoded string of the raw `LedgerEntryChanges` xdr struct produced by taking fees for this transaction. | -| memo_type | string | The type of memo set in the transaction. Possible values are `none`, `text`, `id`, `hash`, and `return`. | -| memo | string | The string representation of the memo set in the transaction. When `memo_type` is `id`, the `memo` is a decimal string representation of an unsigned 64 bit integer. When `memo_type` is `hash` or `return`, the `memo` is a base64 encoded string. When `memo_type` is `text`, the `memo` is a unicode string. However, if the original memo byte sequence in the transaction XDR is not valid unicode, Horizon will replace any invalid byte sequences with the utf-8 replacement character. Note this field is only present when `memo_type` is not `none`. | -| memo_bytes | string | A base64 encoded string of the memo bytes set in the transaction's xdr envelope. Note this field is only present when `memo_type` is `text`. | -| signatures | string[] | An array of signatures used to sign this transaction | -| valid_after | RFC3339 date-time string | | -| valid_before | RFC3339 date-time string | | -| fee_bump_transaction | object | This object is only present if the transaction is a fee bump transaction or is wrapped by a fee bump transaction. The object has two fields: `hash` (the hash of the fee bump transaction) and `signatures` (the signatures present in the fee bump transaction envelope) | -| inner_transaction | object | This object is only present if the transaction is a fee bump transaction or is wrapped by a fee bump transaction. The object has three fields: `hash` (the hash of the inner transaction wrapped by the fee bump transaction), `max_fee` (the max fee set in the inner transaction), and `signatures` (the signatures present in the inner transaction envelope) | - -## Links - -| rel | Example | Description | -|------------|------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------| -| self | `https://horizon-testnet.stellar.org/transactions/cb9a25394acb6fe0d1d9bdea5afc01cafe2c6fde59a96ddceb2564a65780a81f` | | -| account | `https://horizon-testnet.stellar.org/accounts/GCDLRUXOD6KA53G5ILL435TZAISNLPS4EKIHSOVY3MVD3DVJ333NO4DT` | The source [account](../endpoints/accounts-single.md) for this transaction. | -| ledger | `https://horizon-testnet.stellar.org/ledgers/2352988` | The [ledger](../endpoints/ledgers-single.md) in which this transaction was applied. | -| operations | `https://horizon-testnet.stellar.org/transactions/cb9a25394acb6fe0d1d9bdea5afc01cafe2c6fde59a96ddceb2564a65780a81f/operations{?cursor,limit,order}"` | [Operations](../endpoints/operations-for-transaction.md) included in this transaction. | -| effects | `https://horizon-testnet.stellar.org/transactions/cb9a25394acb6fe0d1d9bdea5afc01cafe2c6fde59a96ddceb2564a65780a81f/effects{?cursor,limit,order}"` | [Effects](../endpoints/effects-for-transaction.md) which resulted by operations in this transaction. | -| precedes | `https://horizon-testnet.stellar.org/transactions?order=asc&cursor=10106006507900928` | A collection of transactions that occur after this transaction. | -| succeeds | `https://horizon-testnet.stellar.org/transactions?order=desc&cursor=10106006507900928` | A collection of transactions that occur before this transaction. | - -## Example - -```json -{ - "_links": { - "self": { - "href": "https://horizon-testnet.stellar.org/transactions/cb9a25394acb6fe0d1d9bdea5afc01cafe2c6fde59a96ddceb2564a65780a81f" - }, - "account": { - "href": "https://horizon-testnet.stellar.org/accounts/GCDLRUXOD6KA53G5ILL435TZAISNLPS4EKIHSOVY3MVD3DVJ333NO4DT" - }, - "ledger": { - "href": "https://horizon-testnet.stellar.org/ledgers/2352988" - }, - "operations": { - "href": "https://horizon-testnet.stellar.org/transactions/cb9a25394acb6fe0d1d9bdea5afc01cafe2c6fde59a96ddceb2564a65780a81f/operations{?cursor,limit,order}", - "templated": true - }, - "effects": { - "href": "https://horizon-testnet.stellar.org/transactions/cb9a25394acb6fe0d1d9bdea5afc01cafe2c6fde59a96ddceb2564a65780a81f/effects{?cursor,limit,order}", - "templated": true - }, - "precedes": { - "href": "https://horizon-testnet.stellar.org/transactions?order=asc&cursor=10106006507900928" - }, - "succeeds": { - "href": "https://horizon-testnet.stellar.org/transactions?order=desc&cursor=10106006507900928" - } - }, - "id": "cb9a25394acb6fe0d1d9bdea5afc01cafe2c6fde59a96ddceb2564a65780a81f", - "paging_token": "10106006507900928", - "successful": true, - "hash": "cb9a25394acb6fe0d1d9bdea5afc01cafe2c6fde59a96ddceb2564a65780a81f", - "ledger": 2352988, - "created_at": "2019-02-21T21:44:13Z", - "source_account": "GCDLRUXOD6KA53G5ILL435TZAISNLPS4EKIHSOVY3MVD3DVJ333NO4DT", - "fee_account": "GCDLRUXOD6KA53G5ILL435TZAISNLPS4EKIHSOVY3MVD3DVJ333NO4DT", - "source_account_sequence": "10105916313567234", - "max_fee": 100, - "fee_charged":100, - "operation_count": 1, - "envelope_xdr": "AAAAAIa40u4flA7s3ULXzfZ5AiTVvlwikHk6uNsqPY6p3vbXAAAAZAAj50cAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAB2Fmc2RmYXMAAAAAAQAAAAAAAAABAAAAAIa40u4flA7s3ULXzfZ5AiTVvlwikHk6uNsqPY6p3vbXAAAAAAAAAAEqBfIAAAAAAAAAAAGp3vbXAAAAQKElK3CoNo1f8fWIGeJm98lw2AaFiyVVFhx3uFok0XVW3MHV9MubtEhfA+n1iLPrxmzHtHfmZsumWk+sOEQlSwI=", - "result_xdr": "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=", - "result_meta_xdr": "AAAAAQAAAAIAAAADACPnXAAAAAAAAAAAhrjS7h+UDuzdQtfN9nkCJNW+XCKQeTq42yo9jqne9tcAAAAXSHbnOAAj50cAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABACPnXAAAAAAAAAAAhrjS7h+UDuzdQtfN9nkCJNW+XCKQeTq42yo9jqne9tcAAAAXSHbnOAAj50cAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAA==", - "fee_meta_xdr": "AAAAAgAAAAMAI+dTAAAAAAAAAACGuNLuH5QO7N1C1832eQIk1b5cIpB5OrjbKj2Oqd721wAAABdIduecACPnRwAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAI+dcAAAAAAAAAACGuNLuH5QO7N1C1832eQIk1b5cIpB5OrjbKj2Oqd721wAAABdIduc4ACPnRwAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", - "memo_type": "text", - "memo": "afsdfas", - "valid_after": "1970-01-01T00:00:00Z", - "signatures": [ - "oSUrcKg2jV/x9YgZ4mb3yXDYBoWLJVUWHHe4WiTRdVbcwdX0y5u0SF8D6fWIs+vGbMe0d+Zmy6ZaT6w4RCVLAg==" - ] -} -``` - -## Endpoints - -| Resource | Type | Resource URI Template | -|--------------------------------------------------------|------------|--------------------------------------| -| [All Transactions](../endpoints/transactions-all.md) | Collection | `/transactions` (`GET`) | -| [Post Transaction](../endpoints/transactions-create.md) | Action | `/transactions` (`POST`) | -| [Transaction Details](../endpoints/transactions-single.md) | Single | `/transactions/:id` | -| [Account Transactions](../endpoints/transactions-for-account.md) | Collection | `/accounts/:account_id/transactions` | -| [Ledger Transactions](../endpoints/transactions-for-ledger.md) | Collection | `/ledgers/:ledger_id/transactions` | - - -## Submitting transactions -To submit a new transaction to Stellar network, it must first be built and signed locally. Then you can submit a hex representation of your transaction’s [XDR](../xdr.md) to the `/transactions` endpoint. Read more about submitting transactions in [Post Transaction](../endpoints/transactions-create.md) doc. diff --git a/services/horizon/internal/docs/reference/responses.md b/services/horizon/internal/docs/reference/responses.md deleted file mode 100644 index 151e11ca57..0000000000 --- a/services/horizon/internal/docs/reference/responses.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Response Format -replacement: https://developers.stellar.org/api/introduction/response-format/ ---- - -Rather than using a fully custom way of representing the resources we expose in -Horizon, we use [HAL](http://stateless.co/hal_specification.html). HAL is a -hypermedia format in JSON that remains simple while giving us a couple of -benefits such as simpler client integration for several languages. See [this -wiki page](https://github.com/mikekelly/hal_specification/wiki/Libraries) for a -list of libraries. - -## Attributes, Links, Embedded Resources - -At its simplest, a HAL response is just a JSON object with a couple of reserved -property names: `_links` is used for expressing links and `_embedded` is used -for bundling other HAL objects with the response. Other than links and embedded -objects, **HAL is just JSON**. - -### Links - -HAL is a hypermedia format, like HTML, in that it has a mechanism to express -links between documents. Let's look at a simple example: - -```json -{ - "_links": { - "self": { - "href": "/ledgers/1" - }, - "transactions": { - "href": "/ledgers/1/transactions{?cursor,limit,order}", - "templated": true - } - }, - "id": "43cf4db3741a7d6c2322e7b646320ce9d7b099a0b3501734dcf70e74a8a4e637", - "hash": "43cf4db3741a7d6c2322e7b646320ce9d7b099a0b3501734dcf70e74a8a4e637", - "prev_hash": "", - "sequence": 1, - "transaction_count": 0, - "operation_count": 0, - "closed_at": "0001-01-01T00:00:00Z", - "total_coins": "100000000000.0000000", - "fee_pool": "0.0000000", - "base_fee_in_stroops": 100, - "base_reserve_in_stroops": 100000000, - "max_tx_set_size": 50 -} -``` - -The above response is for the genesis ledger of the Stellar test network, and -the links in the `_links` attribute provide links to other relavant resources in -Horizon. Notice the object beneath the `transactions` key. The key of each -link specifies that links relation to the current resource, and in this case -`transactions` means "Transactions that occurred in this ledger". Logically, -you should expect that resource to respond with a collection of transactions -with all of the results having a `ledger_sequence` attribute equal to 1. - -The `transactions` link is also _templated_, which means that the `href` -attribute of the link is actually a URI template, as specified by [RFC -6570](https://tools.ietf.org/html/rfc6570). We use URI templates to show you -what parameters a given resource can take. You must evaluate the template to a -valid URI before navigating to it. - -## Pages - -Pages represent a subset of a larger collection of objects. -As an example, it would be unfeasible to provide the -[All Transactions](../reference/endpoints/transactions-all.md) endpoint without paging. -Over time there will be millions of transactions in the Stellar network's ledger -and returning them all over a single request would be unfeasible. - -Read more about paging in following docs: -- [Page](../reference/resources/page.md) -- [Paging](./paging.md) diff --git a/services/horizon/internal/docs/reference/streaming.md b/services/horizon/internal/docs/reference/streaming.md deleted file mode 100644 index 4cc4aee979..0000000000 --- a/services/horizon/internal/docs/reference/streaming.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Streaming -replacement: https://developers.stellar.org/api/introduction/streaming/ ---- - -## Streaming - -Certain endpoints in Horizon can be called in streaming mode using Server-Sent Events. This mode will keep the connection to Horizon open and Horizon will continue to return responses as ledgers close. All parameters for the endpoints that allow this mode are the same. The way a caller initiates this mode is by setting `Accept: text/event-stream` in the HTTP header when you make the request. -You can read an example of using the streaming mode in the [Follow Received Payments](./tutorials/follow-received-payments.md) tutorial. - -Endpoints that currently support streaming: -* [Account](./endpoints/accounts-single.md) -* [Effects](./endpoints/effects-all.md) -* [Ledgers](./endpoints/ledgers-all.md) -* [Offers](./endpoints/offers-for-account.md) -* [Operations](./endpoints/operations-all.md) -* [Orderbook](./endpoints/orderbook-details.md) -* [Payments](./endpoints/payments-all.md) -* [Transactions](./endpoints/transactions-all.md) -* [Trades](./endpoints/trades.md) diff --git a/services/horizon/internal/docs/reference/tutorials/follow-received-payments.md b/services/horizon/internal/docs/reference/tutorials/follow-received-payments.md deleted file mode 100644 index 667384ae68..0000000000 --- a/services/horizon/internal/docs/reference/tutorials/follow-received-payments.md +++ /dev/null @@ -1,213 +0,0 @@ ---- -title: Follow Received Payments ---- - -This tutorial shows how easy it is to use Horizon to watch for incoming payments on an [account](../../reference/resources/account.md) -using JavaScript and `EventSource`. We will eschew using [`js-stellar-sdk`](https://github.com/stellar/js-stellar-sdk), the -high-level helper library, to show that it is possible for you to perform this -task on your own, with whatever programming language you would like to use. - -This tutorial assumes that you: - -- Have node.js installed locally on your machine. -- Have curl installed locally on your machine. -- Are running on Linux, OS X, or any other system that has access to a bash-like - shell. -- Are familiar with launching and running commands in a terminal. - -In this tutorial we will learn: - -- How to create a new account. -- How to fund your account using friendbot. -- How to follow payments to your account using curl and EventSource. - -## Project Skeleton - -Let's get started by building our project skeleton: - -```bash -$ mkdir follow_tutorial -$ cd follow_tutorial -$ npm install --save stellar-base -$ npm install --save eventsource -``` - -This should have created a `package.json` in the `follow_tutorial` directory. -You can check that everything went well by running the following command: - -```bash -$ node -e "require('stellar-base')" -``` - -Everything was successful if no output it generated from the above command. Now -let's write a script to create a new account. - -## Creating an account - -Create a new file named `make_account.js` and paste the following text into it: - -```javascript -var Keypair = require("stellar-base").Keypair; - -var newAccount = Keypair.random(); - -console.log("New key pair created!"); -console.log(" Account ID: " + newAccount.publicKey()); -console.log(" Secret: " + newAccount.secret()); -``` - -Save the file and run it: - -```bash -$ node make_account.js -New key pair created! - Account ID: GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3 - Secret: SCU36VV2OYTUMDSSU4EIVX4UUHY3XC7N44VL4IJ26IOG6HVNC7DY5UJO -$ -``` - -Before our account can do anything it must be funded. Indeed, before an account -is funded it does not truly exist! - -## Funding your account - -The Stellar test network provides the Friendbot, a tool that developers -can use to get testnet lumens for testing purposes. To fund your account, simply -execute the following curl command: - -```bash -$ curl "https://friendbot.stellar.org/?addr=GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3" -``` - -Don't forget to replace the account id above with your own. If the request -succeeds, you should see a response like: - -```json -{ - "hash": "ed9e96e136915103f5d8978cbb2036628e811f2c59c4c3d88534444cf504e360", - "result": "received", - "submission_result": "000000000000000a0000000000000001000000000000000000000000" -} -``` - -After a few seconds, the Stellar network will perform consensus, close the -ledger, and your account will have been created. Next up we will write a command -that watches for new payments to your account and outputs a message to the -terminal. - -## Following payments using `curl` - -To follow new payments connected to your account you simply need to send `Accept: text/event-stream` header to the [/payments](../../reference/endpoints/payments-all.md) endpoint. - -```bash -$ curl -H "Accept: text/event-stream" "https://horizon-testnet.stellar.org/accounts/GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3/payments" -``` - -As a result you will see something like: - -```bash -retry: 1000 -event: open -data: "hello" - -id: 713226564145153 -data: {"_links":{"effects":{"href":"/operations/713226564145153/effects/{?cursor,limit,order}","templated":true}, - "precedes":{"href":"/operations?cursor=713226564145153\u0026order=asc"}, - "self":{"href":"/operations/713226564145153"}, - "succeeds":{"href":"/operations?cursor=713226564145153\u0026order=desc"}, - "transactions":{"href":"/transactions/713226564145152"}}, - "account":"GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3", - "funder":"GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K", - "id":713226564145153, - "paging_token":"713226564145153", - "starting_balance":"10000", - "type_i":0, - "type":"create_account"} -``` - -Every time you receive a new payment you will get a new row of data. Payments is not the only endpoint that supports streaming. You can also stream transactions [/transactions](../../reference/endpoints/transactions-all.md) and operations [/operations](../../reference/endpoints/operations-all.md). - -## Following payments using `EventStream` - -> **Warning!** `EventSource` object does not reconnect for certain error types so it can stop working. -> If you need a reliable streaming connection please use our [SDK](https://github.com/stellar/js-stellar-sdk). - -Another way to follow payments is writing a simple JS script that will stream payments and print them to console. Create `stream_payments.js` file and paste the following code into it: - -```js -var EventSource = require('eventsource'); -var es = new EventSource('https://horizon-testnet.stellar.org/accounts/GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3/payments'); -es.onmessage = function(message) { - var result = message.data ? JSON.parse(message.data) : message; - console.log('New payment:'); - console.log(result); -}; -es.onerror = function(error) { - console.log('An error occurred!'); -} -``` -Now, run our script: `node stream_payments.js`. You should see following output: -```bash -New payment: -{ _links: - { effects: - { href: '/operations/713226564145153/effects/{?cursor,limit,order}', - templated: true }, - precedes: { href: '/operations?cursor=713226564145153&order=asc' }, - self: { href: '/operations/713226564145153' }, - succeeds: { href: '/operations?cursor=713226564145153&order=desc' }, - transactions: { href: '/transactions/713226564145152' } }, - account: 'GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3', - funder: 'GBS43BF24ENNS3KPACUZVKK2VYPOZVBQO2CISGZ777RYGOPYC2FT6S3K', - id: 713226564145153, - paging_token: '713226564145153', - starting_balance: '10000', - type_i: 0, - type: 'create_account' } -``` - -## Testing it out - -We now know how to get a stream of transactions to an account. Let's check if our solution actually works and if new payments appear. Let's watch as we send a payment ([`create_account` operation](../../../guides/concepts/list-of-operations.html#create-account)) from our account to another account. - -We use the `create_account` operation because we are sending payment to a new, unfunded account. If we were sending payment to an account that is already funded, we would use the [`payment` operation](../../../guides/concepts/list-of-operations.html#payment). - -First, let's check our account sequence number so we can create a payment transaction. To do this we send a request to horizon: - -```bash -$ curl "https://horizon-testnet.stellar.org/accounts/GB7JFK56QXQ4DVJRNPDBXABNG3IVKIXWWJJRJICHRU22Z5R5PI65GAK3" -``` - -Sequence number can be found under the `sequence` field. The current sequence number is `713226564141056`. Save this value somewhere. - -Now, create `make_payment.js` file and paste the following code into it: - -```js -var StellarBase = require("stellar-base"); -StellarBase.Network.useTestNetwork(); - -var keypair = StellarBase.Keypair.fromSecret('SCU36VV2OYTUMDSSU4EIVX4UUHY3XC7N44VL4IJ26IOG6HVNC7DY5UJO'); -var account = new StellarBase.Account(keypair.publicKey(), "713226564141056"); - -var amount = "100"; -var transaction = new StellarBase.TransactionBuilder(account) - .addOperation(StellarBase.Operation.createAccount({ - destination: StellarBase.Keypair.random().publicKey(), - startingBalance: amount - })) - .build(); - -transaction.sign(keypair); - -console.log(transaction.toEnvelope().toXDR().toString("base64")); -``` - -After running this script you should see a signed transaction blob. To submit this transaction we send it to horizon or stellar-core. But before we do, let's open a new console and start our previous script by `node stream_payments.js`. - -Now to send a transaction just use horizon: - -```bash -curl -H "Content-Type: application/json" -X POST -d '{"tx":"AAAAAH6Sq76F4cHVMWvGG4AtNtFVIvayUxSgR401rPY9ej3TAAAD6AACiK0AAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAKc1j3y10+nI+sxuXlmFz71JS35mp/RcPCP45Gw0obdAAAAAAAAAAAAExLQAAAAAAAAAAAT16PdMAAABAsJTBC5N5B9Q/9+ZKS7qkMd/wZHWlP6uCCFLzeD+JWT60/VgGFCpzQhZmMg2k4Vg+AwKJTwko3d7Jt3Y6WhjLCg=="}' "https://horizon-testnet.stellar.org/transactions" -``` - -You should see a new payment in a window running `stream_payments.js` script. diff --git a/services/horizon/internal/docs/reference/xdr.md b/services/horizon/internal/docs/reference/xdr.md deleted file mode 100644 index c80063394c..0000000000 --- a/services/horizon/internal/docs/reference/xdr.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: XDR -replacement: https://developers.stellar.org/api/introduction/xdr/ ---- - -**XDR**, also known as _External Data Representation_, is used extensively in -the Stellar Network, especially in the core protocol. The ledger, transactions, results, -history, and even the messages passed between computers running stellar-core -are encoded using XDR. - -XDR is specified in [RFC 4506](http://tools.ietf.org/html/rfc4506.html). - -Since XDR is a binary format and not known as widely as JSON for example, we try -to hide most of it from Horizon. Instead, we opt to interpret the XDR for you -and present the values as JSON attributes. That said, we also expose the XDR -to you so you can get access to the raw, canonical data. - -In general, Horizon will encode the XDR structures in base64 so that they can be -transmitted within a json body. You should decode the base64 string -into a byte stream, then decode the XDR into an in-memory data structure. - -## .X files - -Data structures in XDR are specified in an _interface definition file_ (IDL). -The IDL files used for the Stellar Network are available -[on GitHub](https://github.com/stellar/stellar-core/tree/master/src/xdr).

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