From 0c3acc86f28182d02b59fc55ddb1da5d09517b33 Mon Sep 17 00:00:00 2001 From: Giuliano Losa Date: Thu, 19 Oct 2023 09:42:47 -0700 Subject: [PATCH 01/16] update tier-1-orgs (#248) * update tier-1-orgs * point to #validators channel on discord instead of keybase Co-authored-by: Justin Rice * formatting * QSet -> quorum set * update Tier-1 orgs intro --------- Co-authored-by: Justin Rice --- docs/run-core-node/tier-1-orgs.mdx | 40 ++++++++++++++++++------------ 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/docs/run-core-node/tier-1-orgs.mdx b/docs/run-core-node/tier-1-orgs.mdx index ffa8c7caf..864a8023e 100644 --- a/docs/run-core-node/tier-1-orgs.mdx +++ b/docs/run-core-node/tier-1-orgs.mdx @@ -3,39 +3,45 @@ title: Tier 1 Organizations sidebar_position: 120 --- -To help with Stellar’s decentralization, the most reliable and advanced Stellar teams join the ranks of “Tier 1 Organizations.” These organizations run three validators, coordinate any changes to their quorumsets, and hold themselves to a higher standard of uptime and responsiveness. +To help with Stellar’s decentralization, the most advanced teams building on Stellar run validators and strive to join the ranks of “Tier 1 organizations.” -SDF works closely with Tier 1 Orgs to ensure the health of the network, maintain good quorum intersection, and build in redundancy to minimize network disruptions. This guide outlines what it takes to be a Tier 1 Org. +Remember that the Stellar network consists of organizations that each run validators, and each organization decides for itself, by configuring a quorum set, which and how many other organizations it requires agreement from in order to commit to a particular new ledger. Tier 1 organizations are a group of organizations that, due to the fact that most other organizations require agreement from them, bear the safety and liveness of the Stellar network on their shoulders[^1]. + +To become a Tier 1 organization, a team running validators must convince enough other organizations in the Stellar network to trust them by including them in their quorum sets. As part of this process, they must meet some requirements that are accepted by the community of Stellar validators. For example, Tier 1 organizations generally run three validators, coordinate any changes to their quorum sets with each other, and hold themselves to a higher standard of uptime and responsiveness. + +As a steward of the Stellar network, the SDF works closely with Tier 1 organizations to ensure the health of the network, maintain robust quorum intersection, and build in redundancy to minimize network disruptions. This guide outlines the minimum requirements recommended by the SDF in order to be a Tier 1 organization. However, in the end, the SDF on its own cannot add or remove a Tier 1 organization; this depends on the quorum sets of many other organizations in the network. ## Why Three Validators -The most important function of a Tier 1 Org is to set up and maintain three Full Validators. Why three? +The most important recommendation for a Tier 1 organization is to set up and maintain three full validators. Why three? -On Stellar, validators choose to trust organizations when they build a quorum set. If you are a trustworthy organization, you want your presence on the network to persist even if a node fails or you take it down for maintenance. A trio of validating nodes allows that to happen: other participants can create a quorum slice for your organization that requires ⅔ of your validating nodes to agree. If 1 has issues, no big deal: the other two still vote on your organization’s behalf, so the show goes on. To ensure redundancy, it's also important that those three Full Validators are geographically dispersed: if they're in the same data center, they run the risk of going down at the same time. +On Stellar, validators choose to trust organizations when they configure their quorum set. If you are a trustworthy organization, you want your presence on the network to persist even if a node fails or you take it down for maintenance. A trio of validating nodes allows that to happen: when configuring their quorum sets, other participants can requires ⅔ of your validating nodes to agree. If 1 has issues, no big deal: the other two still vote on your organization’s behalf, so the show goes on. To ensure redundancy, it's also important that those three full validators be geographically dispersed: if they're in the same data center, they run the risk of going down at the same time. -Here’s what else Tier 1 Orgs expect of one another: +Here’s what else Tier 1 organizations should expect of one another: ## Publish History Archives -In addition to participating in SCP, a full validator publishes an archive of network transactions. To do that, you need to configure Stellar Core to record history to a publicly accessible archive, and add the location of that archive to your stellar.toml. To be a Tier 1 Org, you should set each of your nodes to record history to a separate archive. +In addition to participating in the Stellar Consensus Protocol, a full validator publishes an archive of network transactions. To do that, you need to configure Stellar Core to record history to a publicly accessible archive, and add the location of that archive to your stellar.toml. We recommend that, as a Tier 1 organization, you should set each of your nodes to record history to a separate archive. Public archives make the network more resilient: when new nodes come online, or when existing nodes lose synch, they need to consult an archive to figure out what they missed. Sharing snapshots of the ledger, which detail transactions and their results, allows those nodes to catch up, and more archives mean more redundancy and greater decentralization. Plus, sharing history keeps everyone honest. ## Set Up a Safe Quorum Set -To maximize network resilience, we’re asking every Tier 1 node to use the same quorum set configuration, which is made up of subquorums of all validators from each Tier 1 Org. +For simplicity, we’re recommending that every Tier 1 node use the same quorum set configuration, which is made up of inner quorum sets representing each Tier 1 organization. -That way, the validator community can experiment with a larger quorum, and can analyze the results of those experiments without disrupting the network. Using existing Tier 1 Orgs as a safety net, we can work together to expand the quorum methodically and deliberately. To see what that quorum set currently looks like, check out the [example Full Validator config file](https://github.com/stellar/packages/blob/master/docs/examples/pubnet-validator-full/stellar-core.cfg). +To configure a quorum set for your validator, we recommend including several Tier 1 organizations or copying the existing Tier 1 Qset and optionally adding additional organizations that you trust to it. Using existing Tier 1 organizations as a safety net, we can work together to expand the quorum methodically and deliberately. + +To see what the current recommended quorum set looks like, check out the [example Full Validator config file](https://github.com/stellar/packages/blob/master/docs/examples/pubnet-validator-full/stellar-core.cfg). ## Declare Your Node -[SEP-20](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0020.md) is an open spec that explains how self-verification of validator nodes works. The steps it specifies are pretty simple: you set the home domain of your validator’s Stellar account to your website, where you publish information about your node and your organization in a stellar.toml file. +[SEP-20](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0020.md) is an open spec that explains how self-verification of validator nodes works. The fields it specifies are pretty simple: you set the home domain of your validator’s Stellar account to your website, where you publish information about your node and your organization in a stellar.toml file. It’s an easy way to propagate information, and it harnesses the network to allow other participants to discover your node and add it to their quorum sets without the need for a centralized database. ## Keep Your Nodes Up To Date -Running a validator requires vigilance. You need to keep an eye on your nodes, keep them up to date with the latest version of Stellar Core, and check in on public channels for information about what’s currently happening with other validators. +Running a validator requires vigilance. You need to keep an eye on your nodes, keep them up to date with the latest version of Stellar Core, and check in on public channels for information about what’s currently happening with other validators. As organizations join or leave the network, you might need to update the quorum set configuration of your validators to ensure that your validators have robust quorum intersection with Tier 1 and robust quorum availability. The best two ways to do that: @@ -44,7 +50,7 @@ The best two ways to do that: We always announce new Stellar Core releases in those channels. You can also find those releases on our github. -It’s also critical that you pay attention to information about what those updates mean: often, you’ll need to set your validators to vote on something timely, such as when to upgrade the network as a whole, or how high to set the operations-per-ledger limit. +It’s also critical that you pay attention to information about what those updates mean: often, you’ll need to set your validators to vote on something timely, such as when to vote to upgrade to a new protocol version, or how high to set the operations-per-ledger limit. ## Coordinate With Other Validators @@ -55,18 +61,20 @@ Whether you run a trio of validators or a single node, it’s important that you Letting other validators know when you plan to take your node down for maintenance or to upgrade to the latest version of stellar-core prevents a critical mass of nodes from going offline at the same time. -Letting other validators know when you plan to change your quorum set allows them to respond, adjust, and think through the implications of expanding the quorum. For the quorum to expand safely, we all need to coordinate to ensure we maintain good quorum intersection. +Letting other validators know when you plan to change your quorum set allows them to respond, adjust, and think through the implications of the change. For the Stellar network to expand safely, the SDF recommends that validators coordinate off-chain to maintain good quorum intersection. ## Monitor your quorum set -We recommend using Prometheus to to scrape and store your stellar-core metrics, and Grafana to render that data for human consumption. You can find step-by-step instructions for setting up monitoring and alerts in [Monitoring and Diagnostics](./monitoring.mdx), along with links to Grafana dashboards we’ve created to make things easier. +We recommend using Prometheus to scrape and store your stellar-core metrics, and Grafana to render that data for human consumption. You can find step-by-step instructions for setting up monitoring and alerts in [Monitoring and Diagnostics](./monitoring.mdx), along with links to Grafana dashboards we’ve created to make things easier. -You can also use stellarbeat.io to view validators’ quorum configurations, and get information about their availability and uptime, and the quorum command to diagnose problems with the quorum set of the local node. +You can also use [Stellarbeat](https://stellarbeat.io) to view validators’ quorum configurations, get information about their availability and uptime, and the quorum command to diagnose problems with the quorum set of the local node. You should do regular check-ins on your quorum set. If nodes have bad uptime or prove otherwise unreliable, you may need to remove them from your quorum set so that you don’t get stuck and so that the network doesn’t halt. You may also want to add new organizations that come online and prove reliable. If you plan to do either of those things, remember to communicate and coordinate with other validators. ## Get in touch -If you think you can be a Tier 1 Org, let us know on the #validators channel on [Keybase](https://keybase.io/team/stellar.public). We can help you through the process, and once you’re up and running, we’ll work to fold you into the quorum so that you can take your rightful place as a pillar of the network. Once you’ve proven that you are responsive, reliable, and maintain good uptime, we will adjust the quorum set recipe above to include your validators. +If you think you can be a Tier 1 organization, let us know on the #validators channel on the [Stellar Developers Discord](https://discord.gg/stellardev). We can help you through the process, and once you’re up and running, we’ll help you join Tier 1 so that you can take your rightful place as a pillar of the network. Once you’ve proven that you are responsive, reliable, and maintain good uptime, we will recommend that other validators adjust their quorum set to include your validators. + +As Stellar grows, and more and more businesses build on the network, Tier 1 organizations will be crucial to a healthy expansion of the network. -As Stellar grows, and more and more businesses build on the network, Tier 1 Orgs will be crucial to the methodical expansion of the network. +[^1] The notion of Tier 1 organization can be defined precisely, but this is besides the point of this document From 842b6de2dbc815bd4bc3cbebbff5cc8c358216f3 Mon Sep 17 00:00:00 2001 From: Gleb Date: Fri, 20 Oct 2023 14:22:07 -0700 Subject: [PATCH 02/16] [ANCHOR-385]: Add documentation on how to pass JVM flags (#252) --- .../anchor-platform/getting_started.mdx | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/anchoring-assets/anchor-platform/getting_started.mdx b/docs/anchoring-assets/anchor-platform/getting_started.mdx index b491eb0a4..2fd7adf23 100644 --- a/docs/anchoring-assets/anchor-platform/getting_started.mdx +++ b/docs/anchoring-assets/anchor-platform/getting_started.mdx @@ -329,6 +329,37 @@ When making requests to the Platform API, add a JWT signed by the secret defined `PLATFORM_API_BASE_URL` uses `platform` instead of `localhost` as the host because you'll be making requests to the Platform API within the local network created by docker compose. When configuring your service in a staging or production environment, make sure to update your service urls. +### Passing JVM flags + +Anchor Platform uses JVM to run. Sometimes, it's desired to change JVM flags to run the service. To do so, set environmental variable `JVM_FLAGS` to appropriate value + +```bash +# dev.env +JVM_FLAGS="-Xms256m -Xmx2048m" +``` + +:::tip + +If you need to pass environment variable from your machine to container, you should use `environment` compose option to set variables instead. Here's an example of using keystore from your local machine in the container: + +```yaml +# docker-compose.yml +version: "3.8" +services: + sep-server: + image: stellar/anchor-platform:latest + command: --sep-server + env_file: + - ./dev.env + environment: + JVM_FLAGS: -Djavax.net.ssl.trustStore=/keystore.jks -Djavax.net.ssl.trustStorePassword=${KEYSTORE_PASSWORD} + volumes: + - ${KEYSTORE_LOCATION}:/keystore.jks +# ... +``` + +Where `KEYSTORE_LOCATION` is local keystore location and `KEYSTORE_PASSWORD` is local keystore password. ::: + [sep-1]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0001.md [sep-9]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0009.md [sep-24]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0024.md From 87e115fc92e5c4bd8336ef3fd6d7f00632cdcc1e Mon Sep 17 00:00:00 2001 From: Justin Rice Date: Wed, 25 Oct 2023 12:33:52 -0400 Subject: [PATCH 03/16] Update ledgers.mdx (#255) Contract Data are the new Soroban data entry. Could be elaborated on later, but this is a quick add to start with. --- .../stellar-data-structures/ledgers.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/fundamentals-and-concepts/stellar-data-structures/ledgers.mdx b/docs/fundamentals-and-concepts/stellar-data-structures/ledgers.mdx index dc237de00..9f10b76b5 100644 --- a/docs/fundamentals-and-concepts/stellar-data-structures/ledgers.mdx +++ b/docs/fundamentals-and-concepts/stellar-data-structures/ledgers.mdx @@ -14,5 +14,6 @@ Data is stored on the ledger as ledger entries. Possible ledger entries include: - Accounts - Claimable balances - Liquidity pools +- [Contract data](https://soroban.stellar.org/docs/fundamentals-and-concepts/persisting-data#ledger-entries) Every ledger has a ledger header, to read about what is contained in the ledger header, see our [Ledger Header Encyclopedia Entry](../../encyclopedia/ledger-headers). From e9a03c00f91ddd832043c1f4a395721dd2ce0ffe Mon Sep 17 00:00:00 2001 From: John Wooten Date: Wed, 25 Oct 2023 20:03:56 -0400 Subject: [PATCH 04/16] Update liquidity-on-stellar-sdex-liquidity-pools.mdx (#256) --- docs/encyclopedia/liquidity-on-stellar-sdex-liquidity-pools.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/encyclopedia/liquidity-on-stellar-sdex-liquidity-pools.mdx b/docs/encyclopedia/liquidity-on-stellar-sdex-liquidity-pools.mdx index c1295201a..a3ea58256 100644 --- a/docs/encyclopedia/liquidity-on-stellar-sdex-liquidity-pools.mdx +++ b/docs/encyclopedia/liquidity-on-stellar-sdex-liquidity-pools.mdx @@ -21,7 +21,7 @@ An order book is a record of outstanding orders on a network, and each record si A couple of notes on order books on Stellar: - The term “offers” usually refers specifically to ask orders. In Stellar, however, all orders are stored as selling- i.e., the system automatically converts bids to asks. Because of this, the terms “offer” and “order” are used interchangeably in the Stellar ecosystem. -- Order books contain all orders that are not acceptable to parties on either side to make a trade. +- Order books contain all orders that are acceptable to parties on either side to make a trade. - Some assets will have a small or nonexistent order book between them. In these cases, Stellar facilitates path payments, which we’ll discuss later. To view an order book chart, see the [Order Book Wikipedia Page](https://en.wikipedia.org/wiki/Order_book). In addition, there are also plenty of video tutorials and articles out there that can help you understand how order books work in greater detail. From ef0708208e8ca62a961edffed7ac0d95087ec45d Mon Sep 17 00:00:00 2001 From: Justin Rice Date: Mon, 30 Oct 2023 14:41:53 -0400 Subject: [PATCH 05/16] Update testnet-and-pubnet.mdx (#260) * Update testnet-and-pubnet.mdx * format --------- Co-authored-by: Bri <92327786+briwylde08@users.noreply.github.com> --- docs/fundamentals-and-concepts/testnet-and-pubnet.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/fundamentals-and-concepts/testnet-and-pubnet.mdx b/docs/fundamentals-and-concepts/testnet-and-pubnet.mdx index a5ea2f2b6..5d0c271f1 100644 --- a/docs/fundamentals-and-concepts/testnet-and-pubnet.mdx +++ b/docs/fundamentals-and-concepts/testnet-and-pubnet.mdx @@ -35,8 +35,8 @@ Testnet resets happen once per quarter at 0900 UTC and are announced at least tw March 15, 2023 June 14, 2023 -September 13, 2023 -December 13, 2023 +~~September 13, 2023~~ Note: this reset was skipped due to its proximity to the Protocol 20 Testnet updgrade. +December 5, 2023 If you run a Testnet Horizon instance, you need to re-join and re-sync to the network after a reset. Check out how to do that here: [Testnet Reset](https://github.com/stellar/packages/blob/master/docs/testnet-reset.md). From 889c93194128b40d7967c1de2e1c3d8496c049bc Mon Sep 17 00:00:00 2001 From: Leigh McCulloch <351529+leighmcculloch@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:15:37 -0700 Subject: [PATCH 06/16] Fix stellar-core docker image link (#257) --- docs/run-core-node/installation.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/run-core-node/installation.mdx b/docs/run-core-node/installation.mdx index 98a03a4cd..ff28a3c6a 100644 --- a/docs/run-core-node/installation.mdx +++ b/docs/run-core-node/installation.mdx @@ -15,7 +15,7 @@ In addition to SDF images, Satoshipay maintains separate Docker images for [Stel ### Production environments -The SDF also maintains a Stellar-Core-only [standalone image](https://hub.docker.com/repository/docker/stellar/stellar-core). +The SDF also maintains a Stellar-Core-only standalone image: [`stellar/stellar-core`](https://hub.docker.com/r/stellar/stellar-core). Example usage: From 31467138fefba99dc0a6063f4b2d726b68663490 Mon Sep 17 00:00:00 2001 From: Alec Charbonneau Date: Tue, 31 Oct 2023 12:48:41 -0400 Subject: [PATCH 07/16] Building-Apps / Wallet: add Recovery SEP-30 instructions (#261) * add ts recovery page * add kotlin examples * trigger preview rebuild * use two identities --- docs/building-apps/wallet/sep30.mdx | 315 ++++++++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 docs/building-apps/wallet/sep30.mdx diff --git a/docs/building-apps/wallet/sep30.mdx b/docs/building-apps/wallet/sep30.mdx new file mode 100644 index 000000000..34e573f38 --- /dev/null +++ b/docs/building-apps/wallet/sep30.mdx @@ -0,0 +1,315 @@ +--- +title: Recovery +sidebar_position: 60 +--- + +import Header from "./component/header.mdx"; +import { WalletCodeExample as CodeExample } from "@site/src/components/WalletCodeExample"; + +
+ +The [Sep-30] standard defines the standard way for an individual (e.g., a user or wallet) to regain access to their Stellar account after losing its private key without providing any third party control of the account. During this flow the wallet communicates with one or more recovery signer servers to register the wallet for a later recovery if it's needed. + +## Create Recoverable Account + +First, let's create an account key, a device key, and a recovery key that will be attached to the account. + + + +```typescript +const accountKp = wallet.stellar().account().createKeypair(); +const deviceKp = wallet.stellar().account().createKeypair(); +const recoveryKp = wallet.stellar().account().createKeypair(); +``` + +```kotlin + val accountKp = wallet.stellar().account().createKeyPair() + val deviceKp = wallet.stellar().account().createKeyPair() + val recoveryKp = wallet.stellar().account().createKeyPair() +``` + + + +The `accountKp` is the wallet's main account. The `deviceKp` we will be adding to the wallet as a signer so a device (eg. a mobile device a wallet is hosted on) can take control of the account. And the `recoveryKp` will be used to identify the key with the recovery servers. + +Next, let's identify the recovery servers and create our recovery object: + + + +```typescript +const server1Key = "server1"; +const server1 = { + endpoint: "recovery-example.com", + authEndpoint: "auth-example.com", + homeDomain: "test-domain", +}; + +const server2Key = "server2"; +const server2 = { + endpoint: "recovery-example2.com", + authEndpoint: "auth-example2.com", + homeDomain: "test-domain2", +}; + +const recovery = wallet.recovery({ + servers: { [server1Key]: server1, [server2Key]: server2 }, +}); +``` + +```kotlin +val first = RecoveryServerKey("first") +val second = RecoveryServerKey("second") +val firstServer = RecoveryServer("recovery.example.com", "auth.example.com", "example.com") +val secondServer = RecoveryServer("recovery2.example.com", "auth2.example.com", "example.com") +val servers = mapOf(first to firstServer, second to secondServer) +val recovery = wallet.recovery(servers) +``` + + + +Next, we need to define SEP-30 identities. In this example we are going to create an identity for both servers. + + + +```typescript +const identity1 = { + role: RecoveryRole.OWNER, + authMethods: [ + { + type: RecoveryType.STELLAR_ADDRESS, + value: recoveryKp.publicKey, + }, + ], +}; + +const identity2 = { + role: RecoveryRole.OWNER, + authMethods: [ + { + type: RecoveryType.STELLAR_ADDRESS, + value: recoveryKp.publicKey, + }, + { + type: RecoveryType.EMAIL, + value: "my-email@example.com", + }, + ], +}; +``` + +```kotlin + val identities = + listOf( + RecoveryAccountIdentity( + RecoveryRole.OWNER, + listOf(RecoveryAccountAuthMethod(RecoveryType.STELLAR_ADDRESS, recoveryKp.address)) + ) + ) +``` + + + +Here, stellar key will be used as a recovery method. Other recovery servers may support email or phone as a recovery methods. + +You can read more about SEP-30 identities [here](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0030.md#common-request-fields) + +Next, let's create a recoverable account: + + + +```typescript +const config = { + accountAddress: accountKp, + deviceAddress: deviceKp, + accountThreshold: { low: 10, medium: 10, high: 10 }, + accountIdentity: { [server1Key]: [identity1], [server2Key]: [identity2] }, + signerWeight: { device: 10, recoveryServer: 5 }, +}; +const recoverableWallet = await recovery.createRecoverableWallet(config); +``` + +```kotlin + val recoverableWallet = + recovery.createRecoverableWallet( + RecoverableWalletConfig( + accountKp, + deviceKp, + AccountThreshold(10, 10, 10), + mapOf(first to identities, second to identities), + SignerWeight(10, 5) + ) + ) +``` + + + +With the given parameters, this function will create a transaction that will: + +1. Set `deviceKp` as the primary account key. Please note that the master key belonging to `accountKp` will be locked. `deviceKp` should be used as a primary signer instead. +2. Set all operation thresholds to 10. You can read more about threshold in the [documentation](https://developers.stellar.org/docs/encyclopedia/signatures-multisig#thresholds) +3. Use identities that were defined earlier on both servers. (That means, both server will accept SEP-10 authentication via `recoveryKp` as an auth method) +4. Set device key weight to 10, and recovery server weight to 5. Given these account thresholds, both servers must be used to recover the account, as transaction signed by one will only have weight of 5, which is not sufficient to change account key. + +Finally, sign and submit transaction to the network: + + + +```typescript +recoverableWallet.transaction.sign(accountKp.keypair); + +await stellar.submitTransaction(recoverableWallet.transaction); +``` + +```kotlin + val tx = recoverableWallet.transaction.sign(accountKp) + + wallet.stellar().submitTransaction(tx) +``` + + + +## Get Account Info + +You can fetch account info from one or more servers. To do so, first we need to authenticate with a recovery server using the SEP-10 authentication method: + + + +```typescript +const authToken = await recovery + .sep10Auth(server1Key) + .authenticate({ accountKp: recoveryKp }); +``` + +```kotlin + val auth1 = recovery.sep10Auth(first).authenticate(recoveryKp) +``` + + + +Next, get account info using auth tokens: + + + +```typescript +const accountResp = await recovery.getAccountInfo(accountKp, { + [server1Key]: authToken, +}); +``` + +```kotlin + val accountInfo = recovery.getAccountInfo(account, mapOf(first to auth1)) + + println("Recoverable info: $accountInfo") +``` + + + +## Recover Wallet + +Let's say we've lost our device key and need to recover our wallet. + +First, we need to authenticate with both recovery servers: + + + +```typescript +const authToken1 = await recovery + .sep10Auth(server1Key) + .authenticate({ accountKp: recoveryKp }); + +const authToken2 = await recovery + .sep10Auth(server1Key) + .authenticate({ accountKp: recoveryKp }); +``` + +```kotlin + val auth1 = recovery.sep10Auth(first).authenticate(recoveryKp) + val auth2 = recovery.sep10Auth(second).authenticate(recoveryKp) +``` + + + +We need to know the recovery signer addresses that will be used to sign the transaction. You can get them from either the recoverable wallet object we created earlier (`recoverableWallet.signers`), or via fetching account info from recovery servers. + + + +```typescript +const recoverySignerAddress1 = recoverableWallet.signers[0]; +const recoverySignerAddress2 = recoverableWallet.signers[1]; +``` + +```kotlin + val recoverySigners = recoverableWallet.signers +``` + + + +Next, create a new device key and retrieve a signed transaction that replaces the device key: + + + +```typescript +const newDeviceKp = accountService.createKeypair(); + +const serverAuth = { + [server1Key]: { + signerAddress: recoverySignerAddress1, + authToken1, + }, + [server2Key]: { + signerAddress: recoverySignerAddress2, + authToken2, + }, +}; + +const recoverTxn = await recovery.replaceDeviceKey( + accountKp, + newDeviceKp, + serverAuth, +); +``` + +```kotlin + val newKey = wallet.stellar().account().createKeyPair() + + val serverAuth = mapOf( + first to RecoveryServerSigning(recoverySigners[0], auth1), + second to RecoveryServerSigning(recoverySigners[1], auth2) + ) + + val signedReplaceKeyTransaction = + recovery.replaceDeviceKey( + accountKp, + newKey, + serverAuth + ) +``` + + + +Calling this function will create a transaction that locks the previous device key and replaces it with your new key (having the same weight as the old one). Both recovery signers will have signed the transaction. + +The lost device key is deduced automatically if not given. A signer will be considered a device key, if one of these conditions matches: + +1. It's the only signer that's not in `serverAuth`. +2. All signers in `serverAuth` have the same weight, and the potential signer is the only one with a different weight. + +Note that the account created above will match the first criteria. If 2-3 schema were used, then second criteria would match. (In 2-3 schema, 3 serves are used and 2 of them is enough to recover key. This is a recommended approach.) + +Note: you can also use more low-level `signWithRecoveryServers` functions to sign arbitrary transaction. + +Finally, it's time to submit the transaction: + + + +```typescript +await stellar.submitTransaction(recoverTxn); +``` + +```kotlin + wallet.stellar().submitTransaction(signedReplaceKeyTransaction) +``` + + + +[sep-30]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0030.md From 8b375e252d0e6d69f551c5ae8f81f21c88a7d367 Mon Sep 17 00:00:00 2001 From: Leigh McCulloch <351529+leighmcculloch@users.noreply.github.com> Date: Thu, 2 Nov 2023 09:14:36 -0700 Subject: [PATCH 08/16] Remove mention of quickstart from package based stellar-core install instructions (#259) --- docs/run-core-node/installation.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/run-core-node/installation.mdx b/docs/run-core-node/installation.mdx index ff28a3c6a..8894b7455 100644 --- a/docs/run-core-node/installation.mdx +++ b/docs/run-core-node/installation.mdx @@ -45,8 +45,6 @@ If you are using Ubuntu 18.04 LTS or later, we provide the latest stable release You may choose to install these packages individually, which offers the greatest flexibility but requires **manual** creation of the relevant configuration files and configuration of a **PostgreSQL** database. -Most people, however, choose to install the [stellar-quickstart](https://github.com/stellar/packages/blob/master/docs/quickstart.md) package which configures a **Testnet** `stellar-core` and `stellar-horizon` both backed by a local PostgreSQL database. Once installed you can easily modify either the Stellar Core configuration if you want to connect to the public network. - ## Installing from source See the [install from source](https://github.com/stellar/stellar-core/blob/master/INSTALL.md) for build instructions. From b22ab1e67c80e5560c9d50c457e0eb2b4235602a Mon Sep 17 00:00:00 2001 From: Satyam Zode <5508956+satyamz@users.noreply.github.com> Date: Fri, 3 Nov 2023 21:53:59 +0530 Subject: [PATCH 09/16] Switch Ubuntu base image to 22.04 from 20.04 (#263) Signed-off-by: Satyam Zode Co-authored-by: Satyam Zode --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 8ae7a96dd..fb46e5ae2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 as build +FROM ubuntu:22.04 as build LABEL maintainer="SDF Ops Team " From 55b7b8c6c61a988c7a751331123bc52cc5e322dc Mon Sep 17 00:00:00 2001 From: Philip Liu <12836897+philipliu@users.noreply.github.com> Date: Mon, 6 Nov 2023 12:47:11 -0500 Subject: [PATCH 10/16] [ANCHOR-357] SEP-6 documentation updates (#253) * SEP-6 documentation updates * Update open-rpc.json * Update StellarId schema * Fix spacing * Add SEP-6 to custody docs * Revert "Add SEP-6 to custody docs" This reverts commit 64983a4d9e4593fe526625ec7b2ad408fdd30082. * Revert "Revert "Add SEP-6 to custody docs"" This reverts commit 6f52d6e8d684fd66abd99bdf4837909c80d8b628. --- .../callbacks/get-rates.api.mdx | 2 +- .../callbacks/post-event.api.mdx | 30 ++-- .../callbacks/put-customer.api.mdx | 2 +- api/anchor-platform/callbacks/sidebar.js | 2 +- .../create-custody-transaction.api.mdx | 6 +- .../generate-unique-address.api.mdx | 4 +- .../custody-server/send-payment.api.mdx | 4 +- .../custody-server/send-refund.api.mdx | 4 +- .../resources/get-transaction.api.mdx | 52 ++++-- .../resources/get-transactions.api.mdx | 54 +++++-- api/anchor-platform/resources/sidebar.js | 2 +- openapi/anchor-platform/Callbacks API.yml | 1 + openapi/anchor-platform/Platform API.yml | 6 +- openapi/anchor-platform/bundled.yml | 152 ++++++++++++++++-- openapi/anchor-platform/bundled_callback.yml | 16 +- openapi/anchor-platform/schemas.yml | 125 +++++++++++++- .../rpc-methods/do_stellar_payment.json | 8 +- .../assets/rpc-methods/do_stellar_refund.json | 8 +- .../rpc-methods/notify_amounts_updated.json | 22 ++- .../notify_customer_info_updated.json | 11 +- .../notify_offchain_funds_available.json | 8 +- .../notify_offchain_funds_pending.json | 8 +- .../notify_offchain_funds_received.json | 26 ++- .../notify_offchain_funds_sent.json | 10 +- .../notify_onchain_funds_received.json | 28 ++-- .../notify_onchain_funds_sent.json | 10 +- .../rpc-methods/notify_refund_pending.json | 10 +- .../rpc-methods/notify_refund_sent.json | 8 +- .../rpc-methods/notify_transaction_error.json | 7 +- .../notify_transaction_expired.json | 8 +- .../notify_transaction_recovery.json | 10 +- .../assets/rpc-methods/notify_trust_set.json | 8 +- static/assets/rpc-methods/open-rpc.json | 86 +++++++++- .../request_customer_info_update.json | 30 +++- .../rpc-methods/request_offchain_funds.json | 8 +- .../rpc-methods/request_onchain_funds.json | 8 +- static/assets/rpc-methods/request_trust.json | 14 +- 37 files changed, 651 insertions(+), 147 deletions(-) diff --git a/api/anchor-platform/callbacks/get-rates.api.mdx b/api/anchor-platform/callbacks/get-rates.api.mdx index 98aec44f1..74a31970d 100644 --- a/api/anchor-platform/callbacks/get-rates.api.mdx +++ b/api/anchor-platform/callbacks/get-rates.api.mdx @@ -52,7 +52,7 @@ Success. An object describing the fees added on top of the rate provided via the `price` attribute. -
details object[]
  • Array [
  • ]
  • +
    details object[]
  • Array [
  • ]
  • Unprocessable Entity. This status should be returned when the anchor understood the request but cannot return a success response. diff --git a/api/anchor-platform/callbacks/post-event.api.mdx b/api/anchor-platform/callbacks/post-event.api.mdx index e67e301c0..fd235ad01 100644 --- a/api/anchor-platform/callbacks/post-event.api.mdx +++ b/api/anchor-platform/callbacks/post-event.api.mdx @@ -5,7 +5,7 @@ description: "Receive a JSON object representing an event." sidebar_label: "Receive an Event" hide_title: true hide_table_of_contents: true -api: {"tags":["Events","SEP-24","SEP-31"],"operationId":"postEvent","description":"Receive a JSON object representing an event.\n","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["transaction_created","transaction_status_changed","transaction_error","quote_created"],"description":"The transaction event type. Can be one of the following:\n- `transaction_created` - a transaction was created through the SEP endpoints. The payload is in the `transaction` field.\n- `transaction_status_changed` - the status of a transaction has changed. The payload is in the `transaction` field.\n- `transaction_error` - error processing the transaction. The payload is in the `transaction` field.\n- `quote_created` - a quote was created via the SEP38 API. The payload is in the `quote` field.\n"},"timestamp":{"type":"string","format":"date-time"},"payload":{"type":"object","properties":{"transaction":{"oneOf":[{"type":"object","required":["id","sep","kind","status","amount_expected","destination_account","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["24"]},"kind":{"type":"string","enum":["deposit","withdrawal"]},"status":{"type":"string","description":"Possible status value for SEP-24 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_user_transfer_start","pending_user_transfer_complete","pending_anchor","pending_trust","pending_user","no_market","too_small","too_large"],"title":"StatusSEP24"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"source_account":{"type":"string"},"destination_account":{"type":"string"},"external_transaction_id":{"type":"string"},"memo":{"type":"string"},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"},"refund_memo":{"description":"if provided, this memo should be used for refund transactions","type":"string"},"refund_memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"}},"title":"TransactionSEP24"},{"type":"object","required":["id","sep","kind","status","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["31"]},"kind":{"type":"string","enum":["receive"]},"status":{"type":"string","description":"Possible status value for SEP-31 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_sender","pending_receiver","pending_transaction_info_update","pending_customer_info_update"],"title":"StatusSEP31"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"quote_id":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"external_transaction_id":{"type":"string"},"customers":{"type":"object","description":"The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12),\nthis object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer.\n","properties":{"sender":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` field should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."}},"title":"StellarId"},"receiver":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` field should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."}},"title":"StellarId"}}},"creator":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` field should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."}},"title":"StellarId"}},"title":"TransactionSEP31"}]},"quote":{"type":"object","properties":{"id":{"type":"string"},"sell_amount":{"type":"string"},"sell_asset":{"type":"string"},"buy_amount":{"type":"string"},"buy_asset":{"type":"string"},"expires_at":{"type":"string","format":"date-time"},"price":{"type":"string"},"total_price":{"type":"string"},"creator":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` field should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."}},"title":"StellarId"},"transaction_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"}},"title":"Quote"}}}},"required":["id","type","payload","timestamp"],"title":"Event"}}}},"responses":{"200":{"description":"The event is successfully processed and ready to receive next event. The response body is empty."},"400":{"description":"The event is invalid or rejected. The response body contains the error message."}},"method":"post","path":"/event","jsonRequestBodyExample":{"id":"string","type":"transaction_created","timestamp":"2023-09-13T22:33:44.954Z","payload":{"transaction":{"id":"string","sep":"24","kind":"deposit","status":"incomplete","amount_expected":{"amount":"string","asset":"string"},"amount_in":{"amount":"string","asset":"string"},"amount_out":{"amount":"string","asset":"string"},"amount_fee":{"amount":"string","asset":"string"},"started_at":"2023-09-13T22:33:44.954Z","updated_at":"2023-09-13T22:33:44.954Z","completed_at":"2023-09-13T22:33:44.954Z","transfer_received_at":"2023-09-13T22:33:44.954Z","message":"string","refunds":{"amount_refunded":{"amount":"string","asset":"string"},"amount_fee":{"amount":"string","asset":"string"},"payments":[{"id":"string","id_type":"stellar","amount":{"amount":"string","asset":"string"},"fee":{"amount":"string","asset":"string"},"requested_at":"2023-09-13T22:33:44.954Z","refunded_at":"2023-09-13T22:33:44.954Z"}]},"stellar_transactions":[{"id":"string","memo":"string","memo_type":"text","created_at":"2023-09-13T22:33:44.955Z","envelope":"string","payments":[{"id":"string","payment_type":"payment","source_account":"string","destination_account":"string","amount":{"amount":"string","asset":"string"}}]}],"source_account":"string","destination_account":"string","external_transaction_id":"string","memo":"string","memo_type":"text id hash","refund_memo":"string","refund_memo_type":"text id hash"},"quote":{"id":"string","sell_amount":"string","sell_asset":"string","buy_amount":"string","buy_asset":"string","expires_at":"2023-09-13T22:33:44.955Z","price":"string","total_price":"string","creator":{"id":"string","account":"string"},"transaction_id":"string","created_at":"2023-09-13T22:33:44.955Z"}}},"info":{"version":"2.0.0","description":"The Synchronous Callbacks API specification for the Stellar Anchor Platform project.\n\nThe Synchronous Callbacks API defines requests made by the Platform while it is processing a request from a client application. The\nanchor's responses to these requests affect the Platform responses to the client application.\n","title":"Synchronous Callbacks API"},"postman":{"name":"Receive an Event","description":{"content":"Receive a JSON object representing an event.\n","type":"text/plain"},"url":{"path":["event"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"\"\"","options":{"raw":{"language":"json"}}}}} +api: {"tags":["Events","SEP-6","SEP-24","SEP-31"],"operationId":"postEvent","description":"Receive a JSON object representing an event.\n","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["transaction_created","transaction_status_changed","transaction_error","quote_created","customer_updated"],"description":"The transaction event type. Can be one of the following:\n- `transaction_created` - a transaction was created through the SEP endpoints. The payload is in the `transaction` field.\n- `transaction_status_changed` - the status of a transaction has changed. The payload is in the `transaction` field.\n- `transaction_error` - error processing the transaction. The payload is in the `transaction` field.\n- `quote_created` - a quote was created via the SEP38 API. The payload is in the `quote` field.\n"},"timestamp":{"type":"string","format":"date-time"},"payload":{"type":"object","properties":{"transaction":{"oneOf":[{"type":"object","required":["id","sep","kind","status","amount_expected","destination_account","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["24"]},"kind":{"type":"string","enum":["deposit","withdrawal"]},"status":{"type":"string","description":"Possible status value for SEP-24 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_user_transfer_start","pending_user_transfer_complete","pending_anchor","pending_trust","pending_user","no_market","too_small","too_large"],"title":"StatusSEP24"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"source_account":{"type":"string"},"destination_account":{"type":"string"},"external_transaction_id":{"type":"string"},"memo":{"type":"string"},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"},"refund_memo":{"description":"if provided, this memo should be used for refund transactions","type":"string"},"refund_memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"}},"title":"TransactionSEP24"},{"type":"object","required":["id","sep","kind","status","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["31"]},"kind":{"type":"string","enum":["receive"]},"status":{"type":"string","description":"Possible status value for SEP-31 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_sender","pending_receiver","pending_transaction_info_update","pending_customer_info_update"],"title":"StatusSEP31"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"quote_id":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"external_transaction_id":{"type":"string"},"customers":{"type":"object","description":"The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12),\nthis object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer.\n","properties":{"sender":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"},"receiver":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"}}},"creator":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"}},"title":"TransactionSEP31"}]},"quote":{"type":"object","properties":{"id":{"type":"string"},"sell_amount":{"type":"string"},"sell_asset":{"type":"string"},"buy_amount":{"type":"string"},"buy_asset":{"type":"string"},"expires_at":{"type":"string","format":"date-time"},"price":{"type":"string"},"total_price":{"type":"string"},"creator":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"},"transaction_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"}},"title":"Quote"},"customer":{"type":"object","properties":{"id":{"type":"string"}},"title":"Customer"}}}},"required":["id","type","payload","timestamp"],"title":"Event"}}}},"responses":{"200":{"description":"The event is successfully processed and ready to receive next event. The response body is empty."},"400":{"description":"The event is invalid or rejected. The response body contains the error message."}},"method":"post","path":"/event","jsonRequestBodyExample":{"id":"string","type":"transaction_created","timestamp":"2023-11-03T18:39:04.140Z","payload":{"transaction":{"id":"string","sep":"24","kind":"deposit","status":"incomplete","amount_expected":{"amount":"string","asset":"string"},"amount_in":{"amount":"string","asset":"string"},"amount_out":{"amount":"string","asset":"string"},"amount_fee":{"amount":"string","asset":"string"},"started_at":"2023-11-03T18:39:04.140Z","updated_at":"2023-11-03T18:39:04.140Z","completed_at":"2023-11-03T18:39:04.140Z","transfer_received_at":"2023-11-03T18:39:04.140Z","message":"string","refunds":{"amount_refunded":{"amount":"string","asset":"string"},"amount_fee":{"amount":"string","asset":"string"},"payments":[{"id":"string","id_type":"stellar","amount":{"amount":"string","asset":"string"},"fee":{"amount":"string","asset":"string"},"requested_at":"2023-11-03T18:39:04.140Z","refunded_at":"2023-11-03T18:39:04.140Z"}]},"stellar_transactions":[{"id":"string","memo":"string","memo_type":"text","created_at":"2023-11-03T18:39:04.140Z","envelope":"string","payments":[{"id":"string","payment_type":"payment","source_account":"string","destination_account":"string","amount":{"amount":"string","asset":"string"}}]}],"source_account":"string","destination_account":"string","external_transaction_id":"string","memo":"string","memo_type":"text id hash","refund_memo":"string","refund_memo_type":"text id hash"},"quote":{"id":"string","sell_amount":"string","sell_asset":"string","buy_amount":"string","buy_asset":"string","expires_at":"2023-11-03T18:39:04.140Z","price":"string","total_price":"string","creator":{"id":"string","account":"string","memo":"string"},"transaction_id":"string","created_at":"2023-11-03T18:39:04.140Z"},"customer":{"id":"string"}}},"info":{"version":"2.0.0","description":"The Synchronous Callbacks API specification for the Stellar Anchor Platform project.\n\nThe Synchronous Callbacks API defines requests made by the Platform while it is processing a request from a client application. The\nanchor's responses to these requests affect the Platform responses to the client application.\n","title":"Synchronous Callbacks API"},"postman":{"name":"Receive an Event","description":{"content":"Receive a JSON object representing an event.\n","type":"text/plain"},"url":{"path":["event"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"\"\"","options":{"raw":{"language":"json"}}}}} sidebar_class_name: "post api-method" info_path: api/anchor-platform/callbacks/synchronous-callbacks-api custom_edit_url: null @@ -13,7 +13,7 @@ custom_edit_url: null import { SepBadge } from "@site/src/components/SepBadge"; - + import ApiTabs from "@theme/ApiTabs"; import MimeTabs from "@theme/MimeTabs"; @@ -31,7 +31,7 @@ import TabItem from "@theme/TabItem"; Receive a JSON object representing an event. -
    Request Body
      payload object required
      transaction object
    • oneOf
      amount_expected object required
      amount_in object
      amount_out object
      amount_fee object
      refunds object
      amount_refunded object
      amount_fee object
      payments object[]
    • Array [
    • amount object
      fee object
    • ]
    • stellar_transactions object[]
    • Array [
    • payments object[] required
    • Array [
    • amount object required
    • ]
    • ]
    • amount_expected object
      amount_in object
      amount_out object
      amount_fee object
      refunds object
      amount_refunded object
      amount_fee object
      payments object[]
    • Array [
    • amount object
      fee object
    • ]
    • stellar_transactions object[]
    • Array [
    • payments object[] required
    • Array [
    • amount object required
    • ]
    • ]
    • customers object
      +
      Request Body
        payload object required
        transaction object
      • oneOf
        amount_expected object required
        amount_in object
        amount_out object
        amount_fee object
        refunds object
        amount_refunded object
        amount_fee object
        payments object[]
      • Array [
      • amount object
        fee object
      • ]
      • stellar_transactions object[]
      • Array [
      • payments object[] required
      • Array [
      • amount object required
      • ]
      • ]
      • amount_expected object
        amount_in object
        amount_out object
        amount_fee object
        refunds object
        amount_refunded object
        amount_fee object
        payments object[]
      • Array [
      • amount object
        fee object
      • ]
      • stellar_transactions object[]
      • Array [
      • payments object[] required
      • Array [
      • amount object required
      • ]
      • ]
      • customers object
        The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12), this object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer. @@ -43,37 +43,45 @@ StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. -For a SEP-31 Sending Anchor, the `account` field should be used. +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. +For a SEP-6 Anchor, the `account` and `memo` fields should be used. -
        receiver object
        + +
        receiver object
        StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. -For a SEP-31 Sending Anchor, the `account` field should be used. +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + +For a SEP-6 Anchor, the `account` and `memo` fields should be used. -
      • creator object
        +
        creator object
        StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. -For a SEP-31 Sending Anchor, the `account` field should be used. +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. +For a SEP-6 Anchor, the `account` and `memo` fields should be used. -
      quote object
      creator object
      + +
    • quote object
      creator object
      StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. -For a SEP-31 Sending Anchor, the `account` field should be used. +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + +For a SEP-6 Anchor, the `account` and `memo` fields should be used. -
    +
    customer object
    The event is successfully processed and ready to receive next event. The response body is empty. diff --git a/api/anchor-platform/callbacks/put-customer.api.mdx b/api/anchor-platform/callbacks/put-customer.api.mdx index 0da1fcef6..8fa5bc9df 100644 --- a/api/anchor-platform/callbacks/put-customer.api.mdx +++ b/api/anchor-platform/callbacks/put-customer.api.mdx @@ -5,7 +5,7 @@ description: "**The Anchor Platform does not persist any customer KYC data.**" sidebar_label: "Create or Update Customer Info" hide_title: true hide_table_of_contents: true -api: {"tags":["Customers","SEP-12","SEP-24","SEP-31"],"description":"**The Anchor Platform does not persist any customer KYC data.**\n\nThe request and response for this endpoint are identical to the\n[`PUT /customer`](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0012.md#customer-put)\nrequest and response defined in SEP-12.\n\nClient applications make requests with the following request body, which is forwarded to the anchor. Anchors\nmust validate and persist the data passed, and return the customer's `id`.\n","operationId":"putCustomer","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"description":"The ID of the customer as returned in the response of a previous PUT request.","type":"string"},"account":{"description":"The Stellar or Muxed Account authenticated with the Platform via SEP-10.","type":"string"},"memo":{"description":"The memo value identifying a customer with a shared account, where the shared account is `account`.","type":"string"},"memo_type":{"description":"The type of memo used to identify a customer with a shared account.","type":"string","enum":["id","hash","text"]},"type":{"description":"The type of action the customer is being KYCd for. \nSee the [Type Specification](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0012.md#type-specification) documented in SEP-12 for more info.\nFor SEP-31 you can define your own types in the assets configuration.\nFor SEP-24 pre-defined value `sep24-customer` is used.\n","type":"string"},"first_name":{"type":"string"},"last_name":{"type":"string"},"additional_name":{"type":"string"},"address_country_code":{"type":"string"},"state_or_province":{"type":"string"},"city":{"type":"string"},"postal_code":{"type":"string"},"address":{"type":"string"},"mobile_number":{"type":"string"},"email_address":{"type":"string"},"birth_date":{"type":"string","format":"date"},"birth_place":{"type":"string"},"birth_country_code":{"type":"string"},"bank_account_number":{"type":"string"},"bank_account_type":{"type":"string"},"bank_number":{"type":"string"},"bank_phone_number":{"type":"string"},"bank_branch_number":{"type":"string"},"tax_id":{"type":"string"},"tax_id_name":{"type":"string"},"occupation":{"type":"string"},"employer_name":{"type":"string"},"employer_address":{"type":"string"},"language_code":{"type":"string"},"id_type":{"type":"string"},"id_country_code":{"type":"string"},"id_issue_date":{"type":"string","format":"date"},"id_expiration_date":{"type":"string","format":"date"},"id_number":{"type":"string"},"ip_address":{"type":"string"},"sex":{"type":"string"}},"title":"PutCustomerRequest"}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"title":"PutCustomerResponse"}}}},"400":{"description":"Invalid data.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}},"404":{"description":"Not Found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}}},"method":"put","path":"/customer","jsonRequestBodyExample":{"id":"string","account":"string","memo":"string","memo_type":"id","type":"string","first_name":"string","last_name":"string","additional_name":"string","address_country_code":"string","state_or_province":"string","city":"string","postal_code":"string","address":"string","mobile_number":"string","email_address":"string","birth_date":"2023-09-13","birth_place":"string","birth_country_code":"string","bank_account_number":"string","bank_account_type":"string","bank_number":"string","bank_phone_number":"string","bank_branch_number":"string","tax_id":"string","tax_id_name":"string","occupation":"string","employer_name":"string","employer_address":"string","language_code":"string","id_type":"string","id_country_code":"string","id_issue_date":"2023-09-13","id_expiration_date":"2023-09-13","id_number":"string","ip_address":"string","sex":"string"},"info":{"version":"2.0.0","description":"The Synchronous Callbacks API specification for the Stellar Anchor Platform project.\n\nThe Synchronous Callbacks API defines requests made by the Platform while it is processing a request from a client application. The\nanchor's responses to these requests affect the Platform responses to the client application.\n","title":"Synchronous Callbacks API"},"postman":{"name":"Create or Update Customer Info","description":{"content":"**The Anchor Platform does not persist any customer KYC data.**\n\nThe request and response for this endpoint are identical to the\n[`PUT /customer`](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0012.md#customer-put)\nrequest and response defined in SEP-12.\n\nClient applications make requests with the following request body, which is forwarded to the anchor. Anchors\nmust validate and persist the data passed, and return the customer's `id`.\n","type":"text/plain"},"url":{"path":["customer"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"PUT","body":{"mode":"raw","raw":"\"\"","options":{"raw":{"language":"json"}}}}} +api: {"tags":["Customers","SEP-12","SEP-24","SEP-31"],"description":"**The Anchor Platform does not persist any customer KYC data.**\n\nThe request and response for this endpoint are identical to the\n[`PUT /customer`](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0012.md#customer-put)\nrequest and response defined in SEP-12.\n\nClient applications make requests with the following request body, which is forwarded to the anchor. Anchors\nmust validate and persist the data passed, and return the customer's `id`.\n","operationId":"putCustomer","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"description":"The ID of the customer as returned in the response of a previous PUT request.","type":"string"},"account":{"description":"The Stellar or Muxed Account authenticated with the Platform via SEP-10.","type":"string"},"memo":{"description":"The memo value identifying a customer with a shared account, where the shared account is `account`.","type":"string"},"memo_type":{"description":"The type of memo used to identify a customer with a shared account.","type":"string","enum":["id","hash","text"]},"type":{"description":"The type of action the customer is being KYCd for. \nSee the [Type Specification](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0012.md#type-specification) documented in SEP-12 for more info.\nFor SEP-31 you can define your own types in the assets configuration.\nFor SEP-24 pre-defined value `sep24-customer` is used.\n","type":"string"},"first_name":{"type":"string"},"last_name":{"type":"string"},"additional_name":{"type":"string"},"address_country_code":{"type":"string"},"state_or_province":{"type":"string"},"city":{"type":"string"},"postal_code":{"type":"string"},"address":{"type":"string"},"mobile_number":{"type":"string"},"email_address":{"type":"string"},"birth_date":{"type":"string","format":"date"},"birth_place":{"type":"string"},"birth_country_code":{"type":"string"},"bank_account_number":{"type":"string"},"bank_account_type":{"type":"string"},"bank_number":{"type":"string"},"bank_phone_number":{"type":"string"},"bank_branch_number":{"type":"string"},"tax_id":{"type":"string"},"tax_id_name":{"type":"string"},"occupation":{"type":"string"},"employer_name":{"type":"string"},"employer_address":{"type":"string"},"language_code":{"type":"string"},"id_type":{"type":"string"},"id_country_code":{"type":"string"},"id_issue_date":{"type":"string","format":"date"},"id_expiration_date":{"type":"string","format":"date"},"id_number":{"type":"string"},"ip_address":{"type":"string"},"sex":{"type":"string"}},"title":"PutCustomerRequest"}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"title":"PutCustomerResponse"}}}},"400":{"description":"Invalid data.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}},"404":{"description":"Not Found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}}},"method":"put","path":"/customer","jsonRequestBodyExample":{"id":"string","account":"string","memo":"string","memo_type":"id","type":"string","first_name":"string","last_name":"string","additional_name":"string","address_country_code":"string","state_or_province":"string","city":"string","postal_code":"string","address":"string","mobile_number":"string","email_address":"string","birth_date":"2023-11-03","birth_place":"string","birth_country_code":"string","bank_account_number":"string","bank_account_type":"string","bank_number":"string","bank_phone_number":"string","bank_branch_number":"string","tax_id":"string","tax_id_name":"string","occupation":"string","employer_name":"string","employer_address":"string","language_code":"string","id_type":"string","id_country_code":"string","id_issue_date":"2023-11-03","id_expiration_date":"2023-11-03","id_number":"string","ip_address":"string","sex":"string"},"info":{"version":"2.0.0","description":"The Synchronous Callbacks API specification for the Stellar Anchor Platform project.\n\nThe Synchronous Callbacks API defines requests made by the Platform while it is processing a request from a client application. The\nanchor's responses to these requests affect the Platform responses to the client application.\n","title":"Synchronous Callbacks API"},"postman":{"name":"Create or Update Customer Info","description":{"content":"**The Anchor Platform does not persist any customer KYC data.**\n\nThe request and response for this endpoint are identical to the\n[`PUT /customer`](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0012.md#customer-put)\nrequest and response defined in SEP-12.\n\nClient applications make requests with the following request body, which is forwarded to the anchor. Anchors\nmust validate and persist the data passed, and return the customer's `id`.\n","type":"text/plain"},"url":{"path":["customer"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"PUT","body":{"mode":"raw","raw":"\"\"","options":{"raw":{"language":"json"}}}}} sidebar_class_name: "put api-method" info_path: api/anchor-platform/callbacks/synchronous-callbacks-api custom_edit_url: null diff --git a/api/anchor-platform/callbacks/sidebar.js b/api/anchor-platform/callbacks/sidebar.js index 7abac89e6..5d7896966 100644 --- a/api/anchor-platform/callbacks/sidebar.js +++ b/api/anchor-platform/callbacks/sidebar.js @@ -1 +1 @@ -module.exports = [{"type":"doc","id":"anchor-platform/callbacks/synchronous-callbacks-api"},{"type":"category","label":"Unique Address","link":{"type":"generated-index","title":"Unique Address","slug":"/category/anchor-platform/callbacks/unique-address"},"items":[{"type":"doc","id":"anchor-platform/callbacks/gen-address","label":"Generate Unique Address","className":"api-method get"}]},{"type":"category","label":"Fees","link":{"type":"generated-index","title":"Fees","slug":"/category/anchor-platform/callbacks/fees"},"items":[{"type":"doc","id":"anchor-platform/callbacks/get-fee","label":"Retrieve Fees","className":"api-method get"}]},{"type":"category","label":"Rates","link":{"type":"generated-index","title":"Rates","slug":"/category/anchor-platform/callbacks/rates"},"items":[{"type":"doc","id":"anchor-platform/callbacks/get-rates","label":"Retrieve Rates","className":"api-method get"}]},{"type":"category","label":"Customers","link":{"type":"generated-index","title":"Customers","slug":"/category/anchor-platform/callbacks/customers"},"items":[{"type":"doc","id":"anchor-platform/callbacks/get-customer","label":"Retrieve Customer's Info","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/put-customer","label":"Create or Update Customer Info","className":"api-method put"},{"type":"doc","id":"anchor-platform/callbacks/del-customer","label":"Delete Customer Data","className":"api-method delete"}]},{"type":"category","label":"SEP-31","link":{"type":"generated-index","title":"SEP-31","slug":"/category/anchor-platform/callbacks/sep-31"},"items":[{"type":"doc","id":"anchor-platform/callbacks/gen-address","label":"Generate Unique Address","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/get-fee","label":"Retrieve Fees","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/get-rates","label":"Retrieve Rates","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/get-customer","label":"Retrieve Customer's Info","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/put-customer","label":"Create or Update Customer Info","className":"api-method put"},{"type":"doc","id":"anchor-platform/callbacks/del-customer","label":"Delete Customer Data","className":"api-method delete"},{"type":"doc","id":"anchor-platform/callbacks/post-event","label":"Receive an Event","className":"api-method post"}]},{"type":"category","label":"SEP-38","link":{"type":"generated-index","title":"SEP-38","slug":"/category/anchor-platform/callbacks/sep-38"},"items":[{"type":"doc","id":"anchor-platform/callbacks/get-rates","label":"Retrieve Rates","className":"api-method get"}]},{"type":"category","label":"SEP-12","link":{"type":"generated-index","title":"SEP-12","slug":"/category/anchor-platform/callbacks/sep-12"},"items":[{"type":"doc","id":"anchor-platform/callbacks/get-customer","label":"Retrieve Customer's Info","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/put-customer","label":"Create or Update Customer Info","className":"api-method put"},{"type":"doc","id":"anchor-platform/callbacks/del-customer","label":"Delete Customer Data","className":"api-method delete"}]},{"type":"category","label":"SEP-24","link":{"type":"generated-index","title":"SEP-24","slug":"/category/anchor-platform/callbacks/sep-24"},"items":[{"type":"doc","id":"anchor-platform/callbacks/put-customer","label":"Create or Update Customer Info","className":"api-method put"},{"type":"doc","id":"anchor-platform/callbacks/post-event","label":"Receive an Event","className":"api-method post"}]},{"type":"category","label":"Events","link":{"type":"generated-index","title":"Events","slug":"/category/anchor-platform/callbacks/events"},"items":[{"type":"doc","id":"anchor-platform/callbacks/post-event","label":"Receive an Event","className":"api-method post"}]}]; \ No newline at end of file +module.exports = [{"type":"doc","id":"anchor-platform/callbacks/synchronous-callbacks-api"},{"type":"category","label":"Unique Address","link":{"type":"generated-index","title":"Unique Address","slug":"/category/anchor-platform/callbacks/unique-address"},"items":[{"type":"doc","id":"anchor-platform/callbacks/gen-address","label":"Generate Unique Address","className":"api-method get"}]},{"type":"category","label":"Fees","link":{"type":"generated-index","title":"Fees","slug":"/category/anchor-platform/callbacks/fees"},"items":[{"type":"doc","id":"anchor-platform/callbacks/get-fee","label":"Retrieve Fees","className":"api-method get"}]},{"type":"category","label":"Rates","link":{"type":"generated-index","title":"Rates","slug":"/category/anchor-platform/callbacks/rates"},"items":[{"type":"doc","id":"anchor-platform/callbacks/get-rates","label":"Retrieve Rates","className":"api-method get"}]},{"type":"category","label":"Customers","link":{"type":"generated-index","title":"Customers","slug":"/category/anchor-platform/callbacks/customers"},"items":[{"type":"doc","id":"anchor-platform/callbacks/get-customer","label":"Retrieve Customer's Info","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/put-customer","label":"Create or Update Customer Info","className":"api-method put"},{"type":"doc","id":"anchor-platform/callbacks/del-customer","label":"Delete Customer Data","className":"api-method delete"}]},{"type":"category","label":"SEP-31","link":{"type":"generated-index","title":"SEP-31","slug":"/category/anchor-platform/callbacks/sep-31"},"items":[{"type":"doc","id":"anchor-platform/callbacks/gen-address","label":"Generate Unique Address","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/get-fee","label":"Retrieve Fees","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/get-rates","label":"Retrieve Rates","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/get-customer","label":"Retrieve Customer's Info","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/put-customer","label":"Create or Update Customer Info","className":"api-method put"},{"type":"doc","id":"anchor-platform/callbacks/del-customer","label":"Delete Customer Data","className":"api-method delete"},{"type":"doc","id":"anchor-platform/callbacks/post-event","label":"Receive an Event","className":"api-method post"}]},{"type":"category","label":"SEP-38","link":{"type":"generated-index","title":"SEP-38","slug":"/category/anchor-platform/callbacks/sep-38"},"items":[{"type":"doc","id":"anchor-platform/callbacks/get-rates","label":"Retrieve Rates","className":"api-method get"}]},{"type":"category","label":"SEP-12","link":{"type":"generated-index","title":"SEP-12","slug":"/category/anchor-platform/callbacks/sep-12"},"items":[{"type":"doc","id":"anchor-platform/callbacks/get-customer","label":"Retrieve Customer's Info","className":"api-method get"},{"type":"doc","id":"anchor-platform/callbacks/put-customer","label":"Create or Update Customer Info","className":"api-method put"},{"type":"doc","id":"anchor-platform/callbacks/del-customer","label":"Delete Customer Data","className":"api-method delete"}]},{"type":"category","label":"SEP-24","link":{"type":"generated-index","title":"SEP-24","slug":"/category/anchor-platform/callbacks/sep-24"},"items":[{"type":"doc","id":"anchor-platform/callbacks/put-customer","label":"Create or Update Customer Info","className":"api-method put"},{"type":"doc","id":"anchor-platform/callbacks/post-event","label":"Receive an Event","className":"api-method post"}]},{"type":"category","label":"Events","link":{"type":"generated-index","title":"Events","slug":"/category/anchor-platform/callbacks/events"},"items":[{"type":"doc","id":"anchor-platform/callbacks/post-event","label":"Receive an Event","className":"api-method post"}]},{"type":"category","label":"SEP-6","link":{"type":"generated-index","title":"SEP-6","slug":"/category/anchor-platform/callbacks/sep-6"},"items":[{"type":"doc","id":"anchor-platform/callbacks/post-event","label":"Receive an Event","className":"api-method post"}]}]; \ No newline at end of file diff --git a/api/anchor-platform/custody-server/create-custody-transaction.api.mdx b/api/anchor-platform/custody-server/create-custody-transaction.api.mdx index f11f69781..0f29dcda3 100644 --- a/api/anchor-platform/custody-server/create-custody-transaction.api.mdx +++ b/api/anchor-platform/custody-server/create-custody-transaction.api.mdx @@ -5,7 +5,7 @@ description: "Create Custody Transaction" sidebar_label: "Create Custody Transaction" hide_title: true hide_table_of_contents: true -api: { "tags": [ "SEP-24", "SEP-31" ], "description": "Custody Server creates custody transaction record in DB.\n", "operationId": "createCustodyTransaction", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "description": "SEP transaction ID", "type": "string" }, "memo": { "description": "Memo value, that is used to identify inbound or outbound payments", "type": "string" }, "memoType": { "description": "Type of memo, that is used to identify inbound or outbound payments", "type": "string", "enum": [ "id", "hash", "text" ] }, "protocol": { "description": "Protocol of SEP transaction", "type": "string", "enum": [ "24", "31" ] }, "fromAccount": { "description": "Source Stellar account", "type": "string" }, "toAccount": { "description": "Destination Stellar account", "type": "string" }, "amount": { "description": "Amount of the asset, that is sent/received", "type": "string" }, "amountFee": { "description": "Fee of SEP transaction", "type": "string" }, "asset": { "description": "Asset, that is sent/received", "type": "string" }, "kind": { "description": "Kind of the SEP transaction", "type": "string", "enum": [ "deposit", "withdrawal", "receive" ] } }, "title": "CreateCustodyTransactionRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": {}, "title": "CreateCustodyTransactionResponse" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } } }, "method": "post", "path": "/transactions", "jsonRequestBodyExample": { "id": "123e4567-e89b-12d3-a456-426614174000", "memo": "12345", "memoType": "id", "protocol": "24", "fromAccount": "GA3X53JGZ5SLT733GNKH3CVV7RKCL4DXWCIZG2Y24HA24L6XNEHSQXT4", "toAccount": "GA3X53JGZ5SLT733GNKH3CVV7RKCL4DXWCIZG2Y24HA24L6XNEHSQXT4", "amount": "50", "amountAsset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5", "kind": "deposit" }, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Create Custody Transaction", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "transactions" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } +api: { "tags": [ "SEP-6", "SEP-24", "SEP-31" ], "description": "Custody Server creates custody transaction record in DB.\n", "operationId": "createCustodyTransaction", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "description": "SEP transaction ID", "type": "string" }, "memo": { "description": "Memo value, that is used to identify inbound or outbound payments", "type": "string" }, "memoType": { "description": "Type of memo, that is used to identify inbound or outbound payments", "type": "string", "enum": [ "id", "hash", "text" ] }, "protocol": { "description": "Protocol of SEP transaction", "type": "string", "enum": [ "6", "24", "31" ] }, "fromAccount": { "description": "Source Stellar account", "type": "string" }, "toAccount": { "description": "Destination Stellar account", "type": "string" }, "amount": { "description": "Amount of the asset, that is sent/received", "type": "string" }, "amountFee": { "description": "Fee of SEP transaction", "type": "string" }, "asset": { "description": "Asset, that is sent/received", "type": "string" }, "kind": { "description": "Kind of the SEP transaction", "type": "string", "enum": [ "deposit", "withdrawal", "receive" ] } }, "title": "CreateCustodyTransactionRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": {}, "title": "CreateCustodyTransactionResponse" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } } }, "method": "post", "path": "/transactions", "jsonRequestBodyExample": { "id": "123e4567-e89b-12d3-a456-426614174000", "memo": "12345", "memoType": "id", "protocol": "24", "fromAccount": "GA3X53JGZ5SLT733GNKH3CVV7RKCL4DXWCIZG2Y24HA24L6XNEHSQXT4", "toAccount": "GA3X53JGZ5SLT733GNKH3CVV7RKCL4DXWCIZG2Y24HA24L6XNEHSQXT4", "amount": "50", "amountAsset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5", "kind": "deposit" }, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Create Custody Transaction", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "transactions" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } sidebar_class_name: "put api-method" info_path: api/anchor-platform/custody-server-api custom_edit_url: null @@ -13,7 +13,7 @@ custom_edit_url: null import { SepBadge } from "@site/src/components/SepBadge"; - + import ApiTabs from "@theme/ApiTabs"; import MimeTabs from "@theme/MimeTabs"; @@ -28,7 +28,7 @@ import TabItem from "@theme/TabItem"; Custody Server creates custody transaction record in DB. -
    Request Body
    +
    Request Body
    Success. diff --git a/api/anchor-platform/custody-server/generate-unique-address.api.mdx b/api/anchor-platform/custody-server/generate-unique-address.api.mdx index 8949cea09..b2464ea8f 100644 --- a/api/anchor-platform/custody-server/generate-unique-address.api.mdx +++ b/api/anchor-platform/custody-server/generate-unique-address.api.mdx @@ -5,7 +5,7 @@ description: "Generate Unique Address" sidebar_label: "Generate Unique Address" hide_title: true hide_table_of_contents: true -api: { "tags": [ "SEP-24", "SEP-31" ], "description": "Custody Server calls the configured custody service to generate deposit address and memo.\n", "operationId": "generateUniqueAddress", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": {}, "title": "GenerateUniqueAddressRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": { "address": { "description": "Deposit address to which the client should send funds", "type": "string" }, "memo": { "description": "Memo value, that should be added to payment by the client", "type": "string" }, "memoType": { "description": "Type of memo, that should be added to payment by the client", "type": "string", "enum": [ "id", "hash", "text" ] } }, "title": "GenerateUniqueAddressResponse" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } } }, "method": "post", "path": "/assets/{asset}/addresses", "jsonRequestBodyExample": {}, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Generate Unique Address", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "assets", ":asset", "addresses" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } +api: { "tags": [ "SEP-6", "SEP-24", "SEP-31" ], "description": "Custody Server calls the configured custody service to generate deposit address and memo.\n", "operationId": "generateUniqueAddress", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": {}, "title": "GenerateUniqueAddressRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": { "address": { "description": "Deposit address to which the client should send funds", "type": "string" }, "memo": { "description": "Memo value, that should be added to payment by the client", "type": "string" }, "memoType": { "description": "Type of memo, that should be added to payment by the client", "type": "string", "enum": [ "id", "hash", "text" ] } }, "title": "GenerateUniqueAddressResponse" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } } }, "method": "post", "path": "/assets/{asset}/addresses", "jsonRequestBodyExample": {}, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Generate Unique Address", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "assets", ":asset", "addresses" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } sidebar_class_name: "post api-method" info_path: api/anchor-platform/custody-server-api custom_edit_url: null @@ -13,7 +13,7 @@ custom_edit_url: null import { SepBadge } from "@site/src/components/SepBadge"; - + import ApiTabs from "@theme/ApiTabs"; import MimeTabs from "@theme/MimeTabs"; diff --git a/api/anchor-platform/custody-server/send-payment.api.mdx b/api/anchor-platform/custody-server/send-payment.api.mdx index 7a9e20f76..dc007b576 100644 --- a/api/anchor-platform/custody-server/send-payment.api.mdx +++ b/api/anchor-platform/custody-server/send-payment.api.mdx @@ -5,7 +5,7 @@ description: "Send payment" sidebar_label: "Send payment" hide_title: true hide_table_of_contents: true -api: { "tags": [ "SEP-24", "SEP-31" ], "description": "Custody Server calls configured Custody Service to send payment.\n", "operationId": "sendPayment", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": {}, "title": "SendPaymentRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "description": "External TX ID from custody service", "type": "string" } }, "title": "SendPaymentResponse" } } } }, "400": { "description": "Invalid Request.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Invalid Request" } } } }, "404": { "description": "Custody Transaction is not found.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Transaction is not found" } } } }, "429": { "description": "Custody Service rate limit is exceeded.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Service rate limit is exceeded" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } }, "503": { "description": "Custody Service is unavailable.", "content": { "application/json": { "schema": { "type": "object", "properties": { "rawErrorMessage": { "type": "string" } }, "title": "Custody Service is unavailable" } } } } }, "method": "post", "path": "/transactions/{id}/payments", "jsonRequestBodyExample": {}, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Send Payment", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "transactions", ":id", "payments" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } +api: { "tags": [ "SEP-6", "SEP-24", "SEP-31" ], "description": "Custody Server calls configured Custody Service to send payment.\n", "operationId": "sendPayment", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": {}, "title": "SendPaymentRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "description": "External TX ID from custody service", "type": "string" } }, "title": "SendPaymentResponse" } } } }, "400": { "description": "Invalid Request.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Invalid Request" } } } }, "404": { "description": "Custody Transaction is not found.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Transaction is not found" } } } }, "429": { "description": "Custody Service rate limit is exceeded.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Service rate limit is exceeded" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } }, "503": { "description": "Custody Service is unavailable.", "content": { "application/json": { "schema": { "type": "object", "properties": { "rawErrorMessage": { "type": "string" } }, "title": "Custody Service is unavailable" } } } } }, "method": "post", "path": "/transactions/{id}/payments", "jsonRequestBodyExample": {}, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Send Payment", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "transactions", ":id", "payments" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } sidebar_class_name: "post api-method" info_path: api/anchor-platform/custody-server-api custom_edit_url: null @@ -13,7 +13,7 @@ custom_edit_url: null import { SepBadge } from "@site/src/components/SepBadge"; - + import ApiTabs from "@theme/ApiTabs"; import MimeTabs from "@theme/MimeTabs"; diff --git a/api/anchor-platform/custody-server/send-refund.api.mdx b/api/anchor-platform/custody-server/send-refund.api.mdx index 9ff96e8c2..54ffe6c53 100644 --- a/api/anchor-platform/custody-server/send-refund.api.mdx +++ b/api/anchor-platform/custody-server/send-refund.api.mdx @@ -5,7 +5,7 @@ description: "Send Refund" sidebar_label: "Send Refund" hide_title: true hide_table_of_contents: true -api: { "tags": [ "SEP-24", "SEP-31" ], "description": "Custody Server calls configured Custody Service to send payment.\n", "operationId": "sendPayment", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "memo": { "description": "Memo value, that will be added to the refund payment", "type": "string" }, "memoType": { "description": "Type of memo, that will be added to the refund payment", "type": "string" }, "amount": { "description": "Amount, that will be refunded", "type": "string" }, "amountFee": { "description": "Fee of the refund", "type": "string" } }, "title": "SendPaymentRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "description": "External TX ID from custody service", "type": "string" } }, "title": "SendPaymentResponse" } } } }, "400": { "description": "Invalid Request.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Invalid Request" } } } }, "404": { "description": "Custody Transaction is not found.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Transaction is not found" } } } }, "429": { "description": "Custody Service rate limit is exceeded.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Service rate limit is exceeded" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } }, "503": { "description": "Custody Service is unavailable.", "content": { "application/json": { "schema": { "type": "object", "properties": { "rawErrorMessage": { "type": "string" } }, "title": "Custody Service is unavailable" } } } } }, "method": "post", "path": "/transactions/{id}/payments", "jsonRequestBodyExample": {}, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Send Payment", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "transactions", ":id", "payments" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } +api: { "tags": [ "SEP-6", "SEP-24", "SEP-31" ], "description": "Custody Server calls configured Custody Service to send payment.\n", "operationId": "sendPayment", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "memo": { "description": "Memo value, that will be added to the refund payment", "type": "string" }, "memoType": { "description": "Type of memo, that will be added to the refund payment", "type": "string" }, "amount": { "description": "Amount, that will be refunded", "type": "string" }, "amountFee": { "description": "Fee of the refund", "type": "string" } }, "title": "SendPaymentRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "description": "External TX ID from custody service", "type": "string" } }, "title": "SendPaymentResponse" } } } }, "400": { "description": "Invalid Request.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Invalid Request" } } } }, "404": { "description": "Custody Transaction is not found.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Transaction is not found" } } } }, "429": { "description": "Custody Service rate limit is exceeded.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Service rate limit is exceeded" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } }, "503": { "description": "Custody Service is unavailable.", "content": { "application/json": { "schema": { "type": "object", "properties": { "rawErrorMessage": { "type": "string" } }, "title": "Custody Service is unavailable" } } } } }, "method": "post", "path": "/transactions/{id}/payments", "jsonRequestBodyExample": {}, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Send Payment", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "transactions", ":id", "payments" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } sidebar_class_name: "post api-method" info_path: api/anchor-platform/custody-server-api custom_edit_url: null @@ -13,7 +13,7 @@ custom_edit_url: null import { SepBadge } from "@site/src/components/SepBadge"; - + import ApiTabs from "@theme/ApiTabs"; import MimeTabs from "@theme/MimeTabs"; diff --git a/api/anchor-platform/resources/get-transaction.api.mdx b/api/anchor-platform/resources/get-transaction.api.mdx index 6111e1ab8..eb60fc026 100644 --- a/api/anchor-platform/resources/get-transaction.api.mdx +++ b/api/anchor-platform/resources/get-transaction.api.mdx @@ -5,7 +5,7 @@ description: "Provides the information necessary for the business to determine t sidebar_label: "Retrieve a Transaction" hide_title: true hide_table_of_contents: true -api: {"tags":["Transactions","SEP-24","SEP-31"],"operationId":"getTransaction","description":"Provides the information necessary for the business to determine the state of the transaction identified by `id`, decide if any action must be taken to continue processing the transaction, and act on the decision.","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Transaction found.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["id","sep","kind","status","amount_expected","destination_account","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["24"]},"kind":{"type":"string","enum":["deposit","withdrawal"]},"status":{"type":"string","description":"Possible status value for SEP-24 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_user_transfer_start","pending_user_transfer_complete","pending_anchor","pending_trust","pending_user","no_market","too_small","too_large"],"title":"StatusSEP24"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"source_account":{"type":"string"},"destination_account":{"type":"string"},"external_transaction_id":{"type":"string"},"memo":{"type":"string"},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"},"refund_memo":{"description":"if provided, this memo should be used for refund transactions","type":"string"},"refund_memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"}},"title":"TransactionSEP24"},{"type":"object","required":["id","sep","kind","status","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["31"]},"kind":{"type":"string","enum":["receive"]},"status":{"type":"string","description":"Possible status value for SEP-31 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_sender","pending_receiver","pending_transaction_info_update","pending_customer_info_update"],"title":"StatusSEP31"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"quote_id":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"external_transaction_id":{"type":"string"},"customers":{"type":"object","description":"The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12),\nthis object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer.\n","properties":{"sender":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` field should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."}},"title":"StellarId"},"receiver":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` field should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."}},"title":"StellarId"}}},"creator":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` field should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."}},"title":"StellarId"}},"title":"TransactionSEP31"}]}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}},"404":{"description":"Transaction not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}}},"method":"get","path":"/transactions/{id}","info":{"version":"2.0.0","title":"Platform API"},"postman":{"name":"Retrieve a Transaction","description":{"content":"Provides the information necessary for the business to determine the state of the transaction identified by `id`, decide if any action must be taken to continue processing the transaction, and act on the decision.","type":"text/plain"},"url":{"path":["transactions",":id"],"host":["{{baseUrl}}"],"query":[],"variable":[{"disabled":false,"description":{"content":"(Required) ","type":"text/plain"},"type":"any","value":"","key":"id"}]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET"}} +api: {"tags":["Transactions","SEP-6","SEP-24","SEP-31"],"operationId":"getTransaction","description":"Provides the information necessary for the business to determine the state of the transaction identified by `id`, decide if any action must be taken to continue processing the transaction, and act on the decision.","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Transaction found.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["id","sep","kind","status","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["6"]},"kind":{"type":"string","enum":["deposit","deposit-exchange","withdrawal","withdrawal-exchange"]},"status":{"type":"string","description":"Possible status value for SEP-6 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_customer_info_update","pending_user_transfer_start","pending_user_transfer_complete","pending_anchor","pending_trust","pending_user","no_market","too_small","too_large"],"title":"StatusSEP6"},"type":{"type":"string"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"quote_id":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"source_account":{"type":"string"},"destination_account":{"type":"string"},"external_transaction_id":{"type":"string"},"memo":{"type":"string"},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"},"refund_memo":{"description":"if provided, this memo should be used for refund transactions","type":"string"},"refund_memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"},"customers":{"type":"object","description":"The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12),\nthis object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer.\n","properties":{"sender":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"},"receiver":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"}}}},"title":"TransactionSEP6"},{"type":"object","required":["id","sep","kind","status","amount_expected","destination_account","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["24"]},"kind":{"type":"string","enum":["deposit","withdrawal"]},"status":{"type":"string","description":"Possible status value for SEP-24 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_user_transfer_start","pending_user_transfer_complete","pending_anchor","pending_trust","pending_user","no_market","too_small","too_large"],"title":"StatusSEP24"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"source_account":{"type":"string"},"destination_account":{"type":"string"},"external_transaction_id":{"type":"string"},"memo":{"type":"string"},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"},"refund_memo":{"description":"if provided, this memo should be used for refund transactions","type":"string"},"refund_memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"}},"title":"TransactionSEP24"},{"type":"object","required":["id","sep","kind","status","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["31"]},"kind":{"type":"string","enum":["receive"]},"status":{"type":"string","description":"Possible status value for SEP-31 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_sender","pending_receiver","pending_transaction_info_update","pending_customer_info_update"],"title":"StatusSEP31"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"quote_id":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"external_transaction_id":{"type":"string"},"customers":{"type":"object","description":"The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12),\nthis object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer.\n","properties":{"sender":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"},"receiver":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"}}},"creator":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"}},"title":"TransactionSEP31"}]}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}},"404":{"description":"Transaction not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}}},"method":"get","path":"/transactions/{id}","info":{"version":"2.0.0","title":"Platform API"},"postman":{"name":"Retrieve a Transaction","description":{"content":"Provides the information necessary for the business to determine the state of the transaction identified by `id`, decide if any action must be taken to continue processing the transaction, and act on the decision.","type":"text/plain"},"url":{"path":["transactions",":id"],"host":["{{baseUrl}}"],"query":[],"variable":[{"disabled":false,"description":{"content":"(Required) ","type":"text/plain"},"type":"any","value":"","key":"id"}]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET"}} sidebar_class_name: "get api-method" info_path: api/anchor-platform/resources/platform-api custom_edit_url: null @@ -13,7 +13,7 @@ custom_edit_url: null import { SepBadge } from "@site/src/components/SepBadge"; - + import ApiTabs from "@theme/ApiTabs"; import MimeTabs from "@theme/MimeTabs"; @@ -34,7 +34,7 @@ Provides the information necessary for the business to determine the state of th Transaction found. -
    Schema
    • oneOf
      amount_expected object required
      amount_in object
      amount_out object
      amount_fee object
      refunds object
      amount_refunded object
      amount_fee object
      payments object[]
    • Array [
    • amount object
      fee object
    • ]
    • stellar_transactions object[]
    • Array [
    • payments object[] required
    • Array [
    • amount object required
    • ]
    • ]
    • amount_expected object
      amount_in object
      amount_out object
      amount_fee object
      refunds object
      amount_refunded object
      amount_fee object
      payments object[]
    • Array [
    • amount object
      fee object
    • ]
    • stellar_transactions object[]
    • Array [
    • payments object[] required
    • Array [
    • amount object required
    • ]
    • ]
    • customers object
      +
      Schema
      • oneOf
        amount_expected object
        amount_in object
        amount_out object
        amount_fee object
        refunds object
        amount_refunded object
        amount_fee object
        payments object[]
      • Array [
      • amount object
        fee object
      • ]
      • stellar_transactions object[]
      • Array [
      • payments object[] required
      • Array [
      • amount object required
      • ]
      • ]
      • customers object
        The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12), this object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer. @@ -46,28 +46,62 @@ StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. -For a SEP-31 Sending Anchor, the `account` field should be used. +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. +For a SEP-6 Anchor, the `account` and `memo` fields should be used. -
        receiver object
        + +
        receiver object
        StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. -For a SEP-31 Sending Anchor, the `account` field should be used. +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + +For a SEP-6 Anchor, the `account` and `memo` fields should be used. -
      creator object
      +
    amount_expected object required
    amount_in object
    amount_out object
    amount_fee object
    refunds object
    amount_refunded object
    amount_fee object
    payments object[]
  • Array [
  • amount object
    fee object
  • ]
  • stellar_transactions object[]
  • Array [
  • payments object[] required
  • Array [
  • amount object required
  • ]
  • ]
  • amount_expected object
    amount_in object
    amount_out object
    amount_fee object
    refunds object
    amount_refunded object
    amount_fee object
    payments object[]
  • Array [
  • amount object
    fee object
  • ]
  • stellar_transactions object[]
  • Array [
  • payments object[] required
  • Array [
  • amount object required
  • ]
  • ]
  • customers object
    + +The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12), +this object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer. + + +
    sender object
    StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. -For a SEP-31 Sending Anchor, the `account` field should be used. +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + +For a SEP-6 Anchor, the `account` and `memo` fields should be used. + + +
    receiver object
    + +StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. + +For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. + +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + +For a SEP-6 Anchor, the `account` and `memo` fields should be used. + + +
    creator object
    + +StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. + +For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. + +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + +For a SEP-6 Anchor, the `account` and `memo` fields should be used. -
    +
    Bad Request diff --git a/api/anchor-platform/resources/get-transactions.api.mdx b/api/anchor-platform/resources/get-transactions.api.mdx index 6bf881bf2..f4b78ef4c 100644 --- a/api/anchor-platform/resources/get-transactions.api.mdx +++ b/api/anchor-platform/resources/get-transactions.api.mdx @@ -5,7 +5,7 @@ description: "Allows to query list of transactions for desired SEP. This api sup sidebar_label: "Retrieve a List of Transactions" hide_title: true hide_table_of_contents: true -api: {"tags":["Transactions","SEP-24","SEP-31"],"operationId":"getTransactions","description":"Allows to query list of transactions for desired SEP. This api supports pagination, and it's possible (and recommended) to make multiple requests to query transactions. The last page is reached when the number of elements returned by the endpoint is smaller than provided `page_size`.","parameters":[{"in":"query","name":"sep","required":true,"schema":{"type":"string","enum":[24,31]},"description":"Lookup transactions belonging to this SEP."},{"in":"query","name":"order_by","schema":{"type":"string","enum":["created_at","transfer_received_at"],"default":"created_at"},"description":"Specifies field that transactions will be ordered by. Note, that secondary sort is transaction id in ascending value.\nI.e. when timestamps for 2 or more transactions is identical, they will be sorted by id."},{"in":"query","name":"order","schema":{"type":"string","enum":["asc","desc"],"default":"asc"},"description":"Specifies order. Note, that when the field is null, all transactions with null value will be last, regardless of soring order (NULLS LAST).\nFor example, transfer time may not be specified for some transactions, resulting into `transfer_received_at` being null. If so, transactions with non-null values will be sorted and returned first, followed by all transactions with null timestamps."},{"in":"query","name":"statuses","schema":{"type":"array","items":{"type":"string","description":"Possible status values for all transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_user_transfer_start","pending_user_transfer_complete","pending_anchor","pending_trust","pending_user","no_market","too_small","too_large","pending_sender","pending_receiver","pending_transaction_info_update","pending_customer_info_update"],"title":"StatusSEPAll"}},"description":"Filters transactions for specified array of statuses. If not provided, filtering is disabled (default behavior)"},{"in":"query","name":"page_size","schema":{"type":"integer","default":20},"description":"Size of a single search page. Must be positive."},{"in":"query","name":"page_number","schema":{"type":"integer","default":0},"description":"Page number to use for continuous search. Page count beings at 0."}],"responses":{"200":{"description":"Transaction found.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","required":["id","sep","kind","status","amount_expected","destination_account","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["24"]},"kind":{"type":"string","enum":["deposit","withdrawal"]},"status":{"type":"string","description":"Possible status value for SEP-24 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_user_transfer_start","pending_user_transfer_complete","pending_anchor","pending_trust","pending_user","no_market","too_small","too_large"],"title":"StatusSEP24"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"source_account":{"type":"string"},"destination_account":{"type":"string"},"external_transaction_id":{"type":"string"},"memo":{"type":"string"},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"},"refund_memo":{"description":"if provided, this memo should be used for refund transactions","type":"string"},"refund_memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"}},"title":"TransactionSEP24"}}},"title":"TransactionListSEP24"},{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","required":["id","sep","kind","status","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["31"]},"kind":{"type":"string","enum":["receive"]},"status":{"type":"string","description":"Possible status value for SEP-31 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_sender","pending_receiver","pending_transaction_info_update","pending_customer_info_update"],"title":"StatusSEP31"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"quote_id":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"external_transaction_id":{"type":"string"},"customers":{"type":"object","description":"The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12),\nthis object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer.\n","properties":{"sender":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` field should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."}},"title":"StellarId"},"receiver":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` field should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."}},"title":"StellarId"}}},"creator":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` field should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."}},"title":"StellarId"}},"title":"TransactionSEP31"}}},"title":"TransactionListSEP31"}]}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}},"404":{"description":"Transaction not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}}},"method":"get","path":"/transactions","info":{"version":"2.0.0","title":"Platform API"},"postman":{"name":"Retrieve a List of Transactions","description":{"content":"Allows to query list of transactions for desired SEP. This api supports pagination, and it's possible (and recommended) to make multiple requests to query transactions. The last page is reached when the number of elements returned by the endpoint is smaller than provided `page_size`.","type":"text/plain"},"url":{"path":["transactions"],"host":["{{baseUrl}}"],"query":[{"disabled":false,"description":{"content":"(Required) Lookup transactions belonging to this SEP.","type":"text/plain"},"key":"sep","value":""},{"disabled":false,"description":{"content":"Specifies field that transactions will be ordered by. Note, that secondary sort is transaction id in ascending value.\nI.e. when timestamps for 2 or more transactions is identical, they will be sorted by id.","type":"text/plain"},"key":"order_by","value":""},{"disabled":false,"description":{"content":"Specifies order. Note, that when the field is null, all transactions with null value will be last, regardless of soring order (NULLS LAST).\nFor example, transfer time may not be specified for some transactions, resulting into `transfer_received_at` being null. If so, transactions with non-null values will be sorted and returned first, followed by all transactions with null timestamps.","type":"text/plain"},"key":"order","value":""},{"disabled":false,"description":{"content":"Filters transactions for specified array of statuses. If not provided, filtering is disabled (default behavior)","type":"text/plain"},"key":"statuses","value":""},{"disabled":false,"description":{"content":"Size of a single search page. Must be positive.","type":"text/plain"},"key":"page_size","value":""},{"disabled":false,"description":{"content":"Page number to use for continuous search. Page count beings at 0.","type":"text/plain"},"key":"page_number","value":""}],"variable":[]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET"}} +api: {"tags":["Transactions","SEP-6","SEP-24","SEP-31"],"operationId":"getTransactions","description":"Allows to query list of transactions for desired SEP. This api supports pagination, and it's possible (and recommended) to make multiple requests to query transactions. The last page is reached when the number of elements returned by the endpoint is smaller than provided `page_size`.","parameters":[{"in":"query","name":"sep","required":true,"schema":{"type":"string","enum":[6,24,31]},"description":"Lookup transactions belonging to this SEP."},{"in":"query","name":"order_by","schema":{"type":"string","enum":["created_at","transfer_received_at"],"default":"created_at"},"description":"Specifies field that transactions will be ordered by. Note, that secondary sort is transaction id in ascending value.\nI.e. when timestamps for 2 or more transactions is identical, they will be sorted by id."},{"in":"query","name":"order","schema":{"type":"string","enum":["asc","desc"],"default":"asc"},"description":"Specifies order. Note, that when the field is null, all transactions with null value will be last, regardless of soring order (NULLS LAST).\nFor example, transfer time may not be specified for some transactions, resulting into `transfer_received_at` being null. If so, transactions with non-null values will be sorted and returned first, followed by all transactions with null timestamps."},{"in":"query","name":"statuses","schema":{"type":"array","items":{"type":"string","description":"Possible status values for all transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_user_transfer_start","pending_user_transfer_complete","pending_anchor","pending_trust","pending_user","no_market","too_small","too_large","pending_sender","pending_receiver","pending_transaction_info_update","pending_customer_info_update"],"title":"StatusSEPAll"}},"description":"Filters transactions for specified array of statuses. If not provided, filtering is disabled (default behavior)"},{"in":"query","name":"page_size","schema":{"type":"integer","default":20},"description":"Size of a single search page. Must be positive."},{"in":"query","name":"page_number","schema":{"type":"integer","default":0},"description":"Page number to use for continuous search. Page count beings at 0."}],"responses":{"200":{"description":"Transaction found.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","required":["id","sep","kind","status","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["6"]},"kind":{"type":"string","enum":["deposit","deposit-exchange","withdrawal","withdrawal-exchange"]},"status":{"type":"string","description":"Possible status value for SEP-6 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_customer_info_update","pending_user_transfer_start","pending_user_transfer_complete","pending_anchor","pending_trust","pending_user","no_market","too_small","too_large"],"title":"StatusSEP6"},"type":{"type":"string"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"quote_id":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"source_account":{"type":"string"},"destination_account":{"type":"string"},"external_transaction_id":{"type":"string"},"memo":{"type":"string"},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"},"refund_memo":{"description":"if provided, this memo should be used for refund transactions","type":"string"},"refund_memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"},"customers":{"type":"object","description":"The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12),\nthis object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer.\n","properties":{"sender":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"},"receiver":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"}}}},"title":"TransactionSEP6"}}},"title":"TransactionListSEP6"},{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","required":["id","sep","kind","status","amount_expected","destination_account","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["24"]},"kind":{"type":"string","enum":["deposit","withdrawal"]},"status":{"type":"string","description":"Possible status value for SEP-24 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_user_transfer_start","pending_user_transfer_complete","pending_anchor","pending_trust","pending_user","no_market","too_small","too_large"],"title":"StatusSEP24"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"source_account":{"type":"string"},"destination_account":{"type":"string"},"external_transaction_id":{"type":"string"},"memo":{"type":"string"},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"},"refund_memo":{"description":"if provided, this memo should be used for refund transactions","type":"string"},"refund_memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text id hash"],"title":"MemoType"}},"title":"TransactionSEP24"}}},"title":"TransactionListSEP24"},{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","required":["id","sep","kind","status","started_at"],"properties":{"id":{"type":"string"},"sep":{"type":"string","enum":["31"]},"kind":{"type":"string","enum":["receive"]},"status":{"type":"string","description":"Possible status value for SEP-31 transactions","enum":["incomplete","completed","refunded","expired","error","pending_stellar","pending_external","pending_sender","pending_receiver","pending_transaction_info_update","pending_customer_info_update"],"title":"StatusSEP31"},"amount_expected":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_in":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_out":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"quote_id":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"transfer_received_at":{"type":"string","format":"date-time"},"message":{"type":"string"},"refunds":{"type":"object","properties":{"amount_refunded":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"amount_fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"id_type":{"type":"string","enum":["stellar","external"]},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"fee":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"},"requested_at":{"type":"string","format":"date-time"},"refunded_at":{"type":"string","format":"date-time"}}}}},"title":"Refunds"},"stellar_transactions":{"type":"array","items":{"type":"object","required":["id","created_at","envelope","payments"],"properties":{"id":{"type":"string","description":"The ID of the transaction in the Stellar network."},"memo":{"type":"string","description":"The memo of the transaction in the Stellar network."},"memo_type":{"type":"string","description":"The memo type of the transaction in the Stellar network. Should be present if memo is not null.","enum":["text","hash","id"]},"created_at":{"type":"string","format":"date-time","description":"The time the transaction was registered in the Stellar network."},"envelope":{"type":"string","description":"The transaction envelope, containing all the transaction information."},"payments":{"type":"array","items":{"type":"object","required":["id","payment_type","source_account","destination_account","amount"],"properties":{"id":{"type":"string","description":"The ID of the payment in the Stellar Network."},"payment_type":{"type":"string","description":"The type of payment in the Stellar Network.","enum":["payment","path_payment"],"default":"payment"},"source_account":{"type":"string","description":"The account being debited in the Stellar Network."},"destination_account":{"type":"string","description":"The account being credited in the Stellar Network."},"amount":{"type":"object","required":["amount","asset"],"properties":{"amount":{"type":"string"},"asset":{"type":"string"}},"title":"Amount"}}}}},"title":"StellarTransaction"}},"external_transaction_id":{"type":"string"},"customers":{"type":"object","description":"The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12),\nthis object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer.\n","properties":{"sender":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"},"receiver":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"}}},"creator":{"type":"object","description":"StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors.\n\nFor a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend.\n\nFor a SEP-31 Sending Anchor, the `account` and `memo` fields should be used.\n\nFor a SEP-6 Anchor, the `account` and `memo` fields should be used.\n","properties":{"id":{"type":"string","description":"The `id` of the customer registered through SEP-12."},"account":{"type":"string","description":"Either the Stellar account or Muxed account address of the on-chain entity."},"memo":{"type":"string","description":"The memo value identifying a customer with a shared account, where the shared account is `account`."}},"title":"StellarId"}},"title":"TransactionSEP31"}}},"title":"TransactionListSEP31"}]}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}},"404":{"description":"Transaction not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"id":{"type":"string"}},"required":["error"],"title":"Error"}}}}},"method":"get","path":"/transactions","info":{"version":"2.0.0","title":"Platform API"},"postman":{"name":"Retrieve a List of Transactions","description":{"content":"Allows to query list of transactions for desired SEP. This api supports pagination, and it's possible (and recommended) to make multiple requests to query transactions. The last page is reached when the number of elements returned by the endpoint is smaller than provided `page_size`.","type":"text/plain"},"url":{"path":["transactions"],"host":["{{baseUrl}}"],"query":[{"disabled":false,"description":{"content":"(Required) Lookup transactions belonging to this SEP.","type":"text/plain"},"key":"sep","value":""},{"disabled":false,"description":{"content":"Specifies field that transactions will be ordered by. Note, that secondary sort is transaction id in ascending value.\nI.e. when timestamps for 2 or more transactions is identical, they will be sorted by id.","type":"text/plain"},"key":"order_by","value":""},{"disabled":false,"description":{"content":"Specifies order. Note, that when the field is null, all transactions with null value will be last, regardless of soring order (NULLS LAST).\nFor example, transfer time may not be specified for some transactions, resulting into `transfer_received_at` being null. If so, transactions with non-null values will be sorted and returned first, followed by all transactions with null timestamps.","type":"text/plain"},"key":"order","value":""},{"disabled":false,"description":{"content":"Filters transactions for specified array of statuses. If not provided, filtering is disabled (default behavior)","type":"text/plain"},"key":"statuses","value":""},{"disabled":false,"description":{"content":"Size of a single search page. Must be positive.","type":"text/plain"},"key":"page_size","value":""},{"disabled":false,"description":{"content":"Page number to use for continuous search. Page count beings at 0.","type":"text/plain"},"key":"page_number","value":""}],"variable":[]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET"}} sidebar_class_name: "get api-method" info_path: api/anchor-platform/resources/platform-api custom_edit_url: null @@ -13,7 +13,7 @@ custom_edit_url: null import { SepBadge } from "@site/src/components/SepBadge"; - + import ApiTabs from "@theme/ApiTabs"; import MimeTabs from "@theme/MimeTabs"; @@ -30,11 +30,11 @@ import TabItem from "@theme/TabItem"; Allows to query list of transactions for desired SEP. This api supports pagination, and it's possible (and recommended) to make multiple requests to query transactions. The last page is reached when the number of elements returned by the endpoint is smaller than provided `page_size`. -
    Query Parameters
    +
    Query Parameters
    Transaction found. -
    Schema
    • oneOf
      records object[]
    • Array [
    • amount_expected object required
      amount_in object
      amount_out object
      amount_fee object
      refunds object
      amount_refunded object
      amount_fee object
      payments object[]
    • Array [
    • amount object
      fee object
    • ]
    • stellar_transactions object[]
    • Array [
    • payments object[] required
    • Array [
    • amount object required
    • ]
    • ]
    • ]
    • records object[]
    • Array [
    • amount_expected object
      amount_in object
      amount_out object
      amount_fee object
      refunds object
      amount_refunded object
      amount_fee object
      payments object[]
    • Array [
    • amount object
      fee object
    • ]
    • stellar_transactions object[]
    • Array [
    • payments object[] required
    • Array [
    • amount object required
    • ]
    • ]
    • customers object
      +
      Schema
      • oneOf
        records object[]
      • Array [
      • amount_expected object
        amount_in object
        amount_out object
        amount_fee object
        refunds object
        amount_refunded object
        amount_fee object
        payments object[]
      • Array [
      • amount object
        fee object
      • ]
      • stellar_transactions object[]
      • Array [
      • payments object[] required
      • Array [
      • amount object required
      • ]
      • ]
      • customers object
        The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12), this object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer. @@ -46,28 +46,62 @@ StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. -For a SEP-31 Sending Anchor, the `account` field should be used. +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. +For a SEP-6 Anchor, the `account` and `memo` fields should be used. -
        receiver object
        + +
        receiver object
        StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. -For a SEP-31 Sending Anchor, the `account` field should be used. +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + +For a SEP-6 Anchor, the `account` and `memo` fields should be used. -
        creator object
        +
    • ]
    • records object[]
    • Array [
    • amount_expected object required
      amount_in object
      amount_out object
      amount_fee object
      refunds object
      amount_refunded object
      amount_fee object
      payments object[]
    • Array [
    • amount object
      fee object
    • ]
    • stellar_transactions object[]
    • Array [
    • payments object[] required
    • Array [
    • amount object required
    • ]
    • ]
    • ]
    • records object[]
    • Array [
    • amount_expected object
      amount_in object
      amount_out object
      amount_fee object
      refunds object
      amount_refunded object
      amount_fee object
      payments object[]
    • Array [
    • amount object
      fee object
    • ]
    • stellar_transactions object[]
    • Array [
    • payments object[] required
    • Array [
    • amount object required
    • ]
    • ]
    • customers object
      + +The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12), +this object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer. + + +
      sender object
      StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. -For a SEP-31 Sending Anchor, the `account` field should be used. +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + +For a SEP-6 Anchor, the `account` and `memo` fields should be used. + + +
      receiver object
      + +StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. + +For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. + +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + +For a SEP-6 Anchor, the `account` and `memo` fields should be used. + + +
      creator object
      + +StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. + +For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. + +For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + +For a SEP-6 Anchor, the `account` and `memo` fields should be used. -
    • ]
    +
  • ]
  • Bad Request diff --git a/api/anchor-platform/resources/sidebar.js b/api/anchor-platform/resources/sidebar.js index a61a9243f..939db7b92 100644 --- a/api/anchor-platform/resources/sidebar.js +++ b/api/anchor-platform/resources/sidebar.js @@ -1 +1 @@ -module.exports = [{"type":"doc","id":"anchor-platform/resources/platform-api"},{"type":"category","label":"Transactions","link":{"type":"generated-index","title":"Transactions","slug":"/category/anchor-platform/resources/transactions"},"items":[{"type":"doc","id":"anchor-platform/resources/get-transactions","label":"Retrieve a List of Transactions","className":"api-method get"},{"type":"doc","id":"anchor-platform/resources/get-transaction","label":"Retrieve a Transaction","className":"api-method get"}]},{"type":"category","label":"SEP-24","link":{"type":"generated-index","title":"SEP-24","slug":"/category/anchor-platform/resources/sep-24"},"items":[{"type":"doc","id":"anchor-platform/resources/get-transactions","label":"Retrieve a List of Transactions","className":"api-method get"},{"type":"doc","id":"anchor-platform/resources/get-transaction","label":"Retrieve a Transaction","className":"api-method get"}]},{"type":"category","label":"SEP-31","link":{"type":"generated-index","title":"SEP-31","slug":"/category/anchor-platform/resources/sep-31"},"items":[{"type":"doc","id":"anchor-platform/resources/get-transactions","label":"Retrieve a List of Transactions","className":"api-method get"},{"type":"doc","id":"anchor-platform/resources/get-transaction","label":"Retrieve a Transaction","className":"api-method get"}]}]; \ No newline at end of file +module.exports = [{"type":"doc","id":"anchor-platform/resources/platform-api"},{"type":"category","label":"Transactions","link":{"type":"generated-index","title":"Transactions","slug":"/category/anchor-platform/resources/transactions"},"items":[{"type":"doc","id":"anchor-platform/resources/get-transactions","label":"Retrieve a List of Transactions","className":"api-method get"},{"type":"doc","id":"anchor-platform/resources/get-transaction","label":"Retrieve a Transaction","className":"api-method get"}]},{"type":"category","label":"SEP-6","link":{"type":"generated-index","title":"SEP-6","slug":"/category/anchor-platform/resources/sep-6"},"items":[{"type":"doc","id":"anchor-platform/resources/get-transactions","label":"Retrieve a List of Transactions","className":"api-method get"},{"type":"doc","id":"anchor-platform/resources/get-transaction","label":"Retrieve a Transaction","className":"api-method get"}]},{"type":"category","label":"SEP-24","link":{"type":"generated-index","title":"SEP-24","slug":"/category/anchor-platform/resources/sep-24"},"items":[{"type":"doc","id":"anchor-platform/resources/get-transactions","label":"Retrieve a List of Transactions","className":"api-method get"},{"type":"doc","id":"anchor-platform/resources/get-transaction","label":"Retrieve a Transaction","className":"api-method get"}]},{"type":"category","label":"SEP-31","link":{"type":"generated-index","title":"SEP-31","slug":"/category/anchor-platform/resources/sep-31"},"items":[{"type":"doc","id":"anchor-platform/resources/get-transactions","label":"Retrieve a List of Transactions","className":"api-method get"},{"type":"doc","id":"anchor-platform/resources/get-transaction","label":"Retrieve a Transaction","className":"api-method get"}]}]; \ No newline at end of file diff --git a/openapi/anchor-platform/Callbacks API.yml b/openapi/anchor-platform/Callbacks API.yml index 1125ce85a..2b43d0d92 100644 --- a/openapi/anchor-platform/Callbacks API.yml +++ b/openapi/anchor-platform/Callbacks API.yml @@ -471,6 +471,7 @@ paths: post: tags: - Events + - SEP-6 - SEP-24 - SEP-31 summary: Receive an Event diff --git a/openapi/anchor-platform/Platform API.yml b/openapi/anchor-platform/Platform API.yml index 4392491bb..668fb93c8 100644 --- a/openapi/anchor-platform/Platform API.yml +++ b/openapi/anchor-platform/Platform API.yml @@ -12,6 +12,7 @@ paths: get: tags: - "Transactions" + - SEP-6 - SEP-24 - SEP-31 summary: Retrieve a List of Transactions @@ -25,7 +26,7 @@ paths: required: true schema: type: string - enum: [ 24, 31 ] + enum: [ 6, 24, 31 ] description: Lookup transactions belonging to this SEP. - in: query @@ -76,6 +77,7 @@ paths: application/json: schema: oneOf: + - $ref: './schemas.yml#/components/schemas/TransactionListSEP6' - $ref: './schemas.yml#/components/schemas/TransactionListSEP24' - $ref: './schemas.yml#/components/schemas/TransactionListSEP31' '400': @@ -94,6 +96,7 @@ paths: get: tags: - "Transactions" + - SEP-6 - SEP-24 - SEP-31 summary: Retrieve a Transaction @@ -114,6 +117,7 @@ paths: application/json: schema: oneOf: + - $ref: './schemas.yml#/components/schemas/TransactionSEP6' - $ref: './schemas.yml#/components/schemas/TransactionSEP24' - $ref: './schemas.yml#/components/schemas/TransactionSEP31' '400': diff --git a/openapi/anchor-platform/bundled.yml b/openapi/anchor-platform/bundled.yml index d3d58aec6..7ba0b125f 100644 --- a/openapi/anchor-platform/bundled.yml +++ b/openapi/anchor-platform/bundled.yml @@ -12,6 +12,7 @@ paths: get: tags: - Transactions + - SEP-6 - SEP-24 - SEP-31 summary: Retrieve a List of Transactions @@ -24,6 +25,7 @@ paths: schema: type: string enum: + - 6 - 24 - 31 description: Lookup transactions belonging to this SEP. @@ -75,6 +77,7 @@ paths: application/json: schema: oneOf: + - $ref: '#/components/schemas/TransactionListSEP6' - $ref: '#/components/schemas/TransactionListSEP24' - $ref: '#/components/schemas/TransactionListSEP31' '400': @@ -93,6 +96,7 @@ paths: get: tags: - Transactions + - SEP-6 - SEP-24 - SEP-31 summary: Retrieve a Transaction @@ -111,6 +115,7 @@ paths: application/json: schema: oneOf: + - $ref: '#/components/schemas/TransactionSEP6' - $ref: '#/components/schemas/TransactionSEP24' - $ref: '#/components/schemas/TransactionSEP31' '400': @@ -150,9 +155,9 @@ components: - pending_receiver - pending_transaction_info_update - pending_customer_info_update - StatusSEP24: + StatusSEP6: type: string - description: Possible status value for SEP-24 transactions + description: Possible status value for SEP-6 transactions enum: - incomplete - completed @@ -161,6 +166,7 @@ components: - error - pending_stellar - pending_external + - pending_customer_info_update - pending_user_transfer_start - pending_user_transfer_complete - pending_anchor @@ -270,6 +276,133 @@ components: description: The memo type of the transaction in the Stellar network. Should be present if memo is not null. enum: - text id hash + StellarId: + type: object + description: | + StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. + + For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. + + For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + + For a SEP-6 Anchor, the `account` and `memo` fields should be used. + properties: + id: + type: string + description: The `id` of the customer registered through SEP-12. + account: + type: string + description: Either the Stellar account or Muxed account address of the on-chain entity. + memo: + type: string + description: The memo value identifying a customer with a shared account, where the shared account is `account`. + TransactionSEP6: + type: object + required: + - id + - sep + - kind + - status + - started_at + properties: + id: + type: string + sep: + type: string + enum: + - '6' + kind: + type: string + enum: + - deposit + - deposit-exchange + - withdrawal + - withdrawal-exchange + status: + $ref: '#/components/schemas/StatusSEP6' + type: + type: string + amount_expected: + $ref: '#/components/schemas/Amount' + amount_in: + $ref: '#/components/schemas/Amount' + amount_out: + $ref: '#/components/schemas/Amount' + amount_fee: + $ref: '#/components/schemas/Amount' + quote_id: + type: string + started_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + completed_at: + type: string + format: date-time + transfer_received_at: + type: string + format: date-time + message: + type: string + refunds: + $ref: '#/components/schemas/Refunds' + stellar_transactions: + type: array + items: + $ref: '#/components/schemas/StellarTransaction' + source_account: + type: string + destination_account: + type: string + external_transaction_id: + type: string + memo: + type: string + memo_type: + $ref: '#/components/schemas/MemoType' + refund_memo: + description: if provided, this memo should be used for refund transactions + type: string + refund_memo_type: + $ref: '#/components/schemas/MemoType' + customers: + type: object + description: | + The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12), + this object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer. + properties: + sender: + $ref: '#/components/schemas/StellarId' + receiver: + $ref: '#/components/schemas/StellarId' + TransactionListSEP6: + type: object + properties: + records: + type: array + items: + $ref: '#/components/schemas/TransactionSEP6' + StatusSEP24: + type: string + description: Possible status value for SEP-24 transactions + enum: + - incomplete + - completed + - refunded + - expired + - error + - pending_stellar + - pending_external + - pending_user_transfer_start + - pending_user_transfer_complete + - pending_anchor + - pending_trust + - pending_user + - no_market + - too_small + - too_large TransactionSEP24: type: object required: @@ -359,21 +492,6 @@ components: - pending_receiver - pending_transaction_info_update - pending_customer_info_update - StellarId: - type: object - description: | - StellarId's are objects that identify end-users and SEP-31 Sending Anchors, but not SEP-31 Receiving Anchors. - - For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. - - For a SEP-31 Sending Anchor, the `account` field should be used. - properties: - id: - type: string - description: The `id` of the customer registered through SEP-12. - account: - type: string - description: Either the Stellar account or Muxed account address of the on-chain entity. TransactionSEP31: type: object required: diff --git a/openapi/anchor-platform/bundled_callback.yml b/openapi/anchor-platform/bundled_callback.yml index c80fc5a57..2a1cebcd0 100644 --- a/openapi/anchor-platform/bundled_callback.yml +++ b/openapi/anchor-platform/bundled_callback.yml @@ -470,6 +470,7 @@ paths: post: tags: - Events + - SEP-6 - SEP-24 - SEP-31 summary: Receive an Event @@ -931,7 +932,9 @@ components: For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. - For a SEP-31 Sending Anchor, the `account` field should be used. + For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + + For a SEP-6 Anchor, the `account` and `memo` fields should be used. properties: id: type: string @@ -939,6 +942,9 @@ components: account: type: string description: Either the Stellar account or Muxed account address of the on-chain entity. + memo: + type: string + description: The memo value identifying a customer with a shared account, where the shared account is `account`. TransactionSEP31: type: object required: @@ -1031,6 +1037,11 @@ components: created_at: type: string format: date-time + Customer: + type: object + properties: + id: + type: string Event: type: object properties: @@ -1043,6 +1054,7 @@ components: - transaction_status_changed - transaction_error - quote_created + - customer_updated description: | The transaction event type. Can be one of the following: - `transaction_created` - a transaction was created through the SEP endpoints. The payload is in the `transaction` field. @@ -1061,6 +1073,8 @@ components: - $ref: '#/components/schemas/TransactionSEP31' quote: $ref: '#/components/schemas/Quote' + customer: + $ref: '#/components/schemas/Customer' required: - id - type diff --git a/openapi/anchor-platform/schemas.yml b/openapi/anchor-platform/schemas.yml index 769b3c908..0ab80b1f4 100644 --- a/openapi/anchor-platform/schemas.yml +++ b/openapi/anchor-platform/schemas.yml @@ -372,6 +372,84 @@ components: refund_memo_type: $ref: '#/components/schemas/MemoType' + TransactionSEP6: + type: object + required: [ id, sep, kind, status, started_at ] + properties: + id: + type: string + sep: + type: string + enum: [ "6" ] + kind: + type: string + enum: [ + # SEP6 + "deposit", + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" + ] + status: + $ref: '#/components/schemas/StatusSEP6' + type: + type: string + amount_expected: + $ref: '#/components/schemas/Amount' + amount_in: + $ref: '#/components/schemas/Amount' + amount_out: + $ref: '#/components/schemas/Amount' + amount_fee: + $ref: '#/components/schemas/Amount' + quote_id: + type: string + started_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + completed_at: + type: string + format: date-time + transfer_received_at: + type: string + format: date-time + message: + type: string + refunds: + $ref: '#/components/schemas/Refunds' + stellar_transactions: + type: array + items: + $ref: '#/components/schemas/StellarTransaction' + source_account: + type: string + destination_account: + type: string + external_transaction_id: + type: string + memo: + type: string + memo_type: + $ref: '#/components/schemas/MemoType' + refund_memo: + description: if provided, this memo should be used for refund transactions + type: string + refund_memo_type: + $ref: '#/components/schemas/MemoType' + customers: + type: object + description: | + The Identification info of the sending and receiving customers. If they were created through [SEP-12](https://stellar.org/protocol/sep-12), + this object should contain the SEP-12 customer `id`. Otherwise, the `account` address of the customer. + properties: + sender: + $ref: '#/components/schemas/StellarId' + receiver: + $ref: '#/components/schemas/StellarId' + MemoType: type: string description: The memo type of the transaction in the Stellar network. Should be present if memo is not null. @@ -449,6 +527,30 @@ components: pending_customer_info_update ] + StatusSEP6: + type: string + description: Possible status value for SEP-6 transactions + enum: [ + # Shared + incomplete, + completed, + refunded, + expired, + error, + pending_stellar, + pending_external, + # SEP-6 + pending_customer_info_update, + pending_user_transfer_start, + pending_user_transfer_complete, + pending_anchor, + pending_trust, + pending_user, + no_market, + too_small, + too_large + ] + StatusSEP24: type: string description: Possible status value for SEP-24 transactions @@ -491,6 +593,14 @@ components: pending_customer_info_update ] + TransactionListSEP6: + type: object + properties: + records: + type: array + items: + $ref: './schemas.yml#/components/schemas/TransactionSEP6' + TransactionListSEP24: type: object properties: @@ -554,7 +664,9 @@ components: For a SEP-12 customer, the `id` field should be sufficient to fully identify the customer in the business' Backend. - For a SEP-31 Sending Anchor, the `account` field should be used. + For a SEP-31 Sending Anchor, the `account` and `memo` fields should be used. + + For a SEP-6 Anchor, the `account` and `memo` fields should be used. properties: id: type: string @@ -562,6 +674,9 @@ components: account: type: string description: Either the Stellar account or Muxed account address of the on-chain entity. + memo: + type: string + description: The memo value identifying a customer with a shared account, where the shared account is `account`. StellarTransaction: type: object required: @@ -641,6 +756,7 @@ components: - transaction_status_changed - transaction_error - quote_created + - customer_updated description: | The transaction event type. Can be one of the following: - `transaction_created` - a transaction was created through the SEP endpoints. The payload is in the `transaction` field. @@ -659,6 +775,8 @@ components: - $ref: './schemas.yml#/components/schemas/TransactionSEP31' quote: $ref: '#/components/schemas/Quote' + customer: + $ref: '#/components/schemas/Customer' required: [ id, type, payload, timestamp ] Quote: type: object @@ -687,3 +805,8 @@ components: created_at: type: string format: date-time + Customer: + type: object + properties: + id: + type: string diff --git a/static/assets/rpc-methods/do_stellar_payment.json b/static/assets/rpc-methods/do_stellar_payment.json index 5d98cb159..a1f24e2a8 100644 --- a/static/assets/rpc-methods/do_stellar_payment.json +++ b/static/assets/rpc-methods/do_stellar_payment.json @@ -4,6 +4,9 @@ "description": "Submits a payment to a stellar network by a custody service", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -39,6 +42,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -50,7 +54,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/do_stellar_refund.json b/static/assets/rpc-methods/do_stellar_refund.json index f03728290..9b9c18345 100644 --- a/static/assets/rpc-methods/do_stellar_refund.json +++ b/static/assets/rpc-methods/do_stellar_refund.json @@ -4,6 +4,9 @@ "description": "Submits a refund payment to a stellar network by a custody service", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -92,6 +95,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -103,7 +107,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/notify_amounts_updated.json b/static/assets/rpc-methods/notify_amounts_updated.json index 72d205bc3..c2e1f0d1b 100644 --- a/static/assets/rpc-methods/notify_amounts_updated.json +++ b/static/assets/rpc-methods/notify_amounts_updated.json @@ -4,6 +4,9 @@ "description": "Update amount_out and amount_fee values", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -37,9 +40,7 @@ "description": "Amount of assets" } }, - "required": [ - "amount" - ] + "required": ["amount"] } }, { @@ -54,9 +55,7 @@ "description": "Amount of assets" } }, - "required": [ - "amount" - ] + "required": ["amount"] } } ], @@ -72,10 +71,7 @@ "sep": { "type": "integer", "description": "Protocol of the transaction", - "enum": [ - "24", - "31" - ] + "enum": ["6", "24", "31"] }, "kind": { "type": "string", @@ -84,7 +80,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { @@ -264,4 +262,4 @@ } } } -} \ No newline at end of file +} diff --git a/static/assets/rpc-methods/notify_customer_info_updated.json b/static/assets/rpc-methods/notify_customer_info_updated.json index d394546c6..4f5278e22 100644 --- a/static/assets/rpc-methods/notify_customer_info_updated.json +++ b/static/assets/rpc-methods/notify_customer_info_updated.json @@ -38,10 +38,7 @@ "sep": { "type": "integer", "description": "Protocol of the transaction", - "enum": [ - "24", - "31" - ] + "enum": ["6", "24", "31"] }, "kind": { "type": "string", @@ -50,7 +47,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { @@ -230,4 +229,4 @@ } } } -} \ No newline at end of file +} diff --git a/static/assets/rpc-methods/notify_offchain_funds_available.json b/static/assets/rpc-methods/notify_offchain_funds_available.json index 104f59fdd..1b6274620 100644 --- a/static/assets/rpc-methods/notify_offchain_funds_available.json +++ b/static/assets/rpc-methods/notify_offchain_funds_available.json @@ -4,6 +4,9 @@ "description": "Funds are ready for the user / recipient to pick up", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -47,6 +50,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -58,7 +62,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/notify_offchain_funds_pending.json b/static/assets/rpc-methods/notify_offchain_funds_pending.json index 386d8adc7..3b151499d 100644 --- a/static/assets/rpc-methods/notify_offchain_funds_pending.json +++ b/static/assets/rpc-methods/notify_offchain_funds_pending.json @@ -4,6 +4,9 @@ "description": "Payment has been submitted to external network, but is not yet confirmed", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -50,6 +53,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -61,7 +65,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/notify_offchain_funds_received.json b/static/assets/rpc-methods/notify_offchain_funds_received.json index dadee3a7f..f5b5bd6fc 100644 --- a/static/assets/rpc-methods/notify_offchain_funds_received.json +++ b/static/assets/rpc-methods/notify_offchain_funds_received.json @@ -4,6 +4,9 @@ "description": "Payment is being processed internally by anchor", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -53,9 +56,7 @@ "description": "Amount of assets" } }, - "required": [ - "amount" - ] + "required": ["amount"] } }, { @@ -70,9 +71,7 @@ "description": "Amount of assets" } }, - "required": [ - "amount" - ] + "required": ["amount"] } }, { @@ -87,9 +86,7 @@ "description": "Amount of assets" } }, - "required": [ - "amount" - ] + "required": ["amount"] } } ], @@ -105,10 +102,7 @@ "sep": { "type": "integer", "description": "Protocol of the transaction", - "enum": [ - "24", - "31" - ] + "enum": ["6", "24", "31"] }, "kind": { "type": "string", @@ -117,7 +111,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { @@ -297,4 +293,4 @@ } } } -} \ No newline at end of file +} diff --git a/static/assets/rpc-methods/notify_offchain_funds_sent.json b/static/assets/rpc-methods/notify_offchain_funds_sent.json index 56a170761..ee53bb90e 100644 --- a/static/assets/rpc-methods/notify_offchain_funds_sent.json +++ b/static/assets/rpc-methods/notify_offchain_funds_sent.json @@ -1,9 +1,12 @@ { "name": "notify_offchain_funds_sent", "summary": "Offchain funds sent", - "description": "Transaction flow is fully completed for SEP-24 withdrawal flow or SEP-31 receive flow. Payment has been submitted to external network, but is not yet confirmed for SEP-24 deposit flow", + "description": "Transaction flow is fully completed for the SEP-6 and SEP-24 withdrawal flow or SEP-31 receive flow. Payment has been submitted to external network, but is not yet confirmed for SEP-24 deposit flow", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -58,6 +61,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -69,7 +73,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/notify_onchain_funds_received.json b/static/assets/rpc-methods/notify_onchain_funds_received.json index 6df80d3f4..5dae9af81 100644 --- a/static/assets/rpc-methods/notify_onchain_funds_received.json +++ b/static/assets/rpc-methods/notify_onchain_funds_received.json @@ -1,9 +1,12 @@ { "name": "notify_onchain_funds_received", "summary": "Onchain funds received", - "description": "Payment is being processed internally by anchor for SEP-24. Payment is being processed by the Receiving Anchor for SEP-31", + "description": "Payment is being processed internally by anchor for SEP-6 or SEP-24. Payment is being processed by the Receiving Anchor for SEP-31", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -48,9 +51,7 @@ "description": "Amount of assets" } }, - "required": [ - "amount" - ] + "required": ["amount"] } }, { @@ -65,9 +66,7 @@ "description": "Amount of assets" } }, - "required": [ - "amount" - ] + "required": ["amount"] } }, { @@ -82,9 +81,7 @@ "description": "Amount of assets" } }, - "required": [ - "amount" - ] + "required": ["amount"] } } ], @@ -100,10 +97,7 @@ "sep": { "type": "integer", "description": "Protocol of the transaction", - "enum": [ - "24", - "31" - ] + "enum": ["6", "24", "31"] }, "kind": { "type": "string", @@ -112,7 +106,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { @@ -292,4 +288,4 @@ } } } -} \ No newline at end of file +} diff --git a/static/assets/rpc-methods/notify_onchain_funds_sent.json b/static/assets/rpc-methods/notify_onchain_funds_sent.json index 00c8d472e..689c130d3 100644 --- a/static/assets/rpc-methods/notify_onchain_funds_sent.json +++ b/static/assets/rpc-methods/notify_onchain_funds_sent.json @@ -1,9 +1,12 @@ { "name": "notify_onchain_funds_sent", "summary": "Onchain funds sent", - "description": "Transaction flow is fully completed for SEP-24 deposit", + "description": "Transaction flow is fully completed for SEP-6 or SEP-24 deposit", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -47,6 +50,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -58,7 +62,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/notify_refund_pending.json b/static/assets/rpc-methods/notify_refund_pending.json index f1c1f5fe2..d0f91f11f 100644 --- a/static/assets/rpc-methods/notify_refund_pending.json +++ b/static/assets/rpc-methods/notify_refund_pending.json @@ -4,6 +4,9 @@ "description": "Refund has been submitted, but is not yet confirmed", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -94,6 +97,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -105,7 +109,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { @@ -285,4 +291,4 @@ } } } -} \ No newline at end of file +} diff --git a/static/assets/rpc-methods/notify_refund_sent.json b/static/assets/rpc-methods/notify_refund_sent.json index b6cfa6a7e..b21fc277b 100644 --- a/static/assets/rpc-methods/notify_refund_sent.json +++ b/static/assets/rpc-methods/notify_refund_sent.json @@ -4,6 +4,9 @@ "description": "Refund payment completed", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -96,6 +99,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -107,7 +111,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/notify_transaction_error.json b/static/assets/rpc-methods/notify_transaction_error.json index 8a94be385..28834153b 100644 --- a/static/assets/rpc-methods/notify_transaction_error.json +++ b/static/assets/rpc-methods/notify_transaction_error.json @@ -4,6 +4,9 @@ "description": "There was an error processing transaction", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -53,7 +56,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/notify_transaction_expired.json b/static/assets/rpc-methods/notify_transaction_expired.json index 7813055d3..f5e4e4c2d 100644 --- a/static/assets/rpc-methods/notify_transaction_expired.json +++ b/static/assets/rpc-methods/notify_transaction_expired.json @@ -4,6 +4,9 @@ "description": "Funds were never received by the anchor and the transaction is considered abandoned by the user", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -42,6 +45,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -53,7 +57,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/notify_transaction_recovery.json b/static/assets/rpc-methods/notify_transaction_recovery.json index a935cdf37..2e51ec9ac 100644 --- a/static/assets/rpc-methods/notify_transaction_recovery.json +++ b/static/assets/rpc-methods/notify_transaction_recovery.json @@ -1,9 +1,12 @@ { "name": "notify_transaction_recovery ", "summary": "Transaction recovery", - "description": "Transaction status is changed from error / expired to pending_anchor(SEP-24) or pending_receiver(SEP-31)", + "description": "Transaction status is changed from error / expired to pending_anchor(SEP-6 or SEP-24) or pending_receiver(SEP-31)", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -42,6 +45,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -53,7 +57,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/notify_trust_set.json b/static/assets/rpc-methods/notify_trust_set.json index c8ef9b237..b8b12e3e5 100644 --- a/static/assets/rpc-methods/notify_trust_set.json +++ b/static/assets/rpc-methods/notify_trust_set.json @@ -4,6 +4,9 @@ "description": "The user has added a trustline for the asset", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -47,6 +50,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -58,7 +62,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/open-rpc.json b/static/assets/rpc-methods/open-rpc.json index 5745ade2f..85ba3f3b5 100644 --- a/static/assets/rpc-methods/open-rpc.json +++ b/static/assets/rpc-methods/open-rpc.json @@ -177,6 +177,9 @@ "description": "The user has to initiate transfer to the anchor", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -339,6 +342,9 @@ "description": "The user has to initiate transfer to the anchor", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -522,6 +528,9 @@ "description": "Payment is being processed internally by anchor", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -668,9 +677,12 @@ { "name": "notify_onchain_funds_received", "summary": "Onchain funds received", - "description": "Payment is being processed internally by anchor for SEP-24. Payment is being processed by the Receiving Anchor for SEP-31", + "description": "Payment is being processed internally by anchor for SEP-6 or SEP-24. Payment is being processed by the Receiving Anchor for SEP-31", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -795,6 +807,9 @@ "description": "Update amount_out and amount_fee values", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -896,6 +911,9 @@ "description": "Refund has been submitted, but is not yet confirmed", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -1020,6 +1038,9 @@ "description": "Refund payment completed", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -1146,6 +1167,9 @@ "description": "Submits a payment to stellar network by a custody service", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -1201,6 +1225,9 @@ "description": "Submits a refund payment to stellar network by a custody service", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -1318,9 +1345,12 @@ { "name": "notify_onchain_funds_sent", "summary": "Onchain funds sent", - "description": "Transaction flow is fully completed for SEP-24 deposit", + "description": "Transaction flow is fully completed for SEP-6 or SEP-24 deposit", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -1385,9 +1415,12 @@ { "name": "notify_offchain_funds_sent", "summary": "Offchain funds sent", - "description": "Transaction flow is fully completed for SEP-24 withdrawal flow or SEP-31 receive flow. Payment has been submitted to external network, but is not yet confirmed for SEP-24 deposit flow", + "description": "Transaction flow is fully completed for the SEP-6 and SEP-24 withdrawal flow or SEP-31 receive flow. Payment has been submitted to external network, but is not yet confirmed for SEP-24 deposit flow", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -1464,6 +1497,9 @@ "description": "Funds are ready for the user / recipient to pick up", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -1530,6 +1566,9 @@ "description": "Payment has been submitted to external network, but is not yet confirmed", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -1599,6 +1638,9 @@ "description": "The user must add a trustline for the asset to complete", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -1654,6 +1696,9 @@ "description": "The user has added a trustline for the asset", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -1716,6 +1761,9 @@ "description": "Additional customer information is required", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 31" } @@ -1735,6 +1783,22 @@ "schema": { "type": "string" } + }, + { + "name": "required_customer_info_message", + "description": "Human readable explanation indicating why the SEP-12 information provided by the user is not sufficient to complete the transaction. This field is only relevant for SEP-6 transactions and must be set.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "required_customer_info_updates", + "description": "A list of SEP-9 fields that require updates from the user via SEP-12. This field is only relevant for SEP-6 transactions and must be set.", + "required": false, + "schema": { + "type": "array" + } } ], "result": { @@ -1826,6 +1890,9 @@ "description": "There was an error processing transaction", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -1885,6 +1952,9 @@ "description": "Funds were never received by the anchor and the transaction is considered abandoned by the user", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -1941,9 +2011,12 @@ { "name": "notify_transaction_recovery ", "summary": "Transaction recovery", - "description": "Transaction status is changed from error / expired to pending_anchor(SEP-24) or pending_receiver(SEP-31)", + "description": "Transaction status is changed from error / expired to pending_anchor(SEP-6 or SEP-24) or pending_receiver(SEP-31)", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" }, @@ -2011,6 +2084,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -2022,7 +2096,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/request_customer_info_update.json b/static/assets/rpc-methods/request_customer_info_update.json index 9de98f30f..1c0684970 100644 --- a/static/assets/rpc-methods/request_customer_info_update.json +++ b/static/assets/rpc-methods/request_customer_info_update.json @@ -4,6 +4,9 @@ "description": "Additional customer information is required", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 31" } @@ -24,6 +27,22 @@ "schema": { "type": "string" } + }, + { + "name": "required_customer_info_message", + "description": "Human readable explanation indicating why the SEP-12 information provided by the user is not sufficient to complete the transaction. This field is only relevant for SEP-6 transactions and must be set.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "required_customer_info_updates", + "description": "A list of SEP-9 fields that require updates from the user via SEP-12. This field is only relevant for SEP-6 transactions and must be set.", + "required": false, + "schema": { + "type": "array" + } } ], "result": { @@ -38,10 +57,7 @@ "sep": { "type": "integer", "description": "Protocol of the transaction", - "enum": [ - "24", - "31" - ] + "enum": ["6", "24", "31"] }, "kind": { "type": "string", @@ -50,7 +66,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { @@ -230,4 +248,4 @@ } } } -} \ No newline at end of file +} diff --git a/static/assets/rpc-methods/request_offchain_funds.json b/static/assets/rpc-methods/request_offchain_funds.json index 3c9a67cdd..b8c580a09 100644 --- a/static/assets/rpc-methods/request_offchain_funds.json +++ b/static/assets/rpc-methods/request_offchain_funds.json @@ -4,6 +4,9 @@ "description": "The user has to initiate transfer to the anchor", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -122,6 +125,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -133,7 +137,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/request_onchain_funds.json b/static/assets/rpc-methods/request_onchain_funds.json index 442d683cd..b8a7f2c81 100644 --- a/static/assets/rpc-methods/request_onchain_funds.json +++ b/static/assets/rpc-methods/request_onchain_funds.json @@ -4,6 +4,9 @@ "description": "The user has to initiate transfer to the anchor", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -146,6 +149,7 @@ "type": "integer", "description": "Protocol of the transaction", "enum": [ + "6", "24", "31" ] @@ -157,7 +161,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { diff --git a/static/assets/rpc-methods/request_trust.json b/static/assets/rpc-methods/request_trust.json index 865781a8e..22548d748 100644 --- a/static/assets/rpc-methods/request_trust.json +++ b/static/assets/rpc-methods/request_trust.json @@ -4,6 +4,9 @@ "description": "The user must add a trustline for the asset to complete", "paramStructure": "by-name", "tags": [ + { + "name": "SEP - 6" + }, { "name": "SEP - 24" } @@ -38,10 +41,7 @@ "sep": { "type": "integer", "description": "Protocol of the transaction", - "enum": [ - "24", - "31" - ] + "enum": ["6", "24", "31"] }, "kind": { "type": "string", @@ -50,7 +50,9 @@ "undefined", "receive", "deposit", - "withdrawal" + "deposit-exchange", + "withdrawal", + "withdrawal-exchange" ] }, "status": { @@ -230,4 +232,4 @@ } } } -} \ No newline at end of file +} From 825df01bbd313d2e423a7160cd4039afc92fd42f Mon Sep 17 00:00:00 2001 From: Elliot Voris Date: Wed, 8 Nov 2023 10:21:52 -0600 Subject: [PATCH 11/16] Some Basic SEO Fixes (#266) * fix: nginx redirects should be permanent (301), not temporary (302) * fix: redirect the moneygram tutorial to its new URL * style: fix page with duplicate H1 and H2 tags * style: remove duplicate H1 and H2 tags on accounts page --- .../anchor-integration/setup.mdx | 2 +- .../stellar-data-structures/accounts.mdx | 2 - nginx/includes/redirects.conf | 63 ++++++++++--------- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/docs/building-apps/example-application-tutorial/anchor-integration/setup.mdx b/docs/building-apps/example-application-tutorial/anchor-integration/setup.mdx index 1508c3af9..f05ca1a92 100644 --- a/docs/building-apps/example-application-tutorial/anchor-integration/setup.mdx +++ b/docs/building-apps/example-application-tutorial/anchor-integration/setup.mdx @@ -22,7 +22,7 @@ Our integrations will also use the following SEPs: - [SEP-10: Stellar Web Authentication](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0010.md) - defines the standard way for clients to create authenticated web sessions on behalf of a user who holds a Stellar account - [SEP-12: KYC API](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0012.md) - defines a standard way for Stellar clients to upload KYC information to anchors -## Setup for anchored assets +## Finding anchored assets BasicPay takes care of all the anchor transfer details on the `/dashboard/transfers` page. See it in action here: https://basicpay.pages.dev/dashboard/transfers diff --git a/docs/fundamentals-and-concepts/stellar-data-structures/accounts.mdx b/docs/fundamentals-and-concepts/stellar-data-structures/accounts.mdx index 375e5391c..981d6f623 100644 --- a/docs/fundamentals-and-concepts/stellar-data-structures/accounts.mdx +++ b/docs/fundamentals-and-concepts/stellar-data-structures/accounts.mdx @@ -3,8 +3,6 @@ title: Accounts sidebar_position: 20 --- -## Accounts - Accounts are the central data structure in Stellar- they hold balances, sign transactions, and issue assets. Accounts can only exist with a valid keypair and the required minimum balance of XLM. To learn about minimum balance requirements, [see our section on Lumens](../lumens#minimum-balance). diff --git a/nginx/includes/redirects.conf b/nginx/includes/redirects.conf index 16a5ed4d2..0bf0732c4 100644 --- a/nginx/includes/redirects.conf +++ b/nginx/includes/redirects.conf @@ -1,33 +1,34 @@ -rewrite ^/docs/glossary/accounts$ "/docs/fundamentals-and-concepts/stellar-data-structures/accounts" redirect; -rewrite ^/docs/glossary/assets$ "/docs/fundamentals-and-concepts/stellar-data-structures/assets" redirect; -rewrite ^/docs/glossary/channels$ "/docs/encyclopedia/channel-accounts" redirect; -rewrite ^/docs/glossary/claimable-balance$ "/docs/encyclopedia/claimable-balances" redirect; -rewrite ^/docs/glossary/clawback$ "/docs/encyclopedia/clawbacks" redirect; -rewrite ^/docs/glossary/decentralized-exchange$ "/docs/encyclopedia/liquidity-on-stellar-sdex-and-liquidity-pools#sdex" redirect; -rewrite ^/docs/glossary/federation$ "/docs/encyclopedia/federation" redirect; -rewrite ^/docs/glossary/fee-bumps$ "/docs/encyclopedia/fee-bump-transactions" redirect; -rewrite ^/docs/glossary/fees$ "/docs/encyclopedia/fees-surge-pricing-fee-strategies" redirect; -rewrite ^/docs/glossary/inflation$ "/docs/encyclopedia/inflation" redirect; -rewrite ^/docs/glossary/ledger$ "/docs/fundamentals-and-concepts/stellar-data-structures/ledgers" redirect; -rewrite ^/docs/glossary/liquidity-pools$ "/docs/encyclopedia/liquidity-on-stellar-sdex-and-liquidity-pools#liquidity-pools" redirect; -rewrite ^/docs/glossary/lumen-supply$ "/docs/encyclopedia/lumen-supply-metrics" redirect; -rewrite ^/docs/glossary/minimum-balance$ "/docs/fundamentals-and-concepts/lumens#minimum-balance" redirect; -rewrite ^/docs/glossary/multisig$ "/docs/encyclopedia/signatures-and-multisig" redirect; -rewrite ^/docs/glossary/muxed-accounts$ "/docs/encyclopedia/network-passphrases" redirect; -rewrite ^/docs/glossary/network-passphrase$ "/docs/encyclopedia/network-passphrases" redirect; -rewrite ^/docs/glossary/operations$ "/docs/fundamentals-and-concepts/stellar-data-structures/operations-and-transactions#operations" redirect; -rewrite ^/docs/glossary/scp$ "/docs/fundamentals-and-concepts/stellar-consensus-protocol" redirect; -rewrite ^/docs/glossary/sponsored-reserves$ "/docs/encyclopedia/sponsored-reserves" redirect; -rewrite ^/docs/glossary/testnet$ "/docs/fundamentals-and-concepts/testnet-and-pubnet" redirect; -rewrite ^/docs/glossary/transactions$ "/docs/fundamentals-and-concepts/stellar-data-structures/operations-and-transactions" redirect; -rewrite ^/docs/glossary/xdr$ "/docs/encyclopedia/xdr" redirect; -rewrite ^/docs/software-and-sdks$ "/docs/tools-and-sdks#sdk-library" redirect; -rewrite ^/docs/start/introduction$ "/docs/" redirect; -rewrite ^/docs/start/list-of-operations$ "/docs/fundamentals-and-concepts/list-of-operations" redirect; -rewrite ^/docs/start/stellar-stack$ "/docs/fundamentals-and-concepts/stellar-stack" redirect; -rewrite ^/docs/tutorials/handling-errors$ "/docs/encyclopedia/error-handling" redirect; -rewrite ^/docs/tutorials/securing-projects$ "/docs/encyclopedia/securing-web-based-projects" redirect; +rewrite ^/docs/glossary/accounts$ "/docs/fundamentals-and-concepts/stellar-data-structures/accounts" permanent; +rewrite ^/docs/glossary/assets$ "/docs/fundamentals-and-concepts/stellar-data-structures/assets" permanent; +rewrite ^/docs/glossary/channels$ "/docs/encyclopedia/channel-accounts" permanent; +rewrite ^/docs/glossary/claimable-balance$ "/docs/encyclopedia/claimable-balances" permanent; +rewrite ^/docs/glossary/clawback$ "/docs/encyclopedia/clawbacks" permanent; +rewrite ^/docs/glossary/decentralized-exchange$ "/docs/encyclopedia/liquidity-on-stellar-sdex-and-liquidity-pools#sdex" permanent; +rewrite ^/docs/glossary/federation$ "/docs/encyclopedia/federation" permanent; +rewrite ^/docs/glossary/fee-bumps$ "/docs/encyclopedia/fee-bump-transactions" permanent; +rewrite ^/docs/glossary/fees$ "/docs/encyclopedia/fees-surge-pricing-fee-strategies" permanent; +rewrite ^/docs/glossary/inflation$ "/docs/encyclopedia/inflation" permanent; +rewrite ^/docs/glossary/ledger$ "/docs/fundamentals-and-concepts/stellar-data-structures/ledgers" permanent; +rewrite ^/docs/glossary/liquidity-pools$ "/docs/encyclopedia/liquidity-on-stellar-sdex-and-liquidity-pools#liquidity-pools" permanent; +rewrite ^/docs/glossary/lumen-supply$ "/docs/encyclopedia/lumen-supply-metrics" permanent; +rewrite ^/docs/glossary/minimum-balance$ "/docs/fundamentals-and-concepts/lumens#minimum-balance" permanent; +rewrite ^/docs/glossary/multisig$ "/docs/encyclopedia/signatures-and-multisig" permanent; +rewrite ^/docs/glossary/muxed-accounts$ "/docs/encyclopedia/network-passphrases" permanent; +rewrite ^/docs/glossary/network-passphrase$ "/docs/encyclopedia/network-passphrases" permanent; +rewrite ^/docs/glossary/operations$ "/docs/fundamentals-and-concepts/stellar-data-structures/operations-and-transactions#operations" permanent; +rewrite ^/docs/glossary/scp$ "/docs/fundamentals-and-concepts/stellar-consensus-protocol" permanent; +rewrite ^/docs/glossary/sponsored-reserves$ "/docs/encyclopedia/sponsored-reserves" permanent; +rewrite ^/docs/glossary/testnet$ "/docs/fundamentals-and-concepts/testnet-and-pubnet" permanent; +rewrite ^/docs/glossary/transactions$ "/docs/fundamentals-and-concepts/stellar-data-structures/operations-and-transactions" permanent; +rewrite ^/docs/glossary/xdr$ "/docs/encyclopedia/xdr" permanent; +rewrite ^/docs/software-and-sdks$ "/docs/tools-and-sdks#sdk-library" permanent; +rewrite ^/docs/start/introduction$ "/docs/" permanent; +rewrite ^/docs/start/list-of-operations$ "/docs/fundamentals-and-concepts/list-of-operations" permanent; +rewrite ^/docs/start/stellar-stack$ "/docs/fundamentals-and-concepts/stellar-stack" permanent; +rewrite ^/docs/tutorials/handling-errors$ "/docs/encyclopedia/error-handling" permanent; +rewrite ^/docs/tutorials/securing-projects$ "/docs/encyclopedia/securing-web-based-projects" permanent; +rewrite ^/docs/tutorials/moneygram-access-integration-guide$ "/docs/building-apps/moneygram-access-integration-guide" permanent; # moving /api/* locations to /api/horizon (leaving /api intact for the "overview page") -rewrite ^/api(/(?!horizon|(anchor|stellar-disbursement)-platform).+)$ /api/horizon$1 redirect; +rewrite ^/api(/(?!horizon|(anchor|stellar-disbursement)-platform).+)$ /api/horizon$1 permanent; # moving /ap_api locations to /api/anchor-platform -rewrite ^/ap_api(/.*)?$ /api/anchor-platform$1 redirect; +rewrite ^/ap_api(/.*)?$ /api/anchor-platform$1 permanent; From e801e6245a100ebfe0caffe614ebf9b6cd3ea625 Mon Sep 17 00:00:00 2001 From: Justin Rice Date: Wed, 8 Nov 2023 16:25:38 -0500 Subject: [PATCH 12/16] Update testnet-and-pubnet.mdx (#267) --- docs/fundamentals-and-concepts/testnet-and-pubnet.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fundamentals-and-concepts/testnet-and-pubnet.mdx b/docs/fundamentals-and-concepts/testnet-and-pubnet.mdx index 5d0c271f1..affe05fad 100644 --- a/docs/fundamentals-and-concepts/testnet-and-pubnet.mdx +++ b/docs/fundamentals-and-concepts/testnet-and-pubnet.mdx @@ -36,7 +36,7 @@ Testnet resets happen once per quarter at 0900 UTC and are announced at least tw March 15, 2023 June 14, 2023 ~~September 13, 2023~~ Note: this reset was skipped due to its proximity to the Protocol 20 Testnet updgrade. -December 5, 2023 +December 18, 2023 If you run a Testnet Horizon instance, you need to re-join and re-sync to the network after a reset. Check out how to do that here: [Testnet Reset](https://github.com/stellar/packages/blob/master/docs/testnet-reset.md). From a8c9edd810e3d25dfdb9cc5f535c3a9bb3c21c04 Mon Sep 17 00:00:00 2001 From: Elliot Voris Date: Tue, 14 Nov 2023 16:36:37 -0600 Subject: [PATCH 13/16] docs: remove `/offers` from the endpoints that support streaming (#270) Resolves #254. The introductory horizon api page on streaming lists `/offers` among the endpoints that support streaming. This is not, in fact, the truth. Refs: #254 --- api/horizon/introduction/streaming.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/api/horizon/introduction/streaming.mdx b/api/horizon/introduction/streaming.mdx index 602bc5536..09365e105 100644 --- a/api/horizon/introduction/streaming.mdx +++ b/api/horizon/introduction/streaming.mdx @@ -21,7 +21,6 @@ All attributes for the endpoints that allow streaming are the same as regular re | [Payments](../resources/operations/object/payment.mdx) | | [Effects](../resources/effects/index.mdx) | | [Accounts](../resources/accounts/index.mdx) | -| [Offers](../resources/offers/index.mdx) | | [Trades](../resources/trades/index.mdx) | | [Order Books](../aggregations/order-books/index.mdx) | From 191e244d590e0cdca566a75cb07b58b05bbc83cc Mon Sep 17 00:00:00 2001 From: mwtzzz <101583293+mwtzzz@users.noreply.github.com> Date: Mon, 20 Nov 2023 08:51:59 -0800 Subject: [PATCH 14/16] update apt repo for nodesource node_16 (#272) ### What update apt repo for nodesource node_16 ### Why it changed ### Testing simple change has already been deployed to stellar-design-system ### Issue addressed by this PR https://github.com/stellar/ops/issues/2626 --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index fb46e5ae2..0c8154f15 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,8 +8,8 @@ WORKDIR /app ENV DEBIAN_FRONTEND=noninteractive ENV INLINE_RUNTIME_CHUNK=false RUN apt-get update && apt-get install --no-install-recommends -y gpg curl git make ca-certificates apt-transport-https && \ - curl -sSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key|gpg --dearmor >/etc/apt/trusted.gpg.d/nodesource.gpg && \ - echo "deb https://deb.nodesource.com/node_16.x focal main" | tee /etc/apt/sources.list.d/nodesource.list && \ + curl -sSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key|gpg --dearmor >/etc/apt/trusted.gpg.d/nodesource-key.gpg && \ + echo "deb https://deb.nodesource.com/node_16.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg |gpg --dearmor >/etc/apt/trusted.gpg.d/yarnpkg.gpg && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && apt-get install -y nodejs yarn && apt-get clean @@ -22,4 +22,4 @@ RUN yarn build FROM nginx:1.17 COPY --from=build /app/build/ /usr/share/nginx/html/ -COPY nginx /etc/nginx/ \ No newline at end of file +COPY nginx /etc/nginx/ From 9cd66602e00a8251d628c12e9956ed08b5ee9f54 Mon Sep 17 00:00:00 2001 From: MazurakIhor <131388095+MazurakIhor@users.noreply.github.com> Date: Mon, 20 Nov 2023 20:04:25 +0200 Subject: [PATCH 15/16] Added Custody API.yml for automatic generation of Custody API docs (#271) * Added Custody API.yml which will automatically generate API docs * Minor fixes --- .../create-custody-transaction.api.mdx | 20 +- .../generate-unique-address.api.mdx | 15 +- .../custody-server/send-payment.api.mdx | 30 +- .../custody-server/send-refund.api.mdx | 25 +- api/anchor-platform/custody-server/sidebar.js | 2 +- docusaurus.config.js | 8 + openapi/anchor-platform/Custody API.yml | 234 ++++++++++++++++ openapi/anchor-platform/bundled_custody.yml | 265 ++++++++++++++++++ openapi/anchor-platform/schemas.yml | 29 ++ package.json | 4 +- 10 files changed, 588 insertions(+), 44 deletions(-) create mode 100644 openapi/anchor-platform/Custody API.yml create mode 100644 openapi/anchor-platform/bundled_custody.yml diff --git a/api/anchor-platform/custody-server/create-custody-transaction.api.mdx b/api/anchor-platform/custody-server/create-custody-transaction.api.mdx index 0f29dcda3..106a8c452 100644 --- a/api/anchor-platform/custody-server/create-custody-transaction.api.mdx +++ b/api/anchor-platform/custody-server/create-custody-transaction.api.mdx @@ -1,19 +1,19 @@ --- id: create-custody-transaction title: "Create Custody Transaction" -description: "Create Custody Transaction" +description: "Custody Server creates custody transaction record in DB." sidebar_label: "Create Custody Transaction" hide_title: true hide_table_of_contents: true -api: { "tags": [ "SEP-6", "SEP-24", "SEP-31" ], "description": "Custody Server creates custody transaction record in DB.\n", "operationId": "createCustodyTransaction", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "description": "SEP transaction ID", "type": "string" }, "memo": { "description": "Memo value, that is used to identify inbound or outbound payments", "type": "string" }, "memoType": { "description": "Type of memo, that is used to identify inbound or outbound payments", "type": "string", "enum": [ "id", "hash", "text" ] }, "protocol": { "description": "Protocol of SEP transaction", "type": "string", "enum": [ "6", "24", "31" ] }, "fromAccount": { "description": "Source Stellar account", "type": "string" }, "toAccount": { "description": "Destination Stellar account", "type": "string" }, "amount": { "description": "Amount of the asset, that is sent/received", "type": "string" }, "amountFee": { "description": "Fee of SEP transaction", "type": "string" }, "asset": { "description": "Asset, that is sent/received", "type": "string" }, "kind": { "description": "Kind of the SEP transaction", "type": "string", "enum": [ "deposit", "withdrawal", "receive" ] } }, "title": "CreateCustodyTransactionRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": {}, "title": "CreateCustodyTransactionResponse" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } } }, "method": "post", "path": "/transactions", "jsonRequestBodyExample": { "id": "123e4567-e89b-12d3-a456-426614174000", "memo": "12345", "memoType": "id", "protocol": "24", "fromAccount": "GA3X53JGZ5SLT733GNKH3CVV7RKCL4DXWCIZG2Y24HA24L6XNEHSQXT4", "toAccount": "GA3X53JGZ5SLT733GNKH3CVV7RKCL4DXWCIZG2Y24HA24L6XNEHSQXT4", "amount": "50", "amountAsset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5", "kind": "deposit" }, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Create Custody Transaction", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "transactions" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } -sidebar_class_name: "put api-method" -info_path: api/anchor-platform/custody-server-api +api: {"description":"Custody Server creates custody transaction record in DB.","operationId":"createCustodyTransaction","tags":["Custody Transactions","SEP-6","SEP-24","SEP-31"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"description":"SEP transaction ID.","type":"string"},"memo":{"description":"Memo value, that is used to identify inbound or outbound payments.","type":"string"},"memoType":{"description":"Type of memo, that is used to identify inbound or outbound payments.","type":"string","enum":["id","hash","text"]},"protocol":{"description":"Protocol of SEP transaction.","type":"string","enum":[6,24,31]},"fromAccount":{"description":"Source Stellar account.","type":"string"},"toAccount":{"description":"Destination Stellar account.","type":"string"},"amount":{"description":"Amount of the asset, that is sent/received.","type":"string"},"amountFee":{"description":"Fee of SEP transaction.","type":"string"},"asset":{"description":"Asset, that is sent/received.","type":"string"},"kind":{"description":"Kind of the SEP transaction.","type":"string","enum":["deposit","withdrawal","receive"]}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}}},"method":"post","path":"/transactions","jsonRequestBodyExample":{"id":"string","memo":"string","memoType":"id","protocol":6,"fromAccount":"string","toAccount":"string","amount":"string","amountFee":"string","asset":"string","kind":"deposit"},"info":{"version":"2.0.0","description":"","title":"Custody Server API"},"postman":{"name":"Create Custody Transaction","description":{"content":"Custody Server creates custody transaction record in DB.","type":"text/plain"},"url":{"path":["transactions"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"\"\"","options":{"raw":{"language":"json"}}}}} +sidebar_class_name: "post api-method" +info_path: api/anchor-platform/custody-server/custody-server-api custom_edit_url: null --- import { SepBadge } from "@site/src/components/SepBadge"; - + import ApiTabs from "@theme/ApiTabs"; import MimeTabs from "@theme/MimeTabs"; @@ -26,14 +26,16 @@ import TabItem from "@theme/TabItem"; ## Create Custody Transaction + + Custody Server creates custody transaction record in DB. -
    Request Body
    +
    Request Body
    -Success. +Success -
    Schema
      +
      Schema
      • object
      -Internal Server Error. +Internal Server Error
      Schema
      diff --git a/api/anchor-platform/custody-server/generate-unique-address.api.mdx b/api/anchor-platform/custody-server/generate-unique-address.api.mdx index b2464ea8f..6b3ec1e48 100644 --- a/api/anchor-platform/custody-server/generate-unique-address.api.mdx +++ b/api/anchor-platform/custody-server/generate-unique-address.api.mdx @@ -1,19 +1,19 @@ --- id: generate-unique-address title: "Generate Unique Address" -description: "Generate Unique Address" +description: "Custody Server calls the configured custody service to generate deposit address and memo." sidebar_label: "Generate Unique Address" hide_title: true hide_table_of_contents: true -api: { "tags": [ "SEP-6", "SEP-24", "SEP-31" ], "description": "Custody Server calls the configured custody service to generate deposit address and memo.\n", "operationId": "generateUniqueAddress", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": {}, "title": "GenerateUniqueAddressRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": { "address": { "description": "Deposit address to which the client should send funds", "type": "string" }, "memo": { "description": "Memo value, that should be added to payment by the client", "type": "string" }, "memoType": { "description": "Type of memo, that should be added to payment by the client", "type": "string", "enum": [ "id", "hash", "text" ] } }, "title": "GenerateUniqueAddressResponse" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } } }, "method": "post", "path": "/assets/{asset}/addresses", "jsonRequestBodyExample": {}, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Generate Unique Address", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "assets", ":asset", "addresses" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } +api: {"description":"Custody Server calls the configured custody service to generate deposit address and memo.\n\nFormat of `asset` parameter - `stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5`\n","operationId":"generateUniqueAddress","tags":["Unique Address","SEP-6","SEP-24","SEP-31"],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"address":{"description":"Deposit address to which the client should send funds.","type":"string"},"memo":{"description":"Memo value, that should be added to payment by the client.","type":"string"},"memoType":{"description":"Type of memo, that should be added to payment by the client.","type":"string","enum":["id","hash","text"]}},"title":"GenerateUniqueAddressResponse"}}}},"500":{"description":"Internal Server Error.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}}},"method":"post","path":"/assets/{asset}/addresses","jsonRequestBodyExample":{},"info":{"version":"2.0.0","description":"","title":"Custody Server API"},"postman":{"name":"Generate Unique Address","description":{"content":"Custody Server calls the configured custody service to generate deposit address and memo.\n\nFormat of `asset` parameter - `stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5`\n","type":"text/plain"},"url":{"path":["assets",":asset","addresses"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"\"\"","options":{"raw":{"language":"json"}}}}} sidebar_class_name: "post api-method" -info_path: api/anchor-platform/custody-server-api +info_path: api/anchor-platform/custody-server/custody-server-api custom_edit_url: null --- import { SepBadge } from "@site/src/components/SepBadge"; - + import ApiTabs from "@theme/ApiTabs"; import MimeTabs from "@theme/MimeTabs"; @@ -26,15 +26,18 @@ import TabItem from "@theme/TabItem"; ## Generate Unique Address + + Custody Server calls the configured custody service to generate deposit address and memo. Format of `asset` parameter - `stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5` -
      Request Body
        + +
        Request Body
        • object
        Success. -
        Schema
        +
        Schema
        Internal Server Error. diff --git a/api/anchor-platform/custody-server/send-payment.api.mdx b/api/anchor-platform/custody-server/send-payment.api.mdx index dc007b576..884c5f01b 100644 --- a/api/anchor-platform/custody-server/send-payment.api.mdx +++ b/api/anchor-platform/custody-server/send-payment.api.mdx @@ -1,19 +1,19 @@ --- id: send-payment -title: "Send payment" -description: "Send payment" -sidebar_label: "Send payment" +title: "Send Payment" +description: "Custody Server calls the configured custody service to send payment." +sidebar_label: "Send Payment" hide_title: true hide_table_of_contents: true -api: { "tags": [ "SEP-6", "SEP-24", "SEP-31" ], "description": "Custody Server calls configured Custody Service to send payment.\n", "operationId": "sendPayment", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": {}, "title": "SendPaymentRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "description": "External TX ID from custody service", "type": "string" } }, "title": "SendPaymentResponse" } } } }, "400": { "description": "Invalid Request.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Invalid Request" } } } }, "404": { "description": "Custody Transaction is not found.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Transaction is not found" } } } }, "429": { "description": "Custody Service rate limit is exceeded.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Service rate limit is exceeded" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } }, "503": { "description": "Custody Service is unavailable.", "content": { "application/json": { "schema": { "type": "object", "properties": { "rawErrorMessage": { "type": "string" } }, "title": "Custody Service is unavailable" } } } } }, "method": "post", "path": "/transactions/{id}/payments", "jsonRequestBodyExample": {}, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Send Payment", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "transactions", ":id", "payments" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } +api: {"description":"Custody Server calls the configured custody service to send payment.","operationId":"sendPayment","tags":["Payments","SEP-6","SEP-24","SEP-31"],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"External TX ID from custody service."}},"title":"SendPaymentResponse"}}}},"400":{"description":"Invalid Request.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}},"404":{"description":"Custody Transaction is not found.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}},"429":{"description":"Custody Service rate limit is exceeded.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}},"500":{"description":"Internal Server Error.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}},"503":{"description":"Custody Service is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}}},"method":"post","path":"/transactions/:id/payments","jsonRequestBodyExample":{},"info":{"version":"2.0.0","description":"","title":"Custody Server API"}} sidebar_class_name: "post api-method" -info_path: api/anchor-platform/custody-server-api +info_path: api/anchor-platform/custody-server/custody-server-api custom_edit_url: null --- import { SepBadge } from "@site/src/components/SepBadge"; - + import ApiTabs from "@theme/ApiTabs"; import MimeTabs from "@theme/MimeTabs"; @@ -26,30 +26,32 @@ import TabItem from "@theme/TabItem"; ## Send Payment + + Custody Server calls the configured custody service to send payment. -
        Request Body
          +
          Request Body
          • object
          -Success. +Success -
          Schema
          +
          Schema
          Invalid Request. -
          Schema
          +
          Schema
          Custody Transaction is not found. -
          Schema
          +
          Schema
          Custody Service rate limit is exceeded. -
          Schema
          +
          Schema
          Internal Server Error. -
          Schema
          +
          Schema
          Custody Service is unavailable. -
          Schema
          +
          Schema
          diff --git a/api/anchor-platform/custody-server/send-refund.api.mdx b/api/anchor-platform/custody-server/send-refund.api.mdx index 54ffe6c53..250ff464a 100644 --- a/api/anchor-platform/custody-server/send-refund.api.mdx +++ b/api/anchor-platform/custody-server/send-refund.api.mdx @@ -1,19 +1,19 @@ --- id: send-refund title: "Send Refund" -description: "Send Refund" +description: "Custody Server calls configured Custody Service to send refund. Custody transaction record is also created in DB." sidebar_label: "Send Refund" hide_title: true hide_table_of_contents: true -api: { "tags": [ "SEP-6", "SEP-24", "SEP-31" ], "description": "Custody Server calls configured Custody Service to send payment.\n", "operationId": "sendPayment", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "memo": { "description": "Memo value, that will be added to the refund payment", "type": "string" }, "memoType": { "description": "Type of memo, that will be added to the refund payment", "type": "string" }, "amount": { "description": "Amount, that will be refunded", "type": "string" }, "amountFee": { "description": "Fee of the refund", "type": "string" } }, "title": "SendPaymentRequest" } } } }, "responses": { "200": { "description": "Success.", "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "description": "External TX ID from custody service", "type": "string" } }, "title": "SendPaymentResponse" } } } }, "400": { "description": "Invalid Request.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Invalid Request" } } } }, "404": { "description": "Custody Transaction is not found.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Transaction is not found" } } } }, "429": { "description": "Custody Service rate limit is exceeded.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Custody Service rate limit is exceeded" } } } }, "500": { "description": "Internal Server Error.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } }, "title": "Error" } } } }, "503": { "description": "Custody Service is unavailable.", "content": { "application/json": { "schema": { "type": "object", "properties": { "rawErrorMessage": { "type": "string" } }, "title": "Custody Service is unavailable" } } } } }, "method": "post", "path": "/transactions/{id}/payments", "jsonRequestBodyExample": {}, "info": { "version": "2.0.0", "description": "The Custody Server API specification for the Stellar Anchor Platform project.\n\nThe Custody Server API defines requests made by the Platform to interact with custody services.\n", "title": "Custody Server API" }, "postman": { "name": "Send Payment", "description": { "content": "The Custody Server provides set of endpoints to interact with custody services.\n", "type": "text/plain" }, "url": { "path": [ "transactions", ":id", "payments" ], "host": [ "{{baseUrl}}" ], "query": [], "variable": [] }, "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Accept", "value": "application/json" } ], "method": "POST", "body": { "mode": "raw", "raw": "\"\"", "options": { "raw": { "language": "json" } } } } } +api: {"description":"Custody Server calls configured Custody Service to send refund. Custody transaction record is also created in DB.","operationId":"sendRefund","tags":["Refunds","SEP-6","SEP-24","SEP-31"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"memo":{"description":"Memo value, that will be added to the refund payment.","type":"string"},"memoType":{"description":"Type of memo, that will be added to the refund payment.","type":"string"},"amount":{"description":"Amount, that will be refunded.","type":"string"},"amountFee":{"description":"Fee of the refund.","type":"string"}}}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"External TX ID from custody service."}},"title":"SendPaymentResponse"}}}},"400":{"description":"Invalid Request.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}},"404":{"description":"Custody Transaction is not found.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}},"429":{"description":"Custody Service rate limit is exceeded.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}},"500":{"description":"Internal Server Error.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}},"503":{"description":"Custody Service is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"title":"CustodyError"}}}}},"method":"post","path":"/transactions/:id/refunds","jsonRequestBodyExample":{"memo":"string","memoType":"string","amount":"string","amountFee":"string"},"info":{"version":"2.0.0","description":"","title":"Custody Server API"}} sidebar_class_name: "post api-method" -info_path: api/anchor-platform/custody-server-api +info_path: api/anchor-platform/custody-server/custody-server-api custom_edit_url: null --- import { SepBadge } from "@site/src/components/SepBadge"; - + import ApiTabs from "@theme/ApiTabs"; import MimeTabs from "@theme/MimeTabs"; @@ -26,31 +26,32 @@ import TabItem from "@theme/TabItem"; ## Send Refund -Custody Server calls configured Custody Service to send refund. -Custody transaction record is also created in DB. + + +Custody Server calls configured Custody Service to send refund. Custody transaction record is also created in DB.
          Request Body
          Success. -
          Schema
          +
          Schema
          Invalid Request. -
          Schema
          +
          Schema
          Custody Transaction is not found. -
          Schema
          +
          Schema
          Custody Service rate limit is exceeded. -
          Schema
          +
          Schema
          Internal Server Error. -
          Schema
          +
          Schema
          Custody Service is unavailable. -
          Schema
          +
          Schema
          diff --git a/api/anchor-platform/custody-server/sidebar.js b/api/anchor-platform/custody-server/sidebar.js index 11057bb75..94a2055e1 100644 --- a/api/anchor-platform/custody-server/sidebar.js +++ b/api/anchor-platform/custody-server/sidebar.js @@ -1 +1 @@ -module.exports = [ { "type": "doc", "id": "anchor-platform/custody-server" }, { "type": "category", "label": "Custody Transactions", "link": { "type": "generated-index", "title": "Custody Transactions", "slug": "/category/anchor-platform/custody-server/custody-transactions" }, "items": [ { "type": "doc", "id": "anchor-platform/custody-server/create-custody-transaction", "label": "Create Custody Transaction", "className": "api-method post" } ] }, { "type": "category", "label": "Unique Address", "link": { "type": "generated-index", "title": "Unique Address", "slug": "/category/anchor-platform/custody-server/unique-address" }, "items": [ { "type": "doc", "id": "anchor-platform/custody-server/generate-unique-address", "label": "Generate Unique Address", "className": "api-method post" } ] }, { "type": "category", "label": "Payments", "link": { "type": "generated-index", "title": "Payments", "slug": "/category/anchor-platform/custody-server/payments" }, "items": [ { "type": "doc", "id": "anchor-platform/custody-server/send-payment", "label": "Send Payment", "className": "api-method post" } ] }, { "type": "category", "label": "Refunds", "link": { "type": "generated-index", "title": "Refunds", "slug": "/category/anchor-platform/custody-server/refunds" }, "items": [ { "type": "doc", "id": "anchor-platform/custody-server/send-refund", "label": "Send Refund", "className": "api-method post" } ] }, { "type": "category", "label": "SEP-24", "link": { "type": "generated-index", "title": "SEP-24", "slug": "/category/anchor-platform/custody-server/sep-24" }, "items": [ { "type": "doc", "id": "anchor-platform/custody-server/create-custody-transaction", "label": "Create Custody Transaction", "className": "api-method post" }, { "type": "doc", "id": "/category/anchor-platform/custody-server/generate-unique-address", "label": "Generate Unique Address", "className": "api-method post" }, { "type": "doc", "id": "anchor-platform/custody-server/send-payment", "label": "Send Payment", "className": "api-method post" }, { "type": "doc", "id": "anchor-platform/custody-server/send-payment", "label": "Send Refund", "className": "api-method post" } ] }, { "type": "category", "label": "SEP-31", "link": { "type": "generated-index", "title": "SEP-31", "slug": "/category/anchor-platform/custody-server/sep-31" }, "items": [ { "type": "doc", "id": "anchor-platform/custody-server/create-custody-transaction", "label": "Create Custody Transaction", "className": "api-method post" }, { "type": "doc", "id": "/category/anchor-platform/custody-server/generate-unique-address", "label": "Generate Unique Address", "className": "api-method post" }, { "type": "doc", "id": "anchor-platform/custody-server/send-payment", "label": "Send Payment", "className": "api-method post" }, { "type": "doc", "id": "anchor-platform/custody-server/send-payment", "label": "Send Refund", "className": "api-method post" } ] } ]; \ No newline at end of file +module.exports = [{"type":"doc","id":"anchor-platform/custody-server/custody-server-api"},{"type":"category","label":"Custody Transactions","link":{"type":"generated-index","title":"Custody Transactions","slug":"/category/anchor-platform/custody-server/custody-transactions"},"items":[{"type":"doc","id":"anchor-platform/custody-server/create-custody-transaction","label":"Create Custody Transaction","className":"api-method post"}]},{"type":"category","label":"Payments","link":{"type":"generated-index","title":"Payments","slug":"/category/anchor-platform/custody-server/payments"},"items":[{"type":"doc","id":"anchor-platform/custody-server/send-payment","label":"Send Payment","className":"api-method post"}]},{"type":"category","label":"Refunds","link":{"type":"generated-index","title":"Refunds","slug":"/category/anchor-platform/custody-server/refunds"},"items":[{"type":"doc","id":"anchor-platform/custody-server/send-refund","label":"Send Refund","className":"api-method post"}]},{"type":"category","label":"Unique Address","link":{"type":"generated-index","title":"Unique Address","slug":"/category/anchor-platform/custody-server/unique-address"},"items":[{"type":"doc","id":"anchor-platform/custody-server/generate-unique-address","label":"Generate Unique Address","className":"api-method post"}]},{"type":"category","label":"SEP-6","link":{"type":"generated-index","title":"SEP-6","slug":"/category/anchor-platform/custody-server/sep-6"},"items":[{"type":"doc","id":"anchor-platform/custody-server/create-custody-transaction","label":"Create Custody Transaction","className":"api-method post"},{"type":"doc","id":"anchor-platform/custody-server/send-payment","label":"Send Payment","className":"api-method post"},{"type":"doc","id":"anchor-platform/custody-server/send-refund","label":"Send Refund","className":"api-method post"},{"type":"doc","id":"anchor-platform/custody-server/generate-unique-address","label":"Generate Unique Address","className":"api-method post"}]},{"type":"category","label":"SEP-24","link":{"type":"generated-index","title":"SEP-24","slug":"/category/anchor-platform/custody-server/sep-24"},"items":[{"type":"doc","id":"anchor-platform/custody-server/create-custody-transaction","label":"Create Custody Transaction","className":"api-method post"},{"type":"doc","id":"anchor-platform/custody-server/send-payment","label":"Send Payment","className":"api-method post"},{"type":"doc","id":"anchor-platform/custody-server/send-refund","label":"Send Refund","className":"api-method post"},{"type":"doc","id":"anchor-platform/custody-server/generate-unique-address","label":"Generate Unique Address","className":"api-method post"}]},{"type":"category","label":"SEP-31","link":{"type":"generated-index","title":"SEP-31","slug":"/category/anchor-platform/custody-server/sep-31"},"items":[{"type":"doc","id":"anchor-platform/custody-server/create-custody-transaction","label":"Create Custody Transaction","className":"api-method post"},{"type":"doc","id":"anchor-platform/custody-server/send-payment","label":"Send Payment","className":"api-method post"},{"type":"doc","id":"anchor-platform/custody-server/send-refund","label":"Send Refund","className":"api-method post"},{"type":"doc","id":"anchor-platform/custody-server/generate-unique-address","label":"Generate Unique Address","className":"api-method post"}]}]; \ No newline at end of file diff --git a/docusaurus.config.js b/docusaurus.config.js index f15fd2fb5..8db7edf7b 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -60,6 +60,14 @@ const config = { }, template: "src/template.mustache", // Customize API MDX with mustache template }, + anchor_custody_api: { + specPath: "openapi/anchor-platform/bundled_custody.yml", // Path to designated spec file + outputDir: "api/anchor-platform/custody-server", // Output directory for generated .mdx docs + sidebarOptions: { + groupPathsBy: "tag", + }, + template: "src/template.mustache", // Customize API MDX with mustache template + }, stellar_disbursement_platform: { specPath: "openapi/stellar-disbursement-platform/bundled.yml", // Path to designated spec file outputDir: "api/stellar-disbursement-platform/resources", // Output directory for generated .mdx docs diff --git a/openapi/anchor-platform/Custody API.yml b/openapi/anchor-platform/Custody API.yml new file mode 100644 index 000000000..6e06b830e --- /dev/null +++ b/openapi/anchor-platform/Custody API.yml @@ -0,0 +1,234 @@ +openapi: 3.0.0 +info: + version: "2.0.0" + description: | + title: Custody Server API +tags: + - name: "Custody Transactions" + description: "Custody Server creates custody transaction record in DB." + - name: "Payments" + description: "Custody Server calls the configured custody service to send payment." + - name: "Refunds" + description: "Custody Server calls configured Custody Service to send refund. Custody transaction record is also created in DB." + - name: "Unique Address" + description: "Custody Server calls the configured custody service to generate deposit address and memo." +paths: + /transactions: + post: + description: Custody Server creates custody transaction record in DB. + summary: Create Custody Transaction + operationId: createCustodyTransaction + tags: + - Custody Transactions + - SEP-6 + - SEP-24 + - SEP-31 + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + description: SEP transaction ID. + type: string + memo: + description: Memo value, that is used to identify inbound or outbound payments. + type: string + memoType: + description: Type of memo, that is used to identify inbound or outbound payments. + type: string + enum: + - id + - hash + - text + protocol: + description: Protocol of SEP transaction. + type: string + enum: + - 6 + - 24 + - 31 + fromAccount: + description: Source Stellar account. + type: string + toAccount: + description: Destination Stellar account. + type: string + amount: + description: Amount of the asset, that is sent/received. + type: string + amountFee: + description: Fee of SEP transaction. + type: string + asset: + description: Asset, that is sent/received. + type: string + kind: + description: Kind of the SEP transaction. + type: string + enum: + - deposit + - withdrawal + - receive + responses: + '200': + description: Success. + content: + application/json: + schema: + type: object + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' + /transactions/:id/payments: + post: + description: Custody Server calls the configured custody service to send payment. + summary: Send Payment + operationId: sendPayment + tags: + - Payments + - SEP-6 + - SEP-24 + - SEP-31 + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: Success. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/SendPaymentResponse' + '400': + description: Invalid Request. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' + '404': + description: Custody Transaction is not found. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' + '429': + description: Custody Service rate limit is exceeded. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' + '500': + description: Internal Server Error. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' + '503': + description: Custody Service is unavailable. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' + /transactions/:id/refunds: + post: + description: Custody Server calls configured Custody Service to send refund. Custody transaction record is also created in DB. + summary: Send Refund + operationId: sendRefund + tags: + - Refunds + - SEP-6 + - SEP-24 + - SEP-31 + requestBody: + content: + application/json: + schema: + type: object + properties: + memo: + description: Memo value, that will be added to the refund payment. + type: string + memoType: + description: Type of memo, that will be added to the refund payment. + type: string + amount: + description: Amount, that will be refunded. + type: string + amountFee: + description: Fee of the refund. + type: string + responses: + '200': + description: Success. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/SendPaymentResponse' + '400': + description: Invalid Request. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' + '404': + description: Custody Transaction is not found. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' + '429': + description: Custody Service rate limit is exceeded. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' + '500': + description: Internal Server Error. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' + '503': + description: Custody Service is unavailable. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' + /assets/{asset}/addresses: + post: + description: | + Custody Server calls the configured custody service to generate deposit address and memo. + + Format of `asset` parameter - `stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5` + summary: Generate Unique Address + operationId: generateUniqueAddress + tags: + - Unique Address + - SEP-6 + - SEP-24 + - SEP-31 + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: Success. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/GenerateUniqueAddressResponse' + '500': + description: Internal Server Error. + content: + application/json: + schema: + $ref: './schemas.yml#/components/schemas/CustodyError' \ No newline at end of file diff --git a/openapi/anchor-platform/bundled_custody.yml b/openapi/anchor-platform/bundled_custody.yml new file mode 100644 index 000000000..de32f8b5f --- /dev/null +++ b/openapi/anchor-platform/bundled_custody.yml @@ -0,0 +1,265 @@ +openapi: 3.0.0 +info: + version: 2.0.0 + description: '' + title: Custody Server API +tags: + - name: Custody Transactions + description: Custody Server creates custody transaction record in DB. + - name: Payments + description: Custody Server calls the configured custody service to send payment. + - name: Refunds + description: Custody Server calls configured Custody Service to send refund. Custody transaction record is also created in DB. + - name: Unique Address + description: Custody Server calls the configured custody service to generate deposit address and memo. +paths: + /transactions: + post: + description: Custody Server creates custody transaction record in DB. + summary: Create Custody Transaction + operationId: createCustodyTransaction + tags: + - Custody Transactions + - SEP-6 + - SEP-24 + - SEP-31 + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + description: SEP transaction ID. + type: string + memo: + description: Memo value, that is used to identify inbound or outbound payments. + type: string + memoType: + description: Type of memo, that is used to identify inbound or outbound payments. + type: string + enum: + - id + - hash + - text + protocol: + description: Protocol of SEP transaction. + type: string + enum: + - 6 + - 24 + - 31 + fromAccount: + description: Source Stellar account. + type: string + toAccount: + description: Destination Stellar account. + type: string + amount: + description: Amount of the asset, that is sent/received. + type: string + amountFee: + description: Fee of SEP transaction. + type: string + asset: + description: Asset, that is sent/received. + type: string + kind: + description: Kind of the SEP transaction. + type: string + enum: + - deposit + - withdrawal + - receive + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' + /transactions/:id/payments: + post: + description: Custody Server calls the configured custody service to send payment. + summary: Send Payment + operationId: sendPayment + tags: + - Payments + - SEP-6 + - SEP-24 + - SEP-31 + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/SendPaymentResponse' + '400': + description: Invalid Request. + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' + '404': + description: Custody Transaction is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' + '429': + description: Custody Service rate limit is exceeded. + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' + '500': + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' + '503': + description: Custody Service is unavailable. + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' + /transactions/:id/refunds: + post: + description: Custody Server calls configured Custody Service to send refund. Custody transaction record is also created in DB. + summary: Send Refund + operationId: sendRefund + tags: + - Refunds + - SEP-6 + - SEP-24 + - SEP-31 + requestBody: + content: + application/json: + schema: + type: object + properties: + memo: + description: Memo value, that will be added to the refund payment. + type: string + memoType: + description: Type of memo, that will be added to the refund payment. + type: string + amount: + description: Amount, that will be refunded. + type: string + amountFee: + description: Fee of the refund. + type: string + responses: + '200': + description: Success. + content: + application/json: + schema: + $ref: '#/components/schemas/SendPaymentResponse' + '400': + description: Invalid Request. + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' + '404': + description: Custody Transaction is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' + '429': + description: Custody Service rate limit is exceeded. + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' + '500': + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' + '503': + description: Custody Service is unavailable. + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' + /assets/{asset}/addresses: + post: + description: | + Custody Server calls the configured custody service to generate deposit address and memo. + + Format of `asset` parameter - `stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5` + summary: Generate Unique Address + operationId: generateUniqueAddress + tags: + - Unique Address + - SEP-6 + - SEP-24 + - SEP-31 + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: Success. + content: + application/json: + schema: + $ref: '#/components/schemas/GenerateUniqueAddressResponse' + '500': + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/CustodyError' +components: + schemas: + CustodyError: + type: object + required: + - error + properties: + error: + type: string + SendPaymentResponse: + type: object + properties: + id: + type: string + description: External TX ID from custody service. + GenerateUniqueAddressResponse: + type: object + properties: + address: + description: Deposit address to which the client should send funds. + type: string + memo: + description: Memo value, that should be added to payment by the client. + type: string + memoType: + description: Type of memo, that should be added to payment by the client. + type: string + enum: + - id + - hash + - text diff --git a/openapi/anchor-platform/schemas.yml b/openapi/anchor-platform/schemas.yml index 0ab80b1f4..9d3a216d3 100644 --- a/openapi/anchor-platform/schemas.yml +++ b/openapi/anchor-platform/schemas.yml @@ -810,3 +810,32 @@ components: properties: id: type: string + CustodyError: + type: object + required: + - error + properties: + error: + type: string + SendPaymentResponse: + type: object + properties: + id: + type: string + description: External TX ID from custody service. + GenerateUniqueAddressResponse: + type: object + properties: + address: + description: Deposit address to which the client should send funds. + type: string + memo: + description: Memo value, that should be added to payment by the client. + type: string + memoType: + description: Type of memo, that should be added to payment by the client. + type: string + enum: + - id + - hash + - text diff --git a/package.json b/package.json index d8aab088c..ae3989ed2 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,9 @@ "api:clean": "docusaurus clean-api-docs all", "api:bundle": "yarn bundle-horizon && yarn bundle-anchor-platform && yarn bundle-stellar-disbursement-platform", "bundle-horizon": "redocly bundle openapi/horizon/main.yml --output openapi/horizon/bundled.yml", - "bundle-anchor-platform": "redocly bundle openapi/anchor-platform/Platform\\ API.yml --output openapi/anchor-platform/bundled.yml && yarn redocly bundle openapi/anchor-platform/Callbacks\\ API.yml --output openapi/anchor-platform/bundled_callback.yml", + "bundle-anchor-platform": "redocly bundle openapi/anchor-platform/Platform\\ API.yml --output openapi/anchor-platform/bundled.yml && yarn redocly bundle openapi/anchor-platform/Callbacks\\ API.yml --output openapi/anchor-platform/bundled_callback.yml && yarn redocly bundle openapi/anchor-platform/Custody\\ API.yml --output openapi/anchor-platform/bundled_custody.yml", "bundle-stellar-disbursement-platform": "redocly bundle openapi/stellar-disbursement-platform/main.yml --output openapi/stellar-disbursement-platform/bundled.yml", - "api:gen": "docusaurus gen-api-docs all && rm api/horizon/resources/*.info.mdx && rm api/anchor-platform/resources/*.info.mdx && rm api/anchor-platform/callbacks/*.info.mdx && rm api/stellar-disbursement-platform/resources/*.info.mdx", + "api:gen": "docusaurus gen-api-docs all && rm api/horizon/resources/*.info.mdx && rm api/anchor-platform/resources/*.info.mdx && rm api/anchor-platform/callbacks/*.info.mdx && rm api/stellar-disbursement-platform/resources/*.info.mdx && rm api/anchor-platform/custody-server/*.info.mdx", "api": "yarn api:clean && yarn api:bundle && yarn api:gen", "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids", From 7296f7f7c6903d1664fb58c383a1ca6b50020756 Mon Sep 17 00:00:00 2001 From: Philip Liu <12836897+philipliu@users.noreply.github.com> Date: Mon, 20 Nov 2023 16:08:30 -0500 Subject: [PATCH 16/16] Anchor Platform: Add SEP-6 Integration Guide (#268) * Add SEP-6 integration guide * Add AmountsUpdated * PR comments * Refactor * Update sep24 do refund title --- .../component/observer/observer.mdx | 36 + .../anchor-platform/component/rpc/error.mdx | 16 + .../anchor-platform/component/rpc/request.mdx | 29 + .../component/rpc/response.mdx | 33 + .../anchor-platform/component/rpc/rpc.mdx | 17 + .../component/security/api_key.mdx | 14 + .../component/security/jwt.mdx | 14 + .../component/security/security.mdx | 11 + .../anchor-platform/sep24/integration.mdx | 197 +--- .../anchor-platform/sep6/_category_.json | 7 + .../anchor-platform/sep6/configuration.mdx | 126 +++ .../anchor-platform/sep6/index.mdx | 33 + .../anchor-platform/sep6/integration.mdx | 982 ++++++++++++++++++ static/assets/sep6-deposit-flow-diagram.png | Bin 0 -> 331535 bytes .../assets/sep6-withdrawal-flow-diagram.png | Bin 0 -> 315687 bytes ...6_24_31_status_transition_diagrams.drawio} | 601 ++++++++++- 16 files changed, 1934 insertions(+), 182 deletions(-) create mode 100644 docs/anchoring-assets/anchor-platform/component/observer/observer.mdx create mode 100644 docs/anchoring-assets/anchor-platform/component/rpc/error.mdx create mode 100644 docs/anchoring-assets/anchor-platform/component/rpc/request.mdx create mode 100644 docs/anchoring-assets/anchor-platform/component/rpc/response.mdx create mode 100644 docs/anchoring-assets/anchor-platform/component/rpc/rpc.mdx create mode 100644 docs/anchoring-assets/anchor-platform/component/security/api_key.mdx create mode 100644 docs/anchoring-assets/anchor-platform/component/security/jwt.mdx create mode 100644 docs/anchoring-assets/anchor-platform/component/security/security.mdx create mode 100644 docs/anchoring-assets/anchor-platform/sep6/_category_.json create mode 100644 docs/anchoring-assets/anchor-platform/sep6/configuration.mdx create mode 100644 docs/anchoring-assets/anchor-platform/sep6/index.mdx create mode 100644 docs/anchoring-assets/anchor-platform/sep6/integration.mdx create mode 100644 static/assets/sep6-deposit-flow-diagram.png create mode 100644 static/assets/sep6-withdrawal-flow-diagram.png rename static/definitions/{sep24_31_status_transition_diagrams.drawio => sep6_24_31_status_transition_diagrams.drawio} (56%) diff --git a/docs/anchoring-assets/anchor-platform/component/observer/observer.mdx b/docs/anchoring-assets/anchor-platform/component/observer/observer.mdx new file mode 100644 index 000000000..74d1788fc --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/component/observer/observer.mdx @@ -0,0 +1,36 @@ +Using the Payment Observer allows you to delegate this step to the Anchor Platform. To enable the Payment Observer, use the `--stellar-observer` flag in the command section of the [compose file](#configuration). + +The Payment Observer will track all transactions sent to the distribution account. When the transaction with the expected memo is detected in the network, the status will automatically change to `pending_anchor` and event will be the emitted (if Kafka is used). + +In order to update the transaction's statuses, the observer makes corresponding JSON-RPC requests to the platform. It should use the following URL. + + + +```bash +# dev.env +PLATFORM_API_BASE_URL=http://platform-server:8085 +``` + + + +:::caution + +The Payment Observer won't validate the amounts. It's your responsibility to verify that the amount sent by the user is correct. + +::: + +:::info + +If you already have a system that monitors payments, make sure that the logic of the system matches the description below: + +First, wait for the transaction to be included in the ledger (using an SDK). This transaction must have the expected memo and destination address (distribution account). Once this transaction has been detected and verified, notify the user that the funds have been received using the [notify_onchain_funds_received](#onchain-funds-received) JSON-RPC request. + +::: + +:::tip + +The Fireblocks custody service will automatically track transactions and notify the user that the funds have been received. See the [Fireblocks custody service documentation][fireblocks] for more details. + +::: + +[fireblocks]: /docs/category/fireblocks diff --git a/docs/anchoring-assets/anchor-platform/component/rpc/error.mdx b/docs/anchoring-assets/anchor-platform/component/rpc/error.mdx new file mode 100644 index 000000000..27746e6f0 --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/component/rpc/error.mdx @@ -0,0 +1,16 @@ +
          + +| Error code | Meaning | +| :--------- | :------------------------------------------- | +| -32600 | The JSON sent is not a valid Request object | +| -32601 | The method does not exist / is not available | +| -32602 | Invalid method parameter(s) | +| -32603 | Internal JSON-RPC error | + +
          + +:::tip + +We will also reference a `$transaction_id` variable. This is an identification of transaction that is being returned from the Anchor Platform on an withdrawal or deposit start request. You can obtain the transaction ID by connecting the test wallet to your local Anchor Platform instance. + +::: diff --git a/docs/anchoring-assets/anchor-platform/component/rpc/request.mdx b/docs/anchoring-assets/anchor-platform/component/rpc/request.mdx new file mode 100644 index 000000000..9157143af --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/component/rpc/request.mdx @@ -0,0 +1,29 @@ +The Request object must contain the following attributes: + + + +- ATTRIBUTE + - DATA TYPE + - DESCRIPTION +- jsonrpc + - string + - A String specifying the version of the JSON-RPC protocol. MUST be exactly "2.0" +- method + - string + - A String containing the name of the method to be invoked. List of available methods you can see in [JSON-RPC Methods][json-rpc-methods] +- params + - object + - A Structured value that holds the parameter values, corresponding to method call, to be used during the invocation of the method +- id + - string + - An identifier established by the client. The Server will reply with the same value in the Response object + + + +:::tip + +It's possible to provide multiple updates in a single JSON-RPC request (by placing multiple JSON-RPC request objects). When an update is done in this way, all updates will be done sequentially. + +Most importantly, each JSON-RPC request is not atomic. If one update fails, all previous updates WILL be applied and all subsequent updates WILL be processed and applied as well. + +::: diff --git a/docs/anchoring-assets/anchor-platform/component/rpc/response.mdx b/docs/anchoring-assets/anchor-platform/component/rpc/response.mdx new file mode 100644 index 000000000..02d808103 --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/component/rpc/response.mdx @@ -0,0 +1,33 @@ +The Response is expressed as a single JSON Object, with the following attributes: + + + +- ATTRIBUTE + - DATA TYPE + - DESCRIPTION +- jsonrpc + - string + - A String specifying the version of the JSON-RPC protocol. It's set to "2.0" +- result + - object + - A Structured value that holds the updated transaction details +- id + - string + - An identifier sent by the client +- error + - object + - A Structured value that holds the error details + - id + - string + - Unique id of the transaction for which an error occurred + - code + - number + - A number that indicates the error type that occurred. Please see a list of [error codes](#error-codes) below + - message + - string + - A String providing a short description of the error + - data + - string + - A primitive or structured value that contains additional information about the error + + diff --git a/docs/anchoring-assets/anchor-platform/component/rpc/rpc.mdx b/docs/anchoring-assets/anchor-platform/component/rpc/rpc.mdx new file mode 100644 index 000000000..f00b8ee7f --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/component/rpc/rpc.mdx @@ -0,0 +1,17 @@ +Before making JSON-RPC requests, let's first create a template for making a request to the Anchor Platform. + + + +```bash +# call-json-rpc.sh +#!/usr/bin/env bash + +curl localhost:8085 \ + -X POST \ + -H 'Content-Type: application/json' \ + --data "@$1" +``` + + + +This small script will make a JSON-RPC request to the Anchor Platform hosted on the default port (8085). JSON transaction data stored in the provided file will be used as body (requests must be an array). diff --git a/docs/anchoring-assets/anchor-platform/component/security/api_key.mdx b/docs/anchoring-assets/anchor-platform/component/security/api_key.mdx new file mode 100644 index 000000000..f16c47f7a --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/component/security/api_key.mdx @@ -0,0 +1,14 @@ +To enable API key authentication, modify your `dev.env` file: + + + +```bash +# dev.env +PLATFORM_SERVER_AUTH_TYPE=api_key +# Will be used as API key +SECRET_PLATFORM_API_AUTH_SECRET="your API key that business server will use" +``` + + + +After it's enabled, all requests must contain a valid `X-Api-Key` header, set to the configured API key. diff --git a/docs/anchoring-assets/anchor-platform/component/security/jwt.mdx b/docs/anchoring-assets/anchor-platform/component/security/jwt.mdx new file mode 100644 index 000000000..f16c47f7a --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/component/security/jwt.mdx @@ -0,0 +1,14 @@ +To enable API key authentication, modify your `dev.env` file: + + + +```bash +# dev.env +PLATFORM_SERVER_AUTH_TYPE=api_key +# Will be used as API key +SECRET_PLATFORM_API_AUTH_SECRET="your API key that business server will use" +``` + + + +After it's enabled, all requests must contain a valid `X-Api-Key` header, set to the configured API key. diff --git a/docs/anchoring-assets/anchor-platform/component/security/security.mdx b/docs/anchoring-assets/anchor-platform/component/security/security.mdx new file mode 100644 index 000000000..76a3832c3 --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/component/security/security.mdx @@ -0,0 +1,11 @@ +:::caution + +By default, the Platform API's endpoints such as `GET /transactions` and `GET /transactions/:id` are not protected, and are accessible by anyone who has access to the server, including wallet applications. + +::: + +:::info + +It's recommended to keep Platform server accessible only from the private network. However, you may want to add additional layer of protection via securing the API. + +::: diff --git a/docs/anchoring-assets/anchor-platform/sep24/integration.mdx b/docs/anchoring-assets/anchor-platform/sep24/integration.mdx index 27a089238..f024ee96b 100644 --- a/docs/anchoring-assets/anchor-platform/sep24/integration.mdx +++ b/docs/anchoring-assets/anchor-platform/sep24/integration.mdx @@ -5,6 +5,14 @@ sidebar_position: 30 import { CodeExample } from "@site/src/components/CodeExample"; import { AttributeTable } from "@site/src/components/AttributeTable"; +import Security from "../component/security/security.mdx"; +import UsingApiKey from "../component/security/api_key.mdx"; +import UsingJwt from "../component/security/jwt.mdx"; +import Rpc from "../component/rpc/rpc.mdx"; +import RpcRequest from "../component/rpc/request.mdx"; +import RpcResponse from "../component/rpc/response.mdx"; +import RpcError from "../component/rpc/error.mdx"; +import Observer from "../component/observer/observer.mdx"; One of the main points of interaction with the Anchor Platform is notifying the Anchor Platform about events related to the transaction. @@ -25,157 +33,31 @@ You can find out more about transaction flow and statuses in the [SEP-24 protoco ## Securing Platform API -:::caution - -By default, the Platform API's endpoints such as `GET /transactions` and `GET /transactions/:id` are not protected, and are accessible by anyone who has access to the server, including wallet applications. - -::: - -:::info - -It's recommended to keep Platform server accessible only from the private network. However, you may want to add additional layer of protection via securing the API. - -::: + ### Using API Key -To enable API key authentication, modify your `dev.env` file: - - - -```bash -# dev.env -PLATFORM_SERVER_AUTH_TYPE=api_key -# Will be used as API key -SECRET_PLATFORM_API_AUTH_SECRET="your API key that business server will use" -``` - - - -After it's enabled, all requests must contain a valid `X-Api-Key` header, set to the configured API key. + ### Using JWT -To enable JWT authentication, modify your `dev.env` file: - - - -```bash -# dev.env -PLATFORM_SERVER_AUTH_TYPE=jwt -SECRET_PLATFORM_API_AUTH_SECRET="your encryption key shared with your business server" -``` - - - -After it's enabled, all requests must contain a valid `Authorization` header. The JWT provided must have the `jti` and `exp` fields representing a valid transaction and token expiration time, respectively. + ## Making JSON-RPC Requests -Before making JSON-RPC requests, let's first create a template for making a request to the Anchor Platform. - - - -```bash -# call-json-rpc.sh -#!/usr/bin/env bash - -curl localhost:8085 \ - -X POST \ - -H 'Content-Type: application/json' \ - --data "@$1" -``` - - - -This small script will make a JSON-RPC request to the Anchor Platform hosted on the default port (8085). JSON transaction data stored in the provided file will be used as body (requests must be an array). + ### JSON-RPC Request -The Request object must contain the following attributes: - - - -- ATTRIBUTE - - DATA TYPE - - DESCRIPTION -- jsonrpc - - string - - A String specifying the version of the JSON-RPC protocol. MUST be exactly "2.0" -- method - - string - - A String containing the name of the method to be invoked. List of available methods you can see in [JSON-RPC Methods][json-rpc-methods] -- params - - object - - A Structured value that holds the parameter values, corresponding to method call, to be used during the invocation of the method -- id - - string - - An identifier established by the client. The Server will reply with the same value in the Response object - - - -:::tip - -It's possible to provide multiple updates in a single JSON-RPC request (by placing multiple JSON-RPC request objects). When an update is done in this way, all updates will be done sequentially. - -Most importantly, each JSON-RPC request is atomic. If one update fails, all previous updates WILL be applied and all subsequent updates WILL be processed and applied as well. - -::: + ### JSON-RPC Response -The Response is expressed as a single JSON Object, with the following attributes: - - - -- ATTRIBUTE - - DATA TYPE - - DESCRIPTION -- jsonrpc - - string - - A String specifying the version of the JSON-RPC protocol. It's set to "2.0" -- result - - object - - A Structured value that holds the updated transaction details -- id - - string - - An identifier sent by the client -- error - - object - - A Structured value that holds the error details - - id - - string - - Unique id of the transaction for which an error occurred - - code - - number - - A number that indicates the error type that occurred. Please see a list of [error codes](#error-codes) below - - message - - string - - A String providing a short description of the error - - data - - string - - A primitive or structured value that contains additional information about the error - - + ### Error Codes -
          - -| Error code | Meaning | -| :--------- | :------------------------------------------- | -| -32600 | The JSON sent is not a valid Request object | -| -32601 | The method does not exist / is not available | -| -32602 | Invalid method parameter(s) | -| -32603 | Internal JSON-RPC error | - -
          - -:::tip - -We will also reference a `$transaction_id` variable. This is an identification of transaction that is being returned from the Anchor Platform on an interactive withdrawal or deposit start request. You can obtain the transaction ID by connecting the test wallet to your local Anchor Platform instance. - -::: + ## Updating Deposit Transaction Via JSON-RPC @@ -559,7 +441,7 @@ Depending on the `success` flag, the status of the transaction will be changed t ::: -### Refund Sent +### Sending Refund Via Custody Service There is a possibility to send funds back to the user (refund). You can refund the whole sum(full refund) or do a set of partial refunds. Also, if user sent more money than expected, you can refund a part of the sum back to the user and send the rest as onchain funds. @@ -1020,7 +902,7 @@ To execute this, you need to run: The refund logic works in the same way as for the deposit flow. For more details, see [Refund Sent](#refund-sent) of the deposit flow. -### Do Stellar Refund +### Sending Refund Via Custody Service Integration with a custody service allows you to do a refund via a custody service, such as Fireblocks. @@ -1083,51 +965,8 @@ Works in the same manner as for the deposit flow. For more details, see [Transac ## Tracking Stellar Transactions -Using the Payment Observer allows you to delegate this step to the Anchor Platform. To enable the Payment Observer, use the `--stellar-observer` flag in the command section of the [compose file](#configuration). - -The Payment Observer will track all transactions sent to the distribution account. When the transaction with the expected memo is detected in the network, the status will automatically change to `pending_anchor` and event will be the emitted (if Kafka is used). - -In order to update the transaction's statuses, the observer makes corresponding JSON-RPC requests to the platform. It should use the following URL. - - - -```bash -# dev.env -PLATFORM_API_BASE_URL=http://platform-server:8085 -``` - - - -:::caution - -The Payment Observer won't validate the amounts. It's your responsibility to verify that the amount sent by the user is correct. - -::: - -:::info - -If you already have a system that monitors payments, make sure that the logic of the system matches the description below: - -First, wait for the transaction to be included in the ledger (using an SDK). This transaction must have the expected memo and destination address (distribution account). Once this transaction has been detected and verified, notify the user that the funds have been received using the [notify_onchain_funds_received](#onchain-funds-received) JSON-RPC request. + -[sep-1]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0001.md [sep-9]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0009.md [sep-24]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0024.md -[sep-38]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0038.md -[sep24-get-info]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0024.md#info -[anchor-platform-image]: https://hub.docker.com/r/stellar/anchor-platform -[docker-compose]: https://docs.docker.com/compose/ -[minikube]: https://minikube.sigs.k8s.io/docs/ -[kubernetes]: https://kubernetes.io/ -[nginx]: https://www.nginx.com/ -[ap-default-values]: https://github.com/stellar/java-stellar-anchor-sdk/blob/develop/platform/src/main/resources/config/anchor-config-default-values.yaml -[stellar-demo-wallet]: https://demo-wallet.stellar.org -[stellar-lab]: https://laboratory.stellar.org/ -[postgresql]: https://www.postgresql.org/ -[aurora-postgresql]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html -[h2]: https://www.h2database.com/html/main.html -[sqlite]: https://www.sqlite.org/index.html -[flyway]: https://documentation.red-gate.com/fd/welcome-to-flyway-184127914.html -[sep-24-ref-ui]: https://github.com/stellar/sep24-reference-ui -[sep-24-ref]: https://github.com/stellar/java-stellar-anchor-sdk/tree/develop/kotlin-reference-server [json-rpc-methods]: /api/anchor-platform/rpc/methods diff --git a/docs/anchoring-assets/anchor-platform/sep6/_category_.json b/docs/anchoring-assets/anchor-platform/sep6/_category_.json new file mode 100644 index 000000000..da6dc71ce --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/sep6/_category_.json @@ -0,0 +1,7 @@ +{ + "position": 65, + "label": "Programmatic Deposits and Withdrawals", + "link": { + "type": "generated-index" + } +} \ No newline at end of file diff --git a/docs/anchoring-assets/anchor-platform/sep6/configuration.mdx b/docs/anchoring-assets/anchor-platform/sep6/configuration.mdx new file mode 100644 index 000000000..fabcfb5c7 --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/sep6/configuration.mdx @@ -0,0 +1,126 @@ +--- +title: "Configuration" +sidebar_position: 20 +--- + +import { CodeExample } from "@site/src/components/CodeExample"; + +## Modify a Stellar Info File + +Next, let's modify the `stellar.toml` file created [earlier][sep1-ap]. Wallets need to know that SEP-6 functionality is supported by your business, and they also need to know all the currencies you support. + + + +```toml +# dev.stellar.toml +ACCOUNTS = ["add your public keys for your distribution accounts here"] +SIGNING_KEY = "add your signing key here" +NETWORK_PASSPHRASE = "Test SDF Network ; September 2015" + +TRANSFER_SERVER = "http://localhost:8080/sep6" +WEB_AUTH_ENDPOINT = "http://localhost:8080/auth" + +# Add support for USDC +[[CURRENCIES]] +code = "USDC" +issuer = "GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5" +status = "test" +is_asset_anchored = false +desc = "USD Coin issued by Circle" + +[DOCUMENTATION] +ORG_NAME = "Your organization" +ORG_URL = "Your website" +ORG_DESCRIPTION = "A description of your organization" +``` + + + +Note that you will need to create another file for your production deployment that uses the public network's passphrase, your production service URLs, your Mainnet distribution accounts and signing key, as well as the Mainnet issuing accounts of the assets your service utilizes. + +## Enable Programmatic Deposits & Withdrawals + +Now you're ready to enable programmatic deposits and withdrawals using the SEP-6 API. Specify the following in your `dev.assets.yaml` file, and change the values depending on your use case. This example asset file enables support for Circle's USDC and a fiat USD to deposit from and withdraw to. The methods specified in the `deposit` and `withdraw` sections are the methods that will be exposed by the [`GET /info`][sep-6] SEP-6 endpoint under the `type` field in the case of `deposit` and `types` field in the case of `withdraw`. + + + +```yaml +assets: + - schema: stellar + code: USDC + issuer: GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5 + distribution_account: GBLSAHONJRODSFTLOV225NZR4LHICH63RIFQTQN37L5CRTR2IMQ5UEK7 + significant_decimals: 2 + sep6_enabled: true + deposit: + enabled: true + methods: + - SEPA + - SWIFT + - cash + withdraw: + enabled: true + methods: + - bank_account + - cash + - schema: iso4217 + code: USD + significant_decimals: 2 +``` + + + +The information provided for the `assets` value closely maps to the information that will be exposed to the wallet application using the [`GET /info`][sep-6] SEP-6 endpoint. The Anchor Platform also uses this information to validate requests made to your service. + +## Test With the Demo Wallet + +Wallets should now be able to discover, authenticate, and initiate transactions with your service! Your project and source files should now look something like this. + + + +``` +├── dev.env +├── docker-compose.yaml +├── config +│ ├── dev.assets.yaml +│ ├── dev.stellar.toml +``` + + + +Your environment should now look like the following. + + + +```bash +# dev.env +ASSETS_TYPE=file +ASSETS_VALUE=/home/dev.assets.yaml + +SEP1_ENABLED=true +SEP1_TOML_TYPE=file +SEP1_TOML_VALUE=/home/dev.stellar.toml + +SEP10_ENABLED=true +SEP10_HOME_DOMAIN=localhost:8080 +SECRET_SEP10_SIGNING_SEED="a Stellar private key" +SECRET_SEP10_JWT_SECRET="a secret encryption key" +``` + + + +To test this out, go to the [Stellar Demo Wallet][stellar-demo-wallet]. + +Initiate a deposit transaction by doing the following: + +- Create a new keypair +- Click the "Add Asset" button and enter + - the code of the Stellar asset on your `stellar.toml` file + - your home domain, `localhost:8080` +- Select the dropdown and click "SEP-6 Deposit", then click "Start" + +The demo wallet should be able to find your `stellar.toml` file, authenticate using the Stellar keypair you just created, and initiate a transaction. + +[sep-6]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0006.md +[sep1-ap]: /docs/category/stellar-info-file +[stellar-demo-wallet]: https://demo-wallet.stellar.org/ diff --git a/docs/anchoring-assets/anchor-platform/sep6/index.mdx b/docs/anchoring-assets/anchor-platform/sep6/index.mdx new file mode 100644 index 000000000..ac8c10409 --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/sep6/index.mdx @@ -0,0 +1,33 @@ +--- +title: "Getting Started" +sidebar_position: 10 +--- + +This guide will walk you through configuring and integration with the Anchor Platform for the purpose of build an on & off-ramp service compatible with [SEP-6][sep-6], the ecosystem's standardized protocol for programmatic deposit and withdrawals. + +By leveraging the Anchor Platform's support for SEP-6, businesses make their own on & off-ramp service available as an in-app experience through Stellar-based applications such as wallets and exchanges, extending their reach and connecting with users through the applications they already use. + +Before continuing with this section, make sure that you have already [installed][installation-ap] the Anchor Platform, and configured necessary features, required by SEP-6: [SEP-1 (Stellar Info File)][sep1-ap] and [SEP-10 (Stellar Authentication)][sep10-ap]. + +## The Basic User Experience + +The complete customer experience for a deposit or withdrawal using SEP-6 is as follows: + +1. The customer opens the SEP-6 wallet application of their choice +2. The customer selects an asset to deposit and the wallet finds an anchor (clients could also choose the specific anchor) +3. Once the wallet authenticates with the anchor, the customer begins entering their KYC and transaction information requested by the anchor +4. The wallet provides instructions, and the customer deposits real fiat currency with the anchor (such as bank transfer) +5. Once the wallet receives the deposit, the customer receives the tokenized asset on the Stellar network from the anchor's distribution account + +The customer can then use the digital asset on the Stellar network for remittance, payments, trading, store of value, or another use case not listed here. At some later date, the customer could decide to withdraw their assets from the Stellar network, which would look something like this: + +1. The customer opens their wallet application +2. The customer selects the asset for withdrawal and wallet finds the anchor +3. After authenticating with the anchor, the customer can enter their transaction information and any additional KYC information that wasn't already collected +4. After asking for customer approval, the wallet sends the specified amount of the customer's asset balance to the anchor's distribution account on Stellar +5. Once the anchor receives the payment, the customer receives the withdrawn funds via any method supported by the anchor (such as bank transfer) + +[sep-6]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0006.md +[installation-ap]: /docs/anchoring-assets/anchor-platform/getting_started +[sep1-ap]: /docs/category/stellar-info-file +[sep10-ap]: /docs/category/stellar-authentication diff --git a/docs/anchoring-assets/anchor-platform/sep6/integration.mdx b/docs/anchoring-assets/anchor-platform/sep6/integration.mdx new file mode 100644 index 000000000..5ee5e5331 --- /dev/null +++ b/docs/anchoring-assets/anchor-platform/sep6/integration.mdx @@ -0,0 +1,982 @@ +--- +title: "Integration" +sidebar_position: 30 +--- + +import { CodeExample } from "@site/src/components/CodeExample"; +import { AttributeTable } from "@site/src/components/AttributeTable"; +import Security from "../component/security/security.mdx"; +import UsingApiKey from "../component/security/api_key.mdx"; +import UsingJwt from "../component/security/jwt.mdx"; +import Rpc from "../component/rpc/rpc.mdx"; +import RpcRequest from "../component/rpc/request.mdx"; +import RpcResponse from "../component/rpc/response.mdx"; +import RpcError from "../component/rpc/error.mdx"; +import Observer from "../component/observer/observer.mdx"; + +One of the main points of interaction with the Anchor Platform is notifying the Platform about events related to transactions. + +In general, you will want to provide updates for the following events. + +- Your business requires the user to submit KYC information to process a transaction +- Your business updated the in/out/fee amounts for a transaction +- Your business is ready to receive funds from the user +- Your business has received funds from the user +- Your business has sent funds to the user +- Your business has a processed a refund for the user's transaction +- Your business experienced an unexpected error + +This is done by making JSON-RPC requests to the Platform API's endpoint. JSON-RPC requests allow you to update the status of the transaction. To move the transaction to a specific status, it's necessary to make a corresponding JSON-RPC request and pass data that is required by the RPC method. + +The Anchor Platform JSON-RPC API is designed to notify the platform about changes in the status of the transaction. Given that, the API will be called every time a user or the anchor takes any action that progresses the transaction status in the flow. + +You can find out more about transaction flow and statuses in the [SEP-6 protocol document][sep-6]. + +[sep-6]: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0006.md + +## Securing Platform API + + + +### Using API Key + + + +### Using JWT + + + +## Making JSON-RPC Requests + + + +### JSON-RPC Request + + + +### JSON-RPC Response + + + +### Error Codes + + + +## Updating Deposit (Exchange) Transaction Via JSON-RPC + +SEP-6 deposit flow diagram defines sequences/rules of the transaction's status transition and a set of JSON-RPC method that should be called to change that status. You can't define the status you want to set for a specific transaction in your requests. Each JSON-RPC method defines data structures that it expects in request. If request doesn't contain a required attributes, the Anchor Platform will return and error and won't change status of the transaction. + +The deposit exchange flow is the same as the deposit flow, except the amounts will not need to be recalculated when requesting offchain funds, if the user has provided a firm quote from the anchor. + +[![sep6 deposit flow](/assets/sep6-deposit-flow-diagram.png)](/assets/sep6-deposit-flow-diagram.png) + +:::tip + +Statuses in green are mandatory and define the shortest way. + +Statuses in yellow are optional and can be skipped. + +Statuses in red mean the transaction is in an error status or it has expired. + +::: + +### Verifying KYC Information + +Although Anchor Platform does not require a customer to have their KYC information collected before initiating a deposit, your business may want to collect this information before the customer makes a transfer. By listening to transaction created events, or by polling the [`GET /transactions`][get-transactions] endpoint, you can determine if the transaction requires KYC information to be collected. The required SEP-9 fields can be communicated to the user by making a `request_customer_info_update` JSON-RPC request and providing the required field names. + + + +```json +// reuest-customer-info-update.json +[ + { + "id": "1", + "jsonrpc": "2.0", + "method": "request_customer_info_update", + "params": { + "id": "", + "message": "Please update your information to continue", + "required_customer_info_message": "A government issued ID is required for deposits over $1000.", + "required_customer_info_updates": [ + "id_type", + "id_country_code", + "id_issue_date", + "id_expiration_date", + "id_number" + ] + } + } +] +``` + + + +- `required_customer_info_message` is an optional message explaining why the user needs to update their information. +- `required_customer_info_updates` is an array of SEP-9 fields that the user must update. + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh request-customer-info-update.json +``` + + + +### Ready to Receive Funds + +After the user has submitted their KYC information, the anchor can notify the Platform that they are ready to receive funds. The anchor should use the `request_offchain_funds` RPC to provide the final amounts to the user. To do so, make the following JSON-RPC request. + + + +```json +// request-offchain-funds.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "request_offchain_funds", + "params": { + "transaction_id": "", + "message": "Request offchain funds", + "amount_in": { + "amount": 10, + "asset": "iso4217:USD" + }, + "amount_out": { + "amount": 9, + "asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5" + }, + "amount_fee": { + "amount": 1, + "asset": "iso4217:USD" + }, + "amount_expected": { + "amount": 10 + }, + "instructions": { + "organization.bank_number": { + "value": "123456789", + "description": "US Bank routing number" + }, + "organization.bank_account_number": { + "value": "123456789", + "description": "US Bank account number" + } + } + } + } +] +``` + + + +- `amount_in` is the amount the user has to send to the business. +- `amount_out` is the amount the user will receive. +- `amount_fee` is the total amount of fees collected by the business. +- `asset` is part of the `amount_x` field and is in a SEP-38 format. In this example, it's set to USD, assuming the user made a bank transfer to the system using USD. +- `instructions` is the set of SEP-9 standard fields that user should use to send funds to the business. In this example, the user should send funds to the bank account with the routing number `123456789` and account number `123456789`. + +Information about amounts (in/out/fee) is required if you want to move the transaction to the `pending_user_transfer_start` status. + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh request-offchain-funds.json +``` + + + +:::caution + +For exchange deposits with a firm quote (the request is associated with a `quote_id`), no amounts should not be provided. + +::: + +### Funds Received + +If offchain funds were received, you'll want to provide updated transaction information. + + + +```json +// offchain-funds-received.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_offchain_funds_received", + "params": { + "transaction_id": "", + "message": "Offchain funds received", + "funds_received_at": "2023-07-04T12:34:56Z", + "external_transaction_id": "7...9", + "amount_in": { + "amount": 10 + }, + "amount_out": { + "amount": 9 + }, + "amount_fee": { + "amount": 1 + }, + "amount_expected": { + "amount": 10 + } + } + } +] +``` + + + +- `funds_received_at` is the date and time of receiving funds. +- `external_transaction_id` is the ID of transaction on external network. + +The amount fields are optional. If skipped, the values prior to this request will be used. + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh offchain-funds-received.json +``` + + + +### Waiting For User Funds + +In the real world, the transfer confirmation process may take time. In such cases, transactions should be set to a new status indicating that the confirmation of the transfer has been received but the funds themselves have not been received yet. + + + +```json +// offchain-funds-sent.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_offchain_funds_sent", + "params": { + "transaction_id": "", + "message": "Offchain funds sent", + "funds_received_at": "2023-07-04T12:34:56Z", + "external_transaction_id": "7...9" + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh offchain-funds-sent.json +``` + + + +### Sending Onchain Funds + +Next, send a transaction on the Stellar network to fulfill the user deposit. After the Stellar transaction has been submitted, it's necessary to send the `notify_onchain_funds_sent` JSON-RPC request to notify a user that the funds were successfully sent. + + + +```json +// onchain-funds-sent.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_onchain_funds_sent", + "params": { + "transaction_id": "", + "message": "Onchain funds sent", + "stellar_transaction_id": "7...9" + } + } +] +``` + + + +- `stellar_transaction_id` is the transaction id on Stellar network of the transfer. + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh onchain-funds-sent.json +``` + + + +After this JSON-RPC request, the transaction will be transferred to the `completed` status. + +### Sending Payment Via Custody Service + +The Anchor Platform provides a possibility to send a payment via custody services, such as [Fireblocks][fireblocks]. To make a payment via a custody service, make the following JSON-RPC request. + + + +```json +// do-stellar-payment.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "do_stellar_payment", + "params": { + "transaction_id": "", + "message": "Custody payment started" + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh do-stellar-payment.json +``` + + + +After successful processing of the payment on a custody service, the Anchor Platform will automatically make the `notify_onchain_funds_sent` JSON-RPC request and the status of the transaction will be changed to `completed`. + +:::caution + +A user account may not be ready to receive funds. You can check that the account has established a [trustline](/docs/glossary#trustline). Otherwise, you can set the status of the transaction to the `pending_trust` to indicate that the anchor is waiting for the user to establish the trustline. + +If custody integration is enabled, the Anchor Platform will do this validation for you automatically. + +::: + +### Pending Trust + +This status has to be set if a payment requires an asset trustline that wasn't configured by the user. There are two ways of how the transaction may be moved to the `pending_trust` status. The first one is processing of a payment via custody service in case it detected that the trustline isn't configured. The second one is when the business itself detects that the trustline is missing and wants to notify the user that it has to be configured. To move the transaction to the `pending_trust` status, make the following JSON-RPC request. + + + +```json +// request-trust.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "request_trust", + "params": { + "transaction_id": "", + "message": "Asset trustine not configured" + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh request-trust.json +``` + + + +:::info + +Payment via custody service periodically checks if the trustline was configured. If it was, it will automatically send a payment to a custody service and change the status of the transaction to `pending_stellar`. + +::: + +### Trust Set + +This status has to be set if the business has detected that the trustline was or wasn't configured by user. + + + +```json +// trust-set.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_trust_set", + "params": { + "transaction_id": "", + "message": "Asset trustine set", + "success": "true" + } + } +] +``` + + + +- `success` flag which defines if trustline was or wasn't configured by user + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh trust-set.json +``` + + + +:::info + +Depending on the `success` flag, the status of the transaction will be changed to `pending_stellar` if the trustline was set, or to `pending_anchor` if it wasn't. + +::: + +### Refund Sent + +Sometimes, funds need to be sent back to the user (refund). You can refund the whole sum (full refund) or do a set of partial refunds back to the `source_account` using the `refund_memo` and `refund_memo_type` associated with the transaction if present. Also, if user sent more money than expected, you can refund a part of the sum back to the user and send the rest as onchain funds. + + + +```json +// refund-sent.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_refund_sent", + "params": { + "transaction_id": "", + "message": "Refund sent", + "refund": { + "id": "1c186184-09ee-486c-82a6-aa7a0ab1119c", + "amount": { + "amount": 10, + "asset": "iso4217:USD" + }, + "amount_fee": { + "amount": 1, + "asset": "iso4217:USD" + } + } + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh refund-sent.json +``` + + + +:::info + +If a sum of refunds is less than `amount_in`, the status of the transaction will be set to `pending_anchor`. Only if the sum of refunds is equal to `amount_in`, the status of the transaction will be set to `refunded`. + +::: + +### Refund Pending + +This is similar to [Refund Sent](#refund-sent), but it handles the case when a refund has been submitted to external network but is not yet confirmed. The status of the transaction is set to `pending_external`. This is the status that will be set when waiting for Bitcoin or other external crypto network to complete a transaction, or when waiting for a bank transfer. + +### Transaction Error + +If you encounter an unrecoverable error when processing the transaction, it's required to set the transaction status to `error`. You can use the message field to describe the error details. + + + +```json +// transaction-error.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_transaction_error", + "params": { + "transaction_id": "", + "message": "Error occurred" + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh transaction-error.json +``` + + + +:::tip + +If a user has made a transfer, you should do a transaction recovery, and then you can retry processing the transaction or initiate a refund. + +::: + +### Expired Transaction + +Your business may want to expire transactions that have been abandoned by the user after some time. It's good practice to clean up inactive transactions in the `incomplete` status. To do so, make the following JSON-RPC request to expire a transaction. + + + +```json +// transaction-expired.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_transaction_expired", + "params": { + "transaction_id": "", + "message": "Transaction expired" + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh transaction-expired.json +``` + + + +:::tip + +This JSON-RPC method can't be used after the user has made a transfer. + +::: + +### Transaction Recovery + +Transaction status can be changed from `error/expired` to `pending_anchor`. After recovery, you can refund the received assets or proceed with processing of the transaction. To recover a transaction, make the following JSON-RPC request. + + + +```json +// transaction-recovery.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_transaction_recovery", + "params": { + "transaction_id": "", + "message": "Transaction recovered" + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh transaction-recovery.json +``` + + + +## Updating Withdrawal (Exchange) Transaction Via JSON-RPC + +The SEP-6 withdrawal flow diagram defines the sequence/rules of the transaction's status transition. You can't define the status you want to set for a specific transaction in your requests. Each JSON-RPC method defines data structures that it expects in request. If request doesn't contain a required attributes, the Anchor Platform will return and error and won't change status of the transaction. + +The withdrawal exchange flow is the same as the withdrawal flow, except the amounts will not need to be recalculated when requesting onchain funds, if the user has provided a firm quote from the anchor. + +[![sep6 withdrawal flow](/assets/sep6-withdrawal-flow-diagram.png)](/assets/sep6-withdrawal-flow-diagram.png) + +:::tip + +Statuses in green are mandatory and define the shortest way. + +Statuses in yellow are optional and can be skipped. + +Statuses in red mean the transaction is in an error status or it has expired. + +::: + +Once the withdrawal flow is finished, implementing the withdrawal is straightforward. Some parts of the flow are similar and can be reused. + +The starting point both for withdrawal and for deposit is the same. + +### Ready to Receive Funds + +Similarly to deposit, the step after KYC has been collected is to notify the user that the anchor is ready to receive funds. However, as your service will be receiving transactions over the Stellar network, the RPC request will be different. The anchor should use the `request_onchain_funds` RPC to provide the final amounts to the user. To do so, make the following JSON-RPC request. + + + +```json +// request-onchain-funds.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "request_onchain_funds", + "params": { + "transaction_id": "", + "message": "Request onchain funds", + "amount_in": { + "amount": 10, + "asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5" + }, + "amount_out": { + "amount": 9, + "asset": "iso4217:USD" + }, + "amount_fee": { + "amount": 1, + "asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5" + }, + "amount_expected": { + "amount": 10 + }, + "destination_account": "GD...G", + "memo": "12345", + "memo_type": "id" + } + } +] +``` + + + +- `amount_in` is the amount the user has to send to the business. +- `amount_out` is the amount the user will receive. +- `amount_fee` is the total amount of fees collected by the business. +- `asset` is part of the `amount_x` field and is in a SEP-38 format. In this example, it's set to USD, assuming the user made a bank transfer to the system using USD. +- `memo` is the memo the user should use when sending their onchain funds to the anchor. +- `memo_type` is the memo type the user should use when sending their onchain funds to the anchor. +- `destination_account` is the account the user should send the funds to. + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh request-onchain-funds.json +``` + + + +:::caution + +For exchange withdrawals with a firm quote (the request is associated with a `quote_id`), no amounts should not be provided. + +::: + +:::tip + +Setting `memo`, `memo_type`, and `destination_account` is optional. + +If integration with a third-party custodian is enabled, the Anchor Platform can generate `memo`, `memo_type`, and `destination_address` if a corresponding `deposit_info_generator_type` is chosen. Also, you can provide `memo` and `memo_type` to the request as shown above. Note that the memo must be unique, this is what helps to associate Stellar transactions with SEP transactions. + +If your business manages the assets, the Anchor Platform can generate memos for you. When the status is changed to `pending_user_transfer_start`, the Anchor Platform sets the `memo` and `memo_type` automatically (only if it's not included in the request). + +::: + +:::note + +The Stellar account that will be used to receive funds should be configured. + +::: + +### Funds Received + +If onchain funds were received, you need to provide amounts and change the status of the transaction to `pending_anchor`. + + + +```json +// onchain-funds-received.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_onchain_funds_received", + "params": { + "transaction_id": "", + "message": "Onchain funds received", + "stellar_transaction_id": "7...9", + "amount_in": { + "amount": 10 + }, + "amount_out": { + "amount": 9 + }, + "amount_fee": { + "amount": 1 + } + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh onchain-funds-received.json +``` + + + +:::tip + +This method will be called automatically by the custody server if the custody integration is enabled. + +::: + +### Amount Updated + +If onchain funds were received, but for some reason the `amount_in` differs from specified in the interactive flow (`amount_expected`), you can update `amount_out` and `amount_fee` to make them correspond to the actual `amount_in`. The status of the transaction in this case won't be changed and will be equal to `pending_anchor`. + + + +```json +// amounts-updated.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_amounts_updated", + "params": { + "transaction_id": "", + "message": "Amounts updated", + "amount_out": { + "amount": 9 + }, + "amount_fee": { + "amount": 1 + } + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh amounts-updated.json +``` + + + +:::note + +Only `amount_out` and `amount_fee` can be updated using this JSON-RPC request, and you don't need to specify the assets of the amounts. + +::: + +### Offchain Funds Available + +You can move transaction status to `pending_user_transfer_complete` if offchain funds were sent, and if it's ready for the user / recipient to pick it up. + + + +```json +// offchain-funds-available.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_offchain_funds_available", + "params": { + "transaction_id": "", + "message": "Offchain funds available", + "external_transaction_id": "a...c" + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh offchain-funds-available.json +``` + + + +### Offchain Funds Pending + +Another option is to move the transaction's status to `pending_external`. This status means that the payment has been submitted to an external network, but is not yet confirmed. + + + +```json +// offchain-funds-pending.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_offchain_funds_pending", + "params": { + "transaction_id": "", + "message": "Offchain funds pending", + "external_transaction_id": "a...c" + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh offchain-funds-pending.json +``` + + + +### Offchain Funds Sent + +To complete the transaction and change its status to `completed`, you need to make the `notify_offchain_funds_sent` JSON-RPC request. + + + +```json +// offchain-funds-sent.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "notify_offchain_funds_sent", + "params": { + "transaction_id": "", + "message": "Offchain funds sent", + "funds_sent_at": "2023-07-04T12:34:56Z", + "external_transaction_id": "a...c" + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh offchain-funds-sent.json +``` + + + +### Refund Sent + +The refund logic works in the same way as for the deposit flow. For more details, see [Refund Sent](#refund-sent) of the deposit flow. + +### Sending Refund Via Custody Service + +Integration with a custody service allows you to do a refund via a custody service, such as Fireblocks. + + + +```json +// do-stellar-refund.json +[ + { + "id": 1, + "jsonrpc": "2.0", + "method": "do_stellar_refund", + "params": { + "transaction_id": "", + "message": "Do stellar refund", + "refund": { + "amount": { + "amount": 9, + "asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5" + }, + "amount_fee": { + "amount": 1, + "asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5" + } + } + } + } +] +``` + + + +To execute this, you need to run: + + + +```bash +./call-json-rpc.sh do-stellar-refund.json +``` + + + +:::note + +Similarly to the deposit flow, you can make a full refund or a set of partial refunds. The transaction will stay in `pending_anchor` status until the sum of refunds is less than `amount_in`. If the sum of refunds is equal to `amount_in`, the Anchor Platform will automatically change the status of the transaction to `refunded`. + +::: + +### Transaction Error + +Works in the same manner as for the deposit flow. For more details, see [Transaction Error](#transaction-error) of the deposit flow. + +### Expired Transaction + +Works in the same manner as for the deposit flow. For more details, see [Expired Transaction](#expired-transaction) of the deposit flow. + +### Transaction Recovery + +Works in the same manner as for the deposit flow. For more details, see [Transaction Recovery](#transaction-recovery) of the deposit flow. + +## Tracking Stellar Transactions + + + +[get-transactions]: /api/anchor-platform/resources/get-transactions diff --git a/static/assets/sep6-deposit-flow-diagram.png b/static/assets/sep6-deposit-flow-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..75d4d271ac8a2d35fb08e847e57b9e0b972d997e GIT binary patch literal 331535 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%0D{U9UDYV(4)nFZqOz-UWkX3c_K~= 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
        • lDAR{LJt!46Hldlur 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 literal 0 HcmV?d00001 diff --git a/static/assets/sep6-withdrawal-flow-diagram.png b/static/assets/sep6-withdrawal-flow-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..0bf199f47c7311fac66fdfd7b6afeda9d341aabf GIT binary patch literal 315687 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 z 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ξ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 a3EJV60AF9x5!_$_Kl(bx+WDFeq5lSbc5fE| literal 0 HcmV?d00001 diff --git a/static/definitions/sep24_31_status_transition_diagrams.drawio b/static/definitions/sep6_24_31_status_transition_diagrams.drawio similarity index 56% rename from static/definitions/sep24_31_status_transition_diagrams.drawio rename to static/definitions/sep6_24_31_status_transition_diagrams.drawio index c1e830383..61dbea4f8 100644 --- a/static/definitions/sep24_31_status_transition_diagrams.drawio +++ b/static/definitions/sep6_24_31_status_transition_diagrams.drawio @@ -1,6 +1,6 @@ - + - + @@ -338,7 +338,7 @@ - + @@ -791,4 +791,599 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +