From b62ff73603ed6264171709e25f29aaf43f84b0e9 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Fri, 16 Aug 2024 11:01:05 +0200 Subject: [PATCH 01/91] Updated docs structure --- packages/documentation/astro.config.mjs | 164 +- .../content/docs/apis/graphql/auth/enums.md | 96 + .../docs/apis/graphql/auth/inputobjects.md | 147 + .../docs/apis/graphql/auth/interfaces.md | 41 + .../docs/apis/graphql/auth/mutations.md | 29 + .../content/docs/apis/graphql/auth/objects.md | 362 +++ .../content/docs/apis/graphql/auth/queries.md | 97 + .../content/docs/apis/graphql/auth/scalars.md | 30 + .../docs/apis/graphql/backend/enums.md | 348 +++ .../docs/apis/graphql/backend/inputobjects.md | 1776 +++++++++++ .../docs/apis/graphql/backend/interfaces.md | 112 + .../docs/apis/graphql/backend/mutations.md | 723 +++++ .../docs/apis/graphql/backend/objects.md | 2698 +++++++++++++++++ .../docs/apis/graphql/backend/queries.md | 512 ++++ .../docs/apis/graphql/backend/scalars.md | 38 + .../idempotency.mdx} | 0 .../src/content/docs/apis/openapis.mdx | 5 + .../accounts-transfers-liquidity.mdx | 1514 +++++++++ .../content/docs/components/architecture.mdx | 18 + .../peering.md => components/interledger.mdx} | 87 +- .../open-payments.mdx} | 62 +- .../src/content/docs/components/telemetry.mdx | 227 ++ .../accounting/accounts-and-transfers.md | 1027 ------- .../docs/concepts/accounting/liquidity.md | 316 -- .../docs/concepts/accounting/tigerbeetle.md | 31 - .../src/content/docs/concepts/asset.md | 31 - .../interledger-protocol/connector.md | 52 - .../concepts/interledger-protocol/overview.md | 5 - .../open-payments/grant-interaction.mdx | 29 - .../docs/concepts/open-payments/overview.md | 9 - .../documentation/src/content/docs/index.mdx | 2 +- .../{webhook-events.mdx => admin-apis.mdx} | 52 +- ...deployment.md => deploy-to-production.mdx} | 2 +- .../{getting-started.md => get-started.mdx} | 2 +- .../docs/integration/integrator-checklist.mdx | 5 + .../content/docs/integration/management.md | 15 - .../account-servicing-entities.mdx} | 2 +- .../overview.mdx} | 0 .../content/docs/introduction/architecture.md | 49 - .../{autopeering.md => autopeering.mdx} | 0 .../playground/{overview.md => overview.mdx} | 0 .../src/content/docs/playground/testnet.mdx | 5 + .../content/docs/reference/get-involved.md | 26 - .../reference/{glossary.md => glossary.mdx} | 0 .../auth-service.mdx | 7 + .../backend-service.mdx | 20 + .../frontend-service.mdx | 7 + .../token-introspection.mdx | 7 + .../src/content/docs/telemetry/integrating.md | 92 - .../src/content/docs/telemetry/overview.md | 80 - .../src/content/docs/telemetry/privacy.md | 57 - 51 files changed, 9061 insertions(+), 1955 deletions(-) create mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/enums.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/mutations.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/objects.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/queries.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/scalars.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/enums.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/mutations.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/objects.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/queries.md create mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/scalars.md rename packages/documentation/src/content/docs/apis/{idempotency.md => graphql/idempotency.mdx} (100%) create mode 100644 packages/documentation/src/content/docs/apis/openapis.mdx create mode 100644 packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx create mode 100644 packages/documentation/src/content/docs/components/architecture.mdx rename packages/documentation/src/content/docs/{concepts/interledger-protocol/peering.md => components/interledger.mdx} (71%) rename packages/documentation/src/content/docs/{concepts/open-payments/key-registry.md => components/open-payments.mdx} (51%) create mode 100644 packages/documentation/src/content/docs/components/telemetry.mdx delete mode 100644 packages/documentation/src/content/docs/concepts/accounting/accounts-and-transfers.md delete mode 100644 packages/documentation/src/content/docs/concepts/accounting/liquidity.md delete mode 100644 packages/documentation/src/content/docs/concepts/accounting/tigerbeetle.md delete mode 100644 packages/documentation/src/content/docs/concepts/asset.md delete mode 100644 packages/documentation/src/content/docs/concepts/interledger-protocol/connector.md delete mode 100644 packages/documentation/src/content/docs/concepts/interledger-protocol/overview.md delete mode 100644 packages/documentation/src/content/docs/concepts/open-payments/grant-interaction.mdx delete mode 100644 packages/documentation/src/content/docs/concepts/open-payments/overview.md rename packages/documentation/src/content/docs/integration/{webhook-events.mdx => admin-apis.mdx} (91%) rename packages/documentation/src/content/docs/integration/{deployment.md => deploy-to-production.mdx} (99%) rename packages/documentation/src/content/docs/integration/{getting-started.md => get-started.mdx} (99%) create mode 100644 packages/documentation/src/content/docs/integration/integrator-checklist.mdx delete mode 100644 packages/documentation/src/content/docs/integration/management.md rename packages/documentation/src/content/docs/{concepts/account-servicing-entity.md => intro-to-rafiki/account-servicing-entities.mdx} (96%) rename packages/documentation/src/content/docs/{introduction/overview.md => intro-to-rafiki/overview.mdx} (100%) delete mode 100644 packages/documentation/src/content/docs/introduction/architecture.md rename packages/documentation/src/content/docs/playground/{autopeering.md => autopeering.mdx} (100%) rename packages/documentation/src/content/docs/playground/{overview.md => overview.mdx} (100%) create mode 100644 packages/documentation/src/content/docs/playground/testnet.mdx delete mode 100644 packages/documentation/src/content/docs/reference/get-involved.md rename packages/documentation/src/content/docs/reference/{glossary.md => glossary.mdx} (100%) create mode 100644 packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx create mode 100644 packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx create mode 100644 packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx create mode 100644 packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx delete mode 100644 packages/documentation/src/content/docs/telemetry/integrating.md delete mode 100644 packages/documentation/src/content/docs/telemetry/overview.md delete mode 100644 packages/documentation/src/content/docs/telemetry/privacy.md diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index 786693173d..5815a77680 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -54,105 +54,86 @@ export default defineConfig({ label: 'Docs', items: [ { - label: 'Introduction', + label: 'Intro to Rafiki', collapsed: true, items: [ { label: 'Overview', - link: 'introduction/overview' + link: 'intro-to-rafiki/overview' }, { - label: 'Architecture', - link: 'introduction/architecture' + label: 'Account servicing entities', + link: 'intro-to-rafiki/account-servicing-entities' } ] }, { - label: 'Concepts', + label: 'Integration', collapsed: true, items: [ { - label: 'Interledger Protocol', - items: [ - { - label: 'Overview', - link: 'concepts/interledger-protocol/overview' - }, - { - label: 'Connector', - link: 'concepts/interledger-protocol/connector' - }, - { - label: 'Peering', - link: 'concepts/interledger-protocol/peering' - } - ] + label: 'Get started', + link: 'integration/get-started' }, { - label: 'Open Payments', - items: [ - { - label: 'Overview', - link: 'concepts/open-payments/overview' - }, - { - label: 'Key Registry', - link: 'concepts/open-payments/key-registry' - }, - { - label: 'Grant Interaction Flow', - link: 'concepts/open-payments/grant-interaction' - } - ] - }, - { - label: 'Accounting', - collapsed: true, - autogenerate: { - directory: 'concepts/accounting' - } + label: 'Deploy to production', + link: 'integration/deploy-to-production' }, { - label: 'Account Servicing Entity', - link: 'concepts/account-servicing-entity' + label: 'Admin APIs', + link: 'integration/admin-apis' }, { - label: 'Asset', - link: 'concepts/asset' + label: 'Integrator checklist', + link: 'integration/integrator-checklist' } ] }, { - label: 'Integration', + label: 'Components', collapsed: true, items: [ { - label: 'Getting Started', - link: 'integration/getting-started' + label: 'Accounts, transfers, and liquidity', + link: 'components/accounts-transfers-liquidity' + }, + { + label: 'Telemetry', + link: 'components/telemetry' }, { - label: 'Deployment', - link: 'integration/deployment' + label: 'Interledger', + link: 'components/interledger' }, { - label: 'Management', - link: 'integration/management' + label: 'Open Payments', + link: 'components/open-payments' }, { - label: 'Webhook Events', - link: 'integration/webhook-events' + label: 'Architecture', + link: 'components/architecture' } ] }, { - label: 'Telemetry', + label: 'Services and Auxiliary Packages', collapsed: true, items: [ - { label: 'Overview', link: 'telemetry/overview' }, - { label: 'Privacy', link: 'telemetry/privacy' }, { - label: 'Deploying Custom Telemetry', - link: 'telemetry/integrating' + label: 'Backend service', + link: 'services-and-aux-packages/backend-service' + }, + { + label: 'Auth service', + link: 'services-and-aux-packages/auth-service' + }, + { + label: 'Frontend service', + link: 'services-and-aux-packages/frontend-service' + }, + { + label: 'Token introspection', + link: 'services-and-aux-packages/token-introspection' } ] }, @@ -167,37 +148,52 @@ export default defineConfig({ { label: 'Auto-Peering', link: 'playground/autopeering' + }, + { + label: 'Testnet', + link: 'playground/testnet' } ] }, { - label: 'Reference', + label: 'Admin APIs', collapsed: true, - autogenerate: { - directory: 'reference' - } - } - ] - }, - { - label: 'Admin APIs', - items: [ - { - label: 'Idempotency', - link: 'apis/idempotency' - }, - { - label: 'Backend Admin API', - collapsed: true, - autogenerate: { - directory: 'apis/backend' - } + items: [ + { + label: 'GraphQL APIs', + collapsed: true, + items: [ + { + label: 'Idempotency', + link: 'apis/graphql/idempotency' + }, + { + label: 'Backend Admin API', + collapsed: true, + autogenerate: { + directory: 'apis/graphql/backend' + } + }, + { + label: 'Auth Admin API', + collapsed: true, + autogenerate: { + directory: 'apis/graphql/auth' + } + } + ] + }, + { + label: 'OpenAPIs', + link: 'apis/openapis' + } + ] }, { - label: 'Auth Admin API', + label: 'Reference', collapsed: true, autogenerate: { - directory: 'apis/auth' + directory: 'reference' } } ] @@ -207,12 +203,12 @@ export default defineConfig({ }), GraphQL({ schema: '../backend/src/graphql/schema.graphql', - output: './src/content/docs/apis/backend/', + output: './src/content/docs/apis/graphql/backend/', linkPrefix: '/apis/backend/' }), GraphQL({ schema: '../auth/src/graphql/schema.graphql', - output: './src/content/docs/apis/auth/', + output: './src/content/docs/apis/graphql/auth/', linkPrefix: '/apis/auth/' }) ], diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/enums.md b/packages/documentation/src/content/docs/apis/graphql/auth/enums.md new file mode 100644 index 0000000000..cb3acf7a7c --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/auth/enums.md @@ -0,0 +1,96 @@ +--- +title: Enums +--- + + + +## GrantFinalization + + + +

Values

+ + + + + + + + + + + + + + + + + +
ValueDescription
ISSUED +

grant was issued

+
REVOKED +

grant was revoked

+
REJECTED +

grant was rejected

+
+ +## GrantState + + + +

Values

+ + + + + + + + + + + + + + + + + + + + + +
ValueDescription
PROCESSING +

grant request is determining what state to enter next

+
PENDING +

grant request is awaiting interaction

+
APPROVED +

grant was approved

+
FINALIZED +

grant was finalized and no more access tokens or interactions can be made on it

+
+ +## SortOrder + + + +

Values

+ + + + + + + + + + + + + +
ValueDescription
ASC +

Choose ascending order for results.

+
DESC +

Choose descending order for results.

+
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md b/packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md new file mode 100644 index 0000000000..80069df276 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md @@ -0,0 +1,147 @@ +--- +title: Input objects +--- + + + +## FilterFinalizationReason + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+in
+[GrantFinalization!] +
+ +
+notIn
+[GrantFinalization!] +
+ +
+ +## FilterGrantState + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+in
+[GrantState!] +
+ +
+notIn
+[GrantState!] +
+ +
+ +## FilterString + + + +

Arguments

+ + + + + + + + + +
NameDescription
+in
+[String!] +
+ +
+ +## GrantFilter + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+identifier
+FilterString +
+ +
+state
+FilterGrantState +
+ +
+finalizationReason
+FilterFinalizationReason +
+ +
+ +## RevokeGrantInput + + + +

Arguments

+ + + + + + + + + +
NameDescription
+grantId
+String! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md b/packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md new file mode 100644 index 0000000000..d000f9b18a --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md @@ -0,0 +1,41 @@ +--- +title: Interfaces +--- + + + +## Model + + + +

Implemented by

+ +- [Grant](/apis/auth/objects#grant) +- [Access](/apis/auth/objects#access) + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+createdAt
+String! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/mutations.md b/packages/documentation/src/content/docs/apis/graphql/auth/mutations.md new file mode 100644 index 0000000000..e71d2e68be --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/auth/mutations.md @@ -0,0 +1,29 @@ +--- +title: Mutations +--- + + + +## revokeGrant + +**Type:** [RevokeGrantMutationResponse!](/apis/auth/objects#revokegrantmutationresponse) + +Revoke Grant + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+RevokeGrantInput! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/objects.md b/packages/documentation/src/content/docs/apis/graphql/auth/objects.md new file mode 100644 index 0000000000..7c43f5bf86 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/auth/objects.md @@ -0,0 +1,362 @@ +--- +title: Objects +--- + + + +## Access + + + +

Implements

+ +- [Model](/apis/auth/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Access id

+
+identifier
+String +
+

Wallet address of a sub-resource (incoming payment, outgoing payment, or quote)

+
+type
+String! +
+

Access type (incoming payment, outgoing payment, or quote)

+
+actions
+[String]! +
+

Access action (create, read, list or complete)

+
+limits
+LimitData +
+

Payment limits

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## Grant + + + +

Implements

+ +- [Model](/apis/auth/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Grant id

+
+client
+String! +
+

Wallet address of the grantee's account

+
+access
+[Access!]! +
+

Access details

+
+state
+GrantState! +
+

State of the grant

+
+finalizationReason
+GrantFinalization +
+

Reason a grant was finalized

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## GrantEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Grant! +
+ +
+cursor
+String! +
+ +
+ +## GrantsConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[GrantEdge!]! +
+ +
+ +## LimitData + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+receiver
+String +
+

Wallet address URL of the receiver

+
+debitAmount
+PaymentAmount +
+

Amount to debit

+
+receiveAmount
+PaymentAmount +
+

Amount to receive

+
+interval
+String +
+

Interval between payments

+
+ +## PageInfo + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+endCursor
+String +
+

Paginating forwards: the cursor to continue.

+
+hasNextPage
+Boolean! +
+

Paginating forwards: Are there more pages?

+
+hasPreviousPage
+Boolean! +
+

Paginating backwards: Are there more pages?

+
+startCursor
+String +
+

Paginating backwards: the cursor to continue.

+
+ +## PaymentAmount + + + +

Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
+value
+UInt64! +
+ +
+assetCode
+String! +
+

ISO 4217 currency code, e.g. USD

+
+assetScale
+UInt8! +
+

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

+
+ +## RevokeGrantMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/queries.md b/packages/documentation/src/content/docs/apis/graphql/auth/queries.md new file mode 100644 index 0000000000..4c53ce0d33 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/auth/queries.md @@ -0,0 +1,97 @@ +--- +title: Queries +--- + + + +## grant + +**Type:** [Grant!](/apis/auth/objects#grant) + +Fetch a grant + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+ +## grants + +**Type:** [GrantsConnection!](/apis/auth/objects#grantsconnection) + +Fetch a page of grants. + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+filter
+GrantFilter +
+

Filter grants based on specific criteria.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/scalars.md b/packages/documentation/src/content/docs/apis/graphql/auth/scalars.md new file mode 100644 index 0000000000..f404688a6e --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/auth/scalars.md @@ -0,0 +1,30 @@ +--- +title: Scalars +--- + + + +## Boolean + +The `Boolean` scalar type represents `true` or `false`. + +## ID + +The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. + +## Int + +The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. + +## String + +The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. + +## UInt64 + + + +## UInt8 + + + diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/enums.md b/packages/documentation/src/content/docs/apis/graphql/backend/enums.md new file mode 100644 index 0000000000..eeca95bc29 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/backend/enums.md @@ -0,0 +1,348 @@ +--- +title: Enums +--- + + + +## Alg + + + +

Values

+ + + + + + + + + +
ValueDescription
EdDSA + +
+ +## Crv + + + +

Values

+ + + + + + + + + +
ValueDescription
Ed25519 + +
+ +## FeeType + + + +

Values

+ + + + + + + + + + + + + +
ValueDescription
SENDING +

Sender pays the fees

+
RECEIVING +

Receiver pays the fees

+
+ +## IncomingPaymentState + + + +

Values

+ + + + + + + + + + + + + + + + + + + + + +
ValueDescription
PENDING +

The payment has a state of PENDING when it is initially created.

+
PROCESSING +

As soon as payment has started (funds have cleared into the account) the state moves to PROCESSING

+
COMPLETED +

The payment is either auto-completed once the received amount equals the expected incomingAmount, or it is completed manually via an API call.

+
EXPIRED +

If the payment expires before it is completed then the state will move to EXPIRED and no further payments will be accepted.

+
+ +## Kty + + + +

Values

+ + + + + + + + + +
ValueDescription
OKP + +
+ +## LiquidityError + + + +

Values

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
AlreadyPosted + +
AlreadyVoided + +
AmountZero + +
InsufficientBalance + +
InvalidId + +
TransferExists + +
UnknownAsset + +
UnknownIncomingPayment + +
UnknownPayment + +
UnknownWalletAddress + +
UnknownPeer + +
UnknownTransfer + +
+ +## OutgoingPaymentState + + + +

Values

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
FUNDING +

Will transition to SENDING once payment funds are reserved

+
SENDING +

Paying, will transition to COMPLETED on success

+
COMPLETED +

Successful completion

+
FAILED +

Payment failed

+
CANCELLED +

Payment cancelled

+
+ +## PaymentType + + + +

Values

+ + + + + + + + + + + + + +
ValueDescription
INCOMING + +
OUTGOING + +
+ +## SortOrder + + + +

Values

+ + + + + + + + + + + + + +
ValueDescription
ASC +

Choose ascending order for results.

+
DESC +

Choose descending order for results.

+
+ +## TransferType + + + +

Values

+ + + + + + + + + + + + + + + + + +
ValueDescription
DEPOSIT +

Deposit transfer type.

+
WITHDRAWAL +

Withdrawal transfer type.

+
TRANSFER +

Transfer type.

+
+ +## WalletAddressStatus + + + +

Values

+ + + + + + + + + + + + + +
ValueDescription
INACTIVE +

Status after deactivating

+
ACTIVE +

Default status

+
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md b/packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md new file mode 100644 index 0000000000..067b5f34cb --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md @@ -0,0 +1,1776 @@ +--- +title: Input objects +--- + + + +## AdditionalPropertyInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+key
+String! +
+ +
+value
+String! +
+ +
+visibleInOpenPayments
+Boolean! +
+ +
+ +## AmountInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+value
+UInt64! +
+ +
+assetCode
+String! +
+

ISO 4217 currency code, e.g. USD

+
+assetScale
+UInt8! +
+

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

+
+ +## CancelOutgoingPaymentInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Outgoing payment id

+
+reason
+String +
+

Reason why this Outgoing Payment has been cancelled. This value will be publicly visible in the metadata field if this outgoing payment is requested through Open Payments.

+
+ +## CreateAssetInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+code
+String! +
+

ISO 4217 currency code, e.g. USD

+
+scale
+UInt8! +
+

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

+
+withdrawalThreshold
+UInt64 +
+

Minimum amount of liquidity that can be withdrawn from the asset

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if liquidity falls below this value

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateAssetLiquidityWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+assetId
+String! +
+

The id of the asset to create the withdrawal for.

+
+amount
+UInt64! +
+

Amount of withdrawal.

+
+id
+String! +
+

The id of the withdrawal.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+timeoutSeconds
+UInt64! +
+

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

+
+ +## CreateIncomingPaymentInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+

Id of the wallet address under which the incoming payment will be created

+
+expiresAt
+String +
+

Expiration date-time

+
+metadata
+JSONObject +
+

Additional metadata associated with the incoming payment.

+
+incomingAmount
+AmountInput +
+

Maximum amount to be received

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateIncomingPaymentWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+incomingPaymentId
+String! +
+

The id of the incoming payment to withdraw from.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+timeoutSeconds
+UInt64! +
+

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

+
+ +## CreateOrUpdatePeerByUrlInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+maxPacketAmount
+UInt64 +
+

Maximum packet amount that the peer accepts

+
+assetId
+String! +
+

Asset id of peering relationship

+
+peerUrl
+String! +
+

Peer's URL address at which the peer accepts auto-peering requests

+
+name
+String +
+

Peer's internal name for overriding auto-peer's default naming

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

+
+liquidityToDeposit
+UInt64 +
+

Amount of liquidity to deposit for peer

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateOutgoingPaymentFromIncomingPaymentInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+

Id of the wallet address under which the outgoing payment will be created

+
+incomingPayment
+String! +
+

Incoming payment url to create the outgoing payment from

+
+debitAmount
+AmountInput! +
+

Amount to send (fixed send)

+
+metadata
+JSONObject +
+

Additional metadata associated with the outgoing payment.

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateOutgoingPaymentInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+

Id of the wallet address under which the outgoing payment will be created

+
+quoteId
+String! +
+

Id of the corresponding quote for that outgoing payment

+
+metadata
+JSONObject +
+

Additional metadata associated with the outgoing payment.

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateOutgoingPaymentWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+outgoingPaymentId
+String! +
+

The id of the outgoing payment to withdraw from.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+timeoutSeconds
+UInt64! +
+

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

+
+ +## CreatePeerInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+maxPacketAmount
+UInt64 +
+

Maximum packet amount that the peer accepts

+
+http
+HttpInput! +
+

Peering connection details

+
+assetId
+String! +
+

Asset id of peering relationship

+
+staticIlpAddress
+String! +
+

Peer's ILP address

+
+name
+String +
+

Peer's internal name

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

+
+initialLiquidity
+UInt64 +
+

Initial amount of liquidity to deposit for peer

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreatePeerLiquidityWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+peerId
+String! +
+

The id of the peer to create the withdrawal for.

+
+amount
+UInt64! +
+

Amount of withdrawal.

+
+id
+String! +
+

The id of the withdrawal.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+timeoutSeconds
+UInt64! +
+

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

+
+ +## CreateQuoteInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+

Id of the wallet address under which the quote will be created

+
+debitAmount
+AmountInput +
+

Amount to send (fixed send)

+
+receiveAmount
+AmountInput +
+

Amount to receive (fixed receive)

+
+receiver
+String! +
+

Wallet address URL of the receiver

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateReceiverInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressUrl
+String! +
+

Receiving wallet address URL

+
+expiresAt
+String +
+

Expiration date-time

+
+incomingAmount
+AmountInput +
+

Maximum amount to be received

+
+metadata
+JSONObject +
+

Additional metadata associated with the incoming payment.

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateWalletAddressInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+assetId
+String! +
+

Asset of the wallet address

+
+url
+String! +
+

Wallet Address URL

+
+publicName
+String +
+

Public name associated with the wallet address

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+additionalProperties
+[AdditionalPropertyInput!] +
+

Additional properties associated with the [walletAddress].

+
+ +## CreateWalletAddressKeyInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+ +
+jwk
+JwkInput! +
+

Public key

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateWalletAddressWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+

The id of the Open Payments wallet address to create the withdrawal for.

+
+id
+String! +
+

The id of the withdrawal.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+timeoutSeconds
+UInt64! +
+

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

+
+ +## DeleteAssetInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Asset id

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## DeletePeerInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## DepositAssetLiquidityInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+assetId
+String! +
+

The id of the asset to deposit liquidity.

+
+amount
+UInt64! +
+

Amount of liquidity to deposit.

+
+id
+String! +
+

The id of the transfer.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## DepositEventLiquidityInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+eventId
+String! +
+

The id of the event to deposit into.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## DepositOutgoingPaymentLiquidityInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+outgoingPaymentId
+String! +
+

The id of the outgoing payment to deposit into.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## DepositPeerLiquidityInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+peerId
+String! +
+

The id of the peer to deposit liquidity.

+
+amount
+UInt64! +
+

Amount of liquidity to deposit.

+
+id
+String! +
+

The id of the transfer.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## FeeDetails + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+fixed
+UInt64! +
+

A flat fee

+
+basisPoints
+Int! +
+

Basis points fee. Should be between 0 and 10000 (inclusive). 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100%

+
+ +## FilterString + + + +

Arguments

+ + + + + + + + + +
NameDescription
+in
+[String!]! +
+ +
+ +## HttpIncomingInput + + + +

Arguments

+ + + + + + + + + +
NameDescription
+authTokens
+[String!]! +
+

Array of auth tokens accepted by this Rafiki instance

+
+ +## HttpInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+incoming
+HttpIncomingInput +
+

Incoming connection details

+
+outgoing
+HttpOutgoingInput! +
+

Outgoing connection details

+
+ +## HttpOutgoingInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+authToken
+String! +
+

Auth token to present at the peering Rafiki instance

+
+endpoint
+String! +
+

Peer's connection endpoint

+
+ +## JwkInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+kid
+String! +
+

Key id

+
+x
+String! +
+

Base64 url-encoded public key.

+
+alg
+Alg! +
+

Cryptographic algorithm family used with the key. The only allowed value is EdDSA.

+
+kty
+Kty! +
+

Key type. The only allowed value is OKP.

+
+crv
+Crv! +
+

Curve that the key pair is derived from. The only allowed value is Ed25519.

+
+ +## PaymentFilter + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+type
+FilterString +
+ +
+walletAddressId
+FilterString +
+ +
+ +## PostLiquidityWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+withdrawalId
+String! +
+

The id of the liquidity withdrawal to post.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## RevokeWalletAddressKeyInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+id
+String! +
+

Internal id of key

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## SetFeeInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+assetId
+ID! +
+

Asset id to add the fee to

+
+type
+FeeType! +
+

Type of fee (sending or receiving)

+
+fee
+FeeDetails! +
+

Fee values

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## TriggerWalletAddressEventsInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+limit
+Int! +
+

Maximum number of events being triggered (n).

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## UpdateAssetInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+String! +
+

Asset id

+
+withdrawalThreshold
+UInt64 +
+

New minimum amount of liquidity that can be withdrawn from the asset

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if liquidity falls below this new value

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## UpdatePeerInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+String! +
+

Peer id

+
+maxPacketAmount
+UInt64 +
+

New maximum packet amount that the peer accepts

+
+http
+HttpInput +
+

New peering connection details

+
+staticIlpAddress
+String +
+

Peer's new ILP address

+
+name
+String +
+

Peer's new public name

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this new value

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## UpdateWalletAddressInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

ID of wallet address to update

+
+publicName
+String +
+

New public name for wallet address

+
+status
+WalletAddressStatus +
+

New status to set the wallet address to

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+additionalProperties
+[AdditionalPropertyInput!] +
+

List additional properties associated with this wallet address.

+
+ +## VoidLiquidityWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+withdrawalId
+String! +
+

The id of the liquidity withdrawal to void.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## WebhookEventFilter + + + +

Arguments

+ + + + + + + + + +
NameDescription
+type
+FilterString +
+ +
+ +## WithdrawEventLiquidityInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+eventId
+String! +
+

The id of the event to withdraw from.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md b/packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md new file mode 100644 index 0000000000..81868d9668 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md @@ -0,0 +1,112 @@ +--- +title: Interfaces +--- + + + +## BasePayment + + + +

Implemented by

+ +- [IncomingPayment](/apis/backend/objects#incomingpayment) +- [OutgoingPayment](/apis/backend/objects#outgoingpayment) +- [Payment](/apis/backend/objects#payment) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+walletAddressId
+ID! +
+ +
+metadata
+JSONObject +
+ +
+createdAt
+String! +
+ +
+client
+String +
+ +
+ +## Model + + + +

Implemented by

+ +- [Asset](/apis/backend/objects#asset) +- [Peer](/apis/backend/objects#peer) +- [WalletAddress](/apis/backend/objects#walletaddress) +- [IncomingPayment](/apis/backend/objects#incomingpayment) +- [OutgoingPayment](/apis/backend/objects#outgoingpayment) +- [Payment](/apis/backend/objects#payment) +- [AccountingTransfer](/apis/backend/objects#accountingtransfer) +- [WalletAddressKey](/apis/backend/objects#walletaddresskey) +- [WebhookEvent](/apis/backend/objects#webhookevent) +- [Fee](/apis/backend/objects#fee) + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+createdAt
+String! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/mutations.md b/packages/documentation/src/content/docs/apis/graphql/backend/mutations.md new file mode 100644 index 0000000000..82b821618e --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/backend/mutations.md @@ -0,0 +1,723 @@ +--- +title: Mutations +--- + + + +## cancelOutgoingPayment + +**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) + +Cancel Outgoing Payment + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CancelOutgoingPaymentInput! +
+ +
+ +## createAsset + +**Type:** [AssetMutationResponse!](/apis/backend/objects#assetmutationresponse) + +Create an asset + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateAssetInput! +
+ +
+ +## createAssetLiquidityWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Withdraw asset liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateAssetLiquidityWithdrawalInput! +
+ +
+ +## createIncomingPayment + +**Type:** [IncomingPaymentResponse!](/apis/backend/objects#incomingpaymentresponse) + +Create an internal Open Payments Incoming Payment. The receiver has a wallet address on this Rafiki instance. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateIncomingPaymentInput! +
+ +
+ +## createIncomingPaymentWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Withdraw incoming payment liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateIncomingPaymentWithdrawalInput! +
+ +
+ +## createOrUpdatePeerByUrl + +**Type:** [CreateOrUpdatePeerByUrlMutationResponse!](/apis/backend/objects#createorupdatepeerbyurlmutationresponse) + +Create a peer using a URL + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateOrUpdatePeerByUrlInput! +
+ +
+ +## createOutgoingPayment + +**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) + +Create an Open Payments Outgoing Payment + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateOutgoingPaymentInput! +
+ +
+ +## createOutgoingPaymentFromIncomingPayment + +**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) + +Create an Open Payments Outgoing Payment from an incoming payment + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateOutgoingPaymentFromIncomingPaymentInput! +
+ +
+ +## createOutgoingPaymentWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Withdraw outgoing payment liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateOutgoingPaymentWithdrawalInput! +
+ +
+ +## createPeer + +**Type:** [CreatePeerMutationResponse!](/apis/backend/objects#createpeermutationresponse) + +Create a peer + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreatePeerInput! +
+ +
+ +## createPeerLiquidityWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Withdraw peer liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreatePeerLiquidityWithdrawalInput! +
+ +
+ +## createQuote + +**Type:** [QuoteResponse!](/apis/backend/objects#quoteresponse) + +Create an Open Payments Quote + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateQuoteInput! +
+ +
+ +## createReceiver + +**Type:** [CreateReceiverResponse!](/apis/backend/objects#createreceiverresponse) + +Create an internal or external Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateReceiverInput! +
+ +
+ +## createWalletAddress + +**Type:** [CreateWalletAddressMutationResponse!](/apis/backend/objects#createwalletaddressmutationresponse) + +Create a wallet address + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateWalletAddressInput! +
+ +
+ +## createWalletAddressKey + +**Type:** [CreateWalletAddressKeyMutationResponse](/apis/backend/objects#createwalletaddresskeymutationresponse) + +Add a public key to a wallet address that is used to verify Open Payments requests. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateWalletAddressKeyInput! +
+ +
+ +## createWalletAddressWithdrawal + +**Type:** [WalletAddressWithdrawalMutationResponse](/apis/backend/objects#walletaddresswithdrawalmutationresponse) + +Withdraw liquidity from a wallet address received via Web Monetization. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateWalletAddressWithdrawalInput! +
+ +
+ +## deleteAsset + +**Type:** [DeleteAssetMutationResponse!](/apis/backend/objects#deleteassetmutationresponse) + +Delete an asset + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DeleteAssetInput! +
+ +
+ +## deletePeer + +**Type:** [DeletePeerMutationResponse!](/apis/backend/objects#deletepeermutationresponse) + +Delete a peer + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DeletePeerInput! +
+ +
+ +## depositAssetLiquidity + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Deposit asset liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DepositAssetLiquidityInput! +
+ +
+ +## depositEventLiquidity + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +> Deprecated: Use `depositOutgoingPaymentLiquidity` + +Deposit webhook event liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DepositEventLiquidityInput! +
+ +
+ +## depositOutgoingPaymentLiquidity + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Deposit outgoing payment liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DepositOutgoingPaymentLiquidityInput! +
+ +
+ +## depositPeerLiquidity + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Deposit peer liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DepositPeerLiquidityInput! +
+ +
+ +## postLiquidityWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Post liquidity withdrawal. Withdrawals are two-phase commits and are committed via this mutation. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+PostLiquidityWithdrawalInput! +
+ +
+ +## revokeWalletAddressKey + +**Type:** [RevokeWalletAddressKeyMutationResponse](/apis/backend/objects#revokewalletaddresskeymutationresponse) + +Revoke a public key associated with a wallet address. Open Payment requests using this key for request signatures will be denied going forward. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+RevokeWalletAddressKeyInput! +
+ +
+ +## setFee + +**Type:** [SetFeeResponse!](/apis/backend/objects#setfeeresponse) + +Set the fee on an asset + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+SetFeeInput! +
+ +
+ +## triggerWalletAddressEvents + +**Type:** [TriggerWalletAddressEventsMutationResponse!](/apis/backend/objects#triggerwalletaddresseventsmutationresponse) + +If automatic withdrawal of funds received via Web Monetization by the wallet address are disabled, this mutation can be used to trigger up to n withdrawal events. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+TriggerWalletAddressEventsInput! +
+ +
+ +## updateAsset + +**Type:** [AssetMutationResponse!](/apis/backend/objects#assetmutationresponse) + +Update an asset + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+UpdateAssetInput! +
+ +
+ +## updatePeer + +**Type:** [UpdatePeerMutationResponse!](/apis/backend/objects#updatepeermutationresponse) + +Update a peer + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+UpdatePeerInput! +
+ +
+ +## updateWalletAddress + +**Type:** [UpdateWalletAddressMutationResponse!](/apis/backend/objects#updatewalletaddressmutationresponse) + +Update a wallet address + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+UpdateWalletAddressInput! +
+ +
+ +## voidLiquidityWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Void liquidity withdrawal. Withdrawals are two-phase commits and are rolled back via this mutation. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+VoidLiquidityWithdrawalInput! +
+ +
+ +## withdrawEventLiquidity + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +> Deprecated: Use `createOutgoingPaymentWithdrawal, createIncomingPaymentWithdrawal, or createWalletAddressWithdrawal` + +Withdraw webhook event liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+WithdrawEventLiquidityInput! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/objects.md b/packages/documentation/src/content/docs/apis/graphql/backend/objects.md new file mode 100644 index 0000000000..39212c93ae --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/backend/objects.md @@ -0,0 +1,2698 @@ +--- +title: Objects +--- + + + +## AccountingTransfer + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Payment id

+
+debitAccountId
+ID! +
+

Debit account id

+
+creditAccountId
+ID! +
+

Credit account id

+
+amount
+UInt64! +
+

Amount sent (fixed send)

+
+transferType
+TransferType! +
+

Type of accounting transfer

+
+ledger
+UInt8! +
+

Identifier that partitions the sets of accounts that can transact with each other.

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## AccountingTransferConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+debits
+[AccountingTransfer!]! +
+ +
+credits
+[AccountingTransfer!]! +
+ +
+ +## AdditionalProperty + + + +

Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
+key
+String! +
+ +
+value
+String! +
+ +
+visibleInOpenPayments
+Boolean! +
+ +
+ +## Amount + + + +

Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
+value
+UInt64! +
+ +
+assetCode
+String! +
+

ISO 4217 currency code, e.g. USD

+
+assetScale
+UInt8! +
+

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

+
+ +## Asset + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Asset id

+
+code
+String! +
+

ISO 4217 currency code, e.g. USD

+
+scale
+UInt8! +
+

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

+
+liquidity
+UInt64 +
+

Available liquidity

+
+withdrawalThreshold
+UInt64 +
+

Minimum amount of liquidity that can be withdrawn from the asset

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if liquidity falls below this value

+
+receivingFee
+Fee +
+

The receiving fee structure for the asset

+
+sendingFee
+Fee +
+

The sending fee structure for the asset

+
+fees
+FeesConnection +
+

Fetch a page of asset fees

+ +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +
+createdAt
+String! +
+

Date-time of creation

+
+ +## AssetEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Asset! +
+ +
+cursor
+String! +
+ +
+ +## AssetMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+asset
+Asset +
+ +
+ +## AssetsConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[AssetEdge!]! +
+ +
+ +## CreateOrUpdatePeerByUrlMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+peer
+Peer +
+ +
+ +## CreatePeerMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+peer
+Peer +
+ +
+ +## CreateReceiverResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+receiver
+Receiver +
+ +
+ +## CreateWalletAddressKeyMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+walletAddressKey
+WalletAddressKey +
+ +
+ +## CreateWalletAddressMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+walletAddress
+WalletAddress +
+ +
+ +## DeleteAssetMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+asset
+Asset +
+ +
+ +## DeletePeerMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+success
+Boolean! +
+ +
+ +## Fee + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Fee id

+
+assetId
+ID! +
+

Asset id associated with the fee

+
+type
+FeeType! +
+

Type of fee (sending or receiving)

+
+fixed
+UInt64! +
+

Fixed fee

+
+basisPoints
+Int! +
+

Basis points fee. 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100%

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## FeeEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Fee! +
+ +
+cursor
+String! +
+ +
+ +## FeesConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[FeeEdge!]! +
+ +
+ +## Http + + + +

Fields

+ + + + + + + + + +
NameDescription
+outgoing
+HttpOutgoing! +
+

Outgoing connection details

+
+ +## HttpOutgoing + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+authToken
+String! +
+

Auth token to present at the peering Rafiki instance

+
+endpoint
+String! +
+

Peer's connection endpoint

+
+ +## IncomingPayment + + + +

Implements

+ +- [BasePayment](/apis/backend/interfaces#basepayment) +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Incoming Payment id

+
+walletAddressId
+ID! +
+

Id of the wallet address under which this incoming payment was created.

+
+client
+String +
+

Information about the wallet address of the Open Payments client that created the incoming payment.

+
+liquidity
+UInt64 +
+

Available liquidity

+
+state
+IncomingPaymentState! +
+

Incoming payment state

+
+expiresAt
+String! +
+

Date-time of expiry. After this time, the incoming payment will not accept further payments made to it.

+
+incomingAmount
+Amount +
+

The maximum amount that should be paid into the wallet address under this incoming payment.

+
+receivedAmount
+Amount! +
+

The total amount that has been paid into the wallet address under this incoming payment.

+
+metadata
+JSONObject +
+

Additional metadata associated with the incoming payment.

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## IncomingPaymentConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[IncomingPaymentEdge!]! +
+ +
+ +## IncomingPaymentEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+IncomingPayment! +
+ +
+cursor
+String! +
+ +
+ +## IncomingPaymentResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+payment
+IncomingPayment +
+ +
+ +## Jwk + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+kid
+String! +
+

Key id

+
+x
+String! +
+

Base64 url-encoded public key.

+
+alg
+Alg! +
+

Cryptographic algorithm family used with the key. The only allowed value is EdDSA.

+
+kty
+Kty! +
+

Key type. The only allowed value is OKP.

+
+crv
+Crv! +
+

Curve that the key pair is derived from. The only allowed value is Ed25519.

+
+ +## LiquidityMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+success
+Boolean! +
+ +
+ +## OutgoingPayment + + + +

Implements

+ +- [BasePayment](/apis/backend/interfaces#basepayment) +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Outgoing payment id

+
+walletAddressId
+ID! +
+

Id of the wallet address under which this outgoing payment was created

+
+client
+String +
+

Information about the wallet address of the Open Payments client that created the outgoing payment.

+
+liquidity
+UInt64 +
+

Available liquidity

+
+state
+OutgoingPaymentState! +
+

Outgoing payment state

+
+error
+String +
+ +
+stateAttempts
+Int! +
+ +
+debitAmount
+Amount! +
+

Amount to send (fixed send)

+
+receiveAmount
+Amount! +
+

Amount to receive (fixed receive)

+
+receiver
+String! +
+

Wallet address URL of the receiver

+
+metadata
+JSONObject +
+

Additional metadata associated with the outgoing payment.

+
+quote
+Quote +
+

Quote for this outgoing payment

+
+sentAmount
+Amount! +
+

Amount already sent

+
+createdAt
+String! +
+

Date-time of creation

+
+grantId
+String +
+

Id of the Grant under which this outgoing payment was created

+
+ +## OutgoingPaymentConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[OutgoingPaymentEdge!]! +
+ +
+ +## OutgoingPaymentEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+OutgoingPayment! +
+ +
+cursor
+String! +
+ +
+ +## OutgoingPaymentResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+payment
+OutgoingPayment +
+ +
+ +## PageInfo + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+endCursor
+String +
+

Paginating forwards: the cursor to continue.

+
+hasNextPage
+Boolean! +
+

Paginating forwards: Are there more pages?

+
+hasPreviousPage
+Boolean! +
+

Paginating backwards: Are there more pages?

+
+startCursor
+String +
+

Paginating backwards: the cursor to continue.

+
+ +## Payment + + + +

Implements

+ +- [BasePayment](/apis/backend/interfaces#basepayment) +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Payment id

+
+type
+PaymentType! +
+

Type of payment

+
+walletAddressId
+ID! +
+

Id of the wallet address under which this payment was created

+
+client
+String +
+

Information about the wallet address of the Open Payments client that created the payment.

+
+state
+String! +
+

Either the IncomingPaymentState or OutgoingPaymentState according to type

+
+liquidity
+UInt64 +
+

Available liquidity

+
+metadata
+JSONObject +
+

Additional metadata associated with the payment.

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## PaymentConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[PaymentEdge!]! +
+ +
+ +## PaymentEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Payment! +
+ +
+cursor
+String! +
+ +
+ +## Peer + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Peer id

+
+maxPacketAmount
+UInt64 +
+

Maximum packet amount that the peer accepts

+
+http
+Http! +
+

Peering connection details

+
+asset
+Asset! +
+

Asset of peering relationship

+
+staticIlpAddress
+String! +
+

Peer's ILP address

+
+name
+String +
+

Peer's public name

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

+
+liquidity
+UInt64 +
+

Available liquidity

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## PeerEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Peer! +
+ +
+cursor
+String! +
+ +
+ +## PeersConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[PeerEdge!]! +
+ +
+ +## Quote + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Quote id

+
+walletAddressId
+ID! +
+

Id of the wallet address under which this quote was created

+
+receiver
+String! +
+

Wallet address URL of the receiver

+
+debitAmount
+Amount! +
+

Amount to send (fixed send)

+
+receiveAmount
+Amount! +
+

Amount to receive (fixed receive)

+
+maxPacketAmount
+UInt64! +
+

Maximum value per packet allowed on the possible routes

+
+minExchangeRate
+Float! +
+

Aggregate exchange rate the payment is guaranteed to meet

+
+lowEstimatedExchangeRate
+Float! +
+

Lower bound of probed exchange rate

+
+highEstimatedExchangeRate
+Float! +
+

Upper bound of probed exchange rate

+
+createdAt
+String! +
+

Date-time of creation

+
+expiresAt
+String! +
+

Date-time of expiration

+
+ +## QuoteConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[QuoteEdge!]! +
+ +
+ +## QuoteEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Quote! +
+ +
+cursor
+String! +
+ +
+ +## QuoteResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+quote
+Quote +
+ +
+ +## Receiver + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+String! +
+

Incoming payment URL

+
+walletAddressUrl
+String! +
+

Wallet address URL under which the incoming payment was created

+
+completed
+Boolean! +
+

Describes whether the incoming payment has completed receiving funds.

+
+incomingAmount
+Amount +
+

The maximum amount that should be paid into the wallet address under this incoming payment.

+
+receivedAmount
+Amount! +
+

The total amount that has been paid into the wallet address under this incoming payment.

+
+expiresAt
+String +
+

Date-time of expiry. After this time, the incoming payment will accept further payments made to it.

+
+metadata
+JSONObject +
+

Additional metadata associated with the incoming payment.

+
+createdAt
+String! +
+

Date-time of creation

+
+updatedAt
+String! +
+

Date-time of last update

+
+ +## RevokeWalletAddressKeyMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+walletAddressKey
+WalletAddressKey +
+ +
+ +## SetFeeResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+fee
+Fee +
+ +
+ +## TriggerWalletAddressEventsMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+count
+Int +
+

Number of events triggered

+
+ +## UpdatePeerMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+peer
+Peer +
+ +
+ +## UpdateWalletAddressMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+walletAddress
+WalletAddress +
+ +
+ +## WalletAddress + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Wallet address id

+
+asset
+Asset! +
+

Asset of the wallet address

+
+liquidity
+UInt64 +
+

Available liquidity

+
+url
+String! +
+

Wallet Address URL

+
+publicName
+String +
+

Public name associated with the wallet address

+
+incomingPayments
+IncomingPaymentConnection +
+

List of incoming payments received by this wallet address

+ +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +
+quotes
+QuoteConnection +
+

List of quotes created at this wallet address

+ +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +
+outgoingPayments
+OutgoingPaymentConnection +
+

List of outgoing payments sent from this wallet address

+ +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +
+createdAt
+String! +
+

Date-time of creation

+
+status
+WalletAddressStatus! +
+

Status of the wallet address

+
+walletAddressKeys
+WalletAddressKeyConnection +
+

List of keys associated with this wallet address

+ +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +
+additionalProperties
+[AdditionalProperty] +
+

List additional properties associated with this wallet address.

+
+ +## WalletAddressEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+WalletAddress! +
+ +
+cursor
+String! +
+ +
+ +## WalletAddressesConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[WalletAddressEdge!]! +
+ +
+ +## WalletAddressKey + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Internal id of key

+
+walletAddressId
+ID! +
+

Id of the wallet address to which this key belongs to

+
+jwk
+Jwk! +
+

Public key

+
+revoked
+Boolean! +
+

Indicator whether the key has been revoked

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## WalletAddressKeyConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[WalletAddressKeyEdge!]! +
+ +
+ +## WalletAddressKeyEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+WalletAddressKey! +
+ +
+cursor
+String! +
+ +
+ +## WalletAddressWithdrawal + + + +

Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Withdrawal Id

+
+amount
+UInt64! +
+

Amount to withdraw

+
+walletAddress
+WalletAddress! +
+

Wallet address details

+
+ +## WalletAddressWithdrawalMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+withdrawal
+WalletAddressWithdrawal +
+ +
+ +## WebhookEvent + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Event id

+
+type
+String! +
+

Type of event

+
+data
+JSONObject! +
+

Stringified JSON data

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## WebhookEventsConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[WebhookEventsEdge!]! +
+ +
+ +## WebhookEventsEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+WebhookEvent! +
+ +
+cursor
+String! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/queries.md b/packages/documentation/src/content/docs/apis/graphql/backend/queries.md new file mode 100644 index 0000000000..c50ce737cf --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/backend/queries.md @@ -0,0 +1,512 @@ +--- +title: Queries +--- + + + +## accountingTransfers + +**Type:** [AccountingTransferConnection!](/apis/backend/objects#accountingtransferconnection) + +Fetch a page of accounting transfers + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+id
+String! +
+

Account id.

+
+limit
+Int +
+

Limit the number of results returned. If no limit is provided, the default limit of 100_000 is set for TigerBeetle.

+
+ +## asset + +**Type:** [Asset](/apis/backend/objects#asset) + +Fetch an asset + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## assets + +**Type:** [AssetsConnection!](/apis/backend/objects#assetsconnection) + +Fetch a page of assets. + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +## incomingPayment + +**Type:** [IncomingPayment](/apis/backend/objects#incomingpayment) + +Fetch an Open Payments incoming payment + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## outgoingPayment + +**Type:** [OutgoingPayment](/apis/backend/objects#outgoingpayment) + +Fetch an Open Payments outgoing payment + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## payments + +**Type:** [PaymentConnection!](/apis/backend/objects#paymentconnection) + +Fetch a page of combined payments + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+filter
+PaymentFilter +
+

Filter payment events based on specific criteria.

+
+ +## peer + +**Type:** [Peer](/apis/backend/objects#peer) + +Fetch a peer + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## peers + +**Type:** [PeersConnection!](/apis/backend/objects#peersconnection) + +Fetch a page of peers. + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +## quote + +**Type:** [Quote](/apis/backend/objects#quote) + +Fetch an Open Payments quote + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## receiver + +**Type:** [Receiver](/apis/backend/objects#receiver) + +Get an local or remote Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## walletAddress + +**Type:** [WalletAddress](/apis/backend/objects#walletaddress) + +Fetch a wallet address. + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## walletAddresses + +**Type:** [WalletAddressesConnection!](/apis/backend/objects#walletaddressesconnection) + +Fetch a page of wallet addresses. + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +## webhookEvents + +**Type:** [WebhookEventsConnection!](/apis/backend/objects#webhookeventsconnection) + +Fetch a page of webhook events + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+filter
+WebhookEventFilter +
+

Filter webhook events based on specific criteria.

+
+ diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/scalars.md b/packages/documentation/src/content/docs/apis/graphql/backend/scalars.md new file mode 100644 index 0000000000..5c3b7b9369 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/graphql/backend/scalars.md @@ -0,0 +1,38 @@ +--- +title: Scalars +--- + + + +## Boolean + +The `Boolean` scalar type represents `true` or `false`. + +## Float + +The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). + +## ID + +The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. + +## Int + +The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. + +## JSONObject + + + +## String + +The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. + +## UInt64 + + + +## UInt8 + + + diff --git a/packages/documentation/src/content/docs/apis/idempotency.md b/packages/documentation/src/content/docs/apis/graphql/idempotency.mdx similarity index 100% rename from packages/documentation/src/content/docs/apis/idempotency.md rename to packages/documentation/src/content/docs/apis/graphql/idempotency.mdx diff --git a/packages/documentation/src/content/docs/apis/openapis.mdx b/packages/documentation/src/content/docs/apis/openapis.mdx new file mode 100644 index 0000000000..b7350ab902 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/openapis.mdx @@ -0,0 +1,5 @@ +--- +title: OpenAPIs +--- + +## Placeholder \ No newline at end of file diff --git a/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx b/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx new file mode 100644 index 0000000000..24817755f5 --- /dev/null +++ b/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx @@ -0,0 +1,1514 @@ +--- +title: Accounts, transfers, and Liquidity +--- + +## Asset + +As per the [Mariam Webster Dictionary](https://www.merriam-webster.com/dictionary/asset), an Asset is "an item of value owned". Since the Interledger Protocol aims to create an internet of value, it allows for the transfer of any asset, not just currency. In reality, however, mainly assets denominated in a currency, i.e. fiat, commodity, or alternative currencies like crypto and branded currencies, are transferred via the Interledger Protocol. + +### The `Asset` type + +The `Asset` type in Rafiki is comprised of a value, an asset code, and an asset scale. + +| Property | Type | Example | +| ---------- | ------- | ------- | +| value | BigInt | `10000` | +| assetCode | String | `"USD"` | +| assetScale | Integer | `2` | + +The asset code SHOULD be an [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), if it is available for the asset. The asset scale is the difference in orders of magnitude between the standard unit and a corresponding fractional unit. To convert from `Asset` to a currency amount that is more common to humans, apply the following formula: + +$currencyAmount = \frac{value}{10^{assetScale}}$ + +Hence, the above example represents $\frac{10000}{10^2} =100.00$ USD. + +Assets are represented in the `Asset` type due to JavaScript/Typescript's deficiencies when handling floats. + +### Assets in Rafiki + +When two Account Servicing Entities peer their Rafiki instances, they need to define the asset(s) they are going to settle in. The Interledger packets they are going to exchange will then also be denominated in that asset. + +Furthermore, if an Account Servicing Entity is performing currency exchange, they need to provide [asset liquidity](/concepts/accounting/liquidity#asset-liquidity). + +Assets can be created and managed via the Admin GraphQL API directly or via the Rafiki Admin dashboard. Currently, [wallet addresses](/reference/glossary#wallet-address) can only be created for an existing asset and are tied to that asset. + +## Accounts + +Rafiki uses a combination of liquidity and settlement accounts to perform [double-entry accounting](https://en.wikipedia.org/wiki/Double-entry_bookkeeping). + +### Liquidity account + +A liquidity account may only hold a positive balance. Rafiki enforces that its total debits MUST NOT exceed its total credits amount. + +There is one liquidity account for each of the following resource: + +- [Asset](/reference/glossary#asset) +- [Peer](/reference/glossary#peer) +- Wallet Address (for [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) / [Web Monetization](/reference/glossary#web-monetization) receiving) +- Incoming Payment +- Outgoing Payment + +Asset and Peer liquidity accounts are created when calling `createAsset` and `createPeer` [GraphQL Admin API mutations](/apis/backend/mutations) respectively, while liquidity accounts for wallet addresses, incoming and outgoing payments are created on-the-fly during payment processing or web monetization events. + +Any liquidity management is done by the [Account Servicing Entity](/reference/glossary#account-servicing-entity) through the GraphQL Admin API. See [webhook events](/integration/webhook-events) and [liquidity documentation](/concepts/accounting/liquidity) for more information. + +### Settlement account + +A settlement account may only hold a negative balance. Rafiki enforces that its total credits MUST NOT exceed its total debits amount. A settlement account represents those total amount of funds an [Account Servicing Entity](/reference/glossary#account-servicing-entity) has deposited into Rafiki. + +There is one settlement account for each asset. + +## Transfers + +Rafiki transfers perform double-entry accounting. Every transfer increases both the total debits of one account and the total credits of a second account by the same amount. + +### Intra-Rafiki + +Consider the following accounts referenced throughout the below documentation: + +- **USD Settlement Acc.** - USD asset settlement account (always zero or negative balance) +- **USD (Asset) Liquidity Acc.** - USD settlement account (always zero or positive balance) +- **Peer Liquidity Acc.** - USD asset counterparty liquidity account (always zero or positive balance) +- **Wallet Address Liquidity Acc.** - USD wallet address liquidity account (always zero or positive balance) +- **Incoming Payment Liquidity Acc.** - USD incoming payment liquidity account (always zero or positive balance) +- **Outgoing Payment Liquidity Acc.** - USD outgoing payment liquidity account (always zero or positive balance) + +#### Deposits + +Action of debiting the settlement account, and crediting the liquidity account. + +##### Depositing Asset Liquidity + +| Debit Account | Credit Account | +| ------------- | --------------- | +| Settlement | Asset Liquidity | + +- Example: depositing `100 USD` + + + + + + + + + + +
USD Settlement Acc. USD (Asset) Liquidity Acc.
+ + + + + + + + + +
DebitCredit
100
+
+ + + + + + + + + +
DebitCredit
100
+
+ +##### Depositing Peer Liquidity + +| Debit Account | Credit Account | +| ------------- | -------------- | +| Settlement | Peer Liquidity | + +- Example: peering relationship in USD, depositing `100 USD` + + + + + + + + + + +
USD Settlement Acc. Peer Liquidity Acc.
+ + + + + + + + + +
DebitCredit
100
+
+ + + + + + + + + +
DebitCredit
100
+
+ +##### Depositing Outgoing Payment Liquidity + +| Debit Account | Credit Account | +| ------------- | ---------------- | +| Settlement | Outgoing Payment | + +- Example: depositing `35 USD` + + + + + + + + + + +
USD Settlement Acc. Outgoing Payment Liquidity Acc.
+ + + + + + + + + +
DebitCredit
35
+
+ + + + + + + + + +
DebitCredit
35
+
+ +#### Withdrawals + +Action of debiting the liquidity account, and crediting the settlement account. + +##### Withdrawing Asset Liquidity + +| Debit Account | Credit Account | +| --------------- | -------------- | +| Asset Liquidity | Settlement | + +- Example: withdrawing `50 USD` + + + + + + + + + + +
USD (Asset) Liquidity Acc.USD Settlement Acc.
+ + + + + + + + + +
DebitCredit
50
+
+ + + + + + + + + +
DebitCredit
50
+
+ +##### Withdrawing Peer Liquidity + +| Debit Account | Credit Account | +| -------------- | -------------- | +| Peer Liquidity | Settlement | + +- Example: peering relationship in USD, withdrawing `50 USD` + + + + + + + + + + +
Peer Liquidity Acc.USD Settlement Acc.
+ + + + + + + + + +
DebitCredit
50
+
+ + + + + + + + + +
DebitCredit
50
+
+ +##### Withdrawing Wallet Address Liquidity (example: 2 USD) + +| Debit Account | Credit Account | +| -------------- | -------------- | +| Wallet Address | Settlement | + +- Example: withdrawing `2 USD` + + + + + + + + + + +
Wallet Address Liquidity Acc.USD Settlement Acc.
+ + + + + + + + + +
DebitCredit
2
+
+ + + + + + + + + +
DebitCredit
2
+
+ +##### Withdrawing Incoming Payment Liquidity + +| Debit Account | Credit Account | +| ---------------- | -------------- | +| Incoming Payment | Settlement | + +- Example: withdrawing `25 USD` + + + + + + + + + + +
Incoming Payment Liquidity Acc.USD Settlement Acc.
+ + + + + + + + + +
DebitCredit
25
+
+ + + + + + + + + +
DebitCredit
25
+
+ +##### Withdrawing Outgoing Payment Liquidity + +| Debit Account | Credit Account | +| ---------------- | -------------- | +| Outgoing Payment | Settlement | + +- Example: withdrawing `1 USD` + + + + + + + + + + +
Outgoing Payment Liquidity Acc.USD Settlement Acc.
+ + + + + + + + + +
DebitCredit
1
+
+ + + + + + + + + +
DebitCredit
1
+
+ +#### Payments (Same Asset) + +##### Simple Payment Setup Protocol (SPSP) / Web Monetization + +| Debit Account | Credit Account | +| ---------------- | -------------- | +| Outgoing Payment | Wallet Address | + +- Example: Send a Web Monetization Payment of `2 USD` over SPSP to a wallet address. Sender and receiver have wallet addresses at the same Rafiki. + + + + + + + + + + +
Outgoing Payment Liquidity Acc.Wallet Address Liquidity Acc.
+ + + + + + + + + +
DebitCredit
2
+
+ + + + + + + + + +
DebitCredit
2
+
+ +##### Send Amount < Receive Amount + +| Debit Account | Credit Account | +| ---------------- | ---------------- | +| Outgoing Payment | Incoming Payment | +| Asset Liquidity | Incoming Payment | + +- Example: Sender consented to a payment of `14 USD` but quote promised to deliver `15 USD`. + + + + + + + + + + + + +
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
+ + + + + + + + + +
DebitCredit
14
+
+ + + + + + + + + +
DebitCredit
1
+
+ + + + + + + + + +
DebitCredit
15
+
+ +##### Send Amount > Receive Amount + +| Debit Account | Credit Account | +| ---------------- | ---------------- | +| Outgoing Payment | Incoming Payment | +| Outgoing Payment | Asset Liquidity | + +- Example: Sender consented to a payment of `15 USD` but quote promised to deliver `14 USD`. + + + + + + + + + + + + +
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
+ + + + + + + + + +
DebitCredit
15
+
+ + + + + + + + + +
DebitCredit
1
+
+ + + + + + + + + +
DebitCredit
14
+
+ +#### Payments (Cross Currency) + +| Debit Account | Credit Account | Asset | +| ---------------- | ---------------- | ----- | +| Outgoing Payment | Asset Liquidity | `ABC` | +| Asset Liquidity | Incoming Payment | `XYZ` | + +- Example: Outgoing payment for `10 USD`, incoming payment receives `9 EUR`. + + + + + + + + + + + + + + + + + + +
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.
+ + + + + + + + + +
DebitCredit
10
+
+ + + + + + + + + +
DebitCredit
10
+
EUR (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
+ + + + + + + + + +
DebitCredit
9
+
+ + + + + + + + + +
DebitCredit
9
+
+ +##### SPSP / Web Monetization + +| Debit Account | Credit Account | Asset | +| ---------------- | --------------- | ----- | +| Outgoing Payment | Asset Liquidity | `ABC` | +| Asset Liquidity | Wallet Address | `XYZ` | + +- Example: Outgoing payment for `2 USD`, wallet address receives `1 EUR`. + + + + + + + + + + + + + + + + + + +
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.
+ + + + + + + + + +
DebitCredit
2
+
+ + + + + + + + + +
DebitCredit
2
+
EUR (Asset) Liquidity Acc.Wallet Address Liquidity Acc.
+ + + + + + + + + +
DebitCredit
1
+
+ + + + + + + + + +
DebitCredit
1
+
+ +### Interledger + +Sender and receiver do not have wallet addresses at the same Rafiki instance. + +#### Sending Connector + +##### Same asset + +| Debit Account | Credit Account | +| ---------------- | -------------- | +| Outgoing Payment | Peer Liquidity | + +- Example: Sender creates an outgoing payment for `100 USD` to an incoming payment at a peer's Rafiki instance. The peering relationship is in USD. + + + + + + + + + + +
Outgoing Payment Liquidity Acc.Peer Liquidity Acc.
+ + + + + + + + + +
DebitCredit
100
+
+ + + + + + + + + +
DebitCredit
100
+
+ +##### Cross currency + +| Debit Account | Credit Account | Asset | +| ---------------- | --------------- | ----- | +| Outgoing Payment | Asset Liquidity | ABC | +| Asset Liquidity | Peer Liquidity | XYZ | + +- Example: Sender creates an outgoing payment for 100 USD to an incoming payment at a peer's Rafiki instance. The peering relationship is in EUR, so payment is converted on the sending side. + + + + + + + + + + + + + + + + + + +
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.
+ + + + + + + + + +
DebitCredit
100
+
+ + + + + + + + + +
DebitCredit
100
+
EUR (Asset) Liquidity Acc.Peer Liquidity Acc.
+ + + + + + + + + +
DebitCredit
90
+
+ + + + + + + + + +
DebitCredit
90
+
+ +#### Receiving Connector + +##### Same asset + +| Debit Account | Credit Account | +| -------------- | ---------------- | +| Peer Liquidity | Incoming Payment | + +- Example: An incoming payment receives `100 USD` from an outgoing payment at a peer's Rafiki instance. + + + + + + + + + + +
Peer Liquidity Acc.Incoming Payment Liquidity Acc.
+ + + + + + + + + +
DebitCredit
100
+
+ + + + + + + + + +
DebitCredit
100
+
+ +###### SPSP / Web Monetization + +| Debit Account | Credit Account | +| -------------- | -------------- | +| Peer Liquidity | Wallet Address | + +- Example: A wallet address receives `2 USD` from an ILP payment at a peer's Rafiki instance. + + + + + + + + + + +
Peer Liquidity Acc.Wallet Address Liquidity Acc.
+ + + + + + + + + +
DebitCredit
2
+
+ + + + + + + + + +
DebitCredit
2
+
+ +##### Cross currency + +| Debit Account | Credit Account | Asset | +| --------------- | ---------------- | ----- | +| Peer Liquidity | Asset Liquidity | `ABC` | +| Asset Liquidity | Incoming Payment | `XYZ` | + +- Example: A Rafiki instance receives `10 USD` from a peer (peering relationship in USD) to be deposited in an incoming payment liquidity account denominated in EUR. The payment is converted to EUR and deposited. + + + + + + + + + + + + + + + + + + +
Peer Liquidity Acc.USD (Asset) Liquidity Acc.
+ + + + + + + + + +
DebitCredit
10
+
+ + + + + + + + + +
DebitCredit
10
+
EUR (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
+ + + + + + + + + +
DebitCredit
9
+
+ + + + + + + + + +
DebitCredit
9
+
+ +###### SPSP / Web Monetization + +| Debit Account | Credit Account | Asset | +| --------------- | --------------- | ----- | +| Peer Liquidity | Asset Liquidity | `ABC` | +| Asset Liquidity | Wallet Address | `XYZ` | + +- Example: A Rafiki instance receives `10 USD` from a peer (peering relationship in USD) to be deposited in a wallet address liquidity account denominated in EUR. The payment is converted to EUR and deposited. + + + + + + + + + + + + + + + + + + +
Peer Liquidity Acc.USD (Asset) Liquidity Acc.
+ + + + + + + + + +
DebitCredit
2
+
+ + + + + + + + + +
DebitCredit
2
+
EUR (Asset) Liquidity Acc.Wallet Address Liquidity Acc.
+ + + + + + + + + +
DebitCredit
1
+
+ + + + + + + + + +
DebitCredit
1
+
+ +#### Connector + +##### Same asset + +| Debit Account | Credit Account | +| -------------- | -------------- | +| Peer Liquidity | Peer Liquidity | + +- Example: Rafiki forwards `10 USD` from peer A to peer B. + + + + + + + + + + +
Peer A Liquidity Acc.Peer B Liquidity Acc.
+ + + + + + + + + +
DebitCredit
10
+
+ + + + + + + + + +
DebitCredit
10
+
+ +##### Cross currency + +| Debit Account | Credit Account | Asset | +| --------------- | --------------- | ----- | +| Peer Liquidity | Asset Liquidity | `ABC` | +| Asset Liquidity | Peer Liquidity | `XYZ` | + +- Example: Rafiki receives `100 USD` from peer A and forwards 90 EUR to peer B. + + + + + + + + + + + + + + + + + + +
Peer A Liquidity Acc.USD (Asset) Liquidity Acc.
+ + + + + + + + + +
DebitCredit
100
+
+ + + + + + + + + +
DebitCredit
100
+
EUR (Asset) Liquidity Acc.Peer B Liquidity Acc.
+ + + + + + + + + +
DebitCredit
90
+
+ + + + + + + + + +
DebitCredit
90
+
+ +## Liquidity + +Rafiki implements a clearing protocol - the [Interledger Protocol](/reference/glossary#interledger-protocol). As such, it does not hold liquidity but keeps track of liquidity moving through it. + +### Types of Liquidity + +#### Asset Liquidity + +Asset Liquidity defines the amount of value, denominated in a given asset, Rafiki has at its disposal to send or forward ILP packets in. It increases if packets denominated in a given asset are received and decreases if packets denominated in a given asset are sent. It is always positive and cannot fall below 0. + +Account Servicing Entities should define and adjust the asset liquidity based on their liquidity risk profile. + +##### Example + +Rafiki has been configured with 2 assets, EUR and USD, both with an asset scale of 0. The EUR liquidity is 10, the USD liquidity if 50. + +In a cross-currency transaction, Rafiki receives packets worth 10 EUR and sends packets worth 11 USD. The EUR liquidity is increased to 20, the USD liquidity is reduced to 39. + +A transaction where Rafiki receives 50 EUR and would have to sent 55 USD would fail because Rafiki does not have enough USD liquidity. + +#### Peer Liquidity + +Peer Liquidity defines the line of credit, denominated in the asset of the peering relationship, that Rafiki gives a certain peer. It should be defined in the peering agreement and depends on the trust between the transacting peers. If peer liquidity is not sufficient, payments will not be processed. Once the peer liquidity is used up, peers should settle and then reset their peer liquidity. + +##### Example + +A configured peer _Cloud Nine Wallet_ within Rafiki has a peer liquidity of 100 USD. Rafiki can send packets up to 100 USD to wallet addresses issued by _Cloud Nine Wallet_. Once that liquidity is used up, we should settle with _Cloud Nine Wallet_ and then reset their liquidity to 100 USD. + +#### Payment Liquidity + +When Open Payments incoming or outgoing payments are created, a liquidity account is created within the accounting database. Liquidity needs to be deposited to an outgoing payment before the payment can be processed. The Account Servicing Entity is notified to deposit liquidity via the `outgoing_payment.created` event. Similarly, packets that are received for an incoming payment increase its liquidity. The Account Servicing Entity is notified to withdraw that liquidity via the `incoming_payment.completed` event. + +### Depositing and Withdrawing Liquidity + +> **Note:** The `idempotencyKey` must be provided whenever calling mutations dealing with liquidity. +> This key allows safely retrying requests, without performing the operation multiple times. +> This should be a unique key (typically, a V4 UUID). For more information on Rafiki's idempotency, [see more](/apis/idempotency). + +#### Asset Liquidity + +Deposit and withdraw asset liquidity via the Admin API (or UI): + +```graphql +mutation DepositAssetLiquidity($input: DepositAssetLiquidityInput!) { + depositAssetLiquidity(input: $input) { + code + success + message + error + } +} +``` + +where + +```json +{ + "input": { + "id": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "assetId": "7b8b0f65-896d-4403-b7ba-2e24bf20eb35", + "amount": "100", + "idempotencyKey": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f" + } +} +``` + +and + +```graphql +mutation CreateAssetLiquidityWithdrawal( + $input: CreateAssetLiquidityWithdrawalInput! +) { + createAssetLiquidityWithdrawal(input: $input) { + code + success + message + error + } +} +``` + +where + +```json +{ + "input": { + "id": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "assetId": "7b8b0f65-896d-4403-b7ba-2e24bf20eb35", + "amount": "100", + "idempotencyKey": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "timeoutSeconds": 0 + } +} +``` + +See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. + +#### Peer Liquidity + +Deposit and withdraw peer liquidity via the Admin API (or UI): + +```graphql +mutation DepositPeerLiquidity($input: DepositPeerLiquidityInput!) { + depositPeerLiquidity(input: $input) { + code + success + message + error + } +} +``` + +where + +```json +{ + "input": { + "id": "a09b730d-8610-4fda-98fa-ec7acb19c775", + "peerId": "73158598-2e0c-4973-895e-aebd115af260", + "amount": "1000000", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775", + "timeoutSeconds": 0 + } +} +``` + +and + +```graphql +mutation CreatePeerLiquidityWithdrawal( + $input: CreatePeerLiquidityWithdrawalInput! +) { + createPeerLiquidityWithdrawal(input: $input) { + code + success + message + error + } +} +``` + +where + +```json +{ + "input": { + "id": "421fae87-9a59-4217-9ff8-faf55ffab9c6", + "peerId": "73158598-2e0c-4973-895e-aebd115af260", + "amount": "100", + "timeoutSeconds": 0 + } +} +``` + +See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. + +#### Payment Liquidity + +##### Outgoing payment + +Deposit and withdraw outgoing payment liquidity via the Admin API only: + +```graphql +mutation DepositOutgoingPaymentLiquidity( + $input: DepositOutgoingPaymentLiquidityInput! +) { + depositOutgoingPaymentLiquidity(input: $input) { + code + error + message + success + } +} +``` + +where + +```json +{ + "input": { + "outgoingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" + } +} +``` + +and + +```graphql +mutation CreateOutgoingPaymentWithdrawal( + $input: CreateOutgoingPaymentWithdrawalInput! +) { + createOutgoingPaymentWithdrawal(input: $input) { + code + error + message + success + } +} +``` + +where + +```json +{ + "input": { + "outgoingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775", + "timeoutSeconds": 0 + } +} +``` + +See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. + +##### Incoming payment + +Withdraw incoming payment liquidity via the Admin API only: + +```graphql +mutation CreateIncomingPaymentWithdrawal( + $input: CreateIncomingPaymentWithdrawalInput! +) { + createIncomingPaymentWithdrawal(input: $input) { + code + error + message + success + } +} +``` + +where + +```json +{ + "input": { + "incomingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775", + "timeoutSeconds": 0 + } +} +``` + +See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. + +### `PostLiquidityWithdrawal` or `VoidLiquidityWithdrawal` + +`PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` are only applicable for two-phase withdrawals. + +- `PostLiquidityWithdrawal` - Post liquidity withdrawal. Withdrawals with `> 0` timeouts are two-phase transfers and are committed via this mutation. +- `VoidLiquidityWithdrawal` - Void liquidity withdrawal. Withdrawals with `> 0` timeouts are two-phase transfers and are rolled back via this mutation. + +When a withdrawal liquidity transaction is requested with a non-zero `timeout` value _(Zero denotes absence of timeout)_, +the transfer will be created as a two-phase transfer [see more](https://en.wikipedia.org/wiki/Two-phase_commit_protocol) + +If the timeout interval passes before the transfer is either posted or voided, the transfer expires and the full amount is returned to the original account. +Note that timeouts are given as intervals, specified in seconds, rather than as absolute timestamps. + +The following withdrawal payments support two-phase transfers: + +- Asset Liquidity Withdrawal +- Wallet Address Withdrawal +- Peer Liquidity Withdrawal +- Incoming Payment Withdrawal +- Outgoing Payment Withdrawal + +#### PostLiquidityWithdrawal + +```graphql +mutation PostLiquidityWithdrawal($input: PostLiquidityWithdrawalInput!) { + postLiquidityWithdrawal(input: $input) { + code + error + message + success + } +} +``` + +where + +```json +{ + "input": { + "withdrawalId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" + } +} +``` + +#### VoidLiquidityWithdrawal + +```graphql +mutation VoidLiquidityWithdrawal($input: VoidLiquidityWithdrawalInput!) { + voidLiquidityWithdrawal(input: $input) { + code + error + message + success + } +} +``` + +where + +```json +{ + "input": { + "withdrawalId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" + } +} +``` + +## TigerBeetle + +TigerBeetle is a distributed financial accounting database designed for mission critical safety and performance. Since Rafiki implements the [Interledger Protocol](/reference/glossary#interledger-protocol), which splits payments into packets, we need a high performing and safe database to store all that payment data. For detailed information on TigerBeetle, including its consensus mechanism and its limitations, visit the official TigerBeetle [documentation](https://docs.tigerbeetle.com/) and [blog](https://tigerbeetle.com/blog/). + +Rafiki uses a combination of liquidity and settlement accounts to perform double-entry accounting. These accounts correspond to TigerBeetle credit and debit accounts, respectively. For more information on Rafiki's accounting, refer to [Accounts and Transfers](/concepts/accounting/accounts-and-transfers). Note that TigerBeetle only holds balance data and not any other additional metadata included in ILP packets. + +### Changing TigerBeetle Version within Rafiki + +#### Updating the node client + +```sh +# latest +pnpm --filter backend up tigerbeetle-node --latest + +# specific version +pnpm --filter backend up tigerbeetle-node@0.15.4 +``` + +#### Production Environment - Helm charts + +To use the desired version of TigerBeetle within the production environment, change the tag in the [helm `values.yaml` file](https://github.com/interledger/rafiki/blob/main/infrastructure/helm/tigerbeetle/values.yaml). + +#### Local Environment + +To use the desired version of TigerBeetle within the local environment, change the tag in the [tigerbeetle `docker-compose.yml` file](https://github.com/interledger/rafiki/blob/main/localenv/tigerbeetle/docker-compose.yml). + +#### Tests + +To use the desired version of TigerBeetle within the Rafiki tests, change the tag in the [tigerbeetle test setup](https://github.com/interledger/rafiki/blob/main/packages/backend/src/tests/tigerbeetle.ts). diff --git a/packages/documentation/src/content/docs/components/architecture.mdx b/packages/documentation/src/content/docs/components/architecture.mdx new file mode 100644 index 0000000000..1337e5957f --- /dev/null +++ b/packages/documentation/src/content/docs/components/architecture.mdx @@ -0,0 +1,18 @@ +--- +title: Architecture +--- + +![Architecture diagram](/img/rafiki-architecture.png) + +Rafiki is a collection of three services that are run together; each one can be scaled horizontally. These services are + +- [`backend`](https://github.com/interledger/rafiki/tree/main/packages/backend): The main service, handling business logic and external communication. +- [`auth`](https://github.com/interledger/rafiki/tree/main/packages/auth): The service used for Grant Authorization and authentication. Rafiki provides this as a reference implementation, with the understanding that Rafiki operators can use and deploy their own service for authorization and authentication. +- [`frontend`](https://github.com/interledger/rafiki/tree/main/packages/frontend): An internal admin interface for Rafiki operators to manage their Rafiki instance. + +These services rely on four databases: + +- A postgres database used by the `backend` +- A separate postgres database used by `auth`. +- [TigerBeetle](https://github.com/coilhq/tigerbeetle) used by `backend` for accounting balances at the ILP layer. +- Redis used by `backend` as a cache to share STREAM connection details across processes and `auth` to store session data. diff --git a/packages/documentation/src/content/docs/concepts/interledger-protocol/peering.md b/packages/documentation/src/content/docs/components/interledger.mdx similarity index 71% rename from packages/documentation/src/content/docs/concepts/interledger-protocol/peering.md rename to packages/documentation/src/content/docs/components/interledger.mdx index de7994149b..dc8f90035a 100644 --- a/packages/documentation/src/content/docs/concepts/interledger-protocol/peering.md +++ b/packages/documentation/src/content/docs/components/interledger.mdx @@ -1,14 +1,69 @@ --- -title: Peering +title: Interledger --- -## What is a peer / a peering relationship? +Interledger is a protocol for sending packets of money across different payment networks or ledgers. For more details, see the [documentation](https://interledger.org/developers/get-started/) and the [specification](https://interledger.org/developers/rfcs/interledger-protocol/). + +## Connector + +The [`backend`](/introduction/architecture#backend) includes an [Interledger](/reference/glossary#interledger-protocol) connector for sending and receiving [STREAM](/reference/glossary#stream) packets. + +The amounts of these packets are used to update account balances in [TigerBeetle](/reference/glossary#tigerbeetle). (See [Accounts and Transfers](/concepts/accounting/accounts-and-transfers)) + +Amounts are adjusted based on the destination/outgoing account's asset and Rafiki's configured exchange [rates service](/integration/getting-started#exchange-rates). + +### Packet Origination + +The connector receives incoming ILP packets via: + +- HTTP +- direct calls from within the `backend` + +#### Incoming HTTP + +The `backend` includes an HTTP server listening on the configured [`CONNECTOR_PORT`](/integration/deployment#backend). + +An incoming ILP packet over HTTP is only accepted if it is from a configured [peer](/concepts/interledger-protocol/peering) and accompanied by the peer's incoming HTTP `authToken`. + +#### Backend + +The `backend` includes services for managing [Open Payments](/reference/glossary#open-payments) [quotes](https://docs.openpayments.guide/reference/create-quote) and [outgoing payments](https://docs.openpayments.guide/reference/create-outgoing-payment). Each of these calls the connector in order to send ILP packets. Quoting sends unfulfillable rate probe packets. Outgoing payments send packets as a part of executing the payment. + +These calls to the connector are actually made by calling `makeIlpPlugin` and passing the plugin to the [`@interledger/pay`](https://github.com/interledgerjs/interledgerjs/tree/master/packages/pay) library. + +### Packet Destination + +An ILP packet may either terminate at the local Rafiki's STREAM server or continue on to a peer via HTTP. + +#### Local STREAM Server + +The connector attempts to extract and decode the payment tag from a received ILP packet's destination address. If it is successfully able to match the tag with a locally managed [Open Payments](/reference/glossary#open-payments) [wallet address](/reference/glossary#wallet-address) or [incoming payment](https://docs.openpayments.guide/reference/create-incoming-payment), it will not forward the packet. The connector will credit the corresponding balance as well as track the total amount received for the STREAM connection in [Redis](/introduction/architecture) in order to support [STREAM receipts](https://interledger.org/rfcs/0039-stream-receipts/). + +Packets addressed to a wallet address happen via [SPSP](/reference/glossary#wallet-address). + +#### Outgoing HTTP + +If the ILP packet's destination address corresponds to a configured [peer](/concepts/interledger-protocol/peering), the connector will forward the packet to the peer over HTTP along with the peer's configured HTTP `authToken`. + +### Packet Rejection + +The connector may reject a packet with a corresponding [ILP error code](https://interledger.org/rfcs/0027-interledger-protocol-4/#error-codes) due to a number of reasons: + +- invalid packet +- insufficient liquidity +- rate limit exceeded +- amount exceeding `maxPacketAmount` +- expired packet + +## Peering + +### What is a peer / a peering relationship? A peer is a counterparty that a given party transacts with. Within the Interledger Protocol, connectors maintain peers, or counterparty connectors whom they transact with. The Interledger network is a graph of nodes (connectors) that have peered with one another by establishing a means of exchanging ILP packets and a means of paying one another for the successful forwarding and delivery of the packets. A connector may extend a given peer a limited line of credit, or none at all, depending upon their trustworthiness. Rafiki includes an implementation of such a connector. -## What are the requirements for peering? +### What are the requirements for peering? Both counterparties need to @@ -23,13 +78,13 @@ Additionally, the two counterparties need to agree on a settlement mechanism. Ho Note that two counterparties could have multiple peering relationships that differ in e.g. the underlying asset. -## How to peer two Rafiki instances? +### How to peer two Rafiki instances? -### Using the Admin Dashboard +#### Using the Admin Dashboard Once the [`frontend`](https://github.com/interledger/rafiki/blob/main/packages/frontend) project is running (typically as part of the [local environment](https://github.com/interledger/rafiki/blob/main/localenv)), you can navgiate to the Peers page, and then press the Create Peer button. You will be prompted to enter the peer information such as the peer's static ILP address, as well as the corresponding HTTP info. -### Using the Admin API +#### Using the Admin API This section describes the process for setting up peering between two Rafiki instances using the [Admin API](/integration/management). The examples are given for one instance, the other instance would have to run the corresponding API calls. @@ -41,7 +96,7 @@ Assume the following peering relationship Note that each GraphQL request has two parts: a _query_ and an object containing _query variables_. -### Create Asset +#### Create Asset Query: @@ -90,7 +145,7 @@ Example Successful Response } ``` -### Create Peer +#### Create Peer Query: @@ -159,7 +214,7 @@ Example Successful Response } ``` -### Deposit Peer Liquidity +#### Deposit Peer Liquidity Query: @@ -203,11 +258,11 @@ Example successful response: } ``` -### Withdraw Peer Liquidity +#### Withdraw Peer Liquidity This is a two-phase transaction, so the withdrawal needs to be created first and then posted (i.e. the Account Servicing Entity commits to the withdrawal). This way, the Account Servicing Entity can safely perform withdrawals in their internal system before posting in Rafiki. If the internal withdrawal failed or an error was made when creating the withdrawal in Rafiki, it can be voided rather than posted. -#### Create Withdrawal +##### Create Withdrawal Query: @@ -251,7 +306,7 @@ Example successful response: } ``` -#### Post Withdrawal +##### Post Withdrawal Query: @@ -289,7 +344,7 @@ Example successful response: } ``` -#### Void Withdrawal +##### Void Withdrawal Query: @@ -327,7 +382,7 @@ Example successful response: } ``` -## Auto-peering +### Auto-peering Additionally, certain peers will have _auto-peering_ available. This feature is only for sandbox environments, and should not be used in production environments. Auto-peering enables easier peering integration between Rafiki instances. In order to use this feature, it requires the peer you want to peer with to publish an "auto-peering" URL. Once this `peerUrl` is provided, instead of using `createPeer` mutation to create a peer, you can call `createOrUpdatePeerByUrl`: @@ -364,7 +419,7 @@ with the input being: Calling this mutation will exchange ILP peering information (`staticIlpAddress` `ilpConnectorUrl`, auth tokens) automatically. The instance being peered with will issue a default amount of liquidity, and you can begin sending payments to wallet addresses at the other Rafiki instance. -### Prerequisites +#### Prerequisites Before making the `createOrUpdatePeerByUrl` request, a few `backend` environment variables about your Rafiki instance need to be configured: @@ -372,7 +427,7 @@ Before making the `createOrUpdatePeerByUrl` request, a few `backend` environment 2. `ILP_CONNECTOR_URL`: The full address of the ILP connector that will receive ILP packets. Locally and by default, it is on `0.0.0.0:3002`. 3. `INSTANCE_NAME`: The name of your Rafiki instance. This is how your peer will identify you. -### How to enable auto-peering +#### How to enable auto-peering :::caution Auto-peering should _not_ be enabled in production environments. Only enable this feature in sandbox environments. diff --git a/packages/documentation/src/content/docs/concepts/open-payments/key-registry.md b/packages/documentation/src/content/docs/components/open-payments.mdx similarity index 51% rename from packages/documentation/src/content/docs/concepts/open-payments/key-registry.md rename to packages/documentation/src/content/docs/components/open-payments.mdx index ea43328f42..650e77fb66 100644 --- a/packages/documentation/src/content/docs/concepts/open-payments/key-registry.md +++ b/packages/documentation/src/content/docs/components/open-payments.mdx @@ -1,22 +1,30 @@ --- -title: Key Registry +title: Open Payments --- -## Sequence Diagram +Open Payments is an API standard that allows third-parties/clients to initiate payments and to view the transaction history on the account holder's account (with the account holder's consent). Extensive documentation can be found on the [Open Payments website](https://openpayments.guide). + +Rafiki implements the Open Payments APIs. Every request and response is validated against the [Open Payments API specification](https://github.com/interledger/open-payments/tree/main/openapi). + +To update the API specification, create a Pull Request on the [Open Payments GitHub Repository](https://github.com/interledger/open-payments/). Changes will automatically be pushed to [Readme](https://readme.com/), which hosts the [API reference](https://docs.openpayments.guide/reference/) on the [Open Payments website](https://openpayments.guide). + +## Key Registry + +### Sequence Diagram ![Key registry diagram](/img/key-registry-diagram.png) -## Basics +### Basics -### What is the key registry? +#### What is the key registry? A key registry is a list of keys stored by a client that requires access to Open Payments resources protected by an authorization server (AS). A key is generated and added to the registry by a client and the client is represented by a [wallet address](/reference/glossary#wallet-address). The wallet address's associated key registry is exposed publically at the path `WALLET_ADDRESS/jwks.json` in anticipation of a grant request on an AS. -### What is the purpose of the key registry? +#### What is the purpose of the key registry? The key registry allows an AS to verify that a client is who they say they are. Because a grant request is completed over multiple signed HTTP requests it is thus important for a client to provide a way to consistently identify itself across these requests to the AS. -### How is this achieved? +#### How is this achieved? The client will generate an asymmetric key pair, which should include a key id identifying them. When the client makes a grant request, it should include a signature in the header signed by the private key and a `Signature-Input` header that, among other things, should include the key id of the public key associated with the private key used to sign the signature. @@ -24,9 +32,9 @@ When the AS receives a signed grant request, it first acquires the key registry Once the AS has acquired the client's key registry, it searches for the public key with a key id that matches the one included in the `Signature-Input` header. Once it finds it, the public key will be used to decrypt and verify the signature. Then the AS will proceed with the grant request. -## JWK +### JWK -### Key Structure +#### Key Structure A key registry should expose public keys in the form of a JWK. They should be generated using the `ed25519` algorithm, and the resultant JWK should have fields with the following values: @@ -42,15 +50,15 @@ A key registry should expose public keys in the form of a JWK. They should be ge The private key should be used to sign the payload described in the httpsig signature method. -## Signature +### Signature -### Signature Method +#### Signature Method The signature is formatted and verified using the [httpbis-message-signature](https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-message-signatures-16) method. In general, a request secured with the `httpsig` method contains two headers, the `Signature` and the `Signature-Input`. The `Signature` is data signed by the algorithm specified in the JWK, and the signature input is a comma-separated list of headers that map to values in the data that was signed. These values should match the values provided in the headers of a signed GNAP request. -### Signature Base +#### Signature Base The components of the signature base correspond to components of the HTTP request that it is supposed to sign, as described in the [GNAP core protocol](https://datatracker.ietf.org/doc/html/draft-ietf-gnap-core-protocol#section-7.3.1). @@ -72,7 +80,7 @@ If the request has an authorization header: Each component should be on a separate line. The component name should be in quotes, followed by a colon, then a space, then the value of the component. -#### Signature Base Example +##### Signature Base Example ```http "@method": POST @@ -86,10 +94,38 @@ Each component should be on a separate line. The component name should be in quo ;keyid="gnap-rsa" ``` -### Signature Input Example +#### Signature Input Example ```http Signature-Input: sig1=("@method" "@target-uri" "content-digest" \ "content-length" "content-type");created=1618884473\ ;keyid="gnap-rsa";nonce="NAOEJF12ER2";tag="gnap" ``` + +## Grant Interaction Flow + +import { LargeImg } from '@interledger/docs-design-system' + +### Sequence Diagram + + + +### Endpoints + +If the AS deems interaction necessary to issue a grant, there are five main endpoints that are used once a pending grant has been created. In each endpoint, the specific interaction is identified with an interaction id and an interaction nonce. Both of these are provided in the query parameters of the URL when the authorization server redirects to the Identity Provider. The endpoints, in order of their calling, are as follows: + +- `GET /interact/:id/:nonce` (made by the client to the AS, establishes an interaction session, redirects browser session to IDP consent screen) +- `GET /grant/:id/:nonce` (made by the IDP to the AS, secured with `x-idp-secret` header, returns grant info for the consent screen to enumerate ) + - **This is served on INTERACTION_PORT and its default value is 3009** +- `POST /grant/:id/:nonce/(accept OR reject)` (made by the IDP to the AS, secured with `x-idp-secret` header, accepts or rejects the grant based on the user's input on the consent screen. **IDP then redirects to `GET /interact/:id/:nonce/finish`**) + - **This is served on INTERACTION_PORT and its default value is 3009** +- `GET /interact/:id/:nonce/finish` (ends the interaction established by `GET /interact/:id/:nonce`, redirects browser session to client callback. Contains a query param that either indicates a failure, or on success, a `hash` parameter that the client can use to verify the successful interaction, and the `interact_ref` that identifies the interaction on the AS.) + - Examples include: - `?result=grant_rejected` (if interaction was rejected) - `?result=grant_invalid` (if grant is not in a state where it may be accepted or rejected, e.g. already approved) - `?hash=p28jsq0Y2KK3WS__a42tavNC64ldGTBroywsWxT4md_jZQ1R\HZT8BOWYHcLmObM7XHPAdJzTZMtKBsaraJ64A +&interact_ref=4IFWWIKYBC2PQ6U56NL1` (if interaction was accepted) - `hash` is a `sha-256` hash of values provided by the client in the body of the [grant initialization request](https://docs.openpayments.guide/reference/post-request) (`interact.finish.nonce`), values returned in the AS response for that request (`interact.finish`), the `interact_ref` provided alongside the `hash`, and the uri of the grant initialization request (`https://auth-server.com/`). +- `POST /continue/:id` ([this should still be accurate](https://docs.openpayments.guide/reference/post-continue), final back-channel request made by client if interaction was successful, AS responds with an access token) + +#### On `x-idp-secret` + +`x-idp-secret` is the name of a header that is used for `GET /grant/:id/:nonce`, `POST /grant/:id/:nonce/accept`, and `POST /grant/:id/:nonce/reject` requests. Its purpose is to secure communications between the IDP and the AS and its value should be a shared secret known to both entities. + +To set this up, set the `IDENTITY_SERVER_SECRET` on the AS environment to a value that is also used to configure the IDP's requests to the AS. diff --git a/packages/documentation/src/content/docs/components/telemetry.mdx b/packages/documentation/src/content/docs/components/telemetry.mdx new file mode 100644 index 0000000000..3227f2c7d2 --- /dev/null +++ b/packages/documentation/src/content/docs/components/telemetry.mdx @@ -0,0 +1,227 @@ +--- +title: Telemetry +--- + +## Purpose + +The objective of the telemetry feature is to gather metrics and establish an infrastructure for visualizing valuable network insights. The metrics we at the Interledger Foundation collect include: + +- The total amount of money transferred via packet data within a specified time frame (daily, weekly, monthly). +- The number of transactions from outgoing payments that have been at least partially successful. +- The average amount of money held within the network per transaction. + +We aim to track the growth of the network in terms of transaction sizes and the number of transactions processed. Our goal is to use these data for our own insights and to enable [Account Servicing Entities](/reference/glossary#account-servicing-entity) (ASEs) to gain their own insights. + +## Privacy and Optionality + +Privacy is a paramount concern for us. Rafiki's telemetry feature is designed to provide valuable network insights without violating privacy or aiding malicious ASEs. For more information, please [read the privacy docs](/telemetry/privacy). + +The telemetry functionality is currently enabled by default on test (non-livenet) environments, i.e. any environment that is not dealing with real money. When active, it transmits metrics to the "testnet" collector. In the future, those ASEs operating in a production "livenet" environment (real money) will be able to opt-in to sharing their metrics with a "livenet" collector. Regardless of environment, Account Servicing Entities (ASEs) can also opt-out of telemetry completely. + +## Architecture + +The architecture of the telemetry feature is illustrated below: + +![Telemetry architecture](/img/telemetry-architecture.png) + +## OpenTelemetry + +We have adopted [OpenTelemetry](https://opentelemetry.io/) to ensure compliance with a standardized framework that is compatible with a variety of tool suites. This allows clients to use their preferred tools for data analysis, while Rafiki is instrumented and observable through a standardized metrics format. + +## Telemetry ECS Cluster + +The Telemetry Replica service is hosted on AWS ECS Fargate and is configured for availability and load balancing of custom ADOT (AWS Distro for Opentelemetry) Collector ECS tasks. + +When ASEs opt for telemetry, metrics are sent to our Telemetry Service. To enable ASEs to build their own telemetry solutions, instrumented Rafiki can send data to multiple endpoints. This allows the integration of a local [Otel collector](https://opentelemetry.io/docs/collector/) container that can support custom requirements. Metrics communication is facilitated through [gRPC](https://grpc.io/). + +## Otel SDK - Rafiki Instrumentation + +The Opentelemetry SDK is integrated into Rafiki to create, collect, and export metrics. The SDK integrates seamlessly with the OTEL Collector. + +## Prometheus - AMP + +We use Amazon's managed service for Prometheus (AMP) to collect data from the Telemetry cluster. + +**Note**: AMP offers limited configuration options and cannot crawl data outside of AWS. This limitation led us to adopt a push model, using prometheusRemoteWrite, instead of a pull model. For future development, we may consider hosting our own Prometheus. + +## Grafana - Grafana Cloud + +Grafana Cloud is used for data visualization dashboards. It offers multiple tools that extend Prometheus Promql. + +**Note**: We initially used Amazon hosted Grafana, but it did not meet our needs for embedding dashboards. Grafana Cloud offers a feature called “Public dashboards”, which allows us to share dashboards. However, embedding may still pose a challenge. + +## Exchange Rates + +For telemetry purposes, all amounts collected by instrumented Rafiki should be converted to a base currency. + +**Privacy Reasoning**: If only two ASEs are peered over a non-USD currency and we collect data in that currency, it would be easy to determine the volumes moved between those two ASEs. To maintain privacy, we convert all amounts to a base currency. + +If an ASE does not provide the necessary exchange rate for a transaction, the telemetry solution will still convert the amount to the base currency using external exchange rates. A Lambda function on AWS retrieves and stores these external exchange rates. It is triggered by a daily CloudWatch event and stores the rates in a public S3 Bucket. The S3 Bucket does not have versioning, and the data is overwritten daily to further ensure privacy. + +## Instrumentation + +Rafiki currently has three counter metrics. All data points (counter increases and histogram records) are exported to collection endpoints at a configurable interval (default recommended to 15s). + +Currently collected metrics: + +- `transactions_total` - Counter metric + - Description: “Count of funded transactions” + - This counter metric increases by 1 for each successfully sent transaction. +- `transactions_amount` - Counter metric + - Description: “Amount sent through the network”. + - This amount metric increases by the amount sent in each ILP packet. +- `transaction_fee_amounts` - Counter metric + - Description: “Fee amount sent through the network”. + - This fee amount metric increases by the (amount sent minus amount received) for an outgoing payment. +- `ilp_pay_time_ms` - Histogram metric + - Description: “Time to complete an ILP payment” + - This histogram metric records the time taken to make an ILP payment. + +**Note**: The current implementation only collects metrics on the SENDING side of a transaction. Metrics for external open-payments transactions RECEIVED by a Rafiki instance in the network are not collected. + +## Privacy + +Rafiki telemetry is designed with a strong emphasis on privacy. The system anonymizes user data and refrains from collecting identifiable information. Since transactions can originate from any user to a Rafiki instance, the privacy measures are implemented directly at the source (each Rafiki instance). This means that at the individual level, the data is already anonymous as single Rafiki instances service transactions for multiple users. + +### Differential Privacy and Local Differential Privacy + +Differential Privacy is a system for publicly sharing information about a dataset by describing the patterns of groups within the dataset while withholding information about individuals in the dataset. Local Differential Privacy (LDP) is a variant of differential privacy where noise is added to each individual's data point before it is sent to the server. This ensures that the server never sees the actual data, providing a strong privacy guarantee. + +### Rounding Technique and Bucketing + +In our implementation, we use a rounding technique that essentially aggregates multiple transactions into the same value, making them indistinguishable. This is achieved by dividing the transaction values into buckets and rounding the values to the nearest bucket. + +The bucket size is calculated based on the raw transaction value. For lower value transactions, which are expected to occur more frequently, the bucket sizes are determined linearly for higher granularity. However, after a certain threshold, the bucket size calculation switches to a logarithmic function to ensure privacy for higher value transactions, which are less frequent but pose greater privacy concerns. + +To handle outliers, a "clipping" technique is implemented, capping the buckets. Any value that exceeds a given threshold is placed in a single bucket. Conversely, any value that falls below a certain minimum is also placed in a single bucket. This ensures that both high and low outliers do not disproportionately affect the overall data, providing further privacy guarantees for these transactions. + +### Laplacian Distribution + +The Laplacian distribution is often used in differential privacy due to its double exponential decay property. This property ensures that a small change in the data will not significantly affect the probability distribution of the output, providing a strong privacy guarantee. + +To achieve Local Differential Privacy (LDP), noise is selected from the Laplacian distribution and added to the rounded values. The noise is generated based on a privacy parameter, which is calculated using the sensitivity of the function. + +The sensitivity of a function in differential privacy is the maximum amount that any single observation can change the output of the function. In this case, the sensitivity is considered to be the maximum of the rounded value and the bucket size. + +The privacy parameter is computed as one-tenth of the sensitivity. This parameter controls the trade-off between privacy and utility: a smaller privacy parameter means more privacy but less utility, and a larger privacy parameter means less privacy but more utility. + +The noise, selected from the Laplacian distribution, is then generated using this privacy parameter and added to the rounded value. If the resulting value is zero, it is set to half the bucket size to ensure that the noise does not completely obscure the transaction value. + +### Currency Conversion + +Another factor that obscures sensitive data is currency conversion. In cross-currency transactions, exchange rates are provided by [ASEs](/reference/glossary#account-servicing-entity) internally. As such, they cannot be correlated to an individual transaction. If the necessary rates are not provided or not available from the ASE, an external API for exchange rates is used. The obtained exchange rates are overwritten frequently in this case, with no versioning or history access. This introduces an additional layer of noise and further protects the privacy of the transactions. + +### References + +Rafiki's telemetry solution is a combination of techniques described in various white papers on privacy-preserving data collection. For more information, you can refer to the following papers: + +- [Local Differential Privacy for Human-Centered Computing](https://jwcn-eurasipjournals.springeropen.com/articles/10.1186/s13638-020-01675-8) +- [Collecting Telemetry Data Privately](https://www.microsoft.com/en-us/research/blog/collecting-telemetry-data-privately/) +- [Collecting Telemetry Data Privately - NeurIPS Publication](https://proceedings.neurips.cc/paper_files/paper/2017/file/253614bbac999b38b5b60cae531c4969-Paper.pdf) by Bolin Ding, Janardhan Kulkarni, Sergey Yekhanin from Microsoft Research. +- [RAPPOR: Randomized Aggregatable Privacy-Preserving Ordinal Response](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/42852.pdf) + +### Experimental Transaction Values when using the Algorithm + +The following table shows the values in the algorithm when running transactions for different amounts. The raw value increases as you go down the rows of the table. +(all values are in scale 4) +| Raw Value | Bucket Size | Rounded Value | Privacy Parameter | Laplace Noise | Final Value | +|-----------|-------------|---------------|-------------------|---------------|-------------| +| 8300 | 10000 | 10000 | 1000 | 2037 | 12037 | +| 13200 | 15000 | 15000 | 1500 | 1397 | 16397 | +| 147700 | 160000 | 160000 | 16000 | -27128 | 132872 | +| 1426100 | 2560000 | 2560000 | 256000 | -381571 | 2178429 | +| 1788200 | 2560000 | 2560000 | 256000 | 463842 | 3023842 | +| 90422400 | 10000000 | 90000000 | 1000000 | 2210649 | 92210649 | +| 112400400 | 10000000 | 100000000 | 1000000 | 407847 | 100407847 | +| 222290500 | 10000000 | 100000000 | 1000000 | -686149 | 99313851 | + +## Integrating + +Rafiki allows for integrating [Account Servicing Entities](/reference/glossary#account-servicing-entity) (ASE) to build their own telemetry solution based on the [OpenTelemetry](https://opentelemetry.io/) standardized metrics format that Rafiki exposes. + +In order to do so, the integrating ASE must deploy its own OpenTelemetry collector that should act as a sidecar container to Rafiki. It needs to provide the OpenTelemetry collector's ingest endpoint so that Rafiki can start sending metrics to it. + +### Rafiki Telemetry Environment Variables + +- `ENABLE_TELEMETRY`: boolean, defaults to `true`. Enables the telemetry service on Rafiki. +- `LIVENET`: boolean. Should be set to `true` on production environments dealing with real money. If it is not set, it will default to `false`, and metrics will get sent to the testnet otel-collector +- `OPEN_TELEMETRY_COLLECTOR_URLS`: CSV of URLs for Open Telemetry collectors (e.g., `http://otel-collector-NLB-e3172ff9d2f4bc8a.elb.eu-west-2.amazonaws.com:4317,http://happy-life-otel-collector:4317`). +- `OPEN_TELEMETRY_EXPORT_INTERVAL`: number in milliseconds, defaults to `15000`. Defines how often the instrumented Rafiki instance should send metrics. +- `TELEMETRY_EXCHANGE_RATES_URL`: string URL, defaults to `https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json`. It defines the endpoint that Rafiki will query for exchange rates, as a fallback when ASE does not [provide them](/integration/getting-started/#exchange-rates). If set, the response format of the external exchange rates API should be of type Rates, as the rates service expects. + The default endpoint set here points to a public S3 that has the previously mentioned required format, updated daily. + +### Example Docker OpenTelemetry Collector Image and Configuration + +Example of Docker OpenTelemetry Collector image and configuration that integrates with Rafiki and sends data to a Prometheus remote write endpoint: + +(it can be tested in our [Local Playground](/playground/overview) setup, by also providing the environment variables listed above to happy-life-backend in the [docker-compose](https://github.com/interledger/rafiki/blob/main/localenv/happy-life-bank/docker-compose.yml)) + +##### Docker-compose config: + +```yaml +#Serves as example for optional local collector configuration +happy-life-otel-collector: + image: otel/opentelemetry-collector-contrib:latest + command: ['--config=/etc/otel-collector-config.yaml', ''] + environment: + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID-''} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY-''} + volumes: + - ../collector/otel-collector-config.yaml:/etc/otel-collector-config.yaml + networks: + - rafiki + expose: + - 4317 + ports: + - '13132:13133' # health_check extension +``` + +##### OpenTelemetry OTEL collector config: + +[OTEL Collector config docs](https://opentelemetry.io/docs/collector/configuration/) + +```yaml +# Serves as example for the configuration of a local OpenTelemetry Collector that sends metrics to an AWS Managed Prometheus Workspace +# Sigv4auth required for AWS Prometheus Remote Write access (USER with access keys needed) + +extensions: + sigv4auth: + assume_role: + arn: 'arn:aws:iam::YOUR-ROLE:role/PrometheusRemoteWrite' + sts_region: 'YOUR-REGION' + +receivers: + otlp: + protocols: + grpc: + http: + cors: + allowed*origins: + - http://* + - https://\_ + +processors: + batch: + +exporters: + logging: + verbosity: 'normal' + prometheusremotewrite: + endpoint: 'https://aps-workspaces.YOUR-REGION.amazonaws.com/workspaces/ws-YOUR-WORKSPACE-IDENTIFIER/api/v1/remote_write' + auth: + authenticator: sigv4auth + +service: + telemetry: + logs: + level: 'debug' + metrics: + level: 'detailed' + address: 0.0.0.0:8888 + extensions: [sigv4auth] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [logging, prometheusremotewrite] +``` diff --git a/packages/documentation/src/content/docs/concepts/accounting/accounts-and-transfers.md b/packages/documentation/src/content/docs/concepts/accounting/accounts-and-transfers.md deleted file mode 100644 index 779f3bddb2..0000000000 --- a/packages/documentation/src/content/docs/concepts/accounting/accounts-and-transfers.md +++ /dev/null @@ -1,1027 +0,0 @@ ---- -title: Accounts and Transfers ---- - -## Accounts - -Rafiki uses a combination of liquidity and settlement accounts to perform [double-entry accounting](https://en.wikipedia.org/wiki/Double-entry_bookkeeping). - -### Liquidity account - -A liquidity account may only hold a positive balance. Rafiki enforces that its total debits MUST NOT exceed its total credits amount. - -There is one liquidity account for each of the following resource: - -- [Asset](/reference/glossary#asset) -- [Peer](/reference/glossary#peer) -- Wallet Address (for [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) / [Web Monetization](/reference/glossary#web-monetization) receiving) -- Incoming Payment -- Outgoing Payment - -Asset and Peer liquidity accounts are created when calling `createAsset` and `createPeer` [GraphQL Admin API mutations](/apis/backend/mutations) respectively, while liquidity accounts for wallet addresses, incoming and outgoing payments are created on-the-fly during payment processing or web monetization events. - -Any liquidity management is done by the [Account Servicing Entity](/reference/glossary#account-servicing-entity) through the GraphQL Admin API. See [webhook events](/integration/webhook-events) and [liquidity documentation](/concepts/accounting/liquidity) for more information. - -### Settlement account - -A settlement account may only hold a negative balance. Rafiki enforces that its total credits MUST NOT exceed its total debits amount. A settlement account represents those total amount of funds an [Account Servicing Entity](/reference/glossary#account-servicing-entity) has deposited into Rafiki. - -There is one settlement account for each asset. - -## Transfers - -Rafiki transfers perform double-entry accounting. Every transfer increases both the total debits of one account and the total credits of a second account by the same amount. - -### Intra-Rafiki - -Consider the following accounts referenced throughout the below documentation: - -- **USD Settlement Acc.** - USD asset settlement account (always zero or negative balance) -- **USD (Asset) Liquidity Acc.** - USD settlement account (always zero or positive balance) -- **Peer Liquidity Acc.** - USD asset counterparty liquidity account (always zero or positive balance) -- **Wallet Address Liquidity Acc.** - USD wallet address liquidity account (always zero or positive balance) -- **Incoming Payment Liquidity Acc.** - USD incoming payment liquidity account (always zero or positive balance) -- **Outgoing Payment Liquidity Acc.** - USD outgoing payment liquidity account (always zero or positive balance) - -#### Deposits - -Action of debiting the settlement account, and crediting the liquidity account. - -##### Depositing Asset Liquidity - -| Debit Account | Credit Account | -| ------------- | --------------- | -| Settlement | Asset Liquidity | - -- Example: depositing `100 USD` - - - - - - - - - - -
USD Settlement Acc. USD (Asset) Liquidity Acc.
- - - - - - - -
DebitCredit
100
-
- - - - - - - -
DebitCredit
100
-
- -##### Depositing Peer Liquidity - -| Debit Account | Credit Account | -| ------------- | -------------- | -| Settlement | Peer Liquidity | - -- Example: peering relationship in USD, depositing `100 USD` - - - - - - - - - - -
USD Settlement Acc. Peer Liquidity Acc.
- - - - - - - -
DebitCredit
100
-
- - - - - - - -
DebitCredit
100
-
- -##### Depositing Outgoing Payment Liquidity - -| Debit Account | Credit Account | -| ------------- | ---------------- | -| Settlement | Outgoing Payment | - -- Example: depositing `35 USD` - - - - - - - - - - -
USD Settlement Acc. Outgoing Payment Liquidity Acc.
- - - - - - - -
DebitCredit
35
-
- - - - - - - -
DebitCredit
35
-
- -#### Withdrawals - -Action of debiting the liquidity account, and crediting the settlement account. - -##### Withdrawing Asset Liquidity - -| Debit Account | Credit Account | -| --------------- | -------------- | -| Asset Liquidity | Settlement | - -- Example: withdrawing `50 USD` - - - - - - - - - - -
USD (Asset) Liquidity Acc.USD Settlement Acc.
- - - - - - - -
DebitCredit
50
-
- - - - - - - -
DebitCredit
50
-
- -##### Withdrawing Peer Liquidity - -| Debit Account | Credit Account | -| -------------- | -------------- | -| Peer Liquidity | Settlement | - -- Example: peering relationship in USD, withdrawing `50 USD` - - - - - - - - - - -
Peer Liquidity Acc.USD Settlement Acc.
- - - - - - - -
DebitCredit
50
-
- - - - - - - -
DebitCredit
50
-
- -##### Withdrawing Wallet Address Liquidity (example: 2 USD) - -| Debit Account | Credit Account | -| -------------- | -------------- | -| Wallet Address | Settlement | - -- Example: withdrawing `2 USD` - - - - - - - - - - -
Wallet Address Liquidity Acc.USD Settlement Acc.
- - - - - - - -
DebitCredit
2
-
- - - - - - - -
DebitCredit
2
-
- -##### Withdrawing Incoming Payment Liquidity - -| Debit Account | Credit Account | -| ---------------- | -------------- | -| Incoming Payment | Settlement | - -- Example: withdrawing `25 USD` - - - - - - - - - - -
Incoming Payment Liquidity Acc.USD Settlement Acc.
- - - - - - - -
DebitCredit
25
-
- - - - - - - -
DebitCredit
25
-
- -##### Withdrawing Outgoing Payment Liquidity - -| Debit Account | Credit Account | -| ---------------- | -------------- | -| Outgoing Payment | Settlement | - -- Example: withdrawing `1 USD` - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD Settlement Acc.
- - - - - - - -
DebitCredit
1
-
- - - - - - - -
DebitCredit
1
-
- -#### Payments (Same Asset) - -##### Simple Payment Setup Protocol (SPSP) / Web Monetization - -| Debit Account | Credit Account | -| ---------------- | -------------- | -| Outgoing Payment | Wallet Address | - -- Example: Send a Web Monetization Payment of `2 USD` over SPSP to a wallet address. Sender and receiver have wallet addresses at the same Rafiki. - - - - - - - - - - -
Outgoing Payment Liquidity Acc.Wallet Address Liquidity Acc.
- - - - - - - -
DebitCredit
2
-
- - - - - - - -
DebitCredit
2
-
- -##### Send Amount < Receive Amount - -| Debit Account | Credit Account | -| ---------------- | ---------------- | -| Outgoing Payment | Incoming Payment | -| Asset Liquidity | Incoming Payment | - -- Example: Sender consented to a payment of `14 USD` but quote promised to deliver `15 USD`. - - - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
- - - - - - - -
DebitCredit
14
-
- - - - - - - -
DebitCredit
1
-
- - - - - - - -
DebitCredit
15
-
- -##### Send Amount > Receive Amount - -| Debit Account | Credit Account | -| ---------------- | ---------------- | -| Outgoing Payment | Incoming Payment | -| Outgoing Payment | Asset Liquidity | - -- Example: Sender consented to a payment of `15 USD` but quote promised to deliver `14 USD`. - - - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
- - - - - - - -
DebitCredit
15
-
- - - - - - - -
DebitCredit
1
-
- - - - - - - -
DebitCredit
14
-
- -#### Payments (Cross Currency) - -| Debit Account | Credit Account | Asset | -| ---------------- | ---------------- | ----- | -| Outgoing Payment | Asset Liquidity | `ABC` | -| Asset Liquidity | Incoming Payment | `XYZ` | - -- Example: Outgoing payment for `10 USD`, incoming payment receives `9 EUR`. - - - - - - - - - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - -
DebitCredit
10
-
- - - - - - - -
DebitCredit
10
-
EUR (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
- - - - - - - -
DebitCredit
9
-
- - - - - - - -
DebitCredit
9
-
- -##### SPSP / Web Monetization - -| Debit Account | Credit Account | Asset | -| ---------------- | --------------- | ----- | -| Outgoing Payment | Asset Liquidity | `ABC` | -| Asset Liquidity | Wallet Address | `XYZ` | - -- Example: Outgoing payment for `2 USD`, wallet address receives `1 EUR`. - - - - - - - - - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - -
DebitCredit
2
-
- - - - - - - -
DebitCredit
2
-
EUR (Asset) Liquidity Acc.Wallet Address Liquidity Acc.
- - - - - - - -
DebitCredit
1
-
- - - - - - - -
DebitCredit
1
-
- -### Interledger - -Sender and receiver do not have wallet addresses at the same Rafiki instance. - -#### Sending Connector - -##### Same asset - -| Debit Account | Credit Account | -| ---------------- | -------------- | -| Outgoing Payment | Peer Liquidity | - -- Example: Sender creates an outgoing payment for `100 USD` to an incoming payment at a peer's Rafiki instance. The peering relationship is in USD. - - - - - - - - - - -
Outgoing Payment Liquidity Acc.Peer Liquidity Acc.
- - - - - - - -
DebitCredit
100
-
- - - - - - - -
DebitCredit
100
-
- -##### Cross currency - -| Debit Account | Credit Account | Asset | -| ---------------- | --------------- | ----- | -| Outgoing Payment | Asset Liquidity | ABC | -| Asset Liquidity | Peer Liquidity | XYZ | - -- Example: Sender creates an outgoing payment for 100 USD to an incoming payment at a peer's Rafiki instance. The peering relationship is in EUR, so payment is converted on the sending side. - - - - - - - - - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - -
DebitCredit
100
-
- - - - - - - -
DebitCredit
100
-
EUR (Asset) Liquidity Acc.Peer Liquidity Acc.
- - - - - - - -
DebitCredit
90
-
- - - - - - - -
DebitCredit
90
-
- -#### Receiving Connector - -##### Same asset - -| Debit Account | Credit Account | -| -------------- | ---------------- | -| Peer Liquidity | Incoming Payment | - -- Example: An incoming payment receives `100 USD` from an outgoing payment at a peer's Rafiki instance. - - - - - - - - - - -
Peer Liquidity Acc.Incoming Payment Liquidity Acc.
- - - - - - - -
DebitCredit
100
-
- - - - - - - -
DebitCredit
100
-
- -###### SPSP / Web Monetization - -| Debit Account | Credit Account | -| -------------- | -------------- | -| Peer Liquidity | Wallet Address | - -- Example: A wallet address receives `2 USD` from an ILP payment at a peer's Rafiki instance. - - - - - - - - - - -
Peer Liquidity Acc.Wallet Address Liquidity Acc.
- - - - - - - -
DebitCredit
2
-
- - - - - - - -
DebitCredit
2
-
- -##### Cross currency - -| Debit Account | Credit Account | Asset | -| --------------- | ---------------- | ----- | -| Peer Liquidity | Asset Liquidity | `ABC` | -| Asset Liquidity | Incoming Payment | `XYZ` | - -- Example: A Rafiki instance receives `10 USD` from a peer (peering relationship in USD) to be deposited in an incoming payment liquidity account denominated in EUR. The payment is converted to EUR and deposited. - - - - - - - - - - - - - - - - - - -
Peer Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - -
DebitCredit
10
-
- - - - - - - -
DebitCredit
10
-
EUR (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
- - - - - - - -
DebitCredit
9
-
- - - - - - - -
DebitCredit
9
-
- -###### SPSP / Web Monetization - -| Debit Account | Credit Account | Asset | -| --------------- | --------------- | ----- | -| Peer Liquidity | Asset Liquidity | `ABC` | -| Asset Liquidity | Wallet Address | `XYZ` | - -- Example: A Rafiki instance receives `10 USD` from a peer (peering relationship in USD) to be deposited in a wallet address liquidity account denominated in EUR. The payment is converted to EUR and deposited. - - - - - - - - - - - - - - - - - - -
Peer Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - -
DebitCredit
2
-
- - - - - - - -
DebitCredit
2
-
EUR (Asset) Liquidity Acc.Wallet Address Liquidity Acc.
- - - - - - - -
DebitCredit
1
-
- - - - - - - -
DebitCredit
1
-
- -#### Connector - -##### Same asset - -| Debit Account | Credit Account | -| -------------- | -------------- | -| Peer Liquidity | Peer Liquidity | - -- Example: Rafiki forwards `10 USD` from peer A to peer B. - - - - - - - - - - -
Peer A Liquidity Acc.Peer B Liquidity Acc.
- - - - - - - -
DebitCredit
10
-
- - - - - - - -
DebitCredit
10
-
- -##### Cross currency - -| Debit Account | Credit Account | Asset | -| --------------- | --------------- | ----- | -| Peer Liquidity | Asset Liquidity | `ABC` | -| Asset Liquidity | Peer Liquidity | `XYZ` | - -- Example: Rafiki receives `100 USD` from peer A and forwards 90 EUR to peer B. - - - - - - - - - - - - - - - - - - -
Peer A Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - -
DebitCredit
100
-
- - - - - - - -
DebitCredit
100
-
EUR (Asset) Liquidity Acc.Peer B Liquidity Acc.
- - - - - - - -
DebitCredit
90
-
- - - - - - - -
DebitCredit
90
-
diff --git a/packages/documentation/src/content/docs/concepts/accounting/liquidity.md b/packages/documentation/src/content/docs/concepts/accounting/liquidity.md deleted file mode 100644 index 06a603a34a..0000000000 --- a/packages/documentation/src/content/docs/concepts/accounting/liquidity.md +++ /dev/null @@ -1,316 +0,0 @@ ---- -title: Liquidity ---- - -Rafiki implements a clearing protocol - the [Interledger Protocol](/reference/glossary#interledger-protocol). As such, it does not hold liquidity but keeps track of liquidity moving through it. - -## Types of Liquidity - -### Asset Liquidity - -Asset Liquidity defines the amount of value, denominated in a given asset, Rafiki has at its disposal to send or forward ILP packets in. It increases if packets denominated in a given asset are received and decreases if packets denominated in a given asset are sent. It is always positive and cannot fall below 0. - -Account Servicing Entities should define and adjust the asset liquidity based on their liquidity risk profile. - -#### Example - -Rafiki has been configured with 2 assets, EUR and USD, both with an asset scale of 0. The EUR liquidity is 10, the USD liquidity if 50. - -In a cross-currency transaction, Rafiki receives packets worth 10 EUR and sends packets worth 11 USD. The EUR liquidity is increased to 20, the USD liquidity is reduced to 39. - -A transaction where Rafiki receives 50 EUR and would have to sent 55 USD would fail because Rafiki does not have enough USD liquidity. - -### Peer Liquidity - -Peer Liquidity defines the line of credit, denominated in the asset of the peering relationship, that Rafiki gives a certain peer. It should be defined in the peering agreement and depends on the trust between the transacting peers. If peer liquidity is not sufficient, payments will not be processed. Once the peer liquidity is used up, peers should settle and then reset their peer liquidity. - -#### Example - -A configured peer _Cloud Nine Wallet_ within Rafiki has a peer liquidity of 100 USD. Rafiki can send packets up to 100 USD to wallet addresses issued by _Cloud Nine Wallet_. Once that liquidity is used up, we should settle with _Cloud Nine Wallet_ and then reset their liquidity to 100 USD. - -### Payment Liquidity - -When Open Payments incoming or outgoing payments are created, a liquidity account is created within the accounting database. Liquidity needs to be deposited to an outgoing payment before the payment can be processed. The Account Servicing Entity is notified to deposit liquidity via the `outgoing_payment.created` event. Similarly, packets that are received for an incoming payment increase its liquidity. The Account Servicing Entity is notified to withdraw that liquidity via the `incoming_payment.completed` event. - -## Depositing and Withdrawing Liquidity - -> **Note:** The `idempotencyKey` must be provided whenever calling mutations dealing with liquidity. -> This key allows safely retrying requests, without performing the operation multiple times. -> This should be a unique key (typically, a V4 UUID). For more information on Rafiki's idempotency, [see more](/apis/idempotency). - -### Asset Liquidity - -Deposit and withdraw asset liquidity via the Admin API (or UI): - -```graphql -mutation DepositAssetLiquidity($input: DepositAssetLiquidityInput!) { - depositAssetLiquidity(input: $input) { - code - success - message - error - } -} -``` - -where - -```json -{ - "input": { - "id": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "assetId": "7b8b0f65-896d-4403-b7ba-2e24bf20eb35", - "amount": "100", - "idempotencyKey": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f" - } -} -``` - -and - -```graphql -mutation CreateAssetLiquidityWithdrawal( - $input: CreateAssetLiquidityWithdrawalInput! -) { - createAssetLiquidityWithdrawal(input: $input) { - code - success - message - error - } -} -``` - -where - -```json -{ - "input": { - "id": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "assetId": "7b8b0f65-896d-4403-b7ba-2e24bf20eb35", - "amount": "100", - "idempotencyKey": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "timeoutSeconds": 0 - } -} -``` - -See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. - -### Peer Liquidity - -Deposit and withdraw peer liquidity via the Admin API (or UI): - -```graphql -mutation DepositPeerLiquidity($input: DepositPeerLiquidityInput!) { - depositPeerLiquidity(input: $input) { - code - success - message - error - } -} -``` - -where - -```json -{ - "input": { - "id": "a09b730d-8610-4fda-98fa-ec7acb19c775", - "peerId": "73158598-2e0c-4973-895e-aebd115af260", - "amount": "1000000", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775", - "timeoutSeconds": 0 - } -} -``` - -and - -```graphql -mutation CreatePeerLiquidityWithdrawal( - $input: CreatePeerLiquidityWithdrawalInput! -) { - createPeerLiquidityWithdrawal(input: $input) { - code - success - message - error - } -} -``` - -where - -```json -{ - "input": { - "id": "421fae87-9a59-4217-9ff8-faf55ffab9c6", - "peerId": "73158598-2e0c-4973-895e-aebd115af260", - "amount": "100", - "timeoutSeconds": 0 - } -} -``` - -See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. - -### Payment Liquidity - -#### Outgoing payment - -Deposit and withdraw outgoing payment liquidity via the Admin API only: - -```graphql -mutation DepositOutgoingPaymentLiquidity( - $input: DepositOutgoingPaymentLiquidityInput! -) { - depositOutgoingPaymentLiquidity(input: $input) { - code - error - message - success - } -} -``` - -where - -```json -{ - "input": { - "outgoingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" - } -} -``` - -and - -```graphql -mutation CreateOutgoingPaymentWithdrawal( - $input: CreateOutgoingPaymentWithdrawalInput! -) { - createOutgoingPaymentWithdrawal(input: $input) { - code - error - message - success - } -} -``` - -where - -```json -{ - "input": { - "outgoingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775", - "timeoutSeconds": 0 - } -} -``` - -See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. - -#### Incoming payment - -Withdraw incoming payment liquidity via the Admin API only: - -```graphql -mutation CreateIncomingPaymentWithdrawal( - $input: CreateIncomingPaymentWithdrawalInput! -) { - createIncomingPaymentWithdrawal(input: $input) { - code - error - message - success - } -} -``` - -where - -```json -{ - "input": { - "incomingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775", - "timeoutSeconds": 0 - } -} -``` - -See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. - -## `PostLiquidityWithdrawal` or `VoidLiquidityWithdrawal` - -`PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` are only applicable for two-phase withdrawals. - -- `PostLiquidityWithdrawal` - Post liquidity withdrawal. Withdrawals with `> 0` timeouts are two-phase transfers and are committed via this mutation. -- `VoidLiquidityWithdrawal` - Void liquidity withdrawal. Withdrawals with `> 0` timeouts are two-phase transfers and are rolled back via this mutation. - -When a withdrawal liquidity transaction is requested with a non-zero `timeout` value _(Zero denotes absence of timeout)_, -the transfer will be created as a two-phase transfer [see more](https://en.wikipedia.org/wiki/Two-phase_commit_protocol) - -If the timeout interval passes before the transfer is either posted or voided, the transfer expires and the full amount is returned to the original account. -Note that timeouts are given as intervals, specified in seconds, rather than as absolute timestamps. - -The following withdrawal payments support two-phase transfers: - -- Asset Liquidity Withdrawal -- Wallet Address Withdrawal -- Peer Liquidity Withdrawal -- Incoming Payment Withdrawal -- Outgoing Payment Withdrawal - -### PostLiquidityWithdrawal - -```graphql -mutation PostLiquidityWithdrawal($input: PostLiquidityWithdrawalInput!) { - postLiquidityWithdrawal(input: $input) { - code - error - message - success - } -} -``` - -where - -```json -{ - "input": { - "withdrawalId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" - } -} -``` - -### VoidLiquidityWithdrawal - -```graphql -mutation VoidLiquidityWithdrawal($input: VoidLiquidityWithdrawalInput!) { - voidLiquidityWithdrawal(input: $input) { - code - error - message - success - } -} -``` - -where - -```json -{ - "input": { - "withdrawalId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" - } -} -``` diff --git a/packages/documentation/src/content/docs/concepts/accounting/tigerbeetle.md b/packages/documentation/src/content/docs/concepts/accounting/tigerbeetle.md deleted file mode 100644 index e06b583eb3..0000000000 --- a/packages/documentation/src/content/docs/concepts/accounting/tigerbeetle.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: TigerBeetle ---- - -TigerBeetle is a distributed financial accounting database designed for mission critical safety and performance. Since Rafiki implements the [Interledger Protocol](/reference/glossary#interledger-protocol), which splits payments into packets, we need a high performing and safe database to store all that payment data. For detailed information on TigerBeetle, including its consensus mechanism and its limitations, visit the official TigerBeetle [documentation](https://docs.tigerbeetle.com/) and [blog](https://tigerbeetle.com/blog/). - -Rafiki uses a combination of liquidity and settlement accounts to perform double-entry accounting. These accounts correspond to TigerBeetle credit and debit accounts, respectively. For more information on Rafiki's accounting, refer to [Accounts and Transfers](/concepts/accounting/accounts-and-transfers). Note that TigerBeetle only holds balance data and not any other additional metadata included in ILP packets. - -## Changing TigerBeetle Version within Rafiki - -### Updating the node client - -```sh -# latest -pnpm --filter backend up tigerbeetle-node --latest - -# specific version -pnpm --filter backend up tigerbeetle-node@0.15.4 -``` - -### Production Environment - Helm charts - -To use the desired version of TigerBeetle within the production environment, change the tag in the [helm `values.yaml` file](https://github.com/interledger/rafiki/blob/main/infrastructure/helm/tigerbeetle/values.yaml). - -### Local Environment - -To use the desired version of TigerBeetle within the local environment, change the tag in the [tigerbeetle `docker-compose.yml` file](https://github.com/interledger/rafiki/blob/main/localenv/tigerbeetle/docker-compose.yml). - -### Tests - -To use the desired version of TigerBeetle within the Rafiki tests, change the tag in the [tigerbeetle test setup](https://github.com/interledger/rafiki/blob/main/packages/backend/src/tests/tigerbeetle.ts). diff --git a/packages/documentation/src/content/docs/concepts/asset.md b/packages/documentation/src/content/docs/concepts/asset.md deleted file mode 100644 index 09c276f55d..0000000000 --- a/packages/documentation/src/content/docs/concepts/asset.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Asset ---- - -As per the [Mariam Webster Dictionary](https://www.merriam-webster.com/dictionary/asset), an Asset is "an item of value owned". Since the Interledger Protocol aims to create an internet of value, it allows for the transfer of any asset, not just currency. In reality, however, mainly assets denominated in a currency, i.e. fiat, commodity, or alternative currencies like crypto and branded currencies, are transferred via the Interledger Protocol. - -## The `Asset` type - -The `Asset` type in Rafiki is comprised of a value, an asset code, and an asset scale. - -| Property | Type | Example | -| ---------- | ------- | ------- | -| value | BigInt | `10000` | -| assetCode | String | `"USD"` | -| assetScale | Integer | `2` | - -The asset code SHOULD be an [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), if it is available for the asset. The asset scale is the difference in orders of magnitude between the standard unit and a corresponding fractional unit. To convert from `Asset` to a currency amount that is more common to humans, apply the following formula: - -$currencyAmount = \frac{value}{10^{assetScale}}$ - -Hence, the above example represents $\frac{10000}{10^2} =100.00$ USD. - -Assets are represented in the `Asset` type due to JavaScript/Typescript's deficiencies when handling floats. - -## Assets in Rafiki - -When two Account Servicing Entities peer their Rafiki instances, they need to define the asset(s) they are going to settle in. The Interledger packets they are going to exchange will then also be denominated in that asset. - -Furthermore, if an Account Servicing Entity is performing currency exchange, they need to provide [asset liquidity](/concepts/accounting/liquidity#asset-liquidity). - -Assets can be created and managed via the Admin GraphQL API directly or via the Rafiki Admin dashboard. Currently, [wallet addresses](/reference/glossary#wallet-address) can only be created for an existing asset and are tied to that asset. diff --git a/packages/documentation/src/content/docs/concepts/interledger-protocol/connector.md b/packages/documentation/src/content/docs/concepts/interledger-protocol/connector.md deleted file mode 100644 index 812d042760..0000000000 --- a/packages/documentation/src/content/docs/concepts/interledger-protocol/connector.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Connector ---- - -The [`backend`](/introduction/architecture#backend) includes an [Interledger](/reference/glossary#interledger-protocol) connector for sending and receiving [STREAM](/reference/glossary#stream) packets. - -The amounts of these packets are used to update account balances in [TigerBeetle](/reference/glossary#tigerbeetle). (See [Accounts and Transfers](/concepts/accounting/accounts-and-transfers)) - -Amounts are adjusted based on the destination/outgoing account's asset and Rafiki's configured exchange [rates service](/integration/getting-started#exchange-rates). - -## Packet Origination - -The connector receives incoming ILP packets via: - -- HTTP -- direct calls from within the `backend` - -### Incoming HTTP - -The `backend` includes an HTTP server listening on the configured [`CONNECTOR_PORT`](/integration/deployment#backend). - -An incoming ILP packet over HTTP is only accepted if it is from a configured [peer](/concepts/interledger-protocol/peering) and accompanied by the peer's incoming HTTP `authToken`. - -### Backend - -The `backend` includes services for managing [Open Payments](/reference/glossary#open-payments) [quotes](https://docs.openpayments.guide/reference/create-quote) and [outgoing payments](https://docs.openpayments.guide/reference/create-outgoing-payment). Each of these calls the connector in order to send ILP packets. Quoting sends unfulfillable rate probe packets. Outgoing payments send packets as a part of executing the payment. - -These calls to the connector are actually made by calling `makeIlpPlugin` and passing the plugin to the [`@interledger/pay`](https://github.com/interledgerjs/interledgerjs/tree/master/packages/pay) library. - -## Packet Destination - -An ILP packet may either terminate at the local Rafiki's STREAM server or continue on to a peer via HTTP. - -### Local STREAM Server - -The connector attempts to extract and decode the payment tag from a received ILP packet's destination address. If it is successfully able to match the tag with a locally managed [Open Payments](/reference/glossary#open-payments) [wallet address](/reference/glossary#wallet-address) or [incoming payment](https://docs.openpayments.guide/reference/create-incoming-payment), it will not forward the packet. The connector will credit the corresponding balance as well as track the total amount received for the STREAM connection in [Redis](/introduction/architecture) in order to support [STREAM receipts](https://interledger.org/rfcs/0039-stream-receipts/). - -Packets addressed to a wallet address happen via [SPSP](/reference/glossary#wallet-address). - -### Outgoing HTTP - -If the ILP packet's destination address corresponds to a configured [peer](/concepts/interledger-protocol/peering), the connector will forward the packet to the peer over HTTP along with the peer's configured HTTP `authToken`. - -## Packet Rejection - -The connector may reject a packet with a corresponding [ILP error code](https://interledger.org/rfcs/0027-interledger-protocol-4/#error-codes) due to a number of reasons: - -- invalid packet -- insufficient liquidity -- rate limit exceeded -- amount exceeding `maxPacketAmount` -- expired packet diff --git a/packages/documentation/src/content/docs/concepts/interledger-protocol/overview.md b/packages/documentation/src/content/docs/concepts/interledger-protocol/overview.md deleted file mode 100644 index 607a211345..0000000000 --- a/packages/documentation/src/content/docs/concepts/interledger-protocol/overview.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Overview ---- - -Interledger is a protocol for sending packets of money across different payment networks or ledgers. For more details, see the [documentation](https://interledger.org/developers/get-started/) and the [specification](https://interledger.org/developers/rfcs/interledger-protocol/). diff --git a/packages/documentation/src/content/docs/concepts/open-payments/grant-interaction.mdx b/packages/documentation/src/content/docs/concepts/open-payments/grant-interaction.mdx deleted file mode 100644 index 276ee069ee..0000000000 --- a/packages/documentation/src/content/docs/concepts/open-payments/grant-interaction.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Grant Interaction Flow ---- - -import { LargeImg } from '@interledger/docs-design-system' - -## Sequence Diagram - - - -## Endpoints - -If the AS deems interaction necessary to issue a grant, there are five main endpoints that are used once a pending grant has been created. In each endpoint, the specific interaction is identified with an interaction id and an interaction nonce. Both of these are provided in the query parameters of the URL when the authorization server redirects to the Identity Provider. The endpoints, in order of their calling, are as follows: - -- `GET /interact/:id/:nonce` (made by the client to the AS, establishes an interaction session, redirects browser session to IDP consent screen) -- `GET /grant/:id/:nonce` (made by the IDP to the AS, secured with `x-idp-secret` header, returns grant info for the consent screen to enumerate ) - - **This is served on INTERACTION_PORT and its default value is 3009** -- `POST /grant/:id/:nonce/(accept OR reject)` (made by the IDP to the AS, secured with `x-idp-secret` header, accepts or rejects the grant based on the user's input on the consent screen. **IDP then redirects to `GET /interact/:id/:nonce/finish`**) - - **This is served on INTERACTION_PORT and its default value is 3009** -- `GET /interact/:id/:nonce/finish` (ends the interaction established by `GET /interact/:id/:nonce`, redirects browser session to client callback. Contains a query param that either indicates a failure, or on success, a `hash` parameter that the client can use to verify the successful interaction, and the `interact_ref` that identifies the interaction on the AS.) - - Examples include: - `?result=grant_rejected` (if interaction was rejected) - `?result=grant_invalid` (if grant is not in a state where it may be accepted or rejected, e.g. already approved) - `?hash=p28jsq0Y2KK3WS__a42tavNC64ldGTBroywsWxT4md_jZQ1R\HZT8BOWYHcLmObM7XHPAdJzTZMtKBsaraJ64A -&interact_ref=4IFWWIKYBC2PQ6U56NL1` (if interaction was accepted) - `hash` is a `sha-256` hash of values provided by the client in the body of the [grant initialization request](https://docs.openpayments.guide/reference/post-request) (`interact.finish.nonce`), values returned in the AS response for that request (`interact.finish`), the `interact_ref` provided alongside the `hash`, and the uri of the grant initialization request (`https://auth-server.com/`). -- `POST /continue/:id` ([this should still be accurate](https://docs.openpayments.guide/reference/post-continue), final back-channel request made by client if interaction was successful, AS responds with an access token) - -### On `x-idp-secret` - -`x-idp-secret` is the name of a header that is used for `GET /grant/:id/:nonce`, `POST /grant/:id/:nonce/accept`, and `POST /grant/:id/:nonce/reject` requests. Its purpose is to secure communications between the IDP and the AS and its value should be a shared secret known to both entities. - -To set this up, set the `IDENTITY_SERVER_SECRET` on the AS environment to a value that is also used to configure the IDP's requests to the AS. diff --git a/packages/documentation/src/content/docs/concepts/open-payments/overview.md b/packages/documentation/src/content/docs/concepts/open-payments/overview.md deleted file mode 100644 index 65480e77b4..0000000000 --- a/packages/documentation/src/content/docs/concepts/open-payments/overview.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Overview ---- - -Open Payments is an API standard that allows third-parties/clients to initiate payments and to view the transaction history on the account holder's account (with the account holder's consent). Extensive documentation can be found on the [Open Payments website](https://openpayments.guide). - -Rafiki implements the Open Payments APIs. Every request and response is validated against the [Open Payments API specification](https://github.com/interledger/open-payments/tree/main/openapi). - -To update the API specification, create a Pull Request on the [Open Payments GitHub Repository](https://github.com/interledger/open-payments/). Changes will automatically be pushed to [Readme](https://readme.com/), which hosts the [API reference](https://docs.openpayments.guide/reference/) on the [Open Payments website](https://openpayments.guide). diff --git a/packages/documentation/src/content/docs/index.mdx b/packages/documentation/src/content/docs/index.mdx index 7c2efe4f77..8fcefa02b2 100644 --- a/packages/documentation/src/content/docs/index.mdx +++ b/packages/documentation/src/content/docs/index.mdx @@ -6,7 +6,7 @@ hero: tagline: Rafiki is open source software that provides an efficient solution for an Account Servicing Entity to enable Interledger functionality on its users' accounts. actions: - text: Read Rafiki docs - link: /introduction/overview + link: /intro-to-rafiki/overview icon: open-book variant: primary --- diff --git a/packages/documentation/src/content/docs/integration/webhook-events.mdx b/packages/documentation/src/content/docs/integration/admin-apis.mdx similarity index 91% rename from packages/documentation/src/content/docs/integration/webhook-events.mdx rename to packages/documentation/src/content/docs/integration/admin-apis.mdx index 2c313a9661..81f60c5f7f 100644 --- a/packages/documentation/src/content/docs/integration/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/admin-apis.mdx @@ -1,17 +1,31 @@ --- -title: Webhook Events +title: Admin APIs --- +After Rafiki has been deployed, [Account Servicing Entities](/reference/glossary#account-servicing-entity) can manage their Rafiki instance via two GraphQL Admin APIs, the [`backend` Admin API](/apis/backend/mutations) and the [`auth` Admin API](/apis/auth/mutations). + +The `backend` Admin API allows Account Servicing Entities to manage: + +- [assets](/reference/glossary#asset) +- [peers](/reference/glossary#peer) +- [wallet addresses](/reference/glossary#wallet-address) +- [Open Payments](/reference/glossary#open-payments) resources +- several types of [liquidity](/concepts/accounting/liquidity) within Rafiki + +The `auth` Admin API allows Account Servicing Entities to manage [Open Payments](/reference/glossary#open-payments) [grants](/reference/glossary#grant-negotiation-authorization-protocol). + +## Webhook Events + import { Mermaid } from '@interledger/docs-design-system' Paired together with the [`backend` Admin API](/apis/backend/mutations), webhook events are the main communication channel between the Rafiki instance and the Account Servicing Entity. Most events require the Account Servicing Entity's server to interact with Rafiki, either to deposit or withdraw liquidity into or from Rafiki, or to provide wallet address information. This document will describe how an Account Servicing Entity should handle each of the defined webhook events. -## Setup +### Setup When events happen in the Rafiki instance, the Rafiki `backend` service will make a POST request to the configured `WEBHOOK_URL` (`backend` environment variable), and will expect a 200 status in the response. -### Request Body +#### Request Body Each webhook has the following structure in the request body: @@ -21,7 +35,7 @@ Each webhook has the following structure in the request body: | `type` | Enum: [EventType](#eventtype) | | | `data` | Object | Event data | -#### EventType +##### EventType | Value | Description | | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | @@ -40,9 +54,9 @@ An OpenAPI specification of the webhook requests and their corresponding data ca Additionally, the [local playground](/playground/overview#usage) contains example payloads in the Bruno collection that can be used to test a webhook service integration. -## Events +### Events -### `incoming_payment.created` +#### `incoming_payment.created` The `incoming_payment.created` event indicates that an incoming payment has been created. This webhook event is only informational, since at this point, the incoming payment has not received any funds (i.e. no actions around liquidity are required). This webhook event could be used by the Account Servicing Entity to display upcoming incoming payments to their users. @@ -57,7 +71,7 @@ The `incoming_payment.created` event indicates that an incoming payment has been `} /> -### `incoming_payment.completed` +#### `incoming_payment.completed` The `incoming_payment.completed` event indicates that an incoming payment has been completed, either automatically or manually, and that any funds that have been received into this incoming payment should be withdrawn and credited to the recipient's account with the Account Servicing Entity. @@ -93,7 +107,7 @@ Example: An incoming payment supporting two-phase transfers was completed and re `} /> -### `incoming_payment.expired` +#### `incoming_payment.expired` The `incoming_payment.expired` event indicates that an incoming payment has expired, and that any funds that have been received into this incoming payment should be withdrawn and credited to the recipient's account with the Account Servicing Entity. Note that this event is not fired if there were no funds received by the incoming payment since there is no action required by the Account Servicing Entity. @@ -111,7 +125,7 @@ Example: An incoming payment has expired and received **$2.55**. `} /> -### `outgoing_payment.created` +#### `outgoing_payment.created` The `outgoing_payment.created` event indicates that an outgoing payment has been created and is awaiting liquidity. The Account Servicing Entity should verify the user account balance (and perform any other kinds of checks necessary) before funding or cancelling the outgoing payment. In the case where the outgoing payment should _not_ be fullfilled, the Account Servicing Entity can cancel the outgoing payment. @@ -136,7 +150,7 @@ Example: An outgoing payment for **$12** has been created. `} /> -### `outgoing_payment.completed` +#### `outgoing_payment.completed` The `outgoing_payment.completed` event indicates that an outgoing payment has successfully sent as many funds as possible to the receiver. The Account Servicing Entity should withdraw any excess liquidity from that outgoing payment in Rafiki and use it as they see fit. One option would be to return it to the sender. Another option is that the excess liquidity is considered a fee and retained by the Account Servicing Entity. Furthermore, the Account Servicing Entity should remove the hold on the sender's account and debit it. @@ -172,7 +186,7 @@ Example: An outgoing payment supporting two-phase transfers for **$12** h `} /> -### `outgoing_payment.failed` +#### `outgoing_payment.failed` The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was also unsuccessful. The Account Servicing Entity should withdraw any remaining liquidity from that outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` was 0), the Account Servicing Entity should remove the hold from the sender's account. If the payment failed partially, the Account Servicing Entity should remove the hold from the sender's account and debit it with the amount that has been sent, but they should refrain from taking a sending fee. @@ -190,7 +204,7 @@ Example: An outgoing payment for **$12** has failed. **$8** were sent. `} /> -### `wallet_address.web_monetization` +#### `wallet_address.web_monetization` The `wallet_address.web_monetization` event indicates that a wallet address has received web monetization payments via STREAM (raw ILP access). The Account Servicing Entity should withdraw that liquidity from the wallet address and credit the receiver's account. @@ -208,7 +222,7 @@ Example: A wallet address received **$0.33** `} /> -### `wallet_address.not_found` +#### `wallet_address.not_found` The `wallet_address.not_found` event indicates that a [wallet address](/reference/glossary#wallet-address) was requested (via the [Open Payments API](/reference/glossary#open-payments)), but it doesn't exist in Rafiki. When receiving this event, the Account Servicing Entity can perform a lookup for the relevant account in their system, and [create](/integration/getting-started#issuing-wallet-addresses) a wallet address. The initial request for the wallet address will succeed if the Account Servicing Entity creates it within the configurable [`WALLET_ADDRESS_LOOKUP_TIMEOUT_MS`](/integration/deployment#environment-variables) timeframe. @@ -225,7 +239,7 @@ Example: The wallet address `https://example-wallet.com/carla_garcia` was reques `} /> -### `asset.liquidity_low` +#### `asset.liquidity_low` The `asset.liquidity_low` event indicates that the liquidity of an [asset](/reference/glossary#asset) has dropped below a predefined liquidity threshold. When receiving this event, the Account Servicing Entity should check if they have or can acquire additional liquidity of said asset and if so, deposit it in Rafiki. If the Account Servicing Entity cannot or does not increase the asset liquidity in Rafiki, cross-currency transfers will fail. @@ -242,7 +256,7 @@ Example: The asset liquidity for USD (scale: 2) drops below 100.00 USD. `} /> -### `peer.liquidity_low` +#### `peer.liquidity_low` The `peer.liquidity_low` event indicates that the liquidity of a [peer](/reference/glossary#peer) has dropped below a predefined liquidity threshold. When receiving this event, the Account Servicing Entity need to decide if they can extend said peer's credit line or whether they need to settle first and then extend a new line of credit. If the Account Servicing Entity cannot or does not increase the peer liquidity in Rafiki, transfers to that peer will fail. @@ -259,18 +273,18 @@ Example: The peer liquidity for Happy Life Bank drops below 100.00 USD. `} /> -## Errors +### Errors If an error occurs when Rafiki sends a webhook event (a non-200 status is returned or the request times out), Rafiki will keep retrying the webhook requests at increasing intervals (first retry after 10 seconds, second after 20 more, next after 30 more, etc.) until a 200 status is returned. The maximum number of retries for webhook events can be configured via the `WEBHOOK_MAX_RETRY` environment variable. Additionally, the timeout for webhook requests can be configured with the `WEBHOOK_TIMEOUT` environment variable. -## Best Practices +### Best Practices -### Duplicate Events +#### Duplicate Events The `id` in the webhook event payload is a unique UUID which can be used by the Account Servicing Entity's system to determine whether the event has been received previously, preventing duplicate processing of events. -### Asynchronous Handling +#### Asynchronous Handling Account Servicing Entities should consider using a worker to process received webhook events, especially if requests to credit/debit user accounts are long processes. This would allow the server to process events at a rate suitable for the system, and would reduce the amount of failed/retried webhook events, since the webhook event listener can immediately reply with a successful 200 status. diff --git a/packages/documentation/src/content/docs/integration/deployment.md b/packages/documentation/src/content/docs/integration/deploy-to-production.mdx similarity index 99% rename from packages/documentation/src/content/docs/integration/deployment.md rename to packages/documentation/src/content/docs/integration/deploy-to-production.mdx index d1615e985c..e7a2eb1142 100644 --- a/packages/documentation/src/content/docs/integration/deployment.md +++ b/packages/documentation/src/content/docs/integration/deploy-to-production.mdx @@ -1,5 +1,5 @@ --- -title: Deployment +title: Deploy to production --- The production environment consists of diff --git a/packages/documentation/src/content/docs/integration/getting-started.md b/packages/documentation/src/content/docs/integration/get-started.mdx similarity index 99% rename from packages/documentation/src/content/docs/integration/getting-started.md rename to packages/documentation/src/content/docs/integration/get-started.mdx index e515c918ba..f89ae8d61f 100644 --- a/packages/documentation/src/content/docs/integration/getting-started.md +++ b/packages/documentation/src/content/docs/integration/get-started.mdx @@ -1,5 +1,5 @@ --- -title: Getting Started +title: Get started --- :::caution diff --git a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx new file mode 100644 index 0000000000..a189f2ad31 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx @@ -0,0 +1,5 @@ +--- +title: Integrator checklist +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/management.md b/packages/documentation/src/content/docs/integration/management.md deleted file mode 100644 index 39018c46ad..0000000000 --- a/packages/documentation/src/content/docs/integration/management.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Management ---- - -After Rafiki has been deployed, [Account Servicing Entities](/reference/glossary#account-servicing-entity) can manage their Rafiki instance via two GraphQL Admin APIs, the [`backend` Admin API](/apis/backend/mutations) and the [`auth` Admin API](/apis/auth/mutations). - -The `backend` Admin API allows Account Servicing Entities to manage: - -- [assets](/reference/glossary#asset) -- [peers](/reference/glossary#peer) -- [wallet addresses](/reference/glossary#wallet-address) -- [Open Payments](/reference/glossary#open-payments) resources -- several types of [liquidity](/concepts/accounting/liquidity) within Rafiki - -The `auth` Admin API allows Account Servicing Entities to manage [Open Payments](/reference/glossary#open-payments) [grants](/reference/glossary#grant-negotiation-authorization-protocol). diff --git a/packages/documentation/src/content/docs/concepts/account-servicing-entity.md b/packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx similarity index 96% rename from packages/documentation/src/content/docs/concepts/account-servicing-entity.md rename to packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx index c331848517..0f44e7a1b5 100644 --- a/packages/documentation/src/content/docs/concepts/account-servicing-entity.md +++ b/packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx @@ -1,5 +1,5 @@ --- -title: Account Servicing Entity +title: Account servicing entities --- An Account Servicing Entity provides and maintains a payment account for a payer and payee, and is a regulated entity in the country/countries it operates. diff --git a/packages/documentation/src/content/docs/introduction/overview.md b/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx similarity index 100% rename from packages/documentation/src/content/docs/introduction/overview.md rename to packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx diff --git a/packages/documentation/src/content/docs/introduction/architecture.md b/packages/documentation/src/content/docs/introduction/architecture.md deleted file mode 100644 index 5c442109e4..0000000000 --- a/packages/documentation/src/content/docs/introduction/architecture.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: Architecture ---- - -![Architecture diagram](/img/rafiki-architecture.png) - -Rafiki is a collection of three services that are run together; each one can be scaled horizontally. These services are - -- [`backend`](https://github.com/interledger/rafiki/tree/main/packages/backend): The main service, handling business logic and external communication. -- [`auth`](https://github.com/interledger/rafiki/tree/main/packages/auth): The service used for Grant Authorization and authentication. Rafiki provides this as a reference implementation, with the understanding that Rafiki operators can use and deploy their own service for authorization and authentication. -- [`frontend`](https://github.com/interledger/rafiki/tree/main/packages/frontend): An internal admin interface for Rafiki operators to manage their Rafiki instance. - -These services rely on four databases: - -- A postgres database used by the `backend` -- A separate postgres database used by `auth`. -- [TigerBeetle](https://github.com/coilhq/tigerbeetle) used by `backend` for accounting balances at the ILP layer. -- Redis used by `backend` as a cache to share STREAM connection details across processes and `auth` to store session data. - -## Backend - -The `backend` service has four responsibilities: - -- Expose REST [Open Payments API](https://docs.openpayments.guide/reference) endpoints for public clients to perform account management tasks. -- Expose an internal GraphQL Admin API for service operators to manage accounts and application settings like peering relationships. -- Expose an [ILP connector](/concepts/interledger-protocol/connector) to send and receive STREAM packets with peers. -- Business logic to manage accounts and track balances. - -The `backend`'s ILP functionality includes: - -- Accepting ILP packets over an HTTP interface and authenticating them against ILP account credentials -- Routing ILP packets to the correct destination account -- Converting currencies -- Sending out ILP packets over HTTP for destinations that are not local -- Fulfilling packets with an internal STREAM server - -## Auth - -The `auth` service performs authorization and authentication of incoming requests. For requests from entities that have accounts within the local instance of Rafiki, the `auth` service uses data stored in the auth postgres database. For requests from clients registered with other instances of Rafiki, the auth service resolves the client's public key from its source and uses it to authenticate and authorize the request. Additionally, it also exposes an GraphQL Admin API to manage auth related resources (such as grants). - -## Frontend - -The `frontend` project is a web app through which Rafiki administrators can manage their Rafiki instance though a UI. `frontend` communicates with the `backend` Admin API to manage [wallet addresses](/reference/glossary#wallet-address), [peering relationships](/reference/glossary#peer), and [assets](/reference/glossary#asset), among other settings. - -## Additional packages - -### Token Introspection - -The `token-introspection` package is a client library for making [GNAP](/reference/glossary#grant-negotiation-authorization-protocol) token introspection requests to the auth server. diff --git a/packages/documentation/src/content/docs/playground/autopeering.md b/packages/documentation/src/content/docs/playground/autopeering.mdx similarity index 100% rename from packages/documentation/src/content/docs/playground/autopeering.md rename to packages/documentation/src/content/docs/playground/autopeering.mdx diff --git a/packages/documentation/src/content/docs/playground/overview.md b/packages/documentation/src/content/docs/playground/overview.mdx similarity index 100% rename from packages/documentation/src/content/docs/playground/overview.md rename to packages/documentation/src/content/docs/playground/overview.mdx diff --git a/packages/documentation/src/content/docs/playground/testnet.mdx b/packages/documentation/src/content/docs/playground/testnet.mdx new file mode 100644 index 0000000000..666d3db37d --- /dev/null +++ b/packages/documentation/src/content/docs/playground/testnet.mdx @@ -0,0 +1,5 @@ +--- +title: Testnet +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/reference/get-involved.md b/packages/documentation/src/content/docs/reference/get-involved.md deleted file mode 100644 index a418d9165e..0000000000 --- a/packages/documentation/src/content/docs/reference/get-involved.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Get involved ---- - -## Participation - -- Begin a [new discussion or contribute to existing discussions](https://github.com/interledger/rafiki/discussions) in the Rafiki GitHub repo. -- Join the [interledger.slack.com](https://interledger.slack.com) workspace and ask any questions you have in the #rafiki channel. -- Try [running the system locally](https://rafiki.dev/playground/overview/) and ask any questions you have in the #rafiki Slack channel. -- For more details about spec contributions and development, visit [contributing.md](https://github.com/interledger/rafiki/blob/main/.github/contributing.md). - -## Coding - -- [Contribute](https://github.com/interledger/rafiki) to Rafiki coding or testing. - -## Community and hackathons - -- Join us at the [Interledger Summit](https://interledger.org/summit) and participate in our annual hackathon. -- Organize your own hackathons, coding sprints, and workshops both online and offline. Run campaigns and encourage participants to develop, collaborate on, and test projects. - -## Documentation - -- Contribute to the docs by suggesting additions and improvements. -- Create tutorials and guides to help others in the community work with Rafiki. - -Review our [contribution guide](https://github.com/interledger/rafiki/blob/main/.github/contributing.md) for details. diff --git a/packages/documentation/src/content/docs/reference/glossary.md b/packages/documentation/src/content/docs/reference/glossary.mdx similarity index 100% rename from packages/documentation/src/content/docs/reference/glossary.md rename to packages/documentation/src/content/docs/reference/glossary.mdx diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx new file mode 100644 index 0000000000..c28dac25bc --- /dev/null +++ b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx @@ -0,0 +1,7 @@ +--- +title: Auth service +--- + +## Auth + +The `auth` service performs authorization and authentication of incoming requests. For requests from entities that have accounts within the local instance of Rafiki, the `auth` service uses data stored in the auth postgres database. For requests from clients registered with other instances of Rafiki, the auth service resolves the client's public key from its source and uses it to authenticate and authorize the request. Additionally, it also exposes an GraphQL Admin API to manage auth related resources (such as grants). diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx new file mode 100644 index 0000000000..486278433d --- /dev/null +++ b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx @@ -0,0 +1,20 @@ +--- +title: Backend service +--- + +## Backend + +The `backend` service has four responsibilities: + +- Expose REST [Open Payments API](https://docs.openpayments.guide/reference) endpoints for public clients to perform account management tasks. +- Expose an internal GraphQL Admin API for service operators to manage accounts and application settings like peering relationships. +- Expose an [ILP connector](/concepts/interledger-protocol/connector) to send and receive STREAM packets with peers. +- Business logic to manage accounts and track balances. + +The `backend`'s ILP functionality includes: + +- Accepting ILP packets over an HTTP interface and authenticating them against ILP account credentials +- Routing ILP packets to the correct destination account +- Converting currencies +- Sending out ILP packets over HTTP for destinations that are not local +- Fulfilling packets with an internal STREAM server diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx new file mode 100644 index 0000000000..7f3848eeb0 --- /dev/null +++ b/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx @@ -0,0 +1,7 @@ +--- +title: Frontend service +--- + +# Frontend + +The `frontend` project is a web app through which Rafiki administrators can manage their Rafiki instance though a UI. `frontend` communicates with the `backend` Admin API to manage [wallet addresses](/reference/glossary#wallet-address), [peering relationships](/reference/glossary#peer), and [assets](/reference/glossary#asset), among other settings. diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx new file mode 100644 index 0000000000..1e1f6ec5f9 --- /dev/null +++ b/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx @@ -0,0 +1,7 @@ +--- +title: Token introspection +--- + +## Token Introspection + +The `token-introspection` package is a client library for making [GNAP](/reference/glossary#grant-negotiation-authorization-protocol) token introspection requests to the auth server. diff --git a/packages/documentation/src/content/docs/telemetry/integrating.md b/packages/documentation/src/content/docs/telemetry/integrating.md deleted file mode 100644 index 8bbd89b38d..0000000000 --- a/packages/documentation/src/content/docs/telemetry/integrating.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Deploying Custom Telemetry Service ---- - -Rafiki allows for integrating [Account Servicing Entities](/reference/glossary#account-servicing-entity) (ASE) to build their own telemetry solution based on the [OpenTelemetry](https://opentelemetry.io/) standardized metrics format that Rafiki exposes. - -In order to do so, the integrating ASE must deploy its own OpenTelemetry collector that should act as a sidecar container to Rafiki. It needs to provide the OpenTelemetry collector's ingest endpoint so that Rafiki can start sending metrics to it. - -## Rafiki Telemetry Environment Variables - -- `ENABLE_TELEMETRY`: boolean, defaults to `true`. Enables the telemetry service on Rafiki. -- `LIVENET`: boolean. Should be set to `true` on production environments dealing with real money. If it is not set, it will default to `false`, and metrics will get sent to the testnet otel-collector -- `OPEN_TELEMETRY_COLLECTOR_URLS`: CSV of URLs for Open Telemetry collectors (e.g., `http://otel-collector-NLB-e3172ff9d2f4bc8a.elb.eu-west-2.amazonaws.com:4317,http://happy-life-otel-collector:4317`). -- `OPEN_TELEMETRY_EXPORT_INTERVAL`: number in milliseconds, defaults to `15000`. Defines how often the instrumented Rafiki instance should send metrics. -- `TELEMETRY_EXCHANGE_RATES_URL`: string URL, defaults to `https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json`. It defines the endpoint that Rafiki will query for exchange rates, as a fallback when ASE does not [provide them](/integration/getting-started/#exchange-rates). If set, the response format of the external exchange rates API should be of type Rates, as the rates service expects. - The default endpoint set here points to a public S3 that has the previously mentioned required format, updated daily. - -## Example Docker OpenTelemetry Collector Image and Configuration - -Example of Docker OpenTelemetry Collector image and configuration that integrates with Rafiki and sends data to a Prometheus remote write endpoint: - -(it can be tested in our [Local Playground](/playground/overview) setup, by also providing the environment variables listed above to happy-life-backend in the [docker-compose](https://github.com/interledger/rafiki/blob/main/localenv/happy-life-bank/docker-compose.yml)) - -#### Docker-compose config: - -```yaml -#Serves as example for optional local collector configuration -happy-life-otel-collector: - image: otel/opentelemetry-collector-contrib:latest - command: ['--config=/etc/otel-collector-config.yaml', ''] - environment: - - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID-''} - - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY-''} - volumes: - - ../collector/otel-collector-config.yaml:/etc/otel-collector-config.yaml - networks: - - rafiki - expose: - - 4317 - ports: - - '13132:13133' # health_check extension -``` - -#### OpenTelemetry OTEL collector config: - -[OTEL Collector config docs](https://opentelemetry.io/docs/collector/configuration/) - -```yaml -# Serves as example for the configuration of a local OpenTelemetry Collector that sends metrics to an AWS Managed Prometheus Workspace -# Sigv4auth required for AWS Prometheus Remote Write access (USER with access keys needed) - -extensions: - sigv4auth: - assume_role: - arn: 'arn:aws:iam::YOUR-ROLE:role/PrometheusRemoteWrite' - sts_region: 'YOUR-REGION' - -receivers: - otlp: - protocols: - grpc: - http: - cors: - allowed*origins: - - http://* - - https://\_ - -processors: - batch: - -exporters: - logging: - verbosity: 'normal' - prometheusremotewrite: - endpoint: 'https://aps-workspaces.YOUR-REGION.amazonaws.com/workspaces/ws-YOUR-WORKSPACE-IDENTIFIER/api/v1/remote_write' - auth: - authenticator: sigv4auth - -service: - telemetry: - logs: - level: 'debug' - metrics: - level: 'detailed' - address: 0.0.0.0:8888 - extensions: [sigv4auth] - pipelines: - metrics: - receivers: [otlp] - processors: [batch] - exporters: [logging, prometheusremotewrite] -``` diff --git a/packages/documentation/src/content/docs/telemetry/overview.md b/packages/documentation/src/content/docs/telemetry/overview.md deleted file mode 100644 index 71590422ae..0000000000 --- a/packages/documentation/src/content/docs/telemetry/overview.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Overview ---- - -## Purpose - -The objective of the telemetry feature is to gather metrics and establish an infrastructure for visualizing valuable network insights. The metrics we at the Interledger Foundation collect include: - -- The total amount of money transferred via packet data within a specified time frame (daily, weekly, monthly). -- The number of transactions from outgoing payments that have been at least partially successful. -- The average amount of money held within the network per transaction. - -We aim to track the growth of the network in terms of transaction sizes and the number of transactions processed. Our goal is to use these data for our own insights and to enable [Account Servicing Entities](/reference/glossary#account-servicing-entity) (ASEs) to gain their own insights. - -## Privacy and Optionality - -Privacy is a paramount concern for us. Rafiki's telemetry feature is designed to provide valuable network insights without violating privacy or aiding malicious ASEs. For more information, please [read the privacy docs](/telemetry/privacy). - -The telemetry functionality is currently enabled by default on test (non-livenet) environments, i.e. any environment that is not dealing with real money. When active, it transmits metrics to the "testnet" collector. In the future, those ASEs operating in a production "livenet" environment (real money) will be able to opt-in to sharing their metrics with a "livenet" collector. Regardless of environment, Account Servicing Entities (ASEs) can also opt-out of telemetry completely. - -## Architecture - -The architecture of the telemetry feature is illustrated below: - -![Telemetry architecture](/img/telemetry-architecture.png) - -## OpenTelemetry - -We have adopted [OpenTelemetry](https://opentelemetry.io/) to ensure compliance with a standardized framework that is compatible with a variety of tool suites. This allows clients to use their preferred tools for data analysis, while Rafiki is instrumented and observable through a standardized metrics format. - -## Telemetry ECS Cluster - -The Telemetry Replica service is hosted on AWS ECS Fargate and is configured for availability and load balancing of custom ADOT (AWS Distro for Opentelemetry) Collector ECS tasks. - -When ASEs opt for telemetry, metrics are sent to our Telemetry Service. To enable ASEs to build their own telemetry solutions, instrumented Rafiki can send data to multiple endpoints. This allows the integration of a local [Otel collector](https://opentelemetry.io/docs/collector/) container that can support custom requirements. Metrics communication is facilitated through [gRPC](https://grpc.io/). - -## Otel SDK - Rafiki Instrumentation - -The Opentelemetry SDK is integrated into Rafiki to create, collect, and export metrics. The SDK integrates seamlessly with the OTEL Collector. - -## Prometheus - AMP - -We use Amazon's managed service for Prometheus (AMP) to collect data from the Telemetry cluster. - -**Note**: AMP offers limited configuration options and cannot crawl data outside of AWS. This limitation led us to adopt a push model, using prometheusRemoteWrite, instead of a pull model. For future development, we may consider hosting our own Prometheus. - -## Grafana - Grafana Cloud - -Grafana Cloud is used for data visualization dashboards. It offers multiple tools that extend Prometheus Promql. - -**Note**: We initially used Amazon hosted Grafana, but it did not meet our needs for embedding dashboards. Grafana Cloud offers a feature called “Public dashboards”, which allows us to share dashboards. However, embedding may still pose a challenge. - -## Exchange Rates - -For telemetry purposes, all amounts collected by instrumented Rafiki should be converted to a base currency. - -**Privacy Reasoning**: If only two ASEs are peered over a non-USD currency and we collect data in that currency, it would be easy to determine the volumes moved between those two ASEs. To maintain privacy, we convert all amounts to a base currency. - -If an ASE does not provide the necessary exchange rate for a transaction, the telemetry solution will still convert the amount to the base currency using external exchange rates. A Lambda function on AWS retrieves and stores these external exchange rates. It is triggered by a daily CloudWatch event and stores the rates in a public S3 Bucket. The S3 Bucket does not have versioning, and the data is overwritten daily to further ensure privacy. - -## Instrumentation - -Rafiki currently has three counter metrics. All data points (counter increases and histogram records) are exported to collection endpoints at a configurable interval (default recommended to 15s). - -Currently collected metrics: - -- `transactions_total` - Counter metric - - Description: “Count of funded transactions” - - This counter metric increases by 1 for each successfully sent transaction. -- `transactions_amount` - Counter metric - - Description: “Amount sent through the network”. - - This amount metric increases by the amount sent in each ILP packet. -- `transaction_fee_amounts` - Counter metric - - Description: “Fee amount sent through the network”. - - This fee amount metric increases by the (amount sent minus amount received) for an outgoing payment. -- `ilp_pay_time_ms` - Histogram metric - - Description: “Time to complete an ILP payment” - - This histogram metric records the time taken to make an ILP payment. - -**Note**: The current implementation only collects metrics on the SENDING side of a transaction. Metrics for external open-payments transactions RECEIVED by a Rafiki instance in the network are not collected. diff --git a/packages/documentation/src/content/docs/telemetry/privacy.md b/packages/documentation/src/content/docs/telemetry/privacy.md deleted file mode 100644 index 403f55fc28..0000000000 --- a/packages/documentation/src/content/docs/telemetry/privacy.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Privacy ---- - -Rafiki telemetry is designed with a strong emphasis on privacy. The system anonymizes user data and refrains from collecting identifiable information. Since transactions can originate from any user to a Rafiki instance, the privacy measures are implemented directly at the source (each Rafiki instance). This means that at the individual level, the data is already anonymous as single Rafiki instances service transactions for multiple users. - -## Differential Privacy and Local Differential Privacy - -Differential Privacy is a system for publicly sharing information about a dataset by describing the patterns of groups within the dataset while withholding information about individuals in the dataset. Local Differential Privacy (LDP) is a variant of differential privacy where noise is added to each individual's data point before it is sent to the server. This ensures that the server never sees the actual data, providing a strong privacy guarantee. - -## Rounding Technique and Bucketing - -In our implementation, we use a rounding technique that essentially aggregates multiple transactions into the same value, making them indistinguishable. This is achieved by dividing the transaction values into buckets and rounding the values to the nearest bucket. - -The bucket size is calculated based on the raw transaction value. For lower value transactions, which are expected to occur more frequently, the bucket sizes are determined linearly for higher granularity. However, after a certain threshold, the bucket size calculation switches to a logarithmic function to ensure privacy for higher value transactions, which are less frequent but pose greater privacy concerns. - -To handle outliers, a "clipping" technique is implemented, capping the buckets. Any value that exceeds a given threshold is placed in a single bucket. Conversely, any value that falls below a certain minimum is also placed in a single bucket. This ensures that both high and low outliers do not disproportionately affect the overall data, providing further privacy guarantees for these transactions. - -## Laplacian Distribution - -The Laplacian distribution is often used in differential privacy due to its double exponential decay property. This property ensures that a small change in the data will not significantly affect the probability distribution of the output, providing a strong privacy guarantee. - -To achieve Local Differential Privacy (LDP), noise is selected from the Laplacian distribution and added to the rounded values. The noise is generated based on a privacy parameter, which is calculated using the sensitivity of the function. - -The sensitivity of a function in differential privacy is the maximum amount that any single observation can change the output of the function. In this case, the sensitivity is considered to be the maximum of the rounded value and the bucket size. - -The privacy parameter is computed as one-tenth of the sensitivity. This parameter controls the trade-off between privacy and utility: a smaller privacy parameter means more privacy but less utility, and a larger privacy parameter means less privacy but more utility. - -The noise, selected from the Laplacian distribution, is then generated using this privacy parameter and added to the rounded value. If the resulting value is zero, it is set to half the bucket size to ensure that the noise does not completely obscure the transaction value. - -## Currency Conversion - -Another factor that obscures sensitive data is currency conversion. In cross-currency transactions, exchange rates are provided by [ASEs](/reference/glossary#account-servicing-entity) internally. As such, they cannot be correlated to an individual transaction. If the necessary rates are not provided or not available from the ASE, an external API for exchange rates is used. The obtained exchange rates are overwritten frequently in this case, with no versioning or history access. This introduces an additional layer of noise and further protects the privacy of the transactions. - -## References - -Rafiki's telemetry solution is a combination of techniques described in various white papers on privacy-preserving data collection. For more information, you can refer to the following papers: - -- [Local Differential Privacy for Human-Centered Computing](https://jwcn-eurasipjournals.springeropen.com/articles/10.1186/s13638-020-01675-8) -- [Collecting Telemetry Data Privately](https://www.microsoft.com/en-us/research/blog/collecting-telemetry-data-privately/) -- [Collecting Telemetry Data Privately - NeurIPS Publication](https://proceedings.neurips.cc/paper_files/paper/2017/file/253614bbac999b38b5b60cae531c4969-Paper.pdf) by Bolin Ding, Janardhan Kulkarni, Sergey Yekhanin from Microsoft Research. -- [RAPPOR: Randomized Aggregatable Privacy-Preserving Ordinal Response](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/42852.pdf) - -# Experimental Transaction Values when using the Algorithm - -The following table shows the values in the algorithm when running transactions for different amounts. The raw value increases as you go down the rows of the table. -(all values are in scale 4) -| Raw Value | Bucket Size | Rounded Value | Privacy Parameter | Laplace Noise | Final Value | -|-----------|-------------|---------------|-------------------|---------------|-------------| -| 8300 | 10000 | 10000 | 1000 | 2037 | 12037 | -| 13200 | 15000 | 15000 | 1500 | 1397 | 16397 | -| 147700 | 160000 | 160000 | 16000 | -27128 | 132872 | -| 1426100 | 2560000 | 2560000 | 256000 | -381571 | 2178429 | -| 1788200 | 2560000 | 2560000 | 256000 | 463842 | 3023842 | -| 90422400 | 10000000 | 90000000 | 1000000 | 2210649 | 92210649 | -| 112400400 | 10000000 | 100000000 | 1000000 | 407847 | 100407847 | -| 222290500 | 10000000 | 100000000 | 1000000 | -686149 | 99313851 | From 4a1e03614d868c3bdbe7f7b9882dc7d24549e9dc Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Fri, 16 Aug 2024 12:59:36 +0200 Subject: [PATCH 02/91] chore: removing all docs copy, ready for new contant --- .../content/docs/apis/graphql/idempotency.mdx | 8 +- .../accounts-transfers-liquidity.mdx | 1511 +---------------- .../content/docs/components/architecture.mdx | 15 +- .../content/docs/components/interledger.mdx | 437 +---- .../content/docs/components/open-payments.mdx | 128 +- .../src/content/docs/components/telemetry.mdx | 224 +-- .../content/docs/integration/admin-apis.mdx | 287 +--- .../docs/integration/deploy-to-production.mdx | 144 +- .../content/docs/integration/get-started.mdx | 303 +--- .../account-servicing-entities.mdx | 14 +- .../content/docs/intro-to-rafiki/overview.mdx | 21 +- .../content/docs/playground/autopeering.mdx | 30 +- .../src/content/docs/playground/overview.mdx | 272 +-- .../src/content/docs/reference/glossary.mdx | 53 +- .../auth-service.mdx | 4 +- .../backend-service.mdx | 17 +- .../frontend-service.mdx | 4 +- .../token-introspection.mdx | 4 +- 18 files changed, 18 insertions(+), 3458 deletions(-) diff --git a/packages/documentation/src/content/docs/apis/graphql/idempotency.mdx b/packages/documentation/src/content/docs/apis/graphql/idempotency.mdx index f9cca5b465..e0bfea1e9f 100644 --- a/packages/documentation/src/content/docs/apis/graphql/idempotency.mdx +++ b/packages/documentation/src/content/docs/apis/graphql/idempotency.mdx @@ -2,10 +2,4 @@ title: Idempotency --- -Several mutations utilize an idempotency key to allow safely retrying requests without performing operations multiple times. This should be a unique key (typically, a V4 UUID). - -For Rafiki's GraphQL API, whenever a mutation with an `idempotencyKey` is called, the request payload and the request response are saved under that key. Any subsequent requests made with the same idempotency key will return the original response & status of the request (regardless whether the request was successful or not). Keys are cached for a default of 24 hours, and can be configured via the `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` `backend` service's environment flag. - -Additionally, in the possible chance that a request is made while still concurrently processing the first one under the same `idempotencyKey`, the API would return an error. This further safeguards from potential errors in the system. The timing to prevent processing concurrent requests can be configured via the `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` flag (which is 2 seconds by default). - -For more information on idempotency, [see more](https://en.wikipedia.org/wiki/Idempotence). +## Placeholder diff --git a/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx b/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx index 24817755f5..342cdcd645 100644 --- a/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx +++ b/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx @@ -2,1513 +2,4 @@ title: Accounts, transfers, and Liquidity --- -## Asset - -As per the [Mariam Webster Dictionary](https://www.merriam-webster.com/dictionary/asset), an Asset is "an item of value owned". Since the Interledger Protocol aims to create an internet of value, it allows for the transfer of any asset, not just currency. In reality, however, mainly assets denominated in a currency, i.e. fiat, commodity, or alternative currencies like crypto and branded currencies, are transferred via the Interledger Protocol. - -### The `Asset` type - -The `Asset` type in Rafiki is comprised of a value, an asset code, and an asset scale. - -| Property | Type | Example | -| ---------- | ------- | ------- | -| value | BigInt | `10000` | -| assetCode | String | `"USD"` | -| assetScale | Integer | `2` | - -The asset code SHOULD be an [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), if it is available for the asset. The asset scale is the difference in orders of magnitude between the standard unit and a corresponding fractional unit. To convert from `Asset` to a currency amount that is more common to humans, apply the following formula: - -$currencyAmount = \frac{value}{10^{assetScale}}$ - -Hence, the above example represents $\frac{10000}{10^2} =100.00$ USD. - -Assets are represented in the `Asset` type due to JavaScript/Typescript's deficiencies when handling floats. - -### Assets in Rafiki - -When two Account Servicing Entities peer their Rafiki instances, they need to define the asset(s) they are going to settle in. The Interledger packets they are going to exchange will then also be denominated in that asset. - -Furthermore, if an Account Servicing Entity is performing currency exchange, they need to provide [asset liquidity](/concepts/accounting/liquidity#asset-liquidity). - -Assets can be created and managed via the Admin GraphQL API directly or via the Rafiki Admin dashboard. Currently, [wallet addresses](/reference/glossary#wallet-address) can only be created for an existing asset and are tied to that asset. - -## Accounts - -Rafiki uses a combination of liquidity and settlement accounts to perform [double-entry accounting](https://en.wikipedia.org/wiki/Double-entry_bookkeeping). - -### Liquidity account - -A liquidity account may only hold a positive balance. Rafiki enforces that its total debits MUST NOT exceed its total credits amount. - -There is one liquidity account for each of the following resource: - -- [Asset](/reference/glossary#asset) -- [Peer](/reference/glossary#peer) -- Wallet Address (for [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) / [Web Monetization](/reference/glossary#web-monetization) receiving) -- Incoming Payment -- Outgoing Payment - -Asset and Peer liquidity accounts are created when calling `createAsset` and `createPeer` [GraphQL Admin API mutations](/apis/backend/mutations) respectively, while liquidity accounts for wallet addresses, incoming and outgoing payments are created on-the-fly during payment processing or web monetization events. - -Any liquidity management is done by the [Account Servicing Entity](/reference/glossary#account-servicing-entity) through the GraphQL Admin API. See [webhook events](/integration/webhook-events) and [liquidity documentation](/concepts/accounting/liquidity) for more information. - -### Settlement account - -A settlement account may only hold a negative balance. Rafiki enforces that its total credits MUST NOT exceed its total debits amount. A settlement account represents those total amount of funds an [Account Servicing Entity](/reference/glossary#account-servicing-entity) has deposited into Rafiki. - -There is one settlement account for each asset. - -## Transfers - -Rafiki transfers perform double-entry accounting. Every transfer increases both the total debits of one account and the total credits of a second account by the same amount. - -### Intra-Rafiki - -Consider the following accounts referenced throughout the below documentation: - -- **USD Settlement Acc.** - USD asset settlement account (always zero or negative balance) -- **USD (Asset) Liquidity Acc.** - USD settlement account (always zero or positive balance) -- **Peer Liquidity Acc.** - USD asset counterparty liquidity account (always zero or positive balance) -- **Wallet Address Liquidity Acc.** - USD wallet address liquidity account (always zero or positive balance) -- **Incoming Payment Liquidity Acc.** - USD incoming payment liquidity account (always zero or positive balance) -- **Outgoing Payment Liquidity Acc.** - USD outgoing payment liquidity account (always zero or positive balance) - -#### Deposits - -Action of debiting the settlement account, and crediting the liquidity account. - -##### Depositing Asset Liquidity - -| Debit Account | Credit Account | -| ------------- | --------------- | -| Settlement | Asset Liquidity | - -- Example: depositing `100 USD` - - - - - - - - - - -
USD Settlement Acc. USD (Asset) Liquidity Acc.
- - - - - - - - - -
DebitCredit
100
-
- - - - - - - - - -
DebitCredit
100
-
- -##### Depositing Peer Liquidity - -| Debit Account | Credit Account | -| ------------- | -------------- | -| Settlement | Peer Liquidity | - -- Example: peering relationship in USD, depositing `100 USD` - - - - - - - - - - -
USD Settlement Acc. Peer Liquidity Acc.
- - - - - - - - - -
DebitCredit
100
-
- - - - - - - - - -
DebitCredit
100
-
- -##### Depositing Outgoing Payment Liquidity - -| Debit Account | Credit Account | -| ------------- | ---------------- | -| Settlement | Outgoing Payment | - -- Example: depositing `35 USD` - - - - - - - - - - -
USD Settlement Acc. Outgoing Payment Liquidity Acc.
- - - - - - - - - -
DebitCredit
35
-
- - - - - - - - - -
DebitCredit
35
-
- -#### Withdrawals - -Action of debiting the liquidity account, and crediting the settlement account. - -##### Withdrawing Asset Liquidity - -| Debit Account | Credit Account | -| --------------- | -------------- | -| Asset Liquidity | Settlement | - -- Example: withdrawing `50 USD` - - - - - - - - - - -
USD (Asset) Liquidity Acc.USD Settlement Acc.
- - - - - - - - - -
DebitCredit
50
-
- - - - - - - - - -
DebitCredit
50
-
- -##### Withdrawing Peer Liquidity - -| Debit Account | Credit Account | -| -------------- | -------------- | -| Peer Liquidity | Settlement | - -- Example: peering relationship in USD, withdrawing `50 USD` - - - - - - - - - - -
Peer Liquidity Acc.USD Settlement Acc.
- - - - - - - - - -
DebitCredit
50
-
- - - - - - - - - -
DebitCredit
50
-
- -##### Withdrawing Wallet Address Liquidity (example: 2 USD) - -| Debit Account | Credit Account | -| -------------- | -------------- | -| Wallet Address | Settlement | - -- Example: withdrawing `2 USD` - - - - - - - - - - -
Wallet Address Liquidity Acc.USD Settlement Acc.
- - - - - - - - - -
DebitCredit
2
-
- - - - - - - - - -
DebitCredit
2
-
- -##### Withdrawing Incoming Payment Liquidity - -| Debit Account | Credit Account | -| ---------------- | -------------- | -| Incoming Payment | Settlement | - -- Example: withdrawing `25 USD` - - - - - - - - - - -
Incoming Payment Liquidity Acc.USD Settlement Acc.
- - - - - - - - - -
DebitCredit
25
-
- - - - - - - - - -
DebitCredit
25
-
- -##### Withdrawing Outgoing Payment Liquidity - -| Debit Account | Credit Account | -| ---------------- | -------------- | -| Outgoing Payment | Settlement | - -- Example: withdrawing `1 USD` - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD Settlement Acc.
- - - - - - - - - -
DebitCredit
1
-
- - - - - - - - - -
DebitCredit
1
-
- -#### Payments (Same Asset) - -##### Simple Payment Setup Protocol (SPSP) / Web Monetization - -| Debit Account | Credit Account | -| ---------------- | -------------- | -| Outgoing Payment | Wallet Address | - -- Example: Send a Web Monetization Payment of `2 USD` over SPSP to a wallet address. Sender and receiver have wallet addresses at the same Rafiki. - - - - - - - - - - -
Outgoing Payment Liquidity Acc.Wallet Address Liquidity Acc.
- - - - - - - - - -
DebitCredit
2
-
- - - - - - - - - -
DebitCredit
2
-
- -##### Send Amount < Receive Amount - -| Debit Account | Credit Account | -| ---------------- | ---------------- | -| Outgoing Payment | Incoming Payment | -| Asset Liquidity | Incoming Payment | - -- Example: Sender consented to a payment of `14 USD` but quote promised to deliver `15 USD`. - - - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
- - - - - - - - - -
DebitCredit
14
-
- - - - - - - - - -
DebitCredit
1
-
- - - - - - - - - -
DebitCredit
15
-
- -##### Send Amount > Receive Amount - -| Debit Account | Credit Account | -| ---------------- | ---------------- | -| Outgoing Payment | Incoming Payment | -| Outgoing Payment | Asset Liquidity | - -- Example: Sender consented to a payment of `15 USD` but quote promised to deliver `14 USD`. - - - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
- - - - - - - - - -
DebitCredit
15
-
- - - - - - - - - -
DebitCredit
1
-
- - - - - - - - - -
DebitCredit
14
-
- -#### Payments (Cross Currency) - -| Debit Account | Credit Account | Asset | -| ---------------- | ---------------- | ----- | -| Outgoing Payment | Asset Liquidity | `ABC` | -| Asset Liquidity | Incoming Payment | `XYZ` | - -- Example: Outgoing payment for `10 USD`, incoming payment receives `9 EUR`. - - - - - - - - - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - - - -
DebitCredit
10
-
- - - - - - - - - -
DebitCredit
10
-
EUR (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
- - - - - - - - - -
DebitCredit
9
-
- - - - - - - - - -
DebitCredit
9
-
- -##### SPSP / Web Monetization - -| Debit Account | Credit Account | Asset | -| ---------------- | --------------- | ----- | -| Outgoing Payment | Asset Liquidity | `ABC` | -| Asset Liquidity | Wallet Address | `XYZ` | - -- Example: Outgoing payment for `2 USD`, wallet address receives `1 EUR`. - - - - - - - - - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - - - -
DebitCredit
2
-
- - - - - - - - - -
DebitCredit
2
-
EUR (Asset) Liquidity Acc.Wallet Address Liquidity Acc.
- - - - - - - - - -
DebitCredit
1
-
- - - - - - - - - -
DebitCredit
1
-
- -### Interledger - -Sender and receiver do not have wallet addresses at the same Rafiki instance. - -#### Sending Connector - -##### Same asset - -| Debit Account | Credit Account | -| ---------------- | -------------- | -| Outgoing Payment | Peer Liquidity | - -- Example: Sender creates an outgoing payment for `100 USD` to an incoming payment at a peer's Rafiki instance. The peering relationship is in USD. - - - - - - - - - - -
Outgoing Payment Liquidity Acc.Peer Liquidity Acc.
- - - - - - - - - -
DebitCredit
100
-
- - - - - - - - - -
DebitCredit
100
-
- -##### Cross currency - -| Debit Account | Credit Account | Asset | -| ---------------- | --------------- | ----- | -| Outgoing Payment | Asset Liquidity | ABC | -| Asset Liquidity | Peer Liquidity | XYZ | - -- Example: Sender creates an outgoing payment for 100 USD to an incoming payment at a peer's Rafiki instance. The peering relationship is in EUR, so payment is converted on the sending side. - - - - - - - - - - - - - - - - - - -
Outgoing Payment Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - - - -
DebitCredit
100
-
- - - - - - - - - -
DebitCredit
100
-
EUR (Asset) Liquidity Acc.Peer Liquidity Acc.
- - - - - - - - - -
DebitCredit
90
-
- - - - - - - - - -
DebitCredit
90
-
- -#### Receiving Connector - -##### Same asset - -| Debit Account | Credit Account | -| -------------- | ---------------- | -| Peer Liquidity | Incoming Payment | - -- Example: An incoming payment receives `100 USD` from an outgoing payment at a peer's Rafiki instance. - - - - - - - - - - -
Peer Liquidity Acc.Incoming Payment Liquidity Acc.
- - - - - - - - - -
DebitCredit
100
-
- - - - - - - - - -
DebitCredit
100
-
- -###### SPSP / Web Monetization - -| Debit Account | Credit Account | -| -------------- | -------------- | -| Peer Liquidity | Wallet Address | - -- Example: A wallet address receives `2 USD` from an ILP payment at a peer's Rafiki instance. - - - - - - - - - - -
Peer Liquidity Acc.Wallet Address Liquidity Acc.
- - - - - - - - - -
DebitCredit
2
-
- - - - - - - - - -
DebitCredit
2
-
- -##### Cross currency - -| Debit Account | Credit Account | Asset | -| --------------- | ---------------- | ----- | -| Peer Liquidity | Asset Liquidity | `ABC` | -| Asset Liquidity | Incoming Payment | `XYZ` | - -- Example: A Rafiki instance receives `10 USD` from a peer (peering relationship in USD) to be deposited in an incoming payment liquidity account denominated in EUR. The payment is converted to EUR and deposited. - - - - - - - - - - - - - - - - - - -
Peer Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - - - -
DebitCredit
10
-
- - - - - - - - - -
DebitCredit
10
-
EUR (Asset) Liquidity Acc.Incoming Payment Liquidity Acc.
- - - - - - - - - -
DebitCredit
9
-
- - - - - - - - - -
DebitCredit
9
-
- -###### SPSP / Web Monetization - -| Debit Account | Credit Account | Asset | -| --------------- | --------------- | ----- | -| Peer Liquidity | Asset Liquidity | `ABC` | -| Asset Liquidity | Wallet Address | `XYZ` | - -- Example: A Rafiki instance receives `10 USD` from a peer (peering relationship in USD) to be deposited in a wallet address liquidity account denominated in EUR. The payment is converted to EUR and deposited. - - - - - - - - - - - - - - - - - - -
Peer Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - - - -
DebitCredit
2
-
- - - - - - - - - -
DebitCredit
2
-
EUR (Asset) Liquidity Acc.Wallet Address Liquidity Acc.
- - - - - - - - - -
DebitCredit
1
-
- - - - - - - - - -
DebitCredit
1
-
- -#### Connector - -##### Same asset - -| Debit Account | Credit Account | -| -------------- | -------------- | -| Peer Liquidity | Peer Liquidity | - -- Example: Rafiki forwards `10 USD` from peer A to peer B. - - - - - - - - - - -
Peer A Liquidity Acc.Peer B Liquidity Acc.
- - - - - - - - - -
DebitCredit
10
-
- - - - - - - - - -
DebitCredit
10
-
- -##### Cross currency - -| Debit Account | Credit Account | Asset | -| --------------- | --------------- | ----- | -| Peer Liquidity | Asset Liquidity | `ABC` | -| Asset Liquidity | Peer Liquidity | `XYZ` | - -- Example: Rafiki receives `100 USD` from peer A and forwards 90 EUR to peer B. - - - - - - - - - - - - - - - - - - -
Peer A Liquidity Acc.USD (Asset) Liquidity Acc.
- - - - - - - - - -
DebitCredit
100
-
- - - - - - - - - -
DebitCredit
100
-
EUR (Asset) Liquidity Acc.Peer B Liquidity Acc.
- - - - - - - - - -
DebitCredit
90
-
- - - - - - - - - -
DebitCredit
90
-
- -## Liquidity - -Rafiki implements a clearing protocol - the [Interledger Protocol](/reference/glossary#interledger-protocol). As such, it does not hold liquidity but keeps track of liquidity moving through it. - -### Types of Liquidity - -#### Asset Liquidity - -Asset Liquidity defines the amount of value, denominated in a given asset, Rafiki has at its disposal to send or forward ILP packets in. It increases if packets denominated in a given asset are received and decreases if packets denominated in a given asset are sent. It is always positive and cannot fall below 0. - -Account Servicing Entities should define and adjust the asset liquidity based on their liquidity risk profile. - -##### Example - -Rafiki has been configured with 2 assets, EUR and USD, both with an asset scale of 0. The EUR liquidity is 10, the USD liquidity if 50. - -In a cross-currency transaction, Rafiki receives packets worth 10 EUR and sends packets worth 11 USD. The EUR liquidity is increased to 20, the USD liquidity is reduced to 39. - -A transaction where Rafiki receives 50 EUR and would have to sent 55 USD would fail because Rafiki does not have enough USD liquidity. - -#### Peer Liquidity - -Peer Liquidity defines the line of credit, denominated in the asset of the peering relationship, that Rafiki gives a certain peer. It should be defined in the peering agreement and depends on the trust between the transacting peers. If peer liquidity is not sufficient, payments will not be processed. Once the peer liquidity is used up, peers should settle and then reset their peer liquidity. - -##### Example - -A configured peer _Cloud Nine Wallet_ within Rafiki has a peer liquidity of 100 USD. Rafiki can send packets up to 100 USD to wallet addresses issued by _Cloud Nine Wallet_. Once that liquidity is used up, we should settle with _Cloud Nine Wallet_ and then reset their liquidity to 100 USD. - -#### Payment Liquidity - -When Open Payments incoming or outgoing payments are created, a liquidity account is created within the accounting database. Liquidity needs to be deposited to an outgoing payment before the payment can be processed. The Account Servicing Entity is notified to deposit liquidity via the `outgoing_payment.created` event. Similarly, packets that are received for an incoming payment increase its liquidity. The Account Servicing Entity is notified to withdraw that liquidity via the `incoming_payment.completed` event. - -### Depositing and Withdrawing Liquidity - -> **Note:** The `idempotencyKey` must be provided whenever calling mutations dealing with liquidity. -> This key allows safely retrying requests, without performing the operation multiple times. -> This should be a unique key (typically, a V4 UUID). For more information on Rafiki's idempotency, [see more](/apis/idempotency). - -#### Asset Liquidity - -Deposit and withdraw asset liquidity via the Admin API (or UI): - -```graphql -mutation DepositAssetLiquidity($input: DepositAssetLiquidityInput!) { - depositAssetLiquidity(input: $input) { - code - success - message - error - } -} -``` - -where - -```json -{ - "input": { - "id": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "assetId": "7b8b0f65-896d-4403-b7ba-2e24bf20eb35", - "amount": "100", - "idempotencyKey": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f" - } -} -``` - -and - -```graphql -mutation CreateAssetLiquidityWithdrawal( - $input: CreateAssetLiquidityWithdrawalInput! -) { - createAssetLiquidityWithdrawal(input: $input) { - code - success - message - error - } -} -``` - -where - -```json -{ - "input": { - "id": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "assetId": "7b8b0f65-896d-4403-b7ba-2e24bf20eb35", - "amount": "100", - "idempotencyKey": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "timeoutSeconds": 0 - } -} -``` - -See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. - -#### Peer Liquidity - -Deposit and withdraw peer liquidity via the Admin API (or UI): - -```graphql -mutation DepositPeerLiquidity($input: DepositPeerLiquidityInput!) { - depositPeerLiquidity(input: $input) { - code - success - message - error - } -} -``` - -where - -```json -{ - "input": { - "id": "a09b730d-8610-4fda-98fa-ec7acb19c775", - "peerId": "73158598-2e0c-4973-895e-aebd115af260", - "amount": "1000000", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775", - "timeoutSeconds": 0 - } -} -``` - -and - -```graphql -mutation CreatePeerLiquidityWithdrawal( - $input: CreatePeerLiquidityWithdrawalInput! -) { - createPeerLiquidityWithdrawal(input: $input) { - code - success - message - error - } -} -``` - -where - -```json -{ - "input": { - "id": "421fae87-9a59-4217-9ff8-faf55ffab9c6", - "peerId": "73158598-2e0c-4973-895e-aebd115af260", - "amount": "100", - "timeoutSeconds": 0 - } -} -``` - -See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. - -#### Payment Liquidity - -##### Outgoing payment - -Deposit and withdraw outgoing payment liquidity via the Admin API only: - -```graphql -mutation DepositOutgoingPaymentLiquidity( - $input: DepositOutgoingPaymentLiquidityInput! -) { - depositOutgoingPaymentLiquidity(input: $input) { - code - error - message - success - } -} -``` - -where - -```json -{ - "input": { - "outgoingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" - } -} -``` - -and - -```graphql -mutation CreateOutgoingPaymentWithdrawal( - $input: CreateOutgoingPaymentWithdrawalInput! -) { - createOutgoingPaymentWithdrawal(input: $input) { - code - error - message - success - } -} -``` - -where - -```json -{ - "input": { - "outgoingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775", - "timeoutSeconds": 0 - } -} -``` - -See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. - -##### Incoming payment - -Withdraw incoming payment liquidity via the Admin API only: - -```graphql -mutation CreateIncomingPaymentWithdrawal( - $input: CreateIncomingPaymentWithdrawalInput! -) { - createIncomingPaymentWithdrawal(input: $input) { - code - error - message - success - } -} -``` - -where - -```json -{ - "input": { - "incomingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775", - "timeoutSeconds": 0 - } -} -``` - -See `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` at the [below](#postliquiditywithdrawal-or-voidliquiditywithdrawal) section. - -### `PostLiquidityWithdrawal` or `VoidLiquidityWithdrawal` - -`PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` are only applicable for two-phase withdrawals. - -- `PostLiquidityWithdrawal` - Post liquidity withdrawal. Withdrawals with `> 0` timeouts are two-phase transfers and are committed via this mutation. -- `VoidLiquidityWithdrawal` - Void liquidity withdrawal. Withdrawals with `> 0` timeouts are two-phase transfers and are rolled back via this mutation. - -When a withdrawal liquidity transaction is requested with a non-zero `timeout` value _(Zero denotes absence of timeout)_, -the transfer will be created as a two-phase transfer [see more](https://en.wikipedia.org/wiki/Two-phase_commit_protocol) - -If the timeout interval passes before the transfer is either posted or voided, the transfer expires and the full amount is returned to the original account. -Note that timeouts are given as intervals, specified in seconds, rather than as absolute timestamps. - -The following withdrawal payments support two-phase transfers: - -- Asset Liquidity Withdrawal -- Wallet Address Withdrawal -- Peer Liquidity Withdrawal -- Incoming Payment Withdrawal -- Outgoing Payment Withdrawal - -#### PostLiquidityWithdrawal - -```graphql -mutation PostLiquidityWithdrawal($input: PostLiquidityWithdrawalInput!) { - postLiquidityWithdrawal(input: $input) { - code - error - message - success - } -} -``` - -where - -```json -{ - "input": { - "withdrawalId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" - } -} -``` - -#### VoidLiquidityWithdrawal - -```graphql -mutation VoidLiquidityWithdrawal($input: VoidLiquidityWithdrawalInput!) { - voidLiquidityWithdrawal(input: $input) { - code - error - message - success - } -} -``` - -where - -```json -{ - "input": { - "withdrawalId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" - } -} -``` - -## TigerBeetle - -TigerBeetle is a distributed financial accounting database designed for mission critical safety and performance. Since Rafiki implements the [Interledger Protocol](/reference/glossary#interledger-protocol), which splits payments into packets, we need a high performing and safe database to store all that payment data. For detailed information on TigerBeetle, including its consensus mechanism and its limitations, visit the official TigerBeetle [documentation](https://docs.tigerbeetle.com/) and [blog](https://tigerbeetle.com/blog/). - -Rafiki uses a combination of liquidity and settlement accounts to perform double-entry accounting. These accounts correspond to TigerBeetle credit and debit accounts, respectively. For more information on Rafiki's accounting, refer to [Accounts and Transfers](/concepts/accounting/accounts-and-transfers). Note that TigerBeetle only holds balance data and not any other additional metadata included in ILP packets. - -### Changing TigerBeetle Version within Rafiki - -#### Updating the node client - -```sh -# latest -pnpm --filter backend up tigerbeetle-node --latest - -# specific version -pnpm --filter backend up tigerbeetle-node@0.15.4 -``` - -#### Production Environment - Helm charts - -To use the desired version of TigerBeetle within the production environment, change the tag in the [helm `values.yaml` file](https://github.com/interledger/rafiki/blob/main/infrastructure/helm/tigerbeetle/values.yaml). - -#### Local Environment - -To use the desired version of TigerBeetle within the local environment, change the tag in the [tigerbeetle `docker-compose.yml` file](https://github.com/interledger/rafiki/blob/main/localenv/tigerbeetle/docker-compose.yml). - -#### Tests - -To use the desired version of TigerBeetle within the Rafiki tests, change the tag in the [tigerbeetle test setup](https://github.com/interledger/rafiki/blob/main/packages/backend/src/tests/tigerbeetle.ts). +## Placeholder diff --git a/packages/documentation/src/content/docs/components/architecture.mdx b/packages/documentation/src/content/docs/components/architecture.mdx index 1337e5957f..3714968d42 100644 --- a/packages/documentation/src/content/docs/components/architecture.mdx +++ b/packages/documentation/src/content/docs/components/architecture.mdx @@ -2,17 +2,4 @@ title: Architecture --- -![Architecture diagram](/img/rafiki-architecture.png) - -Rafiki is a collection of three services that are run together; each one can be scaled horizontally. These services are - -- [`backend`](https://github.com/interledger/rafiki/tree/main/packages/backend): The main service, handling business logic and external communication. -- [`auth`](https://github.com/interledger/rafiki/tree/main/packages/auth): The service used for Grant Authorization and authentication. Rafiki provides this as a reference implementation, with the understanding that Rafiki operators can use and deploy their own service for authorization and authentication. -- [`frontend`](https://github.com/interledger/rafiki/tree/main/packages/frontend): An internal admin interface for Rafiki operators to manage their Rafiki instance. - -These services rely on four databases: - -- A postgres database used by the `backend` -- A separate postgres database used by `auth`. -- [TigerBeetle](https://github.com/coilhq/tigerbeetle) used by `backend` for accounting balances at the ILP layer. -- Redis used by `backend` as a cache to share STREAM connection details across processes and `auth` to store session data. +## Placeholder diff --git a/packages/documentation/src/content/docs/components/interledger.mdx b/packages/documentation/src/content/docs/components/interledger.mdx index dc8f90035a..ce2d122dae 100644 --- a/packages/documentation/src/content/docs/components/interledger.mdx +++ b/packages/documentation/src/content/docs/components/interledger.mdx @@ -2,439 +2,4 @@ title: Interledger --- -Interledger is a protocol for sending packets of money across different payment networks or ledgers. For more details, see the [documentation](https://interledger.org/developers/get-started/) and the [specification](https://interledger.org/developers/rfcs/interledger-protocol/). - -## Connector - -The [`backend`](/introduction/architecture#backend) includes an [Interledger](/reference/glossary#interledger-protocol) connector for sending and receiving [STREAM](/reference/glossary#stream) packets. - -The amounts of these packets are used to update account balances in [TigerBeetle](/reference/glossary#tigerbeetle). (See [Accounts and Transfers](/concepts/accounting/accounts-and-transfers)) - -Amounts are adjusted based on the destination/outgoing account's asset and Rafiki's configured exchange [rates service](/integration/getting-started#exchange-rates). - -### Packet Origination - -The connector receives incoming ILP packets via: - -- HTTP -- direct calls from within the `backend` - -#### Incoming HTTP - -The `backend` includes an HTTP server listening on the configured [`CONNECTOR_PORT`](/integration/deployment#backend). - -An incoming ILP packet over HTTP is only accepted if it is from a configured [peer](/concepts/interledger-protocol/peering) and accompanied by the peer's incoming HTTP `authToken`. - -#### Backend - -The `backend` includes services for managing [Open Payments](/reference/glossary#open-payments) [quotes](https://docs.openpayments.guide/reference/create-quote) and [outgoing payments](https://docs.openpayments.guide/reference/create-outgoing-payment). Each of these calls the connector in order to send ILP packets. Quoting sends unfulfillable rate probe packets. Outgoing payments send packets as a part of executing the payment. - -These calls to the connector are actually made by calling `makeIlpPlugin` and passing the plugin to the [`@interledger/pay`](https://github.com/interledgerjs/interledgerjs/tree/master/packages/pay) library. - -### Packet Destination - -An ILP packet may either terminate at the local Rafiki's STREAM server or continue on to a peer via HTTP. - -#### Local STREAM Server - -The connector attempts to extract and decode the payment tag from a received ILP packet's destination address. If it is successfully able to match the tag with a locally managed [Open Payments](/reference/glossary#open-payments) [wallet address](/reference/glossary#wallet-address) or [incoming payment](https://docs.openpayments.guide/reference/create-incoming-payment), it will not forward the packet. The connector will credit the corresponding balance as well as track the total amount received for the STREAM connection in [Redis](/introduction/architecture) in order to support [STREAM receipts](https://interledger.org/rfcs/0039-stream-receipts/). - -Packets addressed to a wallet address happen via [SPSP](/reference/glossary#wallet-address). - -#### Outgoing HTTP - -If the ILP packet's destination address corresponds to a configured [peer](/concepts/interledger-protocol/peering), the connector will forward the packet to the peer over HTTP along with the peer's configured HTTP `authToken`. - -### Packet Rejection - -The connector may reject a packet with a corresponding [ILP error code](https://interledger.org/rfcs/0027-interledger-protocol-4/#error-codes) due to a number of reasons: - -- invalid packet -- insufficient liquidity -- rate limit exceeded -- amount exceeding `maxPacketAmount` -- expired packet - -## Peering - -### What is a peer / a peering relationship? - -A peer is a counterparty that a given party transacts with. Within the Interledger Protocol, connectors maintain peers, or counterparty connectors whom they transact with. The Interledger network is a graph of nodes (connectors) that have peered with one another by establishing a means of exchanging ILP packets and a means of paying one another for the successful forwarding and delivery of the packets. A connector may extend a given peer a limited line of credit, or none at all, depending upon their trustworthiness. - -Rafiki includes an implementation of such a connector. - -### What are the requirements for peering? - -Both counterparties need to - -- run an implementation of an Interledger connector, ideally Rafiki -- agree on an asset of the peering relationship -- agree on a `maxPacketAmount`, which specifies into how many packets a payment is split (or use default value within Rafiki) -- communicate their static ILP address -- communicate a connection endpoint for the peer to send packets to -- exchange auth tokens for the connection endpoint - -Additionally, the two counterparties need to agree on a settlement mechanism. However, that is outside the scope of Interledger / Rafiki. - -Note that two counterparties could have multiple peering relationships that differ in e.g. the underlying asset. - -### How to peer two Rafiki instances? - -#### Using the Admin Dashboard - -Once the [`frontend`](https://github.com/interledger/rafiki/blob/main/packages/frontend) project is running (typically as part of the [local environment](https://github.com/interledger/rafiki/blob/main/localenv)), you can navgiate to the Peers page, and then press the Create Peer button. You will be prompted to enter the peer information such as the peer's static ILP address, as well as the corresponding HTTP info. - -#### Using the Admin API - -This section describes the process for setting up peering between two Rafiki instances using the [Admin API](/integration/management). The examples are given for one instance, the other instance would have to run the corresponding API calls. - -Assume the following peering relationship - -- asset: USD with a scale of 2 -- peer's static ILP address: g.othergreatwallet -- peer's name: "The Other Great Wallet" - -Note that each GraphQL request has two parts: a _query_ and an object containing _query variables_. - -#### Create Asset - -Query: - -```graphql -mutation CreateAsset($input: CreateAssetInput!) { - createAsset(input: $input) { - code - success - message - asset { - id - code - scale - } - } -} -``` - -Query Variables: - -```json -{ - "input": { - "code": "USD", - "scale": 2 - } -} -``` - -Example Successful Response - -```json -{ - "data": { - "createAsset": { - "code": "200", - "success": true, - "message": "Created Asset", - "asset": { - "id": "b3dffeda-1e0e-47d4-82a3-69b1a622eeb9", - "code": "USD", - "scale": 2 - } - } - } -} -``` - -#### Create Peer - -Query: - -```graphql -mutation CreatePeer($input: CreatePeerInput!) { - createPeer(input: $input) { - code - success - message - peer { - id - asset { - code - scale - } - staticIlpAddress - name - } - } -} -``` - -Query Variables (substitute the asset ID from the "create asset" response for `INSERT_ASSET_ID`): - -```json -{ - "input": { - "staticIlpAddress": "g.othergreatwallet", - "name": "The Other Great Wallet" - "http": { - "incoming": {"authTokens": ["mytoken"]}, - "outgoing": {"endpoint": "ilp.othergreatwallet.com", "authToken": "theirtoken"} - }, - "assetId": "INSERT_ASSET_ID", - "initialLiquidity": - } -} -``` - -Notes: - -- The peer's connector endpoint has been mapped to `ilp.othergreatwallet.com`. Locally and by default, it is on `0.0.0.0:3002`. -- `mytoken` is the token my peer will need to present to connect and send packets to me -- `theirtoken` is the token I'll have to present to my peer to connect and send packets to them - -Example Successful Response - -```json -{ - "data": { - "createPeer": { - "code": "200", - "success": true, - "message": "Created ILP Peer", - "peer": { - "id": "480ef339-7842-4501-a905-923fc1339cef", - "asset": { - "code": "USD", - "scale": 2 - }, - "staticIlpAddress": "g.othergreatwallet", - "name": "The Other Great Wallet" - } - } - } -} -``` - -#### Deposit Peer Liquidity - -Query: - -```graphql -mutation DepositPeerLiquidity($input: DepositPeerLiquidityInput!) { - depositPeerLiquidity(input: $input) { - code - success - message - error - } -} -``` - -Query Variables (substitute the peer ID from the "create peer" response for `INSERT_PEER_ID`): - -```json -{ - "input": { - "peerId": "INSERT_PEER_ID", - "amount": "10000", - "id": "a09b730d-8610-4fda-98fa-ec7acb19c775" - } -} -``` - -Note that the peer has a liquidity of 100 USD. How this is secured, whether the peer has to pre-fund that amount somewhere or whether that is a line of credit, is out of scope. - -Example successful response: - -```json -{ - "data": { - "depositPeerLiquidity": { - "code": "200", - "success": true, - "message": "Deposited peer liquidity", - "error": null - } - } -} -``` - -#### Withdraw Peer Liquidity - -This is a two-phase transaction, so the withdrawal needs to be created first and then posted (i.e. the Account Servicing Entity commits to the withdrawal). This way, the Account Servicing Entity can safely perform withdrawals in their internal system before posting in Rafiki. If the internal withdrawal failed or an error was made when creating the withdrawal in Rafiki, it can be voided rather than posted. - -##### Create Withdrawal - -Query: - -```graphql -mutation CreatePeerLiquidityWithdrawal( - $input: CreatePeerLiquidityWithdrawalInput! -) { - createPeerLiquidityWithdrawal(input: $input) { - code - success - message - error - } -} -``` - -Query Variables (substitute the ID from the "create peer" response for `INSERT_PEER_ID`): - -```json -{ - "input": { - "peerId": "INSERT_PEER_ID", - "amount": "5000", - "id": "25e4ae5b-e844-49f6-89fa-34f33bc03278" - } -} -``` - -Example successful response: - -```json -{ - "data": { - "createPeerLiquidityWithdrawal": { - "code": "200", - "success": true, - "message": "Created peer liquidity withdrawal", - "error": null - } - } -} -``` - -##### Post Withdrawal - -Query: - -```graphql -mutation PostLiquidityWithdrawal ($withdrawalId: String!) { - postLiquidityWithdrawal($withdrawalId: String!) { - code - success - message - error - } -} -``` - -Query Variables (substitute the withdrawal ID from the "create withdrawal" request for `INSERT_WITHDRAWAL_ID`): - -```json -{ - "withdrawalId": "INSERT_WITHDRAWAL_ID" -} -``` - -Example successful response: - -```json -{ - "data": { - "postLiquidityWithdrawal": { - "code": "200", - "success": true, - "message": "Posted Withdrawal", - "error": null - } - } -} -``` - -##### Void Withdrawal - -Query: - -```graphql -mutation VoidLiquidityWithdrawal ($withdrawalId: String!) { - voidLiquidityWithdrawal($withdrawalId: String!) { - code - success - message - error - } -} -``` - -Query Variables (substitute the withdrawal ID from the "create withdrawal" request for `INSERT_WITHDRAWAL_ID`): - -```json -{ - "withdrawalId": "INSERT_WITHDRAWAL_ID" -} -``` - -Example successful response: - -```json -{ - "data": { - "voidLiquidityWithdrawal": { - "code": "200", - "success": true, - "message": "Voided Withdrawal", - "error": null - } - } -} -``` - -### Auto-peering - -Additionally, certain peers will have _auto-peering_ available. This feature is only for sandbox environments, and should not be used in production environments. Auto-peering enables easier peering integration between Rafiki instances. In order to use this feature, it requires the peer you want to peer with to publish an "auto-peering" URL. Once this `peerUrl` is provided, instead of using `createPeer` mutation to create a peer, you can call `createOrUpdatePeerByUrl`: - -```graphql -mutation CreateOrUpdatePeerByUrl($input: CreateOrUpdatePeerByUrlInput!) { - createOrUpdatePeerByUrl(input: $input) { - code - success - message - peer { - id - asset { - code - scale - } - staticIlpAddress - name - } - } -} -``` - -with the input being: - -```json -{ - "input": { - "peerUrl": "PEER_URL", - "assetId": "INSERT_ASSET_ID", - "liquidityToDeposit": - } -} -``` - -Calling this mutation will exchange ILP peering information (`staticIlpAddress` `ilpConnectorUrl`, auth tokens) automatically. The instance being peered with will issue a default amount of liquidity, and you can begin sending payments to wallet addresses at the other Rafiki instance. - -#### Prerequisites - -Before making the `createOrUpdatePeerByUrl` request, a few `backend` environment variables about your Rafiki instance need to be configured: - -1. `ILP_ADDRESS`: The static ILP address of your Rafiki instance. This should already be defined in order to support ILP payments. -2. `ILP_CONNECTOR_URL`: The full address of the ILP connector that will receive ILP packets. Locally and by default, it is on `0.0.0.0:3002`. -3. `INSTANCE_NAME`: The name of your Rafiki instance. This is how your peer will identify you. - -#### How to enable auto-peering - -:::caution -Auto-peering should _not_ be enabled in production environments. Only enable this feature in sandbox environments. -::: - -Other than setting up the environment variables from the prerequisite step above, you will need to set additional `backend` environment variables: - -1. `ENABLE_AUTO_PEERING`: true -2. Optionally, update the `AUTO_PEERING_SERVER_PORT` that the auto-peering server will run on. By default, it is `3005`. -3. Now, your Rafiki instance is ready to accept auto-peering requests. Your `peerUrl` will be the URL you've mapped to correspond with `AUTO_PEERING_SERVER_PORT`, and you can being communicating this URL to potential peers. +## Placeholder diff --git a/packages/documentation/src/content/docs/components/open-payments.mdx b/packages/documentation/src/content/docs/components/open-payments.mdx index 650e77fb66..52f2eab42c 100644 --- a/packages/documentation/src/content/docs/components/open-payments.mdx +++ b/packages/documentation/src/content/docs/components/open-payments.mdx @@ -2,130 +2,4 @@ title: Open Payments --- -Open Payments is an API standard that allows third-parties/clients to initiate payments and to view the transaction history on the account holder's account (with the account holder's consent). Extensive documentation can be found on the [Open Payments website](https://openpayments.guide). - -Rafiki implements the Open Payments APIs. Every request and response is validated against the [Open Payments API specification](https://github.com/interledger/open-payments/tree/main/openapi). - -To update the API specification, create a Pull Request on the [Open Payments GitHub Repository](https://github.com/interledger/open-payments/). Changes will automatically be pushed to [Readme](https://readme.com/), which hosts the [API reference](https://docs.openpayments.guide/reference/) on the [Open Payments website](https://openpayments.guide). - -## Key Registry - -### Sequence Diagram - -![Key registry diagram](/img/key-registry-diagram.png) - -### Basics - -#### What is the key registry? - -A key registry is a list of keys stored by a client that requires access to Open Payments resources protected by an authorization server (AS). A key is generated and added to the registry by a client and the client is represented by a [wallet address](/reference/glossary#wallet-address). The wallet address's associated key registry is exposed publically at the path `WALLET_ADDRESS/jwks.json` in anticipation of a grant request on an AS. - -#### What is the purpose of the key registry? - -The key registry allows an AS to verify that a client is who they say they are. Because a grant request is completed over multiple signed HTTP requests it is thus important for a client to provide a way to consistently identify itself across these requests to the AS. - -#### How is this achieved? - -The client will generate an asymmetric key pair, which should include a key id identifying them. When the client makes a grant request, it should include a signature in the header signed by the private key and a `Signature-Input` header that, among other things, should include the key id of the public key associated with the private key used to sign the signature. - -When the AS receives a signed grant request, it first acquires the key registry exposed by the client by making a `GET` request on its `/jwks.json` endpoint. The domain of the client is acquired by the AS during the initial grant request, after which the AS binds it to the grant and uses it to acquire the key registry for susequent grant requests. - -Once the AS has acquired the client's key registry, it searches for the public key with a key id that matches the one included in the `Signature-Input` header. Once it finds it, the public key will be used to decrypt and verify the signature. Then the AS will proceed with the grant request. - -### JWK - -#### Key Structure - -A key registry should expose public keys in the form of a JWK. They should be generated using the `ed25519` algorithm, and the resultant JWK should have fields with the following values: - -```json -// Key should also have a `kid` field to identify it in a signature -// Public keys should contain the `x` field -{ - "alg": "EdDSA", - "kty": "OKP", - "crv": "Ed25519" -} -``` - -The private key should be used to sign the payload described in the httpsig signature method. - -### Signature - -#### Signature Method - -The signature is formatted and verified using the [httpbis-message-signature](https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-message-signatures-16) method. - -In general, a request secured with the `httpsig` method contains two headers, the `Signature` and the `Signature-Input`. The `Signature` is data signed by the algorithm specified in the JWK, and the signature input is a comma-separated list of headers that map to values in the data that was signed. These values should match the values provided in the headers of a signed GNAP request. - -#### Signature Base - -The components of the signature base correspond to components of the HTTP request that it is supposed to sign, as described in the [GNAP core protocol](https://datatracker.ietf.org/doc/html/draft-ietf-gnap-core-protocol#section-7.3.1). - -The following components must be included: - -- **@method**: The method used in the HTTP request. -- **@target-uri**: The full request URI of the HTTP request. - -If the request has a body: - -- **content-digest**: The Content-Digest header of the request. It should contain - -If the request has an authorization header: - -- **authorization**: The authorization header used to present an access token. - -- **@signature-params**: A list of the metadata in the signature base, comprised primarily of a space-separated list of quote-enclosed component names further grouped in parentheses, a timestamp for when it was created, and the keyid of the key that signed it. - **NOTE:** `@signature-params` MUST be the last component listed in the signature base. - -Each component should be on a separate line. The component name should be in quotes, followed by a colon, then a space, then the value of the component. - -##### Signature Base Example - -```http -"@method": POST -"@target-uri": https://server.example.com/gnap -"content-digest": \ - sha-256=:q2XBmzRDCREcS2nWo/6LYwYyjrlN1bRfv+HKLbeGAGg=: -"content-length": 988 -"content-type": application/json -"@signature-params": ("@method" "@target-uri" "content-digest" \ - "content-length" "content-type");created=1618884473\ - ;keyid="gnap-rsa" -``` - -#### Signature Input Example - -```http -Signature-Input: sig1=("@method" "@target-uri" "content-digest" \ - "content-length" "content-type");created=1618884473\ - ;keyid="gnap-rsa";nonce="NAOEJF12ER2";tag="gnap" -``` - -## Grant Interaction Flow - -import { LargeImg } from '@interledger/docs-design-system' - -### Sequence Diagram - - - -### Endpoints - -If the AS deems interaction necessary to issue a grant, there are five main endpoints that are used once a pending grant has been created. In each endpoint, the specific interaction is identified with an interaction id and an interaction nonce. Both of these are provided in the query parameters of the URL when the authorization server redirects to the Identity Provider. The endpoints, in order of their calling, are as follows: - -- `GET /interact/:id/:nonce` (made by the client to the AS, establishes an interaction session, redirects browser session to IDP consent screen) -- `GET /grant/:id/:nonce` (made by the IDP to the AS, secured with `x-idp-secret` header, returns grant info for the consent screen to enumerate ) - - **This is served on INTERACTION_PORT and its default value is 3009** -- `POST /grant/:id/:nonce/(accept OR reject)` (made by the IDP to the AS, secured with `x-idp-secret` header, accepts or rejects the grant based on the user's input on the consent screen. **IDP then redirects to `GET /interact/:id/:nonce/finish`**) - - **This is served on INTERACTION_PORT and its default value is 3009** -- `GET /interact/:id/:nonce/finish` (ends the interaction established by `GET /interact/:id/:nonce`, redirects browser session to client callback. Contains a query param that either indicates a failure, or on success, a `hash` parameter that the client can use to verify the successful interaction, and the `interact_ref` that identifies the interaction on the AS.) - - Examples include: - `?result=grant_rejected` (if interaction was rejected) - `?result=grant_invalid` (if grant is not in a state where it may be accepted or rejected, e.g. already approved) - `?hash=p28jsq0Y2KK3WS__a42tavNC64ldGTBroywsWxT4md_jZQ1R\HZT8BOWYHcLmObM7XHPAdJzTZMtKBsaraJ64A -&interact_ref=4IFWWIKYBC2PQ6U56NL1` (if interaction was accepted) - `hash` is a `sha-256` hash of values provided by the client in the body of the [grant initialization request](https://docs.openpayments.guide/reference/post-request) (`interact.finish.nonce`), values returned in the AS response for that request (`interact.finish`), the `interact_ref` provided alongside the `hash`, and the uri of the grant initialization request (`https://auth-server.com/`). -- `POST /continue/:id` ([this should still be accurate](https://docs.openpayments.guide/reference/post-continue), final back-channel request made by client if interaction was successful, AS responds with an access token) - -#### On `x-idp-secret` - -`x-idp-secret` is the name of a header that is used for `GET /grant/:id/:nonce`, `POST /grant/:id/:nonce/accept`, and `POST /grant/:id/:nonce/reject` requests. Its purpose is to secure communications between the IDP and the AS and its value should be a shared secret known to both entities. - -To set this up, set the `IDENTITY_SERVER_SECRET` on the AS environment to a value that is also used to configure the IDP's requests to the AS. +## Placeholder diff --git a/packages/documentation/src/content/docs/components/telemetry.mdx b/packages/documentation/src/content/docs/components/telemetry.mdx index 3227f2c7d2..9fb6e6ce8f 100644 --- a/packages/documentation/src/content/docs/components/telemetry.mdx +++ b/packages/documentation/src/content/docs/components/telemetry.mdx @@ -2,226 +2,4 @@ title: Telemetry --- -## Purpose - -The objective of the telemetry feature is to gather metrics and establish an infrastructure for visualizing valuable network insights. The metrics we at the Interledger Foundation collect include: - -- The total amount of money transferred via packet data within a specified time frame (daily, weekly, monthly). -- The number of transactions from outgoing payments that have been at least partially successful. -- The average amount of money held within the network per transaction. - -We aim to track the growth of the network in terms of transaction sizes and the number of transactions processed. Our goal is to use these data for our own insights and to enable [Account Servicing Entities](/reference/glossary#account-servicing-entity) (ASEs) to gain their own insights. - -## Privacy and Optionality - -Privacy is a paramount concern for us. Rafiki's telemetry feature is designed to provide valuable network insights without violating privacy or aiding malicious ASEs. For more information, please [read the privacy docs](/telemetry/privacy). - -The telemetry functionality is currently enabled by default on test (non-livenet) environments, i.e. any environment that is not dealing with real money. When active, it transmits metrics to the "testnet" collector. In the future, those ASEs operating in a production "livenet" environment (real money) will be able to opt-in to sharing their metrics with a "livenet" collector. Regardless of environment, Account Servicing Entities (ASEs) can also opt-out of telemetry completely. - -## Architecture - -The architecture of the telemetry feature is illustrated below: - -![Telemetry architecture](/img/telemetry-architecture.png) - -## OpenTelemetry - -We have adopted [OpenTelemetry](https://opentelemetry.io/) to ensure compliance with a standardized framework that is compatible with a variety of tool suites. This allows clients to use their preferred tools for data analysis, while Rafiki is instrumented and observable through a standardized metrics format. - -## Telemetry ECS Cluster - -The Telemetry Replica service is hosted on AWS ECS Fargate and is configured for availability and load balancing of custom ADOT (AWS Distro for Opentelemetry) Collector ECS tasks. - -When ASEs opt for telemetry, metrics are sent to our Telemetry Service. To enable ASEs to build their own telemetry solutions, instrumented Rafiki can send data to multiple endpoints. This allows the integration of a local [Otel collector](https://opentelemetry.io/docs/collector/) container that can support custom requirements. Metrics communication is facilitated through [gRPC](https://grpc.io/). - -## Otel SDK - Rafiki Instrumentation - -The Opentelemetry SDK is integrated into Rafiki to create, collect, and export metrics. The SDK integrates seamlessly with the OTEL Collector. - -## Prometheus - AMP - -We use Amazon's managed service for Prometheus (AMP) to collect data from the Telemetry cluster. - -**Note**: AMP offers limited configuration options and cannot crawl data outside of AWS. This limitation led us to adopt a push model, using prometheusRemoteWrite, instead of a pull model. For future development, we may consider hosting our own Prometheus. - -## Grafana - Grafana Cloud - -Grafana Cloud is used for data visualization dashboards. It offers multiple tools that extend Prometheus Promql. - -**Note**: We initially used Amazon hosted Grafana, but it did not meet our needs for embedding dashboards. Grafana Cloud offers a feature called “Public dashboards”, which allows us to share dashboards. However, embedding may still pose a challenge. - -## Exchange Rates - -For telemetry purposes, all amounts collected by instrumented Rafiki should be converted to a base currency. - -**Privacy Reasoning**: If only two ASEs are peered over a non-USD currency and we collect data in that currency, it would be easy to determine the volumes moved between those two ASEs. To maintain privacy, we convert all amounts to a base currency. - -If an ASE does not provide the necessary exchange rate for a transaction, the telemetry solution will still convert the amount to the base currency using external exchange rates. A Lambda function on AWS retrieves and stores these external exchange rates. It is triggered by a daily CloudWatch event and stores the rates in a public S3 Bucket. The S3 Bucket does not have versioning, and the data is overwritten daily to further ensure privacy. - -## Instrumentation - -Rafiki currently has three counter metrics. All data points (counter increases and histogram records) are exported to collection endpoints at a configurable interval (default recommended to 15s). - -Currently collected metrics: - -- `transactions_total` - Counter metric - - Description: “Count of funded transactions” - - This counter metric increases by 1 for each successfully sent transaction. -- `transactions_amount` - Counter metric - - Description: “Amount sent through the network”. - - This amount metric increases by the amount sent in each ILP packet. -- `transaction_fee_amounts` - Counter metric - - Description: “Fee amount sent through the network”. - - This fee amount metric increases by the (amount sent minus amount received) for an outgoing payment. -- `ilp_pay_time_ms` - Histogram metric - - Description: “Time to complete an ILP payment” - - This histogram metric records the time taken to make an ILP payment. - -**Note**: The current implementation only collects metrics on the SENDING side of a transaction. Metrics for external open-payments transactions RECEIVED by a Rafiki instance in the network are not collected. - -## Privacy - -Rafiki telemetry is designed with a strong emphasis on privacy. The system anonymizes user data and refrains from collecting identifiable information. Since transactions can originate from any user to a Rafiki instance, the privacy measures are implemented directly at the source (each Rafiki instance). This means that at the individual level, the data is already anonymous as single Rafiki instances service transactions for multiple users. - -### Differential Privacy and Local Differential Privacy - -Differential Privacy is a system for publicly sharing information about a dataset by describing the patterns of groups within the dataset while withholding information about individuals in the dataset. Local Differential Privacy (LDP) is a variant of differential privacy where noise is added to each individual's data point before it is sent to the server. This ensures that the server never sees the actual data, providing a strong privacy guarantee. - -### Rounding Technique and Bucketing - -In our implementation, we use a rounding technique that essentially aggregates multiple transactions into the same value, making them indistinguishable. This is achieved by dividing the transaction values into buckets and rounding the values to the nearest bucket. - -The bucket size is calculated based on the raw transaction value. For lower value transactions, which are expected to occur more frequently, the bucket sizes are determined linearly for higher granularity. However, after a certain threshold, the bucket size calculation switches to a logarithmic function to ensure privacy for higher value transactions, which are less frequent but pose greater privacy concerns. - -To handle outliers, a "clipping" technique is implemented, capping the buckets. Any value that exceeds a given threshold is placed in a single bucket. Conversely, any value that falls below a certain minimum is also placed in a single bucket. This ensures that both high and low outliers do not disproportionately affect the overall data, providing further privacy guarantees for these transactions. - -### Laplacian Distribution - -The Laplacian distribution is often used in differential privacy due to its double exponential decay property. This property ensures that a small change in the data will not significantly affect the probability distribution of the output, providing a strong privacy guarantee. - -To achieve Local Differential Privacy (LDP), noise is selected from the Laplacian distribution and added to the rounded values. The noise is generated based on a privacy parameter, which is calculated using the sensitivity of the function. - -The sensitivity of a function in differential privacy is the maximum amount that any single observation can change the output of the function. In this case, the sensitivity is considered to be the maximum of the rounded value and the bucket size. - -The privacy parameter is computed as one-tenth of the sensitivity. This parameter controls the trade-off between privacy and utility: a smaller privacy parameter means more privacy but less utility, and a larger privacy parameter means less privacy but more utility. - -The noise, selected from the Laplacian distribution, is then generated using this privacy parameter and added to the rounded value. If the resulting value is zero, it is set to half the bucket size to ensure that the noise does not completely obscure the transaction value. - -### Currency Conversion - -Another factor that obscures sensitive data is currency conversion. In cross-currency transactions, exchange rates are provided by [ASEs](/reference/glossary#account-servicing-entity) internally. As such, they cannot be correlated to an individual transaction. If the necessary rates are not provided or not available from the ASE, an external API for exchange rates is used. The obtained exchange rates are overwritten frequently in this case, with no versioning or history access. This introduces an additional layer of noise and further protects the privacy of the transactions. - -### References - -Rafiki's telemetry solution is a combination of techniques described in various white papers on privacy-preserving data collection. For more information, you can refer to the following papers: - -- [Local Differential Privacy for Human-Centered Computing](https://jwcn-eurasipjournals.springeropen.com/articles/10.1186/s13638-020-01675-8) -- [Collecting Telemetry Data Privately](https://www.microsoft.com/en-us/research/blog/collecting-telemetry-data-privately/) -- [Collecting Telemetry Data Privately - NeurIPS Publication](https://proceedings.neurips.cc/paper_files/paper/2017/file/253614bbac999b38b5b60cae531c4969-Paper.pdf) by Bolin Ding, Janardhan Kulkarni, Sergey Yekhanin from Microsoft Research. -- [RAPPOR: Randomized Aggregatable Privacy-Preserving Ordinal Response](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/42852.pdf) - -### Experimental Transaction Values when using the Algorithm - -The following table shows the values in the algorithm when running transactions for different amounts. The raw value increases as you go down the rows of the table. -(all values are in scale 4) -| Raw Value | Bucket Size | Rounded Value | Privacy Parameter | Laplace Noise | Final Value | -|-----------|-------------|---------------|-------------------|---------------|-------------| -| 8300 | 10000 | 10000 | 1000 | 2037 | 12037 | -| 13200 | 15000 | 15000 | 1500 | 1397 | 16397 | -| 147700 | 160000 | 160000 | 16000 | -27128 | 132872 | -| 1426100 | 2560000 | 2560000 | 256000 | -381571 | 2178429 | -| 1788200 | 2560000 | 2560000 | 256000 | 463842 | 3023842 | -| 90422400 | 10000000 | 90000000 | 1000000 | 2210649 | 92210649 | -| 112400400 | 10000000 | 100000000 | 1000000 | 407847 | 100407847 | -| 222290500 | 10000000 | 100000000 | 1000000 | -686149 | 99313851 | - -## Integrating - -Rafiki allows for integrating [Account Servicing Entities](/reference/glossary#account-servicing-entity) (ASE) to build their own telemetry solution based on the [OpenTelemetry](https://opentelemetry.io/) standardized metrics format that Rafiki exposes. - -In order to do so, the integrating ASE must deploy its own OpenTelemetry collector that should act as a sidecar container to Rafiki. It needs to provide the OpenTelemetry collector's ingest endpoint so that Rafiki can start sending metrics to it. - -### Rafiki Telemetry Environment Variables - -- `ENABLE_TELEMETRY`: boolean, defaults to `true`. Enables the telemetry service on Rafiki. -- `LIVENET`: boolean. Should be set to `true` on production environments dealing with real money. If it is not set, it will default to `false`, and metrics will get sent to the testnet otel-collector -- `OPEN_TELEMETRY_COLLECTOR_URLS`: CSV of URLs for Open Telemetry collectors (e.g., `http://otel-collector-NLB-e3172ff9d2f4bc8a.elb.eu-west-2.amazonaws.com:4317,http://happy-life-otel-collector:4317`). -- `OPEN_TELEMETRY_EXPORT_INTERVAL`: number in milliseconds, defaults to `15000`. Defines how often the instrumented Rafiki instance should send metrics. -- `TELEMETRY_EXCHANGE_RATES_URL`: string URL, defaults to `https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json`. It defines the endpoint that Rafiki will query for exchange rates, as a fallback when ASE does not [provide them](/integration/getting-started/#exchange-rates). If set, the response format of the external exchange rates API should be of type Rates, as the rates service expects. - The default endpoint set here points to a public S3 that has the previously mentioned required format, updated daily. - -### Example Docker OpenTelemetry Collector Image and Configuration - -Example of Docker OpenTelemetry Collector image and configuration that integrates with Rafiki and sends data to a Prometheus remote write endpoint: - -(it can be tested in our [Local Playground](/playground/overview) setup, by also providing the environment variables listed above to happy-life-backend in the [docker-compose](https://github.com/interledger/rafiki/blob/main/localenv/happy-life-bank/docker-compose.yml)) - -##### Docker-compose config: - -```yaml -#Serves as example for optional local collector configuration -happy-life-otel-collector: - image: otel/opentelemetry-collector-contrib:latest - command: ['--config=/etc/otel-collector-config.yaml', ''] - environment: - - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID-''} - - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY-''} - volumes: - - ../collector/otel-collector-config.yaml:/etc/otel-collector-config.yaml - networks: - - rafiki - expose: - - 4317 - ports: - - '13132:13133' # health_check extension -``` - -##### OpenTelemetry OTEL collector config: - -[OTEL Collector config docs](https://opentelemetry.io/docs/collector/configuration/) - -```yaml -# Serves as example for the configuration of a local OpenTelemetry Collector that sends metrics to an AWS Managed Prometheus Workspace -# Sigv4auth required for AWS Prometheus Remote Write access (USER with access keys needed) - -extensions: - sigv4auth: - assume_role: - arn: 'arn:aws:iam::YOUR-ROLE:role/PrometheusRemoteWrite' - sts_region: 'YOUR-REGION' - -receivers: - otlp: - protocols: - grpc: - http: - cors: - allowed*origins: - - http://* - - https://\_ - -processors: - batch: - -exporters: - logging: - verbosity: 'normal' - prometheusremotewrite: - endpoint: 'https://aps-workspaces.YOUR-REGION.amazonaws.com/workspaces/ws-YOUR-WORKSPACE-IDENTIFIER/api/v1/remote_write' - auth: - authenticator: sigv4auth - -service: - telemetry: - logs: - level: 'debug' - metrics: - level: 'detailed' - address: 0.0.0.0:8888 - extensions: [sigv4auth] - pipelines: - metrics: - receivers: [otlp] - processors: [batch] - exporters: [logging, prometheusremotewrite] -``` +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/admin-apis.mdx b/packages/documentation/src/content/docs/integration/admin-apis.mdx index 81f60c5f7f..46acef7c96 100644 --- a/packages/documentation/src/content/docs/integration/admin-apis.mdx +++ b/packages/documentation/src/content/docs/integration/admin-apis.mdx @@ -2,289 +2,4 @@ title: Admin APIs --- -After Rafiki has been deployed, [Account Servicing Entities](/reference/glossary#account-servicing-entity) can manage their Rafiki instance via two GraphQL Admin APIs, the [`backend` Admin API](/apis/backend/mutations) and the [`auth` Admin API](/apis/auth/mutations). - -The `backend` Admin API allows Account Servicing Entities to manage: - -- [assets](/reference/glossary#asset) -- [peers](/reference/glossary#peer) -- [wallet addresses](/reference/glossary#wallet-address) -- [Open Payments](/reference/glossary#open-payments) resources -- several types of [liquidity](/concepts/accounting/liquidity) within Rafiki - -The `auth` Admin API allows Account Servicing Entities to manage [Open Payments](/reference/glossary#open-payments) [grants](/reference/glossary#grant-negotiation-authorization-protocol). - -## Webhook Events - -import { Mermaid } from '@interledger/docs-design-system' - -Paired together with the [`backend` Admin API](/apis/backend/mutations), webhook events are the main communication channel between the Rafiki instance and the Account Servicing Entity. -Most events require the Account Servicing Entity's server to interact with Rafiki, either to deposit or withdraw liquidity into or from Rafiki, or to provide wallet address information. This document will describe how an Account Servicing Entity should handle each of the defined webhook events. - -### Setup - -When events happen in the Rafiki instance, the Rafiki `backend` service will make a POST request to the configured `WEBHOOK_URL` (`backend` environment variable), and will expect a 200 status in the response. - -#### Request Body - -Each webhook has the following structure in the request body: - -| Variable Name | Type | Description | -| ------------- | ----------------------------- | ----------- | -| `id` | String | Unique UUID | -| `type` | Enum: [EventType](#eventtype) | | -| `data` | Object | Event data | - -##### EventType - -| Value | Description | -| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | -| [`incoming_payment.created`](#incoming_paymentcreated) | An incoming payment has been created. | -| [`incoming_payment.completed`](#incoming_paymentcompleted) | An incoming payment is complete and will not accept any additional incoming funds. | -| [`incoming_payment.expired`](#incoming_paymentexpired) | An incoming payment expired and will not accept any additional incoming funds. | -| [`outgoing_payment.created`](#outgoing_paymentcreated) | An outgoing payment was created. | -| [`outgoing_payment.completed`](#outgoing_paymentcompleted) | An outgoing payment completed. | -| [`outgoing_payment.failed`](#outgoing_paymentfailed) | An outgoing payment partially or completely failed. | -| [`wallet_address.not_found`](#wallet_addressnot_found) | A requested wallet address was not found. | -| [`wallet_address.web_monetization`](#wallet_addressweb_monetization) | Web Monetization payments received via STREAM. | -| [`asset.liquidity_low`](#assetliquidity_low) | Asset liquidity has dropped below defined threshold. | -| [`peer.liquidity_low`](#peerliquidity_low) | Peer liquidity has dropped below defined threshold. | - -An OpenAPI specification of the webhook requests and their corresponding data can be found [here](https://github.com/interledger/rafiki/blob/main/packages/backend/src/openapi/specs/webhooks.yaml). - -Additionally, the [local playground](/playground/overview#usage) contains example payloads in the Bruno collection that can be used to test a webhook service integration. - -### Events - -#### `incoming_payment.created` - -The `incoming_payment.created` event indicates that an incoming payment has been created. This webhook event is only informational, since at this point, the incoming payment has not received any funds (i.e. no actions around liquidity are required). This webhook event could be used by the Account Servicing Entity to display upcoming incoming payments to their users. - ->ASE: webhook event: incoming payment created - ASE->>ASE: no action required - -`} -/> - -#### `incoming_payment.completed` - -The `incoming_payment.completed` event indicates that an incoming payment has been completed, either automatically or manually, and that any funds that have been received into this incoming payment should be withdrawn and credited to the recipient's account with the Account Servicing Entity. - -In addition, the `CreateIncomingPaymentWithdrawal` mutation supports [two-phase transfers](/reference/glossary#two-phase-transfers). - -Example: An incoming payment was completed and received **$10**. - ->ASE: webhook event: incoming payment completed,
receivedAmount: $10 - ASE->>R: admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: credit receiver's account with $10 - -`} -/> - -Example: An incoming payment supporting two-phase transfers was completed and recieved **$10**. - ->ASE: webhook event: incoming payment completed,
receivedAmount: $10 - ASE->>R: admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: credit receiver's account with $10 - ASE->>R: admin API call: PostLiquidityWithdrawal - R->>R: 2-phase transfer completed - -`} -/> - -#### `incoming_payment.expired` - -The `incoming_payment.expired` event indicates that an incoming payment has expired, and that any funds that have been received into this incoming payment should be withdrawn and credited to the recipient's account with the Account Servicing Entity. Note that this event is not fired if there were no funds received by the incoming payment since there is no action required by the Account Servicing Entity. - -Example: An incoming payment has expired and received **$2.55**. - ->ASE: webhook event: incoming payment expired,
receivedAmount: $2.55 - ASE->>R: admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: credit receiver's account with $2.55 - -`} -/> - -#### `outgoing_payment.created` - -The `outgoing_payment.created` event indicates that an outgoing payment has been created and is awaiting liquidity. The Account Servicing Entity should verify the user account balance (and perform any other kinds of checks necessary) before funding or cancelling the outgoing payment. -In the case where the outgoing payment should _not_ be fullfilled, the Account Servicing Entity can cancel the outgoing payment. -Otherwise, the Account Servicing Entity should put a hold on the sender’s account and deposit the funds into Rafiki. - -Example: An outgoing payment for **$12** has been created. - ->ASE: webhook event: outgoing payment created,
debitAmount: $12 - ASE->>ASE: check if account has enough balance - alt Account has enough balance - ASE->>ASE: put hold of $12 on sender's account - ASE->>R: admin API call: DepositOutgoingPaymentLiquidity - end - alt Account does not have enough balance - ASE->>R: admin API call: CancelOutgoingPayment
reason: Not enough balance - end - -`} -/> - -#### `outgoing_payment.completed` - -The `outgoing_payment.completed` event indicates that an outgoing payment has successfully sent as many funds as possible to the receiver. The Account Servicing Entity should withdraw any excess liquidity from that outgoing payment in Rafiki and use it as they see fit. One option would be to return it to the sender. Another option is that the excess liquidity is considered a fee and retained by the Account Servicing Entity. Furthermore, the Account Servicing Entity should remove the hold on the sender's account and debit it. - -In addition, the `CreateOutgoingPaymentWithdrawal` mutation supports [two-phase transfers](/reference/glossary#two-phase-transfers). - -Example: An outgoing payment amount for **$12** has been completed. **$11.50** were sent. The Account Servicing Entity keeps **$0.50** as fees. - ->ASE: webhook event: outgoing completed,
debitAmount: $12, sentAmount:$11.50 - ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal - ASE->>ASE: remove the hold and deduct $12 from the sender's account,
credit ASE's account with $0.50 - -`} -/> - -Example: An outgoing payment supporting two-phase transfers for **$12** has been completed. **$11.50** were sent. The Account Servicing Entity keeps **$0.50** as fees. - ->ASE: webhook event: outgoing completed,
debitAmount: $12, sentAmount:$11.50 - ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal - ASE->>ASE: remove the hold and deduct $12 from the sender's account,
credit ASE's account with $0.50 - ASE->>R: admin API call: PostLiquidityWithdrawal - R->>R: 2-phase transfer completed - -`} -/> - -#### `outgoing_payment.failed` - -The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was also unsuccessful. The Account Servicing Entity should withdraw any remaining liquidity from that outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` was 0), the Account Servicing Entity should remove the hold from the sender's account. If the payment failed partially, the Account Servicing Entity should remove the hold from the sender's account and debit it with the amount that has been sent, but they should refrain from taking a sending fee. - -Example: An outgoing payment for **$12** has failed. **$8** were sent. - ->ASE: webhook event: outgoing failed,
debitAmount: $12, sentAmount:$8 - ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal - ASE->>ASE: remove the hold and deduct $8 from the sender's account - -`} -/> - -#### `wallet_address.web_monetization` - -The `wallet_address.web_monetization` event indicates that a wallet address has received web monetization payments via STREAM (raw ILP access). The Account Servicing Entity should withdraw that liquidity from the wallet address and credit the receiver's account. - -Example: A wallet address received **$0.33** - ->ASE: webhook event: wallet address web monetization,
receivedAmount: $0.33 - ASE->>R: admin API call: CreateWalletAddressWithdrawal - ASE->>ASE: credit receiver's account with $0.33 - -`} -/> - -#### `wallet_address.not_found` - -The `wallet_address.not_found` event indicates that a [wallet address](/reference/glossary#wallet-address) was requested (via the [Open Payments API](/reference/glossary#open-payments)), but it doesn't exist in Rafiki. When receiving this event, the Account Servicing Entity can perform a lookup for the relevant account in their system, and [create](/integration/getting-started#issuing-wallet-addresses) a wallet address. The initial request for the wallet address will succeed if the Account Servicing Entity creates it within the configurable [`WALLET_ADDRESS_LOOKUP_TIMEOUT_MS`](/integration/deployment#environment-variables) timeframe. - -Example: The wallet address `https://example-wallet.com/carla_garcia` was requested but does not yet exist - ->ASE: webhook event: wallet address not found,
wallet address: https://example-wallet.com/carla_garcia - ASE->>R: admin API call: CreateWalletAddress
url: https://example-wallet.com/carla_garcia,
public name: Carla Eva Garcia - -`} -/> - -#### `asset.liquidity_low` - -The `asset.liquidity_low` event indicates that the liquidity of an [asset](/reference/glossary#asset) has dropped below a predefined liquidity threshold. When receiving this event, the Account Servicing Entity should check if they have or can acquire additional liquidity of said asset and if so, deposit it in Rafiki. If the Account Servicing Entity cannot or does not increase the asset liquidity in Rafiki, cross-currency transfers will fail. - -Example: The asset liquidity for USD (scale: 2) drops below 100.00 USD. - ->ASE: webhook event: liquidity (asset) low,
asset: USD (scale: 2, id: "abc") - ASE->>R: admin API call: DepositAssetLiquidity - -`} -/> - -#### `peer.liquidity_low` - -The `peer.liquidity_low` event indicates that the liquidity of a [peer](/reference/glossary#peer) has dropped below a predefined liquidity threshold. When receiving this event, the Account Servicing Entity need to decide if they can extend said peer's credit line or whether they need to settle first and then extend a new line of credit. If the Account Servicing Entity cannot or does not increase the peer liquidity in Rafiki, transfers to that peer will fail. - -Example: The peer liquidity for Happy Life Bank drops below 100.00 USD. - ->ASE: webhook event: liquidity (peer) low,
peer: Happy Life Bank (asset: "USD", scale: 2, id: "abc") - ASE->>R: admin API call: DepositPeerLiquidity - -`} -/> - -### Errors - -If an error occurs when Rafiki sends a webhook event (a non-200 status is returned or the request times out), Rafiki will keep retrying the webhook requests at increasing intervals (first retry after 10 seconds, second after 20 more, next after 30 more, etc.) until a 200 status is returned. The maximum number of retries for webhook events can be configured via the `WEBHOOK_MAX_RETRY` environment variable. - -Additionally, the timeout for webhook requests can be configured with the `WEBHOOK_TIMEOUT` environment variable. - -### Best Practices - -#### Duplicate Events - -The `id` in the webhook event payload is a unique UUID which can be used by the Account Servicing Entity's system to determine whether the event has been received previously, preventing duplicate processing of events. - -#### Asynchronous Handling - -Account Servicing Entities should consider using a worker to process received webhook events, especially if requests to credit/debit user accounts are long processes. This would allow the server to process events at a rate suitable for the system, and would reduce the amount of failed/retried webhook events, since the webhook event listener can immediately reply with a successful 200 status. +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-production.mdx b/packages/documentation/src/content/docs/integration/deploy-to-production.mdx index e7a2eb1142..caabe65828 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-production.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-production.mdx @@ -2,146 +2,4 @@ title: Deploy to production --- -The production environment consists of - -- `backend` -- `auth` -- (optional but recommended) `frontend` - -and the databases - -- TigerBeetle or Postgres (accounting) -- Postgres (Open Payments resources, auth resources) -- Redis (STREAM details, auth sessions) - -To integrate Rafiki with your own services, view the [integration documentation](/integration/getting-started). - -### Running the production environment - -Dependencies: - -- [Kubernetes](https://kubernetes.io/releases/download/) -- [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl) -- [helm](https://helm.sh/docs/intro/install/) - -Rafiki cannot be run by itself but needs at least a Postgres and a Redis instance running with it. If you prefer to use Tigerbeetle instead of Postgres for accounting, a Tigerbeetle instance is required as well. - -An example Chart including Rafiki, Postgres, and Redis can be found [here](https://github.com/interledger/rafiki/tree/main/infrastructure/helm/rafiki/). - -To install this chart, run - -```sh -helm install rafiki PATH_TO_RAFIKI_REPO/infrastructure/helm/rafiki -``` - -In this alpha version, by default, no ports are exposed. You can port-forward the frontend (Admin UI) port by running - -```sh -// get list of pod names -kubectl get pods - -// port forward -kubectl port-forward rafiki-rafiki-frontend-YOUR-SEQUENCE 3010:3010 -``` - -Now, the Admin UI can be found on localhost:3010. - -**❗ Update at least the values.yaml file before running the example Chart in production.** - -### Environment Variables - -#### Backend - -| Variable | Helm Value Name | Default | Description | -| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ADMIN_PORT` | backend.port.admin | `3001` | Admin API GraphQL Server port | -| `AUTH_SERVER_GRANT_URL` | | `undefined` | endpoint on the Open Payments Auth Server to request a grant | -| `AUTH_SERVER_INTROSPECTION_URL` | | `undefined` | endpoint on the Open Payments Auth Server to introspect an access token | -| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/concepts/interledger-protocol/peering#auto-peering) is enabled, its server will use this port | -| `CONNECTOR_PORT` | backend.port.connector | `3002` | port of the ILP connector for for sending packets over ILP over HTTP | -| `DATABASE_URL` | backend.postgresql.host, backend.postgresql.port, backend.postgresql.username, backend.postgresql.database, backend.postgresql.password | `postgresql://postgres:password@localhost:5432/development` | Postgres database URL of database storing the resource data; For Helm, these components are provided individually. | -| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/concepts/interledger-protocol/peering#auto-peering). | -| `ENABLE_SPSP_PAYMENT_POINTERS` | | `true` | enables [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) route | -| `EXCHANGE_RATES_LIFETIME` | backend.lifetime.exchangeRate | `15_000` | time in milliseconds the exchange rates provided by the ASE via the EXCHANGE_RATES_URL are valid for | -| `EXCHANGE_RATES_URL` | backend.serviceUrls.EXCHANGE_RATES_URL | `undefined` | endpoint on the Account Servicing Entity to request exchange rates | -| `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` | backend.idempotencyTTL | `86400000` | TTL in milliseconds for idempotencyKey on GraphQL mutations (Admin API). Default: 24hrs | -| `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` | | `2000` | TTL in milliseconds for idempotencyKey concurrency lock on GraphQL mutations (Admin API) | -| `ILP_ADDRESS` | backend.ilp.address | `undefined` | ILP address of this Rafiki instance | -| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/concepts/interledger-protocol/peering#auto-peering) | -| `INCOMING_PAYMENT_EXPIRY_MAX_MS` | | `2592000000` | Maximum milliseconds into the future incoming payments expiry can be set to on creation. Default: 30 days | -| `INCOMING_PAYMENT_WORKERS` | backend.workers.incomingPayment | `1` | number of workers processing incoming payment requests | -| `INCOMING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that INCOMING_PAYMENT_WORKERS will wait until they check an empty incoming payment request queue again | -| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/concepts/interledger-protocol/peering#auto-peering) | -| `KEY_ID` | backend.key.id | `undefined` | this Rafiki instance's client key id | -| `LOG_LEVEL` | backend.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | -| `NODE_ENV` | backend.nodeEnv | `development` | node environment, `development`, `test`, or `production` | -| `OPEN_PAYMENTS_PORT` | backend.port.openPayments | `3003` | port of the Open Payments resource server port | -| `OPEN_PAYMENTS_URL` | backend.serviceUrls.OPEN_PAYMENTS_URL | `undefined` | public endpoint of this Open Payments Resource Server | -| `OUTGOING_PAYMENT_WORKERS` | backend.workers.outgoingPayment | `4` | number of workers processing outgoing payment requests | -| `OUTGOING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that OUTGOING_PAYMENT_WORKERS will wait until they check an empty outgoing payment request queue again | -| `PRIVATE_KEY_FILE` | backend.key.file | `undefined` | the path to this Rafiki instance's client private key | -| `QUOTE_LIFESPAN` | backend.lifetime.quote | `5 * 60_000` | time in milliseconds an Open Payments quote is valid for | -| `REDIS_TLS_CA_FILE_PATH` | backend.redis.tlsCaFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_TLS_CERT_FILE_PATH` | backend.redis.tlsCertFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_TLS_KEY_FILE_PATH` | backend.redis.tlsKeyFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_URL` | backend.redis.host, backend.redis.port | `redis://127.0.0.1:6379` | Redis URL of database handling ILP packet data URL; For Helm, these components are provided individually. | -| `SIGNATURE_SECRET` | backend.quoteSignatureSecret | `undefined` | secret to generate request header signatures for webhook event requests | -| `SIGNATURE_VERSION` | | `1` | version number to generate request header signatures for webhook event requests | -| `SLIPPAGE` | backend.ilp.slippage | `0.01` | accepted ILP rate fluctuation, default 1% | -| `STREAM_SECRET` | backend.ilp.streamSecret | undefined | seed secret to generate shared STREAM secrets | -| `TIGERBEETLE_CLUSTER_ID` | | `0` | Tigerbeetle cluster ID picked by the system that starts the TigerBeetle cluster to create a [Tigerbeetle client](https://docs.tigerbeetle.com/clients/node#creating-a-client) | -| `TIGERBEETLE_REPLICA_ADDRESSES` | | `3004` | Tigerbeetle replica addresses for all replicas in the cluster, which are comma separated IP addresses/ports, to create a [Tigerbeetle client](https://docs.tigerbeetle.com/clients/node#creating-a-client) | -| `TRUST_PROXY` | | `false` | flag to use X-Forwarded-Proto header to determine if connections is secure | -| `USE_TIGERBEETLE` | | `true` | flag - use TigerBeetle or Postgres for accounting | -| `WALLET_ADDRESS_DEACTIVATION_PAYMENT_GRACE_PERIOD_MS` | | `86400000` | time in milliseconds into the future to set expiration of open incoming payments when deactivating wallet address. Default: 1 days | -| `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` | | `1500` | time in milliseconds the ASE has to create a missing wallet address until timeout | -| `WALLET_ADDRESS_POLLING_FREQUENCY_MS` | | `100` | frequency of polling while waiting for ASE to create a missing wallet address | -| `WALLET_ADDRESS_URL` | backend.serviceUrls.WALLET_ADDRESS_URL | `http://127.0.0.1:3001/.well-known/pay` | this Rafiki instance's internal wallet address | -| `WALLET_ADDRESS_WORKERS` | backend.workers.walletAddress | `1` | number of workers processing wallet address requests | -| `WALLET_ADDRESS_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that WALLET_ADDRESS_WORKERS will wait until they check an empty wallet address request queue again | -| `WEBHOOK_MAX_RETRY` | backend.webhookMaxRetry | `10` | maximum number of times Rafiki backend retries sending a certain webhook event to the configured WEBHOOK_URL | -| `WEBHOOK_TIMEOUT` | backend.lifetime.webhook | `2000` | milliseconds | -| `WEBHOOK_URL` | backend.serviceUrls.WEBHOOK_URL | `undefined` | endpoint on the Account Servicing Entity that consumes webhook events | -| `WEBHOOK_WORKERS` | backend.workers.webhook | `1` | number of workers processing webhook events | -| `WEBHOOK_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that WEBHOOK_WORKERS will wait until they check an empty webhook event queue again | -| `WITHDRAWAL_THROTTLE_DELAY` | backend.withdrawalThrottleDelay | `undefined` | delay in liquidity withdrawal processing | -| `ENABLE_MANUAL_MIGRATIONS` | backend.enableManualMigrations | `false` | When set to true, user needs to run database manually with command `npm run knex -- migrate:latest --env production` | - -#### Auth - -| Variable | Helm Value Name | Default | Description | -| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ACCESS_TOKEN_DELETION_DAYS` | auth.accessToken.deletionDays | `30` | days until expired or revoked access tokens are deleted | -| `ACCESS_TOKEN_EXPIRY_SECONDS` | auth.accessToken.expirySeconds | `10 * 60` | expiry time in seconds for access tokens (default: 10 minutes) | -| `ADMIN_PORT` | auth.port.admin | `3003` | Admin API GraphQL Server port | -| `AUTH_DATABASE_URL` | auth.postgresql.host, auth.postgresql.port, auth.postgresql.username, auth.postgresql.database, auth.postgresql.password | `postgresql://postgres:password@localhost:5432/auth_development` | Postgres database URL of database storing the grant data; For Helm, these components are provided individually. | -| `AUTH_PORT` | auth.port.auth | `3006` | port of this Open Payments Auth Server | -| `AUTH_SERVER_URL` | | | Public endpoint for this Rafiki instance's public Open Payment routes. | -| `COOKIE_KEY` | auth.cookieKey | | [koa KeyGrip key](https://koajs.com/#app-keys-) that is used to sign cookies for an interaction session | -| `DATABASE_CLEANUP_WORKERS` | auth.workers.cleanup | `1` | number of workers processing expired or revoked access tokens | -| `IDENTITY_SERVER_URL` | auth.identityServer.domain | | endpoint of the identity server controlled by the Account Servicing Entity | -| `IDENTITY_SERVER_SECRET` | auth.identityServer.secret | | API key to fetch the identity server endpoint | -| `INCOMING_PAYMENT_INTERACTION` | auth.interaction.incomingPayment | `false` | flag - incoming payments grant requests are interactive or not | -| `INTERACTION_EXPIRY_SECONDS` | auth.interactionExpirySeconds | `600` | time in seconds for which a user can interact with a grant request | -| `INTERACTION_PORT` | auth.port.interaction | `3009` | Port number for the interaction APIs | -| `INTROSPECTION_PORT` | auth.port.introspection | `3007` | port of this Open Payments Auth - Token Introspection Server | -| `LIST_ALL_ACCESS_INTERACTION` | | `true` | Specify whether grant requests including a `list-all` action should require interaction. In these requests, the client asks to list resources that they themselves did not create. | -| `LOG_LEVEL` | auth.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | -| `NODE_ENV` | auth.nodeEnv | `development` | node environment, `development`, `test`, or `production` | -| `QUOTE_INTERACTION` | auth.interaction.quote | `false` | flag - quote grants are interactive or not | -| `REDIS_TLS_CA_FILE_PATH` | auth.redis.tlsCaFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_TLS_CERT_FILE_PATH` | auth.redis.tlsCertFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_TLS_KEY_FILE_PATH` | auth.redis.tlsKeyFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_URL` | `auth.redis.host`, `auth.redis.port` | `redis://127.0.0.1:6379` | The connection URL for Redis. For Helm, these components are provided individually. | -| `TRUST_PROXY` | | `false` | flag to use X-Forwarded-Proto header to determine if connections is secure | -| `WAIT_SECONDS` | auth.grant.waitSeconds | `5` | wait time included in grant request response (`grant.continue`) | -| `ENABLE_MANUAL_MIGRATIONS` | auth.enableManualMigrations | `false` | When set to true, user needs to run database manually with command `npm run knex -- migrate:latest --env production` | - -#### Frontend - -| Variable | Helm Value Name | Default | Description | -| -------------------------------- | -------------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `GRAPHQL_URL` | frontend.serviceUrls.GRAPHQL_URL | `http://localhost:3001/graphql` | URL for the GraphQL Admin API | -| `OPEN_PAYMENTS_URL` | frontend.serviceUrls.OPEN_PAYMENTS_URL | `http://localhost:3003/` | Open Payments API Endpoint | -| `PORT` | frontend.port | `3005` | Port from which to host the Remix app | -| `ENABLE_INSECURE_MESSAGE_COOKIE` | | _undefined_ | Values of `true`, `t`, `1` will not use a `secure` message cookie which is required for flash messages to work over http. When not set, the secure flag is set according to `NODE_ENV`. | +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/get-started.mdx b/packages/documentation/src/content/docs/integration/get-started.mdx index f89ae8d61f..802d039730 100644 --- a/packages/documentation/src/content/docs/integration/get-started.mdx +++ b/packages/documentation/src/content/docs/integration/get-started.mdx @@ -2,305 +2,4 @@ title: Get started --- -:::caution -Rafiki is intended to be run by [Account Servicing Entities](/reference/glossary#account-servicing-entity) only and should not be used in production by non-regulated entities. -::: - -Account Servicing Entities provide and maintain payment accounts. In order to make these accounts Interledger-enabled via Rafiki, they need to provide the following endpoints and services: - -- [exchange rates](#exchange-rates) -- [webhook event listener](#webhook-event-listener) -- [Identity Provider](#identity-provider) - -Furthermore, each payment account managed by the Account Servicing Entity needs to be issued at least one [wallet address](#issuing-wallet-addresses) in order to be serviced by Rafiki and send or receive Interledger payments. - -## Exchange Rates - -Every Interledger payment is preceded by a rate probe that estimates the costs for transferring value from A to B over the network (= network fee). For the rate probe to be successful, Rafiki needs to be provided with the current exchange rate by the Account Servicing Entity. The Account Servicing Entity needs to expose an endpoint that accepts a `GET` requests and responds as follows. - -#### Response Body - -| Variable Name | Type | Description | -| -------------------- | ------ | ------------------------------------------------------------------------------------------------------ | -| `base` | String | asset code represented as [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), e.g. `USD` | -| `rates` | Object | Object containing `` pairs, e.g. `{EUR: 0.8930}` | -| `rates.` | Number | exchange rate given `base` and `` | - -The response status code for a successful request is a `200`. The `mock-account-servicing-entity` includes a [minimalistic example](https://github.com/interledger/rafiki/blob/main/localenv/mock-account-servicing-entity/app/routes/rates.ts). - -The `backend` package requires an environment variable called `EXCHANGE_RATES_URL` which MUST specify the URL of this endpoint. An OpenAPI specification of that endpoint can be found [here](https://github.com/interledger/rafiki/blob/main/packages/backend/src/openapi/specs/exchange-rates.yaml). - -## Fees - -The Account Servicing Entity may charge fees on top of the estimated network fee for facilitating the transfer. They can specify fixed and variable fees per asset using the Admin API or UI. How they structure those fees is completely up to the Account Servicing Entity. - -Sending fees can be set on a given asset using Admin UI or the `setFee` graphql mutation if desired: - -Mutation: - -```graphql -mutation SetFee($input: SetFeeInput!) { - setFee(input: $input) { - code - success - message - fee { - id - assetId - type - fixed - basisPoints - createdAt - } - } -} -``` - -Query Variables: - -```json -{ - "input": { - "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", - "type": "SENDING", - "fee": { - "fixed": 100, - "basisPoints": 100 - } - } -} -``` - -Example Successful Response - -```json -{ - "data": { - "setFee": { - "code": "200", - "success": true, - "message": "Fee set", - "fee": { - "id": "140fd9c0-8f14-4850-9724-102f04d97e69", - "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", - "type": "SENDING", - "fixed": "100", - "basisPoints": 100, - "createdAt": "2023-09-13T14:59:53.435Z" - } - } - } -} -``` - -## Webhook Event Listener - -Rafiki itself does not hold any user account balances, but instead, keeps track of [liquidity](/concepts/accounting/liquidity) within asset, peer, and payment accounts. This liquidity needs to be managed primarily as a response to certain events that happen in Rafiki. In order for Rafiki to notify the Account Servicing Entity about those events, the Account Servicing Entity need to expose a webhook endpoint that listens for these events and reacts accordingly. - -The Account Servicing Entity's expected behavior when observing these webhook events is detailed in the [Webhook Events](/integration/webhook-events) documentation. - -## Identity Provider - -An Identity Provider is a service that verifies the identity of a user. In order to allow the authorization of payments by third parties, Rafiki must be integrated with an Identity Provider to handle authentication and consent. This information is collected in order to authorize grants made through the [Open Payments Standard](/reference/glossary#open-payments). The Rafiki `backend` exposes the APIs for Open Payments, and requests to them are authorized by an opinionated version of the [Grant Negotiation Authorization Protocol (GNAP)](/reference/glossary/#grant-negotiation-authorization-protocol). A reference implementation of a Open Payments Authorization Server is include with Rafiki in the `auth` package. - -The Authorization Server in the `auth` package extends an [API](/concepts/open-payments/grant-interaction/) for integrating Identity Providers to use to begin & finish an interaction to collect authorization, acquire information on a particular grant, and communicate that a user has authorized a grant. An OpenAPI specification of those endpoints can be found [here](https://github.com/interledger/rafiki/blob/main/packages/auth/src/openapi/specs/id-provider.yaml). - -## Issuing Wallet Addresses - -A [Wallet Address](/reference/glossary#wallet-address) is a standardized identifier for a payment account. It can be created using the [Admin API](/integration/management). Note that at least one asset has to be created prior to creating the wallet address since an `assetId` MUST be provided as input variable on wallet address creation. - -### Create Asset - -Query: - -```graphql -mutation CreateAsset($input: CreateAssetInput!) { - createAsset(input: $input) { - code - success - message - asset { - id - code - scale - } - } -} -``` - -Query Variables: - -```json -{ - "input": { - "code": "USD", - "scale": 2 - } -} -``` - -Example Successful Response - -```json -{ - "data": { - "createAsset": { - "code": "200", - "success": true, - "message": "Created Asset", - "asset": { - "id": "0ddc0b7d-1822-4213-948e-915dda58850b", - "code": "USD", - "scale": 2 - } - } - } -} -``` - -### Create Wallet Address - -Query: - -```graphql -mutation CreateWalletAddress($input: CreateWalletAddressInput!) { - createWalletAddress(input: $input) { - code - success - message - walletAddress { - id - createdAt - publicName - url - asset { - code - id - scale - } - } - } -} -``` - -Query Variables: - -\*Note `additionalProperties` are optional. - -```json -{ - "input": { - "assetId": "0ddc0b7d-1822-4213-948e-915dda58850b", - "publicName": "Sarah Marshall", - "url": "https://example.wallet.com/sarah", - "additionalProperties": [ - { - "key": "iban", - "value": "NL93 8601 1117 947", - "visibleInOpenPayments": false - }, - { "key": "nickname", "value": "S Mar", "visibleInOpenPayments": true } - ] - } -} -``` - -Example Successful Response - -```json -{ - "data": { - "createWalletAddress": { - "code": "200", - "success": true, - "message": "Created wallet address", - "walletAddress": { - "id": "695e7546-1803-4b45-96b6-6a53f4082018", - "createdAt": "2023-03-03T09:07:01.107Z", - "publicName": "Sarah Marshall", - "url": "https://example.wallet.com/sarah", - "asset": { - "id": "0ddc0b7d-1822-4213-948e-915dda58850b", - "code": "USD", - "scale": 2 - } - } - } - } -} -``` - -The Account Servicing Entity SHOULD store at least the `walletAddress.id` in their internal database to be able to reference the account and wallet address. - -### Create Wallet Address Key - -In order to use the [Open Payments](/reference/glossary#open-payments) APIs, a wallet address needs to be associated with at least one private-public-keypair to be able to sign API request. One or multiple public keys are linked to the wallet address such that third-parties can verify said request signatures. It can be added using the [Admin API](/integration/management). - -Query: - -```graphql -mutation CreateWalletAddressKey($input: CreateWalletAddressKeyInput!) { - createWalletAddressKey(input: $input) { - code - message - success - walletAddressKey { - id - walletAddressId - revoked - jwk { - alg - crv - kid - kty - x - } - createdAt - } - } -} -``` - -Query Variables: - -```json -{ - "input": { - "jwk": { - "kid": "keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", - "x": "ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8", - "alg": "EdDSA", - "kty": "OKP", - "crv": "Ed25519" - }, - "walletAddressId": "695e7546-1803-4b45-96b6-6a53f4082018" - } -} -``` - -Example Successful Response - -```json -{ - "data": { - "createWalletAddressKey": { - "code": "200", - "message": "Added Key To Wallet Address", - "success": true, - "walletAddressKey": { - "id": "f2953571-f10c-44eb-ab41-4450a7ad6771", - "walletAddressId": "695e7546-1803-4b45-96b6-6a53f4082018", - "revoked": false, - "jwk": { - "alg": "EdDSA", - "crv": "Ed25519", - "kid": "keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", - "kty": "OKP", - "x": "ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8" - }, - "createdAt": "2023-03-03T09:26:41.424Z" - } - } - } -} -``` +## Placeholder diff --git a/packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx b/packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx index 0f44e7a1b5..70236c7308 100644 --- a/packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx +++ b/packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx @@ -2,16 +2,4 @@ title: Account servicing entities --- -An Account Servicing Entity provides and maintains a payment account for a payer and payee, and is a regulated entity in the country/countries it operates. - -In the context of Rafiki, an account servicing entity will run an instance of Rafiki and integrate it into their internal systems. - -The functions of the account servicing entity include: - -- Provide channels for account holders (people or businesses) to interact with their accounts (mobile apps, websites, etc) -- Onboarding account holders as required under regulations (KYC, sanctions screening, etc) -- Maintaining the ledger of accounts of account holders -- Handling deposits and withdrawals into accounts via external payment methods (cards, bank transfers, etc) -- Authenticating account holders -- Getting consent from account holders to grant access to their accounts -- Keeping a record of the public keys used by account holders to access the Open Payments APIs +## Placeholder diff --git a/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx b/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx index 8823e319f0..4e61d702c8 100644 --- a/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx +++ b/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx @@ -2,23 +2,4 @@ title: Overview --- -## What is Rafiki? - -Rafiki is open source software that allows an [Account Servicing Entity](/reference/glossary#account-servicing-entity) to enable [Interledger](/reference/glossary#interledger-protocol) functionality on its users' accounts. - -This includes - -- sending and receiving payments (via [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) and [Open Payments](/reference/glossary#open-payments)) -- allowing third-party access to initiate payments and view transation data (via [Open Payments](/reference/glossary#open-payments)) - -:::caution -Rafiki is intended to be run by [Account Servicing Entities](/reference/glossary#account-servicing-entity) only and should not be used in production by non-regulated entities. -::: - -Rafiki is made up of several components including an Interledger connector, a high-throughput accounting database called [TigerBeetle](/reference/glossary#tigerbeetle), and several APIs: - -- the [Admin API](/integration/management) to create [peering relationships](/reference/glossary#peer), add supported [assets](/reference/glossary#asset), and issue [wallet addresses](/reference/glossary#wallet-address) -- the [Open Payments](/reference/glossary#open-payments) API to allow third-parties (with the account holder's consent) to initiate payments and to view the transaction history -- the [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) API for simple Interledger Payments - -Additionally, this package also includes a reference implementation of a [GNAP](/reference/glossary#grant-negotiation-authorization-protocol) authorization server which handles the access control for the [Open Payments](/reference/glossary#open-payments) API. For more information on the architecture, check out the [Architecture documentation](/introduction/architecture). +## Placeholder diff --git a/packages/documentation/src/content/docs/playground/autopeering.mdx b/packages/documentation/src/content/docs/playground/autopeering.mdx index ba6a65f041..ef939de852 100644 --- a/packages/documentation/src/content/docs/playground/autopeering.mdx +++ b/packages/documentation/src/content/docs/playground/autopeering.mdx @@ -2,32 +2,4 @@ title: Auto-Peering --- -If you want to start one local instance of Rafiki and peer it automatically to [Rafiki.money](https://rafiki.money), you can run the following commands: - -```sh -# using Tigerbeetle DB -pnpm localenv:compose:autopeer - -# OR using Postgres DB -pnpm localenv:compose:psql:autopeer -``` - -Your local Rafiki instance will be automatically peered with the remote [Rafiki.money](https://rafiki.money) instance. -The required services will be exposed externally using the [localtunnel](https://www.npmjs.com/package/localtunnel) package. -The exposed ports are 3000(open-payments), 3006(auth server), 3002(ILP connector). - -To use the Open Payments example in the [Bruno API examples](/playground/overview/#bruno--open-payments-apis), follow these steps: - -1. navigate to http://localhost:3030 to find the list of created wallet addresses (alternatively, run `docker logs rafiki-cloud-nine-mock-ase-1`) -2. copy the url of one of the wallet addresses -3. set the url as `senderWalletAddress` variable in the Bruno `Autopeering` environment - -Note that you have to go through an additional "login" step by providing you IPv4 address as tunnel password before being able to visit the consent screen for the outgoing payment grant request. You can find out your current IPv4 address by e.g. visiting https://loca.lt/mytunnelpassword (or https://www.whatismyip.com/). - -To shut down the connection and to clear the environment, run - -```sh -pnpm localenv:compose down --volumes -``` - -This is necessary since on a new run of the scripts (with autopeering or not), the wallet address urls will differ. +## Placeholder diff --git a/packages/documentation/src/content/docs/playground/overview.mdx b/packages/documentation/src/content/docs/playground/overview.mdx index b26bc7aa53..4e61d702c8 100644 --- a/packages/documentation/src/content/docs/playground/overview.mdx +++ b/packages/documentation/src/content/docs/playground/overview.mdx @@ -2,274 +2,4 @@ title: Overview --- -We have created a suite of packages that, together, mock an account servicing entity that has deployed Rafiki, exposing an [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) endpoint, the [Open Payments](/reference/glossary#open-payments) APIs with its required [GNAP](/reference/glossary#grant-negotiation-authorization-protocol) auth endpoints to request grants, a STREAM endpoint for receiving Interledger packets, and a UI to view and manage the Rafiki instance. - -These packages include: - -- `backend` (SPSP, Open Payments APIs, GraphQL Admin APIs, STREAM endpoint) -- `auth` (GNAP auth server) -- `mock-account-servicing-entity` (mocks an [Account Servicing Entity](/reference/glossary#account-servicing-entity)) -- `frontend` (Remix app to expose a UI for Rafiki Admin management via interaction with the `backend` Admin APIs) -- `kratos` (An identity and user management solution for the `frontend`) -- `mailslurper` (A SMTP mail server to catch account recovery emails) - -These packages depend on the following databases: - -- TigerBeetle or Postgres (accounting) -- Postgres (Open Payments resources, auth resources) -- Redis (STREAM details, auth sessions) - -We provide containerized versions of our packages together with two pre-configured docker-compose files ([Cloud Nine Wallet](https://github.com/interledger/rafiki/blob/main/localenv/cloud-nine-wallet/docker-compose.yml) and [Happy Life Bank](https://github.com/interledger/rafiki/blob/main/localenv/happy-life-bank/docker-compose.yml)) to start two Mock Account Servicing Entities with their respective Rafiki backend and auth servers. They automatically peer and 2 to 3 user accounts are created on both of them. - -This environment will set up a playground where you can use the Rafiki Admin APIs and the Open Payments APIs. - -## Disclaimer - -> **The Mock ASE provided in this repository is intended solely for internal use and demonstration purposes. It is not designed to serve as a reference architecture. If you are looking for a reference implementation of an ASE, please refer to the [Test Wallet](https://github.com/interledger/testnet).** - -## Environment overview - -![Docker compose environment](/img/localenv-architecture.png) - -#### Cloud Nine Wallet - -(a) User Interface - accessible at http://localhost:3030 - -(b) Admin API - accessible at http://localhost:3001/graphql - -(c) Open Payments API - accessible at http://localhost:3000 - -(d) Auth Admin API - accessible at http://localhost:3003/graphql - -(e) Open Payments Auth API - accessible at http://localhost:3006 - -(f) Admin UI - accessible at http://localhost:3010 - -(g) Kratos API - accessible at http://localhost:4433 - -#### Happy Life Bank - -(h) User Interface - accessible at http://localhost:3031 - -(i) Admin API - accessible at http://localhost:4001/graphql - -(j) Open Payments API - accessible at http://localhost:4000 - -(k) Auth Admin API - accessible at http://localhost:4003/graphql - -(l) Open Payments Auth API - accessible at http://localhost:4006 - -(m) Admin UI - accessible at http://localhost:4010 - -(n) Kratos API - accessible at http://localhost:4432 - -#### Mail Slurper - -(o) Mail UI - accessible at http://localhost:4436 - -#### Database - -Postgres Server - accessible at http://localhost:5432 - -### Exploring Accounts on Mock Account Servicing Entity - -Navigate to [`localhost:3030`](http://localhost:3030) to view the accounts on one instance of the Mock Account Servicing Entity called Cloud Nine Wallet. - -![Mock Account Servicing Entity Accounts](/img/map-accounts.png) - -The accounts of the second instance (Happy Life Bank) can be found on [`localhost:3031`](http://localhost:3031). - -When clicking on the Account Name, you can view the account information, the available balance, and see a list of transactions. - -![Mock Account Servicing Entity Transactions](/img/map-transactions.png) - -## Running the local environment - -### Dependencies - -- [Rafiki local environment setup](https://github.com/interledger/rafiki/blob/main/README.md#environment-setup) -- [docker](https://docs.docker.com/get-docker/) -- [Bruno](https://www.usebruno.com/downloads), an open source API client - -### Setup - -The following should be run from the root of the project. - -```sh -# If you have spun up the environment before, remember to first tear down and remove volumes! - -# start the local environment -pnpm localenv:compose up - -# tear down and remove volumes -pnpm localenv:compose down --volumes - -# tear down, delete database volumes and remove images -pnpm localenv:compose down --volumes --rmi all -``` - -If you want to use Postgres as the accounting database instead of TigerBeetle, you can use the `psql` variant of the `localenv:compose` commands: - -```sh -pnpm localenv:compose:psql up -pnpm localenv:compose:psql down --volumes -``` - -The local environment consists of a primary Rafiki instance and a secondary Rafiki instance, each with -its own docker compose files ([Cloud Nine Wallet](https://github.com/interledger/rafiki/blob/main/localenv/cloud-nine-wallet/docker-compose.yml), [Happy Life Bank](https://github.com/interledger/rafiki/blob/main/localenv/happy-life-bank/docker-compose.yml)). -The primary Cloud Nine Wallet docker compose file (`./cloud-nine-wallet/docker-compose.yml`) includes the main Rafiki services `backend` and `auth`, as well -as the required data stores tigerbeetle (if enabled), redis, and postgres, so it can be run on its own. -The secondary Happy Life Bank docker compose file (`./happy-life-bank/docker-compose.yml`) includes only the Rafiki services, not the data stores. It uses the -data stores created by the primary Rafiki instance so it can't be run by itself. -The `pnpm localenv:compose up` command starts both the primary instance and the secondary. - -### Debugging - -Debuggers for the services are exposed on the following ports: - -| IP and Port | Services | -| -------------- | ------------------------- | -| 127.0.0.1:9229 | Cloud Nine Wallet Backend | -| 127.0.0.1:9230 | Cloud Nine Auth | -| 127.0.0.1:9231 | Happy Life Bank Backend | -| 127.0.0.1:9232 | Happy Life Bank Auth | - -#### With a chromium browser: - -- go to `chrome://inspect` -- Click "Configure" and add the IP addresses and ports detailed above -- start docker containers -- click "inspect" on the service you want to debug to open the chromium debugger - -You can either trigger the debugger by adding `debugger` statements in code and restarting, or by adding breakpoints directly in the chromium debugger after starting the docker containers. - -#### With VS Code: - -For debugging with VS Code, you can add this configuration to your `.vscode/launch.json`): - -```json -{ - "name": "Attach to docker (cloud-nine-backend)", - "type": "node", - "request": "attach", - "port": 9229, - "address": "localhost", - "localRoot": "${workspaceFolder}", - "remoteRoot": "/home/rafiki/", - "restart": true -}, -``` - -`localRoot` will vary depending on the location of `launch.json` relative to rafiki's root directory. - -For more ways to connect debuggers, see the Node docs for debugging: https://nodejs.org/en/learn/getting-started/debugging - -### Shutting down - -```sh -# tear down -pnpm localenv:compose down - -# tear down and delete database volumes -pnpm localenv:compose down --volumes - -# tear down, delete database volumes and remove images -pnpm localenv:compose down --volumes --rmi all -``` - -### Commands - -| Command | Description | -| ------------------------------------------------ | ------------------------------------------------ | -| `pnpm localenv:compose config` | Show all merged config (with Tigerbeetle) | -| `pnpm localenv:compose up` | Start (with Tigerbeetle) | -| `pnpm localenv:compose up -d` | Start (with Tigerbeetle) detached | -| `pnpm localenv:compose down` | Down (with Tigerbeetle) | -| `pnpm localenv:compose down --volumes` | Down and kill volumes (with Tigerbeetle) | -| `pnpm localenv:compose down --volumes --rmi all` | Down, kill volumes (with Tigerbeetle) and images | -| `pnpm localenv:compose:psql config` | Show all merged config (with Postgresql) | -| `pnpm localenv:compose build` | Build all the containers (with Tigerbeetle) | -| `pnpm localenv:compose:psql up` | Start (with Postgresql) | -| `pnpm localenv:compose:psql up -d` | Start (with Postgresql) detached | -| `pnpm localenv:compose:psql down` | Down (with Postgresql) | -| `pnpm localenv:compose:psql down --volumes` | Down (with Postgresql) and kill volumes | -| `pnpm localenv:compose:psql build` | Build all the containers (with Postgresql) | - -### Usage - -#### Bruno & Open Payments APIs - -The Open Payments APIs can be interacted with using the [Bruno collection](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki) ([resource server endpoints](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Open%20Payments%20APIs) and [auth server endpoints](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Open%20Payments%20Auth%20APIs)). It requires you to - -1. load the collection into Bruno by clicking "Open Collection" -2. navigating to `/rafiki/bruno/collections/Rafiki` on your machine and clicking "Open" -3. Furthermore, you need to either load the [Local Environment](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/environments/Local%20Playground.bru) or the [Remote Environment](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/environments/Remote.bru). - -The Examples folder in the Bruno collection includes an [Open Payments](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Examples/Open%20Payments) example that can be executed one by one. It - -1. requests the sender's wallet address -2. requests the receiver's wallet address -3. requests a grant to create an incoming payment on the receiver's account -4. creates an incoming payment on receiver's account -5. requests a grant to create (and read) a quote on the sender's account -6. creates a quote on the sender's account -7. requests a grant to create (and read) an outgoing payment on the sender's account - -Note that you have to go through an interaction flow by clicking on the `redirect` link in the grant request response. More information about the interaction flow can be found [here](/concepts/open-payments/grant-interaction). - -8. continues the grant request -9. creates an outgoing payment on the sender's account -10. fetches the outgoing payment on the sender's account - -#### Admin UI - -In order to manage, and view information about the Rafiki instance(s) using a UI, you can navigate to [`localhost:3010`](http://localhost:3010) (Cloud Nine Wallet) or [`localhost:4010`](http://localhost:4010) (Happy Life Bank). This is the `frontend` project which runs a Remix app for querying info and executing mutations against the Rafiki [Admin APIs](#admin-apis). - -We have secured access to the Admin UI using [Ory Kratos](https://www.ory.sh/docs/kratos/ory-kratos-intro), a secure and fully open-source identity and user management solution. Check it out on [GitHub](https://github.com/ory/kratos). Since access to the UI is on an invitation-only basis the registration flow is not publicly available. As such, in order to access the Admin UI you can click the registration link provided in the logs during `localenv` startup or you can manually add a new user with the invite-user script. Run `docker exec -it npm run invite-user -- example@mail.com` and it will output recovery link to the terminal. The recovery link doubles as the invitation method. Copy and paste this link in your browser and you will automatically be logged in and directed to the account settings page. The next step is changing your password. We're using a simple email and password authentication method. - -There is a password recovery flow. On the login page if you clkick the `forgot password` link and enter an email for a registered user then you can open [Mail Slurper](http://localhost:4436) to access the recovery link for your account. - -We've also included a script to remove users: `docker exec -it npm run delete-user -- example@mail.com`. - -#### Admin APIs - -In addition to the using the Admin UI for interacting with the Admin APIs, you can also use the Apollo explorer (on [`localhost:3001/graphql`](http://localhost:3001/graphql) and [`localhost:4001/graphql`](http://localhost:4001/graphql), respectively), and also via the [Bruno collection](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Rafiki%20Admin%20APIs). The Bruno collection is configured to use the default endpoints of the local environment. - -#### SPSP - -Every wallet address also serves as an SPSP endpoint. A GET request to e.g. `http://localhost:3000/accounts/gfranklin` with `Accept` header `application/spsp4+json` will return an SPSP response with STREAM connection details. - -```http -http GET http://localhost:3000/accounts/gfranklin Host:backend Accept:application/spsp4+json - -HTTP/1.1 200 OK -Connection: keep-alive -Content-Length: 220 -Content-Type: application/spsp4+json -Date: Thu, 23 Feb 2023 13:07:24 GMT -Keep-Alive: timeout=5 - -{ - "destination_account": "test.rafiki.viXmy1OVHgvmQakNjX1C6kQMri92DzHeISEv-5VzTDuFhrpsrkDzsq5OO9Lfa9yed0L2RJGC9hA_IX-zztTtTZ87shCYvsQ", - "receipts_enabled": false, - "shared_secret": "Rz_vudcg13EPs8ehL2drvZFJS1LJ4Y3EltOI60-lQ78" -} - -``` - -### Known Issues - -#### No data in Mock Account Servicing Entity (MASE) - -It is possible that upon (re)starting the local playground, you may run into an issue where there are no accounts/wallet addresses visible in the mock account servicing entities' pages (http://localhost:3030, http://localhost:3031). This is because seeding of the initial account data only works against an empty database. To correct this, clear the volumes, and restart the container via: - -```sh -pnpm localenv:compose down --volumes -pnpm localenv:compose up -d -``` - -#### TigerBeetle container exits with code 137 - -This is a known [issue](https://docs.tigerbeetle.com/getting-started/with-docker-compose/#exited-with-code-137) when running TigerBeetle in Docker: the container exits without logs and simply shows error code 137. To fix this, increase the Docker memory limit. - -If you are running the local playground in Docker on a Windows machine using WSL, you can increase the memory limit by [configuring](https://learn.microsoft.com/en-us/windows/wsl/wsl-config#example-wslconfig-file) your `.wslconfig` file. +## Placeholder diff --git a/packages/documentation/src/content/docs/reference/glossary.mdx b/packages/documentation/src/content/docs/reference/glossary.mdx index 2494e6b08d..73233b0c82 100644 --- a/packages/documentation/src/content/docs/reference/glossary.mdx +++ b/packages/documentation/src/content/docs/reference/glossary.mdx @@ -2,55 +2,4 @@ title: Glossary --- -## Account Servicing Entity - -An Account Servicing Entity provides and maintains a payment account for a payer and payee, and is a regulated entity in the country/countries it operates. - -## Asset - -An Asset consists of two pieces of information, code and scale. The asset code SHOULD be an [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217). The asset scale is the difference in orders of magnitude between the standard unit and a corresponding fractional unit. - -## Grant Negotiation Authorization Protocol - -The Grant Negotiation Authorization Protocol (GNAP) defines a mechanism for delegating authorization to a piece of software, and conveying the results and artifacts of that delegation to the software. This delegation can include access to a set of APIs as well as subject information passed directly to the software. For more information, see the [specification](https://datatracker.ietf.org/doc/html/draft-ietf-gnap-core-protocol-12). - -## Interledger Protocol - -Interledger is a protocol for sending packets of money across different payment networks or ledgers. For more details, see the [documentation](https://interledger.org/developers/get-started/) and the [specification](https://interledger.org/developers/rfcs/interledger-protocol/). - -## Open Payments - -Open Payments is an API standard that allows third-parties (with the account holder's consent) to initiate payments and to view the transaction history on the account holder's account. For more details, see the [Open Payments website](https://openpayments.guide). - -## Wallet Address - -A Wallet Address is a standardized identifier for a payment account. In the same way that an email address provides an identifier for a mailbox in the email ecosystem, a wallet address is used by an account holder to share the details of their account with a counter-party. - -## Peer - -A Peer is a counterparty that a given party transacts with. Within the [Interledger Protocol](#interledger-protocol), connectors maintain peers, or counterparty connectors whom they transact with. For more information, see [the peering documentation](/concepts/interledger-protocol/peering). - -## Simple Payments Setup Protocol (SPSP) - -The Simple Payments Setup Protocol is a basic protocol for exchanging payment information between payee and payer to facilitate payment over Interledger. For more details, see the [SPSP specification](https://interledger.org/developers/rfcs/simple-payment-setup-protocol/). - -## STREAM - -STREAM is a multiplexed Interledger Transport Protocol that provides for sending multiple “streams” of money and data between two parties using ILP. For more details, see the [STREAM specification](https://interledger.org/developers/rfcs/stream-protocol/). - -## TigerBeetle - -TigerBeetle is a distributed financial accounting database designed for mission critical safety and performance. For more information, see the [official website](https://tigerbeetle.com/). - -## Two-Phase Transfers - -A two-phase transfer moves funds in stages: - -- Reserve funds (`pending`) -- Resolve funds (`post`, `void`, or `expire`) - -The name "two-phase transfer" is a reference to the [two-phase commit protocol for distributed transactions](https://en.wikipedia.org/wiki/Two-phase_commit_protocol). - -## Web Monetization - -Web Monetization is a JavaScript browser API that allows the creation of a payment stream from the user agent to the website. For more details, see the [Web Monetization Website](https://webmonetization.org/). +## Placeholder diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx index c28dac25bc..0356aa5994 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx @@ -2,6 +2,4 @@ title: Auth service --- -## Auth - -The `auth` service performs authorization and authentication of incoming requests. For requests from entities that have accounts within the local instance of Rafiki, the `auth` service uses data stored in the auth postgres database. For requests from clients registered with other instances of Rafiki, the auth service resolves the client's public key from its source and uses it to authenticate and authorize the request. Additionally, it also exposes an GraphQL Admin API to manage auth related resources (such as grants). +## Placeholder diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx index 486278433d..3d637a67fd 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx @@ -2,19 +2,4 @@ title: Backend service --- -## Backend - -The `backend` service has four responsibilities: - -- Expose REST [Open Payments API](https://docs.openpayments.guide/reference) endpoints for public clients to perform account management tasks. -- Expose an internal GraphQL Admin API for service operators to manage accounts and application settings like peering relationships. -- Expose an [ILP connector](/concepts/interledger-protocol/connector) to send and receive STREAM packets with peers. -- Business logic to manage accounts and track balances. - -The `backend`'s ILP functionality includes: - -- Accepting ILP packets over an HTTP interface and authenticating them against ILP account credentials -- Routing ILP packets to the correct destination account -- Converting currencies -- Sending out ILP packets over HTTP for destinations that are not local -- Fulfilling packets with an internal STREAM server +## Placeholder diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx index 7f3848eeb0..aa2495609e 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx @@ -2,6 +2,4 @@ title: Frontend service --- -# Frontend - -The `frontend` project is a web app through which Rafiki administrators can manage their Rafiki instance though a UI. `frontend` communicates with the `backend` Admin API to manage [wallet addresses](/reference/glossary#wallet-address), [peering relationships](/reference/glossary#peer), and [assets](/reference/glossary#asset), among other settings. +## Placeholder diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx index 1e1f6ec5f9..d8c932850c 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx @@ -2,6 +2,4 @@ title: Token introspection --- -## Token Introspection - -The `token-introspection` package is a client library for making [GNAP](/reference/glossary#grant-negotiation-authorization-protocol) token introspection requests to the auth server. +## Placeholder From d92ab32a8be7d503768bd5763a1777f7726ccb00 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Mon, 19 Aug 2024 10:42:08 -0400 Subject: [PATCH 03/91] testing collab on sarah's branch (#2869) * testing collab on sarah's branch * docs: trying again --- .../src/content/docs/services-and-aux-packages/auth-service.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx index 0356aa5994..72f28ee5e0 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx @@ -3,3 +3,5 @@ title: Auth service --- ## Placeholder + +Junk text to test. \ No newline at end of file From 615030049e85d670d729e23c323e287e4decaf63 Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Mon, 19 Aug 2024 16:48:59 +0200 Subject: [PATCH 04/91] docs: integrator-checklist-update --- .../src/content/docs/integration/integrator-checklist.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx index a189f2ad31..311131a13e 100644 --- a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx +++ b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx @@ -3,3 +3,5 @@ title: Integrator checklist --- ## Placeholder + +Do you have any peers set up? \ No newline at end of file From 7cb832ade1eb8c22a72893e470b3340d5a8225e3 Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Mon, 19 Aug 2024 09:55:06 -0500 Subject: [PATCH 05/91] docs: testing update (#2870) Adding text to overview --- .../src/content/docs/intro-to-rafiki/overview.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx b/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx index 4e61d702c8..51eba232bc 100644 --- a/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx +++ b/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx @@ -2,4 +2,6 @@ title: Overview --- -## Placeholder +## Placeholder - Overview Heading Test + +Junk text \ No newline at end of file From 1fdc4dd8ca43232ecc4a9e7423b62d49c492b2f8 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 20 Aug 2024 14:12:06 +0200 Subject: [PATCH 06/91] chore: formatting --- .../src/content/docs/integration/integrator-checklist.mdx | 2 +- .../documentation/src/content/docs/intro-to-rafiki/overview.mdx | 2 +- .../src/content/docs/services-and-aux-packages/auth-service.mdx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx index 311131a13e..19c8df84c9 100644 --- a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx +++ b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx @@ -4,4 +4,4 @@ title: Integrator checklist ## Placeholder -Do you have any peers set up? \ No newline at end of file +Do you have any peers set up? diff --git a/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx b/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx index 51eba232bc..ddb1796996 100644 --- a/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx +++ b/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx @@ -4,4 +4,4 @@ title: Overview ## Placeholder - Overview Heading Test -Junk text \ No newline at end of file +Junk text diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx index 72f28ee5e0..1fae1b74a7 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx @@ -4,4 +4,4 @@ title: Auth service ## Placeholder -Junk text to test. \ No newline at end of file +Junk text to test. From 01b319bd37e3fee298f8e83d04ae7c4ec61a8b46 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 20 Aug 2024 14:18:43 +0200 Subject: [PATCH 07/91] chore: formatting --- .prettierignore | 2 +- packages/documentation/astro.config.mjs | 4 ++-- packages/documentation/src/content/docs/apis/openapis.mdx | 2 +- packages/documentation/src/content/docs/index.mdx | 4 ++-- .../src/content/docs/integration/integrator-checklist.mdx | 2 +- .../content/docs/services-and-aux-packages/auth-service.mdx | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.prettierignore b/.prettierignore index 6014a7ea47..62eb09c7a3 100644 --- a/.prettierignore +++ b/.prettierignore @@ -14,5 +14,5 @@ build **/styles/*.css .docusaurus .cache-loader -packages/documentation/src/content/docs/apis +packages/documentation/src/content/docs/apis/graphql/** */ .astro \ No newline at end of file diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index 5815a77680..55a8a1a783 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -204,12 +204,12 @@ export default defineConfig({ GraphQL({ schema: '../backend/src/graphql/schema.graphql', output: './src/content/docs/apis/graphql/backend/', - linkPrefix: '/apis/backend/' + linkPrefix: '/apis/graphql/backend/' }), GraphQL({ schema: '../auth/src/graphql/schema.graphql', output: './src/content/docs/apis/graphql/auth/', - linkPrefix: '/apis/auth/' + linkPrefix: '/apis/graphql/auth/' }) ], server: { diff --git a/packages/documentation/src/content/docs/apis/openapis.mdx b/packages/documentation/src/content/docs/apis/openapis.mdx index b7350ab902..f92e159809 100644 --- a/packages/documentation/src/content/docs/apis/openapis.mdx +++ b/packages/documentation/src/content/docs/apis/openapis.mdx @@ -2,4 +2,4 @@ title: OpenAPIs --- -## Placeholder \ No newline at end of file +## Placeholder diff --git a/packages/documentation/src/content/docs/index.mdx b/packages/documentation/src/content/docs/index.mdx index 8fcefa02b2..aaebfffa40 100644 --- a/packages/documentation/src/content/docs/index.mdx +++ b/packages/documentation/src/content/docs/index.mdx @@ -14,12 +14,12 @@ hero: import { Card, CardGrid } from '@astrojs/starlight/components' - + Discover what is in our Backend GraphQL schema. - + Discover what is in our Auth GraphQL schema. diff --git a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx index 19c8df84c9..85dc1b9c0c 100644 --- a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx +++ b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx @@ -4,4 +4,4 @@ title: Integrator checklist ## Placeholder -Do you have any peers set up? +Do you have any peers set up? diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx index 1fae1b74a7..18e5a69da9 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx @@ -4,4 +4,4 @@ title: Auth service ## Placeholder -Junk text to test. +Junk text to test. From 7f6fbf926b10619f474e48b7c0c7e05f0d89fdb8 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 20 Aug 2024 14:28:25 +0200 Subject: [PATCH 08/91] chore: fixed .prettierignore file --- .prettierignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.prettierignore b/.prettierignore index 62eb09c7a3..c320bd5021 100644 --- a/.prettierignore +++ b/.prettierignore @@ -14,5 +14,5 @@ build **/styles/*.css .docusaurus .cache-loader -packages/documentation/src/content/docs/apis/graphql/** */ +packages/documentation/src/content/docs/apis/graphql/** .astro \ No newline at end of file From a64b0ac98cf7d6749046d637de273ba59aebf202 Mon Sep 17 00:00:00 2001 From: hajjimo <96056726+hajjimo@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:07:24 +0200 Subject: [PATCH 09/91] docs: Add submenus to Integration section (#2871) * docs: Add submenus to Integration section --------- Co-authored-by: Sarah Jones --- packages/documentation/.gitignore | 4 + packages/documentation/astro.config.mjs | 71 ++- .../docs/apis/graphql/auth/inputobjects.md | 18 +- .../docs/apis/graphql/auth/interfaces.md | 8 +- .../docs/apis/graphql/auth/mutations.md | 4 +- .../content/docs/apis/graphql/auth/objects.md | 60 +-- .../content/docs/apis/graphql/auth/queries.md | 18 +- .../docs/apis/graphql/backend/inputobjects.md | 284 +++++------ .../docs/apis/graphql/backend/interfaces.md | 40 +- .../docs/apis/graphql/backend/mutations.md | 124 ++--- .../docs/apis/graphql/backend/objects.md | 450 +++++++++--------- .../docs/apis/graphql/backend/queries.md | 98 ++-- .../deploy-to-cloud/helm-k8s.mdx | 5 + .../deploy-to-prod/deploy-to-cloud/nginx.mdx | 5 + .../endpoints/exchange-rates.mdx | 5 + .../deploy-to-prod/endpoints/idp.mdx | 5 + .../endpoints/webhook-events.mdx | 5 + .../deploy-to-prod/environment-variables.mdx | 5 + .../running-your-instance/adding-asset.mdx | 5 + .../running-your-instance/adding-peer.mdx | 5 + .../creating-wallet-address.mdx | 5 + .../grants-management.mdx | 5 + .../running-your-instance/keys-management.mdx | 5 + .../managing-liquidity.mdx | 5 + .../docs/integration/deploy-to-production.mdx | 5 - 25 files changed, 686 insertions(+), 558 deletions(-) create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/helm-k8s.mdx create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/nginx.mdx create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/grants-management.mdx create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/keys-management.mdx create mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx delete mode 100644 packages/documentation/src/content/docs/integration/deploy-to-production.mdx diff --git a/packages/documentation/.gitignore b/packages/documentation/.gitignore index 2391c5f59b..96d6ef18e7 100644 --- a/packages/documentation/.gitignore +++ b/packages/documentation/.gitignore @@ -26,3 +26,7 @@ pnpm-debug.log* # editors .vscode + +# generated docs +src/content/docs/apis/graphql/auth/* +src/content/docs/apis/graphql/backend/* \ No newline at end of file diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index 55a8a1a783..d79849b34e 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -77,7 +77,76 @@ export default defineConfig({ }, { label: 'Deploy to production', - link: 'integration/deploy-to-production' + collapsed: true, + items: [ + { + label: 'Endpoints', + collapsed: true, + items: [ + { + label: 'Webhook events', + link: 'integration/deploy-to-prod/endpoints/webhook-events' + }, + { + label: 'Exchange Rates', + link: 'integration/deploy-to-prod/endpoints/exchange-rates' + }, + { + label: 'IDP', + link: 'integration/deploy-to-prod/endpoints/idp' + } + ] + }, + { + label: 'Environment variables', + link: 'integration/deploy-to-prod/environment-variables' + }, + { + label: 'Deploying to cloud environment options', + collapsed: true, + items: [ + { + label: 'nginx', + link: 'integration/deploy-to-prod/deploy-to-cloud/nginx' + }, + { + label: 'Helm & K8s', + link: 'integration/deploy-to-prod/deploy-to-cloud/helm-k8s' + } + ] + }, + { + label: 'Running your instance', + collapsed: true, + items: [ + { + label: 'Adding asset', + link: 'integration/deploy-to-prod/running-your-instance/adding-asset' + }, + { + label: 'Adding peer', + link: 'integration/deploy-to-prod/running-your-instance/adding-peer' + }, + { + label: + 'Creating wallet address', + link: 'integration/deploy-to-prod/running-your-instance/creating-wallet-address' + }, + { + label: 'Managing liquidity', + link: 'integration/deploy-to-prod/running-your-instance/managing-liquidity' + }, + { + label: 'Keys management', + link: 'integration/deploy-to-prod/running-your-instance/keys-management' + }, + { + label: 'Grants management', + link: 'integration/deploy-to-prod/running-your-instance/grants-management' + } + ] + } + ] }, { label: 'Admin APIs', diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md b/packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md index 80069df276..8a6ed54cc4 100644 --- a/packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md +++ b/packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md @@ -16,7 +16,7 @@ title: Input objects in
-
[GrantFinalization!] +[GrantFinalization!] @@ -25,7 +25,7 @@ in
notIn
-[GrantFinalization!] +[GrantFinalization!] @@ -46,7 +46,7 @@ notIn
in
-[GrantState!] +[GrantState!] @@ -55,7 +55,7 @@ in
notIn
-[GrantState!] +[GrantState!] @@ -76,7 +76,7 @@ notIn
in
-[String!] +[String!] @@ -97,7 +97,7 @@ in
identifier
-FilterString +FilterString @@ -106,7 +106,7 @@ identifier
state
-FilterGrantState +FilterGrantState @@ -115,7 +115,7 @@ state
finalizationReason
-FilterFinalizationReason +FilterFinalizationReason @@ -136,7 +136,7 @@ finalizationReason
grantId
-String! +String! diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md b/packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md index d000f9b18a..d418f9a286 100644 --- a/packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md +++ b/packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md @@ -10,8 +10,8 @@ title: Interfaces

Implemented by

-- [Grant](/apis/auth/objects#grant) -- [Access](/apis/auth/objects#access) +- [Grant](/apis/graphql/auth/objects#grant) +- [Access](/apis/graphql/auth/objects#access)

Fields

@@ -21,7 +21,7 @@ title: Interfaces id
-ID! +ID! @@ -30,7 +30,7 @@ id
createdAt
-String! +String! diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/mutations.md b/packages/documentation/src/content/docs/apis/graphql/auth/mutations.md index e71d2e68be..770184504a 100644 --- a/packages/documentation/src/content/docs/apis/graphql/auth/mutations.md +++ b/packages/documentation/src/content/docs/apis/graphql/auth/mutations.md @@ -6,7 +6,7 @@ title: Mutations ## revokeGrant -**Type:** [RevokeGrantMutationResponse!](/apis/auth/objects#revokegrantmutationresponse) +**Type:** [RevokeGrantMutationResponse!](/apis/graphql/auth/objects#revokegrantmutationresponse) Revoke Grant @@ -18,7 +18,7 @@ Revoke Grant input
-RevokeGrantInput! +RevokeGrantInput! diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/objects.md b/packages/documentation/src/content/docs/apis/graphql/auth/objects.md index 7c43f5bf86..0ba2e3f133 100644 --- a/packages/documentation/src/content/docs/apis/graphql/auth/objects.md +++ b/packages/documentation/src/content/docs/apis/graphql/auth/objects.md @@ -10,7 +10,7 @@ title: Objects

Implements

-- [Model](/apis/auth/interfaces#model) +- [Model](/apis/graphql/auth/interfaces#model)

Fields

@@ -20,7 +20,7 @@ title: Objects id
-ID! +ID!

Access id

@@ -29,7 +29,7 @@ id
identifier
-String +String

Wallet address of a sub-resource (incoming payment, outgoing payment, or quote)

@@ -38,7 +38,7 @@ identifier
type
-String! +String!

Access type (incoming payment, outgoing payment, or quote)

@@ -47,7 +47,7 @@ type
actions
-[String]! +[String]!

Access action (create, read, list or complete)

@@ -56,7 +56,7 @@ actions
limits
-LimitData +LimitData

Payment limits

@@ -65,7 +65,7 @@ limits
createdAt
-String! +String!

Date-time of creation

@@ -80,7 +80,7 @@ createdAt

Implements

-- [Model](/apis/auth/interfaces#model) +- [Model](/apis/graphql/auth/interfaces#model)

Fields

@@ -90,7 +90,7 @@ createdAt
id
-ID! +ID!

Grant id

@@ -99,7 +99,7 @@ id
client
-String! +String!

Wallet address of the grantee's account

@@ -108,7 +108,7 @@ client
access
-[Access!]! +[Access!]!

Access details

@@ -117,7 +117,7 @@ access
state
-GrantState! +GrantState!

State of the grant

@@ -126,7 +126,7 @@ state
finalizationReason
-GrantFinalization +GrantFinalization

Reason a grant was finalized

@@ -135,7 +135,7 @@ finalizationReason
createdAt
-String! +String!

Date-time of creation

@@ -156,7 +156,7 @@ createdAt
node
-Grant! +Grant! @@ -165,7 +165,7 @@ node
cursor
-String! +String! @@ -186,7 +186,7 @@ cursor
pageInfo
-PageInfo! +PageInfo! @@ -195,7 +195,7 @@ pageInfo
edges
-[GrantEdge!]! +[GrantEdge!]! @@ -216,7 +216,7 @@ edges
receiver
-String +String

Wallet address URL of the receiver

@@ -225,7 +225,7 @@ receiver
debitAmount
-PaymentAmount +PaymentAmount

Amount to debit

@@ -234,7 +234,7 @@ debitAmount
receiveAmount
-PaymentAmount +PaymentAmount

Amount to receive

@@ -243,7 +243,7 @@ receiveAmount
interval
-String +String

Interval between payments

@@ -264,7 +264,7 @@ interval
endCursor
-String +String

Paginating forwards: the cursor to continue.

@@ -273,7 +273,7 @@ endCursor
hasNextPage
-Boolean! +Boolean!

Paginating forwards: Are there more pages?

@@ -282,7 +282,7 @@ hasNextPage
hasPreviousPage
-Boolean! +Boolean!

Paginating backwards: Are there more pages?

@@ -291,7 +291,7 @@ hasPreviousPage
startCursor
-String +String

Paginating backwards: the cursor to continue.

@@ -312,7 +312,7 @@ startCursor
value
-UInt64! +UInt64! @@ -321,7 +321,7 @@ value
assetCode
-String! +String!

ISO 4217 currency code, e.g. USD

@@ -330,7 +330,7 @@ assetCode
assetScale
-UInt8! +UInt8!

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

@@ -351,7 +351,7 @@ assetScale
id
-ID! +ID! diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/queries.md b/packages/documentation/src/content/docs/apis/graphql/auth/queries.md index 4c53ce0d33..6491d58f39 100644 --- a/packages/documentation/src/content/docs/apis/graphql/auth/queries.md +++ b/packages/documentation/src/content/docs/apis/graphql/auth/queries.md @@ -6,7 +6,7 @@ title: Queries ## grant -**Type:** [Grant!](/apis/auth/objects#grant) +**Type:** [Grant!](/apis/graphql/auth/objects#grant) Fetch a grant @@ -18,7 +18,7 @@ Fetch a grant id
-ID! +ID! @@ -29,7 +29,7 @@ id
## grants -**Type:** [GrantsConnection!](/apis/auth/objects#grantsconnection) +**Type:** [GrantsConnection!](/apis/graphql/auth/objects#grantsconnection) Fetch a page of grants. @@ -41,7 +41,7 @@ Fetch a page of grants. after
-String +String

Paginating forwards: the cursor before the the requested page.

@@ -50,7 +50,7 @@ after
before
-String +String

Paginating backwards: the cursor after the the requested page.

@@ -59,7 +59,7 @@ before
first
-Int +Int

Paginating forwards: The first n elements from the page.

@@ -68,7 +68,7 @@ first
last
-Int +Int

Paginating backwards: The last n elements from the page.

@@ -77,7 +77,7 @@ last
filter
-GrantFilter +GrantFilter

Filter grants based on specific criteria.

@@ -86,7 +86,7 @@ filter
sortOrder
-SortOrder +SortOrder

Ascending or descending order of creation.

diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md b/packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md index 067b5f34cb..c255d7c2f8 100644 --- a/packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md +++ b/packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md @@ -16,7 +16,7 @@ title: Input objects key
-String! +String! @@ -25,7 +25,7 @@ key
value
-String! +String! @@ -34,7 +34,7 @@ value
visibleInOpenPayments
-Boolean! +Boolean! @@ -55,7 +55,7 @@ visibleInOpenPayments
value
-UInt64! +UInt64! @@ -64,7 +64,7 @@ value
assetCode
-String! +String!

ISO 4217 currency code, e.g. USD

@@ -73,7 +73,7 @@ assetCode
assetScale
-UInt8! +UInt8!

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

@@ -94,7 +94,7 @@ assetScale
id
-ID! +ID!

Outgoing payment id

@@ -103,7 +103,7 @@ id
reason
-String +String

Reason why this Outgoing Payment has been cancelled. This value will be publicly visible in the metadata field if this outgoing payment is requested through Open Payments.

@@ -124,7 +124,7 @@ reason
code
-String! +String!

ISO 4217 currency code, e.g. USD

@@ -133,7 +133,7 @@ code
scale
-UInt8! +UInt8!

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

@@ -142,7 +142,7 @@ scale
withdrawalThreshold
-UInt64 +UInt64

Minimum amount of liquidity that can be withdrawn from the asset

@@ -151,7 +151,7 @@ withdrawalThreshold
liquidityThreshold
-UInt64 +UInt64

Account Servicing Entity will be notified via a webhook event if liquidity falls below this value

@@ -160,7 +160,7 @@ liquidityThreshold
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -181,7 +181,7 @@ idempotencyKey
assetId
-String! +String!

The id of the asset to create the withdrawal for.

@@ -190,7 +190,7 @@ assetId
amount
-UInt64! +UInt64!

Amount of withdrawal.

@@ -199,7 +199,7 @@ amount
id
-String! +String!

The id of the withdrawal.

@@ -208,7 +208,7 @@ id
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -217,7 +217,7 @@ idempotencyKey
timeoutSeconds
-UInt64! +UInt64!

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

@@ -238,7 +238,7 @@ timeoutSeconds
walletAddressId
-String! +String!

Id of the wallet address under which the incoming payment will be created

@@ -247,7 +247,7 @@ walletAddressId
expiresAt
-String +String

Expiration date-time

@@ -256,7 +256,7 @@ expiresAt
metadata
-JSONObject +JSONObject

Additional metadata associated with the incoming payment.

@@ -265,7 +265,7 @@ metadata
incomingAmount
-AmountInput +AmountInput

Maximum amount to be received

@@ -274,7 +274,7 @@ incomingAmount
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -295,7 +295,7 @@ idempotencyKey
incomingPaymentId
-String! +String!

The id of the incoming payment to withdraw from.

@@ -304,7 +304,7 @@ incomingPaymentId
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -313,7 +313,7 @@ idempotencyKey
timeoutSeconds
-UInt64! +UInt64!

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

@@ -334,7 +334,7 @@ timeoutSeconds
maxPacketAmount
-UInt64 +UInt64

Maximum packet amount that the peer accepts

@@ -343,7 +343,7 @@ maxPacketAmount
assetId
-String! +String!

Asset id of peering relationship

@@ -352,7 +352,7 @@ assetId
peerUrl
-String! +String!

Peer's URL address at which the peer accepts auto-peering requests

@@ -361,7 +361,7 @@ peerUrl
name
-String +String

Peer's internal name for overriding auto-peer's default naming

@@ -370,7 +370,7 @@ name
liquidityThreshold
-UInt64 +UInt64

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

@@ -379,7 +379,7 @@ liquidityThreshold
liquidityToDeposit
-UInt64 +UInt64

Amount of liquidity to deposit for peer

@@ -388,7 +388,7 @@ liquidityToDeposit
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -409,7 +409,7 @@ idempotencyKey
walletAddressId
-String! +String!

Id of the wallet address under which the outgoing payment will be created

@@ -418,7 +418,7 @@ walletAddressId
incomingPayment
-String! +String!

Incoming payment url to create the outgoing payment from

@@ -427,7 +427,7 @@ incomingPayment
debitAmount
-AmountInput! +AmountInput!

Amount to send (fixed send)

@@ -436,7 +436,7 @@ debitAmount
metadata
-JSONObject +JSONObject

Additional metadata associated with the outgoing payment.

@@ -445,7 +445,7 @@ metadata
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -466,7 +466,7 @@ idempotencyKey
walletAddressId
-String! +String!

Id of the wallet address under which the outgoing payment will be created

@@ -475,7 +475,7 @@ walletAddressId
quoteId
-String! +String!

Id of the corresponding quote for that outgoing payment

@@ -484,7 +484,7 @@ quoteId
metadata
-JSONObject +JSONObject

Additional metadata associated with the outgoing payment.

@@ -493,7 +493,7 @@ metadata
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -514,7 +514,7 @@ idempotencyKey
outgoingPaymentId
-String! +String!

The id of the outgoing payment to withdraw from.

@@ -523,7 +523,7 @@ outgoingPaymentId
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -532,7 +532,7 @@ idempotencyKey
timeoutSeconds
-UInt64! +UInt64!

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

@@ -553,7 +553,7 @@ timeoutSeconds
maxPacketAmount
-UInt64 +UInt64

Maximum packet amount that the peer accepts

@@ -562,7 +562,7 @@ maxPacketAmount
http
-HttpInput! +HttpInput!

Peering connection details

@@ -571,7 +571,7 @@ http
assetId
-String! +String!

Asset id of peering relationship

@@ -580,7 +580,7 @@ assetId
staticIlpAddress
-String! +String!

Peer's ILP address

@@ -589,7 +589,7 @@ staticIlpAddress
name
-String +String

Peer's internal name

@@ -598,7 +598,7 @@ name
liquidityThreshold
-UInt64 +UInt64

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

@@ -607,7 +607,7 @@ liquidityThreshold
initialLiquidity
-UInt64 +UInt64

Initial amount of liquidity to deposit for peer

@@ -616,7 +616,7 @@ initialLiquidity
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -637,7 +637,7 @@ idempotencyKey
peerId
-String! +String!

The id of the peer to create the withdrawal for.

@@ -646,7 +646,7 @@ peerId
amount
-UInt64! +UInt64!

Amount of withdrawal.

@@ -655,7 +655,7 @@ amount
id
-String! +String!

The id of the withdrawal.

@@ -664,7 +664,7 @@ id
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -673,7 +673,7 @@ idempotencyKey
timeoutSeconds
-UInt64! +UInt64!

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

@@ -694,7 +694,7 @@ timeoutSeconds
walletAddressId
-String! +String!

Id of the wallet address under which the quote will be created

@@ -703,7 +703,7 @@ walletAddressId
debitAmount
-AmountInput +AmountInput

Amount to send (fixed send)

@@ -712,7 +712,7 @@ debitAmount
receiveAmount
-AmountInput +AmountInput

Amount to receive (fixed receive)

@@ -721,7 +721,7 @@ receiveAmount
receiver
-String! +String!

Wallet address URL of the receiver

@@ -730,7 +730,7 @@ receiver
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -751,7 +751,7 @@ idempotencyKey
walletAddressUrl
-String! +String!

Receiving wallet address URL

@@ -760,7 +760,7 @@ walletAddressUrl
expiresAt
-String +String

Expiration date-time

@@ -769,7 +769,7 @@ expiresAt
incomingAmount
-AmountInput +AmountInput

Maximum amount to be received

@@ -778,7 +778,7 @@ incomingAmount
metadata
-JSONObject +JSONObject

Additional metadata associated with the incoming payment.

@@ -787,7 +787,7 @@ metadata
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -808,7 +808,7 @@ idempotencyKey
assetId
-String! +String!

Asset of the wallet address

@@ -817,7 +817,7 @@ assetId
url
-String! +String!

Wallet Address URL

@@ -826,7 +826,7 @@ url
publicName
-String +String

Public name associated with the wallet address

@@ -835,7 +835,7 @@ publicName
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -844,7 +844,7 @@ idempotencyKey
additionalProperties
-[AdditionalPropertyInput!] +[AdditionalPropertyInput!]

Additional properties associated with the [walletAddress].

@@ -865,7 +865,7 @@ additionalProperties
walletAddressId
-String! +String! @@ -874,7 +874,7 @@ walletAddressId
jwk
-JwkInput! +JwkInput!

Public key

@@ -883,7 +883,7 @@ jwk
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -904,7 +904,7 @@ idempotencyKey
walletAddressId
-String! +String!

The id of the Open Payments wallet address to create the withdrawal for.

@@ -913,7 +913,7 @@ walletAddressId
id
-String! +String!

The id of the withdrawal.

@@ -922,7 +922,7 @@ id
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -931,7 +931,7 @@ idempotencyKey
timeoutSeconds
-UInt64! +UInt64!

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

@@ -952,7 +952,7 @@ timeoutSeconds
id
-ID! +ID!

Asset id

@@ -961,7 +961,7 @@ id
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -982,7 +982,7 @@ idempotencyKey
id
-ID! +ID! @@ -991,7 +991,7 @@ id
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1012,7 +1012,7 @@ idempotencyKey
assetId
-String! +String!

The id of the asset to deposit liquidity.

@@ -1021,7 +1021,7 @@ assetId
amount
-UInt64! +UInt64!

Amount of liquidity to deposit.

@@ -1030,7 +1030,7 @@ amount
id
-String! +String!

The id of the transfer.

@@ -1039,7 +1039,7 @@ id
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1060,7 +1060,7 @@ idempotencyKey
eventId
-String! +String!

The id of the event to deposit into.

@@ -1069,7 +1069,7 @@ eventId
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1090,7 +1090,7 @@ idempotencyKey
outgoingPaymentId
-String! +String!

The id of the outgoing payment to deposit into.

@@ -1099,7 +1099,7 @@ outgoingPaymentId
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1120,7 +1120,7 @@ idempotencyKey
peerId
-String! +String!

The id of the peer to deposit liquidity.

@@ -1129,7 +1129,7 @@ peerId
amount
-UInt64! +UInt64!

Amount of liquidity to deposit.

@@ -1138,7 +1138,7 @@ amount
id
-String! +String!

The id of the transfer.

@@ -1147,7 +1147,7 @@ id
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1168,7 +1168,7 @@ idempotencyKey
fixed
-UInt64! +UInt64!

A flat fee

@@ -1177,7 +1177,7 @@ fixed
basisPoints
-Int! +Int!

Basis points fee. Should be between 0 and 10000 (inclusive). 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100%

@@ -1198,7 +1198,7 @@ basisPoints
in
-[String!]! +[String!]! @@ -1219,7 +1219,7 @@ in
authTokens
-[String!]! +[String!]!

Array of auth tokens accepted by this Rafiki instance

@@ -1240,7 +1240,7 @@ authTokens
incoming
-HttpIncomingInput +HttpIncomingInput

Incoming connection details

@@ -1249,7 +1249,7 @@ incoming
outgoing
-HttpOutgoingInput! +HttpOutgoingInput!

Outgoing connection details

@@ -1270,7 +1270,7 @@ outgoing
authToken
-String! +String!

Auth token to present at the peering Rafiki instance

@@ -1279,7 +1279,7 @@ authToken
endpoint
-String! +String!

Peer's connection endpoint

@@ -1300,7 +1300,7 @@ endpoint
kid
-String! +String!

Key id

@@ -1309,7 +1309,7 @@ kid
x
-String! +String!

Base64 url-encoded public key.

@@ -1318,7 +1318,7 @@ x
alg
-Alg! +Alg!

Cryptographic algorithm family used with the key. The only allowed value is EdDSA.

@@ -1327,7 +1327,7 @@ alg
kty
-Kty! +Kty!

Key type. The only allowed value is OKP.

@@ -1336,7 +1336,7 @@ kty
crv
-Crv! +Crv!

Curve that the key pair is derived from. The only allowed value is Ed25519.

@@ -1357,7 +1357,7 @@ crv
type
-FilterString +FilterString @@ -1366,7 +1366,7 @@ type
walletAddressId
-FilterString +FilterString @@ -1387,7 +1387,7 @@ walletAddressId
withdrawalId
-String! +String!

The id of the liquidity withdrawal to post.

@@ -1396,7 +1396,7 @@ withdrawalId
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1417,7 +1417,7 @@ idempotencyKey
id
-String! +String!

Internal id of key

@@ -1426,7 +1426,7 @@ id
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1447,7 +1447,7 @@ idempotencyKey
assetId
-ID! +ID!

Asset id to add the fee to

@@ -1456,7 +1456,7 @@ assetId
type
-FeeType! +FeeType!

Type of fee (sending or receiving)

@@ -1465,7 +1465,7 @@ type
fee
-FeeDetails! +FeeDetails!

Fee values

@@ -1474,7 +1474,7 @@ fee
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1495,7 +1495,7 @@ idempotencyKey
limit
-Int! +Int!

Maximum number of events being triggered (n).

@@ -1504,7 +1504,7 @@ limit
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1525,7 +1525,7 @@ idempotencyKey
id
-String! +String!

Asset id

@@ -1534,7 +1534,7 @@ id
withdrawalThreshold
-UInt64 +UInt64

New minimum amount of liquidity that can be withdrawn from the asset

@@ -1543,7 +1543,7 @@ withdrawalThreshold
liquidityThreshold
-UInt64 +UInt64

Account Servicing Entity will be notified via a webhook event if liquidity falls below this new value

@@ -1552,7 +1552,7 @@ liquidityThreshold
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1573,7 +1573,7 @@ idempotencyKey
id
-String! +String!

Peer id

@@ -1582,7 +1582,7 @@ id
maxPacketAmount
-UInt64 +UInt64

New maximum packet amount that the peer accepts

@@ -1591,7 +1591,7 @@ maxPacketAmount
http
-HttpInput +HttpInput

New peering connection details

@@ -1600,7 +1600,7 @@ http
staticIlpAddress
-String +String

Peer's new ILP address

@@ -1609,7 +1609,7 @@ staticIlpAddress
name
-String +String

Peer's new public name

@@ -1618,7 +1618,7 @@ name
liquidityThreshold
-UInt64 +UInt64

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this new value

@@ -1627,7 +1627,7 @@ liquidityThreshold
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1648,7 +1648,7 @@ idempotencyKey
id
-ID! +ID!

ID of wallet address to update

@@ -1657,7 +1657,7 @@ id
publicName
-String +String

New public name for wallet address

@@ -1666,7 +1666,7 @@ publicName
status
-WalletAddressStatus +WalletAddressStatus

New status to set the wallet address to

@@ -1675,7 +1675,7 @@ status
idempotencyKey
-String +String

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1684,7 +1684,7 @@ idempotencyKey
additionalProperties
-[AdditionalPropertyInput!] +[AdditionalPropertyInput!]

List additional properties associated with this wallet address.

@@ -1705,7 +1705,7 @@ additionalProperties
withdrawalId
-String! +String!

The id of the liquidity withdrawal to void.

@@ -1714,7 +1714,7 @@ withdrawalId
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

@@ -1735,7 +1735,7 @@ idempotencyKey
type
-FilterString +FilterString @@ -1756,7 +1756,7 @@ type
eventId
-String! +String!

The id of the event to withdraw from.

@@ -1765,7 +1765,7 @@ eventId
idempotencyKey
-String! +String!

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md b/packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md index 81868d9668..4ae1806c37 100644 --- a/packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md +++ b/packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md @@ -10,9 +10,9 @@ title: Interfaces

Implemented by

-- [IncomingPayment](/apis/backend/objects#incomingpayment) -- [OutgoingPayment](/apis/backend/objects#outgoingpayment) -- [Payment](/apis/backend/objects#payment) +- [IncomingPayment](/apis/graphql/backend/objects#incomingpayment) +- [OutgoingPayment](/apis/graphql/backend/objects#outgoingpayment) +- [Payment](/apis/graphql/backend/objects#payment)

Fields

@@ -22,7 +22,7 @@ title: Interfaces id
-ID! +ID! @@ -31,7 +31,7 @@ id
walletAddressId
-ID! +ID! @@ -40,7 +40,7 @@ walletAddressId
metadata
-JSONObject +JSONObject @@ -49,7 +49,7 @@ metadata
createdAt
-String! +String! @@ -58,7 +58,7 @@ createdAt
client
-String +String @@ -73,16 +73,16 @@ client

Implemented by

-- [Asset](/apis/backend/objects#asset) -- [Peer](/apis/backend/objects#peer) -- [WalletAddress](/apis/backend/objects#walletaddress) -- [IncomingPayment](/apis/backend/objects#incomingpayment) -- [OutgoingPayment](/apis/backend/objects#outgoingpayment) -- [Payment](/apis/backend/objects#payment) -- [AccountingTransfer](/apis/backend/objects#accountingtransfer) -- [WalletAddressKey](/apis/backend/objects#walletaddresskey) -- [WebhookEvent](/apis/backend/objects#webhookevent) -- [Fee](/apis/backend/objects#fee) +- [Asset](/apis/graphql/backend/objects#asset) +- [Peer](/apis/graphql/backend/objects#peer) +- [WalletAddress](/apis/graphql/backend/objects#walletaddress) +- [IncomingPayment](/apis/graphql/backend/objects#incomingpayment) +- [OutgoingPayment](/apis/graphql/backend/objects#outgoingpayment) +- [Payment](/apis/graphql/backend/objects#payment) +- [AccountingTransfer](/apis/graphql/backend/objects#accountingtransfer) +- [WalletAddressKey](/apis/graphql/backend/objects#walletaddresskey) +- [WebhookEvent](/apis/graphql/backend/objects#webhookevent) +- [Fee](/apis/graphql/backend/objects#fee)

Fields

@@ -92,7 +92,7 @@ client
id
-ID! +ID! @@ -101,7 +101,7 @@ id
createdAt
-String! +String! diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/mutations.md b/packages/documentation/src/content/docs/apis/graphql/backend/mutations.md index 82b821618e..e0490a39a6 100644 --- a/packages/documentation/src/content/docs/apis/graphql/backend/mutations.md +++ b/packages/documentation/src/content/docs/apis/graphql/backend/mutations.md @@ -6,7 +6,7 @@ title: Mutations ## cancelOutgoingPayment -**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) +**Type:** [OutgoingPaymentResponse!](/apis/graphql/backend/objects#outgoingpaymentresponse) Cancel Outgoing Payment @@ -18,7 +18,7 @@ Cancel Outgoing Payment input
-CancelOutgoingPaymentInput! +CancelOutgoingPaymentInput! @@ -29,7 +29,7 @@ input
## createAsset -**Type:** [AssetMutationResponse!](/apis/backend/objects#assetmutationresponse) +**Type:** [AssetMutationResponse!](/apis/graphql/backend/objects#assetmutationresponse) Create an asset @@ -41,7 +41,7 @@ Create an asset input
-CreateAssetInput! +CreateAssetInput! @@ -52,7 +52,7 @@ input
## createAssetLiquidityWithdrawal -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) +**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) Withdraw asset liquidity @@ -64,7 +64,7 @@ Withdraw asset liquidity input
-CreateAssetLiquidityWithdrawalInput! +CreateAssetLiquidityWithdrawalInput! @@ -75,7 +75,7 @@ input
## createIncomingPayment -**Type:** [IncomingPaymentResponse!](/apis/backend/objects#incomingpaymentresponse) +**Type:** [IncomingPaymentResponse!](/apis/graphql/backend/objects#incomingpaymentresponse) Create an internal Open Payments Incoming Payment. The receiver has a wallet address on this Rafiki instance. @@ -87,7 +87,7 @@ Create an internal Open Payments Incoming Payment. The receiver has a wallet add input
-CreateIncomingPaymentInput! +CreateIncomingPaymentInput! @@ -98,7 +98,7 @@ input
## createIncomingPaymentWithdrawal -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) +**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) Withdraw incoming payment liquidity @@ -110,7 +110,7 @@ Withdraw incoming payment liquidity input
-CreateIncomingPaymentWithdrawalInput! +CreateIncomingPaymentWithdrawalInput! @@ -121,7 +121,7 @@ input
## createOrUpdatePeerByUrl -**Type:** [CreateOrUpdatePeerByUrlMutationResponse!](/apis/backend/objects#createorupdatepeerbyurlmutationresponse) +**Type:** [CreateOrUpdatePeerByUrlMutationResponse!](/apis/graphql/backend/objects#createorupdatepeerbyurlmutationresponse) Create a peer using a URL @@ -133,7 +133,7 @@ Create a peer using a URL input
-CreateOrUpdatePeerByUrlInput! +CreateOrUpdatePeerByUrlInput! @@ -144,7 +144,7 @@ input
## createOutgoingPayment -**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) +**Type:** [OutgoingPaymentResponse!](/apis/graphql/backend/objects#outgoingpaymentresponse) Create an Open Payments Outgoing Payment @@ -156,7 +156,7 @@ Create an Open Payments Outgoing Payment input
-CreateOutgoingPaymentInput! +CreateOutgoingPaymentInput! @@ -167,7 +167,7 @@ input
## createOutgoingPaymentFromIncomingPayment -**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) +**Type:** [OutgoingPaymentResponse!](/apis/graphql/backend/objects#outgoingpaymentresponse) Create an Open Payments Outgoing Payment from an incoming payment @@ -179,7 +179,7 @@ Create an Open Payments Outgoing Payment from an incoming payment input
-CreateOutgoingPaymentFromIncomingPaymentInput! +CreateOutgoingPaymentFromIncomingPaymentInput! @@ -190,7 +190,7 @@ input
## createOutgoingPaymentWithdrawal -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) +**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) Withdraw outgoing payment liquidity @@ -202,7 +202,7 @@ Withdraw outgoing payment liquidity input
-CreateOutgoingPaymentWithdrawalInput! +CreateOutgoingPaymentWithdrawalInput! @@ -213,7 +213,7 @@ input
## createPeer -**Type:** [CreatePeerMutationResponse!](/apis/backend/objects#createpeermutationresponse) +**Type:** [CreatePeerMutationResponse!](/apis/graphql/backend/objects#createpeermutationresponse) Create a peer @@ -225,7 +225,7 @@ Create a peer input
-CreatePeerInput! +CreatePeerInput! @@ -236,7 +236,7 @@ input
## createPeerLiquidityWithdrawal -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) +**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) Withdraw peer liquidity @@ -248,7 +248,7 @@ Withdraw peer liquidity input
-CreatePeerLiquidityWithdrawalInput! +CreatePeerLiquidityWithdrawalInput! @@ -259,7 +259,7 @@ input
## createQuote -**Type:** [QuoteResponse!](/apis/backend/objects#quoteresponse) +**Type:** [QuoteResponse!](/apis/graphql/backend/objects#quoteresponse) Create an Open Payments Quote @@ -271,7 +271,7 @@ Create an Open Payments Quote input
-CreateQuoteInput! +CreateQuoteInput! @@ -282,7 +282,7 @@ input
## createReceiver -**Type:** [CreateReceiverResponse!](/apis/backend/objects#createreceiverresponse) +**Type:** [CreateReceiverResponse!](/apis/graphql/backend/objects#createreceiverresponse) Create an internal or external Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. @@ -294,7 +294,7 @@ Create an internal or external Open Payments Incoming Payment. The receiver has input
-CreateReceiverInput! +CreateReceiverInput! @@ -305,7 +305,7 @@ input
## createWalletAddress -**Type:** [CreateWalletAddressMutationResponse!](/apis/backend/objects#createwalletaddressmutationresponse) +**Type:** [CreateWalletAddressMutationResponse!](/apis/graphql/backend/objects#createwalletaddressmutationresponse) Create a wallet address @@ -317,7 +317,7 @@ Create a wallet address input
-CreateWalletAddressInput! +CreateWalletAddressInput! @@ -328,7 +328,7 @@ input
## createWalletAddressKey -**Type:** [CreateWalletAddressKeyMutationResponse](/apis/backend/objects#createwalletaddresskeymutationresponse) +**Type:** [CreateWalletAddressKeyMutationResponse](/apis/graphql/backend/objects#createwalletaddresskeymutationresponse) Add a public key to a wallet address that is used to verify Open Payments requests. @@ -340,7 +340,7 @@ Add a public key to a wallet address that is used to verify Open Payments reques input
-CreateWalletAddressKeyInput! +CreateWalletAddressKeyInput! @@ -351,7 +351,7 @@ input
## createWalletAddressWithdrawal -**Type:** [WalletAddressWithdrawalMutationResponse](/apis/backend/objects#walletaddresswithdrawalmutationresponse) +**Type:** [WalletAddressWithdrawalMutationResponse](/apis/graphql/backend/objects#walletaddresswithdrawalmutationresponse) Withdraw liquidity from a wallet address received via Web Monetization. @@ -363,7 +363,7 @@ Withdraw liquidity from a wallet address received via Web Monetization. input
-CreateWalletAddressWithdrawalInput! +CreateWalletAddressWithdrawalInput! @@ -374,7 +374,7 @@ input
## deleteAsset -**Type:** [DeleteAssetMutationResponse!](/apis/backend/objects#deleteassetmutationresponse) +**Type:** [DeleteAssetMutationResponse!](/apis/graphql/backend/objects#deleteassetmutationresponse) Delete an asset @@ -386,7 +386,7 @@ Delete an asset input
-DeleteAssetInput! +DeleteAssetInput! @@ -397,7 +397,7 @@ input
## deletePeer -**Type:** [DeletePeerMutationResponse!](/apis/backend/objects#deletepeermutationresponse) +**Type:** [DeletePeerMutationResponse!](/apis/graphql/backend/objects#deletepeermutationresponse) Delete a peer @@ -409,7 +409,7 @@ Delete a peer input
-DeletePeerInput! +DeletePeerInput! @@ -420,7 +420,7 @@ input
## depositAssetLiquidity -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) +**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) Deposit asset liquidity @@ -432,7 +432,7 @@ Deposit asset liquidity input
-DepositAssetLiquidityInput! +DepositAssetLiquidityInput! @@ -443,7 +443,7 @@ input
## depositEventLiquidity -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) +**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) > Deprecated: Use `depositOutgoingPaymentLiquidity` @@ -457,7 +457,7 @@ Deposit webhook event liquidity input
-DepositEventLiquidityInput! +DepositEventLiquidityInput! @@ -468,7 +468,7 @@ input
## depositOutgoingPaymentLiquidity -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) +**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) Deposit outgoing payment liquidity @@ -480,7 +480,7 @@ Deposit outgoing payment liquidity input
-DepositOutgoingPaymentLiquidityInput! +DepositOutgoingPaymentLiquidityInput! @@ -491,7 +491,7 @@ input
## depositPeerLiquidity -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) +**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) Deposit peer liquidity @@ -503,7 +503,7 @@ Deposit peer liquidity input
-DepositPeerLiquidityInput! +DepositPeerLiquidityInput! @@ -514,7 +514,7 @@ input
## postLiquidityWithdrawal -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) +**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) Post liquidity withdrawal. Withdrawals are two-phase commits and are committed via this mutation. @@ -526,7 +526,7 @@ Post liquidity withdrawal. Withdrawals are two-phase commits and are committed v input
-PostLiquidityWithdrawalInput! +PostLiquidityWithdrawalInput! @@ -537,7 +537,7 @@ input
## revokeWalletAddressKey -**Type:** [RevokeWalletAddressKeyMutationResponse](/apis/backend/objects#revokewalletaddresskeymutationresponse) +**Type:** [RevokeWalletAddressKeyMutationResponse](/apis/graphql/backend/objects#revokewalletaddresskeymutationresponse) Revoke a public key associated with a wallet address. Open Payment requests using this key for request signatures will be denied going forward. @@ -549,7 +549,7 @@ Revoke a public key associated with a wallet address. Open Payment requests usin input
-RevokeWalletAddressKeyInput! +RevokeWalletAddressKeyInput! @@ -560,7 +560,7 @@ input
## setFee -**Type:** [SetFeeResponse!](/apis/backend/objects#setfeeresponse) +**Type:** [SetFeeResponse!](/apis/graphql/backend/objects#setfeeresponse) Set the fee on an asset @@ -572,7 +572,7 @@ Set the fee on an asset input
-SetFeeInput! +SetFeeInput! @@ -583,7 +583,7 @@ input
## triggerWalletAddressEvents -**Type:** [TriggerWalletAddressEventsMutationResponse!](/apis/backend/objects#triggerwalletaddresseventsmutationresponse) +**Type:** [TriggerWalletAddressEventsMutationResponse!](/apis/graphql/backend/objects#triggerwalletaddresseventsmutationresponse) If automatic withdrawal of funds received via Web Monetization by the wallet address are disabled, this mutation can be used to trigger up to n withdrawal events. @@ -595,7 +595,7 @@ If automatic withdrawal of funds received via Web Monetization by the wallet add input
-TriggerWalletAddressEventsInput! +TriggerWalletAddressEventsInput! @@ -606,7 +606,7 @@ input
## updateAsset -**Type:** [AssetMutationResponse!](/apis/backend/objects#assetmutationresponse) +**Type:** [AssetMutationResponse!](/apis/graphql/backend/objects#assetmutationresponse) Update an asset @@ -618,7 +618,7 @@ Update an asset input
-UpdateAssetInput! +UpdateAssetInput! @@ -629,7 +629,7 @@ input
## updatePeer -**Type:** [UpdatePeerMutationResponse!](/apis/backend/objects#updatepeermutationresponse) +**Type:** [UpdatePeerMutationResponse!](/apis/graphql/backend/objects#updatepeermutationresponse) Update a peer @@ -641,7 +641,7 @@ Update a peer input
-UpdatePeerInput! +UpdatePeerInput! @@ -652,7 +652,7 @@ input
## updateWalletAddress -**Type:** [UpdateWalletAddressMutationResponse!](/apis/backend/objects#updatewalletaddressmutationresponse) +**Type:** [UpdateWalletAddressMutationResponse!](/apis/graphql/backend/objects#updatewalletaddressmutationresponse) Update a wallet address @@ -664,7 +664,7 @@ Update a wallet address input
-UpdateWalletAddressInput! +UpdateWalletAddressInput! @@ -675,7 +675,7 @@ input
## voidLiquidityWithdrawal -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) +**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) Void liquidity withdrawal. Withdrawals are two-phase commits and are rolled back via this mutation. @@ -687,7 +687,7 @@ Void liquidity withdrawal. Withdrawals are two-phase commits and are rolled back input
-VoidLiquidityWithdrawalInput! +VoidLiquidityWithdrawalInput! @@ -698,7 +698,7 @@ input
## withdrawEventLiquidity -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) +**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) > Deprecated: Use `createOutgoingPaymentWithdrawal, createIncomingPaymentWithdrawal, or createWalletAddressWithdrawal` @@ -712,7 +712,7 @@ Withdraw webhook event liquidity input
-WithdrawEventLiquidityInput! +WithdrawEventLiquidityInput! diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/objects.md b/packages/documentation/src/content/docs/apis/graphql/backend/objects.md index 39212c93ae..da2cc6867f 100644 --- a/packages/documentation/src/content/docs/apis/graphql/backend/objects.md +++ b/packages/documentation/src/content/docs/apis/graphql/backend/objects.md @@ -10,7 +10,7 @@ title: Objects

Implements

-- [Model](/apis/backend/interfaces#model) +- [Model](/apis/graphql/backend/interfaces#model)

Fields

@@ -20,7 +20,7 @@ title: Objects id
-ID! +ID!

Payment id

@@ -29,7 +29,7 @@ id
debitAccountId
-ID! +ID!

Debit account id

@@ -38,7 +38,7 @@ debitAccountId
creditAccountId
-ID! +ID!

Credit account id

@@ -47,7 +47,7 @@ creditAccountId
amount
-UInt64! +UInt64!

Amount sent (fixed send)

@@ -56,7 +56,7 @@ amount
transferType
-TransferType! +TransferType!

Type of accounting transfer

@@ -65,7 +65,7 @@ transferType
ledger
-UInt8! +UInt8!

Identifier that partitions the sets of accounts that can transact with each other.

@@ -74,7 +74,7 @@ ledger
createdAt
-String! +String!

Date-time of creation

@@ -95,7 +95,7 @@ createdAt
debits
-[AccountingTransfer!]! +[AccountingTransfer!]! @@ -104,7 +104,7 @@ debits
credits
-[AccountingTransfer!]! +[AccountingTransfer!]! @@ -125,7 +125,7 @@ credits
key
-String! +String! @@ -134,7 +134,7 @@ key
value
-String! +String! @@ -143,7 +143,7 @@ value
visibleInOpenPayments
-Boolean! +Boolean! @@ -164,7 +164,7 @@ visibleInOpenPayments
value
-UInt64! +UInt64! @@ -173,7 +173,7 @@ value
assetCode
-String! +String!

ISO 4217 currency code, e.g. USD

@@ -182,7 +182,7 @@ assetCode
assetScale
-UInt8! +UInt8!

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

@@ -197,7 +197,7 @@ assetScale

Implements

-- [Model](/apis/backend/interfaces#model) +- [Model](/apis/graphql/backend/interfaces#model)

Fields

@@ -207,7 +207,7 @@ assetScale
id
-ID! +ID!

Asset id

@@ -216,7 +216,7 @@ id
code
-String! +String!

ISO 4217 currency code, e.g. USD

@@ -225,7 +225,7 @@ code
scale
-UInt8! +UInt8!

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

@@ -234,7 +234,7 @@ scale
liquidity
-UInt64 +UInt64

Available liquidity

@@ -243,7 +243,7 @@ liquidity
withdrawalThreshold
-UInt64 +UInt64

Minimum amount of liquidity that can be withdrawn from the asset

@@ -252,7 +252,7 @@ withdrawalThreshold
liquidityThreshold
-UInt64 +UInt64

Account Servicing Entity will be notified via a webhook event if liquidity falls below this value

@@ -261,7 +261,7 @@ liquidityThreshold
receivingFee
-Fee +Fee

The receiving fee structure for the asset

@@ -270,7 +270,7 @@ receivingFee
sendingFee
-Fee +Fee

The sending fee structure for the asset

@@ -279,7 +279,7 @@ sendingFee
fees
-FeesConnection +FeesConnection

Fetch a page of asset fees

@@ -292,7 +292,7 @@ fees
after
-String +String

Paginating forwards: the cursor before the the requested page.

@@ -301,7 +301,7 @@ after
before
-String +String

Paginating backwards: the cursor after the the requested page.

@@ -310,7 +310,7 @@ before
first
-Int +Int

Paginating forwards: The first n elements from the page.

@@ -319,7 +319,7 @@ first
last
-Int +Int

Paginating backwards: The last n elements from the page.

@@ -328,7 +328,7 @@ last
sortOrder
-SortOrder +SortOrder

Ascending or descending order of creation.

@@ -342,7 +342,7 @@ sortOrder
createdAt
-String! +String!

Date-time of creation

@@ -363,7 +363,7 @@ createdAt
node
-Asset! +Asset! @@ -372,7 +372,7 @@ node
cursor
-String! +String! @@ -393,7 +393,7 @@ cursor
asset
-Asset +Asset @@ -414,7 +414,7 @@ asset
pageInfo
-PageInfo! +PageInfo! @@ -423,7 +423,7 @@ pageInfo
edges
-[AssetEdge!]! +[AssetEdge!]! @@ -444,7 +444,7 @@ edges
peer
-Peer +Peer @@ -465,7 +465,7 @@ peer
peer
-Peer +Peer @@ -486,7 +486,7 @@ peer
receiver
-Receiver +Receiver @@ -507,7 +507,7 @@ receiver
walletAddressKey
-WalletAddressKey +WalletAddressKey @@ -528,7 +528,7 @@ walletAddressKey
walletAddress
-WalletAddress +WalletAddress @@ -549,7 +549,7 @@ walletAddress
asset
-Asset +Asset @@ -570,7 +570,7 @@ asset
success
-Boolean! +Boolean! @@ -585,7 +585,7 @@ success

Implements

-- [Model](/apis/backend/interfaces#model) +- [Model](/apis/graphql/backend/interfaces#model)

Fields

@@ -595,7 +595,7 @@ success
id
-ID! +ID!

Fee id

@@ -604,7 +604,7 @@ id
assetId
-ID! +ID!

Asset id associated with the fee

@@ -613,7 +613,7 @@ assetId
type
-FeeType! +FeeType!

Type of fee (sending or receiving)

@@ -622,7 +622,7 @@ type
fixed
-UInt64! +UInt64!

Fixed fee

@@ -631,7 +631,7 @@ fixed
basisPoints
-Int! +Int!

Basis points fee. 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100%

@@ -640,7 +640,7 @@ basisPoints
createdAt
-String! +String!

Date-time of creation

@@ -661,7 +661,7 @@ createdAt
node
-Fee! +Fee! @@ -670,7 +670,7 @@ node
cursor
-String! +String! @@ -691,7 +691,7 @@ cursor
pageInfo
-PageInfo! +PageInfo! @@ -700,7 +700,7 @@ pageInfo
edges
-[FeeEdge!]! +[FeeEdge!]! @@ -721,7 +721,7 @@ edges
outgoing
-HttpOutgoing! +HttpOutgoing!

Outgoing connection details

@@ -742,7 +742,7 @@ outgoing
authToken
-String! +String!

Auth token to present at the peering Rafiki instance

@@ -751,7 +751,7 @@ authToken
endpoint
-String! +String!

Peer's connection endpoint

@@ -766,8 +766,8 @@ endpoint

Implements

-- [BasePayment](/apis/backend/interfaces#basepayment) -- [Model](/apis/backend/interfaces#model) +- [BasePayment](/apis/graphql/backend/interfaces#basepayment) +- [Model](/apis/graphql/backend/interfaces#model)

Fields

@@ -777,7 +777,7 @@ endpoint
id
-ID! +ID!

Incoming Payment id

@@ -786,7 +786,7 @@ id
walletAddressId
-ID! +ID!

Id of the wallet address under which this incoming payment was created.

@@ -795,7 +795,7 @@ walletAddressId
client
-String +String

Information about the wallet address of the Open Payments client that created the incoming payment.

@@ -804,7 +804,7 @@ client
liquidity
-UInt64 +UInt64

Available liquidity

@@ -813,7 +813,7 @@ liquidity
state
-IncomingPaymentState! +IncomingPaymentState!

Incoming payment state

@@ -822,7 +822,7 @@ state
expiresAt
-String! +String!

Date-time of expiry. After this time, the incoming payment will not accept further payments made to it.

@@ -831,7 +831,7 @@ expiresAt
incomingAmount
-Amount +Amount

The maximum amount that should be paid into the wallet address under this incoming payment.

@@ -840,7 +840,7 @@ incomingAmount
receivedAmount
-Amount! +Amount!

The total amount that has been paid into the wallet address under this incoming payment.

@@ -849,7 +849,7 @@ receivedAmount
metadata
-JSONObject +JSONObject

Additional metadata associated with the incoming payment.

@@ -858,7 +858,7 @@ metadata
createdAt
-String! +String!

Date-time of creation

@@ -879,7 +879,7 @@ createdAt
pageInfo
-PageInfo! +PageInfo! @@ -888,7 +888,7 @@ pageInfo
edges
-[IncomingPaymentEdge!]! +[IncomingPaymentEdge!]! @@ -909,7 +909,7 @@ edges
node
-IncomingPayment! +IncomingPayment! @@ -918,7 +918,7 @@ node
cursor
-String! +String! @@ -939,7 +939,7 @@ cursor
payment
-IncomingPayment +IncomingPayment @@ -960,7 +960,7 @@ payment
kid
-String! +String!

Key id

@@ -969,7 +969,7 @@ kid
x
-String! +String!

Base64 url-encoded public key.

@@ -978,7 +978,7 @@ x
alg
-Alg! +Alg!

Cryptographic algorithm family used with the key. The only allowed value is EdDSA.

@@ -987,7 +987,7 @@ alg
kty
-Kty! +Kty!

Key type. The only allowed value is OKP.

@@ -996,7 +996,7 @@ kty
crv
-Crv! +Crv!

Curve that the key pair is derived from. The only allowed value is Ed25519.

@@ -1017,7 +1017,7 @@ crv
success
-Boolean! +Boolean! @@ -1032,8 +1032,8 @@ success

Implements

-- [BasePayment](/apis/backend/interfaces#basepayment) -- [Model](/apis/backend/interfaces#model) +- [BasePayment](/apis/graphql/backend/interfaces#basepayment) +- [Model](/apis/graphql/backend/interfaces#model)

Fields

@@ -1043,7 +1043,7 @@ success
id
-ID! +ID!

Outgoing payment id

@@ -1052,7 +1052,7 @@ id
walletAddressId
-ID! +ID!

Id of the wallet address under which this outgoing payment was created

@@ -1061,7 +1061,7 @@ walletAddressId
client
-String +String

Information about the wallet address of the Open Payments client that created the outgoing payment.

@@ -1070,7 +1070,7 @@ client
liquidity
-UInt64 +UInt64

Available liquidity

@@ -1079,7 +1079,7 @@ liquidity
state
-OutgoingPaymentState! +OutgoingPaymentState!

Outgoing payment state

@@ -1088,7 +1088,7 @@ state
error
-String +String @@ -1097,7 +1097,7 @@ error
stateAttempts
-Int! +Int! @@ -1106,7 +1106,7 @@ stateAttempts
debitAmount
-Amount! +Amount!

Amount to send (fixed send)

@@ -1115,7 +1115,7 @@ debitAmount
receiveAmount
-Amount! +Amount!

Amount to receive (fixed receive)

@@ -1124,7 +1124,7 @@ receiveAmount
receiver
-String! +String!

Wallet address URL of the receiver

@@ -1133,7 +1133,7 @@ receiver
metadata
-JSONObject +JSONObject

Additional metadata associated with the outgoing payment.

@@ -1142,7 +1142,7 @@ metadata
quote
-Quote +Quote

Quote for this outgoing payment

@@ -1151,7 +1151,7 @@ quote
sentAmount
-Amount! +Amount!

Amount already sent

@@ -1160,7 +1160,7 @@ sentAmount
createdAt
-String! +String!

Date-time of creation

@@ -1169,7 +1169,7 @@ createdAt
grantId
-String +String

Id of the Grant under which this outgoing payment was created

@@ -1190,7 +1190,7 @@ grantId
pageInfo
-PageInfo! +PageInfo! @@ -1199,7 +1199,7 @@ pageInfo
edges
-[OutgoingPaymentEdge!]! +[OutgoingPaymentEdge!]! @@ -1220,7 +1220,7 @@ edges
node
-OutgoingPayment! +OutgoingPayment! @@ -1229,7 +1229,7 @@ node
cursor
-String! +String! @@ -1250,7 +1250,7 @@ cursor
payment
-OutgoingPayment +OutgoingPayment @@ -1271,7 +1271,7 @@ payment
endCursor
-String +String

Paginating forwards: the cursor to continue.

@@ -1280,7 +1280,7 @@ endCursor
hasNextPage
-Boolean! +Boolean!

Paginating forwards: Are there more pages?

@@ -1289,7 +1289,7 @@ hasNextPage
hasPreviousPage
-Boolean! +Boolean!

Paginating backwards: Are there more pages?

@@ -1298,7 +1298,7 @@ hasPreviousPage
startCursor
-String +String

Paginating backwards: the cursor to continue.

@@ -1313,8 +1313,8 @@ startCursor

Implements

-- [BasePayment](/apis/backend/interfaces#basepayment) -- [Model](/apis/backend/interfaces#model) +- [BasePayment](/apis/graphql/backend/interfaces#basepayment) +- [Model](/apis/graphql/backend/interfaces#model)

Fields

@@ -1324,7 +1324,7 @@ startCursor
id
-ID! +ID!

Payment id

@@ -1333,7 +1333,7 @@ id
type
-PaymentType! +PaymentType!

Type of payment

@@ -1342,7 +1342,7 @@ type
walletAddressId
-ID! +ID!

Id of the wallet address under which this payment was created

@@ -1351,7 +1351,7 @@ walletAddressId
client
-String +String

Information about the wallet address of the Open Payments client that created the payment.

@@ -1360,7 +1360,7 @@ client
state
-String! +String!

Either the IncomingPaymentState or OutgoingPaymentState according to type

@@ -1369,7 +1369,7 @@ state
liquidity
-UInt64 +UInt64

Available liquidity

@@ -1378,7 +1378,7 @@ liquidity
metadata
-JSONObject +JSONObject

Additional metadata associated with the payment.

@@ -1387,7 +1387,7 @@ metadata
createdAt
-String! +String!

Date-time of creation

@@ -1408,7 +1408,7 @@ createdAt
pageInfo
-PageInfo! +PageInfo! @@ -1417,7 +1417,7 @@ pageInfo
edges
-[PaymentEdge!]! +[PaymentEdge!]! @@ -1438,7 +1438,7 @@ edges
node
-Payment! +Payment! @@ -1447,7 +1447,7 @@ node
cursor
-String! +String! @@ -1462,7 +1462,7 @@ cursor

Implements

-- [Model](/apis/backend/interfaces#model) +- [Model](/apis/graphql/backend/interfaces#model)

Fields

@@ -1472,7 +1472,7 @@ cursor
id
-ID! +ID!

Peer id

@@ -1481,7 +1481,7 @@ id
maxPacketAmount
-UInt64 +UInt64

Maximum packet amount that the peer accepts

@@ -1490,7 +1490,7 @@ maxPacketAmount
http
-Http! +Http!

Peering connection details

@@ -1499,7 +1499,7 @@ http
asset
-Asset! +Asset!

Asset of peering relationship

@@ -1508,7 +1508,7 @@ asset
staticIlpAddress
-String! +String!

Peer's ILP address

@@ -1517,7 +1517,7 @@ staticIlpAddress
name
-String +String

Peer's public name

@@ -1526,7 +1526,7 @@ name
liquidityThreshold
-UInt64 +UInt64

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

@@ -1535,7 +1535,7 @@ liquidityThreshold
liquidity
-UInt64 +UInt64

Available liquidity

@@ -1544,7 +1544,7 @@ liquidity
createdAt
-String! +String!

Date-time of creation

@@ -1565,7 +1565,7 @@ createdAt
node
-Peer! +Peer! @@ -1574,7 +1574,7 @@ node
cursor
-String! +String! @@ -1595,7 +1595,7 @@ cursor
pageInfo
-PageInfo! +PageInfo! @@ -1604,7 +1604,7 @@ pageInfo
edges
-[PeerEdge!]! +[PeerEdge!]! @@ -1625,7 +1625,7 @@ edges
id
-ID! +ID!

Quote id

@@ -1634,7 +1634,7 @@ id
walletAddressId
-ID! +ID!

Id of the wallet address under which this quote was created

@@ -1643,7 +1643,7 @@ walletAddressId
receiver
-String! +String!

Wallet address URL of the receiver

@@ -1652,7 +1652,7 @@ receiver
debitAmount
-Amount! +Amount!

Amount to send (fixed send)

@@ -1661,7 +1661,7 @@ debitAmount
receiveAmount
-Amount! +Amount!

Amount to receive (fixed receive)

@@ -1670,7 +1670,7 @@ receiveAmount
maxPacketAmount
-UInt64! +UInt64!

Maximum value per packet allowed on the possible routes

@@ -1679,7 +1679,7 @@ maxPacketAmount
minExchangeRate
-Float! +Float!

Aggregate exchange rate the payment is guaranteed to meet

@@ -1688,7 +1688,7 @@ minExchangeRate
lowEstimatedExchangeRate
-Float! +Float!

Lower bound of probed exchange rate

@@ -1697,7 +1697,7 @@ lowEstimatedExchangeRate
highEstimatedExchangeRate
-Float! +Float!

Upper bound of probed exchange rate

@@ -1706,7 +1706,7 @@ highEstimatedExchangeRate
createdAt
-String! +String!

Date-time of creation

@@ -1715,7 +1715,7 @@ createdAt
expiresAt
-String! +String!

Date-time of expiration

@@ -1736,7 +1736,7 @@ expiresAt
pageInfo
-PageInfo! +PageInfo! @@ -1745,7 +1745,7 @@ pageInfo
edges
-[QuoteEdge!]! +[QuoteEdge!]! @@ -1766,7 +1766,7 @@ edges
node
-Quote! +Quote! @@ -1775,7 +1775,7 @@ node
cursor
-String! +String! @@ -1796,7 +1796,7 @@ cursor
quote
-Quote +Quote @@ -1817,7 +1817,7 @@ quote
id
-String! +String!

Incoming payment URL

@@ -1826,7 +1826,7 @@ id
walletAddressUrl
-String! +String!

Wallet address URL under which the incoming payment was created

@@ -1835,7 +1835,7 @@ walletAddressUrl
completed
-Boolean! +Boolean!

Describes whether the incoming payment has completed receiving funds.

@@ -1844,7 +1844,7 @@ completed
incomingAmount
-Amount +Amount

The maximum amount that should be paid into the wallet address under this incoming payment.

@@ -1853,7 +1853,7 @@ incomingAmount
receivedAmount
-Amount! +Amount!

The total amount that has been paid into the wallet address under this incoming payment.

@@ -1862,7 +1862,7 @@ receivedAmount
expiresAt
-String +String

Date-time of expiry. After this time, the incoming payment will accept further payments made to it.

@@ -1871,7 +1871,7 @@ expiresAt
metadata
-JSONObject +JSONObject

Additional metadata associated with the incoming payment.

@@ -1880,7 +1880,7 @@ metadata
createdAt
-String! +String!

Date-time of creation

@@ -1889,7 +1889,7 @@ createdAt
updatedAt
-String! +String!

Date-time of last update

@@ -1910,7 +1910,7 @@ updatedAt
walletAddressKey
-WalletAddressKey +WalletAddressKey @@ -1931,7 +1931,7 @@ walletAddressKey
fee
-Fee +Fee @@ -1952,7 +1952,7 @@ fee
count
-Int +Int

Number of events triggered

@@ -1973,7 +1973,7 @@ count
peer
-Peer +Peer @@ -1994,7 +1994,7 @@ peer
walletAddress
-WalletAddress +WalletAddress @@ -2009,7 +2009,7 @@ walletAddress

Implements

-- [Model](/apis/backend/interfaces#model) +- [Model](/apis/graphql/backend/interfaces#model)

Fields

@@ -2019,7 +2019,7 @@ walletAddress
id
-ID! +ID!

Wallet address id

@@ -2028,7 +2028,7 @@ id
asset
-Asset! +Asset!

Asset of the wallet address

@@ -2037,7 +2037,7 @@ asset
liquidity
-UInt64 +UInt64

Available liquidity

@@ -2046,7 +2046,7 @@ liquidity
url
-String! +String!

Wallet Address URL

@@ -2055,7 +2055,7 @@ url
publicName
-String +String

Public name associated with the wallet address

@@ -2064,7 +2064,7 @@ publicName
incomingPayments
-IncomingPaymentConnection +IncomingPaymentConnection

List of incoming payments received by this wallet address

@@ -2077,7 +2077,7 @@ incomingPayments
after
-String +String

Paginating forwards: the cursor before the the requested page.

@@ -2086,7 +2086,7 @@ after
before
-String +String

Paginating backwards: the cursor after the the requested page.

@@ -2095,7 +2095,7 @@ before
first
-Int +Int

Paginating forwards: The first n elements from the page.

@@ -2104,7 +2104,7 @@ first
last
-Int +Int

Paginating backwards: The last n elements from the page.

@@ -2113,7 +2113,7 @@ last
sortOrder
-SortOrder +SortOrder

Ascending or descending order of creation.

@@ -2127,7 +2127,7 @@ sortOrder
quotes
-QuoteConnection +QuoteConnection

List of quotes created at this wallet address

@@ -2140,7 +2140,7 @@ quotes
after
-String +String

Paginating forwards: the cursor before the the requested page.

@@ -2149,7 +2149,7 @@ after
before
-String +String

Paginating backwards: the cursor after the the requested page.

@@ -2158,7 +2158,7 @@ before
first
-Int +Int

Paginating forwards: The first n elements from the page.

@@ -2167,7 +2167,7 @@ first
last
-Int +Int

Paginating backwards: The last n elements from the page.

@@ -2176,7 +2176,7 @@ last
sortOrder
-SortOrder +SortOrder

Ascending or descending order of creation.

@@ -2190,7 +2190,7 @@ sortOrder
outgoingPayments
-OutgoingPaymentConnection +OutgoingPaymentConnection

List of outgoing payments sent from this wallet address

@@ -2203,7 +2203,7 @@ outgoingPayments
after
-String +String

Paginating forwards: the cursor before the the requested page.

@@ -2212,7 +2212,7 @@ after
before
-String +String

Paginating backwards: the cursor after the the requested page.

@@ -2221,7 +2221,7 @@ before
first
-Int +Int

Paginating forwards: The first n elements from the page.

@@ -2230,7 +2230,7 @@ first
last
-Int +Int

Paginating backwards: The last n elements from the page.

@@ -2239,7 +2239,7 @@ last
sortOrder
-SortOrder +SortOrder

Ascending or descending order of creation.

@@ -2253,7 +2253,7 @@ sortOrder
createdAt
-String! +String!

Date-time of creation

@@ -2262,7 +2262,7 @@ createdAt
status
-WalletAddressStatus! +WalletAddressStatus!

Status of the wallet address

@@ -2271,7 +2271,7 @@ status
walletAddressKeys
-WalletAddressKeyConnection +WalletAddressKeyConnection

List of keys associated with this wallet address

@@ -2284,7 +2284,7 @@ walletAddressKeys
after
-String +String

Paginating forwards: the cursor before the the requested page.

@@ -2293,7 +2293,7 @@ after
before
-String +String

Paginating backwards: the cursor after the the requested page.

@@ -2302,7 +2302,7 @@ before
first
-Int +Int

Paginating forwards: The first n elements from the page.

@@ -2311,7 +2311,7 @@ first
last
-Int +Int

Paginating backwards: The last n elements from the page.

@@ -2320,7 +2320,7 @@ last
sortOrder
-SortOrder +SortOrder

Ascending or descending order of creation.

@@ -2334,7 +2334,7 @@ sortOrder
additionalProperties
-[AdditionalProperty] +[AdditionalProperty]

List additional properties associated with this wallet address.

@@ -2355,7 +2355,7 @@ additionalProperties
node
-WalletAddress! +WalletAddress! @@ -2364,7 +2364,7 @@ node
cursor
-String! +String! @@ -2385,7 +2385,7 @@ cursor
pageInfo
-PageInfo! +PageInfo! @@ -2394,7 +2394,7 @@ pageInfo
edges
-[WalletAddressEdge!]! +[WalletAddressEdge!]! @@ -2409,7 +2409,7 @@ edges

Implements

-- [Model](/apis/backend/interfaces#model) +- [Model](/apis/graphql/backend/interfaces#model)

Fields

@@ -2419,7 +2419,7 @@ edges
id
-ID! +ID!

Internal id of key

@@ -2428,7 +2428,7 @@ id
walletAddressId
-ID! +ID!

Id of the wallet address to which this key belongs to

@@ -2437,7 +2437,7 @@ walletAddressId
jwk
-Jwk! +Jwk!

Public key

@@ -2446,7 +2446,7 @@ jwk
revoked
-Boolean! +Boolean!

Indicator whether the key has been revoked

@@ -2455,7 +2455,7 @@ revoked
createdAt
-String! +String!

Date-time of creation

@@ -2476,7 +2476,7 @@ createdAt
pageInfo
-PageInfo! +PageInfo! @@ -2485,7 +2485,7 @@ pageInfo
edges
-[WalletAddressKeyEdge!]! +[WalletAddressKeyEdge!]! @@ -2506,7 +2506,7 @@ edges
node
-WalletAddressKey! +WalletAddressKey! @@ -2515,7 +2515,7 @@ node
cursor
-String! +String! @@ -2536,7 +2536,7 @@ cursor
id
-ID! +ID!

Withdrawal Id

@@ -2545,7 +2545,7 @@ id
amount
-UInt64! +UInt64!

Amount to withdraw

@@ -2554,7 +2554,7 @@ amount
walletAddress
-WalletAddress! +WalletAddress!

Wallet address details

@@ -2575,7 +2575,7 @@ walletAddress
withdrawal
-WalletAddressWithdrawal +WalletAddressWithdrawal @@ -2590,7 +2590,7 @@ withdrawal

Implements

-- [Model](/apis/backend/interfaces#model) +- [Model](/apis/graphql/backend/interfaces#model)

Fields

@@ -2600,7 +2600,7 @@ withdrawal
id
-ID! +ID!

Event id

@@ -2609,7 +2609,7 @@ id
type
-String! +String!

Type of event

@@ -2618,7 +2618,7 @@ type
data
-JSONObject! +JSONObject!

Stringified JSON data

@@ -2627,7 +2627,7 @@ data
createdAt
-String! +String!

Date-time of creation

@@ -2648,7 +2648,7 @@ createdAt
pageInfo
-PageInfo! +PageInfo! @@ -2657,7 +2657,7 @@ pageInfo
edges
-[WebhookEventsEdge!]! +[WebhookEventsEdge!]! @@ -2678,7 +2678,7 @@ edges
node
-WebhookEvent! +WebhookEvent! @@ -2687,7 +2687,7 @@ node
cursor
-String! +String! diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/queries.md b/packages/documentation/src/content/docs/apis/graphql/backend/queries.md index c50ce737cf..2c96e4a8d5 100644 --- a/packages/documentation/src/content/docs/apis/graphql/backend/queries.md +++ b/packages/documentation/src/content/docs/apis/graphql/backend/queries.md @@ -6,7 +6,7 @@ title: Queries ## accountingTransfers -**Type:** [AccountingTransferConnection!](/apis/backend/objects#accountingtransferconnection) +**Type:** [AccountingTransferConnection!](/apis/graphql/backend/objects#accountingtransferconnection) Fetch a page of accounting transfers @@ -18,7 +18,7 @@ Fetch a page of accounting transfers id
-String! +String!

Account id.

@@ -27,7 +27,7 @@ id
limit
-Int +Int

Limit the number of results returned. If no limit is provided, the default limit of 100_000 is set for TigerBeetle.

@@ -38,7 +38,7 @@ limit
## asset -**Type:** [Asset](/apis/backend/objects#asset) +**Type:** [Asset](/apis/graphql/backend/objects#asset) Fetch an asset @@ -50,7 +50,7 @@ Fetch an asset id
-String! +String! @@ -61,7 +61,7 @@ id
## assets -**Type:** [AssetsConnection!](/apis/backend/objects#assetsconnection) +**Type:** [AssetsConnection!](/apis/graphql/backend/objects#assetsconnection) Fetch a page of assets. @@ -73,7 +73,7 @@ Fetch a page of assets. after
-String +String

Paginating forwards: the cursor before the the requested page.

@@ -82,7 +82,7 @@ after
before
-String +String

Paginating backwards: the cursor after the the requested page.

@@ -91,7 +91,7 @@ before
first
-Int +Int

Paginating forwards: The first n elements from the page.

@@ -100,7 +100,7 @@ first
last
-Int +Int

Paginating backwards: The last n elements from the page.

@@ -109,7 +109,7 @@ last
sortOrder
-SortOrder +SortOrder

Ascending or descending order of creation.

@@ -120,7 +120,7 @@ sortOrder
## incomingPayment -**Type:** [IncomingPayment](/apis/backend/objects#incomingpayment) +**Type:** [IncomingPayment](/apis/graphql/backend/objects#incomingpayment) Fetch an Open Payments incoming payment @@ -132,7 +132,7 @@ Fetch an Open Payments incoming payment id
-String! +String! @@ -143,7 +143,7 @@ id
## outgoingPayment -**Type:** [OutgoingPayment](/apis/backend/objects#outgoingpayment) +**Type:** [OutgoingPayment](/apis/graphql/backend/objects#outgoingpayment) Fetch an Open Payments outgoing payment @@ -155,7 +155,7 @@ Fetch an Open Payments outgoing payment id
-String! +String! @@ -166,7 +166,7 @@ id
## payments -**Type:** [PaymentConnection!](/apis/backend/objects#paymentconnection) +**Type:** [PaymentConnection!](/apis/graphql/backend/objects#paymentconnection) Fetch a page of combined payments @@ -178,7 +178,7 @@ Fetch a page of combined payments after
-String +String

Paginating forwards: the cursor before the the requested page.

@@ -187,7 +187,7 @@ after
before
-String +String

Paginating backwards: the cursor after the the requested page.

@@ -196,7 +196,7 @@ before
first
-Int +Int

Paginating forwards: The first n elements from the page.

@@ -205,7 +205,7 @@ first
last
-Int +Int

Paginating backwards: The last n elements from the page.

@@ -214,7 +214,7 @@ last
sortOrder
-SortOrder +SortOrder

Ascending or descending order of creation.

@@ -223,7 +223,7 @@ sortOrder
filter
-PaymentFilter +PaymentFilter

Filter payment events based on specific criteria.

@@ -234,7 +234,7 @@ filter
## peer -**Type:** [Peer](/apis/backend/objects#peer) +**Type:** [Peer](/apis/graphql/backend/objects#peer) Fetch a peer @@ -246,7 +246,7 @@ Fetch a peer id
-String! +String! @@ -257,7 +257,7 @@ id
## peers -**Type:** [PeersConnection!](/apis/backend/objects#peersconnection) +**Type:** [PeersConnection!](/apis/graphql/backend/objects#peersconnection) Fetch a page of peers. @@ -269,7 +269,7 @@ Fetch a page of peers. after
-String +String

Paginating forwards: the cursor before the the requested page.

@@ -278,7 +278,7 @@ after
before
-String +String

Paginating backwards: the cursor after the the requested page.

@@ -287,7 +287,7 @@ before
first
-Int +Int

Paginating forwards: The first n elements from the page.

@@ -296,7 +296,7 @@ first
last
-Int +Int

Paginating backwards: The last n elements from the page.

@@ -305,7 +305,7 @@ last
sortOrder
-SortOrder +SortOrder

Ascending or descending order of creation.

@@ -316,7 +316,7 @@ sortOrder
## quote -**Type:** [Quote](/apis/backend/objects#quote) +**Type:** [Quote](/apis/graphql/backend/objects#quote) Fetch an Open Payments quote @@ -328,7 +328,7 @@ Fetch an Open Payments quote id
-String! +String! @@ -339,7 +339,7 @@ id
## receiver -**Type:** [Receiver](/apis/backend/objects#receiver) +**Type:** [Receiver](/apis/graphql/backend/objects#receiver) Get an local or remote Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. @@ -351,7 +351,7 @@ Get an local or remote Open Payments Incoming Payment. The receiver has a wallet id
-String! +String! @@ -362,7 +362,7 @@ id
## walletAddress -**Type:** [WalletAddress](/apis/backend/objects#walletaddress) +**Type:** [WalletAddress](/apis/graphql/backend/objects#walletaddress) Fetch a wallet address. @@ -374,7 +374,7 @@ Fetch a wallet address. id
-String! +String! @@ -385,7 +385,7 @@ id
## walletAddresses -**Type:** [WalletAddressesConnection!](/apis/backend/objects#walletaddressesconnection) +**Type:** [WalletAddressesConnection!](/apis/graphql/backend/objects#walletaddressesconnection) Fetch a page of wallet addresses. @@ -397,7 +397,7 @@ Fetch a page of wallet addresses. after
-String +String

Paginating forwards: the cursor before the the requested page.

@@ -406,7 +406,7 @@ after
before
-String +String

Paginating backwards: the cursor after the the requested page.

@@ -415,7 +415,7 @@ before
first
-Int +Int

Paginating forwards: The first n elements from the page.

@@ -424,7 +424,7 @@ first
last
-Int +Int

Paginating backwards: The last n elements from the page.

@@ -433,7 +433,7 @@ last
sortOrder
-SortOrder +SortOrder

Ascending or descending order of creation.

@@ -444,7 +444,7 @@ sortOrder
## webhookEvents -**Type:** [WebhookEventsConnection!](/apis/backend/objects#webhookeventsconnection) +**Type:** [WebhookEventsConnection!](/apis/graphql/backend/objects#webhookeventsconnection) Fetch a page of webhook events @@ -456,7 +456,7 @@ Fetch a page of webhook events after
-String +String

Paginating forwards: the cursor before the the requested page.

@@ -465,7 +465,7 @@ after
before
-String +String

Paginating backwards: the cursor after the the requested page.

@@ -474,7 +474,7 @@ before
first
-Int +Int

Paginating forwards: The first n elements from the page.

@@ -483,7 +483,7 @@ first
last
-Int +Int

Paginating backwards: The last n elements from the page.

@@ -492,7 +492,7 @@ last
sortOrder
-SortOrder +SortOrder

Ascending or descending order of creation.

@@ -501,7 +501,7 @@ sortOrder
filter
-WebhookEventFilter +WebhookEventFilter

Filter webhook events based on specific criteria.

diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/helm-k8s.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/helm-k8s.mdx new file mode 100644 index 0000000000..5f6f13791d --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/helm-k8s.mdx @@ -0,0 +1,5 @@ +--- +title: Helm & K8s +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/nginx.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/nginx.mdx new file mode 100644 index 0000000000..3a0b7b934b --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/nginx.mdx @@ -0,0 +1,5 @@ +--- +title: nginx +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx new file mode 100644 index 0000000000..959b3bfb5f --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx @@ -0,0 +1,5 @@ +--- +title: Exchange rates +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx new file mode 100644 index 0000000000..7a62651a5a --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx @@ -0,0 +1,5 @@ +--- +title: IDP +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx new file mode 100644 index 0000000000..6dfd22195a --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx @@ -0,0 +1,5 @@ +--- +title: Webhook events +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx new file mode 100644 index 0000000000..4acafe75e1 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx @@ -0,0 +1,5 @@ +--- +title: Environment variables +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx new file mode 100644 index 0000000000..84aceacbce --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx @@ -0,0 +1,5 @@ +--- +title: Adding asset +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx new file mode 100644 index 0000000000..d1d89e4844 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx @@ -0,0 +1,5 @@ +--- +title: Adding peer +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx new file mode 100644 index 0000000000..9262e55160 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx @@ -0,0 +1,5 @@ +--- +title: Creating wallet address (strategies for identity lookup) +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/grants-management.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/grants-management.mdx new file mode 100644 index 0000000000..b4e64f26cc --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/grants-management.mdx @@ -0,0 +1,5 @@ +--- +title: Grants management +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/keys-management.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/keys-management.mdx new file mode 100644 index 0000000000..89228cd8fa --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/keys-management.mdx @@ -0,0 +1,5 @@ +--- +title: Keys management +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx new file mode 100644 index 0000000000..0ce3307ca9 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx @@ -0,0 +1,5 @@ +--- +title: Managing liquidity +--- + +## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-production.mdx b/packages/documentation/src/content/docs/integration/deploy-to-production.mdx deleted file mode 100644 index caabe65828..0000000000 --- a/packages/documentation/src/content/docs/integration/deploy-to-production.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Deploy to production ---- - -## Placeholder From f5004112ff10d8da97fc1a6e6d3bc10db620bea4 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 20 Aug 2024 15:29:12 +0200 Subject: [PATCH 10/91] chore: updating .gitignore --- packages/documentation/.gitignore | 4 - packages/documentation/astro.config.mjs | 3 +- .../content/docs/apis/graphql/auth/enums.md | 96 - .../docs/apis/graphql/auth/inputobjects.md | 147 - .../docs/apis/graphql/auth/interfaces.md | 41 - .../docs/apis/graphql/auth/mutations.md | 29 - .../content/docs/apis/graphql/auth/objects.md | 362 --- .../content/docs/apis/graphql/auth/queries.md | 97 - .../content/docs/apis/graphql/auth/scalars.md | 30 - .../docs/apis/graphql/backend/enums.md | 348 --- .../docs/apis/graphql/backend/inputobjects.md | 1776 ----------- .../docs/apis/graphql/backend/interfaces.md | 112 - .../docs/apis/graphql/backend/mutations.md | 723 ----- .../docs/apis/graphql/backend/objects.md | 2698 ----------------- .../docs/apis/graphql/backend/queries.md | 512 ---- .../docs/apis/graphql/backend/scalars.md | 38 - 16 files changed, 1 insertion(+), 7015 deletions(-) delete mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/enums.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/mutations.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/objects.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/queries.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/auth/scalars.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/enums.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/mutations.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/objects.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/queries.md delete mode 100644 packages/documentation/src/content/docs/apis/graphql/backend/scalars.md diff --git a/packages/documentation/.gitignore b/packages/documentation/.gitignore index 96d6ef18e7..86874fcf41 100644 --- a/packages/documentation/.gitignore +++ b/packages/documentation/.gitignore @@ -4,10 +4,6 @@ dist/ # generated types .astro/ -# generated docs -src/content/docs/apis/auth/* -src/content/docs/apis/backend/* - # dependencies node_modules/ diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index d79849b34e..32edf0564e 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -128,8 +128,7 @@ export default defineConfig({ link: 'integration/deploy-to-prod/running-your-instance/adding-peer' }, { - label: - 'Creating wallet address', + label: 'Creating wallet address', link: 'integration/deploy-to-prod/running-your-instance/creating-wallet-address' }, { diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/enums.md b/packages/documentation/src/content/docs/apis/graphql/auth/enums.md deleted file mode 100644 index cb3acf7a7c..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/auth/enums.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: Enums ---- - - - -## GrantFinalization - - - -

Values

- - - - - - - - - - - - - - - - - -
ValueDescription
ISSUED -

grant was issued

-
REVOKED -

grant was revoked

-
REJECTED -

grant was rejected

-
- -## GrantState - - - -

Values

- - - - - - - - - - - - - - - - - - - - - -
ValueDescription
PROCESSING -

grant request is determining what state to enter next

-
PENDING -

grant request is awaiting interaction

-
APPROVED -

grant was approved

-
FINALIZED -

grant was finalized and no more access tokens or interactions can be made on it

-
- -## SortOrder - - - -

Values

- - - - - - - - - - - - - -
ValueDescription
ASC -

Choose ascending order for results.

-
DESC -

Choose descending order for results.

-
- diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md b/packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md deleted file mode 100644 index 8a6ed54cc4..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/auth/inputobjects.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: Input objects ---- - - - -## FilterFinalizationReason - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-in
-[GrantFinalization!] -
- -
-notIn
-[GrantFinalization!] -
- -
- -## FilterGrantState - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-in
-[GrantState!] -
- -
-notIn
-[GrantState!] -
- -
- -## FilterString - - - -

Arguments

- - - - - - - - - -
NameDescription
-in
-[String!] -
- -
- -## GrantFilter - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-identifier
-FilterString -
- -
-state
-FilterGrantState -
- -
-finalizationReason
-FilterFinalizationReason -
- -
- -## RevokeGrantInput - - - -

Arguments

- - - - - - - - - -
NameDescription
-grantId
-String! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md b/packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md deleted file mode 100644 index d418f9a286..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/auth/interfaces.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Interfaces ---- - - - -## Model - - - -

Implemented by

- -- [Grant](/apis/graphql/auth/objects#grant) -- [Access](/apis/graphql/auth/objects#access) - -

Fields

- - - - - - - - - - - - - -
NameDescription
-id
-ID! -
- -
-createdAt
-String! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/mutations.md b/packages/documentation/src/content/docs/apis/graphql/auth/mutations.md deleted file mode 100644 index 770184504a..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/auth/mutations.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Mutations ---- - - - -## revokeGrant - -**Type:** [RevokeGrantMutationResponse!](/apis/graphql/auth/objects#revokegrantmutationresponse) - -Revoke Grant - -

Arguments

- - - - - - - - - -
NameDescription
-input
-RevokeGrantInput! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/objects.md b/packages/documentation/src/content/docs/apis/graphql/auth/objects.md deleted file mode 100644 index 0ba2e3f133..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/auth/objects.md +++ /dev/null @@ -1,362 +0,0 @@ ---- -title: Objects ---- - - - -## Access - - - -

Implements

- -- [Model](/apis/graphql/auth/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Access id

-
-identifier
-String -
-

Wallet address of a sub-resource (incoming payment, outgoing payment, or quote)

-
-type
-String! -
-

Access type (incoming payment, outgoing payment, or quote)

-
-actions
-[String]! -
-

Access action (create, read, list or complete)

-
-limits
-LimitData -
-

Payment limits

-
-createdAt
-String! -
-

Date-time of creation

-
- -## Grant - - - -

Implements

- -- [Model](/apis/graphql/auth/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Grant id

-
-client
-String! -
-

Wallet address of the grantee's account

-
-access
-[Access!]! -
-

Access details

-
-state
-GrantState! -
-

State of the grant

-
-finalizationReason
-GrantFinalization -
-

Reason a grant was finalized

-
-createdAt
-String! -
-

Date-time of creation

-
- -## GrantEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Grant! -
- -
-cursor
-String! -
- -
- -## GrantsConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[GrantEdge!]! -
- -
- -## LimitData - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-receiver
-String -
-

Wallet address URL of the receiver

-
-debitAmount
-PaymentAmount -
-

Amount to debit

-
-receiveAmount
-PaymentAmount -
-

Amount to receive

-
-interval
-String -
-

Interval between payments

-
- -## PageInfo - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-endCursor
-String -
-

Paginating forwards: the cursor to continue.

-
-hasNextPage
-Boolean! -
-

Paginating forwards: Are there more pages?

-
-hasPreviousPage
-Boolean! -
-

Paginating backwards: Are there more pages?

-
-startCursor
-String -
-

Paginating backwards: the cursor to continue.

-
- -## PaymentAmount - - - -

Fields

- - - - - - - - - - - - - - - - - -
NameDescription
-value
-UInt64! -
- -
-assetCode
-String! -
-

ISO 4217 currency code, e.g. USD

-
-assetScale
-UInt8! -
-

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

-
- -## RevokeGrantMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-id
-ID! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/queries.md b/packages/documentation/src/content/docs/apis/graphql/auth/queries.md deleted file mode 100644 index 6491d58f39..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/auth/queries.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: Queries ---- - - - -## grant - -**Type:** [Grant!](/apis/graphql/auth/objects#grant) - -Fetch a grant - -

Arguments

- - - - - - - - - -
NameDescription
-id
-ID! -
- -
- -## grants - -**Type:** [GrantsConnection!](/apis/graphql/auth/objects#grantsconnection) - -Fetch a page of grants. - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-filter
-GrantFilter -
-

Filter grants based on specific criteria.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- diff --git a/packages/documentation/src/content/docs/apis/graphql/auth/scalars.md b/packages/documentation/src/content/docs/apis/graphql/auth/scalars.md deleted file mode 100644 index f404688a6e..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/auth/scalars.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Scalars ---- - - - -## Boolean - -The `Boolean` scalar type represents `true` or `false`. - -## ID - -The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. - -## Int - -The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. - -## String - -The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. - -## UInt64 - - - -## UInt8 - - - diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/enums.md b/packages/documentation/src/content/docs/apis/graphql/backend/enums.md deleted file mode 100644 index eeca95bc29..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/backend/enums.md +++ /dev/null @@ -1,348 +0,0 @@ ---- -title: Enums ---- - - - -## Alg - - - -

Values

- - - - - - - - - -
ValueDescription
EdDSA - -
- -## Crv - - - -

Values

- - - - - - - - - -
ValueDescription
Ed25519 - -
- -## FeeType - - - -

Values

- - - - - - - - - - - - - -
ValueDescription
SENDING -

Sender pays the fees

-
RECEIVING -

Receiver pays the fees

-
- -## IncomingPaymentState - - - -

Values

- - - - - - - - - - - - - - - - - - - - - -
ValueDescription
PENDING -

The payment has a state of PENDING when it is initially created.

-
PROCESSING -

As soon as payment has started (funds have cleared into the account) the state moves to PROCESSING

-
COMPLETED -

The payment is either auto-completed once the received amount equals the expected incomingAmount, or it is completed manually via an API call.

-
EXPIRED -

If the payment expires before it is completed then the state will move to EXPIRED and no further payments will be accepted.

-
- -## Kty - - - -

Values

- - - - - - - - - -
ValueDescription
OKP - -
- -## LiquidityError - - - -

Values

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueDescription
AlreadyPosted - -
AlreadyVoided - -
AmountZero - -
InsufficientBalance - -
InvalidId - -
TransferExists - -
UnknownAsset - -
UnknownIncomingPayment - -
UnknownPayment - -
UnknownWalletAddress - -
UnknownPeer - -
UnknownTransfer - -
- -## OutgoingPaymentState - - - -

Values

- - - - - - - - - - - - - - - - - - - - - - - - - -
ValueDescription
FUNDING -

Will transition to SENDING once payment funds are reserved

-
SENDING -

Paying, will transition to COMPLETED on success

-
COMPLETED -

Successful completion

-
FAILED -

Payment failed

-
CANCELLED -

Payment cancelled

-
- -## PaymentType - - - -

Values

- - - - - - - - - - - - - -
ValueDescription
INCOMING - -
OUTGOING - -
- -## SortOrder - - - -

Values

- - - - - - - - - - - - - -
ValueDescription
ASC -

Choose ascending order for results.

-
DESC -

Choose descending order for results.

-
- -## TransferType - - - -

Values

- - - - - - - - - - - - - - - - - -
ValueDescription
DEPOSIT -

Deposit transfer type.

-
WITHDRAWAL -

Withdrawal transfer type.

-
TRANSFER -

Transfer type.

-
- -## WalletAddressStatus - - - -

Values

- - - - - - - - - - - - - -
ValueDescription
INACTIVE -

Status after deactivating

-
ACTIVE -

Default status

-
- diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md b/packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md deleted file mode 100644 index c255d7c2f8..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/backend/inputobjects.md +++ /dev/null @@ -1,1776 +0,0 @@ ---- -title: Input objects ---- - - - -## AdditionalPropertyInput - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-key
-String! -
- -
-value
-String! -
- -
-visibleInOpenPayments
-Boolean! -
- -
- -## AmountInput - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-value
-UInt64! -
- -
-assetCode
-String! -
-

ISO 4217 currency code, e.g. USD

-
-assetScale
-UInt8! -
-

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

-
- -## CancelOutgoingPaymentInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Outgoing payment id

-
-reason
-String -
-

Reason why this Outgoing Payment has been cancelled. This value will be publicly visible in the metadata field if this outgoing payment is requested through Open Payments.

-
- -## CreateAssetInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-code
-String! -
-

ISO 4217 currency code, e.g. USD

-
-scale
-UInt8! -
-

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

-
-withdrawalThreshold
-UInt64 -
-

Minimum amount of liquidity that can be withdrawn from the asset

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if liquidity falls below this value

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateAssetLiquidityWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-assetId
-String! -
-

The id of the asset to create the withdrawal for.

-
-amount
-UInt64! -
-

Amount of withdrawal.

-
-id
-String! -
-

The id of the withdrawal.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-timeoutSeconds
-UInt64! -
-

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

-
- -## CreateIncomingPaymentInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
-

Id of the wallet address under which the incoming payment will be created

-
-expiresAt
-String -
-

Expiration date-time

-
-metadata
-JSONObject -
-

Additional metadata associated with the incoming payment.

-
-incomingAmount
-AmountInput -
-

Maximum amount to be received

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateIncomingPaymentWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-incomingPaymentId
-String! -
-

The id of the incoming payment to withdraw from.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-timeoutSeconds
-UInt64! -
-

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

-
- -## CreateOrUpdatePeerByUrlInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-maxPacketAmount
-UInt64 -
-

Maximum packet amount that the peer accepts

-
-assetId
-String! -
-

Asset id of peering relationship

-
-peerUrl
-String! -
-

Peer's URL address at which the peer accepts auto-peering requests

-
-name
-String -
-

Peer's internal name for overriding auto-peer's default naming

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

-
-liquidityToDeposit
-UInt64 -
-

Amount of liquidity to deposit for peer

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateOutgoingPaymentFromIncomingPaymentInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
-

Id of the wallet address under which the outgoing payment will be created

-
-incomingPayment
-String! -
-

Incoming payment url to create the outgoing payment from

-
-debitAmount
-AmountInput! -
-

Amount to send (fixed send)

-
-metadata
-JSONObject -
-

Additional metadata associated with the outgoing payment.

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateOutgoingPaymentInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
-

Id of the wallet address under which the outgoing payment will be created

-
-quoteId
-String! -
-

Id of the corresponding quote for that outgoing payment

-
-metadata
-JSONObject -
-

Additional metadata associated with the outgoing payment.

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateOutgoingPaymentWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-outgoingPaymentId
-String! -
-

The id of the outgoing payment to withdraw from.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-timeoutSeconds
-UInt64! -
-

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

-
- -## CreatePeerInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-maxPacketAmount
-UInt64 -
-

Maximum packet amount that the peer accepts

-
-http
-HttpInput! -
-

Peering connection details

-
-assetId
-String! -
-

Asset id of peering relationship

-
-staticIlpAddress
-String! -
-

Peer's ILP address

-
-name
-String -
-

Peer's internal name

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

-
-initialLiquidity
-UInt64 -
-

Initial amount of liquidity to deposit for peer

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreatePeerLiquidityWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-peerId
-String! -
-

The id of the peer to create the withdrawal for.

-
-amount
-UInt64! -
-

Amount of withdrawal.

-
-id
-String! -
-

The id of the withdrawal.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-timeoutSeconds
-UInt64! -
-

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

-
- -## CreateQuoteInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
-

Id of the wallet address under which the quote will be created

-
-debitAmount
-AmountInput -
-

Amount to send (fixed send)

-
-receiveAmount
-AmountInput -
-

Amount to receive (fixed receive)

-
-receiver
-String! -
-

Wallet address URL of the receiver

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateReceiverInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressUrl
-String! -
-

Receiving wallet address URL

-
-expiresAt
-String -
-

Expiration date-time

-
-incomingAmount
-AmountInput -
-

Maximum amount to be received

-
-metadata
-JSONObject -
-

Additional metadata associated with the incoming payment.

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateWalletAddressInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-assetId
-String! -
-

Asset of the wallet address

-
-url
-String! -
-

Wallet Address URL

-
-publicName
-String -
-

Public name associated with the wallet address

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-additionalProperties
-[AdditionalPropertyInput!] -
-

Additional properties associated with the [walletAddress].

-
- -## CreateWalletAddressKeyInput - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
- -
-jwk
-JwkInput! -
-

Public key

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateWalletAddressWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
-

The id of the Open Payments wallet address to create the withdrawal for.

-
-id
-String! -
-

The id of the withdrawal.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-timeoutSeconds
-UInt64! -
-

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

-
- -## DeleteAssetInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Asset id

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## DeletePeerInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-id
-ID! -
- -
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## DepositAssetLiquidityInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-assetId
-String! -
-

The id of the asset to deposit liquidity.

-
-amount
-UInt64! -
-

Amount of liquidity to deposit.

-
-id
-String! -
-

The id of the transfer.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## DepositEventLiquidityInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-eventId
-String! -
-

The id of the event to deposit into.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## DepositOutgoingPaymentLiquidityInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-outgoingPaymentId
-String! -
-

The id of the outgoing payment to deposit into.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## DepositPeerLiquidityInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-peerId
-String! -
-

The id of the peer to deposit liquidity.

-
-amount
-UInt64! -
-

Amount of liquidity to deposit.

-
-id
-String! -
-

The id of the transfer.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## FeeDetails - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-fixed
-UInt64! -
-

A flat fee

-
-basisPoints
-Int! -
-

Basis points fee. Should be between 0 and 10000 (inclusive). 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100%

-
- -## FilterString - - - -

Arguments

- - - - - - - - - -
NameDescription
-in
-[String!]! -
- -
- -## HttpIncomingInput - - - -

Arguments

- - - - - - - - - -
NameDescription
-authTokens
-[String!]! -
-

Array of auth tokens accepted by this Rafiki instance

-
- -## HttpInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-incoming
-HttpIncomingInput -
-

Incoming connection details

-
-outgoing
-HttpOutgoingInput! -
-

Outgoing connection details

-
- -## HttpOutgoingInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-authToken
-String! -
-

Auth token to present at the peering Rafiki instance

-
-endpoint
-String! -
-

Peer's connection endpoint

-
- -## JwkInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-kid
-String! -
-

Key id

-
-x
-String! -
-

Base64 url-encoded public key.

-
-alg
-Alg! -
-

Cryptographic algorithm family used with the key. The only allowed value is EdDSA.

-
-kty
-Kty! -
-

Key type. The only allowed value is OKP.

-
-crv
-Crv! -
-

Curve that the key pair is derived from. The only allowed value is Ed25519.

-
- -## PaymentFilter - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-type
-FilterString -
- -
-walletAddressId
-FilterString -
- -
- -## PostLiquidityWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-withdrawalId
-String! -
-

The id of the liquidity withdrawal to post.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## RevokeWalletAddressKeyInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-id
-String! -
-

Internal id of key

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## SetFeeInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-assetId
-ID! -
-

Asset id to add the fee to

-
-type
-FeeType! -
-

Type of fee (sending or receiving)

-
-fee
-FeeDetails! -
-

Fee values

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## TriggerWalletAddressEventsInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-limit
-Int! -
-

Maximum number of events being triggered (n).

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## UpdateAssetInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-String! -
-

Asset id

-
-withdrawalThreshold
-UInt64 -
-

New minimum amount of liquidity that can be withdrawn from the asset

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if liquidity falls below this new value

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## UpdatePeerInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-String! -
-

Peer id

-
-maxPacketAmount
-UInt64 -
-

New maximum packet amount that the peer accepts

-
-http
-HttpInput -
-

New peering connection details

-
-staticIlpAddress
-String -
-

Peer's new ILP address

-
-name
-String -
-

Peer's new public name

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this new value

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## UpdateWalletAddressInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

ID of wallet address to update

-
-publicName
-String -
-

New public name for wallet address

-
-status
-WalletAddressStatus -
-

New status to set the wallet address to

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-additionalProperties
-[AdditionalPropertyInput!] -
-

List additional properties associated with this wallet address.

-
- -## VoidLiquidityWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-withdrawalId
-String! -
-

The id of the liquidity withdrawal to void.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## WebhookEventFilter - - - -

Arguments

- - - - - - - - - -
NameDescription
-type
-FilterString -
- -
- -## WithdrawEventLiquidityInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-eventId
-String! -
-

The id of the event to withdraw from.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md b/packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md deleted file mode 100644 index 4ae1806c37..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/backend/interfaces.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: Interfaces ---- - - - -## BasePayment - - - -

Implemented by

- -- [IncomingPayment](/apis/graphql/backend/objects#incomingpayment) -- [OutgoingPayment](/apis/graphql/backend/objects#outgoingpayment) -- [Payment](/apis/graphql/backend/objects#payment) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
- -
-walletAddressId
-ID! -
- -
-metadata
-JSONObject -
- -
-createdAt
-String! -
- -
-client
-String -
- -
- -## Model - - - -

Implemented by

- -- [Asset](/apis/graphql/backend/objects#asset) -- [Peer](/apis/graphql/backend/objects#peer) -- [WalletAddress](/apis/graphql/backend/objects#walletaddress) -- [IncomingPayment](/apis/graphql/backend/objects#incomingpayment) -- [OutgoingPayment](/apis/graphql/backend/objects#outgoingpayment) -- [Payment](/apis/graphql/backend/objects#payment) -- [AccountingTransfer](/apis/graphql/backend/objects#accountingtransfer) -- [WalletAddressKey](/apis/graphql/backend/objects#walletaddresskey) -- [WebhookEvent](/apis/graphql/backend/objects#webhookevent) -- [Fee](/apis/graphql/backend/objects#fee) - -

Fields

- - - - - - - - - - - - - -
NameDescription
-id
-ID! -
- -
-createdAt
-String! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/mutations.md b/packages/documentation/src/content/docs/apis/graphql/backend/mutations.md deleted file mode 100644 index e0490a39a6..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/backend/mutations.md +++ /dev/null @@ -1,723 +0,0 @@ ---- -title: Mutations ---- - - - -## cancelOutgoingPayment - -**Type:** [OutgoingPaymentResponse!](/apis/graphql/backend/objects#outgoingpaymentresponse) - -Cancel Outgoing Payment - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CancelOutgoingPaymentInput! -
- -
- -## createAsset - -**Type:** [AssetMutationResponse!](/apis/graphql/backend/objects#assetmutationresponse) - -Create an asset - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateAssetInput! -
- -
- -## createAssetLiquidityWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) - -Withdraw asset liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateAssetLiquidityWithdrawalInput! -
- -
- -## createIncomingPayment - -**Type:** [IncomingPaymentResponse!](/apis/graphql/backend/objects#incomingpaymentresponse) - -Create an internal Open Payments Incoming Payment. The receiver has a wallet address on this Rafiki instance. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateIncomingPaymentInput! -
- -
- -## createIncomingPaymentWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) - -Withdraw incoming payment liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateIncomingPaymentWithdrawalInput! -
- -
- -## createOrUpdatePeerByUrl - -**Type:** [CreateOrUpdatePeerByUrlMutationResponse!](/apis/graphql/backend/objects#createorupdatepeerbyurlmutationresponse) - -Create a peer using a URL - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateOrUpdatePeerByUrlInput! -
- -
- -## createOutgoingPayment - -**Type:** [OutgoingPaymentResponse!](/apis/graphql/backend/objects#outgoingpaymentresponse) - -Create an Open Payments Outgoing Payment - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateOutgoingPaymentInput! -
- -
- -## createOutgoingPaymentFromIncomingPayment - -**Type:** [OutgoingPaymentResponse!](/apis/graphql/backend/objects#outgoingpaymentresponse) - -Create an Open Payments Outgoing Payment from an incoming payment - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateOutgoingPaymentFromIncomingPaymentInput! -
- -
- -## createOutgoingPaymentWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) - -Withdraw outgoing payment liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateOutgoingPaymentWithdrawalInput! -
- -
- -## createPeer - -**Type:** [CreatePeerMutationResponse!](/apis/graphql/backend/objects#createpeermutationresponse) - -Create a peer - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreatePeerInput! -
- -
- -## createPeerLiquidityWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) - -Withdraw peer liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreatePeerLiquidityWithdrawalInput! -
- -
- -## createQuote - -**Type:** [QuoteResponse!](/apis/graphql/backend/objects#quoteresponse) - -Create an Open Payments Quote - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateQuoteInput! -
- -
- -## createReceiver - -**Type:** [CreateReceiverResponse!](/apis/graphql/backend/objects#createreceiverresponse) - -Create an internal or external Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateReceiverInput! -
- -
- -## createWalletAddress - -**Type:** [CreateWalletAddressMutationResponse!](/apis/graphql/backend/objects#createwalletaddressmutationresponse) - -Create a wallet address - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateWalletAddressInput! -
- -
- -## createWalletAddressKey - -**Type:** [CreateWalletAddressKeyMutationResponse](/apis/graphql/backend/objects#createwalletaddresskeymutationresponse) - -Add a public key to a wallet address that is used to verify Open Payments requests. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateWalletAddressKeyInput! -
- -
- -## createWalletAddressWithdrawal - -**Type:** [WalletAddressWithdrawalMutationResponse](/apis/graphql/backend/objects#walletaddresswithdrawalmutationresponse) - -Withdraw liquidity from a wallet address received via Web Monetization. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateWalletAddressWithdrawalInput! -
- -
- -## deleteAsset - -**Type:** [DeleteAssetMutationResponse!](/apis/graphql/backend/objects#deleteassetmutationresponse) - -Delete an asset - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DeleteAssetInput! -
- -
- -## deletePeer - -**Type:** [DeletePeerMutationResponse!](/apis/graphql/backend/objects#deletepeermutationresponse) - -Delete a peer - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DeletePeerInput! -
- -
- -## depositAssetLiquidity - -**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) - -Deposit asset liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DepositAssetLiquidityInput! -
- -
- -## depositEventLiquidity - -**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) - -> Deprecated: Use `depositOutgoingPaymentLiquidity` - -Deposit webhook event liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DepositEventLiquidityInput! -
- -
- -## depositOutgoingPaymentLiquidity - -**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) - -Deposit outgoing payment liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DepositOutgoingPaymentLiquidityInput! -
- -
- -## depositPeerLiquidity - -**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) - -Deposit peer liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DepositPeerLiquidityInput! -
- -
- -## postLiquidityWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) - -Post liquidity withdrawal. Withdrawals are two-phase commits and are committed via this mutation. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-PostLiquidityWithdrawalInput! -
- -
- -## revokeWalletAddressKey - -**Type:** [RevokeWalletAddressKeyMutationResponse](/apis/graphql/backend/objects#revokewalletaddresskeymutationresponse) - -Revoke a public key associated with a wallet address. Open Payment requests using this key for request signatures will be denied going forward. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-RevokeWalletAddressKeyInput! -
- -
- -## setFee - -**Type:** [SetFeeResponse!](/apis/graphql/backend/objects#setfeeresponse) - -Set the fee on an asset - -

Arguments

- - - - - - - - - -
NameDescription
-input
-SetFeeInput! -
- -
- -## triggerWalletAddressEvents - -**Type:** [TriggerWalletAddressEventsMutationResponse!](/apis/graphql/backend/objects#triggerwalletaddresseventsmutationresponse) - -If automatic withdrawal of funds received via Web Monetization by the wallet address are disabled, this mutation can be used to trigger up to n withdrawal events. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-TriggerWalletAddressEventsInput! -
- -
- -## updateAsset - -**Type:** [AssetMutationResponse!](/apis/graphql/backend/objects#assetmutationresponse) - -Update an asset - -

Arguments

- - - - - - - - - -
NameDescription
-input
-UpdateAssetInput! -
- -
- -## updatePeer - -**Type:** [UpdatePeerMutationResponse!](/apis/graphql/backend/objects#updatepeermutationresponse) - -Update a peer - -

Arguments

- - - - - - - - - -
NameDescription
-input
-UpdatePeerInput! -
- -
- -## updateWalletAddress - -**Type:** [UpdateWalletAddressMutationResponse!](/apis/graphql/backend/objects#updatewalletaddressmutationresponse) - -Update a wallet address - -

Arguments

- - - - - - - - - -
NameDescription
-input
-UpdateWalletAddressInput! -
- -
- -## voidLiquidityWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) - -Void liquidity withdrawal. Withdrawals are two-phase commits and are rolled back via this mutation. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-VoidLiquidityWithdrawalInput! -
- -
- -## withdrawEventLiquidity - -**Type:** [LiquidityMutationResponse](/apis/graphql/backend/objects#liquiditymutationresponse) - -> Deprecated: Use `createOutgoingPaymentWithdrawal, createIncomingPaymentWithdrawal, or createWalletAddressWithdrawal` - -Withdraw webhook event liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-WithdrawEventLiquidityInput! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/objects.md b/packages/documentation/src/content/docs/apis/graphql/backend/objects.md deleted file mode 100644 index da2cc6867f..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/backend/objects.md +++ /dev/null @@ -1,2698 +0,0 @@ ---- -title: Objects ---- - - - -## AccountingTransfer - - - -

Implements

- -- [Model](/apis/graphql/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Payment id

-
-debitAccountId
-ID! -
-

Debit account id

-
-creditAccountId
-ID! -
-

Credit account id

-
-amount
-UInt64! -
-

Amount sent (fixed send)

-
-transferType
-TransferType! -
-

Type of accounting transfer

-
-ledger
-UInt8! -
-

Identifier that partitions the sets of accounts that can transact with each other.

-
-createdAt
-String! -
-

Date-time of creation

-
- -## AccountingTransferConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-debits
-[AccountingTransfer!]! -
- -
-credits
-[AccountingTransfer!]! -
- -
- -## AdditionalProperty - - - -

Fields

- - - - - - - - - - - - - - - - - -
NameDescription
-key
-String! -
- -
-value
-String! -
- -
-visibleInOpenPayments
-Boolean! -
- -
- -## Amount - - - -

Fields

- - - - - - - - - - - - - - - - - -
NameDescription
-value
-UInt64! -
- -
-assetCode
-String! -
-

ISO 4217 currency code, e.g. USD

-
-assetScale
-UInt8! -
-

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

-
- -## Asset - - - -

Implements

- -- [Model](/apis/graphql/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Asset id

-
-code
-String! -
-

ISO 4217 currency code, e.g. USD

-
-scale
-UInt8! -
-

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

-
-liquidity
-UInt64 -
-

Available liquidity

-
-withdrawalThreshold
-UInt64 -
-

Minimum amount of liquidity that can be withdrawn from the asset

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if liquidity falls below this value

-
-receivingFee
-Fee -
-

The receiving fee structure for the asset

-
-sendingFee
-Fee -
-

The sending fee structure for the asset

-
-fees
-FeesConnection -
-

Fetch a page of asset fees

- -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -
-createdAt
-String! -
-

Date-time of creation

-
- -## AssetEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Asset! -
- -
-cursor
-String! -
- -
- -## AssetMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-asset
-Asset -
- -
- -## AssetsConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[AssetEdge!]! -
- -
- -## CreateOrUpdatePeerByUrlMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-peer
-Peer -
- -
- -## CreatePeerMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-peer
-Peer -
- -
- -## CreateReceiverResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-receiver
-Receiver -
- -
- -## CreateWalletAddressKeyMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-walletAddressKey
-WalletAddressKey -
- -
- -## CreateWalletAddressMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-walletAddress
-WalletAddress -
- -
- -## DeleteAssetMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-asset
-Asset -
- -
- -## DeletePeerMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-success
-Boolean! -
- -
- -## Fee - - - -

Implements

- -- [Model](/apis/graphql/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Fee id

-
-assetId
-ID! -
-

Asset id associated with the fee

-
-type
-FeeType! -
-

Type of fee (sending or receiving)

-
-fixed
-UInt64! -
-

Fixed fee

-
-basisPoints
-Int! -
-

Basis points fee. 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100%

-
-createdAt
-String! -
-

Date-time of creation

-
- -## FeeEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Fee! -
- -
-cursor
-String! -
- -
- -## FeesConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[FeeEdge!]! -
- -
- -## Http - - - -

Fields

- - - - - - - - - -
NameDescription
-outgoing
-HttpOutgoing! -
-

Outgoing connection details

-
- -## HttpOutgoing - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-authToken
-String! -
-

Auth token to present at the peering Rafiki instance

-
-endpoint
-String! -
-

Peer's connection endpoint

-
- -## IncomingPayment - - - -

Implements

- -- [BasePayment](/apis/graphql/backend/interfaces#basepayment) -- [Model](/apis/graphql/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Incoming Payment id

-
-walletAddressId
-ID! -
-

Id of the wallet address under which this incoming payment was created.

-
-client
-String -
-

Information about the wallet address of the Open Payments client that created the incoming payment.

-
-liquidity
-UInt64 -
-

Available liquidity

-
-state
-IncomingPaymentState! -
-

Incoming payment state

-
-expiresAt
-String! -
-

Date-time of expiry. After this time, the incoming payment will not accept further payments made to it.

-
-incomingAmount
-Amount -
-

The maximum amount that should be paid into the wallet address under this incoming payment.

-
-receivedAmount
-Amount! -
-

The total amount that has been paid into the wallet address under this incoming payment.

-
-metadata
-JSONObject -
-

Additional metadata associated with the incoming payment.

-
-createdAt
-String! -
-

Date-time of creation

-
- -## IncomingPaymentConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[IncomingPaymentEdge!]! -
- -
- -## IncomingPaymentEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-IncomingPayment! -
- -
-cursor
-String! -
- -
- -## IncomingPaymentResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-payment
-IncomingPayment -
- -
- -## Jwk - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-kid
-String! -
-

Key id

-
-x
-String! -
-

Base64 url-encoded public key.

-
-alg
-Alg! -
-

Cryptographic algorithm family used with the key. The only allowed value is EdDSA.

-
-kty
-Kty! -
-

Key type. The only allowed value is OKP.

-
-crv
-Crv! -
-

Curve that the key pair is derived from. The only allowed value is Ed25519.

-
- -## LiquidityMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-success
-Boolean! -
- -
- -## OutgoingPayment - - - -

Implements

- -- [BasePayment](/apis/graphql/backend/interfaces#basepayment) -- [Model](/apis/graphql/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Outgoing payment id

-
-walletAddressId
-ID! -
-

Id of the wallet address under which this outgoing payment was created

-
-client
-String -
-

Information about the wallet address of the Open Payments client that created the outgoing payment.

-
-liquidity
-UInt64 -
-

Available liquidity

-
-state
-OutgoingPaymentState! -
-

Outgoing payment state

-
-error
-String -
- -
-stateAttempts
-Int! -
- -
-debitAmount
-Amount! -
-

Amount to send (fixed send)

-
-receiveAmount
-Amount! -
-

Amount to receive (fixed receive)

-
-receiver
-String! -
-

Wallet address URL of the receiver

-
-metadata
-JSONObject -
-

Additional metadata associated with the outgoing payment.

-
-quote
-Quote -
-

Quote for this outgoing payment

-
-sentAmount
-Amount! -
-

Amount already sent

-
-createdAt
-String! -
-

Date-time of creation

-
-grantId
-String -
-

Id of the Grant under which this outgoing payment was created

-
- -## OutgoingPaymentConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[OutgoingPaymentEdge!]! -
- -
- -## OutgoingPaymentEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-OutgoingPayment! -
- -
-cursor
-String! -
- -
- -## OutgoingPaymentResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-payment
-OutgoingPayment -
- -
- -## PageInfo - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-endCursor
-String -
-

Paginating forwards: the cursor to continue.

-
-hasNextPage
-Boolean! -
-

Paginating forwards: Are there more pages?

-
-hasPreviousPage
-Boolean! -
-

Paginating backwards: Are there more pages?

-
-startCursor
-String -
-

Paginating backwards: the cursor to continue.

-
- -## Payment - - - -

Implements

- -- [BasePayment](/apis/graphql/backend/interfaces#basepayment) -- [Model](/apis/graphql/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Payment id

-
-type
-PaymentType! -
-

Type of payment

-
-walletAddressId
-ID! -
-

Id of the wallet address under which this payment was created

-
-client
-String -
-

Information about the wallet address of the Open Payments client that created the payment.

-
-state
-String! -
-

Either the IncomingPaymentState or OutgoingPaymentState according to type

-
-liquidity
-UInt64 -
-

Available liquidity

-
-metadata
-JSONObject -
-

Additional metadata associated with the payment.

-
-createdAt
-String! -
-

Date-time of creation

-
- -## PaymentConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[PaymentEdge!]! -
- -
- -## PaymentEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Payment! -
- -
-cursor
-String! -
- -
- -## Peer - - - -

Implements

- -- [Model](/apis/graphql/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Peer id

-
-maxPacketAmount
-UInt64 -
-

Maximum packet amount that the peer accepts

-
-http
-Http! -
-

Peering connection details

-
-asset
-Asset! -
-

Asset of peering relationship

-
-staticIlpAddress
-String! -
-

Peer's ILP address

-
-name
-String -
-

Peer's public name

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

-
-liquidity
-UInt64 -
-

Available liquidity

-
-createdAt
-String! -
-

Date-time of creation

-
- -## PeerEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Peer! -
- -
-cursor
-String! -
- -
- -## PeersConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[PeerEdge!]! -
- -
- -## Quote - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Quote id

-
-walletAddressId
-ID! -
-

Id of the wallet address under which this quote was created

-
-receiver
-String! -
-

Wallet address URL of the receiver

-
-debitAmount
-Amount! -
-

Amount to send (fixed send)

-
-receiveAmount
-Amount! -
-

Amount to receive (fixed receive)

-
-maxPacketAmount
-UInt64! -
-

Maximum value per packet allowed on the possible routes

-
-minExchangeRate
-Float! -
-

Aggregate exchange rate the payment is guaranteed to meet

-
-lowEstimatedExchangeRate
-Float! -
-

Lower bound of probed exchange rate

-
-highEstimatedExchangeRate
-Float! -
-

Upper bound of probed exchange rate

-
-createdAt
-String! -
-

Date-time of creation

-
-expiresAt
-String! -
-

Date-time of expiration

-
- -## QuoteConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[QuoteEdge!]! -
- -
- -## QuoteEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Quote! -
- -
-cursor
-String! -
- -
- -## QuoteResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-quote
-Quote -
- -
- -## Receiver - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-String! -
-

Incoming payment URL

-
-walletAddressUrl
-String! -
-

Wallet address URL under which the incoming payment was created

-
-completed
-Boolean! -
-

Describes whether the incoming payment has completed receiving funds.

-
-incomingAmount
-Amount -
-

The maximum amount that should be paid into the wallet address under this incoming payment.

-
-receivedAmount
-Amount! -
-

The total amount that has been paid into the wallet address under this incoming payment.

-
-expiresAt
-String -
-

Date-time of expiry. After this time, the incoming payment will accept further payments made to it.

-
-metadata
-JSONObject -
-

Additional metadata associated with the incoming payment.

-
-createdAt
-String! -
-

Date-time of creation

-
-updatedAt
-String! -
-

Date-time of last update

-
- -## RevokeWalletAddressKeyMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-walletAddressKey
-WalletAddressKey -
- -
- -## SetFeeResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-fee
-Fee -
- -
- -## TriggerWalletAddressEventsMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-count
-Int -
-

Number of events triggered

-
- -## UpdatePeerMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-peer
-Peer -
- -
- -## UpdateWalletAddressMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-walletAddress
-WalletAddress -
- -
- -## WalletAddress - - - -

Implements

- -- [Model](/apis/graphql/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Wallet address id

-
-asset
-Asset! -
-

Asset of the wallet address

-
-liquidity
-UInt64 -
-

Available liquidity

-
-url
-String! -
-

Wallet Address URL

-
-publicName
-String -
-

Public name associated with the wallet address

-
-incomingPayments
-IncomingPaymentConnection -
-

List of incoming payments received by this wallet address

- -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -
-quotes
-QuoteConnection -
-

List of quotes created at this wallet address

- -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -
-outgoingPayments
-OutgoingPaymentConnection -
-

List of outgoing payments sent from this wallet address

- -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -
-createdAt
-String! -
-

Date-time of creation

-
-status
-WalletAddressStatus! -
-

Status of the wallet address

-
-walletAddressKeys
-WalletAddressKeyConnection -
-

List of keys associated with this wallet address

- -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -
-additionalProperties
-[AdditionalProperty] -
-

List additional properties associated with this wallet address.

-
- -## WalletAddressEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-WalletAddress! -
- -
-cursor
-String! -
- -
- -## WalletAddressesConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[WalletAddressEdge!]! -
- -
- -## WalletAddressKey - - - -

Implements

- -- [Model](/apis/graphql/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Internal id of key

-
-walletAddressId
-ID! -
-

Id of the wallet address to which this key belongs to

-
-jwk
-Jwk! -
-

Public key

-
-revoked
-Boolean! -
-

Indicator whether the key has been revoked

-
-createdAt
-String! -
-

Date-time of creation

-
- -## WalletAddressKeyConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[WalletAddressKeyEdge!]! -
- -
- -## WalletAddressKeyEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-WalletAddressKey! -
- -
-cursor
-String! -
- -
- -## WalletAddressWithdrawal - - - -

Fields

- - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Withdrawal Id

-
-amount
-UInt64! -
-

Amount to withdraw

-
-walletAddress
-WalletAddress! -
-

Wallet address details

-
- -## WalletAddressWithdrawalMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-withdrawal
-WalletAddressWithdrawal -
- -
- -## WebhookEvent - - - -

Implements

- -- [Model](/apis/graphql/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Event id

-
-type
-String! -
-

Type of event

-
-data
-JSONObject! -
-

Stringified JSON data

-
-createdAt
-String! -
-

Date-time of creation

-
- -## WebhookEventsConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[WebhookEventsEdge!]! -
- -
- -## WebhookEventsEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-WebhookEvent! -
- -
-cursor
-String! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/queries.md b/packages/documentation/src/content/docs/apis/graphql/backend/queries.md deleted file mode 100644 index 2c96e4a8d5..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/backend/queries.md +++ /dev/null @@ -1,512 +0,0 @@ ---- -title: Queries ---- - - - -## accountingTransfers - -**Type:** [AccountingTransferConnection!](/apis/graphql/backend/objects#accountingtransferconnection) - -Fetch a page of accounting transfers - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-id
-String! -
-

Account id.

-
-limit
-Int -
-

Limit the number of results returned. If no limit is provided, the default limit of 100_000 is set for TigerBeetle.

-
- -## asset - -**Type:** [Asset](/apis/graphql/backend/objects#asset) - -Fetch an asset - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## assets - -**Type:** [AssetsConnection!](/apis/graphql/backend/objects#assetsconnection) - -Fetch a page of assets. - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -## incomingPayment - -**Type:** [IncomingPayment](/apis/graphql/backend/objects#incomingpayment) - -Fetch an Open Payments incoming payment - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## outgoingPayment - -**Type:** [OutgoingPayment](/apis/graphql/backend/objects#outgoingpayment) - -Fetch an Open Payments outgoing payment - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## payments - -**Type:** [PaymentConnection!](/apis/graphql/backend/objects#paymentconnection) - -Fetch a page of combined payments - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
-filter
-PaymentFilter -
-

Filter payment events based on specific criteria.

-
- -## peer - -**Type:** [Peer](/apis/graphql/backend/objects#peer) - -Fetch a peer - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## peers - -**Type:** [PeersConnection!](/apis/graphql/backend/objects#peersconnection) - -Fetch a page of peers. - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -## quote - -**Type:** [Quote](/apis/graphql/backend/objects#quote) - -Fetch an Open Payments quote - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## receiver - -**Type:** [Receiver](/apis/graphql/backend/objects#receiver) - -Get an local or remote Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## walletAddress - -**Type:** [WalletAddress](/apis/graphql/backend/objects#walletaddress) - -Fetch a wallet address. - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## walletAddresses - -**Type:** [WalletAddressesConnection!](/apis/graphql/backend/objects#walletaddressesconnection) - -Fetch a page of wallet addresses. - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -## webhookEvents - -**Type:** [WebhookEventsConnection!](/apis/graphql/backend/objects#webhookeventsconnection) - -Fetch a page of webhook events - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
-filter
-WebhookEventFilter -
-

Filter webhook events based on specific criteria.

-
- diff --git a/packages/documentation/src/content/docs/apis/graphql/backend/scalars.md b/packages/documentation/src/content/docs/apis/graphql/backend/scalars.md deleted file mode 100644 index 5c3b7b9369..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/backend/scalars.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Scalars ---- - - - -## Boolean - -The `Boolean` scalar type represents `true` or `false`. - -## Float - -The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). - -## ID - -The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. - -## Int - -The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. - -## JSONObject - - - -## String - -The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. - -## UInt64 - - - -## UInt8 - - - From 3c2e5eb611abe08475d3148a9cf6293bcc057587 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Wed, 21 Aug 2024 09:02:03 -0400 Subject: [PATCH 11/91] docs: upload of doc set to prep for Rafiki ww --- packages/documentation/astro.config.mjs | 14 +- .../public/img/components-interledger.png | Bin 0 -> 64123 bytes ... => components-telemetry-architecture.png} | Bin .../docs/apis/graphql/admin-api-overview.mdx | 27 ++ .../content/docs/apis/graphql/idempotency.mdx | 5 - .../content/docs/components/architecture.mdx | 24 +- .../content/docs/components/interledger.mdx | 70 +++++- .../content/docs/components/open-payments.mdx | 42 +++- .../src/content/docs/components/telemetry.mdx | 232 +++++++++++++++++- .../content/docs/integration/admin-apis.mdx | 5 - .../content/docs/resources/get-involved.mdx | 30 +++ .../{reference => resources}/glossary.mdx | 0 .../auth-service.mdx | 50 +++- .../backend-service.mdx | 70 +++++- .../frontend-service.mdx | 22 +- 15 files changed, 564 insertions(+), 27 deletions(-) create mode 100644 packages/documentation/public/img/components-interledger.png rename packages/documentation/public/img/{telemetry-architecture.png => components-telemetry-architecture.png} (100%) create mode 100644 packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx delete mode 100644 packages/documentation/src/content/docs/apis/graphql/idempotency.mdx delete mode 100644 packages/documentation/src/content/docs/integration/admin-apis.mdx create mode 100644 packages/documentation/src/content/docs/resources/get-involved.mdx rename packages/documentation/src/content/docs/{reference => resources}/glossary.mdx (100%) diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index 32edf0564e..c12cf93f91 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -147,10 +147,6 @@ export default defineConfig({ } ] }, - { - label: 'Admin APIs', - link: 'integration/admin-apis' - }, { label: 'Integrator checklist', link: 'integration/integrator-checklist' @@ -224,7 +220,7 @@ export default defineConfig({ ] }, { - label: 'Admin APIs', + label: 'APIs', collapsed: true, items: [ { @@ -232,8 +228,8 @@ export default defineConfig({ collapsed: true, items: [ { - label: 'Idempotency', - link: 'apis/graphql/idempotency' + label: 'Overview', + link: 'apis/graphql/admin-api-overview' }, { label: 'Backend Admin API', @@ -258,10 +254,10 @@ export default defineConfig({ ] }, { - label: 'Reference', + label: 'Resources', collapsed: true, autogenerate: { - directory: 'reference' + directory: 'resources' } } ] diff --git a/packages/documentation/public/img/components-interledger.png b/packages/documentation/public/img/components-interledger.png new file mode 100644 index 0000000000000000000000000000000000000000..db7194906722e470f6a4b4570a544b98b52908f6 GIT binary patch literal 64123 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%0DsF$o>B&g>rNNN5w(wLi5YR zpPdCk!St$Oul0vbWt7Vom;G-J{MGYZLQ|~JpNfra=;b)~9Bn+n={}pwwgMq_xV6iy z=C&LAD_|`SLPnt|W2#&k694h>#*A2r0CaBeyvFwFkTI_^NrR$k z9Vhu9Y0HQ%Xq?yE)o$>ky7Ah7>@+!K?S(3CM1GQwes}j%pT36uBQR+z+1=LXgsUc@ z^vP2e6>nZ*)7)^{K~d8|)B^&7a@H@EzI7(y=~)7WJ?X+jc08J+W0Zm}mQe8;;A6y0 z{Zd};_0dcF$bg{s&SBFRx>xnrlQ(@6ZefKjXdHibJ}_%26Pv*j zLHwm4j-1Oh&=bQQ(H%nwi%ekWs(^_zpKBcFTergGR0ZTq*>=`+``2SZGExNb-01p$ z{WvBJUmQP#GmG9zd}#Bu%qv4!F_pugx59PANakkzIaJmN%w4Y;K2?F`AMy9cCGc(d zm~kn}9_tersE#fc=FIdM!nJmLAZ^5~-Cr5&NhB*;)5vWXZXXA2or>r@7teQ&h=MoT>|m`tT NyaJ#0F`RxKpS9{}lX51$AYFYtW^ znE5$J&G)!(#;oS;Y$#?zNSx^j?A0O1%T1iwN23L;rxJoFcJ73bRYMdvIViB!Iz7X2jjA+?m3nccQ42uROiSh`KrnZ91u z07h&JfF~Onm)SGQbo?vls6K6-heN1`z=lOmd?`w>l?_|(d~{p$iUjotoH`Mpb3JfHTbl|KaRYc-){mvsO-R)xCD0(RtTCaZ3e=t63S#mc*`CY^nFNdvWCc%~sNwmN+Tjil1w7`#<(c%>9?mf3Gu( z)wH*NujpjW61fl?80d7Rse4*5A3ORi*2R>v0NA&uJZ0) z^1uAYaARn!Q`W0Vm>r6qbV@Eim4 z)Fg8h427?%<@GPg-qQTL{LO#7H*f6p9BTdTsY%8i1`_6*rr+Nq_4$}e9xUg$C=RXh zn?2L_IvkkgWA2^b!>BV=>678oI{#sWKVkyT(j=NW-#CW6zFCutD__uOMppP1t^IK1 zK~Q*+)HEX|jx~vL#J-7mVBq-G6MQ=*wOU8ldk@@Hd`%uCBT4to2)~>}dUaMvb>@+j z%|!`s1Z}+Kgly0Vro6OqQ=;Qe)B3x@|NKex#KYO@DTA21-Ng!z|GE#>89ft}tvxH{ zx$}qdwtYmJRjnt+np_grwg5J8pH{mv7;j`U{FhnU^WDv~z>fB->Fw60pPvVDd(tTa z=*(1o&r*1mtHNQGDeMxTz7~6RZ+w&dbIwaE6|@RC-vE22e6N;ckQsjWF##Hn;*9C{ znm^w{hhB+i)*Tk}C31;Aa4#RY_XJEJLkY9&w2-2*_(8j}LjNBmnVlZEpecOxRgqi% zpLhb{Do@Lmb3KMD^w(+o`f*Op>l!F^^3n9O)A-_R8DSzZD=d!T=-4EypnpXZ+VDH# zxS`Iqbk4v8!@Z)~RL3FZR@5tJAc@^SmP8riE~G?S!vS-Y`0+HWxji$|F^H&Cvevse zY~8}tx%cJp%P4%6 z=pLE%(Qs~8*%OvHNil#PgQ#NFvp;tfNpQd!HV)8~ejhf??#yAuH|2T}xFR+Va=r(rNFhp8?Z zEG&?UFfJ=T$BkH|MWo}E#fQX`_r466Ig^0h)xY@Bt2m zeI*uzf8UiPrc6jgk@3a6rWdkLUz66^lFH8c+2$I=aNIL|9G#n((%RWg2#+g z4^h0ij$@D&ng7SK(3-mc6rFU+d!4_Q^Mi4VhT;ON_dfgkU&1L7B*QJ|gAOx|j-6pd zaz%FKZ@=RXO&anZOkmM1>lj&Vdc(p-5#j?pJQHaTXMgx z<}%b+80l2J_R=sjB~fJH$-3}axgCO8=3xC-Lk%wJbk#J$CZzixn=Yn=V69mhKN&v2 zn>^6_B)Fow!o)r4fQW-x&nhtd75b?ev2`T3(KQa|Yp=*L3}i@n2@f0^4se`*StH^$=;J74lV|C3Ys+=>Yto~sSllK?J#%@Jm|>Zq&Bat+z2zu)gO z;z@v3U7Xu=exUfk#&~Bq$+b^o?u)3vWXYTT*ap)s7KJm?zJDSdM`IeQUcyd}y;I^Y zt(ml0QH$;SeXN?DVL26KyYE{jZDo`)f+!~ElI6~`S*V4mg?-w!*_#$ZXs*s@T!xRq z94_Rei>_-BUSOgNKVGWH`lB^%-$c>GW=vA?f}Lu3x+?ciQ0!kM@#m1f@$l&qmbVXj9>Ec;WS6I}qBoE!Fbxa`tb<#2nIpJbc?NGiy

R9zyHLtf?#msFv}^Zz_?vS;sh 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.org, GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL APIs are organized in terms of types and fields, not endpoints. + +## Backend Admin API + +The Backend Admin API provides you with comprehensive capabilities to manage your Rafiki instance. Core functionality includes managing peering relationships, assets, wallet addresses and their public keys, as well as liquidity management through deposits and withdrawals. Another important aspect of the Backend Admin API is to manage Open Payments resources like payments and quotes. + +This API is complemented by the Admin UI, a frontend interface for Rafiki management that directly interacts with the Backend Admin API. Check out the Rafiki Admin Application User Guide for more information. + +## Auth Admin API + +The Auth Admin API allows you to get information about a grant, such as its status, state, related payment details, and the wallet address of the grantee’s account. The API also allows you to revoke grants. + +## Idempotency + +Wikipedia describes idempotence as being the property of “certain operations in…computer science whereby [the operations] can be applied multiple times without changing the result beyond the initial application.” “An operation can be repeated or retried as often as necessary without causing unintended effects. With non-idempotent operations, the algorithm may have to keep track of whether the operation was already performed.” + +Several mutations in the Admin APIs utilize an idempotency key to allow for safely retrying requests without performing operations multiple times. The key should be unique, typically a V4 UUID. + +For the Admin APIs, whenever a mutation with an `idempotencyKey` is called, the request payload and the request response are saved under that key. Any subsequent requests made with the same idempotency key will return the original response and status of the request, regardless of whether the request was successful. Keys are cached for a default of 24 hours. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS backend` environment flag. + +Additionally, in the chance that a request is made while still concurrently processing the first request under the same `idempotencyKey`, the APIs will return an error. This provides further safeguards from potential errors in the system. The timing to prevent processing concurrent requests is `2` seconds by default. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` environment flag. diff --git a/packages/documentation/src/content/docs/apis/graphql/idempotency.mdx b/packages/documentation/src/content/docs/apis/graphql/idempotency.mdx deleted file mode 100644 index e0bfea1e9f..0000000000 --- a/packages/documentation/src/content/docs/apis/graphql/idempotency.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Idempotency ---- - -## Placeholder diff --git a/packages/documentation/src/content/docs/components/architecture.mdx b/packages/documentation/src/content/docs/components/architecture.mdx index 3714968d42..45056ae338 100644 --- a/packages/documentation/src/content/docs/components/architecture.mdx +++ b/packages/documentation/src/content/docs/components/architecture.mdx @@ -2,4 +2,26 @@ title: Architecture --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +

+ Needs updated diagram(s) +

+ +Rafiki is a collection of three services that run together. Each one can be scaled horizontally. + +- [backend](/services-and-aux-packages/backend-service) - The main service, responsible for handling business logic and external communication +- [auth](/services-and-aux-packages/auth-service) - A reference implementation of an Open Payments authorization server, used for grant authorization and authentication +- [frontend](/services-and-aux-packages/frontend-service) - An optional internal admin UI for you to manage your Rafiki instance + +These services rely on four databases. + +- A Postgres database used by the `backend` service for Open Payments resources +- A separate Postgres database used by the `auth` service for storing auth-related resources (grants, access tokens, and interactions) +- + TigerBeetle + + , used by the `backend` service for accounting balances at the ILP layer +- Redis, used by the `backend` service as a cache to share STREAM connection details across processes and by the `auth` service to store session data + +An additional package for [token introspection](/services-and-aux-packages/token-introspection) is also included with Rafiki. This is an internal package that requires no action on your part if you’re using Rafiki’s `auth` service. diff --git a/packages/documentation/src/content/docs/components/interledger.mdx b/packages/documentation/src/content/docs/components/interledger.mdx index ce2d122dae..ad7cca531c 100644 --- a/packages/documentation/src/content/docs/components/interledger.mdx +++ b/packages/documentation/src/content/docs/components/interledger.mdx @@ -2,4 +2,72 @@ title: Interledger --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +Building and maintaining your own connector to participate on the Interledger network can be a time consuming and complex undertaking. As a reference implementation of the Interledger stack, Rafiki gives you all the tools you need to quickly and easily join the network and enable Interledger functionality on your users’ accounts. + +At the core of Interledger is the Interledger Protocol (ILP). It’s a request/response protocol where requests and responses are ILP packets. Typically, a single aggregate payment from sender to receiver is split into multiple ILP packets. + +## Peers + +Interledger itself is a network of computers that enables sending payments across payment networks. Each computer on the network is called a node. + +For two nodes on the Interledger network to exchange ILP packets with one another, the two nodes must be peers. There are a number of [requirements](/integration/deploy-to-prod/running-your-instance/adding-peer) that both you and your potential peer must meet in order to form a peering relationship. + +Since the purpose of peering is to facilitate payments, which often involves extending lines of credit, your peer should be someone you trust. We strongly recommend you and your potential peer define your expectations and outline your agreements in a legally-binding document before you add them as a peer in Rafiki. + +## Connectors + +Each node on the Interledger network can take on the role of sender, connector, or receiver, depending on the payment. + +- Sender - Originates the payment. +- Connector - An intermediary between a sender and receiver that forwards ILP packets. Connectors can facilitate payments to or from anyone they’re peered with. +- Receiver - The final recipient of the payment. + +Rafiki’s [backend service](/services-and-aux-packages/backend-service) includes an Interledger connector for sending and receiving ILP packets via ILPoverHTTP. You can learn more about a connector’s role in the ILP packet lifecycle on the Interledger developer’s site. + +If the sender and receiver nodes are peers, then the payment flow is straightforward and no intermediary connector nodes are needed. However, if the sender and receiver aren’t peers, then the payment must be routed through one or more connectors. + +In the image below, the sender node (A) and the receiver node (C) share a common peer (B). In payments from the sender to the receiver, node B performs the role of connector to facilitate payments between the two. + +Peering relationship showing a sender, connector, and receiver + +In reality, there can be multiple connectors between a sender node and a receiver node. As more nodes that support different assets peer with one another, the easier it becomes for payments to traverse the Interledger network. + +## Payment pointers + +Rafiki assigns each of your customers’ accounts with a payment pointer. Payment pointers are a type of wallet address for accounts within the Interledger network. They’re similar to email addresses in that they’re used to determine which account to send a payment from and which account to deliver the payment to. + +Every payment pointer serves as a Simple Payment Setup Protocol (SPSP) endpoint and must resolve to an HTTPS URL. Payment pointers can be written out using the `$` shorthand (e.g., `$wallet.example.com/alice`) or as a URL (e.g., `https://wallet.example.com/alice`). + +## Simple Payment Setup Protocol (SPSP) + + + SPSP + is an application layer protocol that uses HTTPS to exchange payment information. +Every payment pointer issued by Rafiki serves as an SPSP endpoint by default (`ENABLE_SPSP_PAYMENT_POINTERS`). + +When a `GET` request is made to a payment pointer, the response contains the ILP address of the destination account and a shared secret. These details are needed to set up a STREAM connection between two counterparties to facilitate direct payments over Interledger. + +## STREAM Protocol + + + STREAM + is the transport layer protocol in the Interledger Protocol stack. After +SPSP communicates the ILP address of the destination account and the shared secret, +the STREAM protocol uses these details to set up a STREAM connection between the +counterparties.{' '} + +Rafiki’s `backend` service includes an Interledger connector for sending and receiving STREAM packets. STREAM packets are encoded, encrypted, and sent as the `data` field in ILP packets. The protocol uses the shared secret to authenticate and encrypt packets, and to generate conditions and fulfillments. + +A critical function of STREAM is to determine the path exchange rate and handle any changes in the rate. Rafiki’s exchange rates service allows you to provide exchange rate information. + +### STREAM receipts + +In a STREAM connection, a receipt can be generated by the party receiving funds for every fulfilled ILP packet. Each receipt contains a progressively higher amount, representing the total amount received over the STREAM connection. + +Rafiki’s Interledger connector keeps track of the total amount received for a STREAM connection in Redis in order to support STREAM receipts. diff --git a/packages/documentation/src/content/docs/components/open-payments.mdx b/packages/documentation/src/content/docs/components/open-payments.mdx index 52f2eab42c..fa050a1b54 100644 --- a/packages/documentation/src/content/docs/components/open-payments.mdx +++ b/packages/documentation/src/content/docs/components/open-payments.mdx @@ -1,5 +1,45 @@ --- title: Open Payments +tableOfContents: + maxHeadingLevel: 2 --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +Open Payments is the standard +that Rafiki follows to enable third-party clients to securely retrieve account information +and initiate payments from your customers’ accounts with their consent. The Open +Payments standard describes a uniform way to create and manage grants and resources +for + incoming payments, quotes, and outgoing payments + +.{' '} + +### Example use case - retrieve account information + +Some of your customers use a third-party application that allows them to create budgets and monitor their spending. The application can call the Open Payments APIs, enabling it to communicate with any account servicing entity that implements the Open Payments standard. When your customers give the app permission to retrieve their transaction history, the app communicates with your Rafiki instance via the Open Payments APIs to obtain grants from your authorization server and transaction history from your resource server. + +### Further reading + +We strongly encourage you to familiarize yourself with the Open Payments standard. Extensive documentation can be found on the Open Payments website. We recommend you start by reviewing all the pages within the _Intro to Open Payments_ section. Here are a few links to get you started. + +- + Open Payments concepts + +- + Client keys + +- + HTTP message signatures + +- + Grant negotiation and authorization + + +## Rafiki's `backend` service + +Rafiki’s [`backend`](/services-and-aux-packages/backend-service) service is the main service for handling business logic and external communication. The service is responsible for, among other things, exposing the endpoints of the Open Payments APIs for clients to perform account management tasks. Every request and response is validated against the Open Payments specification. + +## Rafiki's auth service + +Rafiki’s [`auth`](/services-and-aux-packages/auth-service) service is a reference implementation of an opinionated Open Payments authorization server. The authorization server is responsible for delegating authorization (via grants) to clients to use the Open Payments APIs, resolving clients’ public keys to authenticate and authorize incoming requests, and creating payments and quotes on the backend. Open Payments leverages the Grant Negotiation and Authorization Protocol (GNAP) for delegating authorization. You can learn more about the protocol by reviewing its specification. diff --git a/packages/documentation/src/content/docs/components/telemetry.mdx b/packages/documentation/src/content/docs/components/telemetry.mdx index 9fb6e6ce8f..2f6e54a71a 100644 --- a/packages/documentation/src/content/docs/components/telemetry.mdx +++ b/packages/documentation/src/content/docs/components/telemetry.mdx @@ -2,4 +2,234 @@ title: Telemetry --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +## Overview + +The objective of the telemetry feature is to gather metrics and establish an infrastructure for visualizing valuable network insights. Some of the metrics that we at the Interledger Foundation collect include: + +- The total amount of money transferred via packet data within a specified time frame (daily, weekly, monthly) +- The number of transactions from outgoing payments that have been at least partially successful +- The average amount of money held within the network per transaction + +Our goals are to: + +- Track the growth of the network in terms of transaction sizes +- Track the number of transactions processed +- Enable you to gain your own insights + +### Privacy and optionality + +Privacy is a paramount concern for the Interleger Foundation. Rafiki’s telemetry feature is designed to provide valuable network insights without violating privacy or aiding malicious ASEs. Review the [Privacy](#privacy) section below for more information. + +The telemetry functionality is currently enabled by default on test (non-livenet) environments, i.e. any environment that is not dealing with real money. When active, the functionality transmits metrics to the testnet collector. In the future, operating in a production livenet environment (with real money) will allow you to opt-in to sharing your metrics with a livenet collector. Regardless of environment, you can also opt-out of telemetry completely. + +### Architecture + +![Architecture diagram for Rafiki telemetry](/img/components-telemetry-architecture.png) + +### OpenTelemetry (OTEL) + +The Interledger Foundation has adopted OpenTelemetry (OTEL) to ensure compliance with a standardized framework that is compatible with a variety of tool suites. OTEL allows you to use your preferred tools for data analysis, while Rafiki is instrumented and observable through a standardized metrics format. + +### Telemetry Elastic Container Service (ECS) cluster + +The Telemetry Replica service is hosted on AWS ECS Fargate and is configured for availability and load balancing of custom ADOT (AWS Distro for OpenTelemetry) Collector ECS tasks. + +When you opt for telemetry, metrics are sent to our Telemetry service. To enable you to build your own telemetry solutions, instrumented Rafiki can send data to multiple endpoints. This allows for the integration of a local OTEL Collector container that can support custom requirements. Metrics communication is facilitated through gRPC. + +### OTEL SDK - Rafiki instrumentation + +The OTEL SDK is integrated into Rafiki to create, collect, and export metrics. The SDK integrates seamlessly with the OTEL Collector. + +### Prometheus - AMP + +The Interledger Foundation uses Amazon Managed Service for Prometheus (AMP) to collect data from the telemetry cluster. + +:::note +AMP offers limited configuration options and cannot crawl data outside of AWS. This limitation led us to adopt a push model, using prometheusRemoteWrite, instead of a pull model. For future development, we may consider hosting our own Prometheus. +::: + +### Grafana - Grafana Cloud + +Grafana Cloud is used for data visualization dashboards and offers multiple tools that extend Prometheus Promql. + +:::note +The Interledger Foundation initially used Amazon-hosted Grafana which did not meet our needs for embedding dashboards. Grafana Cloud offers a feature called public dashboards which allows us to share dashboards. However, embedding may still pose a challenge. +::: + +### Exchange rates + +For telemetry purposes, all amounts collected by instrumented Rafiki should be converted to a base currency. + +:::caution[Privacy reasoning] +If only two ASEs are peered over a non-USD currency and we collect data in that currency, it would be easy to determine the volumes moved between those two ASEs. To maintain privacy, we convert all amounts to a base currency. +::: + +If an ASE does not provide the necessary exchange rate for a transaction, the telemetry solution still converts the amount to the base currency using external exchange rates. A Lambda function on AWS retrieves and stores the external exchange rates. The function is triggered by a daily `CloudWatch` event and stores the rates in a public S3 bucket. The S3 bucket does not have versioning, and the data is overwritten daily to further ensure privacy. + +### Instrumentation + +Rafiki has the following counter metrics. All data points (counter increases) are exported to collection endpoints at a configurable interval. The default interval is 15 seconds. + +| Metric | Type | Description | Behavior | +| ------------------------- | --------- | ------------------------------- | ------------------------------------------------------------------------------ | +| `transactions_total` | Counter | Count of funded transactions | Increases by 1 for each successfully sent transaction | +| `transactions_amount` | Amount | Amount sent through network | Increases by the amount sent in each ILP packet | +| `transaction_fee_amounts` | Counter | Fee amount sent through network | Increases by the amount sent minus the amount received for an outgoing payment | +| `ilp_pay_time_ms` | Histogram | Time to complete an ILP payment | Records the time taken to make an ILP payment | + +The current implementation only collects metrics on the SENDING side of a transaction. Metrics for external Open Payments transactions RECEIVED by a Rafiki instance in the network are not collected. + +## Privacy + +Rafiki telemetry is designed with a strong emphasis on privacy. The system anonymizes user data and refrains from collecting identifiable information. Since transactions can originate from any user to a Rafiki instance, the privacy measures are implemented directly at the source (each Rafiki instance). This means that at the individual level, the data is already anonymous as single Rafiki instances service transactions for multiple users. + +### Differential privacy and local differential privacy (LDP) + +Differential privacy is a system for publicly sharing information about a dataset by describing the patterns of groups within the dataset while withholding information about individuals in the dataset. Local differential privacy (LDP) is a variant of differential privacy where noise is added to each individual’s data point before the data point is sent to the server. This ensures that the server never sees the actual data, providing a strong privacy guarantee. + +### Rounding technique and bucketing + +Rafiki’s telemetry implementation uses a rounding technique that essentially aggregates multiple transactions into the same value, making them indistinguishable. This is achieved by dividing the transaction values into buckets and rounding the values to the nearest bucket. + +The bucket size is calculated based on the raw transaction value. For lower value transactions, which are expected to occur more frequently, the bucket sizes are determined linearly for higher granularity. However, after a certain threshold, the bucket size calculation switches to a logarithmic function to ensure privacy for higher value transactions (which are less frequent but pose greater privacy concerns). + +To handle outliers, a clipping technique is implemented, capping the buckets. Any value that exceeds a given threshold is placed in a single bucket. Conversely, any value that falls below a certain minimum is also placed in a single bucket. This ensures that both high and low outliers do not disproportionately affect the overall data, providing further privacy guarantees for these transactions. + +### Laplacian distribution + +The Laplacian distribution is often used in differential privacy due to its double exponential decay property. This property ensures that a small change in the data will not significantly affect the probability distribution of the output, providing a strong privacy guarantee. + +To achieve local differential privacy (LDP), noise is selected from the Laplacian distribution and added to the rounded values. The noise is generated based on a privacy parameter, which is calculated using the sensitivity of the function. + +The sensitivity of a function in differential privacy is the maximum amount that any single observation can change the output of the function. In this case, the sensitivity is considered to be the maximum of the rounded value and the bucket size. + +The privacy parameter is computed as one-tenth of the sensitivity. This parameter controls the trade-off between privacy and utility: a smaller privacy parameter means more privacy but less utility, and a larger privacy parameter means less privacy but more utility. + +The noise, selected from the Laplacian distribution, is then generated using this privacy parameter and added to the rounded value. If the resulting value is zero, it is set to half the bucket size to ensure that the noise does not completely obscure the transaction value. + +### Currency conversion + +Another factor that obscures sensitive data is currency conversion. In cross-currency transactions, exchange rates are provided by you, as the ASE, internally. As such, the exchange rates cannot be correlated to an individual transaction. If you don’t or can’t provide the necessary rates, an external API for exchange rates is used. The obtained exchange rates are overwritten frequently in this case, with no versioning or history access. This introduces an additional layer of noise and further protects the privacy of the transactions. + +### Experimental transaction values when using the algorithm + +The following table shows the values in the algorithm when running transactions for different amounts. The raw value increases as you move down the rows of the table. All values are in scale 4. + +| Raw value | Bucket size | Rounded value | Privacy parameter | Laplace noise | Final value | +| --------- | ----------- | ------------- | ----------------- | ------------- | ----------- | +| 8300 | 10000 | 10000 | 1000 | 2037 | 12037 | +| 13200 | 15000 | 15000 | 1500 | 1397 | 16397 | +| 147700 | 160000 | 160000 | 16000 | -27128 | 132872 | +| 1426100 | 2560000 | 2560000 | 256000 | -381571 | 2178429 | +| 1788200 | 2560000 | 2560000 | 256000 | 463842 | 3023842 | +| 90422400 | 10000000 | 90000000 | 1000000 | 2210649 | 92210649 | +| 112400400 | 10000000 | 100000000 | 1000000 | 407847 | 100407847 | +| 222290500 | 10000000 | 100000000 | 1000000 | -686149 | 99313851 | + +### References + +Rafiki’s telemetry solution is a combination of techniques described in various white papers on privacy-preserving data collection. More information can be found in the following papers: + +- + Local differential privacy for human-centered computing + +- + Collecting telemetry data privately + +- + RAPPOR: Randomized aggregatable privacy-preserving ordinal response + + +## Deploy custom telemetry + +Rafiki allows you to build your own telemetry solution based on the OpenTelemetry (OTEL) standardized metrics format that Rafiki exposes. + +You must deploy your own OTEL Collector that acts as a sidecar container to Rafiki, then provide the OTEL Collector’s ingest endpoint so that Rafiki can begin sending metrics to the collector. + +### Rafiki telemetry environment variables + +| Variable name | Type | Description | Required | +| -------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `ENABLE_TELEMETRY` | Boolean | Enables the telemetry service on Rafiki. Defaults to `true`. | N | +| `LIVENET` | Boolean | Determines where to send metrics. Defaults to `false`, resulting in metrics being sent to the testnet OTEL Collector.

Set to `true` on production environments dealing with real money.

| N | +| `OPEN_TELEMETRY_COLLECTOR_URLS` | String | A CSV of URLs for OTEL Collectors (e.g., `http://otel-collector-NLB-e3172ff9d2f4bc8a.elb.eu-west-2.amazonaws.com:4317,http://happy-life-otel-collector:4317`). | N | +| `OPEN_TELEMETRY_EXPORT_INTERVAL` | Number | Indicates, in milliseconds, how often the instrumented Rafiki instance should send metrics. Defaults to `15000`. | N | +| `TELEMETRY_EXCHANGE_RATES_URL` | String |

Defines the endpoint Rafiki will query for exchange rates. Used as a fallback if/when [exchange rates](/integration/deploy-to-prod/endpoints/exchange-rates) aren’t provided.

When set, the response format of the external exchange rates API should be of type `rates`, as is expected by the rate service.

Defaults to `https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json`, which points to a public S3 that has the previously mentioned required format, updated daily.

| N | + +### Example Docker OTEL Collector image and configuration + +Below is an example of a Docker OTEL Collector image and configuration that integrates with Rafiki and sends data to a Prometheus remote write endpoint. + +The configuration can be tested in our [Local Playground](/playground/overview) by providing the environment variables in the table above to `happy-life-backend` in the `docker-compose.yml` file. + +#### Docker Compose config + +```yaml +#Serves as example for optional local collector configuration +happy-life-otel-collector: + image: otel/opentelemetry-collector-contrib:latest + command: ['--config=/etc/otel-collector-config.yaml', ''] + environment: + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID-''} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY-''} + volumes: + - ../collector/otel-collector-config.yaml:/etc/otel-collector-config.yaml + networks: + - rafiki + expose: + - 4317 + ports: + - '13132:13133' # health_check extension +``` + +#### OTEL Collector config + +Supplemental documentation can be found in OTEL’s Collector Configuration documentation. + +```yaml +# Serves as example for the configuration of a local OpenTelemetry Collector that sends metrics to an AWS Managed Prometheus Workspace +# Sigv4auth required for AWS Prometheus Remote Write access (USER with access keys needed) + +extensions: + sigv4auth: + assume_role: + arn: 'arn:aws:iam::YOUR-ROLE:role/PrometheusRemoteWrite' + sts_region: 'YOUR-REGION' + +receivers: + otlp: + protocols: + grpc: + http: + cors: + allowed*origins: + - http://* + - https://\_ + +processors: + batch: + +exporters: + logging: + verbosity: 'normal' + prometheusremotewrite: + endpoint: 'https://aps-workspaces.YOUR-REGION.amazonaws.com/workspaces/ws-YOUR-WORKSPACE-IDENTIFIER/api/v1/remote_write' + auth: + authenticator: sigv4auth + +service: + telemetry: + logs: + level: 'debug' + metrics: + level: 'detailed' + address: 0.0.0.0:8888 + extensions: [sigv4auth] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [logging, prometheusremotewrite] +``` diff --git a/packages/documentation/src/content/docs/integration/admin-apis.mdx b/packages/documentation/src/content/docs/integration/admin-apis.mdx deleted file mode 100644 index 46acef7c96..0000000000 --- a/packages/documentation/src/content/docs/integration/admin-apis.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Admin APIs ---- - -## Placeholder diff --git a/packages/documentation/src/content/docs/resources/get-involved.mdx b/packages/documentation/src/content/docs/resources/get-involved.mdx new file mode 100644 index 0000000000..4b7525b2bf --- /dev/null +++ b/packages/documentation/src/content/docs/resources/get-involved.mdx @@ -0,0 +1,30 @@ +--- +title: Get involved +--- + +import { LinkOut } from '@interledger/docs-design-system' + +## Participation + +- Begin a new discussion or contribute to existing discussions in the Rafiki GitHub repo. +- Join the `interledger.slack.com` workspace and ask any questions you have in the `#rafiki` channel. +- Try [running the system locally](/playground/overview) and ask any questions you have in the #rafiki Slack channel. + +For more details about spec contributions and development, visit `contributing.md`. + +## Coding + +- Contribute to Rafiki + coding or testing. + +## Community and hackathons + +- Join us at the Interledger Summit and participate in our annual hackathon. +- Organize your own hackathons, coding sprints, and workshops both online and offline. Run campaigns and encourage participants to develop, collaborate on, and test projects. + +## Documentation + +- Contribute to the docs by suggesting additions and improvements. +- Create tutorials and guides to help others in the community work with Rafiki. + +Review our contribution guide for details. diff --git a/packages/documentation/src/content/docs/reference/glossary.mdx b/packages/documentation/src/content/docs/resources/glossary.mdx similarity index 100% rename from packages/documentation/src/content/docs/reference/glossary.mdx rename to packages/documentation/src/content/docs/resources/glossary.mdx diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx index 18e5a69da9..9da15c3453 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx @@ -2,6 +2,52 @@ title: Auth service --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' -Junk text to test. +

+ + link to /integration/deploy-to-prod/environment-variables AUTH when + available + +

+ +Rafiki’s `auth` service provides you with a reference implementation of an Open Payments authorization server. You can use the `auth` service as an alternative to developing your own in-house service for grant authorization and authentication. + +The authorization server is responsible for: + +- Authorizing and authenticating incoming requests from clients (e.g., third-party applications) to create payments and quotes on the backend +- Managing interactions with end users, such as your account holders, to gather consent and provide notice +- Issuing access tokens to clients and communicating with the resource server to validate each client’s access rights + +## Requirements + +The following are required when using the `auth` service. + +- A Redis database for storing session data +- A Postgres database, separate from the `backend` service’s database, to store auth-related resources (grants, access tokens, and interactions) + :::note + You can use the same Postgres database instance for both the `backend` and `auth` services, but separate database schemas are required within that instance to maintain a boundary between the objects those services manage. + ::: +- Integration with an identity provider (IdP) + +## Incoming client auth requests + +When a request comes from a client with an account on your local instance of Rafiki, the `auth` service uses data stored in the `auth` service’s Postgres database. + +When a request comes from a client registered with another instance of Rafiki, the `auth` service resolves the client’s public key from the client’s source and uses the key to authenticate and authorize the client’s request. + +## Identity provider (IdP) + +An identity provider (IdP) is a system or service that manages user authentication, identity information, and consent. When you use your Google account credentials to “Sign in with Google” on an app or website, for example, Google is acting as your identity provider. + +[Integration](/integration/deploy-to-prod/endpoints/idp) with an IdP is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. + +:::note +Rafiki’s [`frontend`](/services-and-aux-packages/frontend-service) service requires an IdP for authentication and user management of your administrators. Out of the box, Rafiki uses Ory Kratos to enable your admins to access the Admin API. Kratos is for internal use and cannot be used for your customer-facing Open Payments authorization server. +::: + +For more information about interactive grants and how they work with identity providers, review the Grant negotiation and authorization page in the Open Payments docs. + +## GraphQL Auth Admin API + +The `auth` service exposes a [GraphQL Auth Admin API](/apis/graphql/admin-api-overview#auth-admin-api) to manage auth-related resources, such as Open Payments grants. diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx index 3d637a67fd..6a8fb4c076 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx @@ -2,4 +2,72 @@ title: Backend service --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +

+ + link to /integration/deploy-to-prod/environment-variables BACKEND when + available + +

+ +Rafiki’s `backend` service is the software’s main service for handling business logic and external communication. The service is responsible for: + +- Exposing the endpoints of the [Open Payments APIs](#open-payments) for public clients to perform account management tasks. This is the external communication piece. +- Exposing an [Interledger connector](#interledger-connector) to send and receive STREAM packets with peers. +- Enabling you to manage accounts and track balances. +- Exposing an internal [GraphQL Backend Admin API](#graphql-backend-admin-api) for service operators to manage accounts and application settings, like peering relationships. + +## Requirements + +The following are required when using the `backend` service. + +- A Redis database as a cache to share STREAM connection details across processes +- A Postgres database, separate from the `auth` service’s database, for Open Payments resources +- TigerBeetle or a separate Postgres database for accounting balances at the ILP layer + :::note + You can use the same database instance of Postgres for the `backend` service, `auth` service, and accounting balances (if not using TigerBeetle). However, separate database schemas are required within the Rafiki instance to maintain boundaries between the objects being managed. + ::: + +## Open Payments + +The `backend` service exposes the Open Payments APIs, which are auth-protected using an opinionated version of the Grant Negotiation and Authorization Protocol (GNAP). Review the [`auth`](/services-and-aux-packages/auth-service) service page for more details about grant authorization and authentication. + +The `backend` service allows you to manage Open Payments incoming payments, quotes, and + + + outgoing payments + +. Quotes and outgoing payments call the ILP connector, described in the next +section, to send ILP packets. Quoting sends unfulfillable probe packets, for +example to determine a transaction’s cost before executing the payment. Outgoing +payments send packets as part of executing the payment. + +:::note +The calls to the ILP connector are made by calling the `makeIlpPlugin`, which is an implementation detail of an ILP connector that Rafiki will abstract. After calling the plugin, it will be passed to the `@interledger/pay` library to facilitate sending payments over Interledger using STREAM. +::: + +## Interledger connector + +The `backend` service exposes an ILP connector to send and receive STREAM packets between peers. + +The roles of the connector include: + +- Accepting packets via ILP over HTTP and authenticating the packets against ILP account credentials. An incoming packet is only accepted if it's from a configured peer and accompanied by the peer’s incoming HTTP `authToken`. +- Converting currencies. +- Routing packets to the appropriate peers if you are not the intended recipient. Otherwise the packets will terminate at your local Rafiki’s STREAM server. +- Fulfilling packets with an internal STREAM server. + +The connector receives incoming packets via HTTP and/or direct calls from within the `backend`. The `backend` includes an HTTP server listening on the configured `CONNECTOR_PORT`. + +The amounts within ILP packets are used to update account balances in your accounting database (TigerBeetle or Postgres). Amounts are adjusted based on Rafiki’s configured [exchange rates](/integration/deploy-to-prod/endpoints/exchange-rates) service and the asset used by the sending (outgoing) and receiving (destination) accounts. The total amount received for the STREAM connection is tracked in Redis in order to support STREAM receipts. + +## GraphQL Backend Admin API + +The `backend` service exposes a GraphQL [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to manage: + +- Assets +- Peers +- Wallet addresses +- Open Payments resources +- Several types of liquidity diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx index aa2495609e..c2a794bab6 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx @@ -2,4 +2,24 @@ title: Frontend service --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +

+ + link to /integration/deploy-to-prod/environment-variables FRONTEND when + available; link to Admin UI guide + +

+ +Rafiki’s `frontend` service provides an optional internal admin interface for you to manage your Rafiki instance through a Remix web application. This service communicates with the [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to facilitate administrative tasks within Rafiki. + +## Requirements + +The following are required when using the `frontend` service: + +- A Rafiki [`backend`](/services-and-aux-packages/backend-service) service up and running to access the Backend Admin API. +- An identity provider for authentication and user management. Out of the box, the Rafiki Admin application uses Ory Kratos, a secure and fully open-source identity management solution. Kratos will be made optional in a future Rafiki release, allowing you to run your own solution if you so choose. + +## Rafiki admin settings + +While the `frontend` service is not required to run a Rafiki instance, it is highly recommended. A number of administrative tasks could be performed programmatically via the Backend Admin API, but the `frontend` service makes these functions available through a user-friendly interface. From 13007379d0966936d6766e1e16ad14a152c6180e Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Wed, 21 Aug 2024 09:09:48 -0400 Subject: [PATCH 12/91] docs: fixing linkout issue --- .../src/content/docs/components/interledger.mdx | 4 +--- .../docs/services-and-aux-packages/backend-service.mdx | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/documentation/src/content/docs/components/interledger.mdx b/packages/documentation/src/content/docs/components/interledger.mdx index ad7cca531c..186212ca9e 100644 --- a/packages/documentation/src/content/docs/components/interledger.mdx +++ b/packages/documentation/src/content/docs/components/interledger.mdx @@ -46,9 +46,7 @@ Every payment pointer serves as a Simple Payment Setup Protocol (SPSP) endpoint ## Simple Payment Setup Protocol (SPSP) - - SPSP - is an application layer protocol that uses HTTPS to exchange payment information. +The Simple Payment Setup Protocol (SPSP) is an application layer protocol that uses HTTPS to exchange payment information. Every payment pointer issued by Rafiki serves as an SPSP endpoint by default (`ENABLE_SPSP_PAYMENT_POINTERS`). When a `GET` request is made to a payment pointer, the response contains the ILP address of the destination account and a shared secret. These details are needed to set up a STREAM connection between two counterparties to facilitate direct payments over Interledger. diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx index 6a8fb4c076..629b9607bd 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx @@ -38,10 +38,10 @@ The `backend` service allows you to manage Open Payments `@interledger/pay` library to facilitate sending payments over Interledger using STREAM. From 90f41379e979dc3ff0abffa8bfadfdf2ead0fccb Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Wed, 21 Aug 2024 09:12:11 -0400 Subject: [PATCH 13/91] docs: another linkout fix --- .../documentation/src/content/docs/components/interledger.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/documentation/src/content/docs/components/interledger.mdx b/packages/documentation/src/content/docs/components/interledger.mdx index 186212ca9e..15eb3503f0 100644 --- a/packages/documentation/src/content/docs/components/interledger.mdx +++ b/packages/documentation/src/content/docs/components/interledger.mdx @@ -53,9 +53,7 @@ When a `GET` request is made to a payment pointer, the response contains the ILP ## STREAM Protocol - - STREAM - is the transport layer protocol in the Interledger Protocol stack. After +The STREAM Protocol is the transport layer protocol in the Interledger Protocol stack. After SPSP communicates the ILP address of the destination account and the shared secret, the STREAM protocol uses these details to set up a STREAM connection between the counterparties.{' '} From 70176338bfcc4c2d7c326fc270cc542f6d698248 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Wed, 21 Aug 2024 09:21:38 -0400 Subject: [PATCH 14/91] docs: sigh --- .../src/content/docs/components/open-payments.mdx | 9 +-------- .../docs/services-and-aux-packages/backend-service.mdx | 10 +--------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/packages/documentation/src/content/docs/components/open-payments.mdx b/packages/documentation/src/content/docs/components/open-payments.mdx index fa050a1b54..b2c9f05203 100644 --- a/packages/documentation/src/content/docs/components/open-payments.mdx +++ b/packages/documentation/src/content/docs/components/open-payments.mdx @@ -6,14 +6,7 @@ tableOfContents: import { LinkOut } from '@interledger/docs-design-system' -Open Payments is the standard -that Rafiki follows to enable third-party clients to securely retrieve account information -and initiate payments from your customers’ accounts with their consent. The Open -Payments standard describes a uniform way to create and manage grants and resources -for - incoming payments, quotes, and outgoing payments - -.{' '} +Rafiki follows the Open Payments standard to enable third-party clients to securely retrieve account information and initiate payments from your customers’ accounts with their consent. The standard describes a uniform way to create and manage grants and resources for incoming payments, quotes, and outgoing payments. ### Example use case - retrieve account information diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx index 629b9607bd..14bc4abfe1 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx @@ -33,15 +33,7 @@ The following are required when using the `backend` service. The `backend` service exposes the Open Payments APIs, which are auth-protected using an opinionated version of the Grant Negotiation and Authorization Protocol (GNAP). Review the [`auth`](/services-and-aux-packages/auth-service) service page for more details about grant authorization and authentication. -The `backend` service allows you to manage Open Payments incoming payments, quotes, and - - - outgoing payments - -. Quotes and outgoing payments call the ILP connector, described in the next section, -to send ILP packets. Quoting sends unfulfillable probe packets, for example to determine -a transaction’s cost before executing the payment. Outgoing payments send packets -as part of executing the payment. +The `backend` service allows you to manage Open Payments incoming payments, quotes, and outgoing payments. Quotes and outgoing payments call the ILP connector, described in the next section, to send ILP packets. Quoting sends unfulfillable probe packets, for example to determine a transaction’s cost before executing the payment. Outgoing payments send packets as part of executing the payment. :::note The calls to the ILP connector are made by calling the `makeIlpPlugin`, which is an implementation detail of an ILP connector that Rafiki will abstract. After calling the plugin, it will be passed to the `@interledger/pay` library to facilitate sending payments over Interledger using STREAM. From c31c3ce49142cf850b53095a6b92a97a8491ea92 Mon Sep 17 00:00:00 2001 From: Chen Hui Jing <1461498+huijing@users.noreply.github.com> Date: Wed, 21 Aug 2024 22:15:49 +0800 Subject: [PATCH 15/91] resolve conflicts and attempt to remove generated files --- packages/documentation/.gitignore | 4 +- .../src/content/docs/apis/auth/enums.md | 96 + .../content/docs/apis/auth/inputObjects.md | 147 + .../src/content/docs/apis/auth/interfaces.md | 41 + .../src/content/docs/apis/auth/mutations.md | 29 + .../src/content/docs/apis/auth/objects.md | 362 +++ .../src/content/docs/apis/auth/queries.md | 97 + .../src/content/docs/apis/auth/scalars.md | 30 + .../src/content/docs/apis/backend/enums.md | 348 +++ .../content/docs/apis/backend/inputObjects.md | 1776 +++++++++++ .../content/docs/apis/backend/interfaces.md | 112 + .../content/docs/apis/backend/mutations.md | 723 +++++ .../src/content/docs/apis/backend/objects.md | 2698 +++++++++++++++++ .../src/content/docs/apis/backend/queries.md | 512 ++++ .../src/content/docs/apis/backend/scalars.md | 38 + 15 files changed, 7011 insertions(+), 2 deletions(-) create mode 100644 packages/documentation/src/content/docs/apis/auth/enums.md create mode 100644 packages/documentation/src/content/docs/apis/auth/inputObjects.md create mode 100644 packages/documentation/src/content/docs/apis/auth/interfaces.md create mode 100644 packages/documentation/src/content/docs/apis/auth/mutations.md create mode 100644 packages/documentation/src/content/docs/apis/auth/objects.md create mode 100644 packages/documentation/src/content/docs/apis/auth/queries.md create mode 100644 packages/documentation/src/content/docs/apis/auth/scalars.md create mode 100644 packages/documentation/src/content/docs/apis/backend/enums.md create mode 100644 packages/documentation/src/content/docs/apis/backend/inputObjects.md create mode 100644 packages/documentation/src/content/docs/apis/backend/interfaces.md create mode 100644 packages/documentation/src/content/docs/apis/backend/mutations.md create mode 100644 packages/documentation/src/content/docs/apis/backend/objects.md create mode 100644 packages/documentation/src/content/docs/apis/backend/queries.md create mode 100644 packages/documentation/src/content/docs/apis/backend/scalars.md diff --git a/packages/documentation/.gitignore b/packages/documentation/.gitignore index 86874fcf41..513c995c5f 100644 --- a/packages/documentation/.gitignore +++ b/packages/documentation/.gitignore @@ -24,5 +24,5 @@ pnpm-debug.log* .vscode # generated docs -src/content/docs/apis/graphql/auth/* -src/content/docs/apis/graphql/backend/* \ No newline at end of file +# src/content/docs/apis/graphql/auth/* +# src/content/docs/apis/graphql/backend/* diff --git a/packages/documentation/src/content/docs/apis/auth/enums.md b/packages/documentation/src/content/docs/apis/auth/enums.md new file mode 100644 index 0000000000..cb3acf7a7c --- /dev/null +++ b/packages/documentation/src/content/docs/apis/auth/enums.md @@ -0,0 +1,96 @@ +--- +title: Enums +--- + + + +## GrantFinalization + + + +

Values

+ + + + + + + + + + + + + + + + + +
ValueDescription
ISSUED +

grant was issued

+
REVOKED +

grant was revoked

+
REJECTED +

grant was rejected

+
+ +## GrantState + + + +

Values

+ + + + + + + + + + + + + + + + + + + + + +
ValueDescription
PROCESSING +

grant request is determining what state to enter next

+
PENDING +

grant request is awaiting interaction

+
APPROVED +

grant was approved

+
FINALIZED +

grant was finalized and no more access tokens or interactions can be made on it

+
+ +## SortOrder + + + +

Values

+ + + + + + + + + + + + + +
ValueDescription
ASC +

Choose ascending order for results.

+
DESC +

Choose descending order for results.

+
+ diff --git a/packages/documentation/src/content/docs/apis/auth/inputObjects.md b/packages/documentation/src/content/docs/apis/auth/inputObjects.md new file mode 100644 index 0000000000..80069df276 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/auth/inputObjects.md @@ -0,0 +1,147 @@ +--- +title: Input objects +--- + + + +## FilterFinalizationReason + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+in
+[GrantFinalization!] +
+ +
+notIn
+[GrantFinalization!] +
+ +
+ +## FilterGrantState + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+in
+[GrantState!] +
+ +
+notIn
+[GrantState!] +
+ +
+ +## FilterString + + + +

Arguments

+ + + + + + + + + +
NameDescription
+in
+[String!] +
+ +
+ +## GrantFilter + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+identifier
+FilterString +
+ +
+state
+FilterGrantState +
+ +
+finalizationReason
+FilterFinalizationReason +
+ +
+ +## RevokeGrantInput + + + +

Arguments

+ + + + + + + + + +
NameDescription
+grantId
+String! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/auth/interfaces.md b/packages/documentation/src/content/docs/apis/auth/interfaces.md new file mode 100644 index 0000000000..d000f9b18a --- /dev/null +++ b/packages/documentation/src/content/docs/apis/auth/interfaces.md @@ -0,0 +1,41 @@ +--- +title: Interfaces +--- + + + +## Model + + + +

Implemented by

+ +- [Grant](/apis/auth/objects#grant) +- [Access](/apis/auth/objects#access) + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+createdAt
+String! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/auth/mutations.md b/packages/documentation/src/content/docs/apis/auth/mutations.md new file mode 100644 index 0000000000..e71d2e68be --- /dev/null +++ b/packages/documentation/src/content/docs/apis/auth/mutations.md @@ -0,0 +1,29 @@ +--- +title: Mutations +--- + + + +## revokeGrant + +**Type:** [RevokeGrantMutationResponse!](/apis/auth/objects#revokegrantmutationresponse) + +Revoke Grant + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+RevokeGrantInput! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/auth/objects.md b/packages/documentation/src/content/docs/apis/auth/objects.md new file mode 100644 index 0000000000..7c43f5bf86 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/auth/objects.md @@ -0,0 +1,362 @@ +--- +title: Objects +--- + + + +## Access + + + +

Implements

+ +- [Model](/apis/auth/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Access id

+
+identifier
+String +
+

Wallet address of a sub-resource (incoming payment, outgoing payment, or quote)

+
+type
+String! +
+

Access type (incoming payment, outgoing payment, or quote)

+
+actions
+[String]! +
+

Access action (create, read, list or complete)

+
+limits
+LimitData +
+

Payment limits

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## Grant + + + +

Implements

+ +- [Model](/apis/auth/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Grant id

+
+client
+String! +
+

Wallet address of the grantee's account

+
+access
+[Access!]! +
+

Access details

+
+state
+GrantState! +
+

State of the grant

+
+finalizationReason
+GrantFinalization +
+

Reason a grant was finalized

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## GrantEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Grant! +
+ +
+cursor
+String! +
+ +
+ +## GrantsConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[GrantEdge!]! +
+ +
+ +## LimitData + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+receiver
+String +
+

Wallet address URL of the receiver

+
+debitAmount
+PaymentAmount +
+

Amount to debit

+
+receiveAmount
+PaymentAmount +
+

Amount to receive

+
+interval
+String +
+

Interval between payments

+
+ +## PageInfo + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+endCursor
+String +
+

Paginating forwards: the cursor to continue.

+
+hasNextPage
+Boolean! +
+

Paginating forwards: Are there more pages?

+
+hasPreviousPage
+Boolean! +
+

Paginating backwards: Are there more pages?

+
+startCursor
+String +
+

Paginating backwards: the cursor to continue.

+
+ +## PaymentAmount + + + +

Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
+value
+UInt64! +
+ +
+assetCode
+String! +
+

ISO 4217 currency code, e.g. USD

+
+assetScale
+UInt8! +
+

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

+
+ +## RevokeGrantMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/auth/queries.md b/packages/documentation/src/content/docs/apis/auth/queries.md new file mode 100644 index 0000000000..4c53ce0d33 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/auth/queries.md @@ -0,0 +1,97 @@ +--- +title: Queries +--- + + + +## grant + +**Type:** [Grant!](/apis/auth/objects#grant) + +Fetch a grant + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+ +## grants + +**Type:** [GrantsConnection!](/apis/auth/objects#grantsconnection) + +Fetch a page of grants. + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+filter
+GrantFilter +
+

Filter grants based on specific criteria.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ diff --git a/packages/documentation/src/content/docs/apis/auth/scalars.md b/packages/documentation/src/content/docs/apis/auth/scalars.md new file mode 100644 index 0000000000..f404688a6e --- /dev/null +++ b/packages/documentation/src/content/docs/apis/auth/scalars.md @@ -0,0 +1,30 @@ +--- +title: Scalars +--- + + + +## Boolean + +The `Boolean` scalar type represents `true` or `false`. + +## ID + +The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. + +## Int + +The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. + +## String + +The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. + +## UInt64 + + + +## UInt8 + + + diff --git a/packages/documentation/src/content/docs/apis/backend/enums.md b/packages/documentation/src/content/docs/apis/backend/enums.md new file mode 100644 index 0000000000..eeca95bc29 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/backend/enums.md @@ -0,0 +1,348 @@ +--- +title: Enums +--- + + + +## Alg + + + +

Values

+ + + + + + + + + +
ValueDescription
EdDSA + +
+ +## Crv + + + +

Values

+ + + + + + + + + +
ValueDescription
Ed25519 + +
+ +## FeeType + + + +

Values

+ + + + + + + + + + + + + +
ValueDescription
SENDING +

Sender pays the fees

+
RECEIVING +

Receiver pays the fees

+
+ +## IncomingPaymentState + + + +

Values

+ + + + + + + + + + + + + + + + + + + + + +
ValueDescription
PENDING +

The payment has a state of PENDING when it is initially created.

+
PROCESSING +

As soon as payment has started (funds have cleared into the account) the state moves to PROCESSING

+
COMPLETED +

The payment is either auto-completed once the received amount equals the expected incomingAmount, or it is completed manually via an API call.

+
EXPIRED +

If the payment expires before it is completed then the state will move to EXPIRED and no further payments will be accepted.

+
+ +## Kty + + + +

Values

+ + + + + + + + + +
ValueDescription
OKP + +
+ +## LiquidityError + + + +

Values

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
AlreadyPosted + +
AlreadyVoided + +
AmountZero + +
InsufficientBalance + +
InvalidId + +
TransferExists + +
UnknownAsset + +
UnknownIncomingPayment + +
UnknownPayment + +
UnknownWalletAddress + +
UnknownPeer + +
UnknownTransfer + +
+ +## OutgoingPaymentState + + + +

Values

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
FUNDING +

Will transition to SENDING once payment funds are reserved

+
SENDING +

Paying, will transition to COMPLETED on success

+
COMPLETED +

Successful completion

+
FAILED +

Payment failed

+
CANCELLED +

Payment cancelled

+
+ +## PaymentType + + + +

Values

+ + + + + + + + + + + + + +
ValueDescription
INCOMING + +
OUTGOING + +
+ +## SortOrder + + + +

Values

+ + + + + + + + + + + + + +
ValueDescription
ASC +

Choose ascending order for results.

+
DESC +

Choose descending order for results.

+
+ +## TransferType + + + +

Values

+ + + + + + + + + + + + + + + + + +
ValueDescription
DEPOSIT +

Deposit transfer type.

+
WITHDRAWAL +

Withdrawal transfer type.

+
TRANSFER +

Transfer type.

+
+ +## WalletAddressStatus + + + +

Values

+ + + + + + + + + + + + + +
ValueDescription
INACTIVE +

Status after deactivating

+
ACTIVE +

Default status

+
+ diff --git a/packages/documentation/src/content/docs/apis/backend/inputObjects.md b/packages/documentation/src/content/docs/apis/backend/inputObjects.md new file mode 100644 index 0000000000..067b5f34cb --- /dev/null +++ b/packages/documentation/src/content/docs/apis/backend/inputObjects.md @@ -0,0 +1,1776 @@ +--- +title: Input objects +--- + + + +## AdditionalPropertyInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+key
+String! +
+ +
+value
+String! +
+ +
+visibleInOpenPayments
+Boolean! +
+ +
+ +## AmountInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+value
+UInt64! +
+ +
+assetCode
+String! +
+

ISO 4217 currency code, e.g. USD

+
+assetScale
+UInt8! +
+

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

+
+ +## CancelOutgoingPaymentInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Outgoing payment id

+
+reason
+String +
+

Reason why this Outgoing Payment has been cancelled. This value will be publicly visible in the metadata field if this outgoing payment is requested through Open Payments.

+
+ +## CreateAssetInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+code
+String! +
+

ISO 4217 currency code, e.g. USD

+
+scale
+UInt8! +
+

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

+
+withdrawalThreshold
+UInt64 +
+

Minimum amount of liquidity that can be withdrawn from the asset

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if liquidity falls below this value

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateAssetLiquidityWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+assetId
+String! +
+

The id of the asset to create the withdrawal for.

+
+amount
+UInt64! +
+

Amount of withdrawal.

+
+id
+String! +
+

The id of the withdrawal.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+timeoutSeconds
+UInt64! +
+

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

+
+ +## CreateIncomingPaymentInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+

Id of the wallet address under which the incoming payment will be created

+
+expiresAt
+String +
+

Expiration date-time

+
+metadata
+JSONObject +
+

Additional metadata associated with the incoming payment.

+
+incomingAmount
+AmountInput +
+

Maximum amount to be received

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateIncomingPaymentWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+incomingPaymentId
+String! +
+

The id of the incoming payment to withdraw from.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+timeoutSeconds
+UInt64! +
+

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

+
+ +## CreateOrUpdatePeerByUrlInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+maxPacketAmount
+UInt64 +
+

Maximum packet amount that the peer accepts

+
+assetId
+String! +
+

Asset id of peering relationship

+
+peerUrl
+String! +
+

Peer's URL address at which the peer accepts auto-peering requests

+
+name
+String +
+

Peer's internal name for overriding auto-peer's default naming

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

+
+liquidityToDeposit
+UInt64 +
+

Amount of liquidity to deposit for peer

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateOutgoingPaymentFromIncomingPaymentInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+

Id of the wallet address under which the outgoing payment will be created

+
+incomingPayment
+String! +
+

Incoming payment url to create the outgoing payment from

+
+debitAmount
+AmountInput! +
+

Amount to send (fixed send)

+
+metadata
+JSONObject +
+

Additional metadata associated with the outgoing payment.

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateOutgoingPaymentInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+

Id of the wallet address under which the outgoing payment will be created

+
+quoteId
+String! +
+

Id of the corresponding quote for that outgoing payment

+
+metadata
+JSONObject +
+

Additional metadata associated with the outgoing payment.

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateOutgoingPaymentWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+outgoingPaymentId
+String! +
+

The id of the outgoing payment to withdraw from.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+timeoutSeconds
+UInt64! +
+

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

+
+ +## CreatePeerInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+maxPacketAmount
+UInt64 +
+

Maximum packet amount that the peer accepts

+
+http
+HttpInput! +
+

Peering connection details

+
+assetId
+String! +
+

Asset id of peering relationship

+
+staticIlpAddress
+String! +
+

Peer's ILP address

+
+name
+String +
+

Peer's internal name

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

+
+initialLiquidity
+UInt64 +
+

Initial amount of liquidity to deposit for peer

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreatePeerLiquidityWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+peerId
+String! +
+

The id of the peer to create the withdrawal for.

+
+amount
+UInt64! +
+

Amount of withdrawal.

+
+id
+String! +
+

The id of the withdrawal.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+timeoutSeconds
+UInt64! +
+

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

+
+ +## CreateQuoteInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+

Id of the wallet address under which the quote will be created

+
+debitAmount
+AmountInput +
+

Amount to send (fixed send)

+
+receiveAmount
+AmountInput +
+

Amount to receive (fixed receive)

+
+receiver
+String! +
+

Wallet address URL of the receiver

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateReceiverInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressUrl
+String! +
+

Receiving wallet address URL

+
+expiresAt
+String +
+

Expiration date-time

+
+incomingAmount
+AmountInput +
+

Maximum amount to be received

+
+metadata
+JSONObject +
+

Additional metadata associated with the incoming payment.

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateWalletAddressInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+assetId
+String! +
+

Asset of the wallet address

+
+url
+String! +
+

Wallet Address URL

+
+publicName
+String +
+

Public name associated with the wallet address

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+additionalProperties
+[AdditionalPropertyInput!] +
+

Additional properties associated with the [walletAddress].

+
+ +## CreateWalletAddressKeyInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+ +
+jwk
+JwkInput! +
+

Public key

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## CreateWalletAddressWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+walletAddressId
+String! +
+

The id of the Open Payments wallet address to create the withdrawal for.

+
+id
+String! +
+

The id of the withdrawal.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+timeoutSeconds
+UInt64! +
+

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

+
+ +## DeleteAssetInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Asset id

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## DeletePeerInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## DepositAssetLiquidityInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+assetId
+String! +
+

The id of the asset to deposit liquidity.

+
+amount
+UInt64! +
+

Amount of liquidity to deposit.

+
+id
+String! +
+

The id of the transfer.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## DepositEventLiquidityInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+eventId
+String! +
+

The id of the event to deposit into.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## DepositOutgoingPaymentLiquidityInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+outgoingPaymentId
+String! +
+

The id of the outgoing payment to deposit into.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## DepositPeerLiquidityInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+peerId
+String! +
+

The id of the peer to deposit liquidity.

+
+amount
+UInt64! +
+

Amount of liquidity to deposit.

+
+id
+String! +
+

The id of the transfer.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## FeeDetails + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+fixed
+UInt64! +
+

A flat fee

+
+basisPoints
+Int! +
+

Basis points fee. Should be between 0 and 10000 (inclusive). 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100%

+
+ +## FilterString + + + +

Arguments

+ + + + + + + + + +
NameDescription
+in
+[String!]! +
+ +
+ +## HttpIncomingInput + + + +

Arguments

+ + + + + + + + + +
NameDescription
+authTokens
+[String!]! +
+

Array of auth tokens accepted by this Rafiki instance

+
+ +## HttpInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+incoming
+HttpIncomingInput +
+

Incoming connection details

+
+outgoing
+HttpOutgoingInput! +
+

Outgoing connection details

+
+ +## HttpOutgoingInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+authToken
+String! +
+

Auth token to present at the peering Rafiki instance

+
+endpoint
+String! +
+

Peer's connection endpoint

+
+ +## JwkInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+kid
+String! +
+

Key id

+
+x
+String! +
+

Base64 url-encoded public key.

+
+alg
+Alg! +
+

Cryptographic algorithm family used with the key. The only allowed value is EdDSA.

+
+kty
+Kty! +
+

Key type. The only allowed value is OKP.

+
+crv
+Crv! +
+

Curve that the key pair is derived from. The only allowed value is Ed25519.

+
+ +## PaymentFilter + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+type
+FilterString +
+ +
+walletAddressId
+FilterString +
+ +
+ +## PostLiquidityWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+withdrawalId
+String! +
+

The id of the liquidity withdrawal to post.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## RevokeWalletAddressKeyInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+id
+String! +
+

Internal id of key

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## SetFeeInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+assetId
+ID! +
+

Asset id to add the fee to

+
+type
+FeeType! +
+

Type of fee (sending or receiving)

+
+fee
+FeeDetails! +
+

Fee values

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## TriggerWalletAddressEventsInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+limit
+Int! +
+

Maximum number of events being triggered (n).

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## UpdateAssetInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+String! +
+

Asset id

+
+withdrawalThreshold
+UInt64 +
+

New minimum amount of liquidity that can be withdrawn from the asset

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if liquidity falls below this new value

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## UpdatePeerInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+String! +
+

Peer id

+
+maxPacketAmount
+UInt64 +
+

New maximum packet amount that the peer accepts

+
+http
+HttpInput +
+

New peering connection details

+
+staticIlpAddress
+String +
+

Peer's new ILP address

+
+name
+String +
+

Peer's new public name

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this new value

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## UpdateWalletAddressInput + + + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

ID of wallet address to update

+
+publicName
+String +
+

New public name for wallet address

+
+status
+WalletAddressStatus +
+

New status to set the wallet address to

+
+idempotencyKey
+String +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+additionalProperties
+[AdditionalPropertyInput!] +
+

List additional properties associated with this wallet address.

+
+ +## VoidLiquidityWithdrawalInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+withdrawalId
+String! +
+

The id of the liquidity withdrawal to void.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ +## WebhookEventFilter + + + +

Arguments

+ + + + + + + + + +
NameDescription
+type
+FilterString +
+ +
+ +## WithdrawEventLiquidityInput + + + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+eventId
+String! +
+

The id of the event to withdraw from.

+
+idempotencyKey
+String! +
+

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

+
+ diff --git a/packages/documentation/src/content/docs/apis/backend/interfaces.md b/packages/documentation/src/content/docs/apis/backend/interfaces.md new file mode 100644 index 0000000000..81868d9668 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/backend/interfaces.md @@ -0,0 +1,112 @@ +--- +title: Interfaces +--- + + + +## BasePayment + + + +

Implemented by

+ +- [IncomingPayment](/apis/backend/objects#incomingpayment) +- [OutgoingPayment](/apis/backend/objects#outgoingpayment) +- [Payment](/apis/backend/objects#payment) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+walletAddressId
+ID! +
+ +
+metadata
+JSONObject +
+ +
+createdAt
+String! +
+ +
+client
+String +
+ +
+ +## Model + + + +

Implemented by

+ +- [Asset](/apis/backend/objects#asset) +- [Peer](/apis/backend/objects#peer) +- [WalletAddress](/apis/backend/objects#walletaddress) +- [IncomingPayment](/apis/backend/objects#incomingpayment) +- [OutgoingPayment](/apis/backend/objects#outgoingpayment) +- [Payment](/apis/backend/objects#payment) +- [AccountingTransfer](/apis/backend/objects#accountingtransfer) +- [WalletAddressKey](/apis/backend/objects#walletaddresskey) +- [WebhookEvent](/apis/backend/objects#webhookevent) +- [Fee](/apis/backend/objects#fee) + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+ +
+createdAt
+String! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/backend/mutations.md b/packages/documentation/src/content/docs/apis/backend/mutations.md new file mode 100644 index 0000000000..82b821618e --- /dev/null +++ b/packages/documentation/src/content/docs/apis/backend/mutations.md @@ -0,0 +1,723 @@ +--- +title: Mutations +--- + + + +## cancelOutgoingPayment + +**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) + +Cancel Outgoing Payment + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CancelOutgoingPaymentInput! +
+ +
+ +## createAsset + +**Type:** [AssetMutationResponse!](/apis/backend/objects#assetmutationresponse) + +Create an asset + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateAssetInput! +
+ +
+ +## createAssetLiquidityWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Withdraw asset liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateAssetLiquidityWithdrawalInput! +
+ +
+ +## createIncomingPayment + +**Type:** [IncomingPaymentResponse!](/apis/backend/objects#incomingpaymentresponse) + +Create an internal Open Payments Incoming Payment. The receiver has a wallet address on this Rafiki instance. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateIncomingPaymentInput! +
+ +
+ +## createIncomingPaymentWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Withdraw incoming payment liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateIncomingPaymentWithdrawalInput! +
+ +
+ +## createOrUpdatePeerByUrl + +**Type:** [CreateOrUpdatePeerByUrlMutationResponse!](/apis/backend/objects#createorupdatepeerbyurlmutationresponse) + +Create a peer using a URL + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateOrUpdatePeerByUrlInput! +
+ +
+ +## createOutgoingPayment + +**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) + +Create an Open Payments Outgoing Payment + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateOutgoingPaymentInput! +
+ +
+ +## createOutgoingPaymentFromIncomingPayment + +**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) + +Create an Open Payments Outgoing Payment from an incoming payment + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateOutgoingPaymentFromIncomingPaymentInput! +
+ +
+ +## createOutgoingPaymentWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Withdraw outgoing payment liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateOutgoingPaymentWithdrawalInput! +
+ +
+ +## createPeer + +**Type:** [CreatePeerMutationResponse!](/apis/backend/objects#createpeermutationresponse) + +Create a peer + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreatePeerInput! +
+ +
+ +## createPeerLiquidityWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Withdraw peer liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreatePeerLiquidityWithdrawalInput! +
+ +
+ +## createQuote + +**Type:** [QuoteResponse!](/apis/backend/objects#quoteresponse) + +Create an Open Payments Quote + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateQuoteInput! +
+ +
+ +## createReceiver + +**Type:** [CreateReceiverResponse!](/apis/backend/objects#createreceiverresponse) + +Create an internal or external Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateReceiverInput! +
+ +
+ +## createWalletAddress + +**Type:** [CreateWalletAddressMutationResponse!](/apis/backend/objects#createwalletaddressmutationresponse) + +Create a wallet address + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateWalletAddressInput! +
+ +
+ +## createWalletAddressKey + +**Type:** [CreateWalletAddressKeyMutationResponse](/apis/backend/objects#createwalletaddresskeymutationresponse) + +Add a public key to a wallet address that is used to verify Open Payments requests. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateWalletAddressKeyInput! +
+ +
+ +## createWalletAddressWithdrawal + +**Type:** [WalletAddressWithdrawalMutationResponse](/apis/backend/objects#walletaddresswithdrawalmutationresponse) + +Withdraw liquidity from a wallet address received via Web Monetization. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+CreateWalletAddressWithdrawalInput! +
+ +
+ +## deleteAsset + +**Type:** [DeleteAssetMutationResponse!](/apis/backend/objects#deleteassetmutationresponse) + +Delete an asset + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DeleteAssetInput! +
+ +
+ +## deletePeer + +**Type:** [DeletePeerMutationResponse!](/apis/backend/objects#deletepeermutationresponse) + +Delete a peer + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DeletePeerInput! +
+ +
+ +## depositAssetLiquidity + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Deposit asset liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DepositAssetLiquidityInput! +
+ +
+ +## depositEventLiquidity + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +> Deprecated: Use `depositOutgoingPaymentLiquidity` + +Deposit webhook event liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DepositEventLiquidityInput! +
+ +
+ +## depositOutgoingPaymentLiquidity + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Deposit outgoing payment liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DepositOutgoingPaymentLiquidityInput! +
+ +
+ +## depositPeerLiquidity + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Deposit peer liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+DepositPeerLiquidityInput! +
+ +
+ +## postLiquidityWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Post liquidity withdrawal. Withdrawals are two-phase commits and are committed via this mutation. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+PostLiquidityWithdrawalInput! +
+ +
+ +## revokeWalletAddressKey + +**Type:** [RevokeWalletAddressKeyMutationResponse](/apis/backend/objects#revokewalletaddresskeymutationresponse) + +Revoke a public key associated with a wallet address. Open Payment requests using this key for request signatures will be denied going forward. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+RevokeWalletAddressKeyInput! +
+ +
+ +## setFee + +**Type:** [SetFeeResponse!](/apis/backend/objects#setfeeresponse) + +Set the fee on an asset + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+SetFeeInput! +
+ +
+ +## triggerWalletAddressEvents + +**Type:** [TriggerWalletAddressEventsMutationResponse!](/apis/backend/objects#triggerwalletaddresseventsmutationresponse) + +If automatic withdrawal of funds received via Web Monetization by the wallet address are disabled, this mutation can be used to trigger up to n withdrawal events. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+TriggerWalletAddressEventsInput! +
+ +
+ +## updateAsset + +**Type:** [AssetMutationResponse!](/apis/backend/objects#assetmutationresponse) + +Update an asset + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+UpdateAssetInput! +
+ +
+ +## updatePeer + +**Type:** [UpdatePeerMutationResponse!](/apis/backend/objects#updatepeermutationresponse) + +Update a peer + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+UpdatePeerInput! +
+ +
+ +## updateWalletAddress + +**Type:** [UpdateWalletAddressMutationResponse!](/apis/backend/objects#updatewalletaddressmutationresponse) + +Update a wallet address + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+UpdateWalletAddressInput! +
+ +
+ +## voidLiquidityWithdrawal + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +Void liquidity withdrawal. Withdrawals are two-phase commits and are rolled back via this mutation. + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+VoidLiquidityWithdrawalInput! +
+ +
+ +## withdrawEventLiquidity + +**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) + +> Deprecated: Use `createOutgoingPaymentWithdrawal, createIncomingPaymentWithdrawal, or createWalletAddressWithdrawal` + +Withdraw webhook event liquidity + +

Arguments

+ + + + + + + + + +
NameDescription
+input
+WithdrawEventLiquidityInput! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/backend/objects.md b/packages/documentation/src/content/docs/apis/backend/objects.md new file mode 100644 index 0000000000..39212c93ae --- /dev/null +++ b/packages/documentation/src/content/docs/apis/backend/objects.md @@ -0,0 +1,2698 @@ +--- +title: Objects +--- + + + +## AccountingTransfer + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Payment id

+
+debitAccountId
+ID! +
+

Debit account id

+
+creditAccountId
+ID! +
+

Credit account id

+
+amount
+UInt64! +
+

Amount sent (fixed send)

+
+transferType
+TransferType! +
+

Type of accounting transfer

+
+ledger
+UInt8! +
+

Identifier that partitions the sets of accounts that can transact with each other.

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## AccountingTransferConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+debits
+[AccountingTransfer!]! +
+ +
+credits
+[AccountingTransfer!]! +
+ +
+ +## AdditionalProperty + + + +

Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
+key
+String! +
+ +
+value
+String! +
+ +
+visibleInOpenPayments
+Boolean! +
+ +
+ +## Amount + + + +

Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
+value
+UInt64! +
+ +
+assetCode
+String! +
+

ISO 4217 currency code, e.g. USD

+
+assetScale
+UInt8! +
+

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

+
+ +## Asset + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Asset id

+
+code
+String! +
+

ISO 4217 currency code, e.g. USD

+
+scale
+UInt8! +
+

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

+
+liquidity
+UInt64 +
+

Available liquidity

+
+withdrawalThreshold
+UInt64 +
+

Minimum amount of liquidity that can be withdrawn from the asset

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if liquidity falls below this value

+
+receivingFee
+Fee +
+

The receiving fee structure for the asset

+
+sendingFee
+Fee +
+

The sending fee structure for the asset

+
+fees
+FeesConnection +
+

Fetch a page of asset fees

+ +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +
+createdAt
+String! +
+

Date-time of creation

+
+ +## AssetEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Asset! +
+ +
+cursor
+String! +
+ +
+ +## AssetMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+asset
+Asset +
+ +
+ +## AssetsConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[AssetEdge!]! +
+ +
+ +## CreateOrUpdatePeerByUrlMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+peer
+Peer +
+ +
+ +## CreatePeerMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+peer
+Peer +
+ +
+ +## CreateReceiverResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+receiver
+Receiver +
+ +
+ +## CreateWalletAddressKeyMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+walletAddressKey
+WalletAddressKey +
+ +
+ +## CreateWalletAddressMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+walletAddress
+WalletAddress +
+ +
+ +## DeleteAssetMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+asset
+Asset +
+ +
+ +## DeletePeerMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+success
+Boolean! +
+ +
+ +## Fee + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Fee id

+
+assetId
+ID! +
+

Asset id associated with the fee

+
+type
+FeeType! +
+

Type of fee (sending or receiving)

+
+fixed
+UInt64! +
+

Fixed fee

+
+basisPoints
+Int! +
+

Basis points fee. 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100%

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## FeeEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Fee! +
+ +
+cursor
+String! +
+ +
+ +## FeesConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[FeeEdge!]! +
+ +
+ +## Http + + + +

Fields

+ + + + + + + + + +
NameDescription
+outgoing
+HttpOutgoing! +
+

Outgoing connection details

+
+ +## HttpOutgoing + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+authToken
+String! +
+

Auth token to present at the peering Rafiki instance

+
+endpoint
+String! +
+

Peer's connection endpoint

+
+ +## IncomingPayment + + + +

Implements

+ +- [BasePayment](/apis/backend/interfaces#basepayment) +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Incoming Payment id

+
+walletAddressId
+ID! +
+

Id of the wallet address under which this incoming payment was created.

+
+client
+String +
+

Information about the wallet address of the Open Payments client that created the incoming payment.

+
+liquidity
+UInt64 +
+

Available liquidity

+
+state
+IncomingPaymentState! +
+

Incoming payment state

+
+expiresAt
+String! +
+

Date-time of expiry. After this time, the incoming payment will not accept further payments made to it.

+
+incomingAmount
+Amount +
+

The maximum amount that should be paid into the wallet address under this incoming payment.

+
+receivedAmount
+Amount! +
+

The total amount that has been paid into the wallet address under this incoming payment.

+
+metadata
+JSONObject +
+

Additional metadata associated with the incoming payment.

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## IncomingPaymentConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[IncomingPaymentEdge!]! +
+ +
+ +## IncomingPaymentEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+IncomingPayment! +
+ +
+cursor
+String! +
+ +
+ +## IncomingPaymentResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+payment
+IncomingPayment +
+ +
+ +## Jwk + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+kid
+String! +
+

Key id

+
+x
+String! +
+

Base64 url-encoded public key.

+
+alg
+Alg! +
+

Cryptographic algorithm family used with the key. The only allowed value is EdDSA.

+
+kty
+Kty! +
+

Key type. The only allowed value is OKP.

+
+crv
+Crv! +
+

Curve that the key pair is derived from. The only allowed value is Ed25519.

+
+ +## LiquidityMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+success
+Boolean! +
+ +
+ +## OutgoingPayment + + + +

Implements

+ +- [BasePayment](/apis/backend/interfaces#basepayment) +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Outgoing payment id

+
+walletAddressId
+ID! +
+

Id of the wallet address under which this outgoing payment was created

+
+client
+String +
+

Information about the wallet address of the Open Payments client that created the outgoing payment.

+
+liquidity
+UInt64 +
+

Available liquidity

+
+state
+OutgoingPaymentState! +
+

Outgoing payment state

+
+error
+String +
+ +
+stateAttempts
+Int! +
+ +
+debitAmount
+Amount! +
+

Amount to send (fixed send)

+
+receiveAmount
+Amount! +
+

Amount to receive (fixed receive)

+
+receiver
+String! +
+

Wallet address URL of the receiver

+
+metadata
+JSONObject +
+

Additional metadata associated with the outgoing payment.

+
+quote
+Quote +
+

Quote for this outgoing payment

+
+sentAmount
+Amount! +
+

Amount already sent

+
+createdAt
+String! +
+

Date-time of creation

+
+grantId
+String +
+

Id of the Grant under which this outgoing payment was created

+
+ +## OutgoingPaymentConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[OutgoingPaymentEdge!]! +
+ +
+ +## OutgoingPaymentEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+OutgoingPayment! +
+ +
+cursor
+String! +
+ +
+ +## OutgoingPaymentResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+payment
+OutgoingPayment +
+ +
+ +## PageInfo + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+endCursor
+String +
+

Paginating forwards: the cursor to continue.

+
+hasNextPage
+Boolean! +
+

Paginating forwards: Are there more pages?

+
+hasPreviousPage
+Boolean! +
+

Paginating backwards: Are there more pages?

+
+startCursor
+String +
+

Paginating backwards: the cursor to continue.

+
+ +## Payment + + + +

Implements

+ +- [BasePayment](/apis/backend/interfaces#basepayment) +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Payment id

+
+type
+PaymentType! +
+

Type of payment

+
+walletAddressId
+ID! +
+

Id of the wallet address under which this payment was created

+
+client
+String +
+

Information about the wallet address of the Open Payments client that created the payment.

+
+state
+String! +
+

Either the IncomingPaymentState or OutgoingPaymentState according to type

+
+liquidity
+UInt64 +
+

Available liquidity

+
+metadata
+JSONObject +
+

Additional metadata associated with the payment.

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## PaymentConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[PaymentEdge!]! +
+ +
+ +## PaymentEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Payment! +
+ +
+cursor
+String! +
+ +
+ +## Peer + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Peer id

+
+maxPacketAmount
+UInt64 +
+

Maximum packet amount that the peer accepts

+
+http
+Http! +
+

Peering connection details

+
+asset
+Asset! +
+

Asset of peering relationship

+
+staticIlpAddress
+String! +
+

Peer's ILP address

+
+name
+String +
+

Peer's public name

+
+liquidityThreshold
+UInt64 +
+

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

+
+liquidity
+UInt64 +
+

Available liquidity

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## PeerEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Peer! +
+ +
+cursor
+String! +
+ +
+ +## PeersConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[PeerEdge!]! +
+ +
+ +## Quote + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Quote id

+
+walletAddressId
+ID! +
+

Id of the wallet address under which this quote was created

+
+receiver
+String! +
+

Wallet address URL of the receiver

+
+debitAmount
+Amount! +
+

Amount to send (fixed send)

+
+receiveAmount
+Amount! +
+

Amount to receive (fixed receive)

+
+maxPacketAmount
+UInt64! +
+

Maximum value per packet allowed on the possible routes

+
+minExchangeRate
+Float! +
+

Aggregate exchange rate the payment is guaranteed to meet

+
+lowEstimatedExchangeRate
+Float! +
+

Lower bound of probed exchange rate

+
+highEstimatedExchangeRate
+Float! +
+

Upper bound of probed exchange rate

+
+createdAt
+String! +
+

Date-time of creation

+
+expiresAt
+String! +
+

Date-time of expiration

+
+ +## QuoteConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[QuoteEdge!]! +
+ +
+ +## QuoteEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+Quote! +
+ +
+cursor
+String! +
+ +
+ +## QuoteResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+quote
+Quote +
+ +
+ +## Receiver + + + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+String! +
+

Incoming payment URL

+
+walletAddressUrl
+String! +
+

Wallet address URL under which the incoming payment was created

+
+completed
+Boolean! +
+

Describes whether the incoming payment has completed receiving funds.

+
+incomingAmount
+Amount +
+

The maximum amount that should be paid into the wallet address under this incoming payment.

+
+receivedAmount
+Amount! +
+

The total amount that has been paid into the wallet address under this incoming payment.

+
+expiresAt
+String +
+

Date-time of expiry. After this time, the incoming payment will accept further payments made to it.

+
+metadata
+JSONObject +
+

Additional metadata associated with the incoming payment.

+
+createdAt
+String! +
+

Date-time of creation

+
+updatedAt
+String! +
+

Date-time of last update

+
+ +## RevokeWalletAddressKeyMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+walletAddressKey
+WalletAddressKey +
+ +
+ +## SetFeeResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+fee
+Fee +
+ +
+ +## TriggerWalletAddressEventsMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+count
+Int +
+

Number of events triggered

+
+ +## UpdatePeerMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+peer
+Peer +
+ +
+ +## UpdateWalletAddressMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+walletAddress
+WalletAddress +
+ +
+ +## WalletAddress + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Wallet address id

+
+asset
+Asset! +
+

Asset of the wallet address

+
+liquidity
+UInt64 +
+

Available liquidity

+
+url
+String! +
+

Wallet Address URL

+
+publicName
+String +
+

Public name associated with the wallet address

+
+incomingPayments
+IncomingPaymentConnection +
+

List of incoming payments received by this wallet address

+ +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +
+quotes
+QuoteConnection +
+

List of quotes created at this wallet address

+ +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +
+outgoingPayments
+OutgoingPaymentConnection +
+

List of outgoing payments sent from this wallet address

+ +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +
+createdAt
+String! +
+

Date-time of creation

+
+status
+WalletAddressStatus! +
+

Status of the wallet address

+
+walletAddressKeys
+WalletAddressKeyConnection +
+

List of keys associated with this wallet address

+ +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +
+additionalProperties
+[AdditionalProperty] +
+

List additional properties associated with this wallet address.

+
+ +## WalletAddressEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+WalletAddress! +
+ +
+cursor
+String! +
+ +
+ +## WalletAddressesConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[WalletAddressEdge!]! +
+ +
+ +## WalletAddressKey + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Internal id of key

+
+walletAddressId
+ID! +
+

Id of the wallet address to which this key belongs to

+
+jwk
+Jwk! +
+

Public key

+
+revoked
+Boolean! +
+

Indicator whether the key has been revoked

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## WalletAddressKeyConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[WalletAddressKeyEdge!]! +
+ +
+ +## WalletAddressKeyEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+WalletAddressKey! +
+ +
+cursor
+String! +
+ +
+ +## WalletAddressWithdrawal + + + +

Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Withdrawal Id

+
+amount
+UInt64! +
+

Amount to withdraw

+
+walletAddress
+WalletAddress! +
+

Wallet address details

+
+ +## WalletAddressWithdrawalMutationResponse + + + +

Fields

+ + + + + + + + + +
NameDescription
+withdrawal
+WalletAddressWithdrawal +
+ +
+ +## WebhookEvent + + + +

Implements

+ +- [Model](/apis/backend/interfaces#model) + +

Fields

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
+id
+ID! +
+

Event id

+
+type
+String! +
+

Type of event

+
+data
+JSONObject! +
+

Stringified JSON data

+
+createdAt
+String! +
+

Date-time of creation

+
+ +## WebhookEventsConnection + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+pageInfo
+PageInfo! +
+ +
+edges
+[WebhookEventsEdge!]! +
+ +
+ +## WebhookEventsEdge + + + +

Fields

+ + + + + + + + + + + + + +
NameDescription
+node
+WebhookEvent! +
+ +
+cursor
+String! +
+ +
+ diff --git a/packages/documentation/src/content/docs/apis/backend/queries.md b/packages/documentation/src/content/docs/apis/backend/queries.md new file mode 100644 index 0000000000..c50ce737cf --- /dev/null +++ b/packages/documentation/src/content/docs/apis/backend/queries.md @@ -0,0 +1,512 @@ +--- +title: Queries +--- + + + +## accountingTransfers + +**Type:** [AccountingTransferConnection!](/apis/backend/objects#accountingtransferconnection) + +Fetch a page of accounting transfers + +

Arguments

+ + + + + + + + + + + + + +
NameDescription
+id
+String! +
+

Account id.

+
+limit
+Int +
+

Limit the number of results returned. If no limit is provided, the default limit of 100_000 is set for TigerBeetle.

+
+ +## asset + +**Type:** [Asset](/apis/backend/objects#asset) + +Fetch an asset + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## assets + +**Type:** [AssetsConnection!](/apis/backend/objects#assetsconnection) + +Fetch a page of assets. + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +## incomingPayment + +**Type:** [IncomingPayment](/apis/backend/objects#incomingpayment) + +Fetch an Open Payments incoming payment + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## outgoingPayment + +**Type:** [OutgoingPayment](/apis/backend/objects#outgoingpayment) + +Fetch an Open Payments outgoing payment + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## payments + +**Type:** [PaymentConnection!](/apis/backend/objects#paymentconnection) + +Fetch a page of combined payments + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+filter
+PaymentFilter +
+

Filter payment events based on specific criteria.

+
+ +## peer + +**Type:** [Peer](/apis/backend/objects#peer) + +Fetch a peer + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## peers + +**Type:** [PeersConnection!](/apis/backend/objects#peersconnection) + +Fetch a page of peers. + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +## quote + +**Type:** [Quote](/apis/backend/objects#quote) + +Fetch an Open Payments quote + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## receiver + +**Type:** [Receiver](/apis/backend/objects#receiver) + +Get an local or remote Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## walletAddress + +**Type:** [WalletAddress](/apis/backend/objects#walletaddress) + +Fetch a wallet address. + +

Arguments

+ + + + + + + + + +
NameDescription
+id
+String! +
+ +
+ +## walletAddresses + +**Type:** [WalletAddressesConnection!](/apis/backend/objects#walletaddressesconnection) + +Fetch a page of wallet addresses. + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+ +## webhookEvents + +**Type:** [WebhookEventsConnection!](/apis/backend/objects#webhookeventsconnection) + +Fetch a page of webhook events + +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+after
+String +
+

Paginating forwards: the cursor before the the requested page.

+
+before
+String +
+

Paginating backwards: the cursor after the the requested page.

+
+first
+Int +
+

Paginating forwards: The first n elements from the page.

+
+last
+Int +
+

Paginating backwards: The last n elements from the page.

+
+sortOrder
+SortOrder +
+

Ascending or descending order of creation.

+
+filter
+WebhookEventFilter +
+

Filter webhook events based on specific criteria.

+
+ diff --git a/packages/documentation/src/content/docs/apis/backend/scalars.md b/packages/documentation/src/content/docs/apis/backend/scalars.md new file mode 100644 index 0000000000..5c3b7b9369 --- /dev/null +++ b/packages/documentation/src/content/docs/apis/backend/scalars.md @@ -0,0 +1,38 @@ +--- +title: Scalars +--- + + + +## Boolean + +The `Boolean` scalar type represents `true` or `false`. + +## Float + +The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). + +## ID + +The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. + +## Int + +The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. + +## JSONObject + + + +## String + +The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. + +## UInt64 + + + +## UInt8 + + + From f3c643da6f7a5085a30a745804149d2d865bd8ba Mon Sep 17 00:00:00 2001 From: Chen Hui Jing <1461498+huijing@users.noreply.github.com> Date: Wed, 21 Aug 2024 22:16:44 +0800 Subject: [PATCH 16/91] remove generated files from source --- .../src/content/docs/apis/auth/enums.md | 96 - .../content/docs/apis/auth/inputObjects.md | 147 - .../src/content/docs/apis/auth/interfaces.md | 41 - .../src/content/docs/apis/auth/mutations.md | 29 - .../src/content/docs/apis/auth/objects.md | 362 --- .../src/content/docs/apis/auth/queries.md | 97 - .../src/content/docs/apis/auth/scalars.md | 30 - .../src/content/docs/apis/backend/enums.md | 348 --- .../content/docs/apis/backend/inputObjects.md | 1776 ----------- .../content/docs/apis/backend/interfaces.md | 112 - .../content/docs/apis/backend/mutations.md | 723 ----- .../src/content/docs/apis/backend/objects.md | 2698 ----------------- .../src/content/docs/apis/backend/queries.md | 512 ---- .../src/content/docs/apis/backend/scalars.md | 38 - 14 files changed, 7009 deletions(-) delete mode 100644 packages/documentation/src/content/docs/apis/auth/enums.md delete mode 100644 packages/documentation/src/content/docs/apis/auth/inputObjects.md delete mode 100644 packages/documentation/src/content/docs/apis/auth/interfaces.md delete mode 100644 packages/documentation/src/content/docs/apis/auth/mutations.md delete mode 100644 packages/documentation/src/content/docs/apis/auth/objects.md delete mode 100644 packages/documentation/src/content/docs/apis/auth/queries.md delete mode 100644 packages/documentation/src/content/docs/apis/auth/scalars.md delete mode 100644 packages/documentation/src/content/docs/apis/backend/enums.md delete mode 100644 packages/documentation/src/content/docs/apis/backend/inputObjects.md delete mode 100644 packages/documentation/src/content/docs/apis/backend/interfaces.md delete mode 100644 packages/documentation/src/content/docs/apis/backend/mutations.md delete mode 100644 packages/documentation/src/content/docs/apis/backend/objects.md delete mode 100644 packages/documentation/src/content/docs/apis/backend/queries.md delete mode 100644 packages/documentation/src/content/docs/apis/backend/scalars.md diff --git a/packages/documentation/src/content/docs/apis/auth/enums.md b/packages/documentation/src/content/docs/apis/auth/enums.md deleted file mode 100644 index cb3acf7a7c..0000000000 --- a/packages/documentation/src/content/docs/apis/auth/enums.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: Enums ---- - - - -## GrantFinalization - - - -

Values

- - - - - - - - - - - - - - - - - -
ValueDescription
ISSUED -

grant was issued

-
REVOKED -

grant was revoked

-
REJECTED -

grant was rejected

-
- -## GrantState - - - -

Values

- - - - - - - - - - - - - - - - - - - - - -
ValueDescription
PROCESSING -

grant request is determining what state to enter next

-
PENDING -

grant request is awaiting interaction

-
APPROVED -

grant was approved

-
FINALIZED -

grant was finalized and no more access tokens or interactions can be made on it

-
- -## SortOrder - - - -

Values

- - - - - - - - - - - - - -
ValueDescription
ASC -

Choose ascending order for results.

-
DESC -

Choose descending order for results.

-
- diff --git a/packages/documentation/src/content/docs/apis/auth/inputObjects.md b/packages/documentation/src/content/docs/apis/auth/inputObjects.md deleted file mode 100644 index 80069df276..0000000000 --- a/packages/documentation/src/content/docs/apis/auth/inputObjects.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: Input objects ---- - - - -## FilterFinalizationReason - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-in
-[GrantFinalization!] -
- -
-notIn
-[GrantFinalization!] -
- -
- -## FilterGrantState - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-in
-[GrantState!] -
- -
-notIn
-[GrantState!] -
- -
- -## FilterString - - - -

Arguments

- - - - - - - - - -
NameDescription
-in
-[String!] -
- -
- -## GrantFilter - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-identifier
-FilterString -
- -
-state
-FilterGrantState -
- -
-finalizationReason
-FilterFinalizationReason -
- -
- -## RevokeGrantInput - - - -

Arguments

- - - - - - - - - -
NameDescription
-grantId
-String! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/auth/interfaces.md b/packages/documentation/src/content/docs/apis/auth/interfaces.md deleted file mode 100644 index d000f9b18a..0000000000 --- a/packages/documentation/src/content/docs/apis/auth/interfaces.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Interfaces ---- - - - -## Model - - - -

Implemented by

- -- [Grant](/apis/auth/objects#grant) -- [Access](/apis/auth/objects#access) - -

Fields

- - - - - - - - - - - - - -
NameDescription
-id
-ID! -
- -
-createdAt
-String! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/auth/mutations.md b/packages/documentation/src/content/docs/apis/auth/mutations.md deleted file mode 100644 index e71d2e68be..0000000000 --- a/packages/documentation/src/content/docs/apis/auth/mutations.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Mutations ---- - - - -## revokeGrant - -**Type:** [RevokeGrantMutationResponse!](/apis/auth/objects#revokegrantmutationresponse) - -Revoke Grant - -

Arguments

- - - - - - - - - -
NameDescription
-input
-RevokeGrantInput! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/auth/objects.md b/packages/documentation/src/content/docs/apis/auth/objects.md deleted file mode 100644 index 7c43f5bf86..0000000000 --- a/packages/documentation/src/content/docs/apis/auth/objects.md +++ /dev/null @@ -1,362 +0,0 @@ ---- -title: Objects ---- - - - -## Access - - - -

Implements

- -- [Model](/apis/auth/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Access id

-
-identifier
-String -
-

Wallet address of a sub-resource (incoming payment, outgoing payment, or quote)

-
-type
-String! -
-

Access type (incoming payment, outgoing payment, or quote)

-
-actions
-[String]! -
-

Access action (create, read, list or complete)

-
-limits
-LimitData -
-

Payment limits

-
-createdAt
-String! -
-

Date-time of creation

-
- -## Grant - - - -

Implements

- -- [Model](/apis/auth/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Grant id

-
-client
-String! -
-

Wallet address of the grantee's account

-
-access
-[Access!]! -
-

Access details

-
-state
-GrantState! -
-

State of the grant

-
-finalizationReason
-GrantFinalization -
-

Reason a grant was finalized

-
-createdAt
-String! -
-

Date-time of creation

-
- -## GrantEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Grant! -
- -
-cursor
-String! -
- -
- -## GrantsConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[GrantEdge!]! -
- -
- -## LimitData - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-receiver
-String -
-

Wallet address URL of the receiver

-
-debitAmount
-PaymentAmount -
-

Amount to debit

-
-receiveAmount
-PaymentAmount -
-

Amount to receive

-
-interval
-String -
-

Interval between payments

-
- -## PageInfo - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-endCursor
-String -
-

Paginating forwards: the cursor to continue.

-
-hasNextPage
-Boolean! -
-

Paginating forwards: Are there more pages?

-
-hasPreviousPage
-Boolean! -
-

Paginating backwards: Are there more pages?

-
-startCursor
-String -
-

Paginating backwards: the cursor to continue.

-
- -## PaymentAmount - - - -

Fields

- - - - - - - - - - - - - - - - - -
NameDescription
-value
-UInt64! -
- -
-assetCode
-String! -
-

ISO 4217 currency code, e.g. USD

-
-assetScale
-UInt8! -
-

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

-
- -## RevokeGrantMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-id
-ID! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/auth/queries.md b/packages/documentation/src/content/docs/apis/auth/queries.md deleted file mode 100644 index 4c53ce0d33..0000000000 --- a/packages/documentation/src/content/docs/apis/auth/queries.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: Queries ---- - - - -## grant - -**Type:** [Grant!](/apis/auth/objects#grant) - -Fetch a grant - -

Arguments

- - - - - - - - - -
NameDescription
-id
-ID! -
- -
- -## grants - -**Type:** [GrantsConnection!](/apis/auth/objects#grantsconnection) - -Fetch a page of grants. - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-filter
-GrantFilter -
-

Filter grants based on specific criteria.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- diff --git a/packages/documentation/src/content/docs/apis/auth/scalars.md b/packages/documentation/src/content/docs/apis/auth/scalars.md deleted file mode 100644 index f404688a6e..0000000000 --- a/packages/documentation/src/content/docs/apis/auth/scalars.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Scalars ---- - - - -## Boolean - -The `Boolean` scalar type represents `true` or `false`. - -## ID - -The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. - -## Int - -The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. - -## String - -The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. - -## UInt64 - - - -## UInt8 - - - diff --git a/packages/documentation/src/content/docs/apis/backend/enums.md b/packages/documentation/src/content/docs/apis/backend/enums.md deleted file mode 100644 index eeca95bc29..0000000000 --- a/packages/documentation/src/content/docs/apis/backend/enums.md +++ /dev/null @@ -1,348 +0,0 @@ ---- -title: Enums ---- - - - -## Alg - - - -

Values

- - - - - - - - - -
ValueDescription
EdDSA - -
- -## Crv - - - -

Values

- - - - - - - - - -
ValueDescription
Ed25519 - -
- -## FeeType - - - -

Values

- - - - - - - - - - - - - -
ValueDescription
SENDING -

Sender pays the fees

-
RECEIVING -

Receiver pays the fees

-
- -## IncomingPaymentState - - - -

Values

- - - - - - - - - - - - - - - - - - - - - -
ValueDescription
PENDING -

The payment has a state of PENDING when it is initially created.

-
PROCESSING -

As soon as payment has started (funds have cleared into the account) the state moves to PROCESSING

-
COMPLETED -

The payment is either auto-completed once the received amount equals the expected incomingAmount, or it is completed manually via an API call.

-
EXPIRED -

If the payment expires before it is completed then the state will move to EXPIRED and no further payments will be accepted.

-
- -## Kty - - - -

Values

- - - - - - - - - -
ValueDescription
OKP - -
- -## LiquidityError - - - -

Values

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueDescription
AlreadyPosted - -
AlreadyVoided - -
AmountZero - -
InsufficientBalance - -
InvalidId - -
TransferExists - -
UnknownAsset - -
UnknownIncomingPayment - -
UnknownPayment - -
UnknownWalletAddress - -
UnknownPeer - -
UnknownTransfer - -
- -## OutgoingPaymentState - - - -

Values

- - - - - - - - - - - - - - - - - - - - - - - - - -
ValueDescription
FUNDING -

Will transition to SENDING once payment funds are reserved

-
SENDING -

Paying, will transition to COMPLETED on success

-
COMPLETED -

Successful completion

-
FAILED -

Payment failed

-
CANCELLED -

Payment cancelled

-
- -## PaymentType - - - -

Values

- - - - - - - - - - - - - -
ValueDescription
INCOMING - -
OUTGOING - -
- -## SortOrder - - - -

Values

- - - - - - - - - - - - - -
ValueDescription
ASC -

Choose ascending order for results.

-
DESC -

Choose descending order for results.

-
- -## TransferType - - - -

Values

- - - - - - - - - - - - - - - - - -
ValueDescription
DEPOSIT -

Deposit transfer type.

-
WITHDRAWAL -

Withdrawal transfer type.

-
TRANSFER -

Transfer type.

-
- -## WalletAddressStatus - - - -

Values

- - - - - - - - - - - - - -
ValueDescription
INACTIVE -

Status after deactivating

-
ACTIVE -

Default status

-
- diff --git a/packages/documentation/src/content/docs/apis/backend/inputObjects.md b/packages/documentation/src/content/docs/apis/backend/inputObjects.md deleted file mode 100644 index 067b5f34cb..0000000000 --- a/packages/documentation/src/content/docs/apis/backend/inputObjects.md +++ /dev/null @@ -1,1776 +0,0 @@ ---- -title: Input objects ---- - - - -## AdditionalPropertyInput - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-key
-String! -
- -
-value
-String! -
- -
-visibleInOpenPayments
-Boolean! -
- -
- -## AmountInput - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-value
-UInt64! -
- -
-assetCode
-String! -
-

ISO 4217 currency code, e.g. USD

-
-assetScale
-UInt8! -
-

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

-
- -## CancelOutgoingPaymentInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Outgoing payment id

-
-reason
-String -
-

Reason why this Outgoing Payment has been cancelled. This value will be publicly visible in the metadata field if this outgoing payment is requested through Open Payments.

-
- -## CreateAssetInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-code
-String! -
-

ISO 4217 currency code, e.g. USD

-
-scale
-UInt8! -
-

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

-
-withdrawalThreshold
-UInt64 -
-

Minimum amount of liquidity that can be withdrawn from the asset

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if liquidity falls below this value

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateAssetLiquidityWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-assetId
-String! -
-

The id of the asset to create the withdrawal for.

-
-amount
-UInt64! -
-

Amount of withdrawal.

-
-id
-String! -
-

The id of the withdrawal.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-timeoutSeconds
-UInt64! -
-

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

-
- -## CreateIncomingPaymentInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
-

Id of the wallet address under which the incoming payment will be created

-
-expiresAt
-String -
-

Expiration date-time

-
-metadata
-JSONObject -
-

Additional metadata associated with the incoming payment.

-
-incomingAmount
-AmountInput -
-

Maximum amount to be received

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateIncomingPaymentWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-incomingPaymentId
-String! -
-

The id of the incoming payment to withdraw from.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-timeoutSeconds
-UInt64! -
-

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

-
- -## CreateOrUpdatePeerByUrlInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-maxPacketAmount
-UInt64 -
-

Maximum packet amount that the peer accepts

-
-assetId
-String! -
-

Asset id of peering relationship

-
-peerUrl
-String! -
-

Peer's URL address at which the peer accepts auto-peering requests

-
-name
-String -
-

Peer's internal name for overriding auto-peer's default naming

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

-
-liquidityToDeposit
-UInt64 -
-

Amount of liquidity to deposit for peer

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateOutgoingPaymentFromIncomingPaymentInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
-

Id of the wallet address under which the outgoing payment will be created

-
-incomingPayment
-String! -
-

Incoming payment url to create the outgoing payment from

-
-debitAmount
-AmountInput! -
-

Amount to send (fixed send)

-
-metadata
-JSONObject -
-

Additional metadata associated with the outgoing payment.

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateOutgoingPaymentInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
-

Id of the wallet address under which the outgoing payment will be created

-
-quoteId
-String! -
-

Id of the corresponding quote for that outgoing payment

-
-metadata
-JSONObject -
-

Additional metadata associated with the outgoing payment.

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateOutgoingPaymentWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-outgoingPaymentId
-String! -
-

The id of the outgoing payment to withdraw from.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-timeoutSeconds
-UInt64! -
-

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

-
- -## CreatePeerInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-maxPacketAmount
-UInt64 -
-

Maximum packet amount that the peer accepts

-
-http
-HttpInput! -
-

Peering connection details

-
-assetId
-String! -
-

Asset id of peering relationship

-
-staticIlpAddress
-String! -
-

Peer's ILP address

-
-name
-String -
-

Peer's internal name

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

-
-initialLiquidity
-UInt64 -
-

Initial amount of liquidity to deposit for peer

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreatePeerLiquidityWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-peerId
-String! -
-

The id of the peer to create the withdrawal for.

-
-amount
-UInt64! -
-

Amount of withdrawal.

-
-id
-String! -
-

The id of the withdrawal.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-timeoutSeconds
-UInt64! -
-

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

-
- -## CreateQuoteInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
-

Id of the wallet address under which the quote will be created

-
-debitAmount
-AmountInput -
-

Amount to send (fixed send)

-
-receiveAmount
-AmountInput -
-

Amount to receive (fixed receive)

-
-receiver
-String! -
-

Wallet address URL of the receiver

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateReceiverInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressUrl
-String! -
-

Receiving wallet address URL

-
-expiresAt
-String -
-

Expiration date-time

-
-incomingAmount
-AmountInput -
-

Maximum amount to be received

-
-metadata
-JSONObject -
-

Additional metadata associated with the incoming payment.

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateWalletAddressInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-assetId
-String! -
-

Asset of the wallet address

-
-url
-String! -
-

Wallet Address URL

-
-publicName
-String -
-

Public name associated with the wallet address

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-additionalProperties
-[AdditionalPropertyInput!] -
-

Additional properties associated with the [walletAddress].

-
- -## CreateWalletAddressKeyInput - - - -

Arguments

- - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
- -
-jwk
-JwkInput! -
-

Public key

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## CreateWalletAddressWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-walletAddressId
-String! -
-

The id of the Open Payments wallet address to create the withdrawal for.

-
-id
-String! -
-

The id of the withdrawal.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-timeoutSeconds
-UInt64! -
-

This is the interval in seconds after a pending transfer's created at which it may be posted or voided. Zero denotes a no timeout single-phase posted transfer.

-
- -## DeleteAssetInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Asset id

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## DeletePeerInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-id
-ID! -
- -
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## DepositAssetLiquidityInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-assetId
-String! -
-

The id of the asset to deposit liquidity.

-
-amount
-UInt64! -
-

Amount of liquidity to deposit.

-
-id
-String! -
-

The id of the transfer.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## DepositEventLiquidityInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-eventId
-String! -
-

The id of the event to deposit into.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## DepositOutgoingPaymentLiquidityInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-outgoingPaymentId
-String! -
-

The id of the outgoing payment to deposit into.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## DepositPeerLiquidityInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-peerId
-String! -
-

The id of the peer to deposit liquidity.

-
-amount
-UInt64! -
-

Amount of liquidity to deposit.

-
-id
-String! -
-

The id of the transfer.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## FeeDetails - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-fixed
-UInt64! -
-

A flat fee

-
-basisPoints
-Int! -
-

Basis points fee. Should be between 0 and 10000 (inclusive). 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100%

-
- -## FilterString - - - -

Arguments

- - - - - - - - - -
NameDescription
-in
-[String!]! -
- -
- -## HttpIncomingInput - - - -

Arguments

- - - - - - - - - -
NameDescription
-authTokens
-[String!]! -
-

Array of auth tokens accepted by this Rafiki instance

-
- -## HttpInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-incoming
-HttpIncomingInput -
-

Incoming connection details

-
-outgoing
-HttpOutgoingInput! -
-

Outgoing connection details

-
- -## HttpOutgoingInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-authToken
-String! -
-

Auth token to present at the peering Rafiki instance

-
-endpoint
-String! -
-

Peer's connection endpoint

-
- -## JwkInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-kid
-String! -
-

Key id

-
-x
-String! -
-

Base64 url-encoded public key.

-
-alg
-Alg! -
-

Cryptographic algorithm family used with the key. The only allowed value is EdDSA.

-
-kty
-Kty! -
-

Key type. The only allowed value is OKP.

-
-crv
-Crv! -
-

Curve that the key pair is derived from. The only allowed value is Ed25519.

-
- -## PaymentFilter - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-type
-FilterString -
- -
-walletAddressId
-FilterString -
- -
- -## PostLiquidityWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-withdrawalId
-String! -
-

The id of the liquidity withdrawal to post.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## RevokeWalletAddressKeyInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-id
-String! -
-

Internal id of key

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## SetFeeInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-assetId
-ID! -
-

Asset id to add the fee to

-
-type
-FeeType! -
-

Type of fee (sending or receiving)

-
-fee
-FeeDetails! -
-

Fee values

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## TriggerWalletAddressEventsInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-limit
-Int! -
-

Maximum number of events being triggered (n).

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## UpdateAssetInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-String! -
-

Asset id

-
-withdrawalThreshold
-UInt64 -
-

New minimum amount of liquidity that can be withdrawn from the asset

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if liquidity falls below this new value

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## UpdatePeerInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-String! -
-

Peer id

-
-maxPacketAmount
-UInt64 -
-

New maximum packet amount that the peer accepts

-
-http
-HttpInput -
-

New peering connection details

-
-staticIlpAddress
-String -
-

Peer's new ILP address

-
-name
-String -
-

Peer's new public name

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this new value

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## UpdateWalletAddressInput - - - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

ID of wallet address to update

-
-publicName
-String -
-

New public name for wallet address

-
-status
-WalletAddressStatus -
-

New status to set the wallet address to

-
-idempotencyKey
-String -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
-additionalProperties
-[AdditionalPropertyInput!] -
-

List additional properties associated with this wallet address.

-
- -## VoidLiquidityWithdrawalInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-withdrawalId
-String! -
-

The id of the liquidity withdrawal to void.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- -## WebhookEventFilter - - - -

Arguments

- - - - - - - - - -
NameDescription
-type
-FilterString -
- -
- -## WithdrawEventLiquidityInput - - - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-eventId
-String! -
-

The id of the event to withdraw from.

-
-idempotencyKey
-String! -
-

Unique key to ensure duplicate or retried requests are processed only once. See idempotence

-
- diff --git a/packages/documentation/src/content/docs/apis/backend/interfaces.md b/packages/documentation/src/content/docs/apis/backend/interfaces.md deleted file mode 100644 index 81868d9668..0000000000 --- a/packages/documentation/src/content/docs/apis/backend/interfaces.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: Interfaces ---- - - - -## BasePayment - - - -

Implemented by

- -- [IncomingPayment](/apis/backend/objects#incomingpayment) -- [OutgoingPayment](/apis/backend/objects#outgoingpayment) -- [Payment](/apis/backend/objects#payment) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
- -
-walletAddressId
-ID! -
- -
-metadata
-JSONObject -
- -
-createdAt
-String! -
- -
-client
-String -
- -
- -## Model - - - -

Implemented by

- -- [Asset](/apis/backend/objects#asset) -- [Peer](/apis/backend/objects#peer) -- [WalletAddress](/apis/backend/objects#walletaddress) -- [IncomingPayment](/apis/backend/objects#incomingpayment) -- [OutgoingPayment](/apis/backend/objects#outgoingpayment) -- [Payment](/apis/backend/objects#payment) -- [AccountingTransfer](/apis/backend/objects#accountingtransfer) -- [WalletAddressKey](/apis/backend/objects#walletaddresskey) -- [WebhookEvent](/apis/backend/objects#webhookevent) -- [Fee](/apis/backend/objects#fee) - -

Fields

- - - - - - - - - - - - - -
NameDescription
-id
-ID! -
- -
-createdAt
-String! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/backend/mutations.md b/packages/documentation/src/content/docs/apis/backend/mutations.md deleted file mode 100644 index 82b821618e..0000000000 --- a/packages/documentation/src/content/docs/apis/backend/mutations.md +++ /dev/null @@ -1,723 +0,0 @@ ---- -title: Mutations ---- - - - -## cancelOutgoingPayment - -**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) - -Cancel Outgoing Payment - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CancelOutgoingPaymentInput! -
- -
- -## createAsset - -**Type:** [AssetMutationResponse!](/apis/backend/objects#assetmutationresponse) - -Create an asset - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateAssetInput! -
- -
- -## createAssetLiquidityWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) - -Withdraw asset liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateAssetLiquidityWithdrawalInput! -
- -
- -## createIncomingPayment - -**Type:** [IncomingPaymentResponse!](/apis/backend/objects#incomingpaymentresponse) - -Create an internal Open Payments Incoming Payment. The receiver has a wallet address on this Rafiki instance. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateIncomingPaymentInput! -
- -
- -## createIncomingPaymentWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) - -Withdraw incoming payment liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateIncomingPaymentWithdrawalInput! -
- -
- -## createOrUpdatePeerByUrl - -**Type:** [CreateOrUpdatePeerByUrlMutationResponse!](/apis/backend/objects#createorupdatepeerbyurlmutationresponse) - -Create a peer using a URL - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateOrUpdatePeerByUrlInput! -
- -
- -## createOutgoingPayment - -**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) - -Create an Open Payments Outgoing Payment - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateOutgoingPaymentInput! -
- -
- -## createOutgoingPaymentFromIncomingPayment - -**Type:** [OutgoingPaymentResponse!](/apis/backend/objects#outgoingpaymentresponse) - -Create an Open Payments Outgoing Payment from an incoming payment - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateOutgoingPaymentFromIncomingPaymentInput! -
- -
- -## createOutgoingPaymentWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) - -Withdraw outgoing payment liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateOutgoingPaymentWithdrawalInput! -
- -
- -## createPeer - -**Type:** [CreatePeerMutationResponse!](/apis/backend/objects#createpeermutationresponse) - -Create a peer - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreatePeerInput! -
- -
- -## createPeerLiquidityWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) - -Withdraw peer liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreatePeerLiquidityWithdrawalInput! -
- -
- -## createQuote - -**Type:** [QuoteResponse!](/apis/backend/objects#quoteresponse) - -Create an Open Payments Quote - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateQuoteInput! -
- -
- -## createReceiver - -**Type:** [CreateReceiverResponse!](/apis/backend/objects#createreceiverresponse) - -Create an internal or external Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateReceiverInput! -
- -
- -## createWalletAddress - -**Type:** [CreateWalletAddressMutationResponse!](/apis/backend/objects#createwalletaddressmutationresponse) - -Create a wallet address - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateWalletAddressInput! -
- -
- -## createWalletAddressKey - -**Type:** [CreateWalletAddressKeyMutationResponse](/apis/backend/objects#createwalletaddresskeymutationresponse) - -Add a public key to a wallet address that is used to verify Open Payments requests. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateWalletAddressKeyInput! -
- -
- -## createWalletAddressWithdrawal - -**Type:** [WalletAddressWithdrawalMutationResponse](/apis/backend/objects#walletaddresswithdrawalmutationresponse) - -Withdraw liquidity from a wallet address received via Web Monetization. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-CreateWalletAddressWithdrawalInput! -
- -
- -## deleteAsset - -**Type:** [DeleteAssetMutationResponse!](/apis/backend/objects#deleteassetmutationresponse) - -Delete an asset - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DeleteAssetInput! -
- -
- -## deletePeer - -**Type:** [DeletePeerMutationResponse!](/apis/backend/objects#deletepeermutationresponse) - -Delete a peer - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DeletePeerInput! -
- -
- -## depositAssetLiquidity - -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) - -Deposit asset liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DepositAssetLiquidityInput! -
- -
- -## depositEventLiquidity - -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) - -> Deprecated: Use `depositOutgoingPaymentLiquidity` - -Deposit webhook event liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DepositEventLiquidityInput! -
- -
- -## depositOutgoingPaymentLiquidity - -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) - -Deposit outgoing payment liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DepositOutgoingPaymentLiquidityInput! -
- -
- -## depositPeerLiquidity - -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) - -Deposit peer liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-DepositPeerLiquidityInput! -
- -
- -## postLiquidityWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) - -Post liquidity withdrawal. Withdrawals are two-phase commits and are committed via this mutation. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-PostLiquidityWithdrawalInput! -
- -
- -## revokeWalletAddressKey - -**Type:** [RevokeWalletAddressKeyMutationResponse](/apis/backend/objects#revokewalletaddresskeymutationresponse) - -Revoke a public key associated with a wallet address. Open Payment requests using this key for request signatures will be denied going forward. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-RevokeWalletAddressKeyInput! -
- -
- -## setFee - -**Type:** [SetFeeResponse!](/apis/backend/objects#setfeeresponse) - -Set the fee on an asset - -

Arguments

- - - - - - - - - -
NameDescription
-input
-SetFeeInput! -
- -
- -## triggerWalletAddressEvents - -**Type:** [TriggerWalletAddressEventsMutationResponse!](/apis/backend/objects#triggerwalletaddresseventsmutationresponse) - -If automatic withdrawal of funds received via Web Monetization by the wallet address are disabled, this mutation can be used to trigger up to n withdrawal events. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-TriggerWalletAddressEventsInput! -
- -
- -## updateAsset - -**Type:** [AssetMutationResponse!](/apis/backend/objects#assetmutationresponse) - -Update an asset - -

Arguments

- - - - - - - - - -
NameDescription
-input
-UpdateAssetInput! -
- -
- -## updatePeer - -**Type:** [UpdatePeerMutationResponse!](/apis/backend/objects#updatepeermutationresponse) - -Update a peer - -

Arguments

- - - - - - - - - -
NameDescription
-input
-UpdatePeerInput! -
- -
- -## updateWalletAddress - -**Type:** [UpdateWalletAddressMutationResponse!](/apis/backend/objects#updatewalletaddressmutationresponse) - -Update a wallet address - -

Arguments

- - - - - - - - - -
NameDescription
-input
-UpdateWalletAddressInput! -
- -
- -## voidLiquidityWithdrawal - -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) - -Void liquidity withdrawal. Withdrawals are two-phase commits and are rolled back via this mutation. - -

Arguments

- - - - - - - - - -
NameDescription
-input
-VoidLiquidityWithdrawalInput! -
- -
- -## withdrawEventLiquidity - -**Type:** [LiquidityMutationResponse](/apis/backend/objects#liquiditymutationresponse) - -> Deprecated: Use `createOutgoingPaymentWithdrawal, createIncomingPaymentWithdrawal, or createWalletAddressWithdrawal` - -Withdraw webhook event liquidity - -

Arguments

- - - - - - - - - -
NameDescription
-input
-WithdrawEventLiquidityInput! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/backend/objects.md b/packages/documentation/src/content/docs/apis/backend/objects.md deleted file mode 100644 index 39212c93ae..0000000000 --- a/packages/documentation/src/content/docs/apis/backend/objects.md +++ /dev/null @@ -1,2698 +0,0 @@ ---- -title: Objects ---- - - - -## AccountingTransfer - - - -

Implements

- -- [Model](/apis/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Payment id

-
-debitAccountId
-ID! -
-

Debit account id

-
-creditAccountId
-ID! -
-

Credit account id

-
-amount
-UInt64! -
-

Amount sent (fixed send)

-
-transferType
-TransferType! -
-

Type of accounting transfer

-
-ledger
-UInt8! -
-

Identifier that partitions the sets of accounts that can transact with each other.

-
-createdAt
-String! -
-

Date-time of creation

-
- -## AccountingTransferConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-debits
-[AccountingTransfer!]! -
- -
-credits
-[AccountingTransfer!]! -
- -
- -## AdditionalProperty - - - -

Fields

- - - - - - - - - - - - - - - - - -
NameDescription
-key
-String! -
- -
-value
-String! -
- -
-visibleInOpenPayments
-Boolean! -
- -
- -## Amount - - - -

Fields

- - - - - - - - - - - - - - - - - -
NameDescription
-value
-UInt64! -
- -
-assetCode
-String! -
-

ISO 4217 currency code, e.g. USD

-
-assetScale
-UInt8! -
-

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

-
- -## Asset - - - -

Implements

- -- [Model](/apis/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Asset id

-
-code
-String! -
-

ISO 4217 currency code, e.g. USD

-
-scale
-UInt8! -
-

Difference in orders of magnitude between the standard unit of an asset and a corresponding fractional unit

-
-liquidity
-UInt64 -
-

Available liquidity

-
-withdrawalThreshold
-UInt64 -
-

Minimum amount of liquidity that can be withdrawn from the asset

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if liquidity falls below this value

-
-receivingFee
-Fee -
-

The receiving fee structure for the asset

-
-sendingFee
-Fee -
-

The sending fee structure for the asset

-
-fees
-FeesConnection -
-

Fetch a page of asset fees

- -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -
-createdAt
-String! -
-

Date-time of creation

-
- -## AssetEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Asset! -
- -
-cursor
-String! -
- -
- -## AssetMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-asset
-Asset -
- -
- -## AssetsConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[AssetEdge!]! -
- -
- -## CreateOrUpdatePeerByUrlMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-peer
-Peer -
- -
- -## CreatePeerMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-peer
-Peer -
- -
- -## CreateReceiverResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-receiver
-Receiver -
- -
- -## CreateWalletAddressKeyMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-walletAddressKey
-WalletAddressKey -
- -
- -## CreateWalletAddressMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-walletAddress
-WalletAddress -
- -
- -## DeleteAssetMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-asset
-Asset -
- -
- -## DeletePeerMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-success
-Boolean! -
- -
- -## Fee - - - -

Implements

- -- [Model](/apis/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Fee id

-
-assetId
-ID! -
-

Asset id associated with the fee

-
-type
-FeeType! -
-

Type of fee (sending or receiving)

-
-fixed
-UInt64! -
-

Fixed fee

-
-basisPoints
-Int! -
-

Basis points fee. 1 basis point = 0.01%, 100 basis points = 1%, 10000 basis points = 100%

-
-createdAt
-String! -
-

Date-time of creation

-
- -## FeeEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Fee! -
- -
-cursor
-String! -
- -
- -## FeesConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[FeeEdge!]! -
- -
- -## Http - - - -

Fields

- - - - - - - - - -
NameDescription
-outgoing
-HttpOutgoing! -
-

Outgoing connection details

-
- -## HttpOutgoing - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-authToken
-String! -
-

Auth token to present at the peering Rafiki instance

-
-endpoint
-String! -
-

Peer's connection endpoint

-
- -## IncomingPayment - - - -

Implements

- -- [BasePayment](/apis/backend/interfaces#basepayment) -- [Model](/apis/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Incoming Payment id

-
-walletAddressId
-ID! -
-

Id of the wallet address under which this incoming payment was created.

-
-client
-String -
-

Information about the wallet address of the Open Payments client that created the incoming payment.

-
-liquidity
-UInt64 -
-

Available liquidity

-
-state
-IncomingPaymentState! -
-

Incoming payment state

-
-expiresAt
-String! -
-

Date-time of expiry. After this time, the incoming payment will not accept further payments made to it.

-
-incomingAmount
-Amount -
-

The maximum amount that should be paid into the wallet address under this incoming payment.

-
-receivedAmount
-Amount! -
-

The total amount that has been paid into the wallet address under this incoming payment.

-
-metadata
-JSONObject -
-

Additional metadata associated with the incoming payment.

-
-createdAt
-String! -
-

Date-time of creation

-
- -## IncomingPaymentConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[IncomingPaymentEdge!]! -
- -
- -## IncomingPaymentEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-IncomingPayment! -
- -
-cursor
-String! -
- -
- -## IncomingPaymentResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-payment
-IncomingPayment -
- -
- -## Jwk - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-kid
-String! -
-

Key id

-
-x
-String! -
-

Base64 url-encoded public key.

-
-alg
-Alg! -
-

Cryptographic algorithm family used with the key. The only allowed value is EdDSA.

-
-kty
-Kty! -
-

Key type. The only allowed value is OKP.

-
-crv
-Crv! -
-

Curve that the key pair is derived from. The only allowed value is Ed25519.

-
- -## LiquidityMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-success
-Boolean! -
- -
- -## OutgoingPayment - - - -

Implements

- -- [BasePayment](/apis/backend/interfaces#basepayment) -- [Model](/apis/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Outgoing payment id

-
-walletAddressId
-ID! -
-

Id of the wallet address under which this outgoing payment was created

-
-client
-String -
-

Information about the wallet address of the Open Payments client that created the outgoing payment.

-
-liquidity
-UInt64 -
-

Available liquidity

-
-state
-OutgoingPaymentState! -
-

Outgoing payment state

-
-error
-String -
- -
-stateAttempts
-Int! -
- -
-debitAmount
-Amount! -
-

Amount to send (fixed send)

-
-receiveAmount
-Amount! -
-

Amount to receive (fixed receive)

-
-receiver
-String! -
-

Wallet address URL of the receiver

-
-metadata
-JSONObject -
-

Additional metadata associated with the outgoing payment.

-
-quote
-Quote -
-

Quote for this outgoing payment

-
-sentAmount
-Amount! -
-

Amount already sent

-
-createdAt
-String! -
-

Date-time of creation

-
-grantId
-String -
-

Id of the Grant under which this outgoing payment was created

-
- -## OutgoingPaymentConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[OutgoingPaymentEdge!]! -
- -
- -## OutgoingPaymentEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-OutgoingPayment! -
- -
-cursor
-String! -
- -
- -## OutgoingPaymentResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-payment
-OutgoingPayment -
- -
- -## PageInfo - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-endCursor
-String -
-

Paginating forwards: the cursor to continue.

-
-hasNextPage
-Boolean! -
-

Paginating forwards: Are there more pages?

-
-hasPreviousPage
-Boolean! -
-

Paginating backwards: Are there more pages?

-
-startCursor
-String -
-

Paginating backwards: the cursor to continue.

-
- -## Payment - - - -

Implements

- -- [BasePayment](/apis/backend/interfaces#basepayment) -- [Model](/apis/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Payment id

-
-type
-PaymentType! -
-

Type of payment

-
-walletAddressId
-ID! -
-

Id of the wallet address under which this payment was created

-
-client
-String -
-

Information about the wallet address of the Open Payments client that created the payment.

-
-state
-String! -
-

Either the IncomingPaymentState or OutgoingPaymentState according to type

-
-liquidity
-UInt64 -
-

Available liquidity

-
-metadata
-JSONObject -
-

Additional metadata associated with the payment.

-
-createdAt
-String! -
-

Date-time of creation

-
- -## PaymentConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[PaymentEdge!]! -
- -
- -## PaymentEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Payment! -
- -
-cursor
-String! -
- -
- -## Peer - - - -

Implements

- -- [Model](/apis/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Peer id

-
-maxPacketAmount
-UInt64 -
-

Maximum packet amount that the peer accepts

-
-http
-Http! -
-

Peering connection details

-
-asset
-Asset! -
-

Asset of peering relationship

-
-staticIlpAddress
-String! -
-

Peer's ILP address

-
-name
-String -
-

Peer's public name

-
-liquidityThreshold
-UInt64 -
-

Account Servicing Entity will be notified via a webhook event if peer liquidity falls below this value

-
-liquidity
-UInt64 -
-

Available liquidity

-
-createdAt
-String! -
-

Date-time of creation

-
- -## PeerEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Peer! -
- -
-cursor
-String! -
- -
- -## PeersConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[PeerEdge!]! -
- -
- -## Quote - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Quote id

-
-walletAddressId
-ID! -
-

Id of the wallet address under which this quote was created

-
-receiver
-String! -
-

Wallet address URL of the receiver

-
-debitAmount
-Amount! -
-

Amount to send (fixed send)

-
-receiveAmount
-Amount! -
-

Amount to receive (fixed receive)

-
-maxPacketAmount
-UInt64! -
-

Maximum value per packet allowed on the possible routes

-
-minExchangeRate
-Float! -
-

Aggregate exchange rate the payment is guaranteed to meet

-
-lowEstimatedExchangeRate
-Float! -
-

Lower bound of probed exchange rate

-
-highEstimatedExchangeRate
-Float! -
-

Upper bound of probed exchange rate

-
-createdAt
-String! -
-

Date-time of creation

-
-expiresAt
-String! -
-

Date-time of expiration

-
- -## QuoteConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[QuoteEdge!]! -
- -
- -## QuoteEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-Quote! -
- -
-cursor
-String! -
- -
- -## QuoteResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-quote
-Quote -
- -
- -## Receiver - - - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-String! -
-

Incoming payment URL

-
-walletAddressUrl
-String! -
-

Wallet address URL under which the incoming payment was created

-
-completed
-Boolean! -
-

Describes whether the incoming payment has completed receiving funds.

-
-incomingAmount
-Amount -
-

The maximum amount that should be paid into the wallet address under this incoming payment.

-
-receivedAmount
-Amount! -
-

The total amount that has been paid into the wallet address under this incoming payment.

-
-expiresAt
-String -
-

Date-time of expiry. After this time, the incoming payment will accept further payments made to it.

-
-metadata
-JSONObject -
-

Additional metadata associated with the incoming payment.

-
-createdAt
-String! -
-

Date-time of creation

-
-updatedAt
-String! -
-

Date-time of last update

-
- -## RevokeWalletAddressKeyMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-walletAddressKey
-WalletAddressKey -
- -
- -## SetFeeResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-fee
-Fee -
- -
- -## TriggerWalletAddressEventsMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-count
-Int -
-

Number of events triggered

-
- -## UpdatePeerMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-peer
-Peer -
- -
- -## UpdateWalletAddressMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-walletAddress
-WalletAddress -
- -
- -## WalletAddress - - - -

Implements

- -- [Model](/apis/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Wallet address id

-
-asset
-Asset! -
-

Asset of the wallet address

-
-liquidity
-UInt64 -
-

Available liquidity

-
-url
-String! -
-

Wallet Address URL

-
-publicName
-String -
-

Public name associated with the wallet address

-
-incomingPayments
-IncomingPaymentConnection -
-

List of incoming payments received by this wallet address

- -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -
-quotes
-QuoteConnection -
-

List of quotes created at this wallet address

- -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -
-outgoingPayments
-OutgoingPaymentConnection -
-

List of outgoing payments sent from this wallet address

- -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -
-createdAt
-String! -
-

Date-time of creation

-
-status
-WalletAddressStatus! -
-

Status of the wallet address

-
-walletAddressKeys
-WalletAddressKeyConnection -
-

List of keys associated with this wallet address

- -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -
-additionalProperties
-[AdditionalProperty] -
-

List additional properties associated with this wallet address.

-
- -## WalletAddressEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-WalletAddress! -
- -
-cursor
-String! -
- -
- -## WalletAddressesConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[WalletAddressEdge!]! -
- -
- -## WalletAddressKey - - - -

Implements

- -- [Model](/apis/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Internal id of key

-
-walletAddressId
-ID! -
-

Id of the wallet address to which this key belongs to

-
-jwk
-Jwk! -
-

Public key

-
-revoked
-Boolean! -
-

Indicator whether the key has been revoked

-
-createdAt
-String! -
-

Date-time of creation

-
- -## WalletAddressKeyConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[WalletAddressKeyEdge!]! -
- -
- -## WalletAddressKeyEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-WalletAddressKey! -
- -
-cursor
-String! -
- -
- -## WalletAddressWithdrawal - - - -

Fields

- - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Withdrawal Id

-
-amount
-UInt64! -
-

Amount to withdraw

-
-walletAddress
-WalletAddress! -
-

Wallet address details

-
- -## WalletAddressWithdrawalMutationResponse - - - -

Fields

- - - - - - - - - -
NameDescription
-withdrawal
-WalletAddressWithdrawal -
- -
- -## WebhookEvent - - - -

Implements

- -- [Model](/apis/backend/interfaces#model) - -

Fields

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
-id
-ID! -
-

Event id

-
-type
-String! -
-

Type of event

-
-data
-JSONObject! -
-

Stringified JSON data

-
-createdAt
-String! -
-

Date-time of creation

-
- -## WebhookEventsConnection - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-pageInfo
-PageInfo! -
- -
-edges
-[WebhookEventsEdge!]! -
- -
- -## WebhookEventsEdge - - - -

Fields

- - - - - - - - - - - - - -
NameDescription
-node
-WebhookEvent! -
- -
-cursor
-String! -
- -
- diff --git a/packages/documentation/src/content/docs/apis/backend/queries.md b/packages/documentation/src/content/docs/apis/backend/queries.md deleted file mode 100644 index c50ce737cf..0000000000 --- a/packages/documentation/src/content/docs/apis/backend/queries.md +++ /dev/null @@ -1,512 +0,0 @@ ---- -title: Queries ---- - - - -## accountingTransfers - -**Type:** [AccountingTransferConnection!](/apis/backend/objects#accountingtransferconnection) - -Fetch a page of accounting transfers - -

Arguments

- - - - - - - - - - - - - -
NameDescription
-id
-String! -
-

Account id.

-
-limit
-Int -
-

Limit the number of results returned. If no limit is provided, the default limit of 100_000 is set for TigerBeetle.

-
- -## asset - -**Type:** [Asset](/apis/backend/objects#asset) - -Fetch an asset - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## assets - -**Type:** [AssetsConnection!](/apis/backend/objects#assetsconnection) - -Fetch a page of assets. - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -## incomingPayment - -**Type:** [IncomingPayment](/apis/backend/objects#incomingpayment) - -Fetch an Open Payments incoming payment - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## outgoingPayment - -**Type:** [OutgoingPayment](/apis/backend/objects#outgoingpayment) - -Fetch an Open Payments outgoing payment - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## payments - -**Type:** [PaymentConnection!](/apis/backend/objects#paymentconnection) - -Fetch a page of combined payments - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
-filter
-PaymentFilter -
-

Filter payment events based on specific criteria.

-
- -## peer - -**Type:** [Peer](/apis/backend/objects#peer) - -Fetch a peer - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## peers - -**Type:** [PeersConnection!](/apis/backend/objects#peersconnection) - -Fetch a page of peers. - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -## quote - -**Type:** [Quote](/apis/backend/objects#quote) - -Fetch an Open Payments quote - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## receiver - -**Type:** [Receiver](/apis/backend/objects#receiver) - -Get an local or remote Open Payments Incoming Payment. The receiver has a wallet address on either this or another Open Payments resource server. - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## walletAddress - -**Type:** [WalletAddress](/apis/backend/objects#walletaddress) - -Fetch a wallet address. - -

Arguments

- - - - - - - - - -
NameDescription
-id
-String! -
- -
- -## walletAddresses - -**Type:** [WalletAddressesConnection!](/apis/backend/objects#walletaddressesconnection) - -Fetch a page of wallet addresses. - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
- -## webhookEvents - -**Type:** [WebhookEventsConnection!](/apis/backend/objects#webhookeventsconnection) - -Fetch a page of webhook events - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
-after
-String -
-

Paginating forwards: the cursor before the the requested page.

-
-before
-String -
-

Paginating backwards: the cursor after the the requested page.

-
-first
-Int -
-

Paginating forwards: The first n elements from the page.

-
-last
-Int -
-

Paginating backwards: The last n elements from the page.

-
-sortOrder
-SortOrder -
-

Ascending or descending order of creation.

-
-filter
-WebhookEventFilter -
-

Filter webhook events based on specific criteria.

-
- diff --git a/packages/documentation/src/content/docs/apis/backend/scalars.md b/packages/documentation/src/content/docs/apis/backend/scalars.md deleted file mode 100644 index 5c3b7b9369..0000000000 --- a/packages/documentation/src/content/docs/apis/backend/scalars.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Scalars ---- - - - -## Boolean - -The `Boolean` scalar type represents `true` or `false`. - -## Float - -The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). - -## ID - -The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. - -## Int - -The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. - -## JSONObject - - - -## String - -The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. - -## UInt64 - - - -## UInt8 - - - From c475a2671af640f435c629e2a366e09f341a0e59 Mon Sep 17 00:00:00 2001 From: Chen Hui Jing <1461498+huijing@users.noreply.github.com> Date: Wed, 21 Aug 2024 22:17:08 +0800 Subject: [PATCH 17/91] git ignore generated files --- packages/documentation/.gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/documentation/.gitignore b/packages/documentation/.gitignore index 513c995c5f..343d5e3e79 100644 --- a/packages/documentation/.gitignore +++ b/packages/documentation/.gitignore @@ -24,5 +24,5 @@ pnpm-debug.log* .vscode # generated docs -# src/content/docs/apis/graphql/auth/* -# src/content/docs/apis/graphql/backend/* +src/content/docs/apis/graphql/auth/* +src/content/docs/apis/graphql/backend/* From 9e8ce607c0615eca26bb9f5dc14f4d6a08599c61 Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Wed, 21 Aug 2024 16:19:57 -0500 Subject: [PATCH 18/91] docs: Imported first batch of Rafiki - Intro > Overview - Intro > ASE - Integration > Getting Started - Integration > Exchange Rates - Integration > IDP - Ran prettier to avoid the docs-pocalypse --- .../endpoints/exchange-rates.mdx | 112 +++++++++++++++++- .../deploy-to-prod/endpoints/idp.mdx | 88 +++++++++++++- .../content/docs/integration/get-started.mdx | 34 +++++- .../account-servicing-entities.mdx | 21 +++- .../content/docs/intro-to-rafiki/overview.mdx | 36 +++++- 5 files changed, 285 insertions(+), 6 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx index 959b3bfb5f..0dd3c87e2d 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx @@ -2,4 +2,114 @@ title: Exchange rates --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +import { CodeBlock } from '@interledger/docs-design-system' + +Every Interledger payment is preceded by a rate probe that estimates the costs for transferring value over the network from the sending account servicing entity to the receiving account servicing entity, which is assessed as a network fee. For the rate probe to succeed, you, as the account servicing entity, must provide your Rafiki instance with the current exchange rate. In addition, you may charge fees on top of the estimated fees for facilitating Interledger payments initiated by your account holders. + +Your endpoint must accept `GET` requests and respond in the following format: + +| Variable Name | Type | Description | Required | +| -------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------- | -------- | +| `base` | String | Asset code represented as ISO 4127 currency code e.g. `USD` | Y | +| `rates` | Object | Object containing `` pairs, e.g. `{EUR:0.8930}` | Y | +| `rates.` | Number | Exchange rate given `base` and `` | Y | + +A successful response will return a status code of `200`. Here is a simple example of a response for the `mock-account-servicing-entity`, which is included as a package bundled with your Rafiki instance. + +To configure your Rafiki instance to direct its rate probes to your endpoint, you must specify the URL of your endpoint in the `EXCHANGE_RATES_URL` environment variable. An OpenAPI specification of that endpoint can be found here. + +In addition, you will need to specify the `EXCHANGE_RATES_LIFETIME` environment variable, which determines how long your Rafiki instance will cache exchange rates. By caching exchange rates in Rafiki for a specified period, you will improve performance as Rafiki will not need to request the exchange rate from your endpoint for every payment. + +In addition, you must consider your slippage tolerance. As mentioned, before an Interledger payment is made, a rate probe provides a quote that estimates the cost of transferring value over the network. This cost includes fees that connector nodes of the network may charge in exchange rates or even as a forwarding fee for payments denominated in the same asset (e.g. USD). As exchange rates and fees charged by connectors fluctuate, there will likely be a variance between the estimated amount provided in the quote and the actual amount required when the payment is initiated. The default slippage is 1% but can be configured via the `SLIPPAGE` environment variable using a value between 0 and 1. Using the default slippage, a payment of \$1.01 will go through on an initial quote estimated at \$1.00, but payment will not be sent if the total, inclusive of exchange rate and network fees, amounts to \$1.02. + +Depending on the particular deployment of your Rafiki instance, these environment variables will be set in a `docker-compose.yaml` file or as part of a Helm chart. Refer to the [environment variables](/integration/deploy-to-prod/environment-variables) page for more details. + +## Fees + +You may charge fees on top of the estimated network fee for facilitating the transfer. You can specify fixed and variable fees per asset using the Backend Admin API or the Rafiki Admin application provided. How you structure those fees is entirely up to you. + +### Backend Admin API + +The following is an example of setting a fixed fee of 100 basis points using the `setFee` GraphQL mutation: + + + +```graphql +mutation SetFee($input: SetFeeInput!) { + setFee(input: $input) { + code + success + message + fee { + id + assetId + type + fixed + basisPoints + createdAt + } + } +} +``` + + + +A request is sent in JSON format specifying the `assetId`, `type`, `fixed`, and `basisPoints` variables: + +- `assetId` - A unique identifier assigned by Rafiki when the asset was created. +- `type` - The type of fee, either `SENDING` or `RECEIVING`. +- `fixed` - A flat, fixed fee. +- `basisPoints` - A variable fee. One basis point fee is equal to 0.01% of the total amount, 100 basis points = 1%, 10000 basis points = 100% + +These variables are used in the following request example: + + + +```json +{ + "input": { + "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", + "type": "SENDING", + "fee": { + "fixed": 100, + "basisPoints": 100 + } + } +} +``` + + + + + +```json +{ + "data": { + "setFee": { + "code": "200", + "success": true, + "message": "Fee set", + "fee": { + "id": "140fd9c0-8f14-4850-9724-102f04d97e69", + "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", + "type": "SENDING", + "fixed": "100", + "basisPoints": 100, + "createdAt": "2023-09-13T14:59:53.435Z" + } + } + } +} +``` + + + +### Rafiki Admin application + +You may also add fees via the Rafiki Admin application. + +

+ Needs link to Rafiki Admin User Guide +

diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx index 7a62651a5a..7ab02a2097 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx @@ -2,4 +2,90 @@ title: IDP --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +import { CodeBlock } from '@interledger/docs-design-system' + +An identity provider (IdP) is a system or service that manages user authentication, identity information, and consent. When you use your Google account credentials to “Sign in with Google” on an app or website, for example, Google is acting as your identity provider. + +To facilitate payments initiated by third party applications (clients) via the [Open Payments APIs](/components/open-payments) on your users' accounts, you must integrate your Rafiki instance with your IdP to handle user authentication and consent. This authentication and consent facilitates the authorization of grants to resources provided by Open Payments. The Rafiki `backend` package exposes the APIs for Open Payments, and the Rafiki `auth` package provides an Authorization Server (AS), which serves as a reference implementation of an opinionated version of the Grant Negotiation Authorization Protocol (GNAP) that authorizes requests to those APIs. + +The AS in the auth package extends its own API for integrating an IdP with Rafiki. This Auth Admin API, different from the Backend Admin API, facilitates interactions to obtain user consent, authorize a grant, fetch information about a particular grant, and communicate that a user has authorized a grant. An OpenAPI specification of these API endpoints can be found here. + +## Integrate IdP with Rafiki + +### Prerequisites + +To integrate your IdP with your Rafiki instance, you must define the following [environment variables](/integration/deploy-to-prod/environment-variables): + +`IDENTITY_SERVER_DOMAIN` : the URL the AS will redirect the user to complete an interaction and authorize a grant. + +`IDENTITY_SERVER_SECRET` : a shared secret between the AS and IdP that the AS will use to secure its IDP-related endpoints. The IdP must provide this secret when it sends requests to the AS. + +### Endpoints + +There are five main endpoints that facilitate the communication between the IdP and the AS after a pending grant request has been created. Each specific interaction of an endpoint is identified by an interaction `id` and an interaction `nonce`. Both the `id` and the `nonce` are provided as query parameters when the authorization server redirects to the IdP. + +The endpoints are called in the following sequence: + +#### Establish interaction session + +Called by the client and establishes an interactive session with the AS, which redirects the browser session to the IdP consent screen. + +| Method | URL | +| ------ | -------------------- | +| `GET` | /interact/:id/:nonce | + +#### Fetch grant information + +Called by the IdP and requests the AS for grant information to list out all of the access rights requested by the client. The access rights requested will be presented to the user on the consent screen. The response is served on the `INTERACTION_PORT`, which is 3009 by default. + +| Method | URL | +| ------ | ----------------- | +| `GET` | /grant/:id/:nonce | + +| Header | Description | Required | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `x-idp-secret` | Used to secure communication between IdP and AS using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | + +#### Accept or reject grant + +IdP communicates the user’s acceptance or rejection on the consent screen to the AS and then redirects to `GET /interact/:id/:nonce/finish`. The response is served on `INTERACTION_PORT`, which is 3009 by default. + +| Method | URL | +| ------ | ----------------- | +| `GET` | /grant/:id/:nonce | + +| Header | Description | Required | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `x-idp-secret` | Used to secure communication between IdP and AS using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | + +#### Finish interaction + +IdP ends the interaction initiated by `GET /interact/:id/:nonce` and redirects the browser session to the URI of the grant initialization request. A query parameter will indicate a failure, or on success, a SHA-256 hash parameter that the client can use to verify the successful interaction. + +| Method | URL | +| ------ | --------------------------- | +| `GET` | /interact/:id/:nonce/finish | + +| Query Parameters | Description | Required | +| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `id` | Interaction ID | Y | +| `nonce` | Interaction nonce | Y | +| `result` | Success or failure grant authorization. In case of success, the SHA-256 hash of the interaction is sent in the response along with `interact_ref` that identifies the interaction on the AS, and the URI of the grant initialization request. | Y | + +The following tables list examples of the different possible response types on this endpoint. + +| Response | Description | Example | +| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| Rejected | The interaction was rejected by the user. | `?result=grant_rejected` | +| Invalid | The grant was not in a state where it could be accepted or rejected (e.g., grant was already approved) | `?result=grant_invalid` | +| Success | The grant was successful with the following returned in the response:
  • A hash representing the SHA-256 hash of values provided by the client in the grant initialization request (`interact.finish.nonce`), and the values in the response returned from the AS (`interact.finish`).
  • The `interact_ref` that identifies the interaction on the AS alongside the hash
  • The URI of the grant initialization request (e.g., `https://www.auth-server.com`)
| `hash=p28jsq0Y2KK3WS__a42tavNC64ldGTBroywsWxT4md_jZQ1R\HZT8BOWYHcLmObM7XHPAdJzTZMtKBsaraJ64A &interact_ref=4IFWWIKYBC2PQ6U56NL1` | + +#### Continue grant + +The client requests a grant from the AS for an accepted interaction. The AS responds with an access token. + +| Method | URL | +| ------ | -------------------- | +| `POST` | /interact/:id/:nonce | diff --git a/packages/documentation/src/content/docs/integration/get-started.mdx b/packages/documentation/src/content/docs/integration/get-started.mdx index 802d039730..a35eebb172 100644 --- a/packages/documentation/src/content/docs/integration/get-started.mdx +++ b/packages/documentation/src/content/docs/integration/get-started.mdx @@ -2,4 +2,36 @@ title: Get started --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +:::caution +Rafiki is intended for use by Account Servicing Entities only and should not be used in production by non-regulated entities. +::: + +As an account servicing entity, you provide and maintain payment accounts for your customers via your ledger. By integrating Rafiki with your backend environment, you bring Interledger functionality to those accounts, enabling them to transact with other accounts on different ledgers connected by the Interledger network. + +## Prerequisites + +To deploy, integrate, and operate Rafiki with your backend production environment, you will need the following components running in your infrastructure: + +- + Docker + +- + Node JS version 20 (LTS) + + +If you will be deploying to the cloud, then you will need the following additional components in your environment: + +- [nginx](/integration/deploy-to-prod/deploy-to-cloud/nginx) (if deploying all containers to a single node) +- [Helm and Kubernetes](/integration/deploy-to-prod/deploy-to-cloud/helm-k8s) (if deploying containers across a distributed environment) + +## Configuration + +To make your customers’ accounts Interledger-enabled, you must configure your Rafiki instance with these endpoints and services: + +- [Exchange Rates](/integration/deploy-to-prod/endpoints/exchange-rates) +- [Webhook Events](/integration/deploy-to-prod/endpoints/webhook-events) +- [Identity Provider](/integration/deploy-to-prod/endpoints/idp) + +In addition, each account you manage on your ledger must be issued at least one [wallet address](/integration/deploy-to-prod/running-your-instance/creating-wallet-address) to send and receive payments across the Interledger network. diff --git a/packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx b/packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx index 70236c7308..caa0b948bd 100644 --- a/packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx +++ b/packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx @@ -2,4 +2,23 @@ title: Account servicing entities --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +An Account Servicing Entity (ASE) is an organization that provides and maintains payment accounts for payers and payees. These payers and payees are regulated within the jurisdictions they operate and can include a variety of financial institutions such as banks, digital wallet providers, and mobile money providers. + +Rafiki is software that removes the complexities of implementing the ILP stack. In this context, an ASE integrates Rafiki into their internal systems to enhance account features by enabling Interledger functionality on its users’ accounts. This integration allows ASEs to join the Interledger network efficiently and facilitates the seamless sending and receiving of payments. + +## Key functions of ASEs + +- **Regulatory compliance** - ASEs are responsible for onboarding account holders in compliance with regulatory requirements, such as performing Know Your Customer (KYC) checks, Anti-Money Laundering (AML) processes, and sanctions screening. +- **Account provision and maintenance** - ASEs manage the creation, upkeep, and security of payment accounts. This includes providing channels for account holders (individuals or businesses) to interact with their accounts via mobile apps, websites, and other interfaces. +- **Transaction handling** - ASEs handle deposits and withdrawals through various external payment methods such as bank transfers, credit cards, and other payment services. +- **Ledger management** - ASEs maintain a ledger of account balances and transaction histories for their account holders. +- **Authentication and consent** - Using the Open Payments standard, ASEs authenticate account holders and manage consents to grant secure access to their accounts. +- **API key management** - ASEs keep a record of the public keys used by account holders to access the Open Payments APIs, ensuring secure and authenticated transactions. + +## Examples of ASEs + +- **Banks** - Traditional financial institutions offering a wide range of payment services. +- **Digital wallets** - Software applications that store payment methods, card credentials, and personal information. A digital wallet is basically an electronic version of a physical wallet you would carry. +- **Mobile money** - Mobile payments system based on accounts held by a mobile operator and accessible from subscribers' mobile phones. The conversion of cash into electronic value (and vice versa) happens at retail stores (or agents). All transactions are authorized and recorded in real-time using SMS. diff --git a/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx b/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx index ddb1796996..b576ff004c 100644 --- a/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx +++ b/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx @@ -2,6 +2,38 @@ title: Overview --- -## Placeholder - Overview Heading Test +import { LinkOut } from '@interledger/docs-design-system' -Junk text +Rafiki is open-source software that allows Account Servicing Entities (ASEs) to enable Interledger functionality on its users’ accounts. It serves as a packaged solution for facilitating payments over the Interledger network. + +Implementing the Interledger Protocol stack can be complex and challenging. Rafiki simplifies this process by providing a reference implementation, reducing development overhead for ASEs, and fostering broader adoption of Interledger technology. + +## What Rafiki can help you do + +- **Issue of payment pointers** - Rafiki facilitates creating and managing payment pointers, enabling users to send and receive payments over the Interledger network. +- **Facilitate Interledger payments** - Rafiki facilitates sending and receiving payments using the Interledger Protocol (ILP). +- **Enable third-party access** - Rafiki allows ASEs to authorize third-party access for initiating payments and managing transaction data using the Open Payments standard. + +## What Rafiki is not + +Rafiki distinguishes itself as open-source software deployed by ASEs, rather than a platform, service, library, or standalone wallet. It provides the underlying infrastructure for Interledger functionality. + +:::caution +Rafiki is intended for use by Account Servicing Entities only and should not be used in production by non-regulated entities. +::: + +## Real-world usage examples + +- **Peer-to-peer payments** - Rafiki enables seamless peer-to-peer payments, including cross-currency transactions. Users can transfer funds directly to each other’s accounts, regardless of their respective currencies, leveraging the interoperability of the Interledger network. +- **eCommerce payments** - Rafiki facilitates eCommerce transactions for both one-time purchases and recurring subscriptions. ASEs can integrate Rafiki into their platforms to offer customers flexible payment options and streamline the checkout process. +- **Web Monetization** - Websites can implement Web Monetization, a browser API that enables the streaming of payments directly from web site visitors to site owners. Rafiki provides support for Web Monetization payment flows right out of the box. + +## Rafiki architecture + +At its most basic level, Rafiki is comprised of the following three services: + +- An authorization service that handles authorizing and authenticating incoming requests. +- A backend service that allows you to manage business logic, such as account management and balance tracking; facilitates third-party access to accounts via an Open Payments implementation; and simplifies peering with other nodes on the Interledger network. +- A front-end web application that allows Rafiki administrators to manage their Rafiki instance. + +For more detailed information on the components and architecture of Rafiki, see [Architecture](/components/architecture). From 218ac4400b334dabdc0b00e4dc9b8dde57069c0e Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Thu, 22 Aug 2024 15:26:39 +0200 Subject: [PATCH 19/91] docs: test-update --- .../public/img/localenv-databases.png | Bin 0 -> 119297 bytes .../documentation/public/img/localenv.png | Bin 0 -> 306410 bytes .../src/content/docs/playground/overview.mdx | 209 +++++++++++++++++- 3 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 packages/documentation/public/img/localenv-databases.png create mode 100644 packages/documentation/public/img/localenv.png diff --git a/packages/documentation/public/img/localenv-databases.png b/packages/documentation/public/img/localenv-databases.png new file mode 100644 index 0000000000000000000000000000000000000000..d9a7ea29cc866beff2f8e27b8a04bee49033b233 GIT binary patch literal 119297 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

>0w$9=EbgLlfvUzD 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%0DT@sl2~*4Ja5A2hz@RJ-@M*xcGEf8`j6ig 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 z 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%0Dfn4cU-L{?JYX^c`*e-9kT60#^ef)-S zt?g*;5ce68x?MYz$H*Js|G)OWJD%$Qk2gXhQA8Bcuty0UB7`Iyva?Dgdy^5-Kt?Gm z97JRvBlFnhYnHttqcRR66q0aXpX&SlW!(GoyZ1isa=|=B|9D*CQ1wLA)6bBy10v#5jRMbT5Sf zq$<>rJ{&(<;&txELO5y`h(PKw!uBtH%T~Udb6mwznODpQGkGVtL#Bd+QG?TsS(cTkSG z>+HoCo8$nA-Q?Z3ilX22+Uq0<)4??_OmEwR`2oWSn9N6jkC%Ypchn$LEBh>D@rD-* zVKictcel?fGHXsrF~qcAr5KFVnak0$F4ObC>?ar?jwfcFo4{l`4iuUGoly9-EjGs_ zY+CnGhpyQqIwCvM1O2*Bl&XCtatMn`4qIZ0!XB5Ndn|UQqf(AS(P`@4rIDuCSR2iq zXjX+9FFCTI5AL;Pgo)lM$gMp;k8e35cX2nQxg5ywVhaBBenP8_ygSA)#Ek&9_+!ph zw9KfweQTT*QZ1rx{zna9SAOCm9R4tWzi7W!{X;JCj>KVtT)24KagS0BkX*du(;ZJa_tmzP)vX*j!Le{ z#gEI--y7-4eXTlxeiqcb4d@S$5%0bgr?KiI6B))5w$;cOu^R5VX95~kh zTD>v40kIjm^`e=e$=~Tr;1Gu=y;?R ztdij@>X;g3(6$AZ8^H#8V~u6w(eCP^H+WPaDTpCT2h7i{m5-y6*frLM1oKH^Qnc|% zNsIZPVxX3dfa0RI=2L-U0}_t8&qXB{^v)=fC&@5B_bfWAnVW&$sc>#~kJg1II(5!F z!H^jZZh0o_L!wgRYSd^mjkSB3r8 z<Ir4Nzo(kLQY=!b5PS#6}tEMwW;Kr4D?*8aA)r?i-~`iIzT#< zShZ9uG1fiA# zQrP#Sz|(FBdw+Zw2EL?vB&4uIuRycI9Do&NEjV^G{EYEFfvj{rXwi>$9uS_n*p#x& z1x?XT&`!9FzKLQ3ju5|Ip?$a6D%{zf?aw}3b9jFa+{7i-POh3?c4guAwQ=e11A0)+s;Xb}m*MaiLu)qB2ic`}1tDWuq<^pB zwK``R%{v(A>pe3H9A7r+On2eLCZzOQ_iDZf5Gn(^L=GIY4-~Nr+u31}JcG}M|G5yq zzQ_y8olp@n!F4~wuYaCg#3CjlFsN#xmW&sA>$4KQe#49{%(5B*3fJ#o$%8nPEYggsJT18sp+BrA` z{OyOKqnE)CNnCQAA^j;UjDO^6Mtocyn6nMg?bnd$SqwxO!rL=14>D_;5ah2<-i{b<2oG;l64!$^nRk^l1w)d#)M+_Xq!9-@YjxZla%QBjNg<=H z1Tgeq3*gx!qvd9YHVKbGU+beqXQYJ@!epEGFTKXN7-x7Z+-r;JWf3R(U!wfiPla^M zsIh)OB!9B*p#++gN~`|9sc{e~kv0hCr%67Ie;O3OKTgjFCfCQLAc74q0Ei- zLT+!O z>4jgWM(t&I&CK$xrO8uB7xhnl#hM888VXBJtQD6VmS{88HT)mjwH-s$c$5z z0_i)$$D3wA1W>b|7tB#R_tL6KWfIN7Ga;41vR!|=O}}leT~uIe5d=%qZSu?k)VN(| ze}Q%E>!?#oNFQ_PC-7i`qX@bbAXqEx_!2$lCPaG^AO~bH8VyZ{Fn}n!xYYVoa{G}I z)3D#Tp1l{#fpFyF_S@H^9m8${D_8Xi@LPjn+3Hu8myYx_HxB{aX9!x{_&Zy_yt|X% zr1@#{1kzvmHAYw!$<9Kk=H%I6G}4K27Q)&7Bs6`r6sACq@hpBcKz*uclxeKLw3voN z<)|4#jaCaayNq+oV97~hi$)lZOfMpE5<@#qq*peuwy~!$C-=_m$YWZFd)l~bc@qOS zM+%Hzr`JcG{c=9mSim=_nX_o*iY(spBUNokn(l=?gr|+5f)xAU%Sn_lz@q5^Fy8GV z*qmHhZSofrrsRVk*AVbH2PQLdp;AImS#&cqw0;6d;+<`j!C7+|u~C51OYx1RKDI7f ze6H&<9BSL!hTuJe83fI$GKzt0d$C4*We+WFpkojTN;Y7>L3-Gj+H+`j#*h`DA+W0_ z+fcR$dXopJqYOjs8-;5~HE222*r!lA*@O#m78v#FO=JL(EKJg7j|4B0*Z-V$61z(!P~MW{vI?Y_XCKuM<8BkWFE?D-j=z$wM-8~`-+M262qDY zp$K29dY?sFl{8VY`PZ>Ft7Fq1=Gw$DOb*xK=QG5*XX_sC+ z4`ILf@|$X*je+pZZ&~>HCY;DH0Biy$qx(p{@*hJj0zkI`fHk{=( zfMp%0Yg0)Ko}oz1WQwC;ojh;R(ROcD8AWa$B_o6!9lCLPTA^Cf@{*@447X8O;<2GI29E1}DHtpUilFQLpj^ zl!%;DR`bWMq{QhmMp>C#QAUo}#{{z}H7>ZF^>6?S+#}f@y@`ywfjIY#x+hgOK7)R> zUWqoW6!~MR!JYBF)(hhu^1$|tuWz?ZRM?5uu6g$UFX&}`%EA}%p@40%p8h(91!)rw zVfcIfw*VG#4JslH<^)ZUl!&*!J;ZII7zElao1oL&kF1Y#2SpCe@3l0aMfg;p|JWW4 zy@GE{XKognu(xUFT0vF4RGi|M(qr;rwa|2z!QKpD^0qF}eoe};U8+<-Ev>Q@plkQ~ zd$SFFOtM;c`9xY<^yJn}4hO5x{qIZl)h{>5h|RuPzJGa-BO(C~D(3@|J=YsC9N<<_ zzCaNFNXFVA^R1>$04)Y-l7`5u2lIebzKt}|F!&5*fIQIXw%PYPFndwu<%gND$Y&UO zC~8d%K;8->N8wMpyu?tZ8fCz$a_~+JrRcP0z#;K7>56(6RW%b{=e=}i?=r^BY~s_5 z?E^`xZ`}y!hV|!{NZ+%fb@e$Oyz)oTrtkRGMvZhW7QkH0y7Ru^K)HbQmxovcW1z#m z3lsHzfa2xXa1-!XwaEe47e5@<qGvKlzP zyGzXm;R~dkol&#EO3wwf&(--FSR<&<^R^tYw7dd*WMEkJL%DwScyy6QA?0vSz)Ag$ zLuM`o8=-CD&D%{P5EVbANjwCB>!BH+VPh}C_Xb^ngjVooe&B9jFo}6_43*MrKj9c+ zVoQdG#BA?uSNV#daWLGE64Ci?Lj%X(0emBT9$>O$EwVFoGU>RrjvM#F{DL8%;4@xG z|4h{eVIF8rzw|=d)NTYdB_({aV;9XvyRw!JEZ)VJjdGjl=|RxbWU*05<%w3D4ZI!8 zn&CY2p%rw3p-eqOh}?0)I1#RcnWun$w*YN`s!i*g)F8O-d*HbI%pD3ZeR?6q7f65d zocC_VaZ~+x^?o2QcwLdGYBLMX0BH0Kg7@lpE>UTcZaBPP`*DKp_gp1Bf0ME8q5(Z3 zYzi5^U|=me=O81+C!@*!2?)U^q;ig-T$bm$8X({?>H2Qo4_#RYU{c@3<0rLW;W&*D z2z-AGgl(V!C)?K^@zq5o7f|(kr=sR0mV^f9&%tRq3vBSY_NiqaL1wWikKw!!qazFZg!5I;NKhwG$0SjMFqd=Se zL^mX7BHe>bd{1ax+};=SPFsN6tgo}DV~{5l%5lq}tw}2&TC>{V9>~L~rFFIZP<5aG zO2xKJJ-_5kE`Nk$!}v7J6hciZU@=C2U3^grX8PMRuL9Pf68%@N0-8 z4Nz|_Ph5T#S(iIF1mzb-U_BZbc7s_Dp>yW1Js?zu9?SFYOnX)X#9(h<*p_T3MORb% zt(;kitC~dZ-FVL=n9IO1`gX2;6T{E$f@g(_UE3s0|ACXn0nkPmW%UX{0mA`2maY$L zkF*W4eVC`&%##WLA%^)`AQV0dZ7~xKbAvj@qT}yuYnD~Z&XWVcyF|Uw^(7S zeAT1H?G*946^8;;QZy@PjqQ4s2vQ{s#M%X`t4O0m_;zyhA)o|2b(_iR0^F@@aFpXx z8FsZyH_5R@4~Cy#Q4bWmWnpu#Ackwk!V0EreafLHtW5?gd};PbU4XXlO+dTzTz)_G`|JzN3{XN z?E|9DS>ddrT^*Tq(50gXg#|oK4%B=iWhkRgR~etCtwtIsXV6XdhvVg}i-u{R4HzT+ ztwF#aX&Dh^Omga6id;F64Ou1*-9j6!(?}?}1RAi#bDT2Fh%@dju;%+R+C<5ic6rHFue$-%Qlj-hSzNeadg_;d!McCzGUkh*E$-Lb zZWg6XgzNT_O=J5Bh7TwJrU&lZIr*L@!yWJhAmRc|Bxa$Loo^vOfYwzJmo<%R1jsnT z0nU531IC2KkLx4#VC|@0sV|{0*_815F7YbUYep20V!#96nU}F})!gLr z_D{GA$)))52)?p!SMkHn2H)?BypmjZn1vzl&7br`iDD&Ki%+|uf_(P0@^7Q_jEeTb&AtV>KI^baLTDvrU<+-(a94Z zHMR@Ag5dR_oWB;zEiBS+f`=qqv+wjy^mj+WmUUsk&9NQ77Ea<2*iA>6wLunsApS@t#YpwRDZc|2L%Jo{G11< ziaO{mnt8YPi`^jf80H2KpMo(yP1h{BB@-buF&GDFBUgEwSS)rNWbrvvkEwb;Kx6ux zFoOv?9OLUUPD81n33a1gsslHAPttpsv%ZQyK@e%K3saM(bFviM`hd;C4pOwIv4msu zFWWly35urZWS!%}oz;c5!bX6rSINHmSMnU&ee5|Z162e)(hZA00m-hySB5+~id*9sf?OW}PdH9kF}V?F%>t;x zNtDZ>Ua0U(Mq0_+rD+7ub1htNWURz^7z8KMMq#grkPhXCGa)?@Vo)Gj<(FQEt;Q$T zjQr4kh%j)8-GV~#>$!soon3AiZ?e*``_ydpkaa&uc?4CYET9~79%*H-wSNu_^AIF1 z5znziJB)zxfUTSPk*Xb1A+_fAcq3jL(MA{Om)G`)t_sO}G6eKO=?KD^Umbf`#t)MB zvI$_>RL4>)iMD+ExFA#ja+^-?jSbW)#}kzAJ$9iMKFh}zdou^)I-U}P?MGAr)OhY_ znK2O;w73*^_MY+q5XJn}$%d!FBYL%xmbniQ4Q-2iGY;~gOwYW22Wa9Ghs@$xAirn|k0!);Z z?!*{7&h;ZPoh}uv3R<8U-#!3*G8Es&F1&D6veywXNv$*~JtckmGFS%hgu=sI(@_z$ z#%oI!AahrVWbT}2@gnP24xW*Le~_Y_sK`e+b30hSC*H~!K_H#4vA`N>LsyFy@f1#= z-UdxcMU^T=+0>1n0h|@&c4ZI>})$O z`*yHvGZ1!jLcoZx( zfuzCe1J)s+!Vb4v#h!7Oz7sIxN5Xjh^%H}1^jPlqt8hbpf;j<*EKTt>Vst;Saftqy zer1r<-r-2TkCP_zfbBrR4n{a2d=JIuweW=q#s=D%BtUS>wzoCN5Qtl((hSX-vjI-Q zfAiaPb2cm{?!pW}NQ|HX#4H4tAqa|qOA$;C5(6DdSG|r2(>~)4<-@Z* z=9%|)L&ajO1IX^FA_1F}$q1QOF@R48brRHU4r&&6Y!R*xOJ>RJh3@>J8FZ>8c*%Cej59}4vD-C07+g}n+HVQsx?~BGIv~YXNMu+-sd2wCaWoh0m~FgCOoKF z2BBjI=`x?vq~3cI`S0s!lLn0-Fc=__bje}37I7%MSx;-XOy*|jJcnD?uO*Bai8lK% z2!lAl5f8_`#|vXL9wQO8Tu{30BT%Kw4e^Ehs2xBo&@H?!4a4k1^uvQhpIJ%VY)o~g z*#3;8zwstfm~^_qB85&R+owCu+weEH1&1|WbF-O+c;aIyC3McgKr1&b-=?<8uzD!p zek}TJ@J^hjz~DEa`VkSj0harbZ%I1#I{w}Vdh^WLAbAo7Yp>Xe)#LgO@Zc4l3G-y7 zB|V4@*UURov)B#)jRlam?u+T=wkp{5@RSpPg|W#gP{6Bsy`87P@xW)3Yl9VD22d24 zjeGeF%RFZMmmEbxzeAg1+=yU$iWOLjDQd~el8_xa0*w)AGm`ADQY1k=ik^eHgBuHK z@$#NN><_OUOujcbrhhY*{A zGtO#m3Z=axpvIS`7`Z&p1(p=$c&axJ7pIDZZKYoYbV59{;AbP^)QSA|S3Z=Ky`9=z zW1XFVn@KZVf)6vUheGo{xpee!a9~PT?&Trd=XNwPjHMaHX6W z`c-fpEih_8095d$`@9_>d{V%o(5h9I3ZrIK@WtIu$d9Y6zei5z9obg#9w17L#bOYK zi9p$2#fz0!?*|)%Ehn?^EzZ##aRd&3?}CZ_B$dP}0AD6YW7v2y8JgOz<_C`xFjok$gC~`eRi5)!C@*vtjz&z{Li^&l^RMb25V3ia6Ha*fg?b zcgSSgLB!2xML$i0r={c6o5!hxLsFDtMBoNjrcTbmTUqIqX9Av}|Ge4V|G z+DU~O!fg^8q4I@9Vx0`sIW2Mo0p-~CfbVSL+aGA0qBt!QDt$Z5gP2Vx&+M3dI4^}` z8YqF*@>{FER*euP`zrPVsbDDkF)ObbE(6&nBk&sHpx*b?I~%F0Y^X`zO>Q|J_V#{v z_kjodFzvXuB&Bd9Q04H%y+cv&o=QQTkbh?;lojAVr;wq0#E@pcQ1~j}Jq_~+hk2y& z$#AZ-C##Ur4zI1s`eidwu>j7{A8>}Vs?05JK`xl^GFkFdoe+YIk1%n3R?3ud=>AuT z(EQY#d{Xx5y^!n#jI=wx6pqb(D|t&k5SY10G49tKE7c4y$y12{bB`wwe}N+2HdhKU ziu*AG+O^47Je%{6o zp!~CtNUVeZ3{)Ni{Ulu=B@P5d2SuHgR{$3V4fU>dy9hL!QDlxsEiz(6Z+^4s9>?^s z_4(;(k}D?Qou!;*O-X{xxlAA{Uj3onyD0v7`1~o$o}on7cAS}E-*eYrJU^qp-x*pl zLYCV2xxcfCsg%G`5vFb8{e(mD z1uu66L?jOZW>fv;clpw>NOHND&G$)JM(DU4t zvuQoax8sj_Av3B1Fmc_nP2dmAFgLtVkuq}hJxGsIW4?a;F=q0rAvM?|Ln!4VfD6-% zU`%l==gf8PJO+|1{bYTxni3!dgEh&;Vh@^xL8*f($*%oWw&~tn8D1CodcA7KeWL~w zn5+jL7lRit3of@$WT&tznA=Ct!$PPOo%jKufI+~CnpX1{Bq`86nSGF{KJO5EF>@Fa ztPe?bJs@DH0>uKp&q>j)9f|9-hlD7Ycr$mMq2zwODy^0DLU=vmD@pYtEM|x5gxM>C zpfFS%w2e)4tl@npt1o8`WLkT8vqHlY?YzBU;vMS=tHE9P09_NM=Hl;>Mt{%jy`obP z-8mh{WX(4}Spm&VL;;CyEc&?cb1?-P3)KPG@|Ew&lRTGlq|st??Y;|rL~M@o6Oh#v zvCwg_Jipx=0i(WX6p=@CBTmc(4B9~Z046bQ;OwClxvYFAc>9jsArSiEX>T&&@~e(w zUrLSDUPYKrZA_sC2z_i&v|9@_RowCp6-$8pLi)y=x|J210UrDD$Wyo_R^mR|`ftgKM8%H8Zct-%A%doB|3=Wju;n9g zh97dgIbZe-AhMRVe8rz~5-jrwDB8`kI=LBE+K*e^-+N3n?^X@tjasPpI9r1c!{Y>T zs$k;Z53B$462ka-iGDP)?!`EGq4#arT?uAtu%>K6b{al^2=2-%p>fdheQ}jP4(WYm z!WX`YXOUSB_G<-WBx^F+abgM@o5*0ypmZC_xMg)gMv8f)oTBCX2+jTuV!6_vx6LcOh@H!-kyfxm`jk@DW3c0Mu@*j8F09-7=| zLybY;Im3rmzsV*CI`;$L1N)a$h#*$<={Yb_}#($w9< zToS@{@(pSaX_)5#WyT#r+>g(J?#HAjTOjkx1xHL*dK5_7Pqa|Q=OK1-D}XPM0=(`C za8_E=H2ES#9L>5XaFK~vGgCh8a`1i(Di!)xF1-q=qs;_|+Gm_B30H3nW&%>88BW8i zi!wU}n;(5Uh~atr@zhd_{*t$(irSh{?IN)2j!TXcoX>H7BTy5U2tkCpS%#Vk&Ul7| zJcthC_J;vj$q{2uVZWO}fZd`$@9OU|7XO}8P|>S!AaLCk)JVWfDo zVBB~DRwyM6{hMYC93v4%_r?T!i+6<=v4tP}vUtlOHKzjBg|C6h)9FZa>>i5wOa9*E z2qPWbY_Ra)#0usw#hkujrB(X-jx)Ld(uFMrG*dTRh=mvofC}a8T`AD6VsRkNvGvYx zuZ7n^QI6D`38y}#GmAzh=F^a&V&FP$&faX5zT+4*<_AEJ65tI6Qf(dLg6~|RG#;t) z;lTAIlWTa2-bx_Qbg=iDdbjJMlL+GYD{yy4Ys!j3JUHs)85pv#d3qw zOL^ci328Ovv-9#{ESw}A(rJPijxEK{H| z#OG=0=$b#Bfv`z{h?=EN(<6lz&kGC|jrBAKa+@zU)hj@OVL4Sv`hQ$C2})9Ec<>;tF<8w3T& zh^c^siXB&)pEoo-Tn90R8y}@8T&*Z*&ViY33xpcazK*rkBwO>r&c_Rwwb#;x0X!8U z^pe(OUk0TT@6Ddq1gQuC?4G{HVjw2NHfHL$n-_L+<04Jr8*~}vkF7l*NZ}Q*)#$Ag z3qOCA-q-x}o;O<_z=w8nz@IT+BOEacerK(6?x5K>P*i?eUbdidR3JyI$=1aaSzy`A z3aa1{)Ya8Nv=^Y0c7ADwd9D4WZo{|9c}de&!GAbcGJ=!z@niVf9?B1Zj+>YBSMy^( zK+-k`IvWT>#mMjz!w0q<>T^i>C_Z~!BhO5o1A^(@*+@Qkk0_EkKw@7Pdpo96t?uYU z0iWim1|@|}>M{}|Hsk^+Ki)0PIp*SUPh~limLe;RL-ib5WbCNnr~4tWxAky-h9OSq zC^jYC`0B*E3tj|13jZlUTCVfXkOkREo~3u=rNcp}>SH3(df&M{j8fgve-y$W-r8W2 zAhD`9K4BkEoq&E|EujH#;?sC}wR72z5!8GujU!oO{lnWxhvJdI`{qe~XJ8(Uh6=8H z{Cv?*9sp|sji|3W0v>KS#V^BYzmw->;JQN83) zJPs@8gT9DV&;ffQ;QtPXCM8;~KTmK@6o7?~ZbMNBVpQl7Xha9dOA~{rISbrF9dZuG zl6Er!iX5y}5rGka?#KgQuZr1m(Ct|^z(TE;2mn|PF}A=>BCt*n=aAi33$Va1{%=1w zE_U$!=G$7M#qBP7s>N3f+~wy7mLIr(c11O9bF-T!AC`Bof+BWMlv{N_253 zIL@9M0^#V>ler-=!POfr0)k@Cfw$728VuK+9AtW7WKZ6+QoL1&5fzq~t;>R?h$b9y zmuW)kvK?X~?U!$Pfss=SF4WZ@lW-Zr;A$kbkAT;?Pw%aY{BN8ChuERbri+G1dJ*q> z4+N2By5vvN(9rk$q(z!~7lkq~Sy5$?KA}u5N*WrtW((oE2r;*O1b`hWV0swhHfYo9 z4sEGWo>>o9CIQ@gD1&VYiFvr$blJf7(WTos*KLGY;+5skxBNjsP&wGWIVS_PrBuwm zZ?0|T`UhP`U_$aSUpBc`^qf~Hl*Yrr@B4{im_A%V+ozwKyp~nv*O?wHfOJc_jOk`@ z9s+`sUlZcwD3lOG1#H{S=A-Y;3(VTrsrH}Je;NYU39*s6o7Ff3c^19leP4Gl(!twL z;xS?8K68+19B?Jh=g2@U^hO^Lsl=+3`=3-|O|KHa_L0BKR&*2&Lkw^&$ej(I$=%GA zlwb~pHBwEH@7=iA5@F={aoZ#30;oWuy;Qz*=KU^8D8(gJWF@UJ*!b~ngd9jY?_LcC zptM|nKkei_mDQ}?oO&ix;a>p(Gljw)^8JpR9CRWT#I+l)!fbp8RV@X<%iy9DO#yph zrEz;Ryjk;r&8AoDk;bb0CIyc$_i{j^j4bT3@mN0|c;-)({$7reR_Dg`mLYx`B3&|* zD+q6VoI0x@x3J5sQMjz?CShB!&fCd}L{O$y@8c;uz8$q2=ObxEB-%Rp_wAU3XDgpv zk0i4_(I+ptN#XZnuOq}={WgAb$j`G#)i3tYH=dyI@bFPOW;kp|O%ZC`UpB)(3vs^O z6OKK;-ro2`!T7LL&KQ)0_)4S_{jSfSQ%h;%-7pT25Am?W)S(|y8(s+SS0bF>$1bR# z4*d?E1wy}IXET5BRfEb2zhAlZv-BQ&xyu+Oa?7oD6T}(}(HC~>aoQSEiQmI!&LEuM zmgr)4JH#}a1nup~MqsYo`s0@Qb|O|WTNV0^)01G1MRw~8k&Wxdkuqx%zqTw1=e~3p zEy?YeZ8c+#MVq>2FI!{vg#%9SBkatST#n2QGm(_bc$OyLQ?8-fBHknY&(i&|k`+n> zU$(D&zuAz<_=pTFp5eugIyHyp%(C^#_@6uFd5e&tF~@p!;_^f;Anxl(pGaQ2{kV?Z zj(f9}Rwhz;B!3h|AM!Tw(E0-b8{ti^rHOly>3aS0KE78z7Z&!^Y7$KNVdpz^FZBst zPVx@kMBO09{-6<=vgu~nw$0}E_y67IfP3`h%h}BJ$LNo>`1`YeeuSBr(2Ej1POE^# zx$#cN0l1DPAW+;ygl?SSzYezqmehpx;*0x{a_tuJhZ28=bPiFN9sp**#|exZ_jj|A z{PTaLH*Hjs@T)7IR|6s-xk!C-6SrdB^;`GrQSKl=h4@S^^my%S^!FleQxAGOy^ee4Q0K8|#tS817!p#u|JGZi=tZQY zcZ=3ed&M7AsGD->%}3|A)wi80F5bZwel6m#Xwi+A_D@SSI0*=eNU4}5Jh%P3ANK1@ z*w}qLvhCl0^6$3=90_8*QuAcWWTdbw&#k6Tt9#7B75jO{`BNUciDe64`TIpAduu~w zUIQmv=4-DS+wk+CWLxdK#>E2u?VA1bE)(>iO=TU1hd-*9k^J!1r|z^56^(8h z{R;zuLyR@s!c4z2t<(S7%YD%Ubh;3ATO3pCfkc z{bzvx<_9k;V!H=pyK^lnYwW#01U9uJbZf1+?I3tftrG<-B@ zWRZvs{>Wq!O8sw+(?8qjb%XF&v0^oYA2C~(9^2=IC5JPy(S%$6Ziy>4UhS5%GtM-R z*l95VW-48Eq>AU9TV;NW2qVIse%rQ@;pLY z?|#rCPiQu}sgc@iRFY<5!>|8@ti!RDZp(s-6u$XcuaOBICAwO^O>}l*PUOuO(J5>i z*uq;}j9u)?X}w0uK&^x&FB|x*>JaO&XA4vQE&7+qxf}TPc*C#92{Ihl*oi)uE!Y;n ze28n`)+K}xv6)f^7ItCMx60(G?6Z$X4l)1H5XchVT?s@716{feKWz))*>YKhYg@lQ z6kY-;IHwnXjaSz7yr}O*?beXo^74P*cRsEz`8cbZtaDDMI$WcBnXiKLB+V@EE^K}N zOvIgWb&*GK!IspOby^DM$Hkb=2yS@`ydD$s7;lf-iLO4EOR6^O=}foPji)T#L%p2a2%iZurkSAbNzpGalR=!}jQcTn6m`C|&|B)uPElW)z z4|Xbpy57loE&=+*@>+s?2SIv_f&>p6TBk?aeCygikNB_veNlPgVQ%_pRvmK1>Ym8m z=xV~iDXe=)Y3!D-!;edY=P#9y+zFN}B?*kxiMlaGzV-8Pj>ehsjr-l311x}4ds0TO zR6Y7d^r3TSyTX=_RO-$W5>_3iH_LtwPX>*&3#WoR8jI+*DihJG*mBRvIXhCl%&b`1Nnz&3-pPz$k=@@H_FcxVvcK@D>FL)qaJiNfkytxK}&a zR9P|!>c5G$rrUxz>b|JXyX8aq?H1v{y<;EcM!zgZH28}@yy*yp3sF=A^@Uaiz1B;I zrCo*$%_g^cy@OPrE@Tb$V2cNbaD_Km>dzN@+`K7j9aw%yY&r5v!{FPkzNk4|;_lIp z7bwWuno{cZMdZtR^RRbiSK?@d?)J+)x>~OA7@wWn6_}wEsk*r4{YTaOSpJ-mFSR3 zmtlvLiV8z+_;bJWRV4A*h4#3iwkoJ_X{FHZ$dSPSP endpoint, the [Open Payments APIs](/components/open-payments) with its required GNAP auth endpoints to request grants, a STREAM endpoint for receiving Interledger packets, and an admin UI to view and manage each Rafiki instance. + +This suite of packages includes: + +| Package name | Services | +| --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| [`backend`](/services-and-aux-packages/backend-service) |
  • SPSP
  • Open Payments APIs
  • GraphQL Admin APIs
  • STREAM endpoint
| +| [`auth`](/services-and-aux-packages/auth-service) | GNAP auth server | +| `mock-account-servicing-entity` | mocks an account servicing entity | +| [`frontend`](/services-and-aux-packages/frontend-service) | Remix app to expose a UI for Rafiki admin management via interaction with the Backend Admin APIs | + +These packages depend on the following databases: + +Databases required to run Rafiki +| Database | Type | Function in Rafiki | |---|---|---| | TigerBeetle | High-performance +database designed specifically for double-entry accounting | Accounting (TigerBeetle +use is recommended over Postgres for accounting) | | Postgres | General purpose relational +database | Accounting (Postgres can be used instead of Tigerbeetle for accounting) +| | Postgres | General purpose relational database | Open Payments resources, auth +resources | | Redis | In-memory database | STREAM details, auth sessions | + +The Local Playground comes with containerized versions of the Rafiki packages and two pre-configured docker-compose files (Cloud Nine Wallet and Happy Life Bank) to start two mock account servicing entities with their respective Rafiki `backend` and `auth` servers. They automatically peer, and two to three user accounts are created on both of them. + +This environment will set up a playground where you can use the Rafiki Admin APIs and the Open Payments APIs. + +:::note + +The Mock ASE provided in this repository is intended solely for internal use and demonstration purposes. It is not designed to serve as a reference architecture. If you are looking for a reference implementation of an ASE, please refer to the Test Wallet. +::: + +## Running the local environment + +To spin up the Local Playground install the following software on your machine: + +- + Rafiki local environment setup + {' '} +- Docker +- Bruno, an + open-source API client alternative to Postman + +### Setup + +Run the following commands from the root of the project. + + + +``` +// If you have spun up the environment before, first tear down and remove volumes! + +pnpm localenv:compose down --volumes + +// Otherwise start the local environment +// start the local environment + +pnpm localenv:compose up +``` + + + +If you want to use Postgres as the accounting database instead of TigerBeetle, you must use the `psql` variant of the `localenv:compose` commands as follows: + + + +``` +// If you have spun up the environment before, first tear down and remove volumes! Otherwise start the local environment +pnpm localenv:compose:psql down --volumes + + +// start the local environment +pnpm localenv:compose:psql up +``` + + + +The local environment consists of a primary and secondary Rafiki instance, each with its docker-compose file (Cloud Nine Wallet, Happy Life Bank). The primary Cloud Nine Wallet docker-compose file (`./cloud-nine-wallet/docker-compose.yml`) includes the primary Rafiki `backend` and `auth` services, as well as the required data stores, which include TigerBeetle (if enabled), Redis, and Postgres. The primary instance contains all of the necessary components so that it can run independently. + +The secondary Happy Life Bank docker-compose file (`./happy-life-bank/docker-compose.yml`) includes only the Rafiki services, not the data stores. It uses the data stores created by the primary Rafiki instance, so it can’t be run independently. The `pnpm localenv:compose up` command starts both the primary and secondary instances. + +### Environment components + +The following components are made available via the Local Playground: + +Overview of components + +#### Mock account servicing entity 1 - Cloud Nine Wallet + +| Label | Component | URL | +| ----- | ---------------------- | ----------------------------- | +| a | User Interface | http://localhost:3030 | +| b | Backend Admin API | http://localhost:3001/graphql | +| c | Open Payments API | http://localhost:3000 | +| d | Auth Admin API | http://localhost:3003/graphql | +| e | Open Payments Auth API | http://localhost:3006 | +| f | Admin UI | http://localhost:3010 | +| g | Kratos API | http://localhost:4433 | + +#### Mock account servicing entity 2 - Happy Life Bank + +| Label | Component | URL | +| ----- | ---------------------- | ----------------------------- | +| h | User Interface | http://localhost:3031 | +| i | Backend Admin API | http://localhost:4001/graphql | +| j | Open Payments API | http://localhost:4000 | +| k | Auth Admin API | http://localhost:4003/graphql | +| l | Open Payments Auth API | http://localhost:4006 | +| m | Admin UI | http://localhost:4010 | +| n | Kratos API | http://localhost:4432 | + +#### Mail Slurper + +| Label | Component | URL | +| ----- | --------- | --------------------- | +| o | Mail UI | http://localhost:4436 | + +#### Database + +| Component | URL | +| --------------- | --------------------- | +| Postgres Server | http://localhost:5432 | + +### Exploring Accounts on Cloud Nine Wallet + +Navigate to [localhost:3030](http://localhost:3030/) to view the accounts on Cloud Nine Wallet. + +:::note + +The accounts for Happy Life Bank can be found on [localhost:3031](http://localhost:3031/). + +::: + +Click an account name to view a list of transactions. + +### Debugging + +Debuggers for the services are exposed on the following ports: + +| Services | IP and Port | +| ----------------------- | -------------- | +| Cloud Nine Backend | 127.0.0.1:9229 | +| Cloud Nine Auth | 127.0.0.1.9230 | +| Happy Life Bank Backend | 127.0.0.1:9231 | +| Happy Life Bank Auth | 127.0.0.1:9232 | + +#### Debugging with a Chromium browser: + +1. Go to chrome://inspect + +2. Click **Configure** and add the IP addresses and ports detailed above + +3. Start the docker containers + +4. Click**\* \*\*\***Inspect**\*** \*\*\*on the service you want to debug to open the Chromium debugger. + +You can either trigger the debugger by adding `debugger` statements in the code and restarting the Docker containers or by adding breakpoints directly to the Chromium debugger after starting the Docker containers. + +#### Debugging with VS Code: + +To debug with VS Code, add this configuration to your `.vscode/launch.json`: + +The` localRoot` variable will depend on the location of the `launch.json` file relative to Rafiki’s root directory. + +For more ways to connect debuggers, refer to the Node JS docs for debugging: [https://nodejs.org/en/learn/getting-started/debugging](https://nodejs.org/en/learn/getting-started/debugging) + +### Shutting down + +To shut down your local instance, run the following commands: + +### Commands + +The following are the most commonly used commands: + +| Command | Description | +| ---------------------------------------------- | ------------------------------------------------ | +| pnpm localenv:compose config | Show all merged config (with TigerBeetle) | +| pnpm localenv:compose up | Start (with TigerBeetle) | +| pnpm localenv:compose up -d | Start (with TigerBeetle) detached | +| pnpm localenv:compose down | Down (with TigerBeetle) | +| pnpm localenv:compose down --volumes | Down and kill volumes (with TigerBeetle) | +| pnpm localenv:compose down --volumes --rmi all | Down, kill volumes (with TigerBeetle) and images | +| pnpm localenv:compose:psql config | Show all merged config (with PostgreSQL) | +| pnpm localenv:compose build | Build all the containers (with TigerBeetle) | +| pnpm localenv:compose:psql up | Start (with PostgreSQL) | +| pnpm localenv:compose:psql down | Down (with PostgreSQL) | +| pnpm localenv:compose:psql down --volumes | Down (with PostgreSQL) and kill volumes | +| pnpm localenv:compose:psql build | Build all the containers (with PostgreSQL) | + +### Known issues + +#### No data in the mock account servicing entities + +It is possible that upon starting or restarting the local playground, you may run into an issue where there are no accounts and wallet addresses in the mock account service entities’ pages on [http://localhost:3030](http://localhost:3030) and [http://localhost:3031](http://localhost:3031), respectively. You can only seed the initial account data against an empty database. To seed the database with this initial data, clear the existing volumes and restart the docker containers by issuing the following commands: + +#### TigerBeetle container exists with code 137 + +There is a known issue when running TigerBeetle in Docker. The container exits without logs and simply shows error code 137. To fix this, increase the Docker memory limit. If you run the local Docker playground on a Windows machine via the Windows Subsystem for Linux (WSL), you can increase the memory limit by configuring your `.wslconfig` file. From 56299015da48eb4dd97ca2fcb186242ad0f96089 Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Thu, 22 Aug 2024 15:35:33 +0200 Subject: [PATCH 20/91] docs: mi-test-pr --- .../documentation/src/content/docs/playground/overview.mdx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/documentation/src/content/docs/playground/overview.mdx b/packages/documentation/src/content/docs/playground/overview.mdx index 2220534096..59f48e8757 100644 --- a/packages/documentation/src/content/docs/playground/overview.mdx +++ b/packages/documentation/src/content/docs/playground/overview.mdx @@ -24,12 +24,6 @@ These packages depend on the following databases: alt='Databases required to run Rafiki' style='max-width:300px' /> -| Database | Type | Function in Rafiki | |---|---|---| | TigerBeetle | High-performance -database designed specifically for double-entry accounting | Accounting (TigerBeetle -use is recommended over Postgres for accounting) | | Postgres | General purpose relational -database | Accounting (Postgres can be used instead of Tigerbeetle for accounting) -| | Postgres | General purpose relational database | Open Payments resources, auth -resources | | Redis | In-memory database | STREAM details, auth sessions | The Local Playground comes with containerized versions of the Rafiki packages and two pre-configured docker-compose files (Cloud Nine Wallet and Happy Life Bank) to start two mock account servicing entities with their respective Rafiki `backend` and `auth` servers. They automatically peer, and two to three user accounts are created on both of them. From b414ec67e6ac17bfd4209548248bc268c0dcb6fd Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Thu, 22 Aug 2024 13:42:59 -0500 Subject: [PATCH 21/91] docs - second round of Rafiki imports into new project Added the following pages: - Integration > Adding asset - Integration > Adding peer - Integration > Creating wallet addresses - Components > Accounts, transfers, and liquidity - Resources > Glossary - Resources > Admin UI Guide --- .../img/admin-guide/account-settings.png | Bin 0 -> 49211 bytes .../public/img/admin-guide/assets.png | Bin 0 -> 72385 bytes .../public/img/admin-guide/create-asset.png | Bin 0 -> 52982 bytes .../public/img/admin-guide/create-peer.png | Bin 0 -> 92406 bytes .../img/admin-guide/create-wallet-address.png | Bin 0 -> 61199 bytes .../public/img/admin-guide/edit-asset.png | Bin 0 -> 56073 bytes .../public/img/admin-guide/edit-peer.png | Bin 0 -> 75656 bytes .../img/admin-guide/edit-wallet-address.png | Bin 0 -> 85420 bytes .../public/img/admin-guide/home.png | Bin 0 -> 95217 bytes .../public/img/admin-guide/payments.png | Bin 0 -> 48691 bytes .../public/img/admin-guide/peers.png | Bin 0 -> 59189 bytes .../img/admin-guide/wallet-addresses.png | Bin 0 -> 68896 bytes .../public/img/admin-guide/webhooks.png | Bin 0 -> 57010 bytes .../accounts-transfers-liquidity.mdx | 114 +++++++- .../endpoints/exchange-rates.mdx | 8 +- .../running-your-instance/adding-asset.mdx | 91 ++++++- .../running-your-instance/adding-peer.mdx | 110 +++++++- .../creating-wallet-address.mdx | 177 +++++++++++- .../docs/resources/admin-user-guide.mdx | 253 ++++++++++++++++++ .../src/content/docs/resources/glossary.mdx | 81 +++++- 20 files changed, 823 insertions(+), 11 deletions(-) create mode 100644 packages/documentation/public/img/admin-guide/account-settings.png create mode 100644 packages/documentation/public/img/admin-guide/assets.png create mode 100644 packages/documentation/public/img/admin-guide/create-asset.png create mode 100644 packages/documentation/public/img/admin-guide/create-peer.png create mode 100644 packages/documentation/public/img/admin-guide/create-wallet-address.png create mode 100644 packages/documentation/public/img/admin-guide/edit-asset.png create mode 100644 packages/documentation/public/img/admin-guide/edit-peer.png create mode 100644 packages/documentation/public/img/admin-guide/edit-wallet-address.png create mode 100644 packages/documentation/public/img/admin-guide/home.png create mode 100644 packages/documentation/public/img/admin-guide/payments.png create mode 100644 packages/documentation/public/img/admin-guide/peers.png create mode 100644 packages/documentation/public/img/admin-guide/wallet-addresses.png create mode 100644 packages/documentation/public/img/admin-guide/webhooks.png create mode 100644 packages/documentation/src/content/docs/resources/admin-user-guide.mdx diff --git a/packages/documentation/public/img/admin-guide/account-settings.png b/packages/documentation/public/img/admin-guide/account-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..34ddc362237717db0bcd6829e3179b79bcc7f8a5 GIT binary patch literal 49211 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�VLKAu8n9R}UYKUjK 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

wcUK@F7K_G0DIu~ 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 EADHzbO8@`> literal 0 HcmV?d00001 diff --git a/packages/documentation/public/img/admin-guide/create-peer.png b/packages/documentation/public/img/admin-guide/create-peer.png new file mode 100644 index 0000000000000000000000000000000000000000..86cfd2bdfd120d0b7d54d4d2739a32626afd4065 GIT binary patch literal 92406 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 z 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 vE0^-P_sX4A>?s7nFZpy)0VH^; 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 literal 0 HcmV?d00001 diff --git a/packages/documentation/public/img/admin-guide/edit-asset.png b/packages/documentation/public/img/admin-guide/edit-asset.png new file mode 100644 index 0000000000000000000000000000000000000000..1a4e5c15f1335bb41fadf3c75268f1ff03f0638e GIT binary patch literal 56073 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

=%Rq`uyAD^cc8(o(AGXWZYghw_Qt@<8^v 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 literal 0 HcmV?d00001 diff --git a/packages/documentation/public/img/admin-guide/edit-peer.png b/packages/documentation/public/img/admin-guide/edit-peer.png new file mode 100644 index 0000000000000000000000000000000000000000..fdd9f99fa7aeb1b7da4f60825357ef0749ad67ad GIT binary patch literal 75656 zcma&N1yogC^e;;1Ar5(@ySqCCM3C-I3F+?6LkQ9!4I-Ta(hY}DLJ*J+32CJByaRs! zH|~4mjyvueLvXYAo@?#7X8z_}F={IESQsQ2aBy%~3a@1~;NXx@;NTFyqrrZ{k^Hcw zg8hPb*N}e+S2Irb2X=vEBdshA2Unknd2fykyGD0;t?v#8M@0Yh4_-lo?gS1FTB0B; zt>t5Ku#6g@yaPo&Q5{kS1DlG0w5c?5YOHc1w&h8t<&Ro%Byxtu27?o2>cwU1CH!_x zkJ<~M5*<>$h**$xF&=A@o;3J_=b7Y$@Px9{=Xlnm?++cpwP$BJJHlrSfy)8iJHC0A zXKTIT1h4%%O^lOMQj(IBi#RNd@88J&8|foMLnzJ7&3oMzQ-3`6+7=k_5TlT!EG%e} zQ{`-&8HxR^P(4Ly;!a$)(e!C(XjuH3n-0TUHcEbz0Dt@5o(Ohwy|@_o zCknjYU$yl4g{5R=&xPh=y@~$4j8Us)_&jT({=cV))mziqo=8#rM~Y2)2aGy+jlxVr z;}?(#qJoj)u{_0AX@Jdh?lVs(0ai}3qKUhDV)7_ydvk4nS01B7&e-V3dj<7J`-b`? z)~6-O%C^3Z)uR!h1`<0#Hhi=it47E#K~$AHCztY*O#!Vv3h}jrOHyV>nT81$JHdvT62Z+)XiDYOq+}sYQU~8*nh{DN4 z@W;S~eE=|tIg_Qi>{LrZ-;a+0Ww;{C;u`Mh?=W5i`!U@9V+)K9>(Icz8^9z&ON)@F z%?5*qW4XCuym}gM2mgIG?9m1bCBQRrAW)y10p;JLRkDhT7{t7W-$Io)!u8Ht@M!RT zgxn+8wp8l5&#Ype9xB@fhT3ebtQJ5S(OUcsXOn+1KM)-3`Sx`k?$_1VC#4~Oz4R$# z+lm+ek7g`Yr%B>~XIz2gJ!%TVw#v;79p$aegRgju3DW;8fsoryL+YFW4JU>FE&9L& ztLyRXOI2*H|CX&40UD|)y?0ld{Xjp(Dk<1MQCIi>-jn^rfGn%#o7j)a_G5XmTp_ei z5%%JTluX`h^F1HF%Ok9-+0l(oGI+2|Pv6w2pJbz{4~qBJXDK?J^R&f_<#;sx?CRgI z9j*@$TfW}FJ$#iNReahKnxZgZ?-MZ#&U`82shfLrcGbz>RRv-|Z*KGvfVY zvs+9I{FqLr0({}_Ip{T5WIvfg+-yozVz?-MnyC~gcl(#A(#r8?+QB)k1oE@mS!uPqIw zX9YF~(+gZy(Xjp_`xheg;jKka1L5Vw4>x?o1bX$tsxL+r#mhae*QdF$28Mryt4>+X ztp7*cFbK*=Q1|)E=-)^MxFxf_+n`0Lx0rp~c=abkfKxg;ams&PS{Ag8t9FoE(R8s& z&FX^tfVHTKr8RpdG*Ylp1GV52AS;GiN6^O^6yM;@Y(D8X5J(8{#~@&jyf|aih=I3E z@VacEL$XksxXJ9=BI~OmRaOD{lf&;57a!uv)IEX*P%M5_g)b~(jyCtjA{(zel{WvA zc5xzK45mt-;`st$CT`akia|AO_{7Bn(THYb>gww(2S}1ugRQ=~)B(t|-?!7@^H;9%um#Y^<fTABtY{Gl%T9lo=RG4RvLIW$?Ms=}1 z*RBe!VXWLKk-k(r4(F_I(j5}S0WH6Ya@Twm&k=r^?p8XVdGlm~Vdm+V?3H`{?uFj~ z1k!)B4;@KA@Q^um%{BA4LOiNnq2K3W!O5NA67p&3c_pSZ3z4Q|^CP;Ju5~Q3@XDsc*yH^O7?iJ@Pw zj{K|MJPH?Xq2^n->L`THyIZ(txNiHAk&Tr+Y<$$35$F(9d4nO; z#e*Pet@zJr0L9;p*Qq0{rHV#osR73tOvqQio-PMKa`U*{(jL}pKRt@eT7cAE_8M

!rWxSw9+c>;Os1uBXra?R#(2PAl~g5P3=;JLwA=TchI*r zdb(V2c7)QO>Lk#daq5!Pk}l!maD)<3t&<4M=4Ljd+qVZx|Bb=&sZ;yqT~2vExMT+H z_^MI6w8?tdL_wTgO5k#DwsdT+T)<5M5U<&OpK`(d{N2Plr({b!3CYF0CyV_NOiAx%WWExB- zA4TQ*U{1%lYi8KlxkMxSJ?-R8G{LC{)E4cW*lXSV#Hyzk*^7OP;l(agKWqRqBPqZP zJ$X>mv-Iz%`N#g|Pj2t|+sYL%8J)f7rBJhZLdK2JFAt5)phJLEG6A?tt3iqJa_O4K zA8t1u5`f$GQEs~{sd|aPg33ZNK~jAaL<=*`R`FOYgZN~`4s%u&vr5fJ)mHfu;jJGW z1C;H6hkDP~@js%zBIcUu>i_y2;7&mL+31RNG?3};SE^RcFTj>4H&>N8Z3@TDwifX4 zl~RAKZqv7KS)H-|~Jlok6^i zt=OBDKBs&Ht@{0oGEzB%>`v^@8W}xk%A)Xa^M&F+MF75F($UjQU%Lk$SyR1Mh)trW z9kRsLVBUEh_&&hb(KZAa*dsL%Tl(M@v&cqj5q>&ZCZXf8o}v8i{?z5C5x^ac1KcE+ch=Q;~@Q6I2& zCB#oo>8Stt>c3kI8;K~igM}PqcL|}JnBUD;CrPni$<(CO$iiERt?h0ix3hQ_?*Ah5 z!gigEz8zuzvAa2dsLwd>11>#?P72UO7ur96S)TSkd6t4*nQc=LZu|g0 zsm+WddMr_=Y0;iaN&p))lL7xKdxxN<{A0#`~$|l>L)S zt^R#1%ETWgf!wN>Z(G_eC054yzJ)$Bau*##4~*K)D$Qn8;QtOT_U1fHhLBu?M&^SD z`RkPqGV~n_n8(41#nC`;JN6q8w>dVcc#msC1kf4E4lMwoJPiFJ7A| zMLjqi{1m7!J~j7=uC>R!2SDI#NDMyj@4ui4ufsZRAH4V(DU<(#Nw|RcAa1ZM7dtsv zKY9R@yH302`yY3!ZsMg-(Tty#C3Bc6_)V?&IVS4Oz!W&AH02j>J+WeFv*LPrc*BxvRlfbDL)p600UNy;1tE zp0}!KmPw`N0i8H+gdQ0$-7Mp*I$}xpg(J3ztqbr7E7*ajWnVAjwqt`4A7$4C#C zY(ZVtE(sYbXLyYV+D7*`3HW5z?MIz32RS+TxGtHj6v)Zr7ZD$R&+wFDtURX$TpUH6 zSJQT`CtbJnYj-bPj$KO>aweUAQ+Xu$Mt5r3Scbb*3{id`8p0vz{rMr0Ngvr*A}fN@ z|K|t7#3WcK|aQH*VIf!cX zh5vINlhkC97>Y2w!#{tg6j~e|C!k&^0b~X~f>#@{7Z!0b3O@J)G8wpW$%+EdPD8>G zUAEaKFFd#K8|D@O6f4M=0mw$e$TN0WE&K>}_O*j%79mQJ|I*C{9inVd!8bN1Cg~-_ zwHe{HHoWV7%@C(tUPj~yi;~cU&Cs1y*@hI}p@_)MaTzPqC$7VWp9Mx9sD%_0d@%T3 zG^9qzjL{VS1EHaR!Ar;czmxD8_~&SCBpjsw%*?RX-@AycZ!+f4d)Qkpb%+(Z2&1V8 zqvG_eUrIUkfu$EBIbFcWGj2gE_J2$yOm&qi=lsL==BMV)oUaN)%7I}9&Du7$Pw6gfXyUI zc0ZF^1wm-_o5%)X6YCVqnP~akoZZ_sUeCjbftu3vQ4Hf z-^%=)gvrHXtvQ!G=m+EG*fnZPRTX3D+f{oi{rnJu2l4@i)evuX8y}qt7Q_F(mq1oS zip|Tb`StEB4h~79RD}sw}iyENHB()IyPbg9JOb)OPO&P~Dd%O@ALyGSZMZ3L67A)qUV0%cXH^ zSkM04TP(GvOspdaWR00oREs$UjECLqQ`1PB$Gj7%flc^ZXFCZ5))ORg?2ge=)aG(} z$k;uu_?fLkhCmdQu(I#m)45YRFH}V_UkGXZFUPmHL3_lCdku@sk)k{uNiQh%MpoJVYQZwLsy3SG7eN^(9dp`$2Zwd7zA5y_DoCF)SL}`p5+nvO6|9sx?-U|ek&7Ns0OVW%! z!}zTk9lgKeH*1^8izBGc*D9~#gm*%c4^R3p;h8Qks61A2Gul>us5oWzE~hMVznfxk z5U%bN@2xkWjVIy7JyZz{z0_Bd$aK}{qxdRd`R$wXye~7*#pPwEO8Cjc@aM9Eoa3W+ zTl1Iz$ZVm=yX#g`|C^a7M(hg2g}Eb8;JEr7tQKo*{Se}7qA1-_Sg`5g z$n)~JP>5HV0RuoIP#idcg@(V?aKYvD7w+6v4Vd5!%ab>5G8-39UWFg{0nk)-xtz$X z{UouBR^Aup*U0p+tJflu;i

z&Vgjlhm|?vGbN%#^v3G}JS(pt=Eg9i*!VlRAPzrN@YPLR2IY z_(ieA;UePDgy^nL9TEjA-wpDO+s@UrvDrXg81p)4_G)%vNv8&ys7TgI5Bk||(Tow- z+Q-B%xx9U4k6u;6Fu93IZug(#V!83&M1iAQyjF8d7udTy$0g%m&7#i9&u9-ARjJzguL4 zVOqf>cmeMVku4|w15Oj4XzN)}0Y#xg9AiBz6L-Cxp2v+P-vb;J(%&;)nK=@PUmK65 zC6xfq(Hs5;-V|qJ<#q`aoV_0TOKbe3h*rYN^I5?_&at6Bju#9dx__e9KtYrSYH?jd zOBiu$SMBP9L1k}E1TN)7g>$GZHYt$G#L?`E(@G7H$>yWk=d6BF-Ova?|6gcTpAu6M zU^K9h|9c*;{nhS5Aq`8a=Xgg;M?Ado??rSA=uiTF(ONtQlv_#32ix)$+tB!#D_EZ9 z=v8j7E~UzlU~3-vvvYa^Q|odDq=u#M9ne-x-=WGJLl?#ATR%Vlmo*bcg$KVM1MrLspVZ>PaNU=5U2B7C z2ryA7Isj475fDA2-xx2Rs|2YjeM%T;&$u*UQC|?klVqhwKV#XkRGXaM&(AV3Mm~5W z{;Mj$?(4)q1&T#4`|=QASE$x4Q5wcpso% z&367Q$(yi^KaEQw&5Qwmx2-iYyz@+I=+lEC*V;9m$JVmLALV1kqX{h~XODzA?+A

qVG%N{Wr4{3c?SY&JEb8r^y=?;CsXfZzzML`L-2N9$si?E zhNMpnoj=sWOeP67`yQIEKJ>TI01oY|;?o?d);#b@9I-3y9!d>lj0N^BG&CBpjed*A zJ+%TrHt)9s&UV zT_K9;a9K4h*(%cNnfF72@|PBGRjWHqpxS6)?QHE|huI>0YuSgHj|sM>@txq_mB^H- z=5T>ey~}r&faT<$lcDllWd4V)4p}VGm>wYZiE1p--EJ8NAKZsQFE^jQ_Yakm?HL`j z0uPg32i9aMR~9XEf4V9sR}A0flVo~9@2$Mg%%AdfUBz*y+KX5Fy`jPOv2=R_$D2Lwd7D;;ScLOV4Fy*AvFcn(Z!=g6vr*c0DN#S=hs+K3_P z%CpTQ$2;;*8}xSj>AOR(<1%nVSxzoJ()sn<_q#!d5SGGs8LIWp`+VQdI}!+Ktu6aK zTSM_|gPTqOCb`_0hLZ1)ARokcyYJ%{{_X}23f+dgaQCwr;!Sce|tEl0(#Oir-2edE|k%vWZe>*@^& zeXIR(SL#rM^zI0ogJuCjb@0p4&VnCFeI^;Gkts@--b*LgRX}c^S;*CiYs^ zyD^qmGjY0iqRr;!jHfgXc27h!@MVv&2a0d>bpXW~;Vd-fVp?X!5gs$xE zddm*LmjY{uyC{utYOE@YArR*x ztEU15uk4k|uDBbM$V?U3Pok5nfB`r7-iYH0nG8CONjbykvE>}$`o*unSlLF)r93+E zu1RB$#&xe~_M>h>?ybdVZ_k$5L$JEDj(XTWFPcV}t-Os*suzKwP@#u@$pKyM&nDI` zXcetNtp6WA0#f-|l$XuxJGd7v7+WUMS0U}NQVX*u;vLJJ5&0oXN4%Hf_hl4v?uk-? zC2@bVo;XFh0j!8PWy8z9*ihy5nw;sMUx;6I7R}_ghpCC?x{=ctnj~8)XyMMK9+8bw zH#_#F8xo%O{w~}-WIieA+!KzvaghKNm7)F^e?1IaiN}EvzC=LNyuB} zrc@fM#h$PNgOG&@N*R8Vz0l@YYh}fqHuWHyCj0KDmgG09oi_i+O6qMuke(1~ZaeGM zTrXD+wf9TT*tKpVF?;*{idaH*?VFvU_cNGC60ic`C@q| zC)B=Mwcc}3P>5IN9K;0BRx?CeD&?>>ek>ssbYg;EC`emz?T!7J zzdciA3(^+YdRe`k!R4!tGZQBae$17( z{N2_$|Hm6wlFcxZe`iae42*r47IHq!5P!2pb`)D7x>IMh&VeNE_W8c!m^A1Osm0oE znS;v?;Bzg9USjA{C78q5zA^=_OVC~vVcZn*qFdX?IS((=zgeC*rDN;_yGA}H_;6j1 zti^v@o^7F8;I(4s?oV7VGJhFti{p3IvpqlC$qg2aA%ZDHo6!YvV72BfJ}>fwUq6R> zGGLkNlNRm6ym?Z&)_!a?sbnuIdr0S4y5;WmU}obH4H+ySTS8_3>3!FJNf!N{QY`%B z{n=F48LI76Ftflf@%IJ`K)2Mnz{Sp=#N|7N= z3#?9fI~;lnHpcYootXSm#S#=K-^(vPj@1p;kQ3FCMpL|!5e9!7qXyV-gxf`xEb_5o zjtg}wz(+U_yiu0uLU!o3b<_3AEG%3RhnPs;13IVv;G-I+v$LrsK4XL7o zL*Fv!X^J4M^z?GZ=YHZFo15!K9JTsPNg%Y4iK(O$l@`SAR?A86QpSKQ?6A_MA}Lv( zf<=jrra$(82#rU8UQ>-|#n7_+ZawAcAI5Il#%Uj<1m|RtV^o-+ic{2k7ZpzbF|)Kx zY5NUX*eq;F<%P8gzyLWuY^$~9Hf$G8kbM8~=9(_$de%;$TJ@G$$1&?_tM93I$LgW- zMGTbpm~F7vUom$9-;5?odB1dKB0Rs@YCK1=Kxbe2`kfvA(#3L!@>D|}OuJ(N&yfk6 zav%A@ygNbJ0z&n~c>mp$I4)={?oIn`pKC8oRiZ?qFl}>j?-Hf!pEAzoZcu#JD#}>y z1S0!3^9AiXyS-a~y^8V7OC*)@V@!IOku8dNhQQ+LDFX*Hq3I7Nk0Wi@ZjXyC%}}Nz z3WFHp_6wP5lht*za(f|S+=x}$TJsCAwCzGG<;pETQAt1TjG!}|^4eL$RHgEnEUHac z>r?N@Ft@qI8d-W`UR=!Gk1KA#<2w$NaY;b2U^pzKRPSo+ttjrY;|zI|Jycv8@L=VsAo+HP& zNH9V?HVgsAg&@T`Mn6-k? za0#rO(B1w_p)pFQWfAHrXVS2vv=9iX_~gU7iqaxcr0inDF4qaUN3A)|t|e~cjV_yH z0A@^`%ugNTlaYP?^#Q)X`f9kLhu3k$Y77V2XMp z)4uw(eLu^uM}8bBJS}hjD?(SDev-ISmHr(nm0uXm?E5JH{gv{u*TKI&a3<+Zd2?Tm zHW{6o#$WEoKZcJgBrL|dlOECb^UFHCx+@P=?Dff>(xYDaz_1X1WNLit6cyn6(e7Bw zaj{c#x|#biCtk9D#&632%kyZjbs8Ts`aQ4`BCxW0?Z<0mBeLhUu=C;6hAsVkN8r&Y zmHwh76!fl9)$1y0!RcCQD@gx=qkJxT+Vi>Az7;ltkI1po$z{{GHe=P}-XIOcBMTGq z<~;Wqe<6}9Ucqdpz38+*hc^3Pi0j z<)UvTjZ|&5y&SKK68`guzws)`K7xo9vB_$*5BDb&;jDfpAQzSUl`{Dv`qVk^J}Y|9URqJF^$?`?)#zEL2J) z35YSL_qwdY+5wKJZcC3cE;R2wROcVwT8Rv)R%~h7o+3Sd2}iqQh+`c8Ytl6VI;cQM zqv}9?6%!Gyt9vde+fk!h+{N}8ePGGBy2-Hw{D7)vN{3;T7O1&jSr7_nqrEhho(THO ztJVDCYERnXvNr6o^M}No!O_rMNdUuUZNWaAFu#BEM~gf>hvPk1!`WQpei~6@d)tcy zY6;H%X}`$7`pVwH_~Ki3B9Ga1U4er9uF2(sFQr=rWK?fjrG%kE_c>n5VSYyxyEMAb zy)b_()pkHGk2a)HwPH9EE5}6>U+7&nuZh0h(i4$O1`?A~?SOU#F%a{#y|kLiTkt@a zR*XJOm4a8*1M`*_shfP#^EjAw_b-hBFQ(x0=u;=xcByk}{~&X2qg1V=e6*B8iaa() z^0ERd#pNMAqzN3N*P|T?_6DW}U~smbnI5GFb+Eo=5EaCf!6oq)XkJQ z0o@fZysX8t?dCdqX$e^&j~ztNlpa z?@W5j;B_Z;f>hq^1W{zmWxLiQ@fd#oXt|d75KMcWuQsssK8^p$b~)v|$%ue_X*$u! z-my|%A-E(%j1;>u!=u4*>g^*Z#${)qWZMZ#aPEN5H%NGwf+NAhT|l-YP2lA;AN9V} z0?tr0)!jK(I}R8yrgl4OkX8ug^2YCMDF-Y(Q} zJOOZlJUpXasI?}c_d{vj1T;!8o@X}@I+Al z1ffnUJ_1rL%X+)j-DoZ(s1`Fpbx6p{0C1pgEfkABRuaFmz%b+9KV87J}$zz+s5@%z}*zA-ua{}3LKt94+ z8^r$14W(bb7Q~i#k4EtRQZr1N_*XJ5eTZ`Qotf-WTVD5VfL+hRczc=-SSak`=-ova z+FLo7JZ7OwD5+t50`Oxze z&st20io94Dg@+DH)-d{#nA^Bjo_j}n?*nE7N${g5Qi&pg4CaKN(o@q*mhh?Za*=}g zMY~}@bhc>MTH-K4N1M6P{QY@oIo=1Gj|wL7gOXq2-Fau?;99z}iTL7NumAWFlnn^o zhuf*yDk;A{5J?u14?)x6jco}49!0s{(3s6B{yOucF!s84B!DxOMWi>G0L91ln4HrM z?=c5{F3?9mDBb+tSh_uGlcN2y_a|0nmqx-g@!f%KWQ~d92}j#mDQ0SuFrr2Z-4}!2 zhj6kewYLiA2wW-xAn@B>iwJA(k%B_v$a(88evW&wiUAZ^c=&tbTG9SPkekQs)QQb^ zGs%^$TMPTjGpqcj**)Bw+~u$FI{^bHp(01xR!=Rr`Ut1X>|OnX-mSv0uFqk*iUMc_ z=ajqdf^5jfJD;J_Njs^^@n+7i>O@ImwsV}-9FE%oFw-J%Qy}z+HX|rTtxLp@c0m$L zctkp>GwT=?(B>?Q#ej8pLtPCCnL9HG{5-eJJST+tSD`iYi&+GoP@DqlG-@$TR{h|v z#1E5N;+VQR7CW9^sa%gqCUvT0!gAHSts(~Xfd{iLow+kOzZ&A@?b@~T)<%D=3^Ilr ze0aal5lZPau8Jy0nSM)4UAL-6nuiVu{!QNDVtMNnvYjA5voc~C{=YvTx|v@!MGJ%$ zS5fa%MFGLW$OE6co@|BifcMvHY~t0e?Qaq809HuL9*uN5embn|0wf0Z5Ioo@Ku?dVD-q{OCV=`v?ZJ;XE%@4jeZDUF&{l zzSmHwO0Ts)4bN`nZ;i!0V(Sl8emKSWxFM6T*zlm9+OrQuu+qopf?~3{?bnh!kL+Jx zVaiaIIEdZ}ik(Rw8hu#~>SshoJ2~4yO0N+Z6y{yMDkeN%q8T<04Za)BKZRCUOdTxI z={By-+h1ynX=>`A)2N@w2}u|wXXneW1gpxbJuo+1i-Ser@8?`{poM3qreZv02^!roykB$bQAh?N|v@y4@fD872wvyYW11`|*&657ei4PJm+BfMA{PG9Ng@ zT31thcuQqpqA0F4T|~~MQBAFpa2VG_;P?y7=ol|-_IriSm!Jgcx?TooHadT9F0k7F z+~V=4qFLkhz(e80ei_5u8T)jgq(SdQbzo4roQx>P!-U z1-PStEjs9;6~(RF2;zC#O=)A4eRdlq;tl(aC{<1M$85Iko)UeT;jxG} zan@yCHwH&|G|*C`aJ+BXuWq4vMKpcthseIh99UDW)Adear`F%zX>z{{wE;ZVEDo#{?h+9Zgka=ValO+=Ejox+(|9l z=hmn%z=q62n`D0AytUgS3&*I%C2VI#_~@kXDYWGHW%z2#OsbRb#koGyC-1e4Y6HKK zV(|`FFiOu*m;Au}fH~B!8Gj@?>Mh*dH3{#yph?e6n>K!}!WmPxFAFv!5FIDDyh7ZBdc zj8X;ygzZ|m$1A6(L(-zacKdn1VO+Spo|?{vGKtnBoPa`PlemfpoRr@wmO!;*JN8=T zLz6tOyecDu2hx-B=D^#Uts&!;!Hc8R(EPu?-z37u^P5#Mncg2fZXhj;Jy7ruQ19Q3 z|DjOwaJne>FtCurdi6e;>sK&?zGi;Mv3L^EYgYIxdi`8xF98E#hjks)T1`6(K6T0$&$ob;H(sGU)mZ^ z0WOG3HB?iDQIe4x$$B62oeV0VJNsi5)PLcm4|t9n6G5$eYEE&K4T}n%o8GkuVhXtV z*LYrI)^v2CA@O)Xu!V5*W-mmwHNR1qm%%zH0}D_dEbd!e&77;Y(10IE85~7JMFLsY zU+B^oXyng)M(%a5BQvp6W5^?kgVQ%L6x^EM*-AN4QZ3^Dc?)>mDM*|@cN*&&k}YDs zgmDlx+i8dtXal|L2IR|s)Qv}YXymwfm7mc7W*q*t>V0`-R^eV5lcqYT=cQkZ)RMbc zBJMcxhj%3TjsG_wI+AaK>Lj3crYe3a3stD!IL{+uno^{Mb2qs9q45!i#v1~gd%kx5F@v2e{CY<(QjPdbVqCqlpwYEL`5qfIS?Z{Mcr4R164OH*_;6zxnumG{VXg zYt7Z#%oNKt5pNoMw8^gUI|`5?I?LG51(6Rp%7Xfj22^JSbH;%AR-xyjL%~aw zUS3`e+fx?DvNEO9y+cC`o+F9>3Vt_x+_-@|97mEq!=K=?a;|gnx(zqH!)j0HlQeO9!D%zP9JiHa%>V*q7;4H#mGSK4fi#Bo58B|Mt|XWVTLG z#oY6vd@btTbG!N@(Ofm{;@kZ~pp82Y$7d05Ym3+6r zhfJLiQSS?)GkMaySTlI>^YStMW~2-BIrJdP_3g!~=8!$%qS3V95H3)^K#UPZRy8zY zfUfn`xes`i`?UR)tn5va?}lJM7o3dXp(+RSVS}8Sjh-OV%pX2v>`$JDL(m4_1qWF% z;h)Wv*5~IY)I)DcJ&mvMHh*m4FQn5xM&oeSzFt07PubCSZ;w^|-7NlS7lrkg%uY9; zpDQZ9c4w@YRng2r=&R45Nl@PH_5}stuba~*$Kw+Vntuf{{K8l5#Dd&mdGcIb4zrD| zro>C?{`$T;Xd|_-Q#g)TKrb`E%~68QpA;wZNj5v2#t{_TPzKRBIt@|JojQL1(Fb^D z^$A;SGxXdaJK?RV7=U2{mlq^;pIwXppu?|ID-j7X4q z+*e0qPt+QaHvWb7_zWm2W^P~2Pk7jzRfnKn#wm_ZQJLw+^5Dh(%s}Lrdc#xEgDv#> zh-h_vqkSnSs{2i=tb+4o(?8AC<5c&0kMh@3efNguG1GRg4gF{-uD|>PW(zq! z>vI-H7ISQOn#Fz?NURyvU<|IL^I6}H@OX&?zI zKa57lEp&f>|M`XO!>oXVT-#j_5&l9my}y=+r)v76`s;KkZS$6^4bI%YSNwE66iuQR zkh#FU;!nA5{Wjj_L-*wK#A%;oLoZHG=O3>V4f%p@uQA#DDws_Y#S&Kc&O@Q{X{U<^ z&Zj?Doow?J}B7n6`%}WXk>l*|1VcdCZ0toHM&CPB5%~;1t z6BFvz;^{)}7w8M`9Kesx4!sBD4_x*QC6W~Vevne4Xh1=y42a~+L+`1hhPUOpvOIT1 z>!RYC6Qq@I=*2;t_Q z0R;enm_IiL1Q7BSe7zp%acV_r*RZ{LeC%wmZL;csUE= z8$3`ZcTu22S-R~HmX)c#&Bxm1dE_iu!353hXgAhsV_+L#5}L!JDs^@9isyM42+FgR!>at8DU2v;KhUkl2%^JtjpWJs-eDtEpAB}2DoDBEaXg%o2E`#5 zk<5gTJ#=$jWuSSkghaq#=FoxtJKdQYd71u*+Wgc2jZLo{c-&PK>g1h&4wuIqT9Wd zi(FPWASh;eI5(|nM4ZFFlZG@!_uT7bh_as{!YJUfvNhO$VR~aoBnkQN;2=;R`#F$? ziR1rKF`tTYNrYqW7CqzXtw=0n_r|bz)eEiv<8_bag8IN12^GSa-;LRPP^;q83^=|C z9kIe9!+2AhgD}HT^zFzgEBYN|3*(6l`fp)wn1jYA^SE?-zk7b+i1 ztJ^-)7RqI-)X0TNxqq<%KBbnuFzDDhM$P_#;dZSA$}YE>p!jh1z~u+!zy1!Ya-0k1 zefe{93DR3D(Z@S678uwR2xI54$nVNpuU4KC^&%f`uM370{BF$+?>F}eu$qH)(+Ww< zX^DX4{KxoSfBFu7Z+Z^$i@}nTJfYj4UPvS9lVeugL6w~M(Yk%NNyTf64h$T~O1(Y% zm38O1xZO4sD~U&;J#bd5#)0cCX24nbvD~MU)9{!7o03yak;4c(H$)09AR!^*YLN2u z2Wj-=Va9}-!;(B2#X($T^>NQJL@u+F8nAwKw0YE-u2Hprf`f`)(K`18ulVZhHPrpg@r<+R!qrQ^vwbUA4DNSdFdH&pUC|-)K*GHe*>3Hu0LRiV!J3BVa}WJ^#h6XrC1+OhgC+ zb1Xw*3C3YPM%xu@uzVjTHBJA77e-oE%l4V}lP3OuTny}aISg28PvdS?A&hd5li%}e z@=XgVDWg41x`&riIsQb5G*$Fg`pW312u6xS;P4T(K0QU*+Z6>d@b$+-)xkwCZ%Wrr z9oSR-D;gc1paXaOz&nnxiHMC?=Z+r7_ZE4G{wfl$VT;HjyS}4i(PoSGsus&4fO$L~ z_l@>8V|&&A;HYPweaqRkqKd-t5!>f@UIQNZ*y)sc#r zN7Cc2E^mk$1!TZ_E&e-D`+uR9{(zX!{gYg7Vnm38Or5W4$J6>?YYVsVIS*t?|pF!Ls}VM}b|e5WqpoQO>4V{vnJU(ZdnD{rbtc$P}-`Ru0EU}H?^8MLSS`irfBHnXlT%J=-Xkb)0%O@FpS9rXgsS)!E5Bdtsm z`t&$$)-Hi;&@GHSfA1E9uMW1nsl?I0+E6MtVMU=f4Z(G7E%fujJxzYDwJ{Fcn#OjI zy*Mk{R1F;ntfQ{M>q69GYDrk?Ihexo(Q}8nS?NdzXT94-I4stN_#vkZz(>w(h z68T&deyVpM$@rD3`OQ^ukK}!qz(7wc-kvaHkMqOCybm1)x80WSJ>iFtmI8JVhaZB{ zN>o2iXxU?}nS&nJ%ueq;}MB~@4Ux7rMQ65Ql;<6>exhs6p zeW?%~g?hJC0=Y{Zg_{`0ER%ow{jUeQcTW`+6x4}fC$z7xeS|V9nG7k|g@s>WW;pi@ zU#%wd3k!$QuOiB<*nh63Fbr2v=d^H>*EL%1f}4J9Db~sGFYh)e)o8vsiN-Y0KNnED z5)Z3hObb?VfT-~GU)PhH=a`}`aga=yr-_+7tfX*#s%Mfj+m9!lFHgWys_d?C2$ua7 zRN5B!!sFUQ$f#L$sAAfpl4Mu(%9xLE(Bsa2(bL)@92UmScN_=x)xnFKJ)?E(mnwW7 zBIFJZ4jLKvdj4Ws>2B5y6o@gUVXh$lbyyOb^Jb*P%h89Z9S&-F_0!R##Axm33aYdJ z0`>L=zoP`aF}jxHb|iJ~9s;+n3&#+aCn+3t`z6h;30{Hf%iqA@>q<@xuDGt$xt(K4me*=zTpzWDw3E6(MY#ekGge7Q(EpKq_I{VN*Z!&U+I}W z1n%jCu0o4)HJ6XD%-YR^VY1<8bij~6dDY5BEQN>QeJrIGvol$og&8|y032p~g=_}d z`f>95q<^>8+kF41A5F0$!Fwg>g(rT3`Ou7~-WOiD#g};NznU;tDzx!xn(TW{6>(=B zmZGbJQD}q;F&4y+qe>4HndAY33F7i~hm_=d49ESM@sMxxBOz6a$xv+lQF8xUUD&z* zG8eE3ViBqocj;2Fc}yTSYOeIyXRNo%Dl|Z!5&?$ye2eV(ZnCFGx>xZA!D1rq zW$uEvtA{+C*HO}3!#=3b$@b2E2WF=m#G(`OUb;`*)-`>9aKDL&#+ji&K|bVm`Mbxi zKbrLib}}&w9vhaJxL*uJ;k_Pl-aY(Y{r^MSSB7QTZrjo!4bmkb-5}j9 zpma*Nh;(;%OLvKsba!_v-67rGaGn=GzqQxed+l?sb?!f2m%#fzamSovjxnYR#QVL$ z0L@Rg+MacXZyV!LOspb6EY#j`5%~PKs{p^1Mb)1p79`3af`3lUKzn<%`hQ{z@#ntIbrpTlEtDhnfWN>qEf;6d%~ly=YY}NwjTTWf^&hUh2gn&f4Uh(sg8(?|j(xjlEFdSrn?526|MXBvG}Mm5K@XP?tcKfC&TyqJ|}i-fkWkkT3!3 zOw_>PXV~%rZ;X{$Pzen9jp%w7-omR9FyIPb7VW&Ck{)b#@*GxQh%?_w>rJ&7U_Xc_eLH1{4#bpf zNw5O-pWdZz<+7pK9GnEDED@J;c}4*jB=#j39a56B$(RAg!x53W0;Udm85egKT}E$p zyI#$SS5n0g>prGp^uDt$DN9rLbRm*g`&{oGK{Gl}&V~#3R+%PO&#C7x8X)r4gVzSa zJhbD-HI4hbT1E!K2V5O?)!kD6_48&?^OVn8z4ff7d{DdskKhSdEnzQgnll?lewI*L zMZn51CWg%R8u^x2g3rWi!lvh5c5)P5Qc`a^E*$U?NMaLY>WmXJFQ-Q%0hc`0E*cE( zTBk~jpc&L<)cif9#mk^J&a<-v%{af&28qPVJFl_%JCpw%+)@)vr~7FC#rJLkp5T>T zhJ0LS7>P>6TOgnxnpwQ73uUn?l829QsIYkARl={=fp75iQ;mt7AOg=*jqs6>E|w7b zDSP=!)BT44LJFF<>0(vh;ZAys4v*jXQBwimiKoZQDbY`p&UqsKQ}0&_+!%>@lWzJS zcNSf(nuq5T$6(Z+T+6;IYc3!XS7Udj9IF#j(E8sUr!cEEmPDMbxJsxLHNT+HpQ-YY zO4-%|G(Sa=$3tfW4%xjvrJPspQ1nSu0OWp6IN z_Jf!FN68uceWXXYx3YJk7R4*3HtdAQ^biXZRlS`PEH$TdRy%*%9?R2i;-iL7y^6s6 zyE0k5!XqAV-&|Xysh}Q3w>FUVLeE$2FdGgZC4pMc3lHAD34!I+kuP!F@*sGJbz#D6 zK1Kt)ZtN$b2VCjBCGq?QJ}ZMky7NVK$mNGD&FR~ORX26^{1MuWUS3UZZuH{IArLFB zYHxWGI|2bq?_q}zr*#3m@+vqTvE{mgZKZY}Kh?whTZ4zGxhfTLTr||{{YO{_1C=(S z#~|zsKzkXD$-GDaschC(nTYPCGXaCF*@6n4aI5Xq&IeAC&`oyx+Ana~rz8MjfYxmF zagWJ(O%w6u;vHp4SI-y$nXB?pL0Tf|6>h^Z3e<9B&&W+tnLO_z++6mArQ+jxpYRaw zJ*Eoe@LrskNe*5R|0UxOqM)wz`xc#(e$I_LgO+aLC$kFe7>ALY#5y2)HspIXQan*Q z6EF#|yjNtmz}yji+*I|qajd`JB$C!(HUU{trQn5Y4Q$jOb2XQ17n<7W+>D;Xc>0Dhl0A8Sa{V>pGZWlG zuJB!;$e!(^Tr0A$ z>QHAH8%x2L2*{9&M;!7(?zRG1#+Qt3CPKiL9sG{-CKI1`mwNeRbX{@ z$(GhTKWZ>Yeph$|EPb@DKqH}KBfNYaV7n!BGVj-`?Jsz+Y?VJ@KemZ3zixU=su&$= z$B}zP#JXK-3njbFZggr`ofYF!p$ux}VhQ1LN8ZBcg_PY0)mE(~;-Q$`FVu_uAt)K@rE)j7=TSe`s^}l&{ zab~H*!B=o)~*v8vuoA^E@UvO$xBVf_mhXziHO?;!j zra$FnrxS=kKY%TqXGmEBx38`Q-l_6<*6yJ1N~1jm%-limKK)M2Y|ta&Q6yr!nQa2; zabzje5~`7aFmvaapWBa39JzQe%ab(Oo+SvW;}#yUlm5GLRl6%s57MaxNOsHlNC^S- zzO>t;VbPVTxPrm!c%sDH`P#(ATlVvpSI!D495`=sY@)`};i*%k zy*E~hOeR&|xt%CwRcam>wd~Pz>b`~A&kz9|-1Lu|Y?`V*W+s#;san=YSQbHo9EbcR zJaK~E3fwDeB-ePi8%6ro!%Q;EnNoyRG}zu59!Ncly_i&##2vCNS3keN>fan1ao!&E zMzECRTVjJR^KGFqE;W=`)pu^JV%}pq!82bJW|eT>{*04T zC64HHWh5&c_-Tc`cy^f9@ufR3YG(ia(DgFh(6*Aw;#2g3P8Y#R*Fss?#}Z`eK6yJT zWYLDqyIx;r6Q7!)?ahG1^{0;*D8bmTUrx76#`+uPB&A&p=ty=SWZgUG_H#LA72fr% zRP8CoQ=1QhvuP_FR$@0y*7+~D++Z2hYK}C>Y=9k+h+pN?L8jA#mwFKE+hn+mr7d_% zW>|XZ{Q?KBKDbj_k@BbOw|NCWhigQH##r#=8lll&%d2Nir)hfA5WaXBqB=&6-w-Ua zRP5_Zw_TPA)uyIl2|eG01Rd})+3&oXI8Awha`L8iu}eaRKOYHyEIzE1VMwZJndq}P z{&iJ6rm(?Aa#}>kl_18ulrxqRMnZp+4<3HA9JJq%$@6b7O>lI`z>ZqKE*wcvuBN_M zt$)E!R$iup>K1!2F>1Vh1Q)sR-Hm9@rFYp(f3=N*lT$>7cgBJG5E;iW{U%)+AYA5e z|3yltc%?00hc#~r$&hyYNvM3A=xMQ5&9NI?hTc_w#0)b|_koFGggam>08#KN&r)xG zt$GHEaYzp0AwOeNe|2)mXe*{we;Y-0tm(>i`%DvlLn-fgo*eu7jcv~=8$ucHi5T7X zG>#0e0%3GxyulA#lna~!Nk7+KCdWbn%>Xw)84iw>7#*U_buW(N1`Tu{Pc2_^A@cEu zN{?-;Clo{-I~aS{^A4{7a_fsWmv=W0Fv(XK?G35RnKsz=INrAdJ;bqlb#mAu;&yVb zXre@XerIgWE9CqzaW?lE*wj}Oc&q_zG1CT`sz{#03jD2W!_3xY*oAWo5`F2cZ{3R3 z=TPA{DpObni6?I(g)_noIN?!DBBF8^sM(EM01rPtZE9-j-R$W-G-6_uEt`QW5+Kx< z$NHCwWSH$h~J-_m_bn!mf<-*1Nz)~*wz*BwA7CzqON&mBY0cJPNo_^TU_2cry33wF6 zI2)100r+D9XWWtZa|VJrP@i=Q2^{B2IgjGmW5F!6aUN~Bpq?sThzRI}E~kDHZerm! zyZrbl&S+PPR6QS)zp0GH!RctJXWxo+OI%;Bt?L>mA z*h6a`)6zT2oEy8x6=@$3jJNfO$fls)Ef{!h_v=T319{#)fLH>qghs1> zJoke7zLfQXVN!#BusNW__kV>x7Y)3E!GH7MZI#Emyk;ENrv&7)?iG)nYOn_Qls|wF zxaj)e7I*A+6JcwzTlNM=59U#CzURzRo&xrfKUfNLFiVS8_W2TrQm;!arsotNK;^g1 zh-Vc6E2Rr=&?+R+Xu}{LD24f5%L_fSv3-`-Mkir(!gZxW$Z{ood1iyc|IP4v)>i_5 z@`p?HoXP%228Vyrs#woe{1b)JaJYn`Z>TMsWKC5R!X+EsfTH9SEk5Z~|3%w1|0%#p z5*3Xk{!Nq$TNWiooM%)$-DQTl_0NOGB6`4sEE-S_#qc(29-=GlhlJoZzu;ea5ym$>m`5K4z3lNmw&0koCR5{{6M;;f48e=Blp#c!;5g*XjbZ(>-Uj zDb(Q1SV0U&6(ktr2Og~i-!kEK&dAsY^L9xKGWndbMLFEmzt2Hfu1XBCCtK<|Fa)5# z6rJ2_miN7ZgUYb?mq4;NVAFf$LT)IF zpMIRb3InVzf4~V7B<2)9c(h1#lY@HHUuaAmlW~ZdZuo^Sd(DBsWH+4P?eeW3mX(n5 z?3eG7VoT4pTn@u6&s>L&!^U&~Ce9p$m&~W?4opas=J1~dT6>TydT(M^%0IHAKX#6q z@sa=fa;VLE>`_m_9;gDCH8QQBCWz=RxV!a(qiU1P718iM^#{N7!Az*%TuY+cVo_RD|A1C$q`*{tD75~>>dLKC9Zx(V&2O+l;x&^R|tvWW05WLr_+=l5a! z1PRNa6XYZ9&e*h)?iDqtuPKP$(P=59+6leU4TF+hW(yRB2>5`K)N|e$O|_frYVy<; z8!R=y4a#L%)(o3>chQFWvgr>`_2`n=1P&7KvTY`f>1>wq5K|kF+EHTNh2zYw7s^Iu z{QAs++k2t0^F^kP&{h`Y82neMY+)e@K;bx?CVbKFbyNou(A;{!?H3p1hKr%Hg&D}i z3lO*s|Y;CbITH9xr=MQvTc|hkH>gk#W+= zd{bQ!bh;ec+7;!$O_o?WL(GwW6b!9Hb=Rzl&*7nycaWf%5?$w6qc?RVcy-0oo^$Q| zSH#gGhek$zV+KNYwOgSJ-)=f$Bhp=UY^$9-mb^FozxR0ff+BTd>QZWm@;QI zHQQOQLRM7*A-X7&GBsAIZlGjcCK0!_+a|W}2wUg8N$kh-M%dC4o3r4qT0GE2a4ZRd zt0uPr&x@;Qv@=Im)-IolhNiu_hEUk!4tMY>O~lZr0nqBpXJL50tNJ_#rdqNjI@Vtq z)Z(uC92;< zr*z?+s*B79qPDTE?of)x1j5B6#969H^`+iUwCw|X+mGr3c2tx!+2sdC%A5;d8Na=O zQ;s-7srATVT2UW=J(5@K*jNu^@KB_;HdB*Nt1ex+QT&g^w9j-l@--Y2LHEmQWVY7kBtl3*p0`1PMS;GvxmZ)C?3!^Gm5TLl0`f6J(@b zmBP$it^QMRzlK6$)Tln-(4Atirpu^QT^||6XA*V&fz>HL*c(;p;?R4QQMvsALxahz z6SL`fRbpG4lpZaLnVBgwTcyUc7@Pm3(5p)twoLa%QfZF^%6))%xTRPoEFLF+0U81C zF|?c(c%jR$Hm)Pq0^STbf1|on-4l?S)t-u02mB#|hLnXcAOjv^Vqzw{%VdCMz1fZ0 zH$OWIxRFA*BFG|wZE<*poZXaNxN{nc#&EQV@%0ORGJ(A}RcJp3`sbf9X0E;$s zbFo3!EAR4L;I3wSq6>t46vd#(pr0YS?fY+wwH&+VebJF75&VudRfQm3LS+FBfaHGzp$@zXgm9D;{l4^ z{sZ)0-A@E(stb0q;UP#)-C%`7zQ7WQB>e|N+{PkE65@SN9+NBUXy593H$VCq}lw=uN@jGWMfoZ;r@54!?P$ zyccKGBVVl&N8oLA1aN`YNUD2<@=F&EZ#c$JigXti1yCl%4^@4hh*#s@GY0-_yjpQd zsb$VWDto-rRWBl_O+dLFQ42}vI{6UMQBiiLcG==k`aaKetFyUM?Xq8Y_AHCzu~BsI z1{Ag{DV9j)5Sk@!BV~H9V=%AM=4$Q#v?jVg40hP47ZPP_p>pckMi3B?Zq_?T1=|h|nDIogYga?QquKM@l~O#T zx#gx?C=b>|-&W19Wj=ZTkUCy=6hXSLlAWbkp>4wAM5vUG?8eAUVzb1Z8CI}Uw z{|m-lGha^(8)Fo+w(YyMf`81aV&4#8YB|!`IWDmFgV=Yh%@J}+fa zZf%)ZTV!Z}`Pxnvxfw%g3+<;>RVORJg^8b-~TQlec?`H z>RYE$F>i$=SoY0z!d=|$XK#PRdc6OHsJ**@Uu@zBc6C^^xVqOmjje^kDEzY@?fTQ#6GL>W}x%)*x|4=oR4RS!^fjSj@jj^4g^kr1WlZ4&l&a}f$d zhk)|B9kU3_QG%Z5)%`JvpTuFih9%XVV~W@0l^q;PGezx)_=?B(NHZU7zSs&0>GLk4 zdpkih^d=n(?;m6BjqfowDnEu=91gI>o(S%7Z=n&my!6}$*FG47$&EYXX=n|;ng{df zjU5HlV=L=gFlDs9Dx>wJZ{8%>k^>1WCfe^?j%C@tS*C!ywa1^jZy~;LbrhzbC556- z3@Vjw4nIio5Ip`KU!gLVl_)|Q_1!lo=KBCphZW>qe8O73se>4AU4MusaWX$tfO6>A^*DE5f}Kpy2x7bP8lJx- z)2`VHw<(RN01twYXFFj*#QH&5UkHX1AQ7Tr& zj&SuDZA!BOU`QM!G&%C$2qXH-KL{hT{dQN*gxKDx0y(_x<)^4x-9)} zskZ(YI4RVNJB6bS`NO4pMrq)}#eSy}@jWHbOQ+P}Ri?hGth^7F7a1jWjUSl`s|kD| zyUjkunW*T^$jYw%^rn| z1CJs^Vqo9|m7!l~)x1l)pZd{esCw?VE1x>X3!iG!TrR~u#g%xqsdx-6Xa^Sh9mOQ|t^Jc#`MFc>*RT1Z z+NBb1ZoH|3%CYpI^JAxbDL6nT&o?~${q7fHv&gNIP=epyr2os2V+*p>0;rgMnn|A` zz@IuPt=P}e4|_I0C3}FYkXyQd0 zRnq^Vm@KKzy9Mb7hY6oELt~k97Sv8y-gNtf{}G2_rF_=m0b*71f1$7?0pLD}&83O> zh7Kdapnvt_EO6{RkIlYcd@!0#u6iSW?THKZbiy9$f%e#jzUuXnE5l|?3sPfJTLaKWlGW^O@S!#k5Ug zyPI3ZCJyO^B%tK1XxV&;zF{2P>)G8F%!6jL&O|{o&me%~L#{(LA9jO<5GhJ_T56BO zEv`;ni;mCuy1&^Aux4O3%I3V(MAW*5^*N%A8$ZSIkYExqPl*iHU?4*tpW*VvWEZEI zhccJnttC;T7AJbdH2B2~!@%#8vex$3U5YIjNFlx^+5APa->@6jQ#}YCG2)cf`-<+- z=4E`idALp9W7nbW<*{1{jMc6V6nT*Q;rj6^0@cHTt!qdO_n6~blYw#*_6*KD(>Zn>PdVZ;%*S~R2s zo{WzTTF8Xr=VDhhQaL8rbaxdPycWdmr#dAo^^SqGdjr-1>>|$Qj=vvbHtF!MVDEhM zA|RcFaI0V-IJCTOlYm;eysWdf!8abd#_BXV>UGYgkw@9ad*km|j=u4Skunr1G~?!CEf_4A!Hmx^OC9{CT3O02y)amoKsY$$2}@ zR8#5)$H!VWHJfjwx8ZnU&_5e9>pv8g*^BTnnm}bBwhyyDz3O^Ucj6wbd6yb}pppDs zr}(-I)G5-3F`l5h_+rHj2JG#K`EW4i8%b=Ix!q1Th&e5nN|S)~0U9juKT*i#D2eU- zMz;H|*3rFyX*j|U&)oYY6!jgu@Qr0qa$bb4p5RMf4Hv3a&!q|XZ!oBvkw}zBMSO7R zr5Qd)(Gu^Sw!>JA;ye#~Nk^i<#^MAgjkR%p6fmILLT@2zAp@B!-2fV0QaPdO#s?R) z8Eyk4h>Z^(&>jM~#1T>&@dPnQ&Q|t!mk>GeU>7CKvA$}E6#vRYTtlXXu zT&|BPd#iQZX)nZ6=blyj~EV1GWVTIXkVD=*b=PUlmtA-o= zk+|~4)+uA02;k-UOc;Ee{t7jlQ?q`)bD+L&hU!hGI+&wwq-s>3R8lLta(OV5?2-Z0 zZ^x@~baGCr@iQa}WI2?CZ{F1m*jw)l=Il+@3=Urar%+M?Wik%jqY+wUMam_W<`We^dsRcK!*KzyM*tBejMV&E;mcLm$!sn zM#C2L2s_*}KzSa%{GM+q+e0eoGhAlt6ZEzT=d_ibjC(4hk6p3(TLU9ys8uJj3mlQ- zJajdV&Zv4q`Bsl!#5+8+PBS89 zxQfbTc*W*Imh18f&aG6XZ^3+doBF0oV1z^}+)ry4bRc z6X1PkB~Wp4`A#AW@5Qme0h>1k-}9=Kn@CNTtjM`zJF~tS(|DBL_y? zFLot!GFxDhgTMO9)kDxsTgJJx45U|Ary~z=C10|(OdB7YCbnz|O?{%uh$ET(fjCUF z=qE1)_zU&v^8!9Gz&bpid2^sfBq8c}Z@{rK$J`m?c@ld+Q^``7;djEAn_+*o`@U^b ztmIdS)9n*VGA=qy2K!HlgCdR!_;|CNPU!*d9f+qnad=pBc~|sbR1gv}nr$PqEF{dI zpdHfLlikW~oawJQ;;3>~mM3~CfEYmdH*{Y(k+G*Qn3Q(_Ebkd zDCN~kh{M8R{#NKvlqCB{WkEA6L@n|7CFZo%S^{0~T%#R9gmLeWP3-)A8;qis(e=-d zy^o^0osTE2<2|XSBTjn76Qt^_fnXX+X3n-sDH3(xgV|Mbd)}##b5lR3g8C&6 zYA^2m3$y~+^PjDAaznPSzCiAZ`T`6`ryPT?@0X_E-RMlk+&~jGhJOptgMt}oX5-Vt z5syZQM+CyN}NUG1>GD&kF0EaL6RY$P<6ym zqE$)rh}1~;FA>lm68}B(c!epXX1xoB5alT8?WNYNFzAxsx~UTLp=EnKf0!)dzqB0t zp8+U9mijAVhLM^Y9w4;#)Ss<_^b61Wv<0A=2AF7sQe5a+TB2yoH}SA$>dSI zMEuiB20%$*(zz4F08)6CWg?$=og4ighWpdHg2D;nuN#g@1cSw_R=iy88hLpSS~8j@8vo7)T>^ z4^!=DaOtOi)}uVJ?UkL#m?PeOX4-t`1PfU>PhHLRk6=^Pkhgc(v)t@R9%?aa&k(Cb zpsMpQAKeC!9RZ`yC5e~W>hTvYCz}gyGk#p#Y7WWU*b8HlO>SYp2sJK@6b&85sp_+L zgKV6aZ9&NK{vkBVY;tvAP?Hs;bx+`sQv{86B8xjyLu0?a%bErGjNU^x%Uh}PXi!8A zjHyA3wQK8)L7Vm+#`UWwp2+0VYBAe{K+d`g(t#>xtP+P0whJ4bYAv71;w`wniiK)d z=ZL}eUR#Y#i)_1y`DXMy?O<HtG}s>w&|02S&h$pEE_iffsAz(`oP4YRAgH&mSC``zf=&s4l`Ob$KIn zRCT|tH2cxxb&b0xD!e|>`0!Y#5t;RA6eYz0dd2SK)~UTXv5s!wRljE-oza2E7kYM0 z8*#Ua_?O40rbUm^qDpE2BRDEGHB4V-zZ&#R)uo-T!2l`qZ-LYLuSpHSaqs6P4(Aif zeW*a_H|02+IFqsa0tC1hl0W8RGhO@jJs0wyh=-Ec31U*fIM8En5j=I*09IC(A|qWQ zI}YSP?^*=hWkRsUgFUnLsTE!NF>zJPdL(Y^uL{_XN!p;ZYep>DQ}5abqwhFgT^6dyuSV| z9LH-xE!)~+rdRtuMmi2Yy=0>#3mr*yCd{j6?KqPQMC~nssNW|jKs2(;t~LKF7=x1u z$FU`TJo!1~I%i#c6`jHmJ;k^)pp0SAoN9!y;lE8%_8=wMMPW1Y9$3S`fQ%7;+wPqg z<-~)kC?48>H>L0T2GvdzVbehPQ7A}+?A&7*X$1K)|5P90jr<5h08v-HYnEzdh?NZ$ z_$YGtip?D_vIJ*aVO;MZE?+TeJ$NjU!#u;g}?3JfzTvr@t8mNmTXtdh} zgFkQ)@E?MeI(B!t+u+W?jpRLwMWIVjQoIHy?Mq1MtRWZ>fL@SQ!VBGtnk#5cRVc-> z(?2_(D54KQ@1Cq)aE*$})BW(8l)Gsi3FQGADzIPb3Y&RL`XIQuA?zbVX=Ub`wa$4e zDj{u{K%ij`ZOI9`@qOukr7guH#cIHo@Q}Rj5du}DfD!H8kN&qXMfTkSWx`zbs`@^} zedMBq^HnmHBM&OAXKPrZ-|H^Fbm3$3%tKZ-FGUYEk6+wtvA2C>B%Du5@86W#5YM|m zpgq2V558hpuYJH?nK)OU@VC(%7kT>O47IE{NBY#hS~Lfsz5QRTR3J`V9XE~x>_!ac z8#>`yT!@*k^igeAUIXR6E1FZh&inG!ua{N)C%4qsL};aiR^mw&0|HkDXeLf<1`%6* z=_!r)Rupip{xn-}gM`L1dKCiE;TjYejz1mw*76;o+MeK947j*djkzMjH7FBM+klAk z!1$3!#T@0A8H4SGr@Rt>7-W&Jfepv?$f#fFq^JKR-nI%*Sg)b4e|}RX+Rlv zaQ;Tv;}%N|1N>nyj@n2B}M9zO3!HhcNs@Pii$_MjCs_im&fa}{s z$eD$y2)qT6W}x@(aTv6k%`B4p(kJ8Wr59q$!%jS(TNPgP4}nalfML`RSWnQ2P}th7 zq9AJ7Kx_53gd)rKbGv*6sldNn!uU+;8AWA|dcce_7g6?sYE0xy;;*p&$gT#>RZ@Tl z`2GEJlF|Ut8mId#^-kK^#L4st=JyZ3tJ1>?W=>dbyx>GHnh?UEfIbyFN4>tV*&&Dl znT`XatIO-gs;u{cY>o+m*=|knWD|#dObLVFLk6EbIU1qmvuFeO7AlZlUn~Si>e$iF z8cNe~VA9YRq~Q1W7l8-;xRx^(2nIUV?XK@AmIXn?B9K5Bq?o8+YkK*Gv-DXg9Iec9 zKIZx*lzdGNf=0pkGKogIz7q(KmDCVD>8z*#f?o7a(9zU2Un}X&1lrdw(ZM;&(VlvO zeZKU-PHFxdJeaoUU>fx4k*~fSpr{TD{qQC_>a2h5MJ^Y})n~@8`lrqlEye^j^C`;xD*ij0 zrM{Xs3AJuXKlmRRWuJb~$_GU9veyOuh^*buT5#Z1s=t(ehnV=c*0N7O@$ToWk3SVCwU7T&jgCsuLYkrtY-Be?F_KnmzK1{Igq4f ze)HWnT<-S&?h^=pBJx(V77mcRzYPECmAN2snk6uChu-?}_eB}D*bvvo1&)}!kP6cY z_>w_8*wt;dJFZ!SNn{(zdX|bK=la4gu)jK6Y(aHxsrVi8?+J|wUPBnrR<7s#HTADf zm7>8$=4nQ>xPVeS>U5M@ohJEw;32pRECv)10waF7#K!p*^^5+!zZy*PV_WYz_N%b; z-Tm^t3h6uc-d|`=OMavkEqBwDbb5ejEe_(HR85!BPI z?VawEG0Mz5%=&7FchEoj3A)fp_jU2N5a6JPzl*ot=z>53~8mH2i@ zDV>l0;AN%xkU)Ak+b?PQ9!j4PlC7bAN$flRH5oMx3_IprXNw!bm#5ip6NCYeSi0*= z@ZETg;6{5iy+pqH^woTHzoB8^MJv6|?IQ2^=0M4Lizry0klabZ02S=9mx(gt|8-AF zaKQ#5^>Gh=fn}E&FrKx?r6y0)!@v*t3MP-?6UgI8!d1h&-zX#4ua~oOTxH|7fg=WL zH9W)1hwcf|rDAHalbHbXoe0zp6G1&7$^F}a!eN*?pAgWBf{3w`iS5sxiQ$V2LJewJ zJQBVQ)uhf$cnnPg>h}5wW`iTqEz>_s#PuB?%x#-wQ%jbtYrTa!r`ul}%6GAGVyQ6) z9I3D*-!(DAeUN1{Fruk3AG!pSPRppj#n3)aYycJe9)$t9k#&~jgN~7q^=oT@#Tq=- zt!YDy%AD`VoD^cR7y3Y}jMk)hrVPqU;&QclSvoTD_VS32A0yWcVlPnc@>6m(j<})8 z@f)e^WyqS878_*z15Ppw1V^0Lr8?X_L-h_t|KO%NN%Q?fo58hiNWiZHZm4D?#s2PrpoOm zgD=mY-!hXHx1tmQR>`uh5ojEe;-cn^h)O9*y;_aLii0|p_u6vQpimqUD{wguL4qWq*t7enRLe1QAhyO}Wa-CAd8k$}Q z#N(-Y%VqU76V@U>;;1siUAY1Vyl*yIje)|H-K>t5RaF zn-DqRF$>vYSiD_`E5dwT+bUn4sE#P$H9-Ks%c-Sf^eMmERe3 zG&#B?c=^oiEJ=MYY8QtKct3fnQIYdl0-dkuXwBQ58=>8c;7x zAv%)t;ob3F6M_9G0=;V|TwY_ZmlG*`iaQHx^8ySNS*ZS=_S&2rvJh;>2>tGmTn7DS zChT=vd@NX4*bBUFg{YMlrbK!D6$-f@iug3g%NAvf4j7Vm@nrn(*q@yi0htOba*3Et z+wq&Fs8^_=a05si9h!(+nDF48_P8!Da1zaI+S~%sc_j&?bjyKA1ppps(Dle35MSxLX?Io| zHi-iaWI?QlBh>cBo&o(3_FA{f7$yd#sMmGKkyK$eCs_uWJGwzKlywQ*qvwY>-Hc#XKf$83KFM_DNZ+0I2gf-TR)*dr7)) zx`pe%RF+&3tDYO_*%W^qZ&ZT(;Q01RgleA{4k$Zn^(<5O_e(xEMUEBENTrkZ$Bx|O zVg}^zp?($*$C*M1uX*C)tK;ea(Jt?2I6Mge77}zhzPtB@ea11U-V5K0sMGK|dupwA z2EKjwPFP=o^b0yhbZYA7^G|T~(Mhab_iHGu(NJ{8FHyY_)oyw zsgRMB40gi74!jNo`o^IY$91D7Bpc}q-ZL9q=ZKe1=Sjcl^Q7}xtz>f>>zTz__oqVu z;61|;#O0*5J63Ay{x#PX;PT`jafIKa+2Rq&2}Ee`N76IDdQ3$7@#r*;1-V{P&+@1n zF7R2T**fX(zm8thDc;f=-}VMIWVs<*lZnQ0(rlg~*3fUej>KE{q*w1jX?jJ>%cl;6 zmC^OAP)`BfKmL4GhYXr$$cFW~zUSv)@b=?CX%(AKtk_)cbNzY9p~Fyb`lrJ@z3HEONHzaUiz)PIxUy0c}A> zhHnvH8vpr;{`D8^&~W-zA5g5p%KW`8>Lu0pUtmu(z*+atT`UM|1*limC~+!ge^>0r4PqM0j4l>j3$P{yesB&IJ0 zII%|%&D0jsY8n-zmRr1;^H3zDMYa=3oY_qM+}HNt>nQ(}!Zt%X&AQ97C;dh(-NUo@ zQ}wv(F>08ZqWlyNLRa6^S^35!8qfd;=ybn-xHF8yYJ}k+{+ed`jNIX(kW^zxwBnR2 z@)jZmFT8E4rP_!*+6dJEy8Cb8j{1Wmh&KY&_0LQR(CGp^n*1>(!A6t-{gXH4cA^II z7n&0F{4ZlPINAl(wRy7(Dyl1bX`2=1Vfo1%{La zsTYJz-KU6!A%!%feHSVp)r$#s`)vZ_+2lT$GCaJ?nYeTb2n;1R%S`()jmFx#=j#yE z86Ys)*W(k^xu~|0u{ED1@gC>~H1;VYzfKyClhC)Z-)6A@&Di1ryqDh$N-!2tMrBy6*Xne~N!{3?#SrZt<6DmbolU=_gX!Hni*Jy1ou?}Csseosnc)TQc!vG^=70%dC{?ij z^fSJ{lyguVgZVXalYrn+wdz>iQ6A0)^}J1cxuVX{c?t4#10nP7d-AAAKHp3#La7A$ z0{c-%y5JW^X)7Nc2?kr5;he6zL%fUSMsvC6kO%_1`DN-FjZhrE@!OS#TNA$#Gv%o- zEDT2pbP#P$t{!i6 zEjL7s;{c6@EHhvqiwX-Vl@K-kwfIwsLFa&P-QFDLvgZ^Uy_t$=vy4c&^;a9ODD!JB zQHyVVr|IFWu+Nk5ndYh}Mfj9aQ{^fSQ~OQ-Ex#KdQm;d4SC4nKtw5^a>WADgI%;s+ z20m@CQLl)~`lEq)V{2s9nd4RkbX zWXNkpqm()BS14mMJa@J1hFHP2`tvYs6WY))m^4AA_y(vRiW=B9?xVjiCI~p&fN+7| zNkzhxQvHgvPD#j}JP4V`mU$5$tb^-s#ivknSuMFO5~ez9k#muJ9~kj|SkTEuIsh^gj13pxz99z8m@sb{d4gEwvC+yb zkOOXevd%r{veKy2n|c?7>bRq`APET9tqrck=~xb#b@LQmX+@!kdy_H+_rre_vSE(r znwi`Cv|kyUOSIkWapq|5xt_&BIsuKCRO@lkFyEcBK@oCBHrm7iDSHzxi(>NJaJfOOQem!tX_oXoSx<=O`Es!$K?aocTKY|`NCWg`!25^_Qsqi zYV0sxyufUrnr0~`lscOCS~_wI8&O1t&~UHiW*r$n(VjWY^>u1E$dvQhu7E7AxPnuJAgrXv>9C^o`;A5CaX&~Qd`urkNq ztG*U`h*sAFG|477y1ffDAJ{=xEbseT<<(Z8InpP5L$Xef+5U?Y;K{sD{qG!%uxG_0 z-TQ0trU^q*3b%{sOQoiD-s{B}^J!$ga~{i27o(9K$!}KzmN~X(WL#Yyhw#tJZjx&X z06AXMd28GvQG?m~ro*_l*wP*Ni{L7o<#W zs-`KSjzt4+S%T%5z<&|BwcjZ?Xdw4Ip?R*UDxo76T;$Z7ZR6ML_c zvsl-pYyvg7P{D2zojmRJ4hiJqw_Tg222Ati2{!Hn_D{!n`YI9ad9LV2JgA=5WC8Tx zJ&c6#M}5TOzsb#9CT*%t^j28L#0mJ?O%Wl)49dGE`npv%hmc-?WvSII+XgF7;pf&G zT2~@ev}m#4)K^kA??^}7wi3h-d|M%7V{otj;VL22Lh=Sg6`nQ)c)#5C^Qy}(xR@Qj z)=DF|azHzmd?Q#T^Phl&1hbAx#LkNMRCpYi4txh|;f0jOghIr@_6Y%R%qZC#7AV+Q zu$xI_bGZ*(GNwoI$MN&u9AR6Z9I&cCxMo5OtaPjHzS^GVbN1}8sKa&+&+DvA5_mN! ze_u{{a7(bb+;wLj>-DG>H08z!)(K}YV+aQY75o0Ppg)yT7qlEW zeNZ;(J?4*)4}$G97Rq!b6F&G8!dh|*G<9A+%B%FDr6D2VU*XiivHh^$tbBp1=+}os z>>s)xt+%C2^4o{k`*PzkXEws;s1uO1Rll{A!m>jW&O5TGlY+G~u&kA1;oD={!>Da! zT=yPd!KH5SFtbvYdGL`zn$mGMGYp&3Y=YLf0WxbG3@qRLEg~40T<-+qK{1J>Hk)-Q z+owVO;RnqDCl~EsEQsYb4Dda)5j&ab!xiVZttw`b_?b0a zxs`aOI^Uh~ZOES(=-qa-jAl0PhlM+fN^<9FqJLn~JI2?WjO)|e1&R*1Sw^ea;}nwD z^f&)({(h2YKHlVMsWcc*ar}5HUCjOJhMjI|fpk=IuF|YjqcALjyD_EexY^F+!42Qo zbO08~z8gAC#1~`EY@$;nH?Q}j(yewiS3wRsc5@L23xWk3mGnBYJKN>|q3%87nrgc@ zQ4~=@5fw!N0V@ayh%_NmtO!VxCM95@1`=ur9kGB&Q>t{3UPBKZ6$R-vv;dJB2$0YM zgplOy@I22u?|;sjGw;m&&WCef}#(NHsNaCmSOiXFT zABcr(dPpPnF%P(sltF8XcdEIaXTy9rG>f}g9KnC{HXdWXi_5TTU{AX|w%9H7==wF^ zNQLccGb6vz$BGk|SY+{G{#L?S7TX`ZR}=BmA)xCU$!=C=H}AbN6?+Pa&`+jrnrB_W zg@3gq)m0?-^Iyn*B^13m`=(49eKtZVv%ueDY*a|-1SMi@&+}_b>ih}W(-Cz~kji5Q zc8JLwyDrrQl4zNX_@2u5jT}fG$lN)W*2Rb1)?cY1c#X=H9AwhLtk&Ke6s|8msZx=@ zyToSy)(mR8SPsSe}$paC+8eQnY}40I13cQo{32X`n;)b1yM~EkFaLw;|G^5*@KiP0ap?) zObszHy&n7Khrke>C}93B#%y4mZ2sTh&`~Y&SiGya9gkr?gDW@ssHp1ah2twade)7u zk*WYkx1}Va#@8|@ciW0`)6QB`MdXE<($4SONtBWd9W;5!4=pelb3?tGQ{GZHyG74(5d6JVQ~7<1Qv8->!7df1xIcRbUN^u030ye5&xS6P>{r>{ zOMhRycTo3g4ZO_sAkzb8Z9?O6n(1LkLvV9zUDi6c)T<=ZgRk$4oQj#tZ_;mmF*yE?)7lD8I8A2{I~>}aH|D+{Kur{tZ5VvN zvk}MHCadQ^tGD9h#WwH%X?jSkOiL5q2PU9xq@$kKy(pYPpMZpnMIwg%%qB*B5 zgIP@}XHQ==ZQ`7iIJNY&7#=#JZM6)l8!sHf$SBqmx_Wv?l(*wtr|!5Ut}iL0P2Cax zYvGf6x#FVJJMx%eiz7tJK>20-<*kSY5dnEv&P?*5r+u$x3T@~#>*SSn)1^q7;HQXZ z%5|ZGUD}X)>8@#yJKju(_s##V{Y^EtY&bD?*wnb>xc3RcL{d2gR|AR_8J%cMofLkS z)7vPy1nmj#5{s4@P~<;Fseiur+xHL?+J1clX+H>mdsaYzI20}BJ$%Bm!QAss%3kp; zbLyRDv6%3mO!zZ^8GSYA52BrNcTYrAzY}uyJrzWkp1Gt`BOBh{^o%dYGO|Zw(;OEWCm1=ZWmW@aCi2~jR9_Gq>_x6bVm1*}kH#k#BcWxgwy9RdAajGyj#x$WfLCg22 z9k#=V97g9S>ApVce|8pViZS)_9V^E)hPYMzGg$paS5lmLRnB$N8&YNKNGu=0a#AKJ z`^(IOQqf*`cVE2t!h)W5n?S73=2~s8|IfzTXfga__|oagz#(;l<@~8hi5&VE`$AFK z@Y;fSSLO8Q-$xc>s)*sC&je;RH#*CHY*eT*Are%T&>vToRtC$R{y>pG>t-}}R(YXH zwnuF2He$hE#Luhi7K7gQRf#5g{%-VptxcFkz~;)LaUPGZ&zz50`2(-S8PlYs{C4#@ zFGn4$f^2B5?5zI!;JZ;&HV*dQB)cou&4~+r0n}{BPj<3TEa=bFN5GfwN2PG%wNaFb zl+=YYW7aqA063=`HTnkLPPuDo429c{yxd}LE`3$$oe-ekeX z5`T?Q_coSSNl^B{3uZ84ude&UV_1c|MqtBf`Y3V(2in@ZGI8Kx(pb~;Q7s$hh3N=? z&lva}`@ue&g|AwmkgE^1dOzI5nDvgOWx9UF2y}Yn&{N4t`ZRV{CY^KpcO+igRRJ9! z|7L1C6t66AWOCo=amZo##FJHNYSvdHP0gFTzvyQKZcsP#QoM66o-LV9c8pH)Cn?_0 zP#(2QPOI_%9y94DdbXXKUR#zbxXh^aZjR_@PbI z1!3c&E>9@n_cS+Cj+|bOxpkrrGAF?yqVrv}b7Zz|7JxgVXJ&jcY|296=&$e)LOFGS==gEksPx z@6q(?3YuAS@;m0`c{U=ppG>^;oz~V(<%~p6$*t{fQzdKz^U6uYy%8O%Ha$ib+O2y; ztgo4{Q*&-2BVA~OMaD3yi)i~MkKQR}kw{a}LZ%3jpRpR+BZe*X#`3C2xrLl!ctGwf>BOtTCZ*5CP_~93-#sJUHPHXKDiCI5Rlfq zaFZ0}>#T1awW|k$_`%_I+dt(#+z8oXE#CAr@xw}|;@t6a@glbt)=@(3h;!&r*X3}F z6kxHTZ=JE+vc5sDV&*Sgl<4TD*d^|`-oRYaH?imqaUPauW9Oy!{=oWGO3)oEV=)c%JD1zj~gmtz16yr?gZMe6##Tq22crA*r`4sz%ViCb~o1T zymN@&64ocv1x zSBLQnQuTiMEvilev=AF$;yAs!2Fvql={%2%W%|?0cKEHH^_sT#u|vni}*YQhCOc%#SFh?9T0tjG`@TE(4ot@9t38psK2i2P+qjZiUV%G3D zZa_@`jtq}#6SpbJ;^Q2^C2HLM6cG`DsBJ&Ab@lLTk&BW{7fs$XliLLk|M;wZa4$^D8N4*-)52dKN-cbf>m1 zgz>=)@?`OO1ueEF*0~ZZjrz%Sb;I18+lx`jzIxSlGXA??+mkG=?O2-^SSYyzC(LEp z&)0Z&%B5H4C3#SS#u32Ux1y8upzQ6@Jl0_#CBW9qoDnsRUqab7VT`!Ju+%(a&ZfaJ zRFk?(>|%1o3B1dgSC9IX^t&P`^6{XLCp2q%H(u&*$Xw-Gk>KgLe*(3fpV_E>$fgvzHqrY&|pxUhuP z{`KCN^-Hd28gKH~o^E_P5ICOCx|BuE(1S1gTHm2_bu|%NdSf>4_Sg>Qz7d_r^rz_3 zUGE!>YVS>0c44RWRm}`~Zf$6wKQw8g$yMkd@xu#*O`YCG8`6!eF}t36vpi10#l7OF znEB(vopC9}?{l_?-qDBeYS0m-7`98&SluZ@_ITIv#W;KYVYLLuK<)EqoUQz+pxPI` zbJmJoW!5np5PIxfEky(rX58xPIGFpM(DHutXNN%^-eIece+Av&>WB`uNpSWa&*hyD zjGbBzYI=hHKyw#3i&~BvT!;tF+C_`WoG%RYZ+K>o0BpA}lwoI;D)R{5tP>N1IWeYF zw)sj8QCXpdd+$_U6iKgF=15n)m3CS;^QG$`pxzX2&esA+oU$}^piX@W_+7QcZ?tZB z?anVb64l>gC|XNY1|MkL?sP=eq=tB=3w+C{ptWk4m+moq!@D7STvF9LP%#@x2Wdp? zLF`KhMln3|UEsVFs#mTaauQD_-)bDWB+Uyl^Mny(fuE9zPxrI&pDk7QBj{1j^^`5Y`e6AD>*@@uvcM$=#0 zYG1TIFM4LZ)knD!y)!#NMk!kE_4XRaA#=9TRYEqRMZe293Qex}ygnD>F~-9;GHZAc z$i(*ZvHOiCr6#xTdNyTe=hz{#+&R!Ter0Cyd|viC-pDgpeQNP?0atuMW!V=T)8--u z95$2Hl7rB1-+f~BWv$=+>QZ~in6R#S*5*q38N~R#svAQ~qLFZOx$;$OMYlD(C7GE9 z7xT4Lrrx1}Ez~k4+Rb<9n8}nlONK}l1l<`1n z!xLfay4Y;wV9K1tQvKcGT+An2<>m*m-Igx5OtU}YbsNI?X>4xj<&NUvC3hLTxppws zQK$LUxH@177Z|P+5)j*35jlj^F-aF)u8Xd^-Ek<7Pk#l~E98m(DP|Z4r5k4(5TFNI z-5VawD8=2PRaU5;jb+gAed6d=D7D z#pGgX&(SbNyM~qtd9a4uN`DofX~pK^8V{;AnZPq-4Drh}u`C>T>V3***rf~1pCIng zQ`}q5G*$t-CT5ZSzT0ClVQF$0J0IN*srM_LhyIS)tE*VeLd5hHp}Ot4c+B&y#bQpU zX4Qnqw&$2x)f<_Wq-J^2O_0%;6gI^Rz3#+Now!cA?c}Z@#51%4UrtJ2JSQf4%eSg3 z8Yln$ntb+KFWHX%CE_SaigFoRmF+it_pR5MHRq$CbT1m0-49Y!%vOlox-ehG{0iB` zAjS$HB|`RLpX>+iq2D$_5Ql;}o)?ML79JUoeEOgI({Vq0Ik&ZW3RRz$yKR&66t;FH z(3!7nZwUjx;SJ5HI1;ot!YUf$LVXsd=ob&WIg{+Mq#z^zi*Kc3Ne1B{+I8N&W<%$@ zE_SP5S)ifX$MN!Ge3mNzN=%6-EDo&p{xgs^b$6=SZP{5drP zz`xLV$!@U&-_p+>Kb$On^5}2eMxI)EEa6jgE9wfc5WHW$iIS||D^OjG!CVhI!Kfvd zZgbB5A-rMwB-88jQGbQbJN(*yM%+k0^G4n+TL2fR+*q?&3rz-6ikb9aiNSnS9K-ZWa%2Fwa?Q($II((V<)yicg8+57&@*J6o(rP?u`Nv z!ryq3WT+k_%tRDgW8? z-4mb>YMUaeUk!>e=o?_%eDgg`@QI&sQ_ZHJrstGqm$w|4PM$r6BSsBO4vxl+rv+;_ z;KRWPh6MoQ+s+cFlr(hy;2fE%K%M1;)02lGyV0e!#Bk-@4J1ZXq6dk~rfWo{`cEW( zg#oCCF+O+-+@K+|yOM~}JpiZHl_;r}gHY1N_)ivz=eYIKyM6Q(YvJyJ%912@G2rYu zX8Va2F!QIh_p$GpIX1Pv{c~|CIX#WLCT|0=86W|VcCtMM>O0b`-8dZ!QQnuKq}_HF zexx{0fgW=Mm0ewXLzDM(K5q=c@T^gsyeck{_Nq?HFu~No0laHzQ~N5YQ#Tv<2XJ1x zw#^7-d}0_2*09LrLRP5bu|`!fjDKfe*MyQ?*KXMER!|qrV&xIT!zozR%s29hSlyAw zu#bo2b(j?o4}%O6=p1rR64~NX(9&B;32vHBQEb1^Sz<0ytV=eFr%=z#fV1>npWCra z9xqMC2th};%Jt5*Z8`4R)nSC-_+G766m(?^4clkc^lC-nD!I`vnCB#C^V!X_I{1I608L;dWOmnmhvGQqnDW-L%jVLmM?zs=$ zYrhu)L?mE@o-#VoJJ{N?FfyBw9K^1)vk=0g1gYouTD~SE{M=EWP$4bFXQMTDzZ)aGGQ7V#M&CmQ+fuc8IlhpC`@@-dYIyhZMb}B;KudG_-~! zB6Rn8s*n?`XFzl!Q+eMgf%9JsWLW2avXRDRJAPda1pFHO)`5R`*i~EA{m_?ozrA$V ztC<5P03cuXWdw?PBEo(DfwC}|Wa`dYqh7K~lwzX_3F!C$yChzAx-Tz^# zGP>v2G(9tuy#C)iwAM+b=ca7$q7Ht>&dq)Pug*4QDpno1#=jjU!zF5(o2P65m4iWX zXJ=>i$B&(8vFCyhq_F`4`(S9GcKlrq;K3^O9=@gE)sOFCTYj}4YY{!U`CB4l{h%}3 zmnPctB%c5e91;s8cL0_C6Sy6N7zU*LAcl@P|9iCJ8^9F?aR5=||BRdd*Ywx@P-A2T zyZ1!Om@V>_k~tFUhXStu%sqza{}(eFE2~DAg7V2J!k$st_$4dX>;}ggjL}_Ctljv+ znwMV@#-cFH3!g8U5WBd=HI?XDg$`E5*soNWg_T>4Z+2s9zmeEDO=R(=zJ_5pdOMr4inm0qpR^w` zqVEx(gsm)ZowH|THfE7lMP)%2qS$sXHt~ARI@)@%%LI^y4xZgtA$FydB365l?Ou5X z8tJQ7X*;B@=*XS3mMjPPq0y1G*{0zB`@(w(kDLh`UUmqllnq!=L4Y4$v{N54t?2B`z^%v;Q zZdX8mp_-TF`&m8*}FZDGGzs@_P*AiUq^pLKLxU<;lWMmmEu7{`fjIo ztZ4atM|KD?W;!t+8{><<>{@9^ILaO|nB$0$36JARozxXxl8SlJqJjBbC@KNTdEgn- zj|zG^?#yx8S@e6fIV`zWq%y+zQu%mF&Q;N7K?Nn#B1Q7jfVyw(xf4Sa@L-2=(9f*~ zxK&VtNv*7g#()u*gK2|%t)H#YVieqjGa*w&J)+lV3En%J^Vq&oG|BCHzBv+u&h=Kj zw$*f(J;E8F&U5eY69dO8?qtVQ_`UBRpQm18BqJKZ$)MaYQ$1*8J!G0IV}f=^Sd#YV zFfBM(diMxZ+MT~}fTBVcZOLRAs zuKO7Hqg&H)45(`1=wO?*QCr#HmV@}ze=ex1>&eETMhDtMg#+%KeLcbfS~>tEmOu+J zgUR|SWItQZDN}`Z2|Mo=Rtx@D7V#jgqKifA|I;)=qcP^_4 z^s<`)-m1UiR32WrK&KqIFZ`YVuwEAw;iy_m*rn=M`VrCcJTp@M z60%?rWOD)?69QUD^;bNj2EYra>%EM~Cw7?WL4mCU1CM^?1pZ+Rm9X@Gr4(rN%ja!E z7Ph`E+hbA5GYqU_I{@&L3YixQT)P#}MR{NTOSX{@1ksfw6s?F0P&b@KPVVUEFowIn zIJP`eqgpU*ZHoy{u3e7Y5V`@eO3x8)27~;Au z1DXQk_4)t(4F<9Wd~l&OirCxU&j=tU*_fs4zT|l1c>ab(n+qjhH47IH0O{e8MiJ9l z_sog7eBDK@QuTa$rJ${P5yG9aQ~B?K8AyU zvMvLt{|xu}=prOj!vZa!i z;UeBUUsFa)20a1RPko?^H(w^>*c);M1%_Utrm(Rmj%#reoVVXj2xVj~R{728@gzzL zE2n?j0`rPF<5#5nKh)L}nbO`c?C-U@nrVgZD^+&{rSOKB*@)IFq?S7+K*V+c?E6Da zNUyQ1`H|J_&wDOizI8_5J%{W|S|Fud2`}R9LbCRL>X$v59MRY~_uhnkvu5|!9IhnX zG2;yCDARsmnmE(vpy2jPdQjo{kKG%Z=PeVTHGwm+hqYm@Yai@35*GyA;A4kuxEs(C zUn^hVid!N@^RpQJNzUF)Cr1yuVPxSP5=$c=$mgI3Evl8vg2|R*ZuTLFRoS^7A(zB) zmoZUP?aW!2+Nqk9YuGBCOqM{fbvl%dy&QG?9nPRpaOHE?`~(TL1hS32HPq8DKUI7B z;WF~~t7o}(z7MO0lP#*_{a9P&-8wJFf}fVte(y$_l#aM+5XiBB==m-)Q!KMGE$v9C zr;i@RD)62A{H2VQNzcg5eOFeGTeyuS_#o2<=Y1^V+As4`mjl)2CecL?Vm}-uvriV@ zFKZc_ALU@b-Y?L&E+Dzm?mf8Jrgr3rU7%}+N)zGz!Ga3A^1(bu4<*5i7b>0^1tz{Z zH(-f99Dct2AKdYEexW^igA3kfE~i&<4v#jKHs(cef59d}GH2 zHNS9~oU2Q5r39j8guyi>JHDs6(@d%!KK$r?4MT{iaYX5T9DM;TK7p(QcR$j+P9h&o zUqNTCt`k2yM0t7h{segA#hZh6{K{EzATP=J2=i=xgy(>swcP^`&xS`hWYE9`?1Xt@ z^@ls+0$h*-)5SfOQk^MMvck^|g$LcR-KspNoR1%i^^G{(s3=;2U6#&}3+x7g3LUcr z3pv6p^!-l%5}&F3AWAcM*{xZ(cdrP{bg^nb`|n=NTAWg8GU8x2OU(<_v5nn zLpqv07FFO@r7AwoQ2oR=kRKSAgQjaT}IVvzAvtUfz`umE(#CW%<9-p zxyVVLE^T_0m^=p~{&+8P$#ycA_5QwlK7DGdy$%COU-h}i7CQmXV;-kkXZJz3&m{3~ z8NNON8`XUNK4?xzS5WQBM31qt3E)Ffr{D31{c-xZRwNJ&<90>`f<8R^-~X zTh2O~4zE|ZIIQ2QZ;Mncs@HuqmxL9tAsWdW;q}w}S_vaR-)h3XkfKKge0Mj85*`Yk z)HYqN$}Uk0Fvedt zzY0K-$lvF6dTYNewpW)q_Jpz7yT)hZgz_TMc{(nwf<}>OvWGm*ES(fmZ}m-(B`Nkw z*TuTGnp=!5pia^IS-4m@YmIyMMH_i!g9Z283#R zPbL_^dH=i@;K7;s`eVe#f_m*@`GqUOA09+Q&ekek9Pey&*lOQ-)Fs0^IZBYLYveAM z{;`~@pUCWVnwKR2G4^$jT{wW%1C$x(Tz7YoZ7aigvcg#F$JekZrlTwav6^P@4npf_ z?;|u0xQ1GkqnHXA19uyKSo;(Q?~O6X_yzc9%#HejhPe6# z^rFihx85=o{|IGhBk`NS-lqm7j`!w5=Xg@`UAeY~PRltRn=m}dU-g9Nk3Mf3k9=EW zt@s_R6+X#d^n1Fln_`F8^XI9JE7HmtVRaGrD7UZF`*-?r+cP^N%w1P#;xSN`7pbI^ zYu|pXG9Q|_s%Fd~a3R->qOPvukP3{Zo{mjVU+B)zf?H?<1v;S6(O$ z{`7{*kI$bPI>eNF@AEtmn3*XfEe3u(;4avV`Vx~^!(<6TY!p+QmVFQLZw?! zbQf{kzWrFa%x<9QM8f@FvaYCYi@5Q@F{R^#&oe*18-DN|^J{rb7(L9Cb{pWoz!}B7 zg}{%{0$oX?b?(2HNbNIgvxu0_<#qw4B76)8qEa&&^!;oD0&D(4kWmm^dH7$Vcy+Bk zo3_Idri=4`lW+ecn&SV3l(=q#1^e8qlilYf*#E^#ps;g)Re*H6X97Dg`k=t+qQ&S>m1iDG`%J630sDg5 zaV7(R3`K|c~a4&#LzhEf#|Gzfi_imoQvkZpL0+I)VhA&)i`R_=0 zTItFER>B5Kdbu|!6L`~233Ah}{`U#c_*iq#KxX`Dh15JRTn?an)s=H`f1zn9Xmvqo zlIF4Tr;7{<9vHcBhcaLKrfSUg+K*gywrB3XE^+lsg%(iThk#5OL#N=j*eXyBCpNj; ze~khw*QNBOT=<*b&6W9q!i{2%K$vl|M-a&wXBmYiK%a|Fo+wGa=-tx;gSwTY&H~(2 zU&4QzuNuk@3U;dfYHCEI8mFEURPxfP&th2GBcWycYR*ywLvD%ZoR7 zhLiu=ok?=Ph{>3j3l(Ge_;H8?@cxXEYtSz6TrN(IbV=p{NHdK8=7evLh~26&p(KHG zg_WIwL4hMG2ot_0MteY9S(@T=sIC^Dhy(1|Wx=2`|7Z*R>0Vz~R(;oc(^}PfH6x^=Y{UiBoz~{OISg)QsDldq*0L3*U7d5xoSf z+|uUGOQMq>e9xfdnx}?$*F*Lz42&D@pnreW?ztsNZXCJ6H=xQsKExE@1)bC6%X##w zwGGp+U){GBz^?q5WFp!al&4TrG<{I{H(gEpm%vI)Lh4+_#mBo7#vi3-ym>0wHT66G zCQS#S%1AxJI3?QNl(}O0Ix$Z!k2ac|MYIvM`SFug z2-)uhJ6o~;-BFIvPU2Q~E^m+MKe`lEZ*(U!Q}l3~H{Mu%rwgubyBOmRja3$IJKhyj z=Km>NAoJZ&m9j(dx-2m^=hu66+mtJGdIJ=%r2EIFZNTp}K6TPiAwMI2`#hR>D&cF@ z-`yvJXZ2m*bBnkST+F~~?#kCk za)a-T@^a_1UySTv$F3L7KnJsi#!W)b;cZ1F$o?Z`C{q1gsc5my+2=O z&JI%|?=A6%6&?P2Hwb&;nG&#%PyOCo$4FuY_BXa97$mK5h)2c%7B|UezSg=&3LC;4 zz40$m_>bS#t=qf0~02U`ER{*&bA#zpnjhzvU+J{87*! z4%-d>R4yxr;S{PT49c+j!RS?vvkdp3uek$~86SP8Vrd_+dRs>9)+!2oTk<4<12K0O zXxVx5`=?4KpZt*uKa9EW)(pSUi<3a&t)j_Ff40vNqt9v{eBl1#^W1&0TTT(j=bK5N z=hkx0hJa}RotFNsXq4@Ml4abb4RR9t?>XK$^<-JAwp?rod4XCX8oUsd;V zg8r~idk8~sWUj7jOcEt%Pym%&tYX>oL+QJ+GTM}w25(ZX5izJ9Mw#-u(>D}W41Hn$ z^Vh#an|!bLH8zZ{uOP`1en8Z3aN*dQ#h_5V#J~hw8Acp=&2z@j#M#Fu$(=Y}tXStR zA|W@-2ejtD)HOFRF56y~Z93*BzG?k7Vfr7qf%ATm4V0&TE(J2mQ=34wa)9OFfeq%1 z+BG%VQp$%MUVbBP<2dB#Kus6^?DjnBdz0qDt5>gH|GpG6OoM{}B{DGV&Sv?yMy)P~ zUICgt=K&V53QYxgm;fIU==AcUlK7;Z=6S8tfRX^NNdF|GdMtinF9?))zC`Tk4{Ew| zk}@Ex6USO9Q-%isKtg5>_+2alJQYE}59;uq(K>iW>&&}{u>fS5IL*C!F7D`u8%8X_ z2Yy}!1Oy3j`eU&v0YDMO&%nGU0|4qt1_Nc2vCIlfCLpzD!WZ`+q~n3ud-d?iD8T%3 zyB-6W<)nAM)G3`ae;)<7){{>sf2t%=fYJx!!Y`Tt1|e@IcGz!}Tn@C&10v3spZ=XO z{uB*#D8D?7I?dQk<>+63nO@)ePwQO3tbaqBo-W%~M<#CRERoH>EXKAAt<}C@Ampa! zpOBWo(+g{zan?Xf*bE#*=>t{xTs_9+YdT!MD4w3Oc)BybNBhLSsUIGd@WT8`l<)<<`T8R`AmPbhp9j8cnuX$mXG8&iaG`V3 z@FY+?)OUGpaShPmixd_|M__~Ly4udYdz$<9%Dx{Y)b*m&4*X>Rx!FiykJn>CTnweZ z``LoPK#(eSkX;1xU+CuVmPg1@F`!bW@^Em_@yK5Wa{3UUCekug(*TAk0plN-@?SS} zx_s;+@~NZEgML4KtZLvvzanjtN#`4Wu1Ewy7bO-VLpp1XoN9TZ8t%O+t~Je29$7JD z94%MmG_y)&JKCG*U(A)0l*Wa>II}p{d)oXBo%J2i$;8a+P12QGb+MpJp@MbE(K{qnS8<0Nt~_ zGHg;;$-_LG)G!92RVdTVNVdtDKX-IUQ*OPog4@HUi&CVav#r%pI{L z!}@&Q^K*FmCWJixVlIZrtMXpmu1gb_&PKVX#;0tYL5mx05T$WL z>_kYS=@sZ;M%sB`j6)?Bs;bMrTncpNX?@d?{R!& zmfii%stMHiip0bBRatLDK*U?wuC(OqJyq#XfL0Dj#mbB}$v7j0$F1EN@2VA9)kS@r zTGPCIt}n1AA|Hj(Z=ya#Ev?C9p?OV>Y&%KAL3oN8QX{(%-WaXKqx_^Hb<|QladY*o z^)q>x>2I$Um{e*VsWV5wZu9K$?TtH&V~ZxS(8FVx6UASO*t4srxIvTUyT7%fsbSXP z0tEw<>ZKw7!j??TW zDjQ8_Z9~>fBkbo_=f|4Lqjw!REiEYTtSLR{PWhe%Do9&@h?iq&o}~``YEvq~HKqaL z7fRb1molMQ`o|-yT}ConHUCTy9iujfl5>QeCoY32KTH-oPnpon{43>NRW#xK#Qg2w zdF{w8{=)DNQt6ug2HO+JUr3so{~fymYr1D)%Z(29uI}AG%wl}2C9*zy2r#dCFo*RL zTJ{QQXz)^P?&tWPRC?yI95uupxw}1EpnleQ0S(l~NVb86bU!*m`&LI%T5v)0GbsySGsg+nz|A!Wusa5HDme0V6?ZPwrJwXWiWj|D)k>O5 zrQ{DtYR0&1k-Vrq;PF$hub22G$L@mccUHS01BH1e6~wG2i(xe1(FZ}Y6Sev8=^DUW zedP|OrT4gV;5z4uhFS~m!?{z7Vv#`6(?KxHY=gs>-hEVRd@TQLszYCj)4_DZ0u9WY ze4t-QKh9AJ?ZX*nK1j{f@z0Txsn!j*Zfv+bC~&FNPlI&c1xXNd5%9P49l~r>{K0W< z{=o+3sxApal%Ho3WU!Ar=KTwyVF|epXL_YI!*9(APU>jKM@lAT z`K0=16nd#aob{V~uZQs_xI~_&gS0u2QW#eXxVE8(RUJ00iPGMU3XF#)H2j%)lidLp zA8u$!s8%f2V%~g?XN6!(n_%3}1FgK_Wat$)Slx_UAKce!Tc^bu^Ne_&ofnaO7~xzQ;Id;6Q3Rw4OC)aj1#mZAje`qLFP{@ggiB9h-d@$h(|e1`U?p@t&4uG*mJk}iTy zTGeV+j(vJl-6M9fq|5d`PeGNXEOaihJxr0pTBm*v>vph_V#a&ZB;8DlA^WjpxxfVX z?Ivx#kc#EW*sajrRNfR=e!qJS^XrfJAq^vG)1o@049>#(!Rb+#?mnPtI!Jza8G2K~ z(JgRjh1WJubT=VcP?aO52L$aJ^Ey1rev29N&WobuBP52&5y@e*1LBueSQ^W2pRwIBE9DgcM~R=DAG)v+&u{sZ<+y9Cy&#qIHTFZo$bw=<&C-e9I>7X_TLQg~~nW~~8Qq*7c{;n2GeE7cTE5VH|0 zrLBggjc^2{8Nmy07QHrJTWVE9Xl&;ruIKH_VU5s%K(NqM@}@8gjhHz_K*b#sE0qi5 zt4Om)1nlmHlfB#L5=gBB6*k??c)tMP4K1x)d0$o%w*>~r>61axn;<7sRl`b)I6BWg zn3FNU#KQV=E!tfVl|6BSF>eF^o2bT84#XX@hfw^o6-A2g%4X zF~GJ8UO+y8NpDa%>wN+z(sjs8F0*nV8Z|jMO!riui7?LQWpn_5mOrm0l;nlb$c@}v z_~+OBct7({eDb>~m;+%6az^{z0(ObTr~EaLtFFhGRG%7Asc3Jv_go<5^}4XC08QK8 z{MHqDugsS2q&y_H>7g*@zTEeUJ2O08zO4WOiXGf+1j($lJv^dl^i9iqxG~+Nv@_Hu z2YmA`BFkWoa9RSxT}2j!oqXL63Td z|7s4%2KvMFc4?Iz_kxXIO(l4F%_hr{ro^DplJ>QeCCV93Zu-t8cMSH2Qb=XSUbLNL z6CR$1Z*fQ5CO3hW?fVm1hl||is&OQex@$_4j6SqK8-jO1dZkQ!uOWS(w8K-}vKr;H z^I{YHD30{}9$AsOX()2A*y$qnWiKK znb~7C7PW0>5}8MLTyUjsmyZXBO>YnQfbAUb^4y**q$irJ=_9O^6dxhPM0UA>cACB@ zX(U=^cU5_wvP^_Vle0ia4S<9y_XMpnVY@h(*0X@L5gIq^1;gKPZ`I8EJJ4Tf^e^5g z46Z+vSfYA^+Tv&lw42R`>A!|^l01^Q-QV#0%y5hOi+&Z|hB6yOjStDrU^8Q|5B4&a zu~`DLiA^j124YKpG`ycSwECqf+C&T{zY4%Qvp%ExIA=URv&Pe(<!^ zB~@r_!%j3>W!0i!5tTNowXoY*^R=2sa$lTdYGQC)Y3nBNVJtQ&>ue7Pn$pE7%CpDlLy1iZSn@>6{Bra6-!19dFFdLI|{Iqg)}6N~K7D_(Z`kh0TD@h|dx(LH?17W?fbVnSXqWSV7` zxl5P=9ag(cN~8MaJ?!Dfm)T{-S|@z-SyTY;1szaVlUpKOy_tZYhHaJ4qEjkerKh)n z9`*N}n}Oue9T88-ylN=x5<*u(#{Kl*HGgq!rC-aP+U7$s9NoHOi1)+kJJjf68MSlv zKV^zjQ`?+wcIB$615_u zwYl0oZ(y@bU;H|LOEPr#V=1k8Wqvr6)N$YPFXo}x;##Q8klM9WzCf7uL=g^uS}+6|C`+OUto z;)7W-pA`>4bV8yO3c|2^*VRSI(5u1h`iZ_~XxqRtqc$0|4kW5}6b>7!~ z5LH!~8xh!!v)f$(XFU{5>pMVpVM`5yj(zdZMcn9TAMPHaX|yiQASMSRG3vC|I^0Oy zv2NV~Uk@32Z^pWb+fsJ4#n2LoTu@nLWJ9X>P6%EZ9H3{-cRwo%J;8^*CM*s6wStCW zPE7i%D11#heLp4}OErCCpgoz+OLMK~_nfgRGUuvIAljl0s36P58JP|eaSjZh%mTZu zohqnwnSxO33>?8ekz~!v=aElSyN6?vsz;8&@pyf^?ZWz48r%K~ETGhHVayWY5S{_oMiaBE({FauzDEj#;&l=mjbqbtM2mYI2lk_uWvZ0tu2P)m_P zvFdS?g})+5iaT3})2f!7YFcvCH;6S4ucVk3hw{}$*T{k+l%R>=)UP2F8U3*tZTl&% zjb>pX4ad%BnNT6p)23Gn_~r7f3ghw$w;=ASYhXQ^@h9u0(TPJaQER)sui)+#=0+md zVjl}S1@fS9$0HWzam~#ShN&>o!xcwq+2=%c$$PmAxbiD0sX01~@G7XDD~fY*w=2LF z#Hz~azwCb0W%_Kq=3IjNqN{{`x_l7S=~L=L1*?^;GbX>3>k8+%9cRf> zn{abRfla=oWN|6hMSr>o6~^ScY;Pr7O}e1xH-UFD>^^6I@z?W}_pY3e8SPf2UK?$& zN0PxF(PLNVA($V(OcsU`Egs-U%k%nal3-%W%c%1!gQU$H4YYRkl|{5ca_4ypVnzBp z=`+OjolzqxgydB-dD?^qm4CLF+VOLy)_yjXIF#F6W3p?tDEF~y5q)1caek>dZrHx( zK>5l%Xpy`bSo>A`vp^D5p+LJFobaL%d&|Y8(q`p`Cixp*pvb>kn>QM64v58QPs5wX zPcvOG`To3j@nFDfAEnd;=@5^dhn{4F9l9__2A>tvUcnKQKdh7N2QrZ&;PbhT$l_zX z>BX#zrn6E3h9TvLA?=yzc+Yp-jvbf7YG35f+suosWroO9VIX0YOjPV`G3G4@S~Lny zbrr2#c} z4;oxGMRDZwSLPigm3Ju+hg5jNpOi%I?JUTHmfl`Zh(H?okEP~gshMBi=@N}2rVn65XmQ=3%at?t`<#U=%zVKyogk!W8 zPx>_u9OP%3FK(o+a3^K7cna0smv7OzZI)^;eaAVUKTN_8 z1F2gEgJyxZ8P`14|L=9g%6-n}34?e2n*jSiStbMEOa7dO-lB#sg~^Fb6ltXTO^2 z@2m9_5?<0Y`A1t~mmaMe*Q8zet1b+`7i)+lW(}IdkmNqlI-UTlxlXx4;)i>=xOag) z?}aYFy6Y@aH?lI%Ln zVOAfi=R{rPtAu^48+Dd=QSo$uF-l&ozds|N3?kk$+Dcv#wteJ?s{X9v+vGb}O87hwjTQax#MmKe6Iet zY01YLmOneP>TSQ-SPJ4hNVSob*18K=Y-h!LJs!*@<5w#_0&FO}`tXN` ziuXF=$2B&Zi_Ul2EF=kG?7V12@*y%EqbHFd1gDBpbi;FGfd=B+G+f$@w0 z$Dpd3@z(BeIj>g>&qmgEt$`+T#Ixg!7m-x>`seYz)QPQ0LRl1Z8zJIenwLDs#frQ4 z{Cb%lh;p9MhUKsheBARU7X@E-tZVfZe~ktsCIlN&3}+!;iG>6c7GHg$Rv!_v)GUHkT9VKs3 zWL{AVbq-?OGc==#%Mu&DgXuelj>6>DOUBgQvsV=g-%wwfet*xn>*58EhQsy_M^G2u zGOAxXq9X#DbM#Vce_7c=|bfPBPUPf5#ZKL1!jW+qn!N)kIb2fDZ zI4clk!EZLLOa_p3QPt)D7klp+)zsH5?jl751XMs2q}XT?Q0W~+M0yA5Dgx3==q(fx z1qG$|CcOovgkD5II?^FPC<4*~1V{)8$=#^G_q^xaGtNEZe!F-4^M#Dmoz32BuQlg0 zpQ#c8zW=(xXwoU_^>AKYxf|13xnZ2NI~7G#~(*b8swUW8u7DZX9@g**P`~+gk=;!4F+SXX9UZ z`}T=ooC=@5y2M;s$RBq+^TM3R?cNdx>prZLixb7cXzvms9zU?YUCzA7MeMW#r^tFZ z)9~E>Y@X=OF11#tG%xy5HVvTHfx`FA{SVD99ac3*GUrco(pI@E$NWcNZkzLV!!>3yM2ZH1GJ&p&_4ap_ljAKJ5W(TMKy zGia}EUSkLh_?t#jbp${6Af!PE@ueaX!&1J!ia2zw!d=`jKQatGH|TU0o7HTsTh|%< zjBG)~1w!YGZ@YcMlt5$(z!l%yQxN4r`-FB4t%huN%URSUr4;!JS zAL;~lJ_{{tv^rT8g@@&IFjDgS(`;<)yuzlmbSnm$t0CK2ER3tD~zrUb=BoGi31E_r(a02 zViRWS4?5E;D3@|6|8EwZ@6|W?&WB*#w!a0PJb>)rnC<;P?9Jf~GSf?BObpw&-|`FK zL;lGaWt+X^)fV~DK>X)}@&e8vjqP36ghh@=H6pzot|`+RjgXCwx&D&S#VOeDM(C(+ zEzp&I%9Y7EEfE23uIB=BXF0spG~m7P`SSZqL8J5Jxs6Ou8Xu~PuKbLSbl9XTV>(;Z zzO7ZVXu#ZXQp52lz14R8BMePRF>dC@E#~cz+6Ql_i9ZQL$qF?`ag5GKI8U_DKTvdt zSVakImgxPc1}cR`#olHQ?*8XFcP&-U_LhHE;OU&(Vg0m*$BXCK{BpogE#!xhDL55C z!w_!w`ue>lWhu+U3B<3ZF;`=}Fyhjg7lcXa$f~8w1j$_0*0&rZ`&>qZ7(O z-tSafmfVPM-TeV-Nq1Ly|8Zdn1BaXbOML84N0SAhu{mA$yX$da+AG?72r!u?Q2kbo(wlgi@v-*LjyQvpt)j zJ*Tw3Do7Oyuq+wY7Mr5e-Px}cr^6
d)(Y}Mw^kTD`&Ho6x^3-?`FzeN&R8aJpD zrY4|2I|x(Ue}WH_=030eeCKKbv(AjW4{4EshAPb7@!;mUhpmKi_`pM_6}J1DhePz{SiuTS+l>6WN3m;1 z3WH&n;*OI&Wg{!`*hb5nU5s1hrJg{}314>TejQbEMmzQ}JBmjqeMUL`gr;D&JVC)&TLTbX=Z zn%q}g%bT*|7>Q|%strMv`s(K5+H`lK%#uFZNPEk({qybTQrhO{HC@$hJ10SlqNF!5 z5d&NgoJwCUhNZ*FmozzY&l=GRUa@hZ6z^3hj(e>*!3DH7qa)R(%7UG+mijVKkG6M> zQY!O^l)YJd(C)PKHe_95#Ys#?11<^Gl`cZYc~W1yyXm^YR^lB1u0pQy>@`TmzqHMs zqfUL6`HjnyE1T;NttOuL0LGB~fC_d|{BkQNf;lbUin6G^$WE2THBnlk0HF%cmTxDQU`l1gDKxCI6wbLDYXf|y8y^P5W>J6>y54}DWaf4JquB3l%Z%d`$6^Qu50C$LU> zW7w1cOn=}8$a3;ZpVQJ6;P%Gk@A&pVpp;Cy(-DiEB`*<{|BQu~t}dL75g*~t5&nqd zHDMtC`#95cvRV0v(OKE}jY;#_2M7NQi+VrDkpPpV`VW(&o!)k@8&rY09ga2^u4Va4 zi1CR1H%t%*HESk)_^{yN^`s7@hOS^6tY%6n5dTw%^zn*(1~AIX zS4ZNnpI#cYO~c88aFaV2j*1(DhFf-@4#{YQ~a#2Dozr8{#8dL zU1^_r-pFeu&~J{Rat3u1C~=PDV`1!mZo~%E_^h1%$Y7RB*xLYd1K>CSFMg&K0D#Q? zz-A)-K|MJ1HW&vSF4Wg{x4qRwB2Ebi5zhO|E*z@WE-tkJI0r%$P#ygcI!h*tMQ`&T zH0E%b(EdR=!m|voac~sQNx>Y3Dl&Te20SBxD(NTjNlB$!GK~W}p;Bhxz4PKF~{LG|MMi1Cx-X_HNFP^1Z}Y$i)a z{Zmr1JDU1^{f6^#alw11~%v~~bqJ-%j`U^8i0jtz>tA2iRpLBxXRASWE2 z)2t#F^PuBau%QWmi45Vraa-ZFFIK5N}VaaL*->Hj-nSZbY&&~S)_4^8u!51Pw;F*Wf`_% zH*$J}gIIxy&==N*@t@5c4h@2gymp(LZ5Yw_z_V!QZ&Q|V;jOO!n}sHFrbt<^UQx>l zsIuyNRI1fvO3P_81yKu#BHSh#W%1SdN0>&vT(BEar^*=8Z{F7ff`+p*k&8zYv<5QF zf9w>V1+@QGp%JWjXS1epoUqk+`22{SjA+=5`86k5JbAZf$Md~F3M!g?u$49^+4Pd* zUDh9r#7}!RN7F+aHw&Sz;1jfwbjdX0k+8;_^a-x>>e@~1`Yt|P)tW;?zGL`i3k;O{ zJ@Uz6s3xC@QTlF^<%tH-iPfZ3Q*)J(#^i10X_QEVYp=<6k40$&^!*faM{$3*+%)gU zq$Nj**qq9w=HwSgq3q;s*rvV*#D0@n244tQ?C#c-`>E4h*X0;zFe6GPva+v~T0*xm z!e&19TcKZmalngD+CRvwlO%kNDo-^RPw9Z;#dcsgjd8`;I>A zBK$J8@t0f0A2N@_^O%YF0$GPSOYnSyCiC>gW3#n84o@6}kPh^lUz8_HR5l(ri`a%* zTyszVvMQTH!*OCp!H+fi6)q?+hO-m8S+OBFZbf5aKLW;Vw#!;L`7Bc%wrq%CD;h0# zw0;%;EE^KBnbEanhZ{ojzlC_)?U@4PlE0STQiBqU==4_H^IAlO-t}pa@bL`y!O{fd z9PS%=mB!?{ZeT@(i(eh*XDi0W0p#5UZPP=A1{OzI!+hD=oFBw9T6tOvt80G3eulPus<>%G^GI@c`zC2a;K zs}QzxHDB&Bt#%(TX!|DrK5UGGqscf-s#YJz9(K4?G&-B3G^VB-^@-(m?;lKu^>EA} ziK_?Gt}Dc$w_}-u<#=3Z>6^nKpQOALd@*%uP5id^7F0?=EF=JJQa-a~u>6UI_s7*7 zotMUYSq?LDEnrx4p{9Lc`XHMxG*d%kB$FcQz=EKJVer`DXe@TiS^dHND=`hXndim* za;g$M{y;*t>6fI;)UtTZ4mhO(`SMZEOo7v?7HUDxZYh`{K0u$LhU4x-So%{wF?>)La2rWbf^D$vI+1!3osZ+vqdAUrBe2oM=A~2rmT$7g|8@P5#cr$JJ1^c3}`Ga(tH7UhO26{B=Amt(ugd@9(!hM{hYHr^k?hhE1#Ld21N^#+*&f;f2ZM?^rhWV`oW< z*cXGpQt_dGLZ02|oi6yfC|_9}{9)M?lYlW3PY2=~B7jVncXjAB?L`-g-JKEow7D;r zZn3_!*%{B&4!>%F+B`pV%_?mMQb>Ezs1)W@C5HnoyrL07#a|oHw9KKPNm30I7+&a= zWhfUekI~_-a$=nbGAddJuNIiwq{ZmrRBKatZrK(;qW3ivJQ^Hk(2^;`AX2maZ-(LT z=UuZEI)BxKDMfv%VZ0tS-6BH|`nH%<`}AW#+G=TQb1&kMPR3euFr0>&`B?pM9j?Y7 zn_6Ots8~hB(6MCBXueh17A~^f# z+Hwoz3G}?XDl>$9n)q4Cw4U~|_)o{X&(cyqdG*jA^|kGl<9hx797!ATC*`uLrX`rK za}9Gy5+i)^#%MR*T--pcwbqbTv|>C8)0#bgjM78nQn|?)1JJ?8xDPLLqXc9XTD%K4 z2nV-laZW=Ij1EeN>>8F}Ht>E)3n{1K31@<4pM}4^*wBE^G9t4ST)NzgLz?$`AYCd7 zzdg*V4ZN$YrF<6K=?n?^DZ5spj5m}46RT3|H>9k~O-pb@e5!1eoWf09?3K1>tCkh@ zG^`tu%9az6m^tKh)c6f2-}Y^CN`NI9n0>CJ?2|De_VLnyEdbmg`NdXhjr@HGT-rC! zU318aBoDoYXy8wcBfShT0+LRmA^0gQYhU#P<$aZsCzuXX9c;Ii&M0Ta9`GIX5e+p(~Xp zS*89^@kcEOlO8>6E^DpWY$XJZ$B&k4+jg!6#~B-j?4*T=<2S4Ly@%F=zJ^I=qJ|wd zj=C{&^QE1z8LuDXZF91L(&o%`4ayj&or3m{{AX3C2m$=Kjm}BuiG@d5n*`JD5=_l# zH7CJL1~=0jQNRRr*=VU&N`+Q5)ENPCpH(m0!{JWlva!vbZTD`ztjuOV-g{0BNRw)% z7P9)@C%dUOj&_A(7Ug5P)*zuSzZ2ZDIcmjmtckvNG_uXUxOR0J=8qfX@#DOq?G2RC zJz|75b-xGBHYMCWG@$-kJ^wIc@jpr{@;iE3a(A6&%Gyn&1G8i2W>^wVK2~fKL+@9l zW_RAa={yAtdSB(vr59@APQ_q1rVGplTG!m)&v-T)N<%)I)YVLUZOz+wy4DK;pZq>a$ z=v-SPpEzF!e(>wrE2oBy4NcR7-mhLcSn>VYqR;!8Bad+xLT;Q~twIj}lg)}{J|jjl?h zr8B=t0@lo@HhZR@L*tn{t-~}!n&U#mlLW58`Yh0L+jZRT(N`XY^0I& zQPtY3;-Vw9oS}8g4`OsR>t3X@Lnc9bA)(ij;d-wMO>(B%yjO8`T<~neGT(QS99A=5z+Qvi3TXV{?2B`Alj6j9`T6J7R{{*T`O8eiC;9j8mVq1u~`l2eQYhamyViEy~H1+?$6O+ zjFYXDv0-E7R&vR!b_^q>?BA#n=N^NUP^E6}7~X}C)qIIb6B%>{X_-ZnB2rF_Ucys( zD(o0tOx>uJ?RO(|WksTTScfXPNh?e<;|y?vQkzh@1M`HbIYQklIUExr)kc&$3Mk z5W9!$5KA2CHskY;fPzdgxRb*w^m{PXT{)4E@y61DHv>QoXTD#CXlM9RIji94x4{E zDzG_0)q*Oyd&)NHQ5pg2_1Hd(+e1n=tPdP+Z4=uapPP1emXEY>XT~A)rwj13K^dQB z3%mO;;Fs00x8C`dj8T3!Kp%00`rnJ5y_ATA*r+=#cwulxCin9q;uSui*z;ypTbow707OoKz$c^3iX*=9bn! z>9OR_@x0q8!=jm&A^-4!?y3DZB7tu|G*`Bh>`~;WJ++kRNT*_e?!i1_Ym9skB zxI0VZDKeS^)q>VY=O+f~%{qrJe9zO-1FI*=6a?CBGL|6>scdHwDVbBP>_gYcY)oz6 zO|}q|vG8vSdB-Z$LH2{!S=$_7c*|s~7cs;!VTxIxdCq)Uc52%Gw|9t^DCxs~6A|ii z{{T~P<~E|N=}n%z-4Z2TBCOmfL~Fn;^*9wD(wk1RG9}FZ`tnG@3o5Q`rG#F zJ2Pg|jQ{RALvn#3H95Nu8v!KAYOl8Xvx%&G}X(WoVkcs9^`vTA;)td=TcV z4S4(`Y(~BhLkC4G#Ij{5NPD4bQr#6em8|y*%MCf7lEMYp^7S<2r@xc8Wij>mja9aJ zqb0~}G6t{Yi8DN<6fIP-W9|2wv86xnnkjf;3Z;U@j1Fy96M<7jP!!%^i4qo;+AJH4 zEOlAkhYayzOsj};L7IfzGrI(ic-RpotlOfwRr?SMF??UKd2_8iz|CSk%7FSs8aQt| zJW{H@W~u)R9%l+7oEHoE9H{t_{87)PAnT#l+%+4D1lvZ{3-8w+c%Gs$K)qq`(U<_& z6L@)>5!ah)^-3q`EW8w#Bd|p6ZsDxZW+43h&9%#yzl)r~J>15%kvoP=pe$S?Sj-mZ z$t(@Lupj%Rd&$$VH%t`b74N#hOiO~Z0J*4P#Zu6?@_gJ(Z=4evZi}q!Sc&q?A!%ur zC^)Q5vuc>rPtEp>nKpM)Z!?ioZZGr9aRc4F-XnvwY2|RWf47G_g{gy zAuu zqw7C>1oY!jNYc|ESrciLsW+tiwK!0JCo)1GF;BW%-u&G8Yc7C|Kh7?{^qSs1)uTH@ z_91OWq>pakXmrVB;isi&3FSjA7r~fjZb-`8o*>~-k?pc?V_-&zy0R}+Ty5{ro$-5R z&ski0=+zm_F%FgHGdH@mz}-gazGZNH%U4p2-XLBP$;EImA++h&86GLuQng_|B5~u* zbVWAphqM$=iFuFWZMAc*>YPqttIL!?^+se;kR}yB&&yTUM-QFh~BOpelseRD)+P{EMk%?-<+Eoz~_d0;ilfuCJDkcYi#g zufNXMqSL#jXBxJ*M(;hC5Gzi<-q)w&susP3^Kh%^jgVMNlW=KLp8huWCmrSh4!Z4V z*fyY-5CKV>mi50TAi9RwL)Nd;jS5sbf}J~Ss@C3KohWz(F1rD*>CS|%g2(C>63+eb z7SN~vJHZ$;qXO#jgElTOd`r#_n5LN#TRs`4Kz9m$$AnW&M6+d|{Zznf*Jh0RIfW}W z$AN!Jc*e(8a8$hNYFyFsAGFh0$Ra-YH6D=>QQCg!&GW`HY(3~11#*4zzWV6mLj#>(Z+D%|J*b*}<&_Zju8%$S zPvquuUY+cKa2!>04PV$wV3*p)J6fEwoqm;*ch-IoXQUgb*Jk`(OPl|sLdRTBgl}%! zGat~xS!pzHQ`7bV=;GY*AJ4LrK|t!Mk2!PIP$Mec`1mK@m(3sH4jU;cw!5Kk(}LY1 zWR!j7H{JI5xEv9!;Bys=6L7Cria1l$9KC*Lr!$NRA>8e|A^ZFZn=JF`%uieG6)Dzw zgar2Ww91qv$N%7@xBfV2Uc3A%8=a#DiPX!_73sDc1C{H%Rl-XNcWfV97pOGu7&g!E z6b}o>!R@}vIFGb(U3#Q8>U7duC@gBF8zgV0H~O=*KLGTNi;7DnZX2)I_X}_S5cMp$ zQ7Z$z|u`T3=AWtDS;1RR0&IY2G!C43d8Q zJM{XTCCA=iEKxPehax2(du1JCw{!Zig8AQF zS~@LXlc75+Kd-8yGLgFTB_1%X7N$crzDSl2=|8eA=;p+e*{&$jB`%LXhS8Py} zXLMk+yvmRS30+99Y{2;lEv4wI-7x1U^s*X|V+34%GiGdlhV332e9G>e#u+i*QS!GR zo@H#m8SSC=#_MBuNp<$W$BqCyO-gnZVD5WZ?LaS9=mIvADoht_l?c3D(9=qL{Z8LI zW@?`f*!7>diFdXeGh<`I&QOCC>}9Xr7G9042;`48SW*K1d`Q1U>aN!!Tr{}%%NeCp zYX(Q|JhZVc90eo^o-s)?)BP#&wm%hQrQRKAw%;btMRx4@9o|*gEW=N3oaaymXpL~&Fm<=YV-Pqww7LjpuZG}<@GK|+YH4~E#k zBg7u9g5qv;nOEq1yZ&;X9tG(ldcqZfLuGG-6&}>es>`&VOh}2H)hqd|J9ruO?Pqq+t)43HDynCIr);o4bi4HGV8u{b$ zRC1h(`U7a9X2lG9Hnm?Ol#pV|A5WHE}P$WpN;=M$)f3;@`0FTg^csrPGFEd_w7;HgX4 z9c4gg?G6U-OPMmWJ4=m~xmMZ`XR-xlW#_3@9e*eAttq^K9h4(E82%WD(*9}3qeR#R z>i)BDd_9wM;sE7i-u_B#S=jxoU@Cs4I)fiBe>WgpTw2pjyv0+^;NRaD4w*VtK3rXd zD1ObLy>b)E716CQ5Op5y$V_*(<7BZycyaj(QoN-`??^l%#utd+-vzQFOhEeaLitxY zBrtjvmE|ftf5Cj&xGRVGYMIhm*Tv)S?#4G_tn02B+bShqG`|r8KB`k@Cw_PTcND-4 zNZQF8ydvw!g3 zrcZd?9>@|nZitOGIP!V)M+qd)e~C`~23ZW?1^GqibSeg6(wPZ}r27<=DWGfDk^4vF zlzkb*@@kkZ^FNY${|_uk(X*OE0)RVe3)vsTNPiQnkAEgLA+mtxO8^@{{=f8zK+Me2 z(c1%wE|3Ap9vMmSuLS=#ZbVCSc#zoG!_qUqDFx0yEXe;P6d5FzYwN)-J~_=qD!|T< z`Tb{bK=4mP$-8nSsQ5Go$$iB(uCw?c2*Gt90{nuAaH}9zJp7jYg9o9Pnk;;`En!t1 zU(Kyo{-9s~IMw^lo-DSCUeq3@_({)rx_9Iq&vBn!T3*VSc(r&-;YAd%wel3eL33gI zYdfT_3J}tSa?WzFbYp=q%SNSZ6NfX?1rCm^tP5|pN1gFpMJk_;;Zd zdBOjZjl6pS`~yB0N-~^L0zz7+pK^M;zM^sdTRr4A=_7wW7jWXncZ@$@NXn3FJoRLd z6s6vbmhR;@poLxHvq}9}JGWI0G5bj9?)l1yx8?4kzR3g4LwDvsN2+NWHisnjj&e<(b`B#U$)~ZgS#QHrP`|J)CLjnVPCX$guCqQ} zB-%=VfW(w~Do=iiUn~v~_X3B-b0#{{A>^ zW6^@$LcyLGA$y=bNp|d44nyvHm7bteTL_>Rdi$Q&(edIRE6J(UPE(ijg6k$O4?T_U-+fzw`~L&S_1`}g+`!{di?+D`cpBDkSYdklGxRBO zd@>D7jljySQ7|p3^3%WLpSqo|@w)zG@V?7K*!b*Ph2}U#+ z&FgoFWhKJ2Ks~K`A#azfiT>VAsUP-2@KF=Ib(mmNoj~bUHp|M4sxF>EE`^qie6scN z);p(r_5G;iL@nc!s)=$1rKywEv^~}G$ERAG+z*8cUoN>o%;u|DQ(Nv}Eme#%8jI#D z8=FqzGM>B6`KSCmMe3@c)@ixlkqszvX?dI7GB+8*0)8nxs$-Grny>nR)V}yA| zf*6V&iU#*A&v2CRS{~9m^Qu6AtR|LQT0H6C@All~P8H%%1wc43yc95hKnykREL&;J&(3n0iwU z5aVw$ncY*Xhe-=&rCllhg{DMYgEk%TpZ4$|>FqfC8Er_aZ!X?*>9o=Ek2~|^1J3tu z^^p%%0ii7Od816j4mhDG58lPIzUPom4_>g`*B|M`%}z6{5GTlqRu+aGxNVOD{{y$% z9(TzmTZ(7j-83ND>v_K|znhBDma!!;mu9Z>`}^6Jpd>1dDCb$Bvlw)$(^k=uMfp!l zLKD>jrWc$)U7+*d5tML)sjL2*1 zF1tZP86qyLd-sU+f}M8|#S30I*e!z$*<0e9iNhYPtR-Yx(DStUgWeAUXut8KAYir8zOWyJ!gNrIdj&h~Xh zuD?J-o84fR3*sUweNOFdbEFrW+T-)DQra4v+(r*|n^%!M`6V+4i<3-}up4GhwZ(PG z%}Q&}*Rp&Zzp)p6M@MkD{&unfMy_BU#;Fz)9J0wg2<}KY$|(^OKQNKI?R|buw-Q6P zGBD`wB6N-_K*|!Q7SQSVWl2(kfo~V(xbmn4x7+q;8{(1yXSg2VIj{3}9mLaOrM%{{ zFpyLuhmR%gYt?IkjX0%+^Et|$9&%BMq!EvVcZ`7fg76bU{1<3F*BEWHnZ)F~IJpk; zRo<|bleBdd)X&?nS?N7*!LPC`e*J5_$}AkqI=6@_k9+C#69`;R1e*Gy-= zwIOIlPtGGOKh0vkx-b>t(ZEC{`#ImG?_A9XA*n$ZehdUED$j!Lrr(P}FmFrWH(O=f-VTJf+nSqm;wB#A?Tw6&`0!lGc*?5M0up9-hY-r7J1e0yx__H z#OR&6EoJf+(^SMoGiOS>DqVOsFxsmNl!v3W7vA3<7NM>7_RbJ_SMxex{Fk(JV-jZk%h-S`7m5%8 z3MHHjcIJ)7J-V_CcCP3lj*7n0b6@kwycGSVoV4P{MUH^%o3FE86hOJP?$Od*!lmcc z9X(RLLP$>y+D+fcntg0PTy#W&S*t{s9|TT20vlD4)@)3T~@;g^Y`P(7(yZdORcd*S+hlFK1 zzFU}JQs=$w$y@PXG*>KQB>%B+vW)4OA@=p5I~Q(i1nC}Xm2wkvlWJVzJQm{;p! zRzvy(8NSP*N>VlJl@3`>wxmtv{fz1zAcwK7SjkXSb;%w%71rjJK%*utSp+HTAYs+%;js zuym$&ZBqYUUdZeJ)wcdFdAlZR*$dgJ3q`i8poq5Mm&0074?Hbj`B|yHcf^TOunYD1 z9IC-uD;JoFrER?#&WIeN?LIg$jFi~;B;+|qAFG;I>d8~|Hl5y`!zR9y03PUqU)4Jm z`qzm<6Zj0AC!sN|RQVhFVVLd^pwuli=(0US^4wyOgSyp@q!ZYXYtFXjpX&UPIK}=4*{!<8lbc1f@>+{m9z#+ z&*&&QqcT#g{oy$2&koz9P&pgWlf~{DL$8J#LH)uZdYN#&FA4yxc|9C+tAUY2tsZhBd~o~EG30^8d%h1e8(OgHVuNwIhF2J2`V#236C1O8SVYN-QJV%Qr>*5TL^Mr*@ zxSp6D7mxKGa5%jVL^XS$d;Uwv@WXp$oPzS5YOc5&4s{)yIIq zYvVKTP2GYjNC`>_oo9HkFA@qO7PkrO5ra}g)mn6S-!L$F_luzrQt+!4J90X^`@zyO za20ETp?OW67n0z|>25L9kD<+FZ8)0~Z?>C5Dg){Zj?h}7VhDwe+@1S9T=&8UoZcoRxe!<-haf-_+ScsTq2qbl}PxLXjM*_FUOX|9A?F_%~ z3`Y2R?Y6mj7dpl&!TyEV3EOhxE>_F5i|QB9Z>Nz>gGk?NtAm&*4krB5%uobde%;_< zzn_-g!h52@F2cq_%CvXXt&o&nCg-VFt-SQT(Loi}6;t}iIKA%qebirU|+|{=z4?BmJGH`#3@S0+WW{%Z`yPF=v zezkX(!)wcm7F4TTCQ=q}4haZH7Zy*SHGPww1&&VM|Md{eemlWkUF>odgq0sO#a<8h z%1$0q`MC#^cy;5%nke;ja6N*ddQ*~yx=Ax>GXIoL)QVlmr@A->(-&`^kjNrwHPxsdbEwc7!i(?QLUU0FB| z8Vj2vr1`dORmI;NaN}DB167<|XTK~W>O*2=W4XIqX6X|~n(CK`2$IguPKgWy!`y{7 zIZLD2l_XvuOnFrdSfnBaR~(|%qt0;h{p3AbzrheJd|z&hM#Yuq7a&} z#wSHMiIlP~42AOF$-y>IeZhDe%vvHp7J?rT0>Ug)RtQ6niiz8i{@?qTNvrya_Y|yF zd2KSo6ywnB`A1U6y?PZZOhV>GTF0M5q^O`3X(u+&$Gyn}Vawb{k(KCVU5G&So73(V5k-P1B$o zD6Ooa?l<9$F&C4vtm+RV{IWtb!Pn;Qim!L69*U+Ye+jg>M& z!kce6hnDEr%ri5|xR{#`Bq4Z&whaoC!E448C$iMR=;9BD@ar zo@%~dVzPt0n~RgSDT8~6%?3}kY9_rwLxFfV#r$z!V8_dO)^^plc7GyhM2m*WXKi7X z&gU?@c*s2k_!2_lEGn z8JGQvromasy^a(RQR0(HxJ}TQ9EjKfF<3yXQaW*t#m|GAu+NB}s8(%LIKHMSdbTIn z$oksg*S0!-^rI3}Ic6F)v=`3v_u?yM`^cx?zGs}=yCP&MRgu!Y#`P3CULPsdabD~3 zhr%^1O8EZf7xV(h5R<9Jy+LvK9mJhw5AM=MN9dS*`;PjB{i$16;<1*5*2iMi(G@Rq zrpcK*pWahFaI$z-Xx#lky%JMO&QR2Rhv?7c%8xD*{cPjaHNtbEIceqo7Ih z3EMpLigDJLYAFLZ%|36T0cI|eD*n4&sryHZzBz%1`+}%+d(!GTOVG<58cP>++N7f? zC3q(AIR9;_#z_bISx_9KnahM6>dMMcBPrZh)3S4VzobT@wZGtHA?vGEkgtqd{EN`l zj8!vle;T3o!-f;ofr{rK+3i}xS?ub=b1qPWb}N&|lT{D0;^G|TuMyJY%bK$K>f#1` zcQcH;gRzeA>=QAY&im>_(NSv{I9jVd9(z@2-_!v!^tAJ&q-C1Y29KzwqeWTs?S5TG zX&se@TBcZ;;K?5L@*gG0z%)OuJ+C655m3vt1){jn(+nr;1wQ2IK*ojYtp4}`OZ>V@)!$Gze=ZaZZAU2ty z%JjOkSA@#J`FFm7(T_XlQu(x+sN6G;OG!Bz<(wG?VwS%9KD3wyB~ZnG<^QgJ!To~| z#ziN=!a|3O=Wgi*{E-0#(W-ZHF6Rh02Z|rJgM3R+?EV;8WpoeX9ZB^Bp}PPbO~0m+ zcWH9HO_sqiMZWvnyJwl7)ao`&A1~TnbL-sNuRO^Y+Xn5K@u(46iWZLJ+rfJ>7uUkp zw+!Y)xgNVXg^mh}f_C$%M${`eYpdge#?m;Z}}y*fz3>X1Q`|* zM@oQX)h}70liPvLz2XJ8X#zF%TYsGaV-1=LSWzWG`Ff2ze@7{w#qR##%6?5Pl1wrrI?aizkd^+*1WJ_=N>POW}h1pd)?*jYm${)2Z9J{MM+b%&fU?9 z@QU40qd=S}D6n4G#+!sFIVj#tiYu(5qT7;b$V%lD80z<4kDy+y{;>9fRanFmxoF_U z!wDjysI`nrwk-SUaX0gBUSh1q{8DbIEib0M)=$Ta4%xP0@y9i!%o`^~-c_hv8*7Pd z#owvg8K}konutiK)*N)}Gu*XAAG+IEPHz)?Ys+}7{Y}&Pw1lMIOH4?tCa2kjssSw* zUvA9l@O}DKukCDI9#b_0W}0<+olu+s4wp?9H44eF!3WDg`di#8QaO0F3MX{Ch^m_! z^=VYqv}@PCl#}#hZ79Sb&q)cfX&GS$LgpNWG1*R}fo&CB{Z-EhHd~>1dax%0V>x_m0-u#U-p(F|jQ1 zSZDbgCn?LJJo`Cw=T~3%UKRdouEOg6NH(6O;EG z=l&!Lp0+ zV_HWaXyj#?6g`dmawG1mbRogQEimTeysudZj$MD@Qy}Vm^L*g2rK#_r@V+Uw1Rpm* zk8~G=e)n*8a+7XdcOc-xL%pUs(l`z-@}HH?XjE0<3a%U&Y;_0ik0-62uM&_;CBeut z1lQGAn}S;B*1Rlbac{>C`A&#vB(n2IX*Ai9%Ka4PIn{8a$E2FVK`!Tw{5t-Fugw<} zE;#;};NwZK@L818Cg-JyDr4g1e=ImwURHNB!S`6L88mKRe5Css)VV$L#T>@$*)?s0 zngGY{Z@qXf8n+dnqLMijAtSx!oAM$3RuwjIO2_`Boze^0=O#BTX&B&(guL}d<>v|bFqO!H zl_%8@Uj2FIs6Lm@<<=m`uciw$s}4AS5XXsYQ4>p6>*lD_s*_mP4dTR+pZ^lPxqBG9 zxPRS@nWpn1S73UAclXzQ!chR8XMRGtc|5wECC4U7FMUB0 z5d*~xcvvpCNTIf6uDI;5B53B+_CC)G`K@+{>b>6y?tp#!EH&HegAmhtja;&yzo>z4 zdAE~7&rW;Ye37WgTlBU&4}@#I$T3R!y8BN34CcwTEWx1L(L>?Gfw!U$1Kk1yy7pu* zaVYvh^SgtVQZCGAQ4?A=_OxCN2i=pE+dC?pI95=2Hk-^Q!JbukuEzRK_HtZZt!lxS2t)7w}*cDDOgO@97L^G0l^->k zR?mwuej94(^dlzEhZYs#qAqY!kajwTw2Qty)C!cmlTL6en%vYQZdJaYWFKnY>p$%W z{xq#URG6u*S&#a8j^xy3=F$63g5H}k9cWR$E8^eDfruyxKC3-fv_}8ejEiLen0w_mbrDtFwNlin|bcF1Fs~BPd7UzNr&|_$i2=x@kjTHKI{P%q z2J4^#JQQXNbvWNnVwT@7=3ss3`YRLXZ2@dzvPB6mUumhY(+(+VJIR*r&Vb+6lPUbl zvM;c2+75Izbn3BBEZ|b1XX>cKddzD~{;vS;0ulWUt=m2m+UL%N#zPOAIRF3vOeNJ2 zsg_7JMfbC}Z=apK2eSq$%}eXu+=rRhc=WN{o6OSPcjeyny4`NCwcG8`Xf(oRvl;3? z{aL6!`@7J+@Sl7X006*vy;GBqeJr$Zzb!1*>!BW7`U7MN1$Gk*Y`iwvtY*Ogb7en* zflj9rTCG-SHe+iwL#x^Bg$2d__zwU8;Ig9DPep$U02US&!a@oJ(lWOq6c7x+l=eCp zD3&P**lL~7?ra4E0001^6v05PS_`#W^>Rp1%oZq)xmtn&N@*{Hfutz@i84Fp!K30|W&C06<|};r~vB0*PRNQrgd8 zV3;rf007v@I~fEF6AVyF2Pqf;007uelLiCTyo6HfuCM1F006-J=(IO-Z)bu5O0E6R zv$+QV05CsV8?WZx&IALLTKkVLgwFX3c?|#nVD@!3-w3U>zvs1`2?i*==C7U%tv~(E zX$1fPz)VZ04{WZT32$9|CU2RHiw`naroH$ez_87BCp`S@+2D&sfaIp*N5V}Xzdo-4 z%qKGj0ARpkts0hM14y3x?d##pU*61X0Q1Qw9{?D#T(9LGPE-l13sz}eL_%OmjD0&07*qoM6N<$ Eg1db9QUCw| literal 0 HcmV?d00001 diff --git a/packages/documentation/public/img/admin-guide/edit-wallet-address.png b/packages/documentation/public/img/admin-guide/edit-wallet-address.png new file mode 100644 index 0000000000000000000000000000000000000000..28a2062215ed65669c761fb3c3b17a55a8bd8190 GIT binary patch literal 85420 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

Yqd5iZ)W@0WRSP5+S`T4$ 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 literal 0 HcmV?d00001 diff --git a/packages/documentation/public/img/admin-guide/webhooks.png b/packages/documentation/public/img/admin-guide/webhooks.png new file mode 100644 index 0000000000000000000000000000000000000000..b45a576ddd8a7627c32e65334b2c26cf9240c58f GIT binary patch literal 57010 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 accounting. + +In this context, accounts in Rafiki are specifically the accounts that peers hold with one another. These are not customer accounts or accounts on any underlying ledgers. This distinction is crucial for understanding how Rafiki handles transactions and settlements. + +### Liquidity accounts + +A liquidity account holds a non-negative balance, with Rafiki ensuring that total debits do not exceed total credits. + +There is one liquidity account for each of the following resources: + +- Asset +- Peer +- Wallet address (for SPSP/Web Monetization receiving) +- Incoming payment +- Outgoing payment + +### Settlement accounts + +A settlement account holds a non-positive balance, with Rafiki ensuring that total credits do not exceed total debits. A settlement account represents the total funds an Account Servicing Entity has deposited into Rafiki. + +There is one settlement account for each asset. + +## Assets + +An asset in Rafiki represents an item of value that can be transferred via the Interledger Protocol. Since the Interledger Protocol aims to create an internet of value, it allows for the transfer of any asset, not just currency. In practice, however, assets are usually denominated in a currency (fiat or branded currencies). + +Before peering with another account servicing entity, you must agree on the asset you will use for settlement. The Interledger packets exchanged between you and your peer will be denominated in the agreed-upon asset. + +Furthermore, an account servicing entity performing currency exchange must provide asset liquidity. Asset liquidity ensures there is enough value available to handle transactions in the specified assets. + +Assets are managed via the [Backend Admin API](/services-and-aux-packages/backend-service#graphql-backend-admin-api) or the [Rafiki Admin application](/resources/admin-user-guide/). Wallet addresses are created for existing assets and are tied to those assets. + +### The `asset` type + +The `asset` type in Rafiki consists of a value, an asset code, and an asset scale. + +| **Property** | **Type** | **Description** | **Example** | +| ------------ | -------- | -------------------------------------------------------------------------------------------------------------------- | ----------- | +| `value` | BigInt | Numerical amount | 10000 | +| `assetCode` | String | Should be an ISO 4217 currency code where available | “USD” | +| `assetScale` | Integer | Difference in order of magnitude between the standard unit and a fractional unit | 2 | + +To convert from an asset to a currency amount that is more human-readable, apply the following formula: + +$currencyAmount = \frac{value}{10^{assetScale}}$ + +Using the example from the table above, our formula looks like this: + +$\frac{10000}{10^2} =100.00$ USD + +## Transfers + +Transfers in Rafiki are based on double-entry accounting, increasing both the total debits of one account and the total credits of another by the same amount. Deposits and withdrawals are both types of transfers. + +// NEED TO EXPLAIN WHY WE ARE DESCRIBING SINGLE AND TWO PHASE TRANSFERS NEXT + +### Single-phase transfer + +TBD + +### Two-phase transfer + +A two-phase transfer moves funds in stages. + +1. Reserve funds (`pending`) +2. Resolve funds (`post`, `void`, or `expire`) + +The name _two-phase transfer_ is a reference to the two-phase commit protocol for distributed transactions. + +## Liquidity + +Rafiki tracks liquidity using the Interledger Protocol, which is a clearing protocol, without physically holding funds. + +### Types of liquidity + +#### Asset liquidity + +Asset liquidity represents the value, denominated in a given asset, that Rafiki has at its disposal in which to send or forward ILP packets. Asset liquidity increases when packets are received and decreases when packets are sent. Asset liquidity is always positive and cannot fall below zero. + +You should define and adjust asset liquidity based on your liquidity risk profile. + +#### Peer liquidity + +Peer liquidity is the credit line, denominated in the asset of the peering relationship, Rafiki extends to a peer. Peer liquidity should be defined in the peering agreement and depends on the trust between the transacting peers. If peer liquidity is insufficient, payments will not be processed. When peer liquidity is used up, you and your peer should settle then reset your peer liquidity. + +:::note +A peering agreement is a legal contract between the parties involved in a peering relationship. It defines terms such as the assets involved, auth tokens, connection endpoints, and other operational details. It is not configured or managed within Rafiki but is necessary for establishing the terms under which assets are exchanged between peers. +::: + +#### Payment liquidity + +Payment liquidity is managed for incoming and outgoing payments created via Open Payments through liquidity accounts in your accounting database. When incoming or outgoing payments are created via the Open Payments APIs, a corresponding liquidity account is automatically created. Liquidity must be deposited to an outgoing payment account before the payment can be processed. You are notified to deposit or withdraw liquidity via [webhook events](/integration/deploy-to-prod/endpoints/webhook-events). + +## TigerBeetle + +TigerBeetle is a high-performance distributed financial accounting database used by Rafiki’s `backend` service to store account balance data at the ILP layer. Both liquidity and settlement accounts in Rafiki correspond to TigerBeetle credit and debit accounts, respectively. TigerBeetle only holds balance data without any additional ILP packet metadata. For detailed information on TigerBeetle, including its consensus mechanism and its limitations, visit the official TigerBeetle documentation and blog. + +You have the flexibility to choose whether to use TigerBeetle or opt for a separate Postgres database. However, TigerBeetle is recommended due to its speed, efficiency, and dedicated design for handling double ledger accounting. + +### Changing TigerBeetle version + +// ADD LINKS TO THESE + +- Updating node client +- Prod environment helm chart +- Local environment +- Testing diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx index 0dd3c87e2d..4e83117aea 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx @@ -12,7 +12,7 @@ Your endpoint must accept `GET` requests and respond in the following format: | Variable Name | Type | Description | Required | | -------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------- | -------- | -| `base` | String | Asset code represented as ISO 4127 currency code e.g. `USD` | Y | +| `base` | String | Asset code represented as ISO 4217 currency code e.g. `USD` | Y | | `rates` | Object | Object containing `` pairs, e.g. `{EUR:0.8930}` | Y | | `rates.` | Number | Exchange rate given `base` and `` | Y | @@ -108,8 +108,4 @@ These variables are used in the following request example: ### Rafiki Admin application -You may also add fees via the Rafiki Admin application. - -

- Needs link to Rafiki Admin User Guide -

+You may also add fees via the Rafiki Admin application. See the [Rafiki Admin application user guide](/resources/admin-user-guide/#assets) for more information on configuring asset fees. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx index 84aceacbce..4fef29029b 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx @@ -2,4 +2,93 @@ title: Adding asset --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +import { CodeBlock } from '@interledger/docs-design-system' + +[Assets](/components/accounts-transfers-liquidity#assets) in Rafiki can be added through the Backend Admin API or the Rafiki Admin application. + +## The `asset` type + +The `asset` type in Rafiki consists of a value, an asset code, and an asset scale. + +| **Property** | **Type** | **Description** | **Example** | +| ------------ | -------- | -------------------------------------------------------------------------------------------------------------------- | ----------- | +| `value` | BigInt | Numerical amount | 10000 | +| `assetCode` | String | Should be an ISO 4217 currency code where available | “USD” | +| `assetScale` | Integer | Difference in order of magnitude between the standard unit and a fractional unit | 2 | + +To convert from an asset to a currency amount that is more human-readable, apply the following formula: + +$currencyAmount = \frac{value}{10^{assetScale}}$ + +Using the example from the table above, our formula looks like this: + +$\frac{10000}{10^2} =100.00$ USD + +## Add an asset using the Backend Admin API + +Rafiki’s Backend Admin API implements a GraphQL interface. Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts; a query and an object containing query variables. + +To add US dollars, for example, as an asset type to your Rafiki instance, call the `CreateAsset` mutation and pass the `input` parameters for the asset `code`, represented by its ISO 4217 currency code (USD), and scale variables as follows: + + + +```graphql +// Query: + +mutation CreateAsset($input: CreateAssetInput!) { + createAsset(input: $input) { + code + success + message + asset { + id + code + scale + } + } +} + + +// Query Variables: + +{ + "input": { + "code": "USD", + "scale": 2 + } +} + +``` + + + + + +```graphql +{ + "data": { + "createAsset": { + "code": "200", + "success": true, + "message": "Created Asset", + "asset": { + "id": "b3dffeda-1e0e-47d4-82a3-69b1a622eeb9", + "code": "USD", + "scale": 2 + } + } + } +} + + +``` + + + +## Add an asset using the Rafiki Admin application + +Alternatively, assets can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/playground/overview/#running-the-local-environment). + +See the [Rafiki Admin application user guide](/resources/admin-user-guide/#assets) for more information on adding assets. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx index d1d89e4844..ad93a277f3 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx @@ -2,4 +2,112 @@ title: Adding peer --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +import { CodeBlock } from '@interledger/docs-design-system' + +## Prerequisites + +To add a peer and send Interledger payments you and the account servicing entity (ASE) you intend to peer with must both: + +- Run an implementation of an [Interledger connector](/services-and-aux-packages/backend-service/#interledger-connector) (ideally Rafiki). +- Agree on an [asset](/components/accounts-transfers-liquidity#assets) for the peering relationship. You can set up multiple peering relationships with the same peer based on different assets. At least one asset shared by you and your peer must be added to your Rafiki instance prior to setting up the peering relationship. +- Agree on a `maxPacketAmount` value, which specifies how many packets a payment is split into. +- Communicate your respective static Interledger (ILP) addresses. +- Communicate a connection endpoint for the other peer to send packets to. +- Exchange `auth` tokens for the connection endpoint. +- Agree on a settlement mechanism (a means of paying one another for the successful forwarding and delivery of packets), which is outside the scope of Interledger and Rafiki. + +Optionally, you may also deposit an initial [liquidity](/integration/deploy-to-prod/running-your-instance/managing-liquidity) for your peer. + +## Add a peer using the Backend Admin API + +Rafiki’s Backend Admin API implements a GraphQL interface. Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts; a query and an object containing query variables. + +To add a peer to your Rafiki instance call the `CreatePeer` mutation query and pass the query variables for the following: + +| Query parameters | Description | Required | +| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `assetID` | the ID of the asset that you and your peer will use to ultimately settle your net obligations outside of Interledger. | Y | +| `staticILPaddress` | Your peer’s static ILP address (the following example uses `g.othergreatwallet`) | Y | +| `name` | Your peer’s name (the following example uses “The Other Great Wallet”) | Y | +| `http.incoming.authTokens` | The token your peer will use to present and connect to and send packets to your Rafiki instance. | Y | +| `http.outgoing.endpoint` | Your peer’s connector endpoint. By default it is on local port 0.0.0.0:3002 | Y | +| `http.outgoing.authtoken` | The token that you will use to present to your peer and connect to and send packets to their Rafiki instance. | Y | +| `initialLiquidity` | Initial amount of liquidity to deposit for peer. [Liquidity](/integration/deploy-to-prod/running-your-instance/managing-liquidity) can also be deposited using the `DepositPeerLiquidity` mutation. | N | + + + +```graphql +// Query: + +mutation CreatePeer($input: CreatePeerInput!) { + createPeer(input: $input) { + code + success + message + peer { + id + asset { + code + scale + } + staticIlpAddress + name + } + } +} + + +// Query Variables (substitute the asset ID from the “create asset” response for INSERT_ASSET_ID): + +{ + "input": { + "staticIlpAddress": "g.othergreatwallet", + "name": "The Other Great Wallet" + "http": { + "incoming": {"authTokens": ["mytoken"]}, + "outgoing": {"endpoint": "ilp.othergreatwallet.com", "authToken": "theirtoken"} + }, + "assetId": "INSERT_ASSET_ID", + "initialLiquidity": + } +} + +``` + + + + + +```graphql +{ + "data": { + "createPeer": { + "code": "200", + "success": true, + "message": "Created ILP Peer", + "peer": { + "id": "480ef339-7842-4501-a905-923fc1339cef", + "asset": { + "code": "USD", + "scale": 2 + }, + "staticIlpAddress": "g.othergreatwallet", + "name": "The Other Great Wallet" + } + } + } +} + + + +``` + + + +## Add a peer using the Rafiki Admin application + +Alternatively, a peer can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/playground/overview/#running-the-local-environment). + +See the [Rafiki Admin application user guide](/resources/admin-user-guide/#peers) for more information on adding peers. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx index 9262e55160..d6eb61e92a 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx @@ -2,4 +2,179 @@ title: Creating wallet address (strategies for identity lookup) --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +import { CodeBlock } from '@interledger/docs-design-system' + +To allow your account holders the ability to send and receive payments via the Open Payments APIs, you must create at least one wallet address for each account. The wallet address serves as a standardized identifier for a payment account. + +You can create wallet addresses for your account holders using the Backend Admin API. Note that at least one asset must be created before the wallet address is created. The `assetId` of the asset must be provided as an input variable when issuing the GraphQL mutation query. Refer to the [adding asset](/integration/deploy-to-prod/running-your-instance/adding-asset) page for details. + +## Creating wallet addresses through a script + +One approach to issuing wallet addresses to your account holders is writing a one-time script to loop through your list of account holders and call the `CreateWalletAddress` GraphQL mutation along with the input parameters. The following is an example: + + + +```graphql +// Query: + +mutation CreateWalletAddress($input:CreateWalletAddressInput!) { + createWalletAddress(input:$input) { + code + success + message + walletAddress { + id + createdAt + publicName + url + asset { + code + id + scale + } + } + } +} + + +// Input parameters **NOTE - `additionalProperties` are optional: + +{ + "input": { + "assetId": "0ddc0b7d-1822-4213-948e-915dda58850b", + "publicName": "Sarah Marshall", + "url": "https://example.wallet.com/sarah", + "additionalProperties": [ + { + "key": "iban", + "value": "NL93 8601 1117 947", + "visibleInOpenPayments": false + }, + {"key": "nickname", "value": "S Mar", "visibleInOpenPayments": true } + ] + } +} + +``` + + + + + +```graphql +{ + "data": +{"createWalletAddress": { + "code":"200", + "success":true, + "message":"Created wallet address", + "walletAddress": { + "id":"695e7546-1803-4b45-96b6-6a53f4082018", + "createdAt":"2023-03-03T09:07:01.107Z", + "publicName":"Sarah Marshall", "url":"https://example.wallet.com/sarah", + "asset": { +"id":"0ddc0b7d-1822-4213-948e-915dda58850b", + "code":"USD", + "scale":2 + } + } + } + } +} + +``` + + + +You SHOULD store at least the `walletAddress.id` in their internal database to be able to reference the account and wallet address. + +### Create wallet address key + +To use the Open Payments APIs, a wallet address must be associated with at least one private-public key pair to sign an API request. One or multiple public keys are linked to the wallet address so that third parties can verify request signatures. The key pair can be added using the `CreateWalletAddressKey` GraphQL mutation. If you create wallet addresses for your account holders via a one-time script, you must call this mutation for each new wallet address. + + + +```graphql +// Query: + +mutation +CreateWalletAddressKey +($input:CreateWalletAddressKeyInput!) +{ + createWalletAddressKey(input:$input) { + code + message + success + walletAddressKey +{ +id + walletAddressId + revoked + jwk{ + alg + crv + kid + kty + x + } + + createdAt + } +} +} + + +// Input parameters + +{ + "input": { + "jwk": { + "kid": "keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", + "x":"ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8", + "alg":"EdDSA", + "kty":"OKP", + "crv":"Ed25519" +}, +"walletAddressId":"695e7546-1803-4b45-96b6-6a53f4082018" + }} + +``` + + + + + +```graphql +{ + "data": { + "createWalletAddressKey": { +"code":"200", +"message":"Added Key To Wallet Address", +"success":true, +"walletAddressKey": { + "id":"f2953571-f10c-44eb-ab41-4450a7ad6771", +"walletAddressId":"695e7546-1803-4b45-96b6-6a53f4082018", +"revoked":false, +"jwk": { +"alg":"EdDSA", +"crv":"Ed25519", + "kid":"keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", + "kty":"OKP", +"x":"ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8" +}, + "createdAt":"2023-03-03T09:26:41.424Z" +} + } + } +} + + +``` + + + +## Creating wallet addresses dynamically + +An alternative approach to creating wallet addresses for your account holders is to generate the addresses dynamically when your Rafiki instance fires the [`wallet_address.not_found`](/integration/deploy-to-prod/endpoints/webhook-events) webhook event. This event fires when Rafiki does not find the wallet address requested from an Open Payments API call. When receiving this event, you can look up the associated account in your system and call the `CreateWalletAddress` and `CreateWalletAddressKey` mutations to create the wallet address and its associated private-public key pair. Even if you opt to create the initial batch of wallet addresses for your existing account holders via a one-time script, you may implement this process to dynamically create wallet addresses for any new accounts you onboard to your system. diff --git a/packages/documentation/src/content/docs/resources/admin-user-guide.mdx b/packages/documentation/src/content/docs/resources/admin-user-guide.mdx new file mode 100644 index 0000000000..88f31806de --- /dev/null +++ b/packages/documentation/src/content/docs/resources/admin-user-guide.mdx @@ -0,0 +1,253 @@ +--- +title: Rafiki Admin application user guide +--- + +import { LinkOut } from '@interledger/docs-design-system' + +The Rafiki Admin application provides tools to manage peers, assets, wallet addresses, webhooks, payments, and account settings. The purpose of this document is to help you navigate and use the Rafiki Admin application effectively. + +## Getting started + +### Prerequisites + +- Familiarity with general Rafiki concepts. The [intro to Rafiki overview](/intro-to-rafiki/overview) is a great place to start. +- Rafiki Admin login credentials + +## Navigation + +After logging in, you’ll be greeted by the main landing page with a left-hand navigation menu. This menu provides access to all of the main functionality needed to manage your Rafiki instance. + +Rafiki Admin application user interface welcome screen with navigation options like Home, Peers, Assets, Wallet Addresses, Webhooks, and more on the left sidebar. + +Each of the following menu items leads to a different page of the Rafiki Admin application: + +- [Peers](#peers) +- [Assets](#assets) +- [Wallet addresses](#wallet-addresses) +- [Webhooks](#webhooks) +- [Payments](#payments) +- [Account settings](#account-settings) + +## Peers + +The Peers page allows you to manage peering relationships in your Rafiki instance, including viewing, creating, editing, and deleting peers. + +On this page, all configured peers are displayed in a table where you can view the peer name, its ILP address, asset details including the asset type and scale, and the outgoing HTTP endpoint. + +A screenshot of the Rafiki Admin application user interface displaying the "Peers" section. It shows a table containing a peer with details including ILP address, asset, and outgoing HTTP endpoint. A "Create peer" button is in the top right. + +### Create peer + +To create a new peer, select **Create Peer** from the main Peers page. + +A screenshot of the Rafiki Admin application user interface displaying the "Create Peer" section. It shows several text fields to configure in order to create a new peer. A "Create" button is in the lower right. + +Fill out the following fields to configure and create your peer: + +| **Section** | **Field** | **Description** | +| ------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------- | +| General Information | Name | A public name for the peer to identify it on your system. | +| | Static ILP Address | The peer’s ILP address, obtained from the peer. | +| | Max Packet Amount | The agreed-upon maximum number of packets a payment is split into. | +| HTTP Information | Incoming Auth Tokens | A comma-separated list of tokens accepted by your Rafiki instance from a peer for incoming requests. | +| | Outgoing Auth Token | A single token used by your Rafiki instance for all outgoing requests to authenticate itself with the peer. | +| | Outgoing Endpoint | The URL of the peer’s server where your Rafiki instance sends outgoing requests. | +| Asset Information | Asset | The asset used for transactions with this peer. | + +After completing these fields, select **Create** to add the new peer. + +### Edit peer + +To edit an existing peer, select any peer entry from the table on the main Peers page. This opens the Edit Peer page where you can view and modify peer settings. + +A screenshot of the Rafiki Admin application user interface displaying the "Edit Peer" section. It shows several text fields configured for an existing peer. This page is used to view peer details, edit peer details, and delete a peer. + +While the Edit Peer page shares fields with the Create Peer page, it also includes additional fields and actions specific to managing an existing peer: + +| **Section** | **Field/Action** | **Description** | +| --------------------- | ------------------ | ----------------------------------------------------------------------------------------- | +| General Information | Peer ID | A unique identifier assigned by Rafiki when the peer was created. This cannot be changed. | +| Asset Information | View Asset | To see more information about an asset, select **View asset**. | +| Liquidity Information | Amount | Current amount of peer liquidity available. | +| | Deposit Liquidity | To increase the amount of liquidity available, select **Deposit liquidity**. | +| | Withdraw Liquidity | To reduce the amount of liquidity available, select **Withdraw liquidity**. | + +After editing any of the above fields in the General Information or HTTP Information sections, select **Save** to commit those changes. + +#### Delete peer + +The final section of the Peers page is the irreversible action of deleting a peer. Select **Delete peer** to make this change. + +## Assets + +The Assets page allows you to manage assets in your Rafiki instance, including viewing, editing, and creating assets. + +On this page, all configured assets are displayed in a table where you can view the asset ID, the asset code, the scale, and the withdrawal threshold. + +A screenshot of the Rafiki Admin application user interface displaying the "Assets" section. It shows a table containing four assets with details including ID, asset code, asset scale, and withdrawal threshold. An "Add asset" button is in the top right. + +### Create asset + +To create a new asset, select **Add Asset** from the main Assets page. + +A screenshot of the Rafiki Admin application user interface displaying the "Create Asset" section. It shows several text fields to configure in order to create a new asset. A "Create" button is in the lower right. + +Fill out the following fields to create your new asset: + +| **Section** | **Field** | **Description** | +| ------------------- | -------------------- | --------------------------------------------------------------------------------- | +| General Information | Code | The asset code, generally an ISO 4217 currency code where available. | +| | Scale | Difference in order of magnitude between the standard unit and a fractional unit. | +| | Withdrawal Threshold | The minimum amount of liquidity that can be withdrawn from the asset. | + +After completing these fields, select **Create** to add the new asset. + +### Edit asset + +To edit an existing asset, select any asset entry from the table on the main Assets page. This opens the Edit Asset page where you can view and modify asset settings. + +A screenshot of the Rafiki Admin application user interface displaying the "Edit Asset" section. It shows several text fields configured for an existing asset. This page is used to view and edit asset details. + +While the Edit Asset page shares fields with the Create Asset page, it also includes additional fields and actions specific to managing an existing asset: + +| **Section** | **Field/Action** | **Description** | +| --------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | +| General Information | Asset ID | A unique identifier assigned by Rafiki when the asset was created. This cannot be changed. | +| Liquidity Information | Amount | Current amount of asset liquidity available. | +| | Deposit Liquidity | To increase the amount of liquidity available, select **Deposit liquidity**. | +| | Withdraw Liquidity | To reduce the amount of liquidity available, select **Withdraw liquidity**. | +| Sending Fee | Fixed Fee | Flat fee per asset. | +| | Basis Points | A variable fee per asset. One basis point fee is equal to 0.01% of the total amount, 100 basis points = 1%, 10000 basis points = 100% | +| | Fee history | To view a list of asset fees over time, select **Fee history**. | + +After editing any of the above fields in the General Information or Sending Fee sections, select **Save** to commit those changes. + +## Wallet addresses + +The Wallet Addresses page allows you to manage the wallet addresses associated with your Rafiki instance, including viewing, editing, and creating wallet addresses. + +On this page, all configured wallet addresses are displayed in the table where you can view the address URL, the public name, and the wallet status. + +A screenshot of the Rafiki Admin application user interface displaying the "Wallet Addresses" section. It shows a table containing four wallet addresses with details including URL of the address, public name, and status. A "Create wallet address" button is in the top right. + +### Create wallet address + +To create a new wallet address, select **Create wallet address** from the main Wallet Address page. + +A screenshot of the Rafiki Admin application user interface displaying the "Create Wallet Address" section. It shows several text fields to configure in order to create a new wallet address. A "Create" button is in the lower right. + +Fill out the following fields to create a new wallet address: + +| **Section** | **Field** | **Description** | +| ------------------- | ------------------- | -------------------------------------------------------------- | +| General Information | Wallet address name | The URL of the wallet. Once set, it cannot be changed. | +| | Public name | The name associated with the wallet that is visible to others. | +| | Asset | Select an asset to associate with this wallet. | + +:::note +At least one asset has to be created prior to creating a new wallet address. See [Create asset](#create-asset) for more information. +::: + +After completing this section, select **Create** to add the new wallet address. + +### Edit wallet address + +To edit an existing wallet address, select any wallet address entry from the table on the main Wallet Addresses page. This opens the Edit Wallet Address page where you can view and modify wallet address details. + +A screenshot of the Rafiki Admin application user interface displaying the "Edit Wallet Address" section. It shows several text fields configured for an existing wallet address. This page is used to view and edit wallet address details. + +While the Edit Wallet Address page shares fields with the Create Wallet Address page, it also includes additional fields and actions specific to managing an existing wallet address. + +| **Section** | **Field/Action** | **Description** | +| --------------------- | -------------------- | ------------------------------------------------------------------------------------------- | +| General Information | ID | A unique identifier assigned by Rafiki when the wallet was created. This cannot be changed. | +| | URL | The wallet address. This cannot be changed. | +| | Status | The current status of the wallet, either active or inactive. | +| Asset Information | Code | The asset code, generally an ISO 4217 currency code where available. | +| | Scale | Difference in order of magnitude between the standard unit and a fractional unit. | +| | Withdrawal threshold | The minimum amount of liquidity that can be withdrawn from the asset. | +| | View asset | To see more information about an asset, select **View asset**. | +| Liquidity Information | Amount | Current amount of liquidity available for this wallet. | +| | Withdraw | To withdraw funds from this wallet, select **Withdraw**. | + +After editing any of the above fields in the General Information section, select **Save** to commit those changes. + +## Webhooks + +The Webhook Events page allows you to monitor and manage webhook events within your Rafiki instance. Webhook events in Rafiki are the main communication channel between you and your Rafiki instance. See [Webhook events](/integration/deploy-to-prod/endpoints/webhook-events) for more information about webhook events. + +All webhook events that have been triggered are displayed in the table. For each webhook event, you can see the webhook ID, the event type, and the date and time of the event. There is also a field at the top of the page allowing you to filter the table by event type, making it easier to drill down into specific events. + +A screenshot of the Rafiki Admin application user interface displaying the "Webhook Events" section. It shows a table containing one webhook event with details including ID, type of webhook, and the date of the event. A "View data" button is also present in the table row for a detailed JSON view of the event data. + +To view the webhook event as a JSON representation, select **View data**. + +## Payments + +The Payments page allows you to view all incoming and outgoing payments in your Rafiki instance. This allows you to monitor payment activity as well as track the status of payments. + +All payments are displayed in the table. For each payment, you can view the unique payment ID, type of payment, state of the payment, and the date and time the payment was created. There is also a field at the top of the page allowing you to filter the table by payment type, making it easier to drill down into specific transactions. + +A screenshot of the Rafiki Admin application user interface displaying the "Payments" section. It shows a table where payment details would be displayed including ID, payment type, payment state, and the date of the payment. + +## Account settings + +The Account Settings page allows you to manage your personal account information, including updating your email address and password. + +A screenshot of the Rafiki Admin application user interface displaying the "Account Settings" section. It shows two text fields: one to change an email address and one to change a password. + +To change your email address, enter the new email address and select **Save**. + +To change your password, enter your new password and select **Save**. diff --git a/packages/documentation/src/content/docs/resources/glossary.mdx b/packages/documentation/src/content/docs/resources/glossary.mdx index 73233b0c82..18578290b1 100644 --- a/packages/documentation/src/content/docs/resources/glossary.mdx +++ b/packages/documentation/src/content/docs/resources/glossary.mdx @@ -2,4 +2,83 @@ title: Glossary --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +import { CodeBlock } from '@interledger/docs-design-system' + +Potential terms to include in the glossary: + +A + +- Account servicing entity (ASE) +- Auth service +- Authorization server + +B + +- Backend service + +C + +- Client + +G + +- Grant Negotiation and Authorization Protocol (GNAP) +- Grants + +I + +- Identity provider (IdP) +- Incoming payments + +// We’ll need to decide which Interledger-related terms should be defined in our glossary and which to link out to the Interledger docs so we don’t duplicate too much info. + +- Interledger +- Interledger connector / ILP connector +- Interledger Protocol (ILP) +- ILP packets + +L + +- Ledger + +N + +- Non-regulated entity + +O + +- Open Payments +- Opinionated As in, “The Rafiki backend exposes the APIs for Open Payments, and requests to them are authorized by an opinionated version of GNAP.” +- Outgoing payments + +P + +- Payment pointer +- Peer +- Protected resource + +Q + +- Quotes + +R + +- Rafiki +- Regulated entity +- Resource server + +S + +- Simple Payment Setup Protocol (SPSP) +- Streaming Transport for the Real-Time Exchange of Assets and Messages (STREAM) + +T + +- TigerBeetle + +W + +- Wallet address +- Web Monetization (WM) From 853e1fb4f206566580aa14b02bfeb23a11682668 Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Fri, 23 Aug 2024 14:08:08 +0200 Subject: [PATCH 22/91] docs: mi/docs-update-batch1 --- .../endpoints/webhook-events.mdx | 270 +++++++++++++++- .../managing-liquidity.mdx | 303 +++++++++++++++++- .../docs/integration/integrator-checklist.mdx | 10 +- .../content/docs/playground/autopeering.mdx | 55 +++- .../src/content/docs/playground/overview.mdx | 135 ++++++-- .../token-introspection.mdx | 13 +- 6 files changed, 757 insertions(+), 29 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx index 6dfd22195a..b2c13c49ac 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx @@ -1,5 +1,271 @@ --- -title: Webhook events +title: Webhook Events --- -## Placeholder +import { Mermaid } from '@interledger/docs-design-system' +import { LinkOut } from '@interledger/docs-design-system' + +Rafiki does not hold user account balances but tracks liquidity within asset, peer, and payment accounts in its own database. As an account servicing entity, you must manage this liquidity primarily in response to certain events dispatched from Rafiki. To receive these notifications from Rafiki, you must expose a webhook endpoint that listens for these events and reacts accordingly. When events fire in your Rafiki instance, the Rafiki `backend` service will make a POST request to the configured `WEBHOOK_URL` environment variable and will expect a 200 status in the response. + +### Request Body + +Each webhook has the following structure in the request body: + +| Variable Name | Type | Description | Required | +| ------------- | ----------------------------- | ------------------- | -------- | +| `id` | String | event ID | Y | +| `type` | Enum: [EventType](#eventtype) | event type value | Y | +| `data` | Object | any additional data | N | + +#### EventType + +The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle. + +| Value | Description | +| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | +| [`incoming_payment.created`](#incoming_paymentcreated) | An incoming payment has been created. | +| [`incoming_payment.completed`](#incoming_paymentcompleted) | An incoming payment is complete and will not accept any additional incoming funds. | +| [`incoming_payment.expired`](#incoming_paymentexpired) | An incoming payment expired and will not accept any additional incoming funds. | +| [`outgoing_payment.created`](#outgoing_paymentcreated) | An outgoing payment was created. | +| [`outgoing_payment.completed`](#outgoing_paymentcompleted) | An outgoing payment completed. | +| [`outgoing_payment.failed`](#outgoing_paymentfailed) | An outgoing payment partially or completely failed. | +| [`wallet_address.not_found`](#wallet_addressnot_found) | A requested wallet address was not found. | +| [`wallet_address.web_monetization`](#wallet_addressweb_monetization) | Web Monetization payments received via STREAM. | +| [`asset.liquidity_low`](#assetliquidity_low) | Asset liquidity has dropped below defined threshold. | +| [`peer.liquidity_low`](#peerliquidity_low) | Peer liquidity has dropped below defined threshold. | + +An OpenAPI specification of the webhook requests and their corresponding data can be found here. +Additionally, the [local playground](/playground/overview#usage) contains example payloads in the Bruno collection that can be used to test a webhook service integration. + +## Events + +### `incoming_payment.created` + +The `incoming_payment.created` event indicates that an incoming payment was created. No funds are received in your Rafiki instance, so no action is required. This webhook event is informational and allows you to display upcoming incoming payments to your users. + +>ASE: webhook event: incoming payment created + ASE->>ASE: no action required + +`} +/> + +### `incoming_payment.completed` + +The `incoming_payment.completed` event indicates that an incoming payment was completed, either automatically or manually, and that any funds received into this incoming payment should be withdrawn and credited to the recipient’s account on your ledger. + +In addition, the `CreateIncomingPaymentWithdrawal` supports [two-phase transfers](https://rafiki.dev/reference/glossary/#two-phase-transfers). + +Example: An incoming payment was completed and the recipient received **$10**. + +>ASE: webhook event: incoming payment completed,
receivedAmount: $10 + ASE->>R: admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: credit receiver's account with $10 + +`} +/> + +Example: An incoming payment supporting two-phase transfers was completed and recieved **$10**. + +>ASE: webhook event: incoming payment completed,
receivedAmount: $10 + ASE->>R: admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: credit receiver's account with $10 + ASE->>R: admin API call: PostLiquidityWithdrawal + R->>R: 2-phase transfer completed + +`} +/> + +### `incoming_payment.expired` + +The `incoming_payment.expired` event indicates that an incoming payment has expired and that any funds previously received for this incoming payment should be withdrawn and credited to the recipient’s account on your ledger. Note that this event is only fired if funds were received for the incoming payment. In cases where the sender did not specify the `incomingAmount` when the `incomingPayment` resource was initially created, the `incoming_payment.expired` event notifies you that no further payments are expected. The primary use case of the `incoming_payment.expired` event to signal the end of any additional payments is a streaming payments example, such as Web Monetization. + +Example: An incoming payment has expired and received **$2.55**. + +>ASE: webhook event: incoming payment expired,
receivedAmount: $2.55 + ASE->>R: admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: credit receiver's account with $2.55 + +`} +/> + +### `outgoing_payment.created` + +The `outgoing_payment.created` event indicates that an outgoing payment was created and is awaiting liquidity. You should verify the sender’s account balance and perform other verifications before funding or canceling the outgoing payment in case the sender has insufficient funds in their account. If the outgoing payment is not fulfilled, you can cancel it. Otherwise, you must put a hold on the sender’s account and deposit the funds into Rafiki. + +Example: An outgoing payment for **$12** has been created. + +>ASE: webhook event: outgoing payment created,
debitAmount: $12 + ASE->>ASE: check if account has enough balance + alt Account has enough balance + ASE->>ASE: put hold of $12 on sender's account + ASE->>R: admin API call: DepositOutgoingPaymentLiquidity + end + alt Account does not have enough balance + ASE->>R: admin API call: CancelOutgoingPayment
reason: Not enough balance + end + +`} +/> + +### `outgoing_payment.completed` + +The `outgoing_payment.completed` event indicates that an outgoing payment has successfully sent as many funds as possible to the receiver against the associated incoming payment. You should withdraw any excess liquidity from that outgoing payment in Rafiki that arises from differences between the sent and received amounts and use it as you see fit. One option would be to return it to the sender. Another option is to retain the excess liquidity as a service fee. Furthermore, you should remove the hold on the sender’s account and debit it. + +In addition, the `CreateOutgoingPaymentWithdrawal` supports [two-phase transfers](https://rafiki.dev/reference/glossary/#two-phase-transfers). + +Example: An outgoing payment amount for **$12** has been completed. **$11.50** were sent. You keep **$0.50** as fees. + +>ASE: webhook event: outgoing completed,
debitAmount: $12, sentAmount:$11.50 + ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal + ASE->>ASE: remove the hold and deduct $12 from the sender's account,
credit ASE's account with $0.50 + +`} +/> + +Example: An outgoing payment supporting two-phase transfers for **$12** has been completed. **$11.50** were sent. You keep **$0.50** as fees. + +>ASE: webhook event: outgoing completed,
debitAmount: $12, sentAmount:$11.50 + ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal + ASE->>ASE: remove the hold and deduct $12 from the sender's account,
credit ASE's account with $0.50 + ASE->>R: admin API call: PostLiquidityWithdrawal + R->>R: 2-phase transfer completed + +`} +/> + +### `outgoing_payment.failed` + +The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was unsuccessful. You should withdraw any remaining liquidity from that outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` was 0), you should remove the hold from the sender’s account. If the payment failed partially, you should remove the hold from the sender’s account and debit it with the amount sent. Considering the discrepancy between the quote amount and the amount sent, you should refrain from taking a sending fee. + +Example: An outgoing payment for **$12** has failed. **$8** were sent. + +>ASE: webhook event: outgoing failed,
debitAmount: $12, sentAmount:$8 + ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal + ASE->>ASE: remove the hold and deduct $8 from the sender's account + +`} +/> + +### `wallet_address.web_monetization` + +The `wallet_address.web_monetization` event indicates that a wallet address received Web Monetization payments via the ILP STREAM protocol. You should withdraw that liquidity from the wallet address in Rafiki and credit the receiver’s account on your ledger. + +Example: A wallet address received **$0.33** + +>ASE: webhook event: wallet address web monetization,
receivedAmount: $0.33 + ASE->>R: admin API call: CreateWalletAddressWithdrawal + ASE->>ASE: credit receiver's account with $0.33 + +`} +/> + +### `wallet_address.not_found` + +The `wallet_address.not_found` event indicates that a wallet address was requested via the Open Payments Wallet address server API, but it doesn’t exist in your Rafiki instance. When receiving this event, you can look up the associated account in your system and create a wallet address. The initial request for the wallet address will succeed if you create it within the configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. + +Example: The wallet address `https://example-wallet.com/carla_garcia` was requested but does not exist yet. + +>ASE: webhook event: wallet address not found,
wallet address: https://example-wallet.com/carla_garcia + ASE->>R: admin API call: CreateWalletAddress
url: https://example-wallet.com/carla_garcia,
public name: Carla Eva Garcia + +`} +/> + +### `asset.liquidity_low` + +The `asset.liquidity_low` event indicates that an asset’s liquidity has dropped below a predefined liquidity threshold. When receiving this event, you should check if you already have or can acquire additional liquidity for that specific asset and, if so, deposit it in Rafiki. Cross-currency transfers will fail if you do not increase that asset’s liquidity in Rafiki. + +Example: The asset liquidity for USD (scale: 2) drops below **$100.00**. + +>ASE: webhook event: liquidity (asset) low,
asset: USD (scale: 2, id: "abc") + ASE->>R: admin API call: DepositAssetLiquidity + +`} +/> + +### `peer.liquidity_low` + +The `peer.liquidity_low` event indicates that a peer’s liquidity has dropped below a predefined liquidity threshold. When receiving this event, you must decide if you want to extend that peer’s credit line or whether the peer must settle first and then extend a new line of credit to that peer. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. + +Example: The peer liquidity for Happy Life Bank drops below **$100.00**. + +>ASE: webhook event: liquidity (peer) low,
peer: Happy Life Bank (asset: "USD", scale: 2, id: "abc") + ASE->>R: admin API call: DepositPeerLiquidity + +`} +/> + +## Errors + +If an error occurs when Rafiki sends a webhook event (i.e., a non-200 status is returned or the request timed out), Rafiki will retry the webhook requests at increasing intervals until a 200 status is returned. The first retry is after 10 seconds, the second after 20 more, the next after 30 more, etc. The maximum number of retries for webhook events is configured via the WEBHOOK_MAX_RETRY environment variable. + +Additionally, the timeout for webhook requests is configured with the `WEBHOOK_TIMEOUT` environment variable. + +## Best Practices + +### Duplicate Events + +The `id` in the webhook event payload is a unique UUID, which your system can use to determine whether the event has been received previously, preventing duplicate event processing. + +### Asynchronous Handling + +Consider using a worker to process received webhook events, especially if requests to credit/debit user accounts are lengthy processes. Doing so allows the server to process events at a rate suitable for the system and reduce the number of failed/retried webhook events since the webhook event listener can immediately reply with a successful 200 status. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx index 0ce3307ca9..f8ae369486 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx @@ -2,4 +2,305 @@ title: Managing liquidity --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +As an implementation of the Interledger Protocol, Rafiki provides [accounting](/components/accounts-transfers-liquidity) between transacting parties but doesn’t handle settlement. You and the account servicing entities you decide to peer with must agree on the means and how often you will settle your accounts. Consequently, Rafiki can manage the liquidity used to fund payments made through the Interledger network. + +## Add liquidity via GraphQL + +Liquidity can be managed in Rafiki through the [`backend`](/services-and-aux-packages/backend-service/) Admin API, which implements a GraphQL interface, or via the [Rafiki Admin application](/resources/admin-user-guide). Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts: a query and an object containing query variables. + +As Rafiki supports several types of liquidity, we’ll cover the typical scenarios you’ll need to manage. + +:::note +You must provide the `idempotencyKey` when calling mutations related to liquidity. This key allows the safe retrying of requests without multiple operations. It should be a unique key, typically a V4 UUID. For more information, refer to Rafiki’s [idempotency](/apis/idempotency/). +::: + +## Asset Liquidity + +Asset liquidity specifies the amount of value denominated in an asset you have previously [added](/integration/deploy-to-prod/running-your-instance/adding-asset) to your Rafiki instance, which Rafiki has at its disposal to send or forward Interledger packets. Asset liquidity increases if packets denominated in the asset are received and decreases if your Rafiki instance sends packets denominated in the asset. The amount is always non-negative. + +You should define and adjust the asset liquidity based on your risk tolerance. + +### Example + +You’ve configured your Rafiki instance with two assets, EUR and USD, with an asset scale of 0. The EUR liquidity is 10, and the USD liquidity is 50. With liquidity support for these two assets, your Rafiki instance can function as a connector node within the Interledger network and provide currency exchange between a sender sending a payment in EUR and a recipient receiving the payment in USD. + +In a cross-currency transaction, your Rafiki instance would receive packets totaling 10 EUR and send packets worth 11 USD. The EUR liquidity would be increased to 20 EUR, and the USD liquidity would be reduced to 39 USD. + +If your Rafiki instance were to receive 50 EUR, but needed to send 55 USD, the transaction would fail because your instance does not have enough USD liquidity. + +### Deposit Asset Liquidity + +You can deposit asset liquidity via the `DepositAssetLiquidity` mutation: + +```sh +mutation +DepositAssetLiquidity($input:DepositAssetLiquidityInput!) { + depositAssetLiquidity(input:$input) { + code + success + message + error + } +} +``` + +The following are example `input` parameters for the `DepositAssetLiquidity` mutation query above. + +```sh +{ "input": { + "id":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "assetId":"7b8b0f65-896d-4403-b7ba-2e24bf20eb35", + "amount":"100", + "idempotencyKey":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f" + } +} +``` + +### Withdraw Asset Liquidity + +You can withdraw asset liquidity via the `CreateAssetLiquidityWithdrawal` mutation: + +```sh +mutation +CreateAssetLiquidityWithdrawal( + $input:CreateAssetLiquidityWithdrawalInput! +) { + createAssetLiquidityWithdrawal(input:$input) { + code + success + message + error + } +} +``` + +The following are example `input` parameters for the `CreateAssetLiquidityWithdrawal` mutation query above. + +```sh +{"input": { + "id":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "assetId":"7b8b0f65-896d-4403-b7ba-2e24bf20eb35", + "amount":"100", + "idempotencyKey":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "timeoutSeconds":0} +} +``` + +## Peer Liquidity + +Peer liquidity is the line of credit denominated in the asset of the peering relationship in Rafiki that you extend to your respective peer. You must determine how much credit you will extend in your peering agreement, which depends on how much you trust the peer. If peer liquidity is insufficient, Rafiki cannot initiate payments to that peer. Once peer liquidity is used up, you should settle with your peer and reset their peer liquidity. + +:::note +You must decide whether to secure liquidity with your peers by extending credit or requiring them to pre-fund your accounts. Those agreements must be made before setting up peering relationships in Rafiki and are not managed through Interledger or Rafiki. +::: + +### Example + +A configured peer, _Cloud Nine Wallet,_ has a peer liquidity of 100 USD. Your Rafiki instance can send packets up to 100 USD to wallet addresses issued by _Cloud Nine Wallet_. Once that liquidity is used up, you should settle with _Cloud Nine Wallet_ and reset their liquidity to 100 USD. + +### Deposit Peer Liquidity + +You can add liquidity for a particular peer via the `DepositPeerLiquidity` mutation. + +```sh +mutation DepositPeerLiquidity($input:DepositPeerLiquidityInput!) { + depositPeerLiquidity(input:$input) { + code + success + message + error} +} +``` + +The following are example `input` parameters for the `DepositPeerLiquidity` mutation query above. + +```sh +{"input": {"id":"a09b730d-8610-4fda-98fa-ec7acb19c775", + "peerId":"73158598-2e0c-4973-895e-aebd115af260", + "amount":"1000000", + "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", + "timeoutSeconds":0} +} +``` + +### Withdraw Peer Liquidity + +In case you want to reduce your peer’s credit line, you can withdraw peer liquidity via the `CreatePeerLiquidityWithdrawal` mutation: + +```sh +mutation CreatePeerLiquidityWithdrawal( + $input:CreatePeerLiquidityWithdrawalInput! +) { + createPeerLiquidityWithdrawal(input:$input) { + code + success + message + error} +} +``` + +The following are example `input` parameters for the `CreatePeerLiquidityWithdrawal` mutation query above. + +```sh +{ +"input": {"id":"421fae87-9a59-4217-9ff8-faf55ffab9c6", +"peerId":"73158598-2e0c-4973-895e-aebd115af260", +"amount":"100", +"timeoutSeconds":0 +} +} +``` + +## Payment Liquidity + +When Open Payments incoming or outgoing payments are created, your Rafiki instance creates a liquidity account within the accounting database. Liquidity must be deposited into an outgoing payment before the payment can be processed. Rafiki will notify you to deposit liquidity via the `outgoing_payment.created` webhook event. Similarly, packets received for an incoming payment increase its liquidity account. Rafiki will notify you to withdraw that liquidity via the `incoming_payment.completed` webhook event. + +### Incoming payment + +You can withdraw incoming payment liquidity via the `CreateIncomingPaymentWithdrawal` mutation query: + +```sh +mutation CreateIncomingPaymentWithdrawal( + $input:CreateIncomingPaymentWithdrawalInput! +) { + createIncomingPaymentWithdrawal(input:$input) { + code + error + message + success + } +} +``` + +The following are example `input` parameters for the `CreateIncomingPaymentWithdrawal` mutation query above. + +```sh +{ "input": {"incomingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052, "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", +"timeoutSeconds":0 + } +} +``` + +### Outgoing payment + +You can deposit outgoing payment liquidity via the `DepositOutgoingPaymentLiqudity` mutation query: + +```sh +mutation DepositOutgoingPaymentLiquidity( + $input:DepositOutgoingPaymentLiquidityInput!) +{ + depositOutgoingPaymentLiquidity(input:$input) { + code + error + message + success + } +} +``` + +The following are example `input` parameters for the `DepositOutgoingPaymentLiquidity` mutation query above. + +```sh +{ + "input":{ + "outgoingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775" + } +} +``` + +You can withdraw outgoing payment liquidity via the `CreateOutgoingPaymentWithdrawal` mutation: + +```sh +mutation +CreateOutgoingPaymentWithdrawal +( + $input:CreateOutgoingPaymentWithdrawalInput!) { + createOutgoingPaymentWithdrawal +(input:$input) { + code + error + message + success +} +} +``` + +The following are example `input` parameters for the `CreateOutgoingPaymentWithdrawal` mutation query above. + +```sh +{"input": { + "outgoingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", + "timeoutSeconds":0 + } +} +``` + +## Two-phase withdrawals + +Rafiki supports two-phase withdrawals via the `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` mutations. When a withdrawal liquidity transaction is requested with a non-zero `timeout` value (zero denotes absence of a timeout), the transfer will be created as a two-phase transfer. If the timeout interval passes before the transfer is either posted or voided, the transfer expires and the full amount is returned to the original account. + +- `PostLiquidityWithdrawal`: Withdrawals with timeouts greater than 0 are processed as two-phase transfers and committed via this mutation. + +- `VoidLiquidityWithdrawal`: Withdrawals with timeouts greater than 0 are processed as two-phase transfers and are rolled back via this mutation. + +The following withdrawal transactions supports two-phase transfers: + +- Asset liquidity withdrawal +- Wallet address withdrawal +- Peer liquidity withdrawal +- Incoming payment withdrawal +- Outgoing payment withdrawal + +### Examples + +You can post a successful transfer via the `PostLiquidityWithdrawal` mutation query: + +```sh +mutation +PostLiquidityWithdrawal($input:PostLiquidityWithdrawalInput!) {postLiquidityWithdrawal +( +input:$input) { + code + error + message + success} +} +``` + +The following are example `input` parameters for the `PostLiquidityWithdrawal` mutation query above. + +```sh +{ + "input": { + "withdrawalId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775"} +} +``` + +You can void an unsuccessful transfer via the `VoidLiquidityWithdrawal` mutation query: + +```sh +mutation +VoidLiquidityWithdrawal($input:VoidLiquidityWithdrawalInput!) { + voidLiquidityWithdrawal +(input:$input) { + code + error + message + success} +} +``` + +The following are example `input` parameters for the `VoidLiquidityWithdrawal` mutation query above. + +```sh +{"input": { + "withdrawalId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", +"idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775" + } +} +``` diff --git a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx index 85dc1b9c0c..5ff51c68f1 100644 --- a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx +++ b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx @@ -2,6 +2,12 @@ title: Integrator checklist --- -## Placeholder +For ease of reference, here is a list of things to check before you operate Rafiki in production and participate as a node on the Interledger network. -Do you have any peers set up? +- [ ] Are you licensed as a financial entity (e.g. bank, fintech) in the jurisdiction that you are operating in? +- [ ] Have you set up of your [Rates endpoint](deploy-to-prod/endpoints/exchange-rates/)? +- [ ] Did you integrate your Rafiki instance with your [Identity Provider (IDP) service](deploy-to-prod/endpoints/idp/) and configure the user consent screen along with the interactoin flow? +- [ ] Have you selected a [strategy to create wallet addresses](deploy-to-prod/running-your-instance/creating-wallet-address) for your account holders? +- [ ] Did you determine which enpoints to expose and how (nginx / apache / K8s)? +- [ ] Are your admin services secured from external access? +- [ ] Did you add at least one [asset](deploy-to-prod/running-your-instance/adding-asset) either via the `backend` admin API or the Rafiki Admin application? diff --git a/packages/documentation/src/content/docs/playground/autopeering.mdx b/packages/documentation/src/content/docs/playground/autopeering.mdx index ef939de852..e360cca3fa 100644 --- a/packages/documentation/src/content/docs/playground/autopeering.mdx +++ b/packages/documentation/src/content/docs/playground/autopeering.mdx @@ -1,5 +1,56 @@ --- -title: Auto-Peering +title: Auto-Peering with the Test Network --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +You can start one local instance of Rafiki and peer it automatically with the remote Test Network by running the following commands: + +```sh +## using Tigerbeetle DB +pnpm localenv:compose:autopeer +## OR using Postgres DB` +pnpm localenv:compose:psql:autopeer +``` + +The mock account servicing entity, Cloud Nine Wallet, in your local Rafiki instance will automatically peer with the remote Test Network instance. The required services will be exposed externally using the localtunnel package. + +The exposed ports are: + +| Service | Port | +| ------------- | ---- | +| Open Payments | 3000 | +| ILP connector | 3002 | +| Auth server | 3006 | + +To use the Open Payments example in the Bruno API collection, follow these steps: + +1. Navigate to localhost:3030 to find the list of created wallet addresses. Alternatively, you can run the following command: + +```sh +docker logs rafiki-cloud-nine-mock-ase-1 +``` + +2. Copy the URL of one of the wallet addresses. + +3. Set the URL as the `senderWalletAddress` variable in the Bruno Autopeering environment. + +:::note +To visit the consent screen for the outgoing payment grant request, you must go through an additional login step by providing your IPv4 address as a tunnel password. You can look up your current IPv4 address by visiting + + + loca.lt/mytunnelpassword + or + whatismyip.com + +::: + +To shut down the connection and clear the environment, run the following command: + +```sh +pnpm localenv:compose down --volumes` + +## Running the command to shut down is necessary +## as any subsequent script run to spin up a local Rafiki instance +## will use different wallet addresses. +``` diff --git a/packages/documentation/src/content/docs/playground/overview.mdx b/packages/documentation/src/content/docs/playground/overview.mdx index 59f48e8757..0aa9884b61 100644 --- a/packages/documentation/src/content/docs/playground/overview.mdx +++ b/packages/documentation/src/content/docs/playground/overview.mdx @@ -49,27 +49,22 @@ To spin up the Local Playground install the following software on your machine: Run the following commands from the root of the project. - - -``` -// If you have spun up the environment before, first tear down and remove volumes! +```sh +## If you have spun up the environment before, first tear down and remove volumes! pnpm localenv:compose down --volumes -// Otherwise start the local environment -// start the local environment +## Otherwise start the local environment +## start the local environment pnpm localenv:compose up ``` - - If you want to use Postgres as the accounting database instead of TigerBeetle, you must use the `psql` variant of the `localenv:compose` commands as follows: - - -``` -// If you have spun up the environment before, first tear down and remove volumes! Otherwise start the local environment +```sh +## If you have spun up the environment before, first tear down and remove volumes! +## Otherwise start the local environment pnpm localenv:compose:psql down --volumes @@ -77,8 +72,6 @@ pnpm localenv:compose:psql down --volumes pnpm localenv:compose:psql up ``` - - The local environment consists of a primary and secondary Rafiki instance, each with its docker-compose file (Cloud Nine Wallet, Happy Life Bank). The primary Cloud Nine Wallet docker-compose file (`./cloud-nine-wallet/docker-compose.yml`) includes the primary Rafiki `backend` and `auth` services, as well as the required data stores, which include TigerBeetle (if enabled), Redis, and Postgres. The primary instance contains all of the necessary components so that it can run independently. The secondary Happy Life Bank docker-compose file (`./happy-life-bank/docker-compose.yml`) includes only the Rafiki services, not the data stores. It uses the data stores created by the primary Rafiki instance, so it can’t be run independently. The `pnpm localenv:compose up` command starts both the primary and secondary instances. @@ -155,12 +148,9 @@ Debuggers for the services are exposed on the following ports: #### Debugging with a Chromium browser: 1. Go to chrome://inspect - 2. Click **Configure** and add the IP addresses and ports detailed above - 3. Start the docker containers - -4. Click**\* \*\*\***Inspect**\*** \*\*\*on the service you want to debug to open the Chromium debugger. +4. Click **Inspect** on the service you want to debug to open the Chromium debugger. You can either trigger the debugger by adding `debugger` statements in the code and restarting the Docker containers or by adding breakpoints directly to the Chromium debugger after starting the Docker containers. @@ -168,14 +158,25 @@ You can either trigger the debugger by adding `debugger` statements in the code To debug with VS Code, add this configuration to your `.vscode/launch.json`: -The` localRoot` variable will depend on the location of the `launch.json` file relative to Rafiki’s root directory. +The `localRoot` variable will depend on the location of the `launch.json` file relative to Rafiki’s root directory. -For more ways to connect debuggers, refer to the Node JS docs for debugging: [https://nodejs.org/en/learn/getting-started/debugging](https://nodejs.org/en/learn/getting-started/debugging) +For more ways to connect debuggers, refer to the Node JS docs for debugging. ### Shutting down To shut down your local instance, run the following commands: +```sh +# tear down +pnpm localenv:compose down + +# tear down and delete database volumes +pnpm localenv:compose down --volumes + +# tear down, delete database volumes and remove images +pnpm localenv:compose down --volumes --rmi all +``` + ### Commands The following are the most commonly used commands: @@ -195,6 +196,98 @@ The following are the most commonly used commands: | pnpm localenv:compose:psql down --volumes | Down (with PostgreSQL) and kill volumes | | pnpm localenv:compose:psql build | Build all the containers (with PostgreSQL) | +### Interacting with the Local Playground + +#### Bruno & Open Payments APIs + +The Open Payments APIs can be interacted with using the [Bruno collection](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki) ([resource server endpoints](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Open%20Payments%20APIs) and [auth server endpoints](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Open%20Payments%20Auth%20APIs)). +To interact with the Open Payments APIs using Bruno, you must: + +1. load the collection into Bruno by clicking "Open Collection" +2. navigating to `/rafiki/bruno/collections/Rafiki` on your machine and clicking "Open" +3. Furthermore, you need to either load the [Local Environment](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/environments/Local%20Playground.bru) or the [Remote Test Network Environment](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/environments/Remote.bru). + +The Examples folder in the Bruno collection includes an [Open Payments](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Examples/Open%20Payments) example that can be executed in the following sequence: + +1. Requests the sender's wallet address +2. Requests the receiver's wallet address +3. Requests a grant to create an incoming payment on the receiver's account +4. Creates an incoming payment on receiver's account +5. Requests a grant to create and read a quote on the sender's account +6. Creates a quote on the sender's account +7. Requests a grant to create and read an outgoing payment on the sender's account + +:::note + +You have to go through an interaction flow by clicking on the `redirect` link in the grant request response. More information about the interaction flow can be found here. +::: + +8. Continues the grant request +9. Creates an outgoing payment on the sender's account +10. Fetches the outgoing payment on the sender's account + +#### Admin UI + +To manage and view information about the Rafiki instance(s) using the [Rafiki Admin application](/resources/admin-user-guide/), you can navigate to `localhost:3010` (Cloud Nine Wallet) or `localhost:4010` (Happy Life Bank). The Rafiki Admin application runs a Remix app for querying info and executing mutations against the Rafiki Backend [Admin ](https://rafiki.dev/playground/overview/#admin-apis)[API](https://rafiki.dev/playground/overview/#admin-apis). + +Access to the Rafiki Admin application is managed using Ory Kratos, a secure and fully open-source identity and user management solution. Check it out on GitHub. Since access to the UI is invitation-only, the registration flow is not publicly available. To access the Admin UI, click the registration link provided in the logs during the local environment startup or manually add a new user with the `invite-user` script. + +Run the following Docker command in a terminal window, and it will output a recovery link. + +```sh +docker exec -it npm run invite-user -- example@mail.com` +``` + +The recovery link doubles as the invitation method. Copy and paste this link into your browser, and you will automatically be logged in and directed to the account settings page, where you can change the password for the account. + +:::note +A separate registration is required for Cloud Nine Wallet's Rafiki Admin and Happy Life Bank's Rafiki Admin, since they are each designed to run as separate mock account servicing entities. Once you've registered, you can always come back to your Rafiki Admin account by navigating to [`localhost:3010`](http://localhost:3010) (Cloud Nine Wallet) or [`localhost:4010`](http://localhost:4010) (Happy Life Bank) and logging in. + +::: + +##### Password recovery + +Follow these steps to reset an account’s password. + +1. Click the forgot password link and enter an email for a registered user. +2. Open [Mail Slurper](http://localhost:4436/) to access the recovery link for the account. + +##### Remove users + +Remove users by running the following script in a terminal window: + +```sh +docker exec -it npm run delete-user -- example@mail.com. +``` + +#### Admin APIs + +In addition to using the Admin UI to interact with the Admin APIs, you can also use the Apollo Explorer on [localhost:3001/graphql](http://localhost:3001/graphql) and [localhost:4001/graphql](http://localhost:4001/graphql) for Cloud Nine Wallet and Happy Life Bank, respectively, and via the [Bruno collection](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Rafiki%20Admin%20APIs). The Bruno collection is configured to use the local environment's default endpoints. + +#### SPSP + +Every wallet address also serves as an SPSP endpoint. A `GET` request with an `Accept` header `application/spsp4+json` will return an SPSP response with STREAM connection details. The following example uses [http://localhost:3000/accounts/gfranklin](http://localhost:3000/accounts/gfranklin) as the SPSP endpoint. + +```sh +http GET http://localhost:3000/accounts/gfranklin Host:backend Accept:application/spsp4+json + + +HTTP/1.1 200 OK +Connection:keep-alive +Content-Length:220 +Content-Type:application/spsp4+json +Date:Thu, 23 Feb 2023 13:07:24 GMT +Keep-Alive:timeout=5 + + +{ +"destination_account":" +test.rafiki.viXmy1OVHgvmQakNjX1C6kQMri92DzHeISEv-5VzTDuFhrpsrkDzsq5OO9Lfa9yed0L2RJGC9hA_IX-zztTtTZ87shCYvsQ", +"receipts_enabled":false, +"shared_secret":"Rz_vudcg13EPs8ehL2drvZFJS1LJ4Y3EltOI60-lQ78" +} +``` + ### Known issues #### No data in the mock account servicing entities @@ -203,4 +296,4 @@ It is possible that upon starting or restarting the local playground, you may ru #### TigerBeetle container exists with code 137 -There is a known issue when running TigerBeetle in Docker. The container exits without logs and simply shows error code 137. To fix this, increase the Docker memory limit. If you run the local Docker playground on a Windows machine via the Windows Subsystem for Linux (WSL), you can increase the memory limit by configuring your `.wslconfig` file. +There is a known issue when running TigerBeetle in Docker. The container exits without logs and simply shows error code 137. To fix this, increase the Docker memory limit. If you run the local Docker playground on a Windows machine via the Windows Subsystem for Linux (WSL), you can increase the memory limit by configuring your `.wslconfig` file. diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx index d8c932850c..183b1d1527 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx @@ -2,4 +2,15 @@ title: Token introspection --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +Rafiki’s `auth` service is a reference implementation of an Open Payments authorization server. One responsibility of the authorization server is to issue access tokens, which describe access rights, to clients (e.g., third-party applications). + +When a client makes a request to a resource server, the resource server communicates with the authorization server to: + +- Check the validity of the client’s access token +- Determine whether the client is authorized to access protected resources + +This process is called token introspection. + +The `token-introspection` package is a client library for making GNAP token introspection requests to the authorization server. It describes how the Rafiki `backend` and `auth` services communicate to validate access tokens. If you’re using Rafiki’s `auth` service, there’s nothing you need to do with this package. Rafiki automatically runs the package internally. If you’re writing your own auth service, you may find the files within the package to be helpful. From c393b66e81fbcbc0a724afca93d79bb76dc55cb5 Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Fri, 23 Aug 2024 14:19:13 +0200 Subject: [PATCH 23/91] docs: mi-docs-update --- .../src/content/docs/playground/overview.mdx | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/documentation/src/content/docs/playground/overview.mdx b/packages/documentation/src/content/docs/playground/overview.mdx index 0aa9884b61..7f9baaf35b 100644 --- a/packages/documentation/src/content/docs/playground/overview.mdx +++ b/packages/documentation/src/content/docs/playground/overview.mdx @@ -38,12 +38,9 @@ The Mock ASE provided in this repository is intended solely for internal use and To spin up the Local Playground install the following software on your machine: -- - Rafiki local environment setup - {' '} -- Docker -- Bruno, an - open-source API client alternative to Postman +- A Rafiki local environment setup +- The Docker platform. +- An open-source API client Bruno ### Setup From 2591fd94f70af4cb0e5a483b409e77e096a3edb6 Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Fri, 23 Aug 2024 14:25:52 +0200 Subject: [PATCH 24/91] docs: mi-docs-update --- .../src/content/docs/playground/autopeering.mdx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/documentation/src/content/docs/playground/autopeering.mdx b/packages/documentation/src/content/docs/playground/autopeering.mdx index e360cca3fa..5b0d656f1d 100644 --- a/packages/documentation/src/content/docs/playground/autopeering.mdx +++ b/packages/documentation/src/content/docs/playground/autopeering.mdx @@ -36,13 +36,8 @@ docker logs rafiki-cloud-nine-mock-ase-1 3. Set the URL as the `senderWalletAddress` variable in the Bruno Autopeering environment. :::note -To visit the consent screen for the outgoing payment grant request, you must go through an additional login step by providing your IPv4 address as a tunnel password. You can look up your current IPv4 address by visiting - - - loca.lt/mytunnelpassword - or - whatismyip.com - +To visit the consent screen for the outgoing payment grant request, you must go through an additional login step by providing your IPv4 address as a tunnel password. You can look up your current IPv4 address by visiting +loca.lt/mytunnelpassword or whatismyip.com ::: To shut down the connection and clear the environment, run the following command: From 5b2a27c4766c0218d5315c54f41b3d2adce79587 Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Fri, 23 Aug 2024 14:40:50 +0200 Subject: [PATCH 25/91] docs: mi/docs-update --- .../integration/deploy-to-prod/endpoints/webhook-events.mdx | 2 +- .../deploy-to-prod/running-your-instance/managing-liquidity.mdx | 2 +- .../src/content/docs/integration/integrator-checklist.mdx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx index b2c13c49ac..8a7d7ec587 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx @@ -35,7 +35,7 @@ The following is an enumeration of all the event types along with their descript | [`peer.liquidity_low`](#peerliquidity_low) | Peer liquidity has dropped below defined threshold. | An OpenAPI specification of the webhook requests and their corresponding data can be found here. -Additionally, the [local playground](/playground/overview#usage) contains example payloads in the Bruno collection that can be used to test a webhook service integration. +Additionally, the local playground playground contains example payloads in the Bruno collection that can be used to test a webhook service integration. ## Events diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx index f8ae369486..31539a711a 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx @@ -13,7 +13,7 @@ Liquidity can be managed in Rafiki through the [`backend`](/services-and-aux-pac As Rafiki supports several types of liquidity, we’ll cover the typical scenarios you’ll need to manage. :::note -You must provide the `idempotencyKey` when calling mutations related to liquidity. This key allows the safe retrying of requests without multiple operations. It should be a unique key, typically a V4 UUID. For more information, refer to Rafiki’s [idempotency](/apis/idempotency/). +You must provide the `idempotencyKey` when calling mutations related to liquidity. This key allows the safe retrying of requests without multiple operations. It should be a unique key, typically a V4 UUID. For more information, refer to Rafiki’s idempotency. ::: ## Asset Liquidity diff --git a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx index 5ff51c68f1..230b58e9da 100644 --- a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx +++ b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx @@ -5,7 +5,7 @@ title: Integrator checklist For ease of reference, here is a list of things to check before you operate Rafiki in production and participate as a node on the Interledger network. - [ ] Are you licensed as a financial entity (e.g. bank, fintech) in the jurisdiction that you are operating in? -- [ ] Have you set up of your [Rates endpoint](deploy-to-prod/endpoints/exchange-rates/)? +- [ ] Have you set up of your Rates endpoint? - [ ] Did you integrate your Rafiki instance with your [Identity Provider (IDP) service](deploy-to-prod/endpoints/idp/) and configure the user consent screen along with the interactoin flow? - [ ] Have you selected a [strategy to create wallet addresses](deploy-to-prod/running-your-instance/creating-wallet-address) for your account holders? - [ ] Did you determine which enpoints to expose and how (nginx / apache / K8s)? From 4732a380e07deb3cce3a1b2c744fcd9809eceea0 Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Fri, 23 Aug 2024 14:46:01 +0200 Subject: [PATCH 26/91] docs: mi/docs-update --- .../src/content/docs/integration/integrator-checklist.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx index 230b58e9da..6ed56ffeef 100644 --- a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx +++ b/packages/documentation/src/content/docs/integration/integrator-checklist.mdx @@ -6,8 +6,8 @@ For ease of reference, here is a list of things to check before you operate Rafi - [ ] Are you licensed as a financial entity (e.g. bank, fintech) in the jurisdiction that you are operating in? - [ ] Have you set up of your Rates endpoint? -- [ ] Did you integrate your Rafiki instance with your [Identity Provider (IDP) service](deploy-to-prod/endpoints/idp/) and configure the user consent screen along with the interactoin flow? -- [ ] Have you selected a [strategy to create wallet addresses](deploy-to-prod/running-your-instance/creating-wallet-address) for your account holders? +- [ ] Did you integrate your Rafiki instance with your Identity Provider (IDP) service and configure the user consent screen along with the interactoin flow? +- [ ] Have you selected a strategy to create wallet addresses for your account holders? - [ ] Did you determine which enpoints to expose and how (nginx / apache / K8s)? - [ ] Are your admin services secured from external access? -- [ ] Did you add at least one [asset](deploy-to-prod/running-your-instance/adding-asset) either via the `backend` admin API or the Rafiki Admin application? +- [ ] Did you add at least one asset deploy-to-prod/running-your-instance/adding-asset either via the `backend` admin API or the Rafiki Admin application? From db1426ed37d1450d7fb88b2706bdef01907cbe16 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Fri, 23 Aug 2024 09:35:45 -0400 Subject: [PATCH 27/91] docs: telemetry update, added a few links --- .../docs/apis/graphql/admin-api-overview.mdx | 2 +- .../accounts-transfers-liquidity.mdx | 2 +- .../content/docs/components/architecture.mdx | 2 +- .../src/content/docs/components/telemetry.mdx | 33 ++++++++++--------- .../backend-service.mdx | 7 ---- .../frontend-service.mdx | 9 +---- 6 files changed, 22 insertions(+), 33 deletions(-) diff --git a/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx b/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx index 29bab813ec..ec84416ee4 100644 --- a/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx +++ b/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx @@ -10,7 +10,7 @@ Rafiki provides two GraphQL APIs, described below. As described on Rafiki Admin Application User Guide for more information. +This API is complemented by the Rafiki Admin application, a frontend interface for Rafiki management that directly interacts with the Backend Admin API. Check out the [Rafiki Admin Application User Guide](/resources/admin-user-guide) for more information. ## Auth Admin API diff --git a/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx b/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx index 3dff2a4c98..c741a0a471 100644 --- a/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx +++ b/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx @@ -1,5 +1,5 @@ --- -title: Accounts, transfers, and Liquidity +title: Accounts, transfers, and liquidity --- import { LinkOut } from '@interledger/docs-design-system' diff --git a/packages/documentation/src/content/docs/components/architecture.mdx b/packages/documentation/src/content/docs/components/architecture.mdx index 45056ae338..d39d0894e8 100644 --- a/packages/documentation/src/content/docs/components/architecture.mdx +++ b/packages/documentation/src/content/docs/components/architecture.mdx @@ -12,7 +12,7 @@ Rafiki is a collection of three services that run together. Each one can be scal - [backend](/services-and-aux-packages/backend-service) - The main service, responsible for handling business logic and external communication - [auth](/services-and-aux-packages/auth-service) - A reference implementation of an Open Payments authorization server, used for grant authorization and authentication -- [frontend](/services-and-aux-packages/frontend-service) - An optional internal admin UI for you to manage your Rafiki instance +- [frontend](/services-and-aux-packages/frontend-service) - An optional internal user interface, called the [Rafiki Admin](/resources/admin-user-guide), for you to manage your Rafiki instance These services rely on four databases. diff --git a/packages/documentation/src/content/docs/components/telemetry.mdx b/packages/documentation/src/content/docs/components/telemetry.mdx index 2f6e54a71a..4a0e37031c 100644 --- a/packages/documentation/src/content/docs/components/telemetry.mdx +++ b/packages/documentation/src/content/docs/components/telemetry.mdx @@ -4,18 +4,18 @@ title: Telemetry import { LinkOut } from '@interledger/docs-design-system' -## Overview - The objective of the telemetry feature is to gather metrics and establish an infrastructure for visualizing valuable network insights. Some of the metrics that we at the Interledger Foundation collect include: - The total amount of money transferred via packet data within a specified time frame (daily, weekly, monthly) -- The number of transactions from outgoing payments that have been at least partially successful +- The number of transactions that have been at least partially successful +- The number of ILP packets flowing through the network - The average amount of money held within the network per transaction +- The average time it takes for an outgoing payment to complete Our goals are to: -- Track the growth of the network in terms of transaction sizes -- Track the number of transactions processed +- Track the growth of the network in terms of transaction sizes and the number of transactions processed +- Use the data for our own insights - Enable you to gain your own insights ### Privacy and optionality @@ -47,7 +47,7 @@ The OTEL SDK is integrated into Rafiki to create, collect, and export metrics. T The Interledger Foundation uses Amazon Managed Service for Prometheus (AMP) to collect data from the telemetry cluster. :::note -AMP offers limited configuration options and cannot crawl data outside of AWS. This limitation led us to adopt a push model, using prometheusRemoteWrite, instead of a pull model. For future development, we may consider hosting our own Prometheus. +AMP offers limited configuration options and cannot crawl data outside of AWS. This limitation led us to adopt a push model, using `prometheusRemoteWrite`, instead of a pull model. For future development, we may consider hosting our own Prometheus. ::: ### Grafana - Grafana Cloud @@ -55,7 +55,7 @@ AMP offers limited configuration options and cannot crawl data outside of AWS. T Grafana Cloud is used for data visualization dashboards and offers multiple tools that extend Prometheus Promql. :::note -The Interledger Foundation initially used Amazon-hosted Grafana which did not meet our needs for embedding dashboards. Grafana Cloud offers a feature called public dashboards which allows us to share dashboards. However, embedding may still pose a challenge. +The Interledger Foundation initially used Amazon-hosted Grafana which did not meet our needs for embedding dashboards. Grafana Cloud offers a feature called _public dashboards_ which allows us to share dashboards. However, embedding may still pose a challenge. ::: ### Exchange rates @@ -70,14 +70,17 @@ If an ASE does not provide the necessary exchange rate for a transaction, the te ### Instrumentation -Rafiki has the following counter metrics. All data points (counter increases) are exported to collection endpoints at a configurable interval. The default interval is 15 seconds. - -| Metric | Type | Description | Behavior | -| ------------------------- | --------- | ------------------------------- | ------------------------------------------------------------------------------ | -| `transactions_total` | Counter | Count of funded transactions | Increases by 1 for each successfully sent transaction | -| `transactions_amount` | Amount | Amount sent through network | Increases by the amount sent in each ILP packet | -| `transaction_fee_amounts` | Counter | Fee amount sent through network | Increases by the amount sent minus the amount received for an outgoing payment | -| `ilp_pay_time_ms` | Histogram | Time to complete an ILP payment | Records the time taken to make an ILP payment | +Rafiki has the following metrics. All data points (counter increases) are exported to collection endpoints at a configurable interval. The default interval is 15 seconds. + +| Metric | Type | Description | Behavior | +| ------------------------- | --------- | ------------------------------------------ | ------------------------------------------------------------------------------ | +| `transactions_total` | Counter | Count of funded outgoing transactions | Increases by 1 for each successfully funded outgoing payment resource | +| `packet_count_prepare` | Counter | Count of ILP prepare packets that are sent | Increases by 1 for each prepare packet that's sent | +| `packet_count_fulfill` | Counter | Count of ILP fulfill packets | Increases by 1 for each fulfill packet that's received | +| `packet_count_reject` | Counter | Count of ILP reject packets | Increases by 1 for each reject packet that's received | +| `packet_amount_fulfill` | Counter | Amount sent through the network | Increases by the amount sent in each ILP packet | +| `transaction_fee_amounts` | Counter | Fee amount sent through network | Increases by the amount sent minus the amount received for an outgoing payment | +| `ilp_pay_time_ms` | Histogram | Time to complete an ILP payment | Records the time taken to make an ILP payment | The current implementation only collects metrics on the SENDING side of a transaction. Metrics for external Open Payments transactions RECEIVED by a Rafiki instance in the network are not collected. diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx index 14bc4abfe1..edb8e00462 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx @@ -4,13 +4,6 @@ title: Backend service import { LinkOut } from '@interledger/docs-design-system' -

- - link to /integration/deploy-to-prod/environment-variables BACKEND when - available - -

- Rafiki’s `backend` service is the software’s main service for handling business logic and external communication. The service is responsible for: - Exposing the endpoints of the [Open Payments APIs](#open-payments) for public clients to perform account management tasks. This is the external communication piece. diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx index c2a794bab6..49c0d9a7f5 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx @@ -4,14 +4,7 @@ title: Frontend service import { LinkOut } from '@interledger/docs-design-system' -

- - link to /integration/deploy-to-prod/environment-variables FRONTEND when - available; link to Admin UI guide - -

- -Rafiki’s `frontend` service provides an optional internal admin interface for you to manage your Rafiki instance through a Remix web application. This service communicates with the [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to facilitate administrative tasks within Rafiki. +Rafiki’s `frontend` service provides an optional internal admin interface, called the [Rafiki Admin application](/resources/admin-user-guide), for you to manage your Rafiki instance through a Remix web app. This service communicates with the [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to facilitate administrative tasks within Rafiki. ## Requirements From e726ae9b2e53b8e91e31aba29986242fe2116f0f Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Fri, 23 Aug 2024 18:25:27 +0200 Subject: [PATCH 28/91] docs: mi/docs-update-second-batch --- .../deploy-to-cloud/helm-k8s.mdx | 48 ++- .../deploy-to-prod/deploy-to-cloud/nginx.mdx | 344 +++++++++++++++++- .../deploy-to-prod/environment-variables.mdx | 107 +++++- .../src/content/docs/playground/testnet.mdx | 17 +- 4 files changed, 512 insertions(+), 4 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/helm-k8s.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/helm-k8s.mdx index 5f6f13791d..8738fc1d21 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/helm-k8s.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/helm-k8s.mdx @@ -2,4 +2,50 @@ title: Helm & K8s --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +### Running Rafiki in production + +To run Rafiki in your production environment you will need to have the following software and tools installed: + +#### Dependencies: + +- Kubernetes +- + kubectl + +- helm + +Rafiki requires an instance of Postgres and Redis instance running with it. + +An example Helm Chart including Rafiki, Postgres, and Redis can be found here. + +Run the following command to install the example Helm Chart above: + +```sh +helm install rafiki PATH_TO_RAFIKI_REPO/infrastructure/helm/rafiki +``` + +#### Tigerbeetle + +For Rafiki's accounting database, you may opt to run Tigerbeetle in place of Postres. Though you must run one Postgres instance that's used for the `auth` services and Open Payments resources. + +To change the version of Tigerbeetle you must change the respective tag in the values.yaml file for Tigerbeetle. + +#### Port Forwarding + +In the current alpha version of Rafiki, no ports are exposed by default. You can port-forward the frontend (Admin UI) port by running the following: + +```sh +// get list of pod names +kubectl get pods + +// port forward +kubectl port-forward rafiki-rafiki-frontend-YOUR-SEQUENCE 3010:3010 +``` + +Now, the Admin UI can be found on localhost:3010. + +:::caution +You must update the environment variable values in the values.yaml file before you deploy to a production environment +::: diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/nginx.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/nginx.mdx index 3a0b7b934b..859566c662 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/nginx.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/nginx.mdx @@ -2,4 +2,346 @@ title: nginx --- -## Placeholder +This is an example deployment of Rafiki on a Linux virtual machine using nginx as a reverse proxy. You must change the values in the examples appropriate for your environment. + +## Virtual Machine preparation + +Deploy the virutal machine: + +```sh +sudo apt update && sudo apt install nginx certbot python3-certbot-nginx +``` + +## Domain preparation + +Generate the Let’s encrypt certificates: + +```sh +certbot certonly --manual --preferred-challenges=dns --email EMAIL --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d DOMAIN +``` + +​ +:::note +Domain can be in wildcard format. You will also need to update TXT record in this step +::: + +As Let's encrypt certificates are valid for 90 days, you must set up a cron process to renew the certificate on a regular schedule: + +```sh +crontab -e +​ +0 3 * * * crontab renew +``` + +## Update DNS records + +Next update the DNS records to point to the static external IP address of the volumes: + +| service | URL | example | +| --------- | ---------------- | ---------------------- | +| auth | auth.DOMAIN | auth.myrafiki.com | +| connector | connector.DOMAIN | connector.myrafiki.com | +| admin | admin.DOMAIN | admin.myrafiki.com | +| ilp | ilp.DOMAIN | ilp.myrafiki.com | +| autopeer | autopeer.DOMAIN | autopeer.myrafiki.com | + +## Server preparation + +Create nginx configuration files for every exposed domain: + +### Happy Life Bank + +#### Auth + +```sh +server { + server_name auth.myrafiki.com; + + listen 443 ssl; + + ssl_certificate /etc/letsencrypt/live/auth.myrafiki.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/auth.myrafiki.com/privkey.pem; + + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + location / { + proxy_http_version 1.1; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade ""; + proxy_set_header Connection ""; + proxy_set_header Host $server_name; + proxy_set_header Accept-Encoding ""; + proxy_cache_bypass $http_upgrade; + + proxy_pass_request_headers on; + + proxy_pass http://localhost:3002; + } +} + +server { + server_name auth.myrafiki.com; + + listen 80; + + if ($host = auth.myrafiki.com) { + return 301 https://$host$request_uri; + } + + return 404; +} +``` + +#### Admin + +```sh + + server_name admin.myrafiki.com; + + listen 443 ssl; + + ssl_certificate /etc/letsencrypt/live/admin.myrafiki.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/admin.myrafiki.com/privkey.pem; + + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + location / { + proxy_http_version 1.1; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade ""; + proxy_set_header Connection ""; + proxy_set_header Host $server_name; + proxy_set_header Accept-Encoding ""; + proxy_cache_bypass $http_upgrade; + + proxy_pass_request_headers on; + + proxy_pass http://localhost:4010; + } +} + +server { + server_name admin.myrafiki.com; + + listen 80; + + if ($host = admin.myrafiki.com) { + return 301 https://$host$request_uri; + } + + return 404; +} +``` + +#### ILP + +```sh +server { + server_name ilp.myrafiki.com; + + listen 443 ssl; + + ssl_certificate /etc/letsencrypt/live/ilp.myrafiki.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/ilp.myrafiki.com/privkey.pem; + + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + location / { + proxy_http_version 1.1; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade ""; + proxy_set_header Connection ""; + proxy_set_header Host $server_name; + proxy_set_header Accept-Encoding ""; + proxy_cache_bypass $http_upgrade; + + proxy_pass_request_headers on; + + proxy_pass http://localhost:4000; + } +} + +server { + server_name ilp.myrafiki.com; + + listen 80; + + if ($host = ilp.myrafiki.com) { + return 301 https://$host$request_uri; + } + + return 404; +} +``` + +### Cloud Nine Wallet + +#### Auth + +```sh +server { + server_name auth.myrafiki.com; + + listen 443 ssl; + + ssl_certificate /etc/letsencrypt/live/auth.myrafiki.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/auth.myrafiki.com/privkey.pem; + + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + location / { + proxy_http_version 1.1; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade ""; + proxy_set_header Connection ""; + proxy_set_header Host $server_name; + proxy_set_header Accept-Encoding ""; + proxy_cache_bypass $http_upgrade; + + proxy_pass_request_headers on; + + proxy_pass http://localhost:3002; + } +} + +server { + server_name auth.myrafiki.com; + + listen 80; + + if ($host = auth.myrafiki.com) { + return 301 https://$host$request_uri; + } + + return 404; +} +``` + +#### Admin + +```sh + + server_name admin.myrafiki.com; + + listen 443 ssl; + + ssl_certificate /etc/letsencrypt/live/admin.myrafiki.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/admin.myrafiki.com/privkey.pem; + + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + location / { + proxy_http_version 1.1; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade ""; + proxy_set_header Connection ""; + proxy_set_header Host $server_name; + proxy_set_header Accept-Encoding ""; + proxy_cache_bypass $http_upgrade; + + proxy_pass_request_headers on; + + proxy_pass http://localhost:4010; + } +} + +server { + server_name admin.myrafiki.com; + + listen 80; + + if ($host = admin.myrafiki.com) { + return 301 https://$host$request_uri; + } + + return 404; +} +``` + +#### ILP + +```sh +server { + server_name ilp.myrafiki.com; + + listen 443 ssl; + + ssl_certificate /etc/letsencrypt/live/ilp.myrafiki.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/ilp.myrafiki.com/privkey.pem; + + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + location / { + proxy_http_version 1.1; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade ""; + proxy_set_header Connection ""; + proxy_set_header Host $server_name; + proxy_set_header Accept-Encoding ""; + proxy_cache_bypass $http_upgrade; + + proxy_pass_request_headers on; + + proxy_pass http://localhost:4000; + } +} + +server { + server_name ilp.myrafiki.com; + + listen 80; + + if ($host = ilp.myrafiki.com) { + return 301 https://$host$request_uri; + } + + return 404; +} +``` + +#### Connector + +```sh +server { + server_name connector.myrafiki.com; + + listen 443 ssl; + ssl_certificate /etc/letsencrypt/live/connector.myrafiki.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/connector.myrafiki.com/privkey.pem; # managed by Certbot + + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + location / { + proxy_http_version 1.1; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade ""; + proxy_set_header Connection ""; + proxy_set_header Host $server_name; + proxy_set_header Accept-Encoding ""; + proxy_cache_bypass $http_upgrade; + + proxy_pass_request_headers on; + + proxy_pass http://localhost:3002; + } +} + +server { + server_name connector.myrafiki.com; + + listen 80; + + if ($host = connector.myrafiki.com) { + return 301 https://$host$request_uri; + } + + return 404; +} +``` diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx index 4acafe75e1..bc0d486fbf 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx @@ -2,4 +2,109 @@ title: Environment variables --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +To run Rafiki you must set the environment variables for the `backend`, `auth` and `frontend` services listed below. + +:::caution +If you are running Rafiki via Docker, then you must update the variables in the docker-compose files of the respective services. + +If you are running Rafiki via Helm and Kubernetes, then you must update the variables in the values.yaml file of the example Helm chart. + +::: + +## Backend + +| Variable | Helm Value Name | Default | Description | +| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ADMIN_PORT` | backend.port.admin | `3001` | Admin API GraphQL Server port | +| `AUTH_SERVER_GRANT_URL` | | `undefined` | endpoint on the Open Payments Auth Server to request a grant | +| `AUTH_SERVER_INTROSPECTION_URL` | | `undefined` | endpoint on the Open Payments Auth Server to introspect an access token | +| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/concepts/interledger-protocol/peering#auto-peering) is enabled, its server will use this port | +| `CONNECTOR_PORT` | backend.port.connector | `3002` | port of the ILP connector for for sending packets over ILP over HTTP | +| `DATABASE_URL` | backend.postgresql.host, backend.postgresql.port, backend.postgresql.username, backend.postgresql.database, backend.postgresql.password | `postgresql://postgres:password@localhost:5432/development` | Postgres database URL of database storing the resource data; For Helm, these components are provided individually. | +| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/concepts/interledger-protocol/peering#auto-peering). | +| `ENABLE_SPSP_PAYMENT_POINTERS` | | `true` | enables [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) route | +| `EXCHANGE_RATES_LIFETIME` | backend.lifetime.exchangeRate | `15_000` | time in milliseconds the exchange rates provided by the ASE via the EXCHANGE_RATES_URL are valid for | +| `EXCHANGE_RATES_URL` | backend.serviceUrls.EXCHANGE_RATES_URL | `undefined` | endpoint on the Account Servicing Entity to request exchange rates | +| `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` | backend.idempotencyTTL | `86400000` | TTL in milliseconds for idempotencyKey on GraphQL mutations (Admin API). Default: 24hrs | +| `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` | | `2000` | TTL in milliseconds for idempotencyKey concurrency lock on GraphQL mutations (Admin API) | +| `ILP_ADDRESS` | backend.ilp.address | `undefined` | ILP address of this Rafiki instance | +| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/concepts/interledger-protocol/peering#auto-peering) | +| `INCOMING_PAYMENT_EXPIRY_MAX_MS` | | `2592000000` | Maximum milliseconds into the future incoming payments expiry can be set to on creation. Default: 30 days | +| `INCOMING_PAYMENT_WORKERS` | backend.workers.incomingPayment | `1` | number of workers processing incoming payment requests | +| `INCOMING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that INCOMING_PAYMENT_WORKERS will wait until they check an empty incoming payment request queue again | +| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/concepts/interledger-protocol/peering#auto-peering) | +| `KEY_ID` | backend.key.id | `undefined` | this Rafiki instance's client key id | +| `LOG_LEVEL` | backend.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | +| `NODE_ENV` | backend.nodeEnv | `development` | node environment, `development`, `test`, or `production` | +| `OPEN_PAYMENTS_PORT` | backend.port.openPayments | `3003` | port of the Open Payments resource server port | +| `OPEN_PAYMENTS_URL` | backend.serviceUrls.OPEN_PAYMENTS_URL | `undefined` | public endpoint of this Open Payments Resource Server | +| `OUTGOING_PAYMENT_WORKERS` | backend.workers.outgoingPayment | `4` | number of workers processing outgoing payment requests | +| `OUTGOING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that OUTGOING_PAYMENT_WORKERS will wait until they check an empty outgoing payment request queue again | +| `PRIVATE_KEY_FILE` | backend.key.file | `undefined` | the path to this Rafiki instance's client private key | +| `QUOTE_LIFESPAN` | backend.lifetime.quote | `5 * 60_000` | time in milliseconds an Open Payments quote is valid for | +| `REDIS_TLS_CA_FILE_PATH` | backend.redis.tlsCaFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_TLS_CERT_FILE_PATH` | backend.redis.tlsCertFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_TLS_KEY_FILE_PATH` | backend.redis.tlsKeyFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_URL` | backend.redis.host, backend.redis.port | `redis://127.0.0.1:6379` | Redis URL of database handling ILP packet data URL; For Helm, these components are provided individually. | +| `SIGNATURE_SECRET` | backend.quoteSignatureSecret | `undefined` | secret to generate request header signatures for webhook event requests | +| `SIGNATURE_VERSION` | | `1` | version number to generate request header signatures for webhook event requests | +| `SLIPPAGE` | backend.ilp.slippage | `0.01` | accepted ILP rate fluctuation, default 1% | +| `STREAM_SECRET` | backend.ilp.streamSecret | undefined | seed secret to generate shared STREAM secrets | +| `TIGERBEETLE_CLUSTER_ID` | | `0` | Tigerbeetle cluster ID picked by the system that starts the TigerBeetle cluster to create a [Tigerbeetle client](https://docs.tigerbeetle.com/clients/node#creating-a-client) | +| `TIGERBEETLE_REPLICA_ADDRESSES` | | `3004` | Tigerbeetle replica addresses for all replicas in the cluster, which are comma separated IP addresses/ports, to create a [Tigerbeetle client](https://docs.tigerbeetle.com/clients/node#creating-a-client) | +| `TRUST_PROXY` | | `false` | flag to use X-Forwarded-Proto header to determine if connections is secure | +| `USE_TIGERBEETLE` | | `true` | flag - use TigerBeetle or Postgres for accounting | +| `WALLET_ADDRESS_DEACTIVATION_PAYMENT_GRACE_PERIOD_MS` | | `86400000` | time in milliseconds into the future to set expiration of open incoming payments when deactivating wallet address. Default: 1 days | +| `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` | | `1500` | time in milliseconds the ASE has to create a missing wallet address until timeout | +| `WALLET_ADDRESS_POLLING_FREQUENCY_MS` | | `100` | frequency of polling while waiting for ASE to create a missing wallet address | +| `WALLET_ADDRESS_URL` | backend.serviceUrls.WALLET_ADDRESS_URL | `http://127.0.0.1:3001/.well-known/pay` | this Rafiki instance's internal wallet address | +| `WALLET_ADDRESS_WORKERS` | backend.workers.walletAddress | `1` | number of workers processing wallet address requests | +| `WALLET_ADDRESS_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that WALLET_ADDRESS_WORKERS will wait until they check an empty wallet address request queue again | +| `WEBHOOK_MAX_RETRY` | backend.webhookMaxRetry | `10` | maximum number of times Rafiki backend retries sending a certain webhook event to the configured WEBHOOK_URL | +| `WEBHOOK_TIMEOUT` | backend.lifetime.webhook | `2000` | milliseconds | +| `WEBHOOK_URL` | backend.serviceUrls.WEBHOOK_URL | `undefined` | endpoint on the Account Servicing Entity that consumes webhook events | +| `WEBHOOK_WORKERS` | backend.workers.webhook | `1` | number of workers processing webhook events | +| `WEBHOOK_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that WEBHOOK_WORKERS will wait until they check an empty webhook event queue again | +| `WITHDRAWAL_THROTTLE_DELAY` | backend.withdrawalThrottleDelay | `undefined` | delay in liquidity withdrawal processing | +| `ENABLE_MANUAL_MIGRATIONS` | backend.enableManualMigrations | `false` | When set to true, user needs to run database manually with command `npm run knex -- migrate:latest --env production` | + +## Auth + +| Variable | Helm Value Name | Default | Description | +| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ACCESS_TOKEN_DELETION_DAYS` | auth.accessToken.deletionDays | `30` | days until expired or revoked access tokens are deleted | +| `ACCESS_TOKEN_EXPIRY_SECONDS` | auth.accessToken.expirySeconds | `10 * 60` | expiry time in seconds for access tokens (default: 10 minutes) | +| `ADMIN_PORT` | auth.port.admin | `3003` | Admin API GraphQL Server port | +| `AUTH_DATABASE_URL` | auth.postgresql.host, auth.postgresql.port, auth.postgresql.username, auth.postgresql.database, auth.postgresql.password | `postgresql://postgres:password@localhost:5432/auth_development` | Postgres database URL of database storing the grant data; For Helm, these components are provided individually. | +| `AUTH_PORT` | auth.port.auth | `3006` | port of this Open Payments Auth Server | +| `AUTH_SERVER_URL` | | | Public endpoint for this Rafiki instance's public Open Payment routes. | +| `COOKIE_KEY` | auth.cookieKey | | [koa KeyGrip key](https://koajs.com/#app-keys-) that is used to sign cookies for an interaction session | +| `DATABASE_CLEANUP_WORKERS` | auth.workers.cleanup | `1` | number of workers processing expired or revoked access tokens | +| `IDENTITY_SERVER_URL` | auth.identityServer.domain | | endpoint of the identity server controlled by the Account Servicing Entity | +| `IDENTITY_SERVER_SECRET` | auth.identityServer.secret | | API key to fetch the identity server endpoint | +| `INCOMING_PAYMENT_INTERACTION` | auth.interaction.incomingPayment | `false` | flag - incoming payments grant requests are interactive or not | +| `INTERACTION_EXPIRY_SECONDS` | auth.interactionExpirySeconds | `600` | time in seconds for which a user can interact with a grant request | +| `INTERACTION_PORT` | auth.port.interaction | `3009` | Port number for the interaction APIs | +| `INTROSPECTION_PORT` | auth.port.introspection | `3007` | port of this Open Payments Auth - Token Introspection Server | +| `LIST_ALL_ACCESS_INTERACTION` | | `true` | Specify whether grant requests including a `list-all` action should require interaction. In these requests, the client asks to list resources that they themselves did not create. | +| `LOG_LEVEL` | auth.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | +| `NODE_ENV` | auth.nodeEnv | `development` | node environment, `development`, `test`, or `production` | +| `QUOTE_INTERACTION` | auth.interaction.quote | `false` | flag - quote grants are interactive or not | +| `REDIS_TLS_CA_FILE_PATH` | auth.redis.tlsCaFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_TLS_CERT_FILE_PATH` | auth.redis.tlsCertFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_TLS_KEY_FILE_PATH` | auth.redis.tlsKeyFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_URL` | `auth.redis.host`, `auth.redis.port` | `redis://127.0.0.1:6379` | The connection URL for Redis. For Helm, these components are provided individually. | +| `TRUST_PROXY` | | `false` | flag to use X-Forwarded-Proto header to determine if connections is secure | +| `WAIT_SECONDS` | auth.grant.waitSeconds | `5` | wait time included in grant request response (`grant.continue`) | +| `ENABLE_MANUAL_MIGRATIONS` | auth.enableManualMigrations | `false` | When set to true, user needs to run database manually with command `npm run knex -- migrate:latest --env production` | + +## Frontend + +| Variable | Helm Value Name | Default | Description | +| -------------------------------- | -------------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `GRAPHQL_URL` | frontend.serviceUrls.GRAPHQL_URL | `http://localhost:3001/graphql` | URL for the GraphQL Admin API | +| `OPEN_PAYMENTS_URL` | frontend.serviceUrls.OPEN_PAYMENTS_URL | `http://localhost:3003/` | Open Payments API Endpoint | +| `PORT` | frontend.port | `3005` | Port from which to host the Remix app | +| `ENABLE_INSECURE_MESSAGE_COOKIE` | | _undefined_ | Values of `true`, `t`, `1` will not use a `secure` message cookie which is required for flash messages to work over http. When not set, the secure flag is set according to `NODE_ENV`. | diff --git a/packages/documentation/src/content/docs/playground/testnet.mdx b/packages/documentation/src/content/docs/playground/testnet.mdx index 666d3db37d..53cbdead96 100644 --- a/packages/documentation/src/content/docs/playground/testnet.mdx +++ b/packages/documentation/src/content/docs/playground/testnet.mdx @@ -2,4 +2,19 @@ title: Testnet --- -## Placeholder +import { LinkOut } from '@interledger/docs-design-system' + +## The Test Network + +The [Local Playground](/playground/overview/) is not the only way to test and try out Rafiki. You can also try the Test Network, which is a Rafiki implementation bundled with a wallet and an e-commerce application available online. As it is a test environment, you can experiment integrating with the Interledger network without using real money. + +### Applications + +The current applications include: + +- An Interledger test wallet +- An e-commerce application + +## Peering with the Test Network + +If you have installed the [Local Playground](/playground/overview/) you can peer your local Rafiki instance with the remote Test Network. Refer to the [autopeering](/playground/autopeering/) page for more details. From d291994626332ae23a694e294c37ccb04fb83aaf Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Fri, 23 Aug 2024 18:31:12 +0200 Subject: [PATCH 29/91] docs: mi/docs-update --- .../integration/deploy-to-prod/environment-variables.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx index bc0d486fbf..ab2e2886fd 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx @@ -20,21 +20,21 @@ If you are running Rafiki via Helm and Kubernetes, then you must update the vari | `ADMIN_PORT` | backend.port.admin | `3001` | Admin API GraphQL Server port | | `AUTH_SERVER_GRANT_URL` | | `undefined` | endpoint on the Open Payments Auth Server to request a grant | | `AUTH_SERVER_INTROSPECTION_URL` | | `undefined` | endpoint on the Open Payments Auth Server to introspect an access token | -| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/concepts/interledger-protocol/peering#auto-peering) is enabled, its server will use this port | +| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/playground/autopeering/) is enabled, its server will use this port | | `CONNECTOR_PORT` | backend.port.connector | `3002` | port of the ILP connector for for sending packets over ILP over HTTP | | `DATABASE_URL` | backend.postgresql.host, backend.postgresql.port, backend.postgresql.username, backend.postgresql.database, backend.postgresql.password | `postgresql://postgres:password@localhost:5432/development` | Postgres database URL of database storing the resource data; For Helm, these components are provided individually. | -| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/concepts/interledger-protocol/peering#auto-peering). | +| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/playground/autopeering/). | | `ENABLE_SPSP_PAYMENT_POINTERS` | | `true` | enables [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) route | | `EXCHANGE_RATES_LIFETIME` | backend.lifetime.exchangeRate | `15_000` | time in milliseconds the exchange rates provided by the ASE via the EXCHANGE_RATES_URL are valid for | | `EXCHANGE_RATES_URL` | backend.serviceUrls.EXCHANGE_RATES_URL | `undefined` | endpoint on the Account Servicing Entity to request exchange rates | | `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` | backend.idempotencyTTL | `86400000` | TTL in milliseconds for idempotencyKey on GraphQL mutations (Admin API). Default: 24hrs | | `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` | | `2000` | TTL in milliseconds for idempotencyKey concurrency lock on GraphQL mutations (Admin API) | | `ILP_ADDRESS` | backend.ilp.address | `undefined` | ILP address of this Rafiki instance | -| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/concepts/interledger-protocol/peering#auto-peering) | +| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/playground/autopeering/) | | `INCOMING_PAYMENT_EXPIRY_MAX_MS` | | `2592000000` | Maximum milliseconds into the future incoming payments expiry can be set to on creation. Default: 30 days | | `INCOMING_PAYMENT_WORKERS` | backend.workers.incomingPayment | `1` | number of workers processing incoming payment requests | | `INCOMING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that INCOMING_PAYMENT_WORKERS will wait until they check an empty incoming payment request queue again | -| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/concepts/interledger-protocol/peering#auto-peering) | +| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/playground/autopeering/) | | `KEY_ID` | backend.key.id | `undefined` | this Rafiki instance's client key id | | `LOG_LEVEL` | backend.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | | `NODE_ENV` | backend.nodeEnv | `development` | node environment, `development`, `test`, or `production` | From 6086361c55a1e949fd4167898edceb576d90c093 Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Fri, 23 Aug 2024 18:35:59 +0200 Subject: [PATCH 30/91] docs: mi/docs-update --- .../docs/integration/deploy-to-prod/environment-variables.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx index ab2e2886fd..15ceb1f202 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx @@ -24,7 +24,7 @@ If you are running Rafiki via Helm and Kubernetes, then you must update the vari | `CONNECTOR_PORT` | backend.port.connector | `3002` | port of the ILP connector for for sending packets over ILP over HTTP | | `DATABASE_URL` | backend.postgresql.host, backend.postgresql.port, backend.postgresql.username, backend.postgresql.database, backend.postgresql.password | `postgresql://postgres:password@localhost:5432/development` | Postgres database URL of database storing the resource data; For Helm, these components are provided individually. | | `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/playground/autopeering/). | -| `ENABLE_SPSP_PAYMENT_POINTERS` | | `true` | enables [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) route | +| `ENABLE_SPSP_PAYMENT_POINTERS` | | `true` | enables SPSP (/resources/glossary#simple-payments-setup-protocol-spsp/) route | | `EXCHANGE_RATES_LIFETIME` | backend.lifetime.exchangeRate | `15_000` | time in milliseconds the exchange rates provided by the ASE via the EXCHANGE_RATES_URL are valid for | | `EXCHANGE_RATES_URL` | backend.serviceUrls.EXCHANGE_RATES_URL | `undefined` | endpoint on the Account Servicing Entity to request exchange rates | | `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` | backend.idempotencyTTL | `86400000` | TTL in milliseconds for idempotencyKey on GraphQL mutations (Admin API). Default: 24hrs | From 1632ccec2fd4412b1c8a2b109a677da402714888 Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Fri, 23 Aug 2024 12:55:14 -0500 Subject: [PATCH 31/91] docs - added some internal links Added link to Tigerbeetle info --- .../docs/components/accounts-transfers-liquidity.mdx | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx b/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx index c741a0a471..b911c66748 100644 --- a/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx +++ b/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx @@ -105,13 +105,4 @@ Payment liquidity is managed for incoming and outgoing payments created via Open TigerBeetle is a high-performance distributed financial accounting database used by Rafiki’s `backend` service to store account balance data at the ILP layer. Both liquidity and settlement accounts in Rafiki correspond to TigerBeetle credit and debit accounts, respectively. TigerBeetle only holds balance data without any additional ILP packet metadata. For detailed information on TigerBeetle, including its consensus mechanism and its limitations, visit the official TigerBeetle documentation and blog. -You have the flexibility to choose whether to use TigerBeetle or opt for a separate Postgres database. However, TigerBeetle is recommended due to its speed, efficiency, and dedicated design for handling double ledger accounting. - -### Changing TigerBeetle version - -// ADD LINKS TO THESE - -- Updating node client -- Prod environment helm chart -- Local environment -- Testing +You have the flexibility to choose whether to use TigerBeetle or opt for a separate Postgres database. However, TigerBeetle is recommended due to its speed, efficiency, and dedicated design for handling double ledger accounting. For more information about Tigerbeetle in a production environment, see [Running Rafiki in production](/integration/deploy-to-prod/deploy-to-cloud/helm-k8s?#tigerbeetle). From ec788e13f040e4213dc67ba528d95cc2cb38a19b Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Fri, 23 Aug 2024 13:29:28 -0500 Subject: [PATCH 32/91] docs - fixed a link Had a bad character in one of the internal hyperlinks --- .../content/docs/components/accounts-transfers-liquidity.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx b/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx index b911c66748..c7d8e035c4 100644 --- a/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx +++ b/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx @@ -105,4 +105,4 @@ Payment liquidity is managed for incoming and outgoing payments created via Open TigerBeetle is a high-performance distributed financial accounting database used by Rafiki’s `backend` service to store account balance data at the ILP layer. Both liquidity and settlement accounts in Rafiki correspond to TigerBeetle credit and debit accounts, respectively. TigerBeetle only holds balance data without any additional ILP packet metadata. For detailed information on TigerBeetle, including its consensus mechanism and its limitations, visit the official TigerBeetle documentation and blog. -You have the flexibility to choose whether to use TigerBeetle or opt for a separate Postgres database. However, TigerBeetle is recommended due to its speed, efficiency, and dedicated design for handling double ledger accounting. For more information about Tigerbeetle in a production environment, see [Running Rafiki in production](/integration/deploy-to-prod/deploy-to-cloud/helm-k8s?#tigerbeetle). +You have the flexibility to choose whether to use TigerBeetle or opt for a separate Postgres database. However, TigerBeetle is recommended due to its speed, efficiency, and dedicated design for handling double ledger accounting. For more information about Tigerbeetle in a production environment, see [Running Rafiki in production](/integration/deploy-to-prod/deploy-to-cloud/helm-k8s/#tigerbeetle). From 48cbd3d47f2f15418bb87169daa52b14e0194511 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Fri, 23 Aug 2024 15:21:10 -0400 Subject: [PATCH 33/91] docs: updated some links --- .../docs/services-and-aux-packages/auth-service.mdx | 9 ++------- .../docs/services-and-aux-packages/backend-service.mdx | 10 +++------- .../services-and-aux-packages/frontend-service.mdx | 2 ++ 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx index 9da15c3453..9aaefdda6d 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx @@ -4,13 +4,6 @@ title: Auth service import { LinkOut } from '@interledger/docs-design-system' -

- - link to /integration/deploy-to-prod/environment-variables AUTH when - available - -

- Rafiki’s `auth` service provides you with a reference implementation of an Open Payments authorization server. You can use the `auth` service as an alternative to developing your own in-house service for grant authorization and authentication. The authorization server is responsible for: @@ -30,6 +23,8 @@ The following are required when using the `auth` service. ::: - Integration with an identity provider (IdP) +You must also set the [environment variables](/integration/deploy-to-prod/environment-variables#auth) for the `auth` service. + ## Incoming client auth requests When a request comes from a client with an account on your local instance of Rafiki, the `auth` service uses data stored in the `auth` service’s Postgres database. diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx index edb8e00462..f5c1d0f9de 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx @@ -22,6 +22,8 @@ The following are required when using the `backend` service. You can use the same database instance of Postgres for the `backend` service, `auth` service, and accounting balances (if not using TigerBeetle). However, separate database schemas are required within the Rafiki instance to maintain boundaries between the objects being managed. ::: +You must also set the [environment variables](/integration/deploy-to-prod/environment-variables#backend) for the `backend` service. + ## Open Payments The `backend` service exposes the Open Payments APIs, which are auth-protected using an opinionated version of the Grant Negotiation and Authorization Protocol (GNAP). Review the [`auth`](/services-and-aux-packages/auth-service) service page for more details about grant authorization and authentication. @@ -49,10 +51,4 @@ The amounts within ILP packets are used to update account balances in your accou ## GraphQL Backend Admin API -The `backend` service exposes a GraphQL [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to manage: - -- Assets -- Peers -- Wallet addresses -- Open Payments resources -- Several types of liquidity +The `backend` service exposes a GraphQL [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to manage assets, peers, wallet addresses, Open Payments resources, and several types of liquidity. diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx b/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx index 49c0d9a7f5..75597e7d7d 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx +++ b/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx @@ -13,6 +13,8 @@ The following are required when using the `frontend` service: - A Rafiki [`backend`](/services-and-aux-packages/backend-service) service up and running to access the Backend Admin API. - An identity provider for authentication and user management. Out of the box, the Rafiki Admin application uses Ory Kratos, a secure and fully open-source identity management solution. Kratos will be made optional in a future Rafiki release, allowing you to run your own solution if you so choose. +You must also set the [environment variables](/integration/deploy-to-prod/environment-variables#frontend) for the `frontend` service. + ## Rafiki admin settings While the `frontend` service is not required to run a Rafiki instance, it is highly recommended. A number of administrative tasks could be performed programmatically via the Backend Admin API, but the `frontend` service makes these functions available through a user-friendly interface. From 87aa01e87d08261e5a2f5854dad77093f3cc3d3f Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Tue, 27 Aug 2024 10:22:42 +0300 Subject: [PATCH 34/91] docs: reorgs --- packages/documentation/astro.config.mjs | 213 +++++++----------- .../{resources => admin}/admin-user-guide.mdx | 4 +- .../src/content/docs/admin/manage-grants.mdx | 3 + .../src/content/docs/admin/manage-keys.mdx | 3 + .../content/docs/admin/manage-liquidity.mdx | 5 + .../src/content/docs/admin/manage-peering.mdx | 3 + .../accounts-transfers-liquidity.mdx | 6 +- .../{components => concepts}/interledger.mdx | 4 +- .../open-payments.mdx | 4 +- .../{components => concepts}/telemetry.mdx | 0 .../documentation/src/content/docs/index.mdx | 2 +- .../docs/integration/before-you-begin.mdx | 11 + .../endpoints/exchange-rates.mdx | 4 +- .../deploy-to-prod/endpoints/idp.mdx | 4 +- .../endpoints/webhook-events.mdx | 4 +- .../running-your-instance/adding-asset.mdx | 6 +- .../running-your-instance/adding-peer.mdx | 28 +-- .../creating-wallet-address.mdx | 4 +- .../managing-liquidity.mdx | 8 +- .../apis/graphql/admin-api-overview.mdx | 2 +- .../deployment}/apis/openapis.mdx | 0 .../deployment}/playground/autopeering.mdx | 2 +- .../deployment}/playground/overview.mdx | 14 +- .../deployment/playground/testnet.mdx | 20 ++ .../prod}/helm-k8s.mdx | 0 .../prod}/nginx.mdx | 0 .../integration/deployment/requirements.mdx | 5 + .../deployment/services}/auth-service.mdx | 8 +- .../deployment/services}/backend-service.mdx | 8 +- .../deployment/services}/frontend-service.mdx | 6 +- .../services}/token-introspection.mdx | 0 .../content/docs/integration/get-started.mdx | 12 +- ...hecklist.mdx => integration-checklist.mdx} | 6 +- .../src/content/docs/integration/peering.mdx | 9 + .../account-servicing-entities.mdx | 0 .../overview.mdx | 2 +- .../src/content/docs/playground/testnet.mdx | 20 -- .../architecture.mdx | 8 +- .../environment-variables.mdx | 10 +- .../content/docs/resources/get-involved.mdx | 2 +- .../src/content/docs/resources/grants.mdx | 3 + 41 files changed, 228 insertions(+), 225 deletions(-) rename packages/documentation/src/content/docs/{resources => admin}/admin-user-guide.mdx (98%) create mode 100644 packages/documentation/src/content/docs/admin/manage-grants.mdx create mode 100644 packages/documentation/src/content/docs/admin/manage-keys.mdx create mode 100644 packages/documentation/src/content/docs/admin/manage-liquidity.mdx create mode 100644 packages/documentation/src/content/docs/admin/manage-peering.mdx rename packages/documentation/src/content/docs/{components => concepts}/accounts-transfers-liquidity.mdx (94%) rename packages/documentation/src/content/docs/{components => concepts}/interledger.mdx (88%) rename packages/documentation/src/content/docs/{components => concepts}/open-payments.mdx (63%) rename packages/documentation/src/content/docs/{components => concepts}/telemetry.mdx (100%) create mode 100644 packages/documentation/src/content/docs/integration/before-you-begin.mdx rename packages/documentation/src/content/docs/{ => integration/deployment}/apis/graphql/admin-api-overview.mdx (97%) rename packages/documentation/src/content/docs/{ => integration/deployment}/apis/openapis.mdx (100%) rename packages/documentation/src/content/docs/{ => integration/deployment}/playground/autopeering.mdx (94%) rename packages/documentation/src/content/docs/{ => integration/deployment}/playground/overview.mdx (92%) create mode 100644 packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx rename packages/documentation/src/content/docs/integration/{deploy-to-prod/deploy-to-cloud => deployment/prod}/helm-k8s.mdx (100%) rename packages/documentation/src/content/docs/integration/{deploy-to-prod/deploy-to-cloud => deployment/prod}/nginx.mdx (100%) create mode 100644 packages/documentation/src/content/docs/integration/deployment/requirements.mdx rename packages/documentation/src/content/docs/{services-and-aux-packages => integration/deployment/services}/auth-service.mdx (70%) rename packages/documentation/src/content/docs/{services-and-aux-packages => integration/deployment/services}/backend-service.mdx (81%) rename packages/documentation/src/content/docs/{services-and-aux-packages => integration/deployment/services}/frontend-service.mdx (64%) rename packages/documentation/src/content/docs/{services-and-aux-packages => integration/deployment/services}/token-introspection.mdx (100%) rename packages/documentation/src/content/docs/integration/{integrator-checklist.mdx => integration-checklist.mdx} (76%) create mode 100644 packages/documentation/src/content/docs/integration/peering.mdx rename packages/documentation/src/content/docs/{intro-to-rafiki => overview}/account-servicing-entities.mdx (100%) rename packages/documentation/src/content/docs/{intro-to-rafiki => overview}/overview.mdx (98%) delete mode 100644 packages/documentation/src/content/docs/playground/testnet.mdx rename packages/documentation/src/content/docs/{components => resources}/architecture.mdx (51%) rename packages/documentation/src/content/docs/{integration/deploy-to-prod => resources}/environment-variables.mdx (98%) create mode 100644 packages/documentation/src/content/docs/resources/grants.mdx diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index c12cf93f91..b19051f983 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -51,19 +51,36 @@ export default defineConfig({ }, sidebar: [ { - label: 'Docs', + label: 'Rafiki Docs', items: [ { - label: 'Intro to Rafiki', - collapsed: true, + label: 'Overview', items: [ { - label: 'Overview', - link: 'intro-to-rafiki/overview' + label: 'Introducing Rafiki', + link: '/overview/overview' }, { - label: 'Account servicing entities', - link: 'intro-to-rafiki/account-servicing-entities' + label: 'Concepts', + collapsed: true, + items: [ + { + label: 'Accounts, transfers, and liquidity', + link: '/concepts/accounts-transfers-liquidity' + }, + { + label: 'Interledger', + link: '/concepts/interledger' + }, + { + label: 'Open Payments', + link: '/concepts/open-payments' + }, + { + label: 'Telemetry', + link: '/concepts/telemetry' + } + ] } ] }, @@ -72,193 +89,137 @@ export default defineConfig({ collapsed: true, items: [ { - label: 'Get started', - link: 'integration/get-started' + label: 'Before you begin', + link: '/integration/before-you-begin' }, { - label: 'Deploy to production', + label: 'Deployment', collapsed: true, items: [ { - label: 'Endpoints', + label: 'Requirements', + link: '/integration/deployment/requirements' + }, + { + label: 'Services', collapsed: true, items: [ { - label: 'Webhook events', - link: 'integration/deploy-to-prod/endpoints/webhook-events' + label: 'Auth service', + link: '/integration/deployment/services/auth-service' }, { - label: 'Exchange Rates', - link: 'integration/deploy-to-prod/endpoints/exchange-rates' + label: 'Backend service', + link: '/integration/deployment/services/backend-service' }, { - label: 'IDP', - link: 'integration/deploy-to-prod/endpoints/idp' + label: 'Frontend service', + link: '/integration/deployment/services/frontend-service' + }, + { + label: 'Token introspection', + link: '/integration/deployment/services/token-introspection' } ] }, { - label: 'Environment variables', - link: 'integration/deploy-to-prod/environment-variables' - }, - { - label: 'Deploying to cloud environment options', + label: 'Deploy locally', collapsed: true, items: [ { - label: 'nginx', - link: 'integration/deploy-to-prod/deploy-to-cloud/nginx' + label: 'Local playground overview', + link: '/integration/deployment/playground/overview' + }, + { + label: 'Autopeering', + link: '/integration/deployment/playground/autopeering' }, { - label: 'Helm & K8s', - link: 'integration/deploy-to-prod/deploy-to-cloud/helm-k8s' + label: 'Test network', + link: '/integration/deployment/playground/testnet' } ] }, { - label: 'Running your instance', - collapsed: true, + label: 'Deploy to production', items: [ { - label: 'Adding asset', - link: 'integration/deploy-to-prod/running-your-instance/adding-asset' - }, - { - label: 'Adding peer', - link: 'integration/deploy-to-prod/running-your-instance/adding-peer' - }, - { - label: 'Creating wallet address', - link: 'integration/deploy-to-prod/running-your-instance/creating-wallet-address' - }, - { - label: 'Managing liquidity', - link: 'integration/deploy-to-prod/running-your-instance/managing-liquidity' - }, - { - label: 'Keys management', - link: 'integration/deploy-to-prod/running-your-instance/keys-management' + label: 'nginx', + link: '/integration/deployment/prod/nginx' }, { - label: 'Grants management', - link: 'integration/deploy-to-prod/running-your-instance/grants-management' + label: 'Helm and K8s', + link: '/integration/deployment/prod/helm-k8s' } ] } ] }, { - label: 'Integrator checklist', - link: 'integration/integrator-checklist' - } - ] - }, - { - label: 'Components', - collapsed: true, - items: [ - { - label: 'Accounts, transfers, and liquidity', - link: 'components/accounts-transfers-liquidity' - }, - { - label: 'Telemetry', - link: 'components/telemetry' + label: 'Peering', + link: '/integration/peering' }, { - label: 'Interledger', - link: 'components/interledger' + label: 'Integration checklist', + link: '/integration/integration-checklist' }, { - label: 'Open Payments', - link: 'components/open-payments' - }, - { - label: 'Architecture', - link: 'components/architecture' + label: 'APIs', + link: '/integration/apis/' } ] }, { - label: 'Services and Auxiliary Packages', + label: 'Administration', collapsed: true, items: [ { - label: 'Backend service', - link: 'services-and-aux-packages/backend-service' + label: 'Rafiki Admin', + link: '/admin/admin-user-guide' }, { - label: 'Auth service', - link: 'services-and-aux-packages/auth-service' + label: 'Manage liquidity', + link: '/admin/manage-liquidity' }, { - label: 'Frontend service', - link: 'services-and-aux-packages/frontend-service' + label: 'Manage peering relationships', + link: '/admin/manage-peering' }, { - label: 'Token introspection', - link: 'services-and-aux-packages/token-introspection' + label: 'Manage keys', + link: '/admin/manage-keys' + }, + { + label: 'Manage grants', + link: '/admin/manage-grants' } ] }, { - label: 'Local Playground', + label: 'Resources', collapsed: true, items: [ { - label: 'Overview', - link: 'playground/overview' + label: 'Glossary', + link: '/resources/glossary' }, { - label: 'Auto-Peering', - link: 'playground/autopeering' + label: 'Architecture', + link: '/resources/architecture' }, { - label: 'Testnet', - link: 'playground/testnet' - } - ] - }, - { - label: 'APIs', - collapsed: true, - items: [ + label: 'Environment variables', + link: '/resources/environment-variables' + }, { - label: 'GraphQL APIs', - collapsed: true, - items: [ - { - label: 'Overview', - link: 'apis/graphql/admin-api-overview' - }, - { - label: 'Backend Admin API', - collapsed: true, - autogenerate: { - directory: 'apis/graphql/backend' - } - }, - { - label: 'Auth Admin API', - collapsed: true, - autogenerate: { - directory: 'apis/graphql/auth' - } - } - ] + label: 'Grants', + link: '/resources/grants' }, { - label: 'OpenAPIs', - link: 'apis/openapis' + label: 'Get involved', + link: '/resources/get-involved' } ] - }, - { - label: 'Resources', - collapsed: true, - autogenerate: { - directory: 'resources' - } } ] } diff --git a/packages/documentation/src/content/docs/resources/admin-user-guide.mdx b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx similarity index 98% rename from packages/documentation/src/content/docs/resources/admin-user-guide.mdx rename to packages/documentation/src/content/docs/admin/admin-user-guide.mdx index 88f31806de..eb7cb10578 100644 --- a/packages/documentation/src/content/docs/resources/admin-user-guide.mdx +++ b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx @@ -10,7 +10,7 @@ The Rafiki Admin application provides tools to manage peers, assets, wallet addr ### Prerequisites -- Familiarity with general Rafiki concepts. The [intro to Rafiki overview](/intro-to-rafiki/overview) is a great place to start. +- Familiarity with general Rafiki concepts. The [Rafiki overview](/overview/overview) is a great place to start. - Rafiki Admin login credentials ## Navigation @@ -214,7 +214,7 @@ After editing any of the above fields in the General Information section, select ## Webhooks -The Webhook Events page allows you to monitor and manage webhook events within your Rafiki instance. Webhook events in Rafiki are the main communication channel between you and your Rafiki instance. See [Webhook events](/integration/deploy-to-prod/endpoints/webhook-events) for more information about webhook events. +The Webhook Events page allows you to monitor and manage webhook events within your Rafiki instance. Webhook events in Rafiki are the main communication channel between you and your Rafiki instance. See [Webhook events](/integration/before-you-begin#webhook-events) for more information about webhook events. All webhook events that have been triggered are displayed in the table. For each webhook event, you can see the webhook ID, the event type, and the date and time of the event. There is also a field at the top of the page allowing you to filter the table by event type, making it easier to drill down into specific events. diff --git a/packages/documentation/src/content/docs/admin/manage-grants.mdx b/packages/documentation/src/content/docs/admin/manage-grants.mdx new file mode 100644 index 0000000000..f15d07f8fc --- /dev/null +++ b/packages/documentation/src/content/docs/admin/manage-grants.mdx @@ -0,0 +1,3 @@ +--- +title: Manage grants +--- diff --git a/packages/documentation/src/content/docs/admin/manage-keys.mdx b/packages/documentation/src/content/docs/admin/manage-keys.mdx new file mode 100644 index 0000000000..2c0e995f76 --- /dev/null +++ b/packages/documentation/src/content/docs/admin/manage-keys.mdx @@ -0,0 +1,3 @@ +--- +title: Manage keys +--- diff --git a/packages/documentation/src/content/docs/admin/manage-liquidity.mdx b/packages/documentation/src/content/docs/admin/manage-liquidity.mdx new file mode 100644 index 0000000000..63d8534bf7 --- /dev/null +++ b/packages/documentation/src/content/docs/admin/manage-liquidity.mdx @@ -0,0 +1,5 @@ +--- +title: Manage liquidity +--- + +`https://deploy-preview-2875--brilliant-pasca-3e80ec.netlify.app/integration/deploy-to-prod/running-your-instance/managing-liquidity/` diff --git a/packages/documentation/src/content/docs/admin/manage-peering.mdx b/packages/documentation/src/content/docs/admin/manage-peering.mdx new file mode 100644 index 0000000000..3940adfbe6 --- /dev/null +++ b/packages/documentation/src/content/docs/admin/manage-peering.mdx @@ -0,0 +1,3 @@ +--- +title: Manage peering relationships +--- diff --git a/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx b/packages/documentation/src/content/docs/concepts/accounts-transfers-liquidity.mdx similarity index 94% rename from packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx rename to packages/documentation/src/content/docs/concepts/accounts-transfers-liquidity.mdx index c7d8e035c4..739c6e7a6b 100644 --- a/packages/documentation/src/content/docs/components/accounts-transfers-liquidity.mdx +++ b/packages/documentation/src/content/docs/concepts/accounts-transfers-liquidity.mdx @@ -38,7 +38,7 @@ Before peering with another account servicing entity, you must agree on the asse Furthermore, an account servicing entity performing currency exchange must provide asset liquidity. Asset liquidity ensures there is enough value available to handle transactions in the specified assets. -Assets are managed via the [Backend Admin API](/services-and-aux-packages/backend-service#graphql-backend-admin-api) or the [Rafiki Admin application](/resources/admin-user-guide/). Wallet addresses are created for existing assets and are tied to those assets. +Assets are managed via the [Backend Admin API](/integration/deployment/services/backend-service#graphql-backend-admin-api) or the [Rafiki Admin application](/admin/admin-user-guide/). Wallet addresses are created for existing assets and are tied to those assets. ### The `asset` type @@ -99,10 +99,10 @@ A peering agreement is a legal contract between the parties involved in a peerin #### Payment liquidity -Payment liquidity is managed for incoming and outgoing payments created via Open Payments through liquidity accounts in your accounting database. When incoming or outgoing payments are created via the Open Payments APIs, a corresponding liquidity account is automatically created. Liquidity must be deposited to an outgoing payment account before the payment can be processed. You are notified to deposit or withdraw liquidity via [webhook events](/integration/deploy-to-prod/endpoints/webhook-events). +Payment liquidity is managed for incoming and outgoing payments created via Open Payments through liquidity accounts in your accounting database. When incoming or outgoing payments are created via the Open Payments APIs, a corresponding liquidity account is automatically created. Liquidity must be deposited to an outgoing payment account before the payment can be processed. You are notified to deposit or withdraw liquidity via [webhook events](/integration/before-you-begin#webhook-events). ## TigerBeetle TigerBeetle is a high-performance distributed financial accounting database used by Rafiki’s `backend` service to store account balance data at the ILP layer. Both liquidity and settlement accounts in Rafiki correspond to TigerBeetle credit and debit accounts, respectively. TigerBeetle only holds balance data without any additional ILP packet metadata. For detailed information on TigerBeetle, including its consensus mechanism and its limitations, visit the official TigerBeetle documentation and blog. -You have the flexibility to choose whether to use TigerBeetle or opt for a separate Postgres database. However, TigerBeetle is recommended due to its speed, efficiency, and dedicated design for handling double ledger accounting. For more information about Tigerbeetle in a production environment, see [Running Rafiki in production](/integration/deploy-to-prod/deploy-to-cloud/helm-k8s/#tigerbeetle). +You have the flexibility to choose whether to use TigerBeetle or opt for a separate Postgres database. However, TigerBeetle is recommended due to its speed, efficiency, and dedicated design for handling double ledger accounting. For more information about Tigerbeetle in a production environment, see [Running Rafiki in production](/integration/deployment/prod/helm-k8s/#tigerbeetle). diff --git a/packages/documentation/src/content/docs/components/interledger.mdx b/packages/documentation/src/content/docs/concepts/interledger.mdx similarity index 88% rename from packages/documentation/src/content/docs/components/interledger.mdx rename to packages/documentation/src/content/docs/concepts/interledger.mdx index 15eb3503f0..39da81165a 100644 --- a/packages/documentation/src/content/docs/components/interledger.mdx +++ b/packages/documentation/src/content/docs/concepts/interledger.mdx @@ -12,7 +12,7 @@ At the core of Interledger is the Interledger Protocol (ILP). It’s a request/r Interledger itself is a network of computers that enables sending payments across payment networks. Each computer on the network is called a node. -For two nodes on the Interledger network to exchange ILP packets with one another, the two nodes must be peers. There are a number of [requirements](/integration/deploy-to-prod/running-your-instance/adding-peer) that both you and your potential peer must meet in order to form a peering relationship. +For two nodes on the Interledger network to exchange ILP packets with one another, the two nodes must be peers. There are a number of [requirements](/integration/before-you-begin#add-peer) that both you and your potential peer must meet in order to form a peering relationship. Since the purpose of peering is to facilitate payments, which often involves extending lines of credit, your peer should be someone you trust. We strongly recommend you and your potential peer define your expectations and outline your agreements in a legally-binding document before you add them as a peer in Rafiki. @@ -24,7 +24,7 @@ Each node on the Interledger network can take on the role of sender, connector, - Connector - An intermediary between a sender and receiver that forwards ILP packets. Connectors can facilitate payments to or from anyone they’re peered with. - Receiver - The final recipient of the payment. -Rafiki’s [backend service](/services-and-aux-packages/backend-service) includes an Interledger connector for sending and receiving ILP packets via ILPoverHTTP. You can learn more about a connector’s role in the ILP packet lifecycle on the Interledger developer’s site. +Rafiki’s [backend service](/integration/deployment/services/backend-service) includes an Interledger connector for sending and receiving ILP packets via ILPoverHTTP. You can learn more about a connector’s role in the ILP packet lifecycle on the Interledger developer’s site. If the sender and receiver nodes are peers, then the payment flow is straightforward and no intermediary connector nodes are needed. However, if the sender and receiver aren’t peers, then the payment must be routed through one or more connectors. diff --git a/packages/documentation/src/content/docs/components/open-payments.mdx b/packages/documentation/src/content/docs/concepts/open-payments.mdx similarity index 63% rename from packages/documentation/src/content/docs/components/open-payments.mdx rename to packages/documentation/src/content/docs/concepts/open-payments.mdx index b2c9f05203..7d545c0f52 100644 --- a/packages/documentation/src/content/docs/components/open-payments.mdx +++ b/packages/documentation/src/content/docs/concepts/open-payments.mdx @@ -31,8 +31,8 @@ We strongly encourage you to familiarize yourself with the Open Payments standar ## Rafiki's `backend` service -Rafiki’s [`backend`](/services-and-aux-packages/backend-service) service is the main service for handling business logic and external communication. The service is responsible for, among other things, exposing the endpoints of the Open Payments APIs for clients to perform account management tasks. Every request and response is validated against the Open Payments specification. +Rafiki’s [`backend`](/integration/deployment/servicesbackend-service) service is the main service for handling business logic and external communication. The service is responsible for, among other things, exposing the endpoints of the Open Payments APIs for clients to perform account management tasks. Every request and response is validated against the Open Payments specification. ## Rafiki's auth service -Rafiki’s [`auth`](/services-and-aux-packages/auth-service) service is a reference implementation of an opinionated Open Payments authorization server. The authorization server is responsible for delegating authorization (via grants) to clients to use the Open Payments APIs, resolving clients’ public keys to authenticate and authorize incoming requests, and creating payments and quotes on the backend. Open Payments leverages the Grant Negotiation and Authorization Protocol (GNAP) for delegating authorization. You can learn more about the protocol by reviewing its specification. +Rafiki’s [`auth`](/integration/deployment/services/auth-service) service is a reference implementation of an opinionated Open Payments authorization server. The authorization server is responsible for delegating authorization (via grants) to clients to use the Open Payments APIs, resolving clients’ public keys to authenticate and authorize incoming requests, and creating payments and quotes on the backend. Open Payments leverages the Grant Negotiation and Authorization Protocol (GNAP) for delegating authorization. You can learn more about the protocol by reviewing its specification. diff --git a/packages/documentation/src/content/docs/components/telemetry.mdx b/packages/documentation/src/content/docs/concepts/telemetry.mdx similarity index 100% rename from packages/documentation/src/content/docs/components/telemetry.mdx rename to packages/documentation/src/content/docs/concepts/telemetry.mdx diff --git a/packages/documentation/src/content/docs/index.mdx b/packages/documentation/src/content/docs/index.mdx index aaebfffa40..e7811da58f 100644 --- a/packages/documentation/src/content/docs/index.mdx +++ b/packages/documentation/src/content/docs/index.mdx @@ -6,7 +6,7 @@ hero: tagline: Rafiki is open source software that provides an efficient solution for an Account Servicing Entity to enable Interledger functionality on its users' accounts. actions: - text: Read Rafiki docs - link: /intro-to-rafiki/overview + link: /overview/overview icon: open-book variant: primary --- diff --git a/packages/documentation/src/content/docs/integration/before-you-begin.mdx b/packages/documentation/src/content/docs/integration/before-you-begin.mdx new file mode 100644 index 0000000000..3fa26d30e4 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/before-you-begin.mdx @@ -0,0 +1,11 @@ +--- +title: Before you begin +--- + +## Exchange Rates + +## IDP + +integration and also flows + +## Webhook Events diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx index 4e83117aea..0b495a1d09 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx @@ -24,7 +24,7 @@ In addition, you will need to specify the `EXCHANGE_RATES_LIFETIME` environment In addition, you must consider your slippage tolerance. As mentioned, before an Interledger payment is made, a rate probe provides a quote that estimates the cost of transferring value over the network. This cost includes fees that connector nodes of the network may charge in exchange rates or even as a forwarding fee for payments denominated in the same asset (e.g. USD). As exchange rates and fees charged by connectors fluctuate, there will likely be a variance between the estimated amount provided in the quote and the actual amount required when the payment is initiated. The default slippage is 1% but can be configured via the `SLIPPAGE` environment variable using a value between 0 and 1. Using the default slippage, a payment of \$1.01 will go through on an initial quote estimated at \$1.00, but payment will not be sent if the total, inclusive of exchange rate and network fees, amounts to \$1.02. -Depending on the particular deployment of your Rafiki instance, these environment variables will be set in a `docker-compose.yaml` file or as part of a Helm chart. Refer to the [environment variables](/integration/deploy-to-prod/environment-variables) page for more details. +Depending on the particular deployment of your Rafiki instance, these environment variables will be set in a `docker-compose.yaml` file or as part of a Helm chart. Refer to the [environment variables](/resources/environment-variables) page for more details. ## Fees @@ -108,4 +108,4 @@ These variables are used in the following request example: ### Rafiki Admin application -You may also add fees via the Rafiki Admin application. See the [Rafiki Admin application user guide](/resources/admin-user-guide/#assets) for more information on configuring asset fees. +You may also add fees via the Rafiki Admin application. See the [Rafiki Admin application user guide](/admin/admin-user-guide/#assets) for more information on configuring asset fees. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx index 7ab02a2097..7ef138d8de 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx @@ -8,7 +8,7 @@ import { CodeBlock } from '@interledger/docs-design-system' An identity provider (IdP) is a system or service that manages user authentication, identity information, and consent. When you use your Google account credentials to “Sign in with Google” on an app or website, for example, Google is acting as your identity provider. -To facilitate payments initiated by third party applications (clients) via the [Open Payments APIs](/components/open-payments) on your users' accounts, you must integrate your Rafiki instance with your IdP to handle user authentication and consent. This authentication and consent facilitates the authorization of grants to resources provided by Open Payments. The Rafiki `backend` package exposes the APIs for Open Payments, and the Rafiki `auth` package provides an Authorization Server (AS), which serves as a reference implementation of an opinionated version of the Grant Negotiation Authorization Protocol (GNAP) that authorizes requests to those APIs. +To facilitate payments initiated by third party applications (clients) via the [Open Payments APIs](/concepts/open-payments) on your users' accounts, you must integrate your Rafiki instance with your IdP to handle user authentication and consent. This authentication and consent facilitates the authorization of grants to resources provided by Open Payments. The Rafiki `backend` package exposes the APIs for Open Payments, and the Rafiki `auth` package provides an Authorization Server (AS), which serves as a reference implementation of an opinionated version of the Grant Negotiation Authorization Protocol (GNAP) that authorizes requests to those APIs. The AS in the auth package extends its own API for integrating an IdP with Rafiki. This Auth Admin API, different from the Backend Admin API, facilitates interactions to obtain user consent, authorize a grant, fetch information about a particular grant, and communicate that a user has authorized a grant. An OpenAPI specification of these API endpoints can be found here. @@ -16,7 +16,7 @@ The AS in the auth package extends its own API for integrating an IdP with Rafik ### Prerequisites -To integrate your IdP with your Rafiki instance, you must define the following [environment variables](/integration/deploy-to-prod/environment-variables): +To integrate your IdP with your Rafiki instance, you must define the following environment variables: `IDENTITY_SERVER_DOMAIN` : the URL the AS will redirect the user to complete an interaction and authorize a grant. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx index 8a7d7ec587..7b93d85ea2 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx @@ -58,7 +58,7 @@ The `incoming_payment.created` event indicates that an incoming payment was crea The `incoming_payment.completed` event indicates that an incoming payment was completed, either automatically or manually, and that any funds received into this incoming payment should be withdrawn and credited to the recipient’s account on your ledger. -In addition, the `CreateIncomingPaymentWithdrawal` supports [two-phase transfers](https://rafiki.dev/reference/glossary/#two-phase-transfers). +In addition, the `CreateIncomingPaymentWithdrawal` supports two-phase transfers. Example: An incoming payment was completed and the recipient received **$10**. @@ -74,7 +74,7 @@ Example: An incoming payment was completed and the recipient received **$10**. `} /> -Example: An incoming payment supporting two-phase transfers was completed and recieved **$10**. +Example: An incoming payment supporting two-phase transfers was completed and received **$10**. Interledger (ILP) addresses
. - Communicate a connection endpoint for the other peer to send packets to. - Exchange `auth` tokens for the connection endpoint. - Agree on a settlement mechanism (a means of paying one another for the successful forwarding and delivery of packets), which is outside the scope of Interledger and Rafiki. -Optionally, you may also deposit an initial [liquidity](/integration/deploy-to-prod/running-your-instance/managing-liquidity) for your peer. +Optionally, you may also deposit an initial liquidity for your peer. ## Add a peer using the Backend Admin API @@ -26,15 +26,15 @@ Rafiki’s Backend Admin API implements a GraphQL interface. Data insertions and To add a peer to your Rafiki instance call the `CreatePeer` mutation query and pass the query variables for the following: -| Query parameters | Description | Required | -| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `assetID` | the ID of the asset that you and your peer will use to ultimately settle your net obligations outside of Interledger. | Y | -| `staticILPaddress` | Your peer’s static ILP address (the following example uses `g.othergreatwallet`) | Y | -| `name` | Your peer’s name (the following example uses “The Other Great Wallet”) | Y | -| `http.incoming.authTokens` | The token your peer will use to present and connect to and send packets to your Rafiki instance. | Y | -| `http.outgoing.endpoint` | Your peer’s connector endpoint. By default it is on local port 0.0.0.0:3002 | Y | -| `http.outgoing.authtoken` | The token that you will use to present to your peer and connect to and send packets to their Rafiki instance. | Y | -| `initialLiquidity` | Initial amount of liquidity to deposit for peer. [Liquidity](/integration/deploy-to-prod/running-your-instance/managing-liquidity) can also be deposited using the `DepositPeerLiquidity` mutation. | N | +| Query parameters | Description | Required | +| -------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -------- | +| `assetID` | the ID of the asset that you and your peer will use to ultimately settle your net obligations outside of Interledger. | Y | +| `staticILPaddress` | Your peer’s static ILP address (the following example uses `g.othergreatwallet`) | Y | +| `name` | Your peer’s name (the following example uses “The Other Great Wallet”) | Y | +| `http.incoming.authTokens` | The token your peer will use to present and connect to and send packets to your Rafiki instance. | Y | +| `http.outgoing.endpoint` | Your peer’s connector endpoint. By default it is on local port 0.0.0.0:3002 | Y | +| `http.outgoing.authtoken` | The token that you will use to present to your peer and connect to and send packets to their Rafiki instance. | Y | +| `initialLiquidity` | Initial amount of liquidity to deposit for peer. Liquidity can also be deposited using the `DepositPeerLiquidity` mutation. | N | @@ -108,6 +108,6 @@ mutation CreatePeer($input: CreatePeerInput!) { ## Add a peer using the Rafiki Admin application -Alternatively, a peer can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/playground/overview/#running-the-local-environment). +Alternatively, a peer can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/integration/deployment/playground/overview/#running-the-local-environment). -See the [Rafiki Admin application user guide](/resources/admin-user-guide/#peers) for more information on adding peers. +See the [Rafiki Admin application user guide](/admin/admin-user-guide/#peers) for more information on adding peers. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx index d6eb61e92a..6fb3f98113 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx @@ -8,7 +8,7 @@ import { CodeBlock } from '@interledger/docs-design-system' To allow your account holders the ability to send and receive payments via the Open Payments APIs, you must create at least one wallet address for each account. The wallet address serves as a standardized identifier for a payment account. -You can create wallet addresses for your account holders using the Backend Admin API. Note that at least one asset must be created before the wallet address is created. The `assetId` of the asset must be provided as an input variable when issuing the GraphQL mutation query. Refer to the [adding asset](/integration/deploy-to-prod/running-your-instance/adding-asset) page for details. +You can create wallet addresses for your account holders using the Backend Admin API. Note that at least one asset must be created before the wallet address is created. The `assetId` of the asset must be provided as an input variable when issuing the GraphQL mutation query. ## Creating wallet addresses through a script @@ -177,4 +177,4 @@ id ## Creating wallet addresses dynamically -An alternative approach to creating wallet addresses for your account holders is to generate the addresses dynamically when your Rafiki instance fires the [`wallet_address.not_found`](/integration/deploy-to-prod/endpoints/webhook-events) webhook event. This event fires when Rafiki does not find the wallet address requested from an Open Payments API call. When receiving this event, you can look up the associated account in your system and call the `CreateWalletAddress` and `CreateWalletAddressKey` mutations to create the wallet address and its associated private-public key pair. Even if you opt to create the initial batch of wallet addresses for your existing account holders via a one-time script, you may implement this process to dynamically create wallet addresses for any new accounts you onboard to your system. +An alternative approach to creating wallet addresses for your account holders is to generate the addresses dynamically when your Rafiki instance fires the [`wallet_address.not_found`](/integration/before-you-begin#webhook-events) webhook event. This event fires when Rafiki does not find the wallet address requested from an Open Payments API call. When receiving this event, you can look up the associated account in your system and call the `CreateWalletAddress` and `CreateWalletAddressKey` mutations to create the wallet address and its associated private-public key pair. Even if you opt to create the initial batch of wallet addresses for your existing account holders via a one-time script, you may implement this process to dynamically create wallet addresses for any new accounts you onboard to your system. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx index 31539a711a..db9d277dbf 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx @@ -4,11 +4,11 @@ title: Managing liquidity import { LinkOut } from '@interledger/docs-design-system' -As an implementation of the Interledger Protocol, Rafiki provides [accounting](/components/accounts-transfers-liquidity) between transacting parties but doesn’t handle settlement. You and the account servicing entities you decide to peer with must agree on the means and how often you will settle your accounts. Consequently, Rafiki can manage the liquidity used to fund payments made through the Interledger network. +As an implementation of the Interledger Protocol, Rafiki provides [accounting](/concepts/accounts-transfers-liquidity) between transacting parties but doesn’t handle settlement. You and the account servicing entities you decide to peer with must agree on the means and how often you will settle your accounts. Consequently, Rafiki can manage the liquidity used to fund payments made through the Interledger network. ## Add liquidity via GraphQL -Liquidity can be managed in Rafiki through the [`backend`](/services-and-aux-packages/backend-service/) Admin API, which implements a GraphQL interface, or via the [Rafiki Admin application](/resources/admin-user-guide). Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts: a query and an object containing query variables. +Liquidity can be managed in Rafiki through the [`backend`](/integration/deployment/services/backend-service/) Admin API, which implements a GraphQL interface, or via the [Rafiki Admin application](/admin/admin-user-guide). Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts: a query and an object containing query variables. As Rafiki supports several types of liquidity, we’ll cover the typical scenarios you’ll need to manage. @@ -18,7 +18,7 @@ You must provide the `idempotencyKey` when calling mutations related to liquidit ## Asset Liquidity -Asset liquidity specifies the amount of value denominated in an asset you have previously [added](/integration/deploy-to-prod/running-your-instance/adding-asset) to your Rafiki instance, which Rafiki has at its disposal to send or forward Interledger packets. Asset liquidity increases if packets denominated in the asset are received and decreases if your Rafiki instance sends packets denominated in the asset. The amount is always non-negative. +Asset liquidity specifies the amount of value denominated in an asset you have previously added to your Rafiki instance, which Rafiki has at its disposal to send or forward Interledger packets. Asset liquidity increases if packets denominated in the asset are received and decreases if your Rafiki instance sends packets denominated in the asset. The amount is always non-negative. You should define and adjust the asset liquidity based on your risk tolerance. @@ -185,7 +185,7 @@ The following are example `input` parameters for the `CreateIncomingPaymentWithd ### Outgoing payment -You can deposit outgoing payment liquidity via the `DepositOutgoingPaymentLiqudity` mutation query: +You can deposit outgoing payment liquidity via the `DepositOutgoingPaymentLiquidity` mutation query: ```sh mutation DepositOutgoingPaymentLiquidity( diff --git a/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx b/packages/documentation/src/content/docs/integration/deployment/apis/graphql/admin-api-overview.mdx similarity index 97% rename from packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx rename to packages/documentation/src/content/docs/integration/deployment/apis/graphql/admin-api-overview.mdx index ec84416ee4..cc6ea04385 100644 --- a/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/apis/graphql/admin-api-overview.mdx @@ -10,7 +10,7 @@ Rafiki provides two GraphQL APIs, described below. As described on -loca.lt/mytunnelpassword or whatismyip.com +loca.lt/mytunnelpassword or whatismyip.com ::: To shut down the connection and clear the environment, run the following command: diff --git a/packages/documentation/src/content/docs/playground/overview.mdx b/packages/documentation/src/content/docs/integration/deployment/playground/overview.mdx similarity index 92% rename from packages/documentation/src/content/docs/playground/overview.mdx rename to packages/documentation/src/content/docs/integration/deployment/playground/overview.mdx index 7f9baaf35b..d4a04a6f9e 100644 --- a/packages/documentation/src/content/docs/playground/overview.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/playground/overview.mdx @@ -6,16 +6,16 @@ import { LinkOut } from '@interledger/docs-design-system' import { CodeBlock } from '@interledger/docs-design-system' -The Local Playground provides a suite of packages that, together, mock an account servicing entity that has deployed Rafiki. It exposes an SPSP endpoint, the [Open Payments APIs](/components/open-payments) with its required GNAP auth endpoints to request grants, a STREAM endpoint for receiving Interledger packets, and an admin UI to view and manage each Rafiki instance. +The Local Playground provides a suite of packages that, together, mock an account servicing entity that has deployed Rafiki. It exposes an SPSP endpoint, the [Open Payments APIs](/concepts/open-payments) with its required GNAP auth endpoints to request grants, a STREAM endpoint for receiving Interledger packets, and an admin UI to view and manage each Rafiki instance. This suite of packages includes: -| Package name | Services | -| --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | -| [`backend`](/services-and-aux-packages/backend-service) |
  • SPSP
  • Open Payments APIs
  • GraphQL Admin APIs
  • STREAM endpoint
| -| [`auth`](/services-and-aux-packages/auth-service) | GNAP auth server | -| `mock-account-servicing-entity` | mocks an account servicing entity | -| [`frontend`](/services-and-aux-packages/frontend-service) | Remix app to expose a UI for Rafiki admin management via interaction with the Backend Admin APIs | +| Package name | Services | +| --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| [`backend`](/integration/deployment/services/backend-service) |
  • SPSP
  • Open Payments APIs
  • GraphQL Admin APIs
  • STREAM endpoint
| +| [`auth`](/integration/deployment/services/auth-service) | GNAP auth server | +| `mock-account-servicing-entity` | mocks an account servicing entity | +| [`frontend`](/integration/deployment/services/frontend-service) | Remix app to expose a UI for Rafiki admin management via interaction with the Backend Admin APIs | These packages depend on the following databases: diff --git a/packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx b/packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx new file mode 100644 index 0000000000..65d9ee166e --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx @@ -0,0 +1,20 @@ +--- +title: Testnet +--- + +import { LinkOut } from '@interledger/docs-design-system' + +## The Test Network + +The [Local Playground](/integration/deployment/playground/overview/) is not the only way to test and try out Rafiki. You can also try the Test Network, which is a Rafiki implementation bundled with a wallet and an e-commerce application available online. As it is a test environment, you can experiment integrating with the Interledger network without using real money. + +### Applications + +The current applications include: + +- An Interledger test wallet +- An e-commerce application + +## Peering with the Test Network + +If you have installed the [Local Playground](/integration/playground/overview/) you can peer your local Rafiki instance with the remote Test Network. Refer to the [autopeering](/integration/playground/autopeering/) page for more details. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/helm-k8s.mdx b/packages/documentation/src/content/docs/integration/deployment/prod/helm-k8s.mdx similarity index 100% rename from packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/helm-k8s.mdx rename to packages/documentation/src/content/docs/integration/deployment/prod/helm-k8s.mdx diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/nginx.mdx b/packages/documentation/src/content/docs/integration/deployment/prod/nginx.mdx similarity index 100% rename from packages/documentation/src/content/docs/integration/deploy-to-prod/deploy-to-cloud/nginx.mdx rename to packages/documentation/src/content/docs/integration/deployment/prod/nginx.mdx diff --git a/packages/documentation/src/content/docs/integration/deployment/requirements.mdx b/packages/documentation/src/content/docs/integration/deployment/requirements.mdx new file mode 100644 index 0000000000..dd0133d6b6 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/deployment/requirements.mdx @@ -0,0 +1,5 @@ +--- +title: Requirements +--- + +including peering agreement diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx similarity index 70% rename from packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx rename to packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx index 9aaefdda6d..1a359b2e6c 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/auth-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx @@ -23,7 +23,7 @@ The following are required when using the `auth` service. ::: - Integration with an identity provider (IdP) -You must also set the [environment variables](/integration/deploy-to-prod/environment-variables#auth) for the `auth` service. +You must also set the environment variables for the `auth` service. ## Incoming client auth requests @@ -35,14 +35,14 @@ When a request comes from a client registered with another instance of Rafiki, t An identity provider (IdP) is a system or service that manages user authentication, identity information, and consent. When you use your Google account credentials to “Sign in with Google” on an app or website, for example, Google is acting as your identity provider. -[Integration](/integration/deploy-to-prod/endpoints/idp) with an IdP is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. +Integration with an [IdP](/integration/before-you-begin#idp) is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. :::note -Rafiki’s [`frontend`](/services-and-aux-packages/frontend-service) service requires an IdP for authentication and user management of your administrators. Out of the box, Rafiki uses Ory Kratos to enable your admins to access the Admin API. Kratos is for internal use and cannot be used for your customer-facing Open Payments authorization server. +Rafiki’s [`frontend`](/integration/deployment/services/frontend-service) service requires an IdP for authentication and user management of your administrators. Out of the box, Rafiki uses Ory Kratos to enable your admins to access the Admin API. Kratos is for internal use and cannot be used for your customer-facing Open Payments authorization server. ::: For more information about interactive grants and how they work with identity providers, review the Grant negotiation and authorization page in the Open Payments docs. ## GraphQL Auth Admin API -The `auth` service exposes a [GraphQL Auth Admin API](/apis/graphql/admin-api-overview#auth-admin-api) to manage auth-related resources, such as Open Payments grants. +The `auth` service exposes a [GraphQL Auth Admin API](/integration/deployment/apis/graphql/admin-api-overview#auth-admin-api) to manage auth-related resources, such as Open Payments grants. diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx similarity index 81% rename from packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx rename to packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx index f5c1d0f9de..d534dbe334 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/backend-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx @@ -22,11 +22,11 @@ The following are required when using the `backend` service. You can use the same database instance of Postgres for the `backend` service, `auth` service, and accounting balances (if not using TigerBeetle). However, separate database schemas are required within the Rafiki instance to maintain boundaries between the objects being managed. ::: -You must also set the [environment variables](/integration/deploy-to-prod/environment-variables#backend) for the `backend` service. +You must also set the environment variables for the `backend` service. ## Open Payments -The `backend` service exposes the Open Payments APIs, which are auth-protected using an opinionated version of the Grant Negotiation and Authorization Protocol (GNAP). Review the [`auth`](/services-and-aux-packages/auth-service) service page for more details about grant authorization and authentication. +The `backend` service exposes the Open Payments APIs, which are auth-protected using an opinionated version of the Grant Negotiation and Authorization Protocol (GNAP). Review the [`auth`](/integration/deployment/services/auth-service) service page for more details about grant authorization and authentication. The `backend` service allows you to manage Open Payments incoming payments, quotes, and outgoing payments. Quotes and outgoing payments call the ILP connector, described in the next section, to send ILP packets. Quoting sends unfulfillable probe packets, for example to determine a transaction’s cost before executing the payment. Outgoing payments send packets as part of executing the payment. @@ -47,8 +47,8 @@ The roles of the connector include: The connector receives incoming packets via HTTP and/or direct calls from within the `backend`. The `backend` includes an HTTP server listening on the configured `CONNECTOR_PORT`. -The amounts within ILP packets are used to update account balances in your accounting database (TigerBeetle or Postgres). Amounts are adjusted based on Rafiki’s configured [exchange rates](/integration/deploy-to-prod/endpoints/exchange-rates) service and the asset used by the sending (outgoing) and receiving (destination) accounts. The total amount received for the STREAM connection is tracked in Redis in order to support STREAM receipts. +The amounts within ILP packets are used to update account balances in your accounting database (TigerBeetle or Postgres). Amounts are adjusted based on Rafiki’s configured [exchange rates](/integration/before-you-begin#exchange-rates) and the asset used by the sending (outgoing) and receiving (destination) accounts. The total amount received for the STREAM connection is tracked in Redis in order to support STREAM receipts. ## GraphQL Backend Admin API -The `backend` service exposes a GraphQL [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to manage assets, peers, wallet addresses, Open Payments resources, and several types of liquidity. +The `backend` service exposes a GraphQL [Backend Admin API](/integration/deployment/apis/graphql/admin-api-overview#backend-admin-api) to manage assets, peers, wallet addresses, Open Payments resources, and several types of liquidity. diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx similarity index 64% rename from packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx rename to packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx index 75597e7d7d..abcaf17060 100644 --- a/packages/documentation/src/content/docs/services-and-aux-packages/frontend-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx @@ -4,16 +4,16 @@ title: Frontend service import { LinkOut } from '@interledger/docs-design-system' -Rafiki’s `frontend` service provides an optional internal admin interface, called the [Rafiki Admin application](/resources/admin-user-guide), for you to manage your Rafiki instance through a Remix web app. This service communicates with the [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to facilitate administrative tasks within Rafiki. +Rafiki’s `frontend` service provides an optional internal admin interface, called the [Rafiki Admin application](/admin/admin-user-guide), for you to manage your Rafiki instance through a Remix web app. This service communicates with the [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to facilitate administrative tasks within Rafiki. ## Requirements The following are required when using the `frontend` service: -- A Rafiki [`backend`](/services-and-aux-packages/backend-service) service up and running to access the Backend Admin API. +- A Rafiki [`backend`](/integration/deployment/services/backend-service) service up and running to access the Backend Admin API. - An identity provider for authentication and user management. Out of the box, the Rafiki Admin application uses Ory Kratos, a secure and fully open-source identity management solution. Kratos will be made optional in a future Rafiki release, allowing you to run your own solution if you so choose. -You must also set the [environment variables](/integration/deploy-to-prod/environment-variables#frontend) for the `frontend` service. +You must also set the environment variables for the `frontend` service. ## Rafiki admin settings diff --git a/packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx b/packages/documentation/src/content/docs/integration/deployment/services/token-introspection.mdx similarity index 100% rename from packages/documentation/src/content/docs/services-and-aux-packages/token-introspection.mdx rename to packages/documentation/src/content/docs/integration/deployment/services/token-introspection.mdx diff --git a/packages/documentation/src/content/docs/integration/get-started.mdx b/packages/documentation/src/content/docs/integration/get-started.mdx index a35eebb172..316b930ef1 100644 --- a/packages/documentation/src/content/docs/integration/get-started.mdx +++ b/packages/documentation/src/content/docs/integration/get-started.mdx @@ -23,15 +23,15 @@ To deploy, integrate, and operate Rafiki with your backend production environmen If you will be deploying to the cloud, then you will need the following additional components in your environment: -- [nginx](/integration/deploy-to-prod/deploy-to-cloud/nginx) (if deploying all containers to a single node) -- [Helm and Kubernetes](/integration/deploy-to-prod/deploy-to-cloud/helm-k8s) (if deploying containers across a distributed environment) +- [nginx](/integration/deployment/prod/nginx) (if deploying all containers to a single node) +- [Helm and Kubernetes](/integration/deployment/prod/helm-k8s) (if deploying containers across a distributed environment) ## Configuration To make your customers’ accounts Interledger-enabled, you must configure your Rafiki instance with these endpoints and services: -- [Exchange Rates](/integration/deploy-to-prod/endpoints/exchange-rates) -- [Webhook Events](/integration/deploy-to-prod/endpoints/webhook-events) -- [Identity Provider](/integration/deploy-to-prod/endpoints/idp) +- [Exchange Rates](/integration/before-you-begin#exchange-rates) +- [Webhook Events](/integration/before-you-begin#webhook-events) +- [Identity Provider](/integration/before-you-begin#idp) -In addition, each account you manage on your ledger must be issued at least one [wallet address](/integration/deploy-to-prod/running-your-instance/creating-wallet-address) to send and receive payments across the Interledger network. +In addition, each account you manage on your ledger must be issued at least one [wallet address](/integration/deployment/peering#create-wallet-address) to send and receive payments across the Interledger network. diff --git a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx b/packages/documentation/src/content/docs/integration/integration-checklist.mdx similarity index 76% rename from packages/documentation/src/content/docs/integration/integrator-checklist.mdx rename to packages/documentation/src/content/docs/integration/integration-checklist.mdx index 6ed56ffeef..6c063629e3 100644 --- a/packages/documentation/src/content/docs/integration/integrator-checklist.mdx +++ b/packages/documentation/src/content/docs/integration/integration-checklist.mdx @@ -1,13 +1,13 @@ --- -title: Integrator checklist +title: Integration checklist --- For ease of reference, here is a list of things to check before you operate Rafiki in production and participate as a node on the Interledger network. - [ ] Are you licensed as a financial entity (e.g. bank, fintech) in the jurisdiction that you are operating in? - [ ] Have you set up of your Rates endpoint? -- [ ] Did you integrate your Rafiki instance with your Identity Provider (IDP) service and configure the user consent screen along with the interactoin flow? +- [ ] Did you integrate your Rafiki instance with your Identity Provider (IDP) service and configure the user consent screen along with the interaction flow? - [ ] Have you selected a strategy to create wallet addresses for your account holders? - [ ] Did you determine which enpoints to expose and how (nginx / apache / K8s)? - [ ] Are your admin services secured from external access? -- [ ] Did you add at least one asset deploy-to-prod/running-your-instance/adding-asset either via the `backend` admin API or the Rafiki Admin application? +- [ ] Did you add at least one [asset](/integration/deploy/peering#add-asset) either via the `backend` admin API or the Rafiki Admin application? diff --git a/packages/documentation/src/content/docs/integration/peering.mdx b/packages/documentation/src/content/docs/integration/peering.mdx new file mode 100644 index 0000000000..f4fc4729e8 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/peering.mdx @@ -0,0 +1,9 @@ +--- +title: Peering or maybe setup +--- + +## Add asset + +## Add peer + +## Create wallet address diff --git a/packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx b/packages/documentation/src/content/docs/overview/account-servicing-entities.mdx similarity index 100% rename from packages/documentation/src/content/docs/intro-to-rafiki/account-servicing-entities.mdx rename to packages/documentation/src/content/docs/overview/account-servicing-entities.mdx diff --git a/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx b/packages/documentation/src/content/docs/overview/overview.mdx similarity index 98% rename from packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx rename to packages/documentation/src/content/docs/overview/overview.mdx index b576ff004c..5b72bb9c71 100644 --- a/packages/documentation/src/content/docs/intro-to-rafiki/overview.mdx +++ b/packages/documentation/src/content/docs/overview/overview.mdx @@ -36,4 +36,4 @@ At its most basic level, Rafiki is comprised of the following three services: - A backend service that allows you to manage business logic, such as account management and balance tracking; facilitates third-party access to accounts via an Open Payments implementation; and simplifies peering with other nodes on the Interledger network. - A front-end web application that allows Rafiki administrators to manage their Rafiki instance. -For more detailed information on the components and architecture of Rafiki, see [Architecture](/components/architecture). +For more detailed information on the components and architecture of Rafiki, see [Architecture](/resources/architecture). diff --git a/packages/documentation/src/content/docs/playground/testnet.mdx b/packages/documentation/src/content/docs/playground/testnet.mdx deleted file mode 100644 index 53cbdead96..0000000000 --- a/packages/documentation/src/content/docs/playground/testnet.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Testnet ---- - -import { LinkOut } from '@interledger/docs-design-system' - -## The Test Network - -The [Local Playground](/playground/overview/) is not the only way to test and try out Rafiki. You can also try the Test Network, which is a Rafiki implementation bundled with a wallet and an e-commerce application available online. As it is a test environment, you can experiment integrating with the Interledger network without using real money. - -### Applications - -The current applications include: - -- An Interledger test wallet -- An e-commerce application - -## Peering with the Test Network - -If you have installed the [Local Playground](/playground/overview/) you can peer your local Rafiki instance with the remote Test Network. Refer to the [autopeering](/playground/autopeering/) page for more details. diff --git a/packages/documentation/src/content/docs/components/architecture.mdx b/packages/documentation/src/content/docs/resources/architecture.mdx similarity index 51% rename from packages/documentation/src/content/docs/components/architecture.mdx rename to packages/documentation/src/content/docs/resources/architecture.mdx index d39d0894e8..ab338eceb4 100644 --- a/packages/documentation/src/content/docs/components/architecture.mdx +++ b/packages/documentation/src/content/docs/resources/architecture.mdx @@ -10,9 +10,9 @@ import { LinkOut } from '@interledger/docs-design-system' Rafiki is a collection of three services that run together. Each one can be scaled horizontally. -- [backend](/services-and-aux-packages/backend-service) - The main service, responsible for handling business logic and external communication -- [auth](/services-and-aux-packages/auth-service) - A reference implementation of an Open Payments authorization server, used for grant authorization and authentication -- [frontend](/services-and-aux-packages/frontend-service) - An optional internal user interface, called the [Rafiki Admin](/resources/admin-user-guide), for you to manage your Rafiki instance +- [backend](/integration/deployment/services/backend-service) - The main service, responsible for handling business logic and external communication +- [auth](/integration/deployment/services/auth-service) - A reference implementation of an Open Payments authorization server, used for grant authorization and authentication +- [frontend](/integration/deployment/services/frontend-service) - An optional internal user interface, called the [Rafiki Admin](/admin/admin-user-guide), for you to manage your Rafiki instance These services rely on four databases. @@ -24,4 +24,4 @@ These services rely on four databases. , used by the `backend` service for accounting balances at the ILP layer - Redis, used by the `backend` service as a cache to share STREAM connection details across processes and by the `auth` service to store session data -An additional package for [token introspection](/services-and-aux-packages/token-introspection) is also included with Rafiki. This is an internal package that requires no action on your part if you’re using Rafiki’s `auth` service. +An additional package for [token introspection](/integration/deployment/services/token-introspection) is also included with Rafiki. This is an internal package that requires no action on your part if you’re using Rafiki’s `auth` service. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx b/packages/documentation/src/content/docs/resources/environment-variables.mdx similarity index 98% rename from packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx rename to packages/documentation/src/content/docs/resources/environment-variables.mdx index 15ceb1f202..45945d1d3a 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/environment-variables.mdx +++ b/packages/documentation/src/content/docs/resources/environment-variables.mdx @@ -20,21 +20,21 @@ If you are running Rafiki via Helm and Kubernetes, then you must update the vari | `ADMIN_PORT` | backend.port.admin | `3001` | Admin API GraphQL Server port | | `AUTH_SERVER_GRANT_URL` | | `undefined` | endpoint on the Open Payments Auth Server to request a grant | | `AUTH_SERVER_INTROSPECTION_URL` | | `undefined` | endpoint on the Open Payments Auth Server to introspect an access token | -| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/playground/autopeering/) is enabled, its server will use this port | +| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/integration/deployment/playground/autopeering/) is enabled, its server will use this port | | `CONNECTOR_PORT` | backend.port.connector | `3002` | port of the ILP connector for for sending packets over ILP over HTTP | | `DATABASE_URL` | backend.postgresql.host, backend.postgresql.port, backend.postgresql.username, backend.postgresql.database, backend.postgresql.password | `postgresql://postgres:password@localhost:5432/development` | Postgres database URL of database storing the resource data; For Helm, these components are provided individually. | -| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/playground/autopeering/). | -| `ENABLE_SPSP_PAYMENT_POINTERS` | | `true` | enables SPSP (/resources/glossary#simple-payments-setup-protocol-spsp/) route | +| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/integration/deployment/playground/autopeering/). | +| `ENABLE_SPSP_PAYMENT_POINTERS` | | `true` | enables SPSP route | | `EXCHANGE_RATES_LIFETIME` | backend.lifetime.exchangeRate | `15_000` | time in milliseconds the exchange rates provided by the ASE via the EXCHANGE_RATES_URL are valid for | | `EXCHANGE_RATES_URL` | backend.serviceUrls.EXCHANGE_RATES_URL | `undefined` | endpoint on the Account Servicing Entity to request exchange rates | | `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` | backend.idempotencyTTL | `86400000` | TTL in milliseconds for idempotencyKey on GraphQL mutations (Admin API). Default: 24hrs | | `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` | | `2000` | TTL in milliseconds for idempotencyKey concurrency lock on GraphQL mutations (Admin API) | | `ILP_ADDRESS` | backend.ilp.address | `undefined` | ILP address of this Rafiki instance | -| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/playground/autopeering/) | +| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/integration/deployment/playground/autopeering/) | | `INCOMING_PAYMENT_EXPIRY_MAX_MS` | | `2592000000` | Maximum milliseconds into the future incoming payments expiry can be set to on creation. Default: 30 days | | `INCOMING_PAYMENT_WORKERS` | backend.workers.incomingPayment | `1` | number of workers processing incoming payment requests | | `INCOMING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that INCOMING_PAYMENT_WORKERS will wait until they check an empty incoming payment request queue again | -| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/playground/autopeering/) | +| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/integration/deployment/playground/autopeering/) | | `KEY_ID` | backend.key.id | `undefined` | this Rafiki instance's client key id | | `LOG_LEVEL` | backend.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | | `NODE_ENV` | backend.nodeEnv | `development` | node environment, `development`, `test`, or `production` | diff --git a/packages/documentation/src/content/docs/resources/get-involved.mdx b/packages/documentation/src/content/docs/resources/get-involved.mdx index 4b7525b2bf..158b20aa1c 100644 --- a/packages/documentation/src/content/docs/resources/get-involved.mdx +++ b/packages/documentation/src/content/docs/resources/get-involved.mdx @@ -8,7 +8,7 @@ import { LinkOut } from '@interledger/docs-design-system' - Begin a new discussion or contribute to existing discussions in the Rafiki GitHub repo. - Join the `interledger.slack.com` workspace and ask any questions you have in the `#rafiki` channel. -- Try [running the system locally](/playground/overview) and ask any questions you have in the #rafiki Slack channel. +- Try [running the system locally](/integration/deployment/playground/overview) and ask any questions you have in the #rafiki Slack channel. For more details about spec contributions and development, visit `contributing.md`. diff --git a/packages/documentation/src/content/docs/resources/grants.mdx b/packages/documentation/src/content/docs/resources/grants.mdx new file mode 100644 index 0000000000..dd12e3eb49 --- /dev/null +++ b/packages/documentation/src/content/docs/resources/grants.mdx @@ -0,0 +1,3 @@ +--- +title: Grants +--- From 9151cffc1f76f9d7adbf0bd36a7f3eb2e1c24b65 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Tue, 27 Aug 2024 10:31:30 +0300 Subject: [PATCH 35/91] docs: fix broken links --- .../documentation/src/content/docs/concepts/interledger.mdx | 2 +- .../documentation/src/content/docs/concepts/open-payments.mdx | 2 +- packages/documentation/src/content/docs/concepts/telemetry.mdx | 2 +- .../content/docs/integration/deployment/playground/overview.mdx | 2 +- .../content/docs/integration/deployment/playground/testnet.mdx | 2 +- .../docs/integration/deployment/services/frontend-service.mdx | 2 +- .../documentation/src/content/docs/integration/get-started.mdx | 2 +- .../src/content/docs/integration/integration-checklist.mdx | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/documentation/src/content/docs/concepts/interledger.mdx b/packages/documentation/src/content/docs/concepts/interledger.mdx index 39da81165a..908f4e2691 100644 --- a/packages/documentation/src/content/docs/concepts/interledger.mdx +++ b/packages/documentation/src/content/docs/concepts/interledger.mdx @@ -12,7 +12,7 @@ At the core of Interledger is the Interledger Protocol (ILP). It’s a request/r Interledger itself is a network of computers that enables sending payments across payment networks. Each computer on the network is called a node. -For two nodes on the Interledger network to exchange ILP packets with one another, the two nodes must be peers. There are a number of [requirements](/integration/before-you-begin#add-peer) that both you and your potential peer must meet in order to form a peering relationship. +For two nodes on the Interledger network to exchange ILP packets with one another, the two nodes must be peers. There are a number of [requirements](/integration/peering#add-peer) that both you and your potential peer must meet in order to form a peering relationship. Since the purpose of peering is to facilitate payments, which often involves extending lines of credit, your peer should be someone you trust. We strongly recommend you and your potential peer define your expectations and outline your agreements in a legally-binding document before you add them as a peer in Rafiki. diff --git a/packages/documentation/src/content/docs/concepts/open-payments.mdx b/packages/documentation/src/content/docs/concepts/open-payments.mdx index 7d545c0f52..84592a4f58 100644 --- a/packages/documentation/src/content/docs/concepts/open-payments.mdx +++ b/packages/documentation/src/content/docs/concepts/open-payments.mdx @@ -31,7 +31,7 @@ We strongly encourage you to familiarize yourself with the Open Payments standar ## Rafiki's `backend` service -Rafiki’s [`backend`](/integration/deployment/servicesbackend-service) service is the main service for handling business logic and external communication. The service is responsible for, among other things, exposing the endpoints of the Open Payments APIs for clients to perform account management tasks. Every request and response is validated against the Open Payments specification. +Rafiki’s [`backend`](/integration/deployment/services/backend-service) service is the main service for handling business logic and external communication. The service is responsible for, among other things, exposing the endpoints of the Open Payments APIs for clients to perform account management tasks. Every request and response is validated against the Open Payments specification. ## Rafiki's auth service diff --git a/packages/documentation/src/content/docs/concepts/telemetry.mdx b/packages/documentation/src/content/docs/concepts/telemetry.mdx index 4a0e37031c..ca3f229971 100644 --- a/packages/documentation/src/content/docs/concepts/telemetry.mdx +++ b/packages/documentation/src/content/docs/concepts/telemetry.mdx @@ -165,7 +165,7 @@ You must deploy your own OTEL Collector that acts as a sidecar container to Rafi Below is an example of a Docker OTEL Collector image and configuration that integrates with Rafiki and sends data to a Prometheus remote write endpoint. -The configuration can be tested in our [Local Playground](/playground/overview) by providing the environment variables in the table above to `happy-life-backend` in the `docker-compose.yml` file. +The configuration can be tested in our [Local Playground](/integration/deployment/playground/overview) by providing the environment variables in the table above to `happy-life-backend` in the `docker-compose.yml` file. #### Docker Compose config diff --git a/packages/documentation/src/content/docs/integration/deployment/playground/overview.mdx b/packages/documentation/src/content/docs/integration/deployment/playground/overview.mdx index d4a04a6f9e..cf8cc3a38f 100644 --- a/packages/documentation/src/content/docs/integration/deployment/playground/overview.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/playground/overview.mdx @@ -225,7 +225,7 @@ You have to go through an interaction flow by clicking on the `redirect` link in #### Admin UI -To manage and view information about the Rafiki instance(s) using the [Rafiki Admin application](/resources/admin-user-guide/), you can navigate to `localhost:3010` (Cloud Nine Wallet) or `localhost:4010` (Happy Life Bank). The Rafiki Admin application runs a Remix app for querying info and executing mutations against the Rafiki Backend [Admin ](https://rafiki.dev/playground/overview/#admin-apis)[API](https://rafiki.dev/playground/overview/#admin-apis). +To manage and view information about the Rafiki instance(s) using the [Rafiki Admin application](/admin/admin-user-guide/), you can navigate to `localhost:3010` (Cloud Nine Wallet) or `localhost:4010` (Happy Life Bank). The Rafiki Admin application runs a Remix app for querying info and executing mutations against the Rafiki Backend [Admin ](https://rafiki.dev/playground/overview/#admin-apis)[API](https://rafiki.dev/playground/overview/#admin-apis). Access to the Rafiki Admin application is managed using Ory Kratos, a secure and fully open-source identity and user management solution. Check it out on GitHub. Since access to the UI is invitation-only, the registration flow is not publicly available. To access the Admin UI, click the registration link provided in the logs during the local environment startup or manually add a new user with the `invite-user` script. diff --git a/packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx b/packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx index 65d9ee166e..e7c3255721 100644 --- a/packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx @@ -17,4 +17,4 @@ The current applications include: ## Peering with the Test Network -If you have installed the [Local Playground](/integration/playground/overview/) you can peer your local Rafiki instance with the remote Test Network. Refer to the [autopeering](/integration/playground/autopeering/) page for more details. +If you have installed the [Local Playground](/integration/deployment/playground/overview/) you can peer your local Rafiki instance with the remote Test Network. Refer to the [autopeering](/integration/deployment/playground/autopeering/) page for more details. diff --git a/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx index abcaf17060..0250097f3f 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx @@ -4,7 +4,7 @@ title: Frontend service import { LinkOut } from '@interledger/docs-design-system' -Rafiki’s `frontend` service provides an optional internal admin interface, called the [Rafiki Admin application](/admin/admin-user-guide), for you to manage your Rafiki instance through a Remix web app. This service communicates with the [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to facilitate administrative tasks within Rafiki. +Rafiki’s `frontend` service provides an optional internal admin interface, called the [Rafiki Admin application](/admin/admin-user-guide), for you to manage your Rafiki instance through a Remix web app. This service communicates with the [Backend Admin API](/integration/deployment/apis/graphql/admin-api-overview#backend-admin-api) to facilitate administrative tasks within Rafiki. ## Requirements diff --git a/packages/documentation/src/content/docs/integration/get-started.mdx b/packages/documentation/src/content/docs/integration/get-started.mdx index 316b930ef1..3035184dbd 100644 --- a/packages/documentation/src/content/docs/integration/get-started.mdx +++ b/packages/documentation/src/content/docs/integration/get-started.mdx @@ -34,4 +34,4 @@ To make your customers’ accounts Interledger-enabled, you must configure your - [Webhook Events](/integration/before-you-begin#webhook-events) - [Identity Provider](/integration/before-you-begin#idp) -In addition, each account you manage on your ledger must be issued at least one [wallet address](/integration/deployment/peering#create-wallet-address) to send and receive payments across the Interledger network. +In addition, each account you manage on your ledger must be issued at least one [wallet address](/integration/peering#create-wallet-address) to send and receive payments across the Interledger network. diff --git a/packages/documentation/src/content/docs/integration/integration-checklist.mdx b/packages/documentation/src/content/docs/integration/integration-checklist.mdx index 6c063629e3..8abd00c393 100644 --- a/packages/documentation/src/content/docs/integration/integration-checklist.mdx +++ b/packages/documentation/src/content/docs/integration/integration-checklist.mdx @@ -10,4 +10,4 @@ For ease of reference, here is a list of things to check before you operate Rafi - [ ] Have you selected a strategy to create wallet addresses for your account holders? - [ ] Did you determine which enpoints to expose and how (nginx / apache / K8s)? - [ ] Are your admin services secured from external access? -- [ ] Did you add at least one [asset](/integration/deploy/peering#add-asset) either via the `backend` admin API or the Rafiki Admin application? +- [ ] Did you add at least one [asset](/integration/peering#add-asset) either via the `backend` admin API or the Rafiki Admin application? From 3640336d121ae18f7e14e50dd92da3fc066a26aa Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:08:44 +0300 Subject: [PATCH 36/91] docs: update byb exchange rates --- .../docs/integration/before-you-begin.mdx | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/packages/documentation/src/content/docs/integration/before-you-begin.mdx b/packages/documentation/src/content/docs/integration/before-you-begin.mdx index 3fa26d30e4..af0fb67e23 100644 --- a/packages/documentation/src/content/docs/integration/before-you-begin.mdx +++ b/packages/documentation/src/content/docs/integration/before-you-begin.mdx @@ -2,8 +2,76 @@ title: Before you begin --- +import { LinkOut } from '@interledger/docs-design-system' + +Needs an overview..............also need to figure out the best order for the sections below. + ## Exchange Rates +To support cross-currency transactions, you must provide Rafiki with an endpoint from where it can fetch current exchange rates. + +Jump to [exchange rate environment variables](#exchange-rate-environment-variables). + +### Rate probes and slippage + +Every Interledger payment is preceded by a rate probe. A rate probe provides a quote that estimates the cost of transferring value over the network, including any fees connector nodes may charge. For the rate probe to be successful, Rafiki needs current exchange rates. + +As exchange rates and fees charged by connectors fluctuate, there will likely be a variance between the estimated amount provided in the quote and the actual amount required when the payment is initiated. This difference is called slippage. + +Rafiki's default slippage is set to `0.01` (1%). This value can be changed to a value between 0 and 1 via the `SLIPPAGE` variable. + +#### Slippage example + +Using the default slippage of `0.01` (1%), the rate probe's quote returns $1.00 USD. A payment of $1.01 USD will be successful. However, the payment will fail if the total, inclusive of exchange rate and network fees, amounts to $1.02 USD or more. + +### Requests to your exchange rates endpoint + +When Rafiki issues a `GET` request to your endpoint, the endpoint must respond with the following. + +| Variable | Type | Description | Required | +| -------- | ---- | ----------- | -------- | +| `base` | String | The asset code represented as an ISO 4217 currency code, e.g. USD | Y | +| `rates` | Object | Object containing `` pairs, e.g. `{EUR: 0.8930}` | Y | +| `rates.`| Number | The exchange rate given `base` and `` | Y | + +We provide an OpenAPI specification for the endpoint, if needed. + +Below is a minimalistic example of a successful (200) request, taken from our mock account servicing entity. + +```json {13} +import type { LoaderFunctionArgs } from '@remix-run/node' +import { json } from '@remix-run/node' +import { CONFIG as config } from '~/lib/parse_config.server' + +export function loader({ request }: LoaderFunctionArgs) { + const base = new URL(request.url).searchParams.get('base') || 'USD' + + return json( + { + base, + rates: config.seed.rates[base] || {} + }, + { status: 200 } + ) +} +``` + +### Exchange rates lifetime + +Specify how long your Rafiki instance will cache exchange rates via the `EXCHANGE_RATES_LIFETIME` variable (default is `15_000` ms). Caching improves performance as Rafiki will not need to request the rates from your endpoint for every payment. + +### Exchange rate environment variables + +The exchange rate environment variables are part of the `backend` service. + +The file that contains your variables varies depending on whether you are running Rafiki via Docker (`docker-compose.yaml`) or via Helm and Kubernetes (`values.yaml` for the Helm chart). + +| Environment variable | Description | +| -------------------- | ----------- | +| `EXCHANGE_RATES_URL` | Your exchange rates endpoint | +| `EXCHANGE_RATES_LIFETIME` | The amount of time Rafiki caches exchange rates, in ms | +| `SLIPPAGE` | The variance allowed between a quote and the actual amount required when a payment is initiated | + ## IDP integration and also flows From 9aa72bb1469c8a9c00d6b6730c20f93450ec1e35 Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:06:25 +0300 Subject: [PATCH 37/91] docs updating before you begin Adding webhook events section Adding page intro --- .../docs/integration/before-you-begin.mdx | 354 +++++++++++++++++- 1 file changed, 339 insertions(+), 15 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/before-you-begin.mdx b/packages/documentation/src/content/docs/integration/before-you-begin.mdx index af0fb67e23..5abe72f507 100644 --- a/packages/documentation/src/content/docs/integration/before-you-begin.mdx +++ b/packages/documentation/src/content/docs/integration/before-you-begin.mdx @@ -4,11 +4,17 @@ title: Before you begin import { LinkOut } from '@interledger/docs-design-system' -Needs an overview..............also need to figure out the best order for the sections below. +import { Mermaid } from '@interledger/docs-design-system' + +There are three key components that you need to set up prior to integrating Rafiki. + +1. A service to provide Rafiki with current [exchange rates](#exchange-rates) +2. A trusted [identity provider](#identity-providers) to handle user authentication +3. A mechanism for handling Rafiki [webhook events](#webhook-events) ## Exchange Rates -To support cross-currency transactions, you must provide Rafiki with an endpoint from where it can fetch current exchange rates. +To support cross-currency transactions, you must provide Rafiki with an endpoint from where it can fetch current exchange rates. Jump to [exchange rate environment variables](#exchange-rate-environment-variables). @@ -16,7 +22,7 @@ Jump to [exchange rate environment variables](#exchange-rate-environment-variabl Every Interledger payment is preceded by a rate probe. A rate probe provides a quote that estimates the cost of transferring value over the network, including any fees connector nodes may charge. For the rate probe to be successful, Rafiki needs current exchange rates. -As exchange rates and fees charged by connectors fluctuate, there will likely be a variance between the estimated amount provided in the quote and the actual amount required when the payment is initiated. This difference is called slippage. +As exchange rates and fees charged by connectors fluctuate, there will likely be a variance between the estimated amount provided in the quote and the actual amount required when the payment is initiated. This difference is called slippage. Rafiki's default slippage is set to `0.01` (1%). This value can be changed to a value between 0 and 1 via the `SLIPPAGE` variable. @@ -28,11 +34,11 @@ Using the default slippage of `0.01` (1%), the rate probe's quote returns $1.00 When Rafiki issues a `GET` request to your endpoint, the endpoint must respond with the following. -| Variable | Type | Description | Required | -| -------- | ---- | ----------- | -------- | -| `base` | String | The asset code represented as an ISO 4217 currency code, e.g. USD | Y | -| `rates` | Object | Object containing `` pairs, e.g. `{EUR: 0.8930}` | Y | -| `rates.`| Number | The exchange rate given `base` and `` | Y | +| Variable | Type | Description | Required | +| -------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `base` | String | The asset code represented as an ISO 4217 currency code, e.g. USD | Y | +| `rates` | Object | Object containing `` pairs, e.g. `{EUR: 0.8930}` | Y | +| `rates.` | Number | The exchange rate given `base` and `` | Y | We provide an OpenAPI specification for the endpoint, if needed. @@ -58,7 +64,7 @@ export function loader({ request }: LoaderFunctionArgs) { ### Exchange rates lifetime -Specify how long your Rafiki instance will cache exchange rates via the `EXCHANGE_RATES_LIFETIME` variable (default is `15_000` ms). Caching improves performance as Rafiki will not need to request the rates from your endpoint for every payment. +Specify how long your Rafiki instance will cache exchange rates via the `EXCHANGE_RATES_LIFETIME` variable (default is `15_000` ms). Caching improves performance as Rafiki will not need to request the rates from your endpoint for every payment. ### Exchange rate environment variables @@ -66,14 +72,332 @@ The exchange rate environment variables are part of the `backend` service. The file that contains your variables varies depending on whether you are running Rafiki via Docker (`docker-compose.yaml`) or via Helm and Kubernetes (`values.yaml` for the Helm chart). -| Environment variable | Description | -| -------------------- | ----------- | -| `EXCHANGE_RATES_URL` | Your exchange rates endpoint | -| `EXCHANGE_RATES_LIFETIME` | The amount of time Rafiki caches exchange rates, in ms | -| `SLIPPAGE` | The variance allowed between a quote and the actual amount required when a payment is initiated | +| Environment variable | Description | +| ------------------------- | ----------------------------------------------------------------------------------------------- | +| `EXCHANGE_RATES_URL` | Your exchange rates endpoint | +| `EXCHANGE_RATES_LIFETIME` | The amount of time Rafiki caches exchange rates, in ms | +| `SLIPPAGE` | The variance allowed between a quote and the actual amount required when a payment is initiated | -## IDP +## Identity providers integration and also flows ## Webhook Events + +Rafiki does not hold user account balances but tracks liquidity within asset, peer, and payment accounts in its own database. To effectively manage liquidity, you need to expose an endpoint that listens for specific events dispatched by Rafiki. These events notify your system of time-sensitive status updates, warnings, and errors. + +When an event occurs in your Rafiki instance, the Rafiki `backend` service sends a POST request to your configured `WEBHOOK_URL` [environment variable](/resources/environment-variables/). Your endpoint must respond with a 200 status code to confirm a successful receipt. + +### Request body + +Each webhook event is sent as JSON payload that follows a similar format: + +| **Attribute** | **Type** | **Description** | **Required?** | +| ------------- | ------------------------- | --------------------------------------------------- | ------------- | +| `id` | String | Unique webhook event ID | Y | +| `type` | [EventType](#event-types) | `EventType` value | Y | +| `data` | Object | Additional data that coincides with the `EventType` | Y | + +### Event types + +The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle. + +| Value | Description | +| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | +| [`incoming_payment.created`](#incoming_paymentcreated) | An incoming payment has been created. | +| [`incoming_payment.completed`](#incoming_paymentcompleted) | An incoming payment is complete and will not accept any additional incoming funds. | +| [`incoming_payment.expired`](#incoming_paymentexpired) | An incoming payment expired and will not accept any additional incoming funds. | +| [`outgoing_payment.created`](#outgoing_paymentcreated) | An outgoing payment was created. | +| [`outgoing_payment.completed`](#outgoing_paymentcompleted) | An outgoing payment completed. | +| [`outgoing_payment.failed`](#outgoing_paymentfailed) | An outgoing payment partially or completely failed. | +| [`wallet_address.not_found`](#wallet_addressnot_found) | A requested wallet address was not found. | +| [`wallet_address.web_monetization`](#wallet_addressweb_monetization) | Web Monetization payments received via STREAM. | +| [`asset.liquidity_low`](#assetliquidity_low) | Asset liquidity has dropped below defined threshold. | +| [`peer.liquidity_low`](#peerliquidity_low) | Peer liquidity has dropped below defined threshold. | + +An OpenAPI specification of the webhook requests and their corresponding data can be found here. + +Additionally, the local playground playground contains example payloads in the Bruno collection that can be used to test a webhook service integration. + +#### Incoming payment events + +BD - Need updated workflow info/overview of incoming payments + +Incoming payment events + +| **Attribute** | **Type** | **Description** | **Required?** | +| ----------------- | -------- | -------------------------------------------------------------------------------------------------- | ------------- | +| `id` | String | Incoming payment ID | **Y** | +| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | **Y** | +| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | +| `completed` | Boolean | True if the incoming payment has completed receiving funds | **Y** | +| `incomingAmount` | Object | The maximum amount that should be paid into the wallet address under this incoming payment | N | +| `receivedAmount` | Object | The total amount that has been paid into the wallet address under this incoming payment | **Y** | +| `metadata` | Object | Additional metadata associated with the incoming payment | N | +| `createdAt` | String | Date-time of creation | **Y** | +| `updatedAt` | String | Date-time of last update | **Y** | +| `expiresAt` | String | Date-time of payment expiration | **Y** | + +##### `incoming_payment.created` + +The `incoming_payment.created` event indicates that an incoming payment was created. No funds are received in your Rafiki instance, so no action is required. This webhook event is informational and allows you to display upcoming incoming payments to your users. + +>ASE: webhook event: incoming payment created + ASE->>ASE: no action required + +`} +/> + +##### `incoming_payment.completed` + +The `incoming_payment.completed` event indicates that an incoming payment was completed, either automatically or manually, and that any funds received into this incoming payment should be withdrawn and credited to the recipient’s account on your ledger. + +In addition, the `CreateIncomingPaymentWithdrawal` supports two-phase transfers. + +Example: An incoming payment was completed and the recipient received **$10**. + +>ASE: webhook event: incoming payment completed,
receivedAmount: $10 + ASE->>R: admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: credit receiver's account with $10 + +`} +/> + +Example: An incoming payment supporting two-phase transfers was completed and received **$10**. + +>ASE: webhook event: incoming payment completed,
receivedAmount: $10 + ASE->>R: admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: credit receiver's account with $10 + ASE->>R: admin API call: PostLiquidityWithdrawal + R->>R: 2-phase transfer completed + +`} +/> + +##### `incoming_payment.expired` + +The `incoming_payment.expired` event indicates that an incoming payment has expired and that any funds previously received for this incoming payment should be withdrawn and credited to the recipient’s account on your ledger. Note that this event is only fired if funds were received for the incoming payment. In cases where the sender did not specify the `incomingAmount` when the `incomingPayment` resource was initially created, the `incoming_payment.expired` event notifies you that no further payments are expected. The primary use case of the `incoming_payment.expired` event to signal the end of any additional payments is a streaming payments example, such as Web Monetization. + +Example: An incoming payment has expired and received **$2.55**. + +>ASE: webhook event: incoming payment expired,
receivedAmount: $2.55 + ASE->>R: admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: credit receiver's account with $2.55 + +`} +/> + +#### Outgoing payment events + +BD - Need updated workflow info/overview of outgoing payments + +Outgoing payment events + + | **Attribute** | **Type** | **Description** | **Required?** | + +|-------------------|----------|----------------------------------------------------------------------------------------------------|---------------| +| `id` | String | Incoming payment ID | **Y** | +| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | **Y** | +| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | +| `state` | String | Outgoing payment state, either `PENDING`, `PROCESSING`, `COMPLETED`, or `EXPIRED` | **Y** | +| `receiver` | String | Wallet address URL of the receiver | **Y** | +| `debitAmount` | Object | Amount to send (fixed send) | **Y** | +| `sentAmount` | Object | Amount to receive (fixed receive) | **Y** | +| `metadata` | Object | Additional metadata associated with the outgoing payment | N | +| `createdAt` | String | Date-time of creation | **Y** | +| `updatedAt` | String | Date-time of last update | **Y** | +| `expiresAt` | String | Date-time of payment expiration | **Y** | +| `error` | String | ?? | N | +| `stateAttempts` | Integer | ?? | **Y** | +| `balance` | String | ?? | **Y** | +| `peerId` | String | ?? | N | + +##### `outgoing_payment.created` + +The `outgoing_payment.created` event indicates that an outgoing payment was created and is awaiting liquidity. You should verify the sender’s account balance and perform other verifications before funding or canceling the outgoing payment in case the sender has insufficient funds in their account. If the outgoing payment is not fulfilled, you can cancel it. Otherwise, you must put a hold on the sender’s account and deposit the funds into Rafiki. + +Example: An outgoing payment for **$12** has been created. + +>ASE: webhook event: outgoing payment created,
debitAmount: $12 + ASE->>ASE: check if account has enough balance + alt Account has enough balance + ASE->>ASE: put hold of $12 on sender's account + ASE->>R: admin API call: DepositOutgoingPaymentLiquidity + end + alt Account does not have enough balance + ASE->>R: admin API call: CancelOutgoingPayment
reason: Not enough balance + end + +`} +/> + +##### `outgoing_payment.completed` + +The `outgoing_payment.completed` event indicates that an outgoing payment has successfully sent as many funds as possible to the receiver against the associated incoming payment. You should withdraw any excess liquidity from that outgoing payment in Rafiki that arises from differences between the sent and received amounts and use it as you see fit. One option would be to return it to the sender. Another option is to retain the excess liquidity as a service fee. Furthermore, you should remove the hold on the sender’s account and debit it. + +In addition, the `CreateOutgoingPaymentWithdrawal` supports [two-phase transfers](https://rafiki.dev/reference/glossary/#two-phase-transfers). + +Example: An outgoing payment amount for **$12** has been completed. **$11.50** were sent. You keep **$0.50** as fees. + +>ASE: webhook event: outgoing completed,
debitAmount: $12, sentAmount:$11.50 + ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal + ASE->>ASE: remove the hold and deduct $12 from the sender's account,
credit ASE's account with $0.50 + +`} +/> + +Example: An outgoing payment supporting two-phase transfers for **$12** has been completed. **$11.50** were sent. You keep **$0.50** as fees. + +>ASE: webhook event: outgoing completed,
debitAmount: $12, sentAmount:$11.50 + ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal + ASE->>ASE: remove the hold and deduct $12 from the sender's account,
credit ASE's account with $0.50 + ASE->>R: admin API call: PostLiquidityWithdrawal + R->>R: 2-phase transfer completed + +`} +/> + +##### `outgoing_payment.failed` + +The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was unsuccessful. You should withdraw any remaining liquidity from that outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` was 0), you should remove the hold from the sender’s account. If the payment failed partially, you should remove the hold from the sender’s account and debit it with the amount sent. Considering the discrepancy between the quote amount and the amount sent, you should refrain from taking a sending fee. + +Example: An outgoing payment for **$12** has failed. **$8** were sent. + +>ASE: webhook event: outgoing failed,
debitAmount: $12, sentAmount:$8 + ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal + ASE->>ASE: remove the hold and deduct $8 from the sender's account + +`} +/> + +#### Wallet address events + +BD - Need updated workflow info/overview of wallet address events + +##### `wallet_address.web_monetization` + +The `wallet_address.web_monetization` event indicates that a wallet address received Web Monetization payments via the ILP STREAM protocol. You should withdraw that liquidity from the wallet address in Rafiki and credit the receiver’s account on your ledger. + +Example: A wallet address received **$0.33** + +>ASE: webhook event: wallet address web monetization,
receivedAmount: $0.33 + ASE->>R: admin API call: CreateWalletAddressWithdrawal + ASE->>ASE: credit receiver's account with $0.33 + +`} +/> + +##### `wallet_address.not_found` + +The `wallet_address.not_found` event indicates that a wallet address was requested via the Open Payments Wallet address server API, but it doesn’t exist in your Rafiki instance. When receiving this event, you can look up the associated account in your system and create a wallet address. The initial request for the wallet address will succeed if you create it within the configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. + +Example: The wallet address `https://example-wallet.com/carla_garcia` was requested but does not exist yet. + +>ASE: webhook event: wallet address not found,
wallet address: https://example-wallet.com/carla_garcia + ASE->>R: admin API call: CreateWalletAddress
url: https://example-wallet.com/carla_garcia,
public name: Carla Eva Garcia + +`} +/> + +#### Liquidity events + +BD - Need updated workflow info/overview of asset/peer liquidity events + +##### `asset.liquidity_low` + +The `asset.liquidity_low` event indicates that an asset’s liquidity has dropped below a predefined liquidity threshold. When receiving this event, you should check if you already have or can acquire additional liquidity for that specific asset and, if so, deposit it in Rafiki. Cross-currency transfers will fail if you do not increase that asset’s liquidity in Rafiki. + +Example: The asset liquidity for USD (scale: 2) drops below **$100.00**. + +>ASE: webhook event: liquidity (asset) low,
asset: USD (scale: 2, id: "abc") + ASE->>R: admin API call: DepositAssetLiquidity + +`} +/> + +##### `peer.liquidity_low` + +The `peer.liquidity_low` event indicates that a peer’s liquidity has dropped below a predefined liquidity threshold. When receiving this event, you must decide if you want to extend that peer’s credit line or whether the peer must settle first and then extend a new line of credit to that peer. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. + +Example: The peer liquidity for Happy Life Bank drops below **$100.00**. + +>ASE: webhook event: liquidity (peer) low,
peer: Happy Life Bank (asset: "USD", scale: 2, id: "abc") + ASE->>R: admin API call: DepositPeerLiquidity + +`} +/> + +### Error handling + +If an error occurs when Rafiki sends a webhook event (i.e., a non-200 status is returned or the request timed out), Rafiki will retry the webhook requests at increasing intervals until a 200 status is returned. The first retry is after 10 seconds, the second after 20 more, the next after 30 more, etc. The maximum number of retries for webhook events is configured via the `WEBHOOK_MAX_RETRY` environment variable. + +Additionally, the timeout for webhook requests is configured with the `WEBHOOK_TIMEOUT` environment variable. + +### Best Practices + +#### Duplicate Events + +The `id` in the webhook event payload is a unique UUID, which your system can use to determine whether the event has been received previously, preventing duplicate event processing. + +#### Asynchronous Handling + +Consider using a worker to process received webhook events, especially if requests to credit/debit user accounts are lengthy processes. Doing so allows the server to process events at a rate suitable for the system and reduce the number of failed/retried webhook events since the webhook event listener can immediately reply with a successful 200 status. From e301242c8c11761f112c66612896d8d5e6e14604 Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:11:57 +0300 Subject: [PATCH 38/91] docs broken link fix Updating 2 links that broke after a heading change --- .../docs/integration/deployment/services/auth-service.mdx | 2 +- .../documentation/src/content/docs/integration/get-started.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx index 1a359b2e6c..056b53c3cc 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx @@ -35,7 +35,7 @@ When a request comes from a client registered with another instance of Rafiki, t An identity provider (IdP) is a system or service that manages user authentication, identity information, and consent. When you use your Google account credentials to “Sign in with Google” on an app or website, for example, Google is acting as your identity provider. -Integration with an [IdP](/integration/before-you-begin#idp) is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. +Integration with an [IdP](/integration/before-you-begin#identity-providers) is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. :::note Rafiki’s [`frontend`](/integration/deployment/services/frontend-service) service requires an IdP for authentication and user management of your administrators. Out of the box, Rafiki uses Ory Kratos to enable your admins to access the Admin API. Kratos is for internal use and cannot be used for your customer-facing Open Payments authorization server. diff --git a/packages/documentation/src/content/docs/integration/get-started.mdx b/packages/documentation/src/content/docs/integration/get-started.mdx index 3035184dbd..064b7bcffe 100644 --- a/packages/documentation/src/content/docs/integration/get-started.mdx +++ b/packages/documentation/src/content/docs/integration/get-started.mdx @@ -32,6 +32,6 @@ To make your customers’ accounts Interledger-enabled, you must configure your - [Exchange Rates](/integration/before-you-begin#exchange-rates) - [Webhook Events](/integration/before-you-begin#webhook-events) -- [Identity Provider](/integration/before-you-begin#idp) +- [Identity Provider](/integration/before-you-begin#identity-providers) In addition, each account you manage on your ledger must be issued at least one [wallet address](/integration/peering#create-wallet-address) to send and receive payments across the Interledger network. From 8cf3ff2b88e4760b1c8327395043a152889bd67e Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Tue, 27 Aug 2024 22:43:42 +0300 Subject: [PATCH 39/91] docs: more updates --- packages/documentation/astro.config.mjs | 12 +- ...terledger.png => concepts-interledger.png} | Bin ...ng => concepts-telemetry-architecture.png} | Bin .../public/img/rafiki-architecture.png | Bin 378769 -> 487952 bytes .../src/content/docs/admin/manage-assets.mdx | 94 ++++++ .../content/docs/admin/manage-liquidity.mdx | 303 ++++++++++++++++- .../src/content/docs/admin/manage-peering.mdx | 110 +++++++ .../docs/admin/manage-wallet-addresses.mdx | 180 +++++++++++ .../src/content/docs/concepts/interledger.mdx | 2 +- .../src/content/docs/concepts/telemetry.mdx | 6 +- .../docs/integration/before-you-begin.mdx | 116 ++++++- .../endpoints/exchange-rates.mdx | 111 ------- .../endpoints/webhook-events.mdx | 271 ---------------- .../running-your-instance/adding-peer.mdx | 113 ------- .../grants-management.mdx | 5 - .../running-your-instance/keys-management.mdx | 5 - .../managing-liquidity.mdx | 306 ------------------ .../content/docs/resources/architecture.mdx | 12 +- .../src/content/docs/resources/grants.mdx | 3 - 19 files changed, 804 insertions(+), 845 deletions(-) rename packages/documentation/public/img/{components-interledger.png => concepts-interledger.png} (100%) rename packages/documentation/public/img/{components-telemetry-architecture.png => concepts-telemetry-architecture.png} (100%) create mode 100644 packages/documentation/src/content/docs/admin/manage-assets.mdx create mode 100644 packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx delete mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx delete mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx delete mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx delete mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/grants-management.mdx delete mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/keys-management.mdx delete mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx delete mode 100644 packages/documentation/src/content/docs/resources/grants.mdx diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index b19051f983..f512d7e8a8 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -177,6 +177,10 @@ export default defineConfig({ label: 'Rafiki Admin', link: '/admin/admin-user-guide' }, + { + label: 'Manage assets', + link: '/admin/manage-assets' + }, { label: 'Manage liquidity', link: '/admin/manage-liquidity' @@ -192,6 +196,10 @@ export default defineConfig({ { label: 'Manage grants', link: '/admin/manage-grants' + }, + { + label: 'Manage wallet addresses', + link: '/admin/manage-wallet-addresses' } ] }, @@ -211,10 +219,6 @@ export default defineConfig({ label: 'Environment variables', link: '/resources/environment-variables' }, - { - label: 'Grants', - link: '/resources/grants' - }, { label: 'Get involved', link: '/resources/get-involved' diff --git a/packages/documentation/public/img/components-interledger.png b/packages/documentation/public/img/concepts-interledger.png similarity index 100% rename from packages/documentation/public/img/components-interledger.png rename to packages/documentation/public/img/concepts-interledger.png diff --git a/packages/documentation/public/img/components-telemetry-architecture.png b/packages/documentation/public/img/concepts-telemetry-architecture.png similarity index 100% rename from packages/documentation/public/img/components-telemetry-architecture.png rename to packages/documentation/public/img/concepts-telemetry-architecture.png diff --git a/packages/documentation/public/img/rafiki-architecture.png b/packages/documentation/public/img/rafiki-architecture.png index d5cd564bfe9b9592d696f88ad10e180b048699bf..691ded0bbb317c44ac35a5cef49114a6e190c478 100644 GIT binary patch literal 487952 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
  • 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 z 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�ad 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⪼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�B;OLpVkiey8^s4G#e*>*(&pvB0WEeeCAa+p3N z>^_&9=4)=5RAjE|bKmAe5c@0Z_A%uOgS&Xq|A^^gtH5=d(-lre{Q4iV|!!MjnQKq!4+QR?g1Dw zc>p=2$d!34&Y~k>U6;$j;smqS*O5Vou>;s>REcz0_tgs_rW%#9@>Qo&EM>EhXFB3@ z#A(P8OIb)_3g-{p&w#=mRvSqj(oUDBr^B^Y_*w~>o|`FCd_sKk$B6Xi;rwBTJNJtT z6~2`K+@}VU(aM5#=rMXwONBf|<72`{;tZ=-Z}~h|Xx{KB#S6c-b}GnyjH@7~a1V>Q z-y8Skjd}jXvoiC?2AY@89#lZ2Zh`k<7sQ7TLC{%`lpKJ6mZ(L#+W%;vw5b@?e;{`0 z&zpL;(BHG~drU?d4sZoU33b9fhZz$x)g-&YReVK7S=d7F?_%A#?^MvJ)dX1gA_Y<1i%?D8XhL3C3kWotr&b3mo zwb*P4GAOzU_H1-l9Y8IBYm+=U1isz%7?@HXELU&{?tvN;*PtsA$xyitzN2y=562)z#MoOvqI6o8+bpUM|xLs2Fa} z@7~_n4u>)+tB@n+t!2&^VZOkjdodMgj<$Bo^fL&iWV4P(xL~kq0kczXit&AVTI$_7yuW z_1;;1991)Ly|YIoX5<2XH_oTd*!PT#3uP5-PfxV;cH(7B)Wv+}W{eh7f>WMZr#O}- z#4}f!DivTgua)szinO1A}stY(=@0r!P zOq3l?^}mPM6trf_a0{!p3$i&VVIM=-n- zL?*S{7nKh>J;acuA_yVTmxOBzF(~8jPSu!jtJyHMC9U2F^Y|b;D<{S)OUy0*nw4?; zOT)WrS8Sk0vYbw2O74NN?c$<5tl46Yh|5-wK(km>UdS@1oB01 zIMsx-bOhv)0g(Gf=HWFnc$Mq&@Fy~cZg^;+{ zryAdl4->^w}%;Hx{C;w&KeN z7>lY5ze2~wUb_9>Srxj=cz%IFTVacylz$&6Gn|<=x;=UG3&MUN7AV0y=v=E6yS&HJ zSOfj=S+QYKj%~r(4E9JA19RXRMpo99`|Q4ntQ>Cz-g}1!ca9yMm=zj3#v52(>1O%$ z>SylE(tQDpLfLEYB4^y?js%Pwp3Ey3G)N4}S1Ukj$|P+v2-+8&1Z<#(no+}(a5+Sj ziHO|4er`~Qu}ZbhI35VJ(KzzEi_LL@Q7PI#W7fHBalN)`cU0+P#kNy*3T|0N{EJSt1^b`S_^UOO z*`zqygij?6sQAWEas*z-Tfi1F*s|gch}>U!5&h7S>TjrUTS@L0bsNBR%)j4+vC|1u ztN6Ez!b`tYH#=IBmZ|mMd7LoCyC=qo7warfH~w8Ka$a1n(It*$$B14~X=in%Hqfo+ z{-T4t@QpJ~igI!?Yhf6zs;rNi-b>Py;Hn%ave1AJvvOy42dx;-`W1-L@kc3oJ!C3H z^|%|{`jvN)+2Gb*u`qpw(#HyggFd7oaiMmyk4O*SGMOxIX-J}FLnpqHzcQlvRBdv; z-|k~PLy#D|MXT*0yfv&KI1VLSD&sOpqqd*Cpd{cpD}v)uXXGOV<|FptiQit-`ay0C$(r6PFAmk=B>ED2*wkW)SlNX4W32aM5VvW$KK+|t)rR=I-R*$(>z9X_>P7l1Up2TXEp5==JX@0Cq;UAdt6sPI zyB@vU784)CP3vuHek$@}DJ^8EsE=3YdNY~G9EA&ynY5U*0oB>wr^KjF&4zZ%xxKb6 zUhQyOxzB7cKY1V*`$!OV5B9F{Mq>#&+@UqG62JWy33 z_+tIq_N zbLIxy7l0x;`YRNbA}chDP9Ro;JBt#VuL!s3Qfb&02LC(?St~1c?O=C2{0a8PX1eAd zxJ1KTwJ|�OaJuY~xSYJYaU-Z0)ZHPIKXXqR$A8N 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�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

    K?=Wb*P8gN@_b-Hp=sZi`N7mx@)u#WJ8 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

    4`s`g{;Z5j&IVa%TYj?%50Y3$QLI0{--= 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 4217 currency code where available | “USD” | +| `assetScale` | Integer | Difference in order of magnitude between the standard unit and a fractional unit | 2 | + +To convert from an asset to a currency amount that is more human-readable, apply the following formula: + +$currencyAmount = \frac{value}{10^{assetScale}}$ + +Using the example from the table above, our formula looks like this: + +$\frac{10000}{10^2} =100.00$ USD + +## Add an asset using the Backend Admin API + +Rafiki’s Backend Admin API implements a GraphQL interface. Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts; a query and an object containing query variables. + +To add US dollars, for example, as an asset type to your Rafiki instance, call the `CreateAsset` mutation and pass the `input` parameters for the asset `code`, represented by its ISO 4217 currency code (USD), and scale variables as follows: + + + +```graphql +// Query: + +mutation CreateAsset($input: CreateAssetInput!) { + createAsset(input: $input) { + code + success + message + asset { + id + code + scale + } + } +} + + +// Query Variables: + +{ + "input": { + "code": "USD", + "scale": 2 + } +} + +``` + + + + + +```graphql +{ + "data": { + "createAsset": { + "code": "200", + "success": true, + "message": "Created Asset", + "asset": { + "id": "b3dffeda-1e0e-47d4-82a3-69b1a622eeb9", + "code": "USD", + "scale": 2 + } + } + } +} + + +``` + + + +## Add an asset using the Rafiki Admin application + +Alternatively, assets can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/integration/deployment/playground/overview/#running-the-local-environment). + +See the [Rafiki Admin application user guide](/admin/admin-user-guide/#assets) for more information on adding assets. diff --git a/packages/documentation/src/content/docs/admin/manage-liquidity.mdx b/packages/documentation/src/content/docs/admin/manage-liquidity.mdx index 63d8534bf7..f7c49ac9da 100644 --- a/packages/documentation/src/content/docs/admin/manage-liquidity.mdx +++ b/packages/documentation/src/content/docs/admin/manage-liquidity.mdx @@ -2,4 +2,305 @@ title: Manage liquidity --- -`https://deploy-preview-2875--brilliant-pasca-3e80ec.netlify.app/integration/deploy-to-prod/running-your-instance/managing-liquidity/` +import { LinkOut } from '@interledger/docs-design-system' + +As an implementation of the Interledger Protocol, Rafiki provides [accounting](/concepts/accounts-transfers-liquidity) between transacting parties but doesn’t handle settlement. You and the account servicing entities you decide to peer with must agree on the means and how often you will settle your accounts. Consequently, Rafiki can manage the liquidity used to fund payments made through the Interledger network. + +## Add liquidity via GraphQL + +Liquidity can be managed in Rafiki through the [`backend`](/integration/deployment/services/backend-service/) Admin API, which implements a GraphQL interface, or via the [Rafiki Admin application](/admin/admin-user-guide). Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts: a query and an object containing query variables. + +As Rafiki supports several types of liquidity, we’ll cover the typical scenarios you’ll need to manage. + +:::note +You must provide the `idempotencyKey` when calling mutations related to liquidity. This key allows the safe retrying of requests without multiple operations. It should be a unique key, typically a V4 UUID. For more information, refer to Rafiki’s idempotency. +::: + +## Asset Liquidity + +Asset liquidity specifies the amount of value denominated in an asset you have previously added to your Rafiki instance, which Rafiki has at its disposal to send or forward Interledger packets. Asset liquidity increases if packets denominated in the asset are received and decreases if your Rafiki instance sends packets denominated in the asset. The amount is always non-negative. + +You should define and adjust the asset liquidity based on your risk tolerance. + +### Example + +You’ve configured your Rafiki instance with two assets, EUR and USD, with an asset scale of 0. The EUR liquidity is 10, and the USD liquidity is 50. With liquidity support for these two assets, your Rafiki instance can function as a connector node within the Interledger network and provide currency exchange between a sender sending a payment in EUR and a recipient receiving the payment in USD. + +In a cross-currency transaction, your Rafiki instance would receive packets totaling 10 EUR and send packets worth 11 USD. The EUR liquidity would be increased to 20 EUR, and the USD liquidity would be reduced to 39 USD. + +If your Rafiki instance were to receive 50 EUR, but needed to send 55 USD, the transaction would fail because your instance does not have enough USD liquidity. + +### Deposit Asset Liquidity + +You can deposit asset liquidity via the `DepositAssetLiquidity` mutation: + +```sh +mutation +DepositAssetLiquidity($input:DepositAssetLiquidityInput!) { + depositAssetLiquidity(input:$input) { + code + success + message + error + } +} +``` + +The following are example `input` parameters for the `DepositAssetLiquidity` mutation query above. + +```sh +{ "input": { + "id":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "assetId":"7b8b0f65-896d-4403-b7ba-2e24bf20eb35", + "amount":"100", + "idempotencyKey":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f" + } +} +``` + +### Withdraw Asset Liquidity + +You can withdraw asset liquidity via the `CreateAssetLiquidityWithdrawal` mutation: + +```sh +mutation +CreateAssetLiquidityWithdrawal( + $input:CreateAssetLiquidityWithdrawalInput! +) { + createAssetLiquidityWithdrawal(input:$input) { + code + success + message + error + } +} +``` + +The following are example `input` parameters for the `CreateAssetLiquidityWithdrawal` mutation query above. + +```sh +{"input": { + "id":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "assetId":"7b8b0f65-896d-4403-b7ba-2e24bf20eb35", + "amount":"100", + "idempotencyKey":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "timeoutSeconds":0} +} +``` + +## Peer Liquidity + +Peer liquidity is the line of credit denominated in the asset of the peering relationship in Rafiki that you extend to your respective peer. You must determine how much credit you will extend in your peering agreement, which depends on how much you trust the peer. If peer liquidity is insufficient, Rafiki cannot initiate payments to that peer. Once peer liquidity is used up, you should settle with your peer and reset their peer liquidity. + +:::note +You must decide whether to secure liquidity with your peers by extending credit or requiring them to pre-fund your accounts. Those agreements must be made before setting up peering relationships in Rafiki and are not managed through Interledger or Rafiki. +::: + +### Example + +A configured peer, _Cloud Nine Wallet,_ has a peer liquidity of 100 USD. Your Rafiki instance can send packets up to 100 USD to wallet addresses issued by _Cloud Nine Wallet_. Once that liquidity is used up, you should settle with _Cloud Nine Wallet_ and reset their liquidity to 100 USD. + +### Deposit Peer Liquidity + +You can add liquidity for a particular peer via the `DepositPeerLiquidity` mutation. + +```sh +mutation DepositPeerLiquidity($input:DepositPeerLiquidityInput!) { + depositPeerLiquidity(input:$input) { + code + success + message + error} +} +``` + +The following are example `input` parameters for the `DepositPeerLiquidity` mutation query above. + +```sh +{"input": {"id":"a09b730d-8610-4fda-98fa-ec7acb19c775", + "peerId":"73158598-2e0c-4973-895e-aebd115af260", + "amount":"1000000", + "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", + "timeoutSeconds":0} +} +``` + +### Withdraw Peer Liquidity + +In case you want to reduce your peer’s credit line, you can withdraw peer liquidity via the `CreatePeerLiquidityWithdrawal` mutation: + +```sh +mutation CreatePeerLiquidityWithdrawal( + $input:CreatePeerLiquidityWithdrawalInput! +) { + createPeerLiquidityWithdrawal(input:$input) { + code + success + message + error} +} +``` + +The following are example `input` parameters for the `CreatePeerLiquidityWithdrawal` mutation query above. + +```sh +{ +"input": {"id":"421fae87-9a59-4217-9ff8-faf55ffab9c6", +"peerId":"73158598-2e0c-4973-895e-aebd115af260", +"amount":"100", +"timeoutSeconds":0 +} +} +``` + +## Payment Liquidity + +When Open Payments incoming or outgoing payments are created, your Rafiki instance creates a liquidity account within the accounting database. Liquidity must be deposited into an outgoing payment before the payment can be processed. Rafiki will notify you to deposit liquidity via the `outgoing_payment.created` webhook event. Similarly, packets received for an incoming payment increase its liquidity account. Rafiki will notify you to withdraw that liquidity via the `incoming_payment.completed` webhook event. + +### Incoming payment + +You can withdraw incoming payment liquidity via the `CreateIncomingPaymentWithdrawal` mutation query: + +```sh +mutation CreateIncomingPaymentWithdrawal( + $input:CreateIncomingPaymentWithdrawalInput! +) { + createIncomingPaymentWithdrawal(input:$input) { + code + error + message + success + } +} +``` + +The following are example `input` parameters for the `CreateIncomingPaymentWithdrawal` mutation query above. + +```sh +{ "input": {"incomingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052, "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", +"timeoutSeconds":0 + } +} +``` + +### Outgoing payment + +You can deposit outgoing payment liquidity via the `DepositOutgoingPaymentLiquidity` mutation query: + +```sh +mutation DepositOutgoingPaymentLiquidity( + $input:DepositOutgoingPaymentLiquidityInput!) +{ + depositOutgoingPaymentLiquidity(input:$input) { + code + error + message + success + } +} +``` + +The following are example `input` parameters for the `DepositOutgoingPaymentLiquidity` mutation query above. + +```sh +{ + "input":{ + "outgoingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775" + } +} +``` + +You can withdraw outgoing payment liquidity via the `CreateOutgoingPaymentWithdrawal` mutation: + +```sh +mutation +CreateOutgoingPaymentWithdrawal +( + $input:CreateOutgoingPaymentWithdrawalInput!) { + createOutgoingPaymentWithdrawal +(input:$input) { + code + error + message + success +} +} +``` + +The following are example `input` parameters for the `CreateOutgoingPaymentWithdrawal` mutation query above. + +```sh +{"input": { + "outgoingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", + "timeoutSeconds":0 + } +} +``` + +## Two-phase withdrawals + +Rafiki supports two-phase withdrawals via the `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` mutations. When a withdrawal liquidity transaction is requested with a non-zero `timeout` value (zero denotes absence of a timeout), the transfer will be created as a two-phase transfer. If the timeout interval passes before the transfer is either posted or voided, the transfer expires and the full amount is returned to the original account. + +- `PostLiquidityWithdrawal`: Withdrawals with timeouts greater than 0 are processed as two-phase transfers and committed via this mutation. + +- `VoidLiquidityWithdrawal`: Withdrawals with timeouts greater than 0 are processed as two-phase transfers and are rolled back via this mutation. + +The following withdrawal transactions supports two-phase transfers: + +- Asset liquidity withdrawal +- Wallet address withdrawal +- Peer liquidity withdrawal +- Incoming payment withdrawal +- Outgoing payment withdrawal + +### Examples + +You can post a successful transfer via the `PostLiquidityWithdrawal` mutation query: + +```sh +mutation +PostLiquidityWithdrawal($input:PostLiquidityWithdrawalInput!) {postLiquidityWithdrawal +( +input:$input) { + code + error + message + success} +} +``` + +The following are example `input` parameters for the `PostLiquidityWithdrawal` mutation query above. + +```sh +{ + "input": { + "withdrawalId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775"} +} +``` + +You can void an unsuccessful transfer via the `VoidLiquidityWithdrawal` mutation query: + +```sh +mutation +VoidLiquidityWithdrawal($input:VoidLiquidityWithdrawalInput!) { + voidLiquidityWithdrawal +(input:$input) { + code + error + message + success} +} +``` + +The following are example `input` parameters for the `VoidLiquidityWithdrawal` mutation query above. + +```sh +{"input": { + "withdrawalId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", +"idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775" + } +} +``` diff --git a/packages/documentation/src/content/docs/admin/manage-peering.mdx b/packages/documentation/src/content/docs/admin/manage-peering.mdx index 3940adfbe6..66cbc8b009 100644 --- a/packages/documentation/src/content/docs/admin/manage-peering.mdx +++ b/packages/documentation/src/content/docs/admin/manage-peering.mdx @@ -1,3 +1,113 @@ --- title: Manage peering relationships --- + +import { LinkOut } from '@interledger/docs-design-system' + +import { CodeBlock } from '@interledger/docs-design-system' + +## Prerequisites + +To add a peer and send Interledger payments you and the account servicing entity (ASE) you intend to peer with must both: + +- Run an implementation of an [Interledger connector](/integration/deployment/services/backend-service#interledger-connector) (ideally Rafiki). +- Agree on an [asset](/concepts/accounts-transfers-liquidity#assets) for the peering relationship. You can set up multiple peering relationships with the same peer based on different assets. At least one asset shared by you and your peer must be added to your Rafiki instance prior to setting up the peering relationship. +- Agree on a `maxPacketAmount` value, which specifies how many packets a payment is split into. +- Communicate your respective static Interledger (ILP) addresses. +- Communicate a connection endpoint for the other peer to send packets to. +- Exchange `auth` tokens for the connection endpoint. +- Agree on a settlement mechanism (a means of paying one another for the successful forwarding and delivery of packets), which is outside the scope of Interledger and Rafiki. + +Optionally, you may also deposit an initial liquidity for your peer. + +## Add a peer using the Backend Admin API + +Rafiki’s Backend Admin API implements a GraphQL interface. Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts; a query and an object containing query variables. + +To add a peer to your Rafiki instance call the `CreatePeer` mutation query and pass the query variables for the following: + +| Query parameters | Description | Required | +| -------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -------- | +| `assetID` | the ID of the asset that you and your peer will use to ultimately settle your net obligations outside of Interledger. | Y | +| `staticILPaddress` | Your peer’s static ILP address (the following example uses `g.othergreatwallet`) | Y | +| `name` | Your peer’s name (the following example uses “The Other Great Wallet”) | Y | +| `http.incoming.authTokens` | The token your peer will use to present and connect to and send packets to your Rafiki instance. | Y | +| `http.outgoing.endpoint` | Your peer’s connector endpoint. By default it is on local port 0.0.0.0:3002 | Y | +| `http.outgoing.authtoken` | The token that you will use to present to your peer and connect to and send packets to their Rafiki instance. | Y | +| `initialLiquidity` | Initial amount of liquidity to deposit for peer. Liquidity can also be deposited using the `DepositPeerLiquidity` mutation. | N | + + + +```graphql +// Query: + +mutation CreatePeer($input: CreatePeerInput!) { + createPeer(input: $input) { + code + success + message + peer { + id + asset { + code + scale + } + staticIlpAddress + name + } + } +} + + +// Query Variables (substitute the asset ID from the “create asset” response for INSERT_ASSET_ID): + +{ + "input": { + "staticIlpAddress": "g.othergreatwallet", + "name": "The Other Great Wallet" + "http": { + "incoming": {"authTokens": ["mytoken"]}, + "outgoing": {"endpoint": "ilp.othergreatwallet.com", "authToken": "theirtoken"} + }, + "assetId": "INSERT_ASSET_ID", + "initialLiquidity": + } +} + +``` + + + + + +```graphql +{ + "data": { + "createPeer": { + "code": "200", + "success": true, + "message": "Created ILP Peer", + "peer": { + "id": "480ef339-7842-4501-a905-923fc1339cef", + "asset": { + "code": "USD", + "scale": 2 + }, + "staticIlpAddress": "g.othergreatwallet", + "name": "The Other Great Wallet" + } + } + } +} + + + +``` + + + +## Add a peer using the Rafiki Admin application + +Alternatively, a peer can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/integration/deployment/playground/overview/#running-the-local-environment). + +See the [Rafiki Admin application user guide](/admin/admin-user-guide/#peers) for more information on adding peers. diff --git a/packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx b/packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx new file mode 100644 index 0000000000..3762d2a2db --- /dev/null +++ b/packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx @@ -0,0 +1,180 @@ +--- +title: Manage wallet addresses +--- + +import { LinkOut } from '@interledger/docs-design-system' + +import { CodeBlock } from '@interledger/docs-design-system' + +To allow your account holders the ability to send and receive payments via the Open Payments APIs, you must create at least one wallet address for each account. The wallet address serves as a standardized identifier for a payment account. + +You can create wallet addresses for your account holders using the Backend Admin API. Note that at least one asset must be created before the wallet address is created. The `assetId` of the asset must be provided as an input variable when issuing the GraphQL mutation query. + +## Creating wallet addresses through a script + +One approach to issuing wallet addresses to your account holders is writing a one-time script to loop through your list of account holders and call the `CreateWalletAddress` GraphQL mutation along with the input parameters. The following is an example: + + + +```graphql +// Query: + +mutation CreateWalletAddress($input:CreateWalletAddressInput!) { + createWalletAddress(input:$input) { + code + success + message + walletAddress { + id + createdAt + publicName + url + asset { + code + id + scale + } + } + } +} + + +// Input parameters **NOTE - `additionalProperties` are optional: + +{ + "input": { + "assetId": "0ddc0b7d-1822-4213-948e-915dda58850b", + "publicName": "Sarah Marshall", + "url": "https://example.wallet.com/sarah", + "additionalProperties": [ + { + "key": "iban", + "value": "NL93 8601 1117 947", + "visibleInOpenPayments": false + }, + {"key": "nickname", "value": "S Mar", "visibleInOpenPayments": true } + ] + } +} + +``` + + + + + +```graphql +{ + "data": +{"createWalletAddress": { + "code":"200", + "success":true, + "message":"Created wallet address", + "walletAddress": { + "id":"695e7546-1803-4b45-96b6-6a53f4082018", + "createdAt":"2023-03-03T09:07:01.107Z", + "publicName":"Sarah Marshall", "url":"https://example.wallet.com/sarah", + "asset": { +"id":"0ddc0b7d-1822-4213-948e-915dda58850b", + "code":"USD", + "scale":2 + } + } + } + } +} + +``` + + + +You SHOULD store at least the `walletAddress.id` in their internal database to be able to reference the account and wallet address. + +### Create wallet address key + +To use the Open Payments APIs, a wallet address must be associated with at least one private-public key pair to sign an API request. One or multiple public keys are linked to the wallet address so that third parties can verify request signatures. The key pair can be added using the `CreateWalletAddressKey` GraphQL mutation. If you create wallet addresses for your account holders via a one-time script, you must call this mutation for each new wallet address. + + + +```graphql +// Query: + +mutation +CreateWalletAddressKey +($input:CreateWalletAddressKeyInput!) +{ + createWalletAddressKey(input:$input) { + code + message + success + walletAddressKey +{ +id + walletAddressId + revoked + jwk{ + alg + crv + kid + kty + x + } + + createdAt + } +} +} + + +// Input parameters + +{ + "input": { + "jwk": { + "kid": "keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", + "x":"ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8", + "alg":"EdDSA", + "kty":"OKP", + "crv":"Ed25519" +}, +"walletAddressId":"695e7546-1803-4b45-96b6-6a53f4082018" + }} + +``` + + + + + +```graphql +{ + "data": { + "createWalletAddressKey": { +"code":"200", +"message":"Added Key To Wallet Address", +"success":true, +"walletAddressKey": { + "id":"f2953571-f10c-44eb-ab41-4450a7ad6771", +"walletAddressId":"695e7546-1803-4b45-96b6-6a53f4082018", +"revoked":false, +"jwk": { +"alg":"EdDSA", +"crv":"Ed25519", + "kid":"keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", + "kty":"OKP", +"x":"ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8" +}, + "createdAt":"2023-03-03T09:26:41.424Z" +} + } + } +} + + +``` + + + +## Creating wallet addresses dynamically + +An alternative approach to creating wallet addresses for your account holders is to generate the addresses dynamically when your Rafiki instance fires the [`wallet_address.not_found`](/integration/before-you-begin#webhook-events) webhook event. This event fires when Rafiki does not find the wallet address requested from an Open Payments API call. When receiving this event, you can look up the associated account in your system and call the `CreateWalletAddress` and `CreateWalletAddressKey` mutations to create the wallet address and its associated private-public key pair. Even if you opt to create the initial batch of wallet addresses for your existing account holders via a one-time script, you may implement this process to dynamically create wallet addresses for any new accounts you onboard to your system. diff --git a/packages/documentation/src/content/docs/concepts/interledger.mdx b/packages/documentation/src/content/docs/concepts/interledger.mdx index 908f4e2691..f35c6386b3 100644 --- a/packages/documentation/src/content/docs/concepts/interledger.mdx +++ b/packages/documentation/src/content/docs/concepts/interledger.mdx @@ -31,7 +31,7 @@ If the sender and receiver nodes are peers, then the payment flow is straightfor In the image below, the sender node (A) and the receiver node (C) share a common peer (B). In payments from the sender to the receiver, node B performs the role of connector to facilitate payments between the two. Peering relationship showing a sender, connector, and receiver diff --git a/packages/documentation/src/content/docs/concepts/telemetry.mdx b/packages/documentation/src/content/docs/concepts/telemetry.mdx index ca3f229971..3e7c75cf6d 100644 --- a/packages/documentation/src/content/docs/concepts/telemetry.mdx +++ b/packages/documentation/src/content/docs/concepts/telemetry.mdx @@ -22,11 +22,11 @@ Our goals are to: Privacy is a paramount concern for the Interleger Foundation. Rafiki’s telemetry feature is designed to provide valuable network insights without violating privacy or aiding malicious ASEs. Review the [Privacy](#privacy) section below for more information. -The telemetry functionality is currently enabled by default on test (non-livenet) environments, i.e. any environment that is not dealing with real money. When active, the functionality transmits metrics to the testnet collector. In the future, operating in a production livenet environment (with real money) will allow you to opt-in to sharing your metrics with a livenet collector. Regardless of environment, you can also opt-out of telemetry completely. +The telemetry functionality is currently enabled by default on test (non-livenet) environments, i.e. any environment that is not dealing with real money. When active, the functionality transmits metrics to the testnet collector. You can opt in to sharing your metrics with a livenet collector when operating in a production livenet environment (with real money). Regardless of environment, you can also opt-out of telemetry completely. Review the [telemetry environment variables](#telemetry-environment-variables) for more information. ### Architecture -![Architecture diagram for Rafiki telemetry](/img/components-telemetry-architecture.png) +![Architecture diagram for Rafiki telemetry](/img/concepts-telemetry-architecture.png) ### OpenTelemetry (OTEL) @@ -151,7 +151,7 @@ Rafiki allows you to build your own telemetry solution based on the +```graphql +mutation SetFee($input: SetFeeInput!) { + setFee(input: $input) { + code + success + message + fee { + id + assetId + type + fixed + basisPoints + createdAt + } + } +} +``` + + +#### JSON Request + + +```json +{ + "input": { + "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", + "type": "SENDING", + "fee": { + "fixed": 100, + "basisPoints": 100 + } + } +} +``` + + +| Variable | Description | +| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `assetId` | The unique ID assigned by Rafiki when the asset was created. | +| `type` | Indicates who incurs the fee: either the sender (`SENDING`) or receiver (`RECEIVING`). | +| `fixed` | The amount of the flat, fixed fee to charge. Assuming USD with an asset scale of 2, a value of `100` equals `$1.00`. | +| `basisPoints` | The amount of the variable fee to charge based on the total amount. One basis point is equal to 0.01% of the total amount. 100 basis points equals 1%, and 10000 basis points equals 100%. In this example, the fee is 1%. | + +#### JSON Response + + +```json +{ + "data": { + "setFee": { + "code": "200", + "success": true, + "message": "Fee set", + "fee": { + "id": "140fd9c0-8f14-4850-9724-102f04d97e69", + "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", + "type": "SENDING", + "fixed": "100", + "basisPoints": 100, + "createdAt": "2023-09-13T14:59:53.435Z" + } + } + } +} +``` + -integration and also flows +## Integrate with your identity provider ## Webhook Events diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx deleted file mode 100644 index 0b495a1d09..0000000000 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/exchange-rates.mdx +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Exchange rates ---- - -import { LinkOut } from '@interledger/docs-design-system' - -import { CodeBlock } from '@interledger/docs-design-system' - -Every Interledger payment is preceded by a rate probe that estimates the costs for transferring value over the network from the sending account servicing entity to the receiving account servicing entity, which is assessed as a network fee. For the rate probe to succeed, you, as the account servicing entity, must provide your Rafiki instance with the current exchange rate. In addition, you may charge fees on top of the estimated fees for facilitating Interledger payments initiated by your account holders. - -Your endpoint must accept `GET` requests and respond in the following format: - -| Variable Name | Type | Description | Required | -| -------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------- | -------- | -| `base` | String | Asset code represented as ISO 4217 currency code e.g. `USD` | Y | -| `rates` | Object | Object containing `` pairs, e.g. `{EUR:0.8930}` | Y | -| `rates.` | Number | Exchange rate given `base` and `` | Y | - -A successful response will return a status code of `200`. Here is a simple example of a response for the `mock-account-servicing-entity`, which is included as a package bundled with your Rafiki instance. - -To configure your Rafiki instance to direct its rate probes to your endpoint, you must specify the URL of your endpoint in the `EXCHANGE_RATES_URL` environment variable. An OpenAPI specification of that endpoint can be found here. - -In addition, you will need to specify the `EXCHANGE_RATES_LIFETIME` environment variable, which determines how long your Rafiki instance will cache exchange rates. By caching exchange rates in Rafiki for a specified period, you will improve performance as Rafiki will not need to request the exchange rate from your endpoint for every payment. - -In addition, you must consider your slippage tolerance. As mentioned, before an Interledger payment is made, a rate probe provides a quote that estimates the cost of transferring value over the network. This cost includes fees that connector nodes of the network may charge in exchange rates or even as a forwarding fee for payments denominated in the same asset (e.g. USD). As exchange rates and fees charged by connectors fluctuate, there will likely be a variance between the estimated amount provided in the quote and the actual amount required when the payment is initiated. The default slippage is 1% but can be configured via the `SLIPPAGE` environment variable using a value between 0 and 1. Using the default slippage, a payment of \$1.01 will go through on an initial quote estimated at \$1.00, but payment will not be sent if the total, inclusive of exchange rate and network fees, amounts to \$1.02. - -Depending on the particular deployment of your Rafiki instance, these environment variables will be set in a `docker-compose.yaml` file or as part of a Helm chart. Refer to the [environment variables](/resources/environment-variables) page for more details. - -## Fees - -You may charge fees on top of the estimated network fee for facilitating the transfer. You can specify fixed and variable fees per asset using the Backend Admin API or the Rafiki Admin application provided. How you structure those fees is entirely up to you. - -### Backend Admin API - -The following is an example of setting a fixed fee of 100 basis points using the `setFee` GraphQL mutation: - - - -```graphql -mutation SetFee($input: SetFeeInput!) { - setFee(input: $input) { - code - success - message - fee { - id - assetId - type - fixed - basisPoints - createdAt - } - } -} -``` - - - -A request is sent in JSON format specifying the `assetId`, `type`, `fixed`, and `basisPoints` variables: - -- `assetId` - A unique identifier assigned by Rafiki when the asset was created. -- `type` - The type of fee, either `SENDING` or `RECEIVING`. -- `fixed` - A flat, fixed fee. -- `basisPoints` - A variable fee. One basis point fee is equal to 0.01% of the total amount, 100 basis points = 1%, 10000 basis points = 100% - -These variables are used in the following request example: - - - -```json -{ - "input": { - "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", - "type": "SENDING", - "fee": { - "fixed": 100, - "basisPoints": 100 - } - } -} -``` - - - - - -```json -{ - "data": { - "setFee": { - "code": "200", - "success": true, - "message": "Fee set", - "fee": { - "id": "140fd9c0-8f14-4850-9724-102f04d97e69", - "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", - "type": "SENDING", - "fixed": "100", - "basisPoints": 100, - "createdAt": "2023-09-13T14:59:53.435Z" - } - } - } -} -``` - - - -### Rafiki Admin application - -You may also add fees via the Rafiki Admin application. See the [Rafiki Admin application user guide](/admin/admin-user-guide/#assets) for more information on configuring asset fees. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx deleted file mode 100644 index 7b93d85ea2..0000000000 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/webhook-events.mdx +++ /dev/null @@ -1,271 +0,0 @@ ---- -title: Webhook Events ---- - -import { Mermaid } from '@interledger/docs-design-system' -import { LinkOut } from '@interledger/docs-design-system' - -Rafiki does not hold user account balances but tracks liquidity within asset, peer, and payment accounts in its own database. As an account servicing entity, you must manage this liquidity primarily in response to certain events dispatched from Rafiki. To receive these notifications from Rafiki, you must expose a webhook endpoint that listens for these events and reacts accordingly. When events fire in your Rafiki instance, the Rafiki `backend` service will make a POST request to the configured `WEBHOOK_URL` environment variable and will expect a 200 status in the response. - -### Request Body - -Each webhook has the following structure in the request body: - -| Variable Name | Type | Description | Required | -| ------------- | ----------------------------- | ------------------- | -------- | -| `id` | String | event ID | Y | -| `type` | Enum: [EventType](#eventtype) | event type value | Y | -| `data` | Object | any additional data | N | - -#### EventType - -The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle. - -| Value | Description | -| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | -| [`incoming_payment.created`](#incoming_paymentcreated) | An incoming payment has been created. | -| [`incoming_payment.completed`](#incoming_paymentcompleted) | An incoming payment is complete and will not accept any additional incoming funds. | -| [`incoming_payment.expired`](#incoming_paymentexpired) | An incoming payment expired and will not accept any additional incoming funds. | -| [`outgoing_payment.created`](#outgoing_paymentcreated) | An outgoing payment was created. | -| [`outgoing_payment.completed`](#outgoing_paymentcompleted) | An outgoing payment completed. | -| [`outgoing_payment.failed`](#outgoing_paymentfailed) | An outgoing payment partially or completely failed. | -| [`wallet_address.not_found`](#wallet_addressnot_found) | A requested wallet address was not found. | -| [`wallet_address.web_monetization`](#wallet_addressweb_monetization) | Web Monetization payments received via STREAM. | -| [`asset.liquidity_low`](#assetliquidity_low) | Asset liquidity has dropped below defined threshold. | -| [`peer.liquidity_low`](#peerliquidity_low) | Peer liquidity has dropped below defined threshold. | - -An OpenAPI specification of the webhook requests and their corresponding data can be found here. -Additionally, the local playground playground contains example payloads in the Bruno collection that can be used to test a webhook service integration. - -## Events - -### `incoming_payment.created` - -The `incoming_payment.created` event indicates that an incoming payment was created. No funds are received in your Rafiki instance, so no action is required. This webhook event is informational and allows you to display upcoming incoming payments to your users. - ->ASE: webhook event: incoming payment created - ASE->>ASE: no action required - -`} -/> - -### `incoming_payment.completed` - -The `incoming_payment.completed` event indicates that an incoming payment was completed, either automatically or manually, and that any funds received into this incoming payment should be withdrawn and credited to the recipient’s account on your ledger. - -In addition, the `CreateIncomingPaymentWithdrawal` supports two-phase transfers. - -Example: An incoming payment was completed and the recipient received **$10**. - ->ASE: webhook event: incoming payment completed,
    receivedAmount: $10 - ASE->>R: admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: credit receiver's account with $10 - -`} -/> - -Example: An incoming payment supporting two-phase transfers was completed and received **$10**. - ->ASE: webhook event: incoming payment completed,
    receivedAmount: $10 - ASE->>R: admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: credit receiver's account with $10 - ASE->>R: admin API call: PostLiquidityWithdrawal - R->>R: 2-phase transfer completed - -`} -/> - -### `incoming_payment.expired` - -The `incoming_payment.expired` event indicates that an incoming payment has expired and that any funds previously received for this incoming payment should be withdrawn and credited to the recipient’s account on your ledger. Note that this event is only fired if funds were received for the incoming payment. In cases where the sender did not specify the `incomingAmount` when the `incomingPayment` resource was initially created, the `incoming_payment.expired` event notifies you that no further payments are expected. The primary use case of the `incoming_payment.expired` event to signal the end of any additional payments is a streaming payments example, such as Web Monetization. - -Example: An incoming payment has expired and received **$2.55**. - ->ASE: webhook event: incoming payment expired,
    receivedAmount: $2.55 - ASE->>R: admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: credit receiver's account with $2.55 - -`} -/> - -### `outgoing_payment.created` - -The `outgoing_payment.created` event indicates that an outgoing payment was created and is awaiting liquidity. You should verify the sender’s account balance and perform other verifications before funding or canceling the outgoing payment in case the sender has insufficient funds in their account. If the outgoing payment is not fulfilled, you can cancel it. Otherwise, you must put a hold on the sender’s account and deposit the funds into Rafiki. - -Example: An outgoing payment for **$12** has been created. - ->ASE: webhook event: outgoing payment created,
    debitAmount: $12 - ASE->>ASE: check if account has enough balance - alt Account has enough balance - ASE->>ASE: put hold of $12 on sender's account - ASE->>R: admin API call: DepositOutgoingPaymentLiquidity - end - alt Account does not have enough balance - ASE->>R: admin API call: CancelOutgoingPayment
    reason: Not enough balance - end - -`} -/> - -### `outgoing_payment.completed` - -The `outgoing_payment.completed` event indicates that an outgoing payment has successfully sent as many funds as possible to the receiver against the associated incoming payment. You should withdraw any excess liquidity from that outgoing payment in Rafiki that arises from differences between the sent and received amounts and use it as you see fit. One option would be to return it to the sender. Another option is to retain the excess liquidity as a service fee. Furthermore, you should remove the hold on the sender’s account and debit it. - -In addition, the `CreateOutgoingPaymentWithdrawal` supports [two-phase transfers](https://rafiki.dev/reference/glossary/#two-phase-transfers). - -Example: An outgoing payment amount for **$12** has been completed. **$11.50** were sent. You keep **$0.50** as fees. - ->ASE: webhook event: outgoing completed,
    debitAmount: $12, sentAmount:$11.50 - ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal - ASE->>ASE: remove the hold and deduct $12 from the sender's account,
    credit ASE's account with $0.50 - -`} -/> - -Example: An outgoing payment supporting two-phase transfers for **$12** has been completed. **$11.50** were sent. You keep **$0.50** as fees. - ->ASE: webhook event: outgoing completed,
    debitAmount: $12, sentAmount:$11.50 - ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal - ASE->>ASE: remove the hold and deduct $12 from the sender's account,
    credit ASE's account with $0.50 - ASE->>R: admin API call: PostLiquidityWithdrawal - R->>R: 2-phase transfer completed - -`} -/> - -### `outgoing_payment.failed` - -The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was unsuccessful. You should withdraw any remaining liquidity from that outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` was 0), you should remove the hold from the sender’s account. If the payment failed partially, you should remove the hold from the sender’s account and debit it with the amount sent. Considering the discrepancy between the quote amount and the amount sent, you should refrain from taking a sending fee. - -Example: An outgoing payment for **$12** has failed. **$8** were sent. - ->ASE: webhook event: outgoing failed,
    debitAmount: $12, sentAmount:$8 - ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal - ASE->>ASE: remove the hold and deduct $8 from the sender's account - -`} -/> - -### `wallet_address.web_monetization` - -The `wallet_address.web_monetization` event indicates that a wallet address received Web Monetization payments via the ILP STREAM protocol. You should withdraw that liquidity from the wallet address in Rafiki and credit the receiver’s account on your ledger. - -Example: A wallet address received **$0.33** - ->ASE: webhook event: wallet address web monetization,
    receivedAmount: $0.33 - ASE->>R: admin API call: CreateWalletAddressWithdrawal - ASE->>ASE: credit receiver's account with $0.33 - -`} -/> - -### `wallet_address.not_found` - -The `wallet_address.not_found` event indicates that a wallet address was requested via the Open Payments Wallet address server API, but it doesn’t exist in your Rafiki instance. When receiving this event, you can look up the associated account in your system and create a wallet address. The initial request for the wallet address will succeed if you create it within the configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. - -Example: The wallet address `https://example-wallet.com/carla_garcia` was requested but does not exist yet. - ->ASE: webhook event: wallet address not found,
    wallet address: https://example-wallet.com/carla_garcia - ASE->>R: admin API call: CreateWalletAddress
    url: https://example-wallet.com/carla_garcia,
    public name: Carla Eva Garcia - -`} -/> - -### `asset.liquidity_low` - -The `asset.liquidity_low` event indicates that an asset’s liquidity has dropped below a predefined liquidity threshold. When receiving this event, you should check if you already have or can acquire additional liquidity for that specific asset and, if so, deposit it in Rafiki. Cross-currency transfers will fail if you do not increase that asset’s liquidity in Rafiki. - -Example: The asset liquidity for USD (scale: 2) drops below **$100.00**. - ->ASE: webhook event: liquidity (asset) low,
    asset: USD (scale: 2, id: "abc") - ASE->>R: admin API call: DepositAssetLiquidity - -`} -/> - -### `peer.liquidity_low` - -The `peer.liquidity_low` event indicates that a peer’s liquidity has dropped below a predefined liquidity threshold. When receiving this event, you must decide if you want to extend that peer’s credit line or whether the peer must settle first and then extend a new line of credit to that peer. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. - -Example: The peer liquidity for Happy Life Bank drops below **$100.00**. - ->ASE: webhook event: liquidity (peer) low,
    peer: Happy Life Bank (asset: "USD", scale: 2, id: "abc") - ASE->>R: admin API call: DepositPeerLiquidity - -`} -/> - -## Errors - -If an error occurs when Rafiki sends a webhook event (i.e., a non-200 status is returned or the request timed out), Rafiki will retry the webhook requests at increasing intervals until a 200 status is returned. The first retry is after 10 seconds, the second after 20 more, the next after 30 more, etc. The maximum number of retries for webhook events is configured via the WEBHOOK_MAX_RETRY environment variable. - -Additionally, the timeout for webhook requests is configured with the `WEBHOOK_TIMEOUT` environment variable. - -## Best Practices - -### Duplicate Events - -The `id` in the webhook event payload is a unique UUID, which your system can use to determine whether the event has been received previously, preventing duplicate event processing. - -### Asynchronous Handling - -Consider using a worker to process received webhook events, especially if requests to credit/debit user accounts are lengthy processes. Doing so allows the server to process events at a rate suitable for the system and reduce the number of failed/retried webhook events since the webhook event listener can immediately reply with a successful 200 status. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx deleted file mode 100644 index 396f92c8fa..0000000000 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-peer.mdx +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: Adding peer ---- - -import { LinkOut } from '@interledger/docs-design-system' - -import { CodeBlock } from '@interledger/docs-design-system' - -## Prerequisites - -To add a peer and send Interledger payments you and the account servicing entity (ASE) you intend to peer with must both: - -- Run an implementation of an [Interledger connector](/integration/deployment/services/backend-service#interledger-connector) (ideally Rafiki). -- Agree on an [asset](/concepts/accounts-transfers-liquidity#assets) for the peering relationship. You can set up multiple peering relationships with the same peer based on different assets. At least one asset shared by you and your peer must be added to your Rafiki instance prior to setting up the peering relationship. -- Agree on a `maxPacketAmount` value, which specifies how many packets a payment is split into. -- Communicate your respective static Interledger (ILP) addresses. -- Communicate a connection endpoint for the other peer to send packets to. -- Exchange `auth` tokens for the connection endpoint. -- Agree on a settlement mechanism (a means of paying one another for the successful forwarding and delivery of packets), which is outside the scope of Interledger and Rafiki. - -Optionally, you may also deposit an initial liquidity for your peer. - -## Add a peer using the Backend Admin API - -Rafiki’s Backend Admin API implements a GraphQL interface. Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts; a query and an object containing query variables. - -To add a peer to your Rafiki instance call the `CreatePeer` mutation query and pass the query variables for the following: - -| Query parameters | Description | Required | -| -------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -------- | -| `assetID` | the ID of the asset that you and your peer will use to ultimately settle your net obligations outside of Interledger. | Y | -| `staticILPaddress` | Your peer’s static ILP address (the following example uses `g.othergreatwallet`) | Y | -| `name` | Your peer’s name (the following example uses “The Other Great Wallet”) | Y | -| `http.incoming.authTokens` | The token your peer will use to present and connect to and send packets to your Rafiki instance. | Y | -| `http.outgoing.endpoint` | Your peer’s connector endpoint. By default it is on local port 0.0.0.0:3002 | Y | -| `http.outgoing.authtoken` | The token that you will use to present to your peer and connect to and send packets to their Rafiki instance. | Y | -| `initialLiquidity` | Initial amount of liquidity to deposit for peer. Liquidity can also be deposited using the `DepositPeerLiquidity` mutation. | N | - - - -```graphql -// Query: - -mutation CreatePeer($input: CreatePeerInput!) { - createPeer(input: $input) { - code - success - message - peer { - id - asset { - code - scale - } - staticIlpAddress - name - } - } -} - - -// Query Variables (substitute the asset ID from the “create asset” response for INSERT_ASSET_ID): - -{ - "input": { - "staticIlpAddress": "g.othergreatwallet", - "name": "The Other Great Wallet" - "http": { - "incoming": {"authTokens": ["mytoken"]}, - "outgoing": {"endpoint": "ilp.othergreatwallet.com", "authToken": "theirtoken"} - }, - "assetId": "INSERT_ASSET_ID", - "initialLiquidity": - } -} - -``` - - - - - -```graphql -{ - "data": { - "createPeer": { - "code": "200", - "success": true, - "message": "Created ILP Peer", - "peer": { - "id": "480ef339-7842-4501-a905-923fc1339cef", - "asset": { - "code": "USD", - "scale": 2 - }, - "staticIlpAddress": "g.othergreatwallet", - "name": "The Other Great Wallet" - } - } - } -} - - - -``` - - - -## Add a peer using the Rafiki Admin application - -Alternatively, a peer can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/integration/deployment/playground/overview/#running-the-local-environment). - -See the [Rafiki Admin application user guide](/admin/admin-user-guide/#peers) for more information on adding peers. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/grants-management.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/grants-management.mdx deleted file mode 100644 index b4e64f26cc..0000000000 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/grants-management.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Grants management ---- - -## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/keys-management.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/keys-management.mdx deleted file mode 100644 index 89228cd8fa..0000000000 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/keys-management.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Keys management ---- - -## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx deleted file mode 100644 index db9d277dbf..0000000000 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/managing-liquidity.mdx +++ /dev/null @@ -1,306 +0,0 @@ ---- -title: Managing liquidity ---- - -import { LinkOut } from '@interledger/docs-design-system' - -As an implementation of the Interledger Protocol, Rafiki provides [accounting](/concepts/accounts-transfers-liquidity) between transacting parties but doesn’t handle settlement. You and the account servicing entities you decide to peer with must agree on the means and how often you will settle your accounts. Consequently, Rafiki can manage the liquidity used to fund payments made through the Interledger network. - -## Add liquidity via GraphQL - -Liquidity can be managed in Rafiki through the [`backend`](/integration/deployment/services/backend-service/) Admin API, which implements a GraphQL interface, or via the [Rafiki Admin application](/admin/admin-user-guide). Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts: a query and an object containing query variables. - -As Rafiki supports several types of liquidity, we’ll cover the typical scenarios you’ll need to manage. - -:::note -You must provide the `idempotencyKey` when calling mutations related to liquidity. This key allows the safe retrying of requests without multiple operations. It should be a unique key, typically a V4 UUID. For more information, refer to Rafiki’s idempotency. -::: - -## Asset Liquidity - -Asset liquidity specifies the amount of value denominated in an asset you have previously added to your Rafiki instance, which Rafiki has at its disposal to send or forward Interledger packets. Asset liquidity increases if packets denominated in the asset are received and decreases if your Rafiki instance sends packets denominated in the asset. The amount is always non-negative. - -You should define and adjust the asset liquidity based on your risk tolerance. - -### Example - -You’ve configured your Rafiki instance with two assets, EUR and USD, with an asset scale of 0. The EUR liquidity is 10, and the USD liquidity is 50. With liquidity support for these two assets, your Rafiki instance can function as a connector node within the Interledger network and provide currency exchange between a sender sending a payment in EUR and a recipient receiving the payment in USD. - -In a cross-currency transaction, your Rafiki instance would receive packets totaling 10 EUR and send packets worth 11 USD. The EUR liquidity would be increased to 20 EUR, and the USD liquidity would be reduced to 39 USD. - -If your Rafiki instance were to receive 50 EUR, but needed to send 55 USD, the transaction would fail because your instance does not have enough USD liquidity. - -### Deposit Asset Liquidity - -You can deposit asset liquidity via the `DepositAssetLiquidity` mutation: - -```sh -mutation -DepositAssetLiquidity($input:DepositAssetLiquidityInput!) { - depositAssetLiquidity(input:$input) { - code - success - message - error - } -} -``` - -The following are example `input` parameters for the `DepositAssetLiquidity` mutation query above. - -```sh -{ "input": { - "id":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "assetId":"7b8b0f65-896d-4403-b7ba-2e24bf20eb35", - "amount":"100", - "idempotencyKey":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f" - } -} -``` - -### Withdraw Asset Liquidity - -You can withdraw asset liquidity via the `CreateAssetLiquidityWithdrawal` mutation: - -```sh -mutation -CreateAssetLiquidityWithdrawal( - $input:CreateAssetLiquidityWithdrawalInput! -) { - createAssetLiquidityWithdrawal(input:$input) { - code - success - message - error - } -} -``` - -The following are example `input` parameters for the `CreateAssetLiquidityWithdrawal` mutation query above. - -```sh -{"input": { - "id":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "assetId":"7b8b0f65-896d-4403-b7ba-2e24bf20eb35", - "amount":"100", - "idempotencyKey":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "timeoutSeconds":0} -} -``` - -## Peer Liquidity - -Peer liquidity is the line of credit denominated in the asset of the peering relationship in Rafiki that you extend to your respective peer. You must determine how much credit you will extend in your peering agreement, which depends on how much you trust the peer. If peer liquidity is insufficient, Rafiki cannot initiate payments to that peer. Once peer liquidity is used up, you should settle with your peer and reset their peer liquidity. - -:::note -You must decide whether to secure liquidity with your peers by extending credit or requiring them to pre-fund your accounts. Those agreements must be made before setting up peering relationships in Rafiki and are not managed through Interledger or Rafiki. -::: - -### Example - -A configured peer, _Cloud Nine Wallet,_ has a peer liquidity of 100 USD. Your Rafiki instance can send packets up to 100 USD to wallet addresses issued by _Cloud Nine Wallet_. Once that liquidity is used up, you should settle with _Cloud Nine Wallet_ and reset their liquidity to 100 USD. - -### Deposit Peer Liquidity - -You can add liquidity for a particular peer via the `DepositPeerLiquidity` mutation. - -```sh -mutation DepositPeerLiquidity($input:DepositPeerLiquidityInput!) { - depositPeerLiquidity(input:$input) { - code - success - message - error} -} -``` - -The following are example `input` parameters for the `DepositPeerLiquidity` mutation query above. - -```sh -{"input": {"id":"a09b730d-8610-4fda-98fa-ec7acb19c775", - "peerId":"73158598-2e0c-4973-895e-aebd115af260", - "amount":"1000000", - "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", - "timeoutSeconds":0} -} -``` - -### Withdraw Peer Liquidity - -In case you want to reduce your peer’s credit line, you can withdraw peer liquidity via the `CreatePeerLiquidityWithdrawal` mutation: - -```sh -mutation CreatePeerLiquidityWithdrawal( - $input:CreatePeerLiquidityWithdrawalInput! -) { - createPeerLiquidityWithdrawal(input:$input) { - code - success - message - error} -} -``` - -The following are example `input` parameters for the `CreatePeerLiquidityWithdrawal` mutation query above. - -```sh -{ -"input": {"id":"421fae87-9a59-4217-9ff8-faf55ffab9c6", -"peerId":"73158598-2e0c-4973-895e-aebd115af260", -"amount":"100", -"timeoutSeconds":0 -} -} -``` - -## Payment Liquidity - -When Open Payments incoming or outgoing payments are created, your Rafiki instance creates a liquidity account within the accounting database. Liquidity must be deposited into an outgoing payment before the payment can be processed. Rafiki will notify you to deposit liquidity via the `outgoing_payment.created` webhook event. Similarly, packets received for an incoming payment increase its liquidity account. Rafiki will notify you to withdraw that liquidity via the `incoming_payment.completed` webhook event. - -### Incoming payment - -You can withdraw incoming payment liquidity via the `CreateIncomingPaymentWithdrawal` mutation query: - -```sh -mutation CreateIncomingPaymentWithdrawal( - $input:CreateIncomingPaymentWithdrawalInput! -) { - createIncomingPaymentWithdrawal(input:$input) { - code - error - message - success - } -} -``` - -The following are example `input` parameters for the `CreateIncomingPaymentWithdrawal` mutation query above. - -```sh -{ "input": {"incomingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052, "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", -"timeoutSeconds":0 - } -} -``` - -### Outgoing payment - -You can deposit outgoing payment liquidity via the `DepositOutgoingPaymentLiquidity` mutation query: - -```sh -mutation DepositOutgoingPaymentLiquidity( - $input:DepositOutgoingPaymentLiquidityInput!) -{ - depositOutgoingPaymentLiquidity(input:$input) { - code - error - message - success - } -} -``` - -The following are example `input` parameters for the `DepositOutgoingPaymentLiquidity` mutation query above. - -```sh -{ - "input":{ - "outgoingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775" - } -} -``` - -You can withdraw outgoing payment liquidity via the `CreateOutgoingPaymentWithdrawal` mutation: - -```sh -mutation -CreateOutgoingPaymentWithdrawal -( - $input:CreateOutgoingPaymentWithdrawalInput!) { - createOutgoingPaymentWithdrawal -(input:$input) { - code - error - message - success -} -} -``` - -The following are example `input` parameters for the `CreateOutgoingPaymentWithdrawal` mutation query above. - -```sh -{"input": { - "outgoingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", - "timeoutSeconds":0 - } -} -``` - -## Two-phase withdrawals - -Rafiki supports two-phase withdrawals via the `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` mutations. When a withdrawal liquidity transaction is requested with a non-zero `timeout` value (zero denotes absence of a timeout), the transfer will be created as a two-phase transfer. If the timeout interval passes before the transfer is either posted or voided, the transfer expires and the full amount is returned to the original account. - -- `PostLiquidityWithdrawal`: Withdrawals with timeouts greater than 0 are processed as two-phase transfers and committed via this mutation. - -- `VoidLiquidityWithdrawal`: Withdrawals with timeouts greater than 0 are processed as two-phase transfers and are rolled back via this mutation. - -The following withdrawal transactions supports two-phase transfers: - -- Asset liquidity withdrawal -- Wallet address withdrawal -- Peer liquidity withdrawal -- Incoming payment withdrawal -- Outgoing payment withdrawal - -### Examples - -You can post a successful transfer via the `PostLiquidityWithdrawal` mutation query: - -```sh -mutation -PostLiquidityWithdrawal($input:PostLiquidityWithdrawalInput!) {postLiquidityWithdrawal -( -input:$input) { - code - error - message - success} -} -``` - -The following are example `input` parameters for the `PostLiquidityWithdrawal` mutation query above. - -```sh -{ - "input": { - "withdrawalId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775"} -} -``` - -You can void an unsuccessful transfer via the `VoidLiquidityWithdrawal` mutation query: - -```sh -mutation -VoidLiquidityWithdrawal($input:VoidLiquidityWithdrawalInput!) { - voidLiquidityWithdrawal -(input:$input) { - code - error - message - success} -} -``` - -The following are example `input` parameters for the `VoidLiquidityWithdrawal` mutation query above. - -```sh -{"input": { - "withdrawalId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", -"idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775" - } -} -``` diff --git a/packages/documentation/src/content/docs/resources/architecture.mdx b/packages/documentation/src/content/docs/resources/architecture.mdx index ab338eceb4..d12e83dfb9 100644 --- a/packages/documentation/src/content/docs/resources/architecture.mdx +++ b/packages/documentation/src/content/docs/resources/architecture.mdx @@ -4,15 +4,11 @@ title: Architecture import { LinkOut } from '@interledger/docs-design-system' -

    - Needs updated diagram(s) -

    - Rafiki is a collection of three services that run together. Each one can be scaled horizontally. -- [backend](/integration/deployment/services/backend-service) - The main service, responsible for handling business logic and external communication -- [auth](/integration/deployment/services/auth-service) - A reference implementation of an Open Payments authorization server, used for grant authorization and authentication -- [frontend](/integration/deployment/services/frontend-service) - An optional internal user interface, called the [Rafiki Admin](/admin/admin-user-guide), for you to manage your Rafiki instance +- [Backend](/integration/deployment/services/backend-service) - The main service, responsible for handling business logic and external communication +- [Auth](/integration/deployment/services/auth-service) - A reference implementation of an Open Payments authorization server, used for grant authorization and authentication +- [Frontend](/integration/deployment/services/frontend-service) - An optional internal user interface, called the [Rafiki Admin](/admin/admin-user-guide), for you to manage your Rafiki instance These services rely on four databases. @@ -25,3 +21,5 @@ These services rely on four databases. - Redis, used by the `backend` service as a cache to share STREAM connection details across processes and by the `auth` service to store session data An additional package for [token introspection](/integration/deployment/services/token-introspection) is also included with Rafiki. This is an internal package that requires no action on your part if you’re using Rafiki’s `auth` service. + +Rafiki architecture diagram diff --git a/packages/documentation/src/content/docs/resources/grants.mdx b/packages/documentation/src/content/docs/resources/grants.mdx deleted file mode 100644 index dd12e3eb49..0000000000 --- a/packages/documentation/src/content/docs/resources/grants.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Grants ---- From b357b154a449e938a65efa1854857a3a4dc6ae6f Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Tue, 27 Aug 2024 22:52:28 +0300 Subject: [PATCH 40/91] docs: fixing broken links hopefully --- .../src/content/docs/concepts/telemetry.mdx | 14 +++---- .../deployment/services/auth-service.mdx | 2 +- .../deployment/services/backend-service.mdx | 2 +- .../content/docs/integration/get-started.mdx | 37 ------------------- 4 files changed, 9 insertions(+), 46 deletions(-) delete mode 100644 packages/documentation/src/content/docs/integration/get-started.mdx diff --git a/packages/documentation/src/content/docs/concepts/telemetry.mdx b/packages/documentation/src/content/docs/concepts/telemetry.mdx index 3e7c75cf6d..f890178b90 100644 --- a/packages/documentation/src/content/docs/concepts/telemetry.mdx +++ b/packages/documentation/src/content/docs/concepts/telemetry.mdx @@ -153,13 +153,13 @@ You must deploy your own OTEL Collector that acts as a sidecar container to Rafi ### Telemetry environment variables -| Variable name | Type | Description | Required | -| -------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `ENABLE_TELEMETRY` | Boolean | Enables the telemetry service on Rafiki. Defaults to `true`. | N | -| `LIVENET` | Boolean | Determines where to send metrics. Defaults to `false`, resulting in metrics being sent to the testnet OTEL Collector.

    Set to `true` on production environments dealing with real money.

    | N | -| `OPEN_TELEMETRY_COLLECTOR_URLS` | String | A CSV of URLs for OTEL Collectors (e.g., `http://otel-collector-NLB-e3172ff9d2f4bc8a.elb.eu-west-2.amazonaws.com:4317,http://happy-life-otel-collector:4317`). | N | -| `OPEN_TELEMETRY_EXPORT_INTERVAL` | Number | Indicates, in milliseconds, how often the instrumented Rafiki instance should send metrics. Defaults to `15000`. | N | -| `TELEMETRY_EXCHANGE_RATES_URL` | String |

    Defines the endpoint Rafiki will query for exchange rates. Used as a fallback if/when [exchange rates](/integration/deploy-to-prod/endpoints/exchange-rates) aren’t provided.

    When set, the response format of the external exchange rates API should be of type `rates`, as is expected by the rate service.

    Defaults to `https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json`, which points to a public S3 that has the previously mentioned required format, updated daily.

    | N | +| Variable name | Type | Description | Required | +| -------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | +| `ENABLE_TELEMETRY` | Boolean | Enables the telemetry service on Rafiki. Defaults to `true`. | N | +| `LIVENET` | Boolean | Determines where to send metrics. Defaults to `false`, resulting in metrics being sent to the testnet OTEL Collector.

    Set to `true` on production environments dealing with real money.

    | N | +| `OPEN_TELEMETRY_COLLECTOR_URLS` | String | A CSV of URLs for OTEL Collectors (e.g., `http://otel-collector-NLB-e3172ff9d2f4bc8a.elb.eu-west-2.amazonaws.com:4317,http://happy-life-otel-collector:4317`). | N | +| `OPEN_TELEMETRY_EXPORT_INTERVAL` | Number | Indicates, in milliseconds, how often the instrumented Rafiki instance should send metrics. Defaults to `15000`. | N | +| `TELEMETRY_EXCHANGE_RATES_URL` | String |

    Defines the endpoint Rafiki will query for exchange rates. Used as a fallback if/when [exchange rates](/integration/before-you-begin#provide-exchange-rate-details) aren’t provided.

    When set, the response format of the external exchange rates API should be of type `rates`, as is expected by the rate service.

    Defaults to `https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json`, which points to a public S3 that has the previously mentioned required format, updated daily.

    | N | ### Example Docker OTEL Collector image and configuration diff --git a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx index 056b53c3cc..9e0f7806b0 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx @@ -35,7 +35,7 @@ When a request comes from a client registered with another instance of Rafiki, t An identity provider (IdP) is a system or service that manages user authentication, identity information, and consent. When you use your Google account credentials to “Sign in with Google” on an app or website, for example, Google is acting as your identity provider. -Integration with an [IdP](/integration/before-you-begin#identity-providers) is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. +Integration with an [IdP](/integration/before-you-begin#integrate-with-your-identity-provider) is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. :::note Rafiki’s [`frontend`](/integration/deployment/services/frontend-service) service requires an IdP for authentication and user management of your administrators. Out of the box, Rafiki uses Ory Kratos to enable your admins to access the Admin API. Kratos is for internal use and cannot be used for your customer-facing Open Payments authorization server. diff --git a/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx index d534dbe334..a2fc17ae89 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx @@ -47,7 +47,7 @@ The roles of the connector include: The connector receives incoming packets via HTTP and/or direct calls from within the `backend`. The `backend` includes an HTTP server listening on the configured `CONNECTOR_PORT`. -The amounts within ILP packets are used to update account balances in your accounting database (TigerBeetle or Postgres). Amounts are adjusted based on Rafiki’s configured [exchange rates](/integration/before-you-begin#exchange-rates) and the asset used by the sending (outgoing) and receiving (destination) accounts. The total amount received for the STREAM connection is tracked in Redis in order to support STREAM receipts. +The amounts within ILP packets are used to update account balances in your accounting database (TigerBeetle or Postgres). Amounts are adjusted based on Rafiki’s configured [exchange rates](/integration/before-you-begin#provide-exchange-rate-details) and the asset used by the sending (outgoing) and receiving (destination) accounts. The total amount received for the STREAM connection is tracked in Redis in order to support STREAM receipts. ## GraphQL Backend Admin API diff --git a/packages/documentation/src/content/docs/integration/get-started.mdx b/packages/documentation/src/content/docs/integration/get-started.mdx deleted file mode 100644 index 064b7bcffe..0000000000 --- a/packages/documentation/src/content/docs/integration/get-started.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Get started ---- - -import { LinkOut } from '@interledger/docs-design-system' - -:::caution -Rafiki is intended for use by Account Servicing Entities only and should not be used in production by non-regulated entities. -::: - -As an account servicing entity, you provide and maintain payment accounts for your customers via your ledger. By integrating Rafiki with your backend environment, you bring Interledger functionality to those accounts, enabling them to transact with other accounts on different ledgers connected by the Interledger network. - -## Prerequisites - -To deploy, integrate, and operate Rafiki with your backend production environment, you will need the following components running in your infrastructure: - -- - Docker - -- - Node JS version 20 (LTS) - - -If you will be deploying to the cloud, then you will need the following additional components in your environment: - -- [nginx](/integration/deployment/prod/nginx) (if deploying all containers to a single node) -- [Helm and Kubernetes](/integration/deployment/prod/helm-k8s) (if deploying containers across a distributed environment) - -## Configuration - -To make your customers’ accounts Interledger-enabled, you must configure your Rafiki instance with these endpoints and services: - -- [Exchange Rates](/integration/before-you-begin#exchange-rates) -- [Webhook Events](/integration/before-you-begin#webhook-events) -- [Identity Provider](/integration/before-you-begin#identity-providers) - -In addition, each account you manage on your ledger must be issued at least one [wallet address](/integration/peering#create-wallet-address) to send and receive payments across the Interledger network. From 6f35708d1f87e807427f02150996e8d95a66d8d7 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Wed, 28 Aug 2024 09:01:20 +0300 Subject: [PATCH 41/91] Update packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx Co-authored-by: Sabine Schaller --- .../docs/integration/deployment/services/auth-service.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx index 9e0f7806b0..cf1f033ed3 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx @@ -8,7 +8,7 @@ Rafiki’s Date: Wed, 28 Aug 2024 12:01:52 +0300 Subject: [PATCH 44/91] docs: mi/move-env-variables-partials --- .../docs/resources/environment-variables.mdx | 93 ++----------------- .../src/partials/auth-variables.mdx | 29 ++++++ .../src/partials/backend-variables.mdx | 56 +++++++++++ .../src/partials/frontend-variables.mdx | 8 ++ 4 files changed, 99 insertions(+), 87 deletions(-) create mode 100644 packages/documentation/src/partials/auth-variables.mdx create mode 100644 packages/documentation/src/partials/backend-variables.mdx create mode 100644 packages/documentation/src/partials/frontend-variables.mdx diff --git a/packages/documentation/src/content/docs/resources/environment-variables.mdx b/packages/documentation/src/content/docs/resources/environment-variables.mdx index 45945d1d3a..932323efb9 100644 --- a/packages/documentation/src/content/docs/resources/environment-variables.mdx +++ b/packages/documentation/src/content/docs/resources/environment-variables.mdx @@ -3,6 +3,9 @@ title: Environment variables --- import { LinkOut } from '@interledger/docs-design-system' +import BackEnv from '/src/partials/backend-variables.mdx' +import AuthEnv from '/src/partials/auth-variables.mdx' +import FrontEnv from '/src/partials/frontend-variables.mdx' To run Rafiki you must set the environment variables for the `backend`, `auth` and `frontend` services listed below. @@ -15,96 +18,12 @@ If you are running Rafiki via Helm and Kubernetes, then you must update the vari ## Backend -| Variable | Helm Value Name | Default | Description | -| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ADMIN_PORT` | backend.port.admin | `3001` | Admin API GraphQL Server port | -| `AUTH_SERVER_GRANT_URL` | | `undefined` | endpoint on the Open Payments Auth Server to request a grant | -| `AUTH_SERVER_INTROSPECTION_URL` | | `undefined` | endpoint on the Open Payments Auth Server to introspect an access token | -| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/integration/deployment/playground/autopeering/) is enabled, its server will use this port | -| `CONNECTOR_PORT` | backend.port.connector | `3002` | port of the ILP connector for for sending packets over ILP over HTTP | -| `DATABASE_URL` | backend.postgresql.host, backend.postgresql.port, backend.postgresql.username, backend.postgresql.database, backend.postgresql.password | `postgresql://postgres:password@localhost:5432/development` | Postgres database URL of database storing the resource data; For Helm, these components are provided individually. | -| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/integration/deployment/playground/autopeering/). | -| `ENABLE_SPSP_PAYMENT_POINTERS` | | `true` | enables SPSP route | -| `EXCHANGE_RATES_LIFETIME` | backend.lifetime.exchangeRate | `15_000` | time in milliseconds the exchange rates provided by the ASE via the EXCHANGE_RATES_URL are valid for | -| `EXCHANGE_RATES_URL` | backend.serviceUrls.EXCHANGE_RATES_URL | `undefined` | endpoint on the Account Servicing Entity to request exchange rates | -| `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` | backend.idempotencyTTL | `86400000` | TTL in milliseconds for idempotencyKey on GraphQL mutations (Admin API). Default: 24hrs | -| `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` | | `2000` | TTL in milliseconds for idempotencyKey concurrency lock on GraphQL mutations (Admin API) | -| `ILP_ADDRESS` | backend.ilp.address | `undefined` | ILP address of this Rafiki instance | -| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/integration/deployment/playground/autopeering/) | -| `INCOMING_PAYMENT_EXPIRY_MAX_MS` | | `2592000000` | Maximum milliseconds into the future incoming payments expiry can be set to on creation. Default: 30 days | -| `INCOMING_PAYMENT_WORKERS` | backend.workers.incomingPayment | `1` | number of workers processing incoming payment requests | -| `INCOMING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that INCOMING_PAYMENT_WORKERS will wait until they check an empty incoming payment request queue again | -| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/integration/deployment/playground/autopeering/) | -| `KEY_ID` | backend.key.id | `undefined` | this Rafiki instance's client key id | -| `LOG_LEVEL` | backend.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | -| `NODE_ENV` | backend.nodeEnv | `development` | node environment, `development`, `test`, or `production` | -| `OPEN_PAYMENTS_PORT` | backend.port.openPayments | `3003` | port of the Open Payments resource server port | -| `OPEN_PAYMENTS_URL` | backend.serviceUrls.OPEN_PAYMENTS_URL | `undefined` | public endpoint of this Open Payments Resource Server | -| `OUTGOING_PAYMENT_WORKERS` | backend.workers.outgoingPayment | `4` | number of workers processing outgoing payment requests | -| `OUTGOING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that OUTGOING_PAYMENT_WORKERS will wait until they check an empty outgoing payment request queue again | -| `PRIVATE_KEY_FILE` | backend.key.file | `undefined` | the path to this Rafiki instance's client private key | -| `QUOTE_LIFESPAN` | backend.lifetime.quote | `5 * 60_000` | time in milliseconds an Open Payments quote is valid for | -| `REDIS_TLS_CA_FILE_PATH` | backend.redis.tlsCaFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_TLS_CERT_FILE_PATH` | backend.redis.tlsCertFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_TLS_KEY_FILE_PATH` | backend.redis.tlsKeyFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_URL` | backend.redis.host, backend.redis.port | `redis://127.0.0.1:6379` | Redis URL of database handling ILP packet data URL; For Helm, these components are provided individually. | -| `SIGNATURE_SECRET` | backend.quoteSignatureSecret | `undefined` | secret to generate request header signatures for webhook event requests | -| `SIGNATURE_VERSION` | | `1` | version number to generate request header signatures for webhook event requests | -| `SLIPPAGE` | backend.ilp.slippage | `0.01` | accepted ILP rate fluctuation, default 1% | -| `STREAM_SECRET` | backend.ilp.streamSecret | undefined | seed secret to generate shared STREAM secrets | -| `TIGERBEETLE_CLUSTER_ID` | | `0` | Tigerbeetle cluster ID picked by the system that starts the TigerBeetle cluster to create a [Tigerbeetle client](https://docs.tigerbeetle.com/clients/node#creating-a-client) | -| `TIGERBEETLE_REPLICA_ADDRESSES` | | `3004` | Tigerbeetle replica addresses for all replicas in the cluster, which are comma separated IP addresses/ports, to create a [Tigerbeetle client](https://docs.tigerbeetle.com/clients/node#creating-a-client) | -| `TRUST_PROXY` | | `false` | flag to use X-Forwarded-Proto header to determine if connections is secure | -| `USE_TIGERBEETLE` | | `true` | flag - use TigerBeetle or Postgres for accounting | -| `WALLET_ADDRESS_DEACTIVATION_PAYMENT_GRACE_PERIOD_MS` | | `86400000` | time in milliseconds into the future to set expiration of open incoming payments when deactivating wallet address. Default: 1 days | -| `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` | | `1500` | time in milliseconds the ASE has to create a missing wallet address until timeout | -| `WALLET_ADDRESS_POLLING_FREQUENCY_MS` | | `100` | frequency of polling while waiting for ASE to create a missing wallet address | -| `WALLET_ADDRESS_URL` | backend.serviceUrls.WALLET_ADDRESS_URL | `http://127.0.0.1:3001/.well-known/pay` | this Rafiki instance's internal wallet address | -| `WALLET_ADDRESS_WORKERS` | backend.workers.walletAddress | `1` | number of workers processing wallet address requests | -| `WALLET_ADDRESS_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that WALLET_ADDRESS_WORKERS will wait until they check an empty wallet address request queue again | -| `WEBHOOK_MAX_RETRY` | backend.webhookMaxRetry | `10` | maximum number of times Rafiki backend retries sending a certain webhook event to the configured WEBHOOK_URL | -| `WEBHOOK_TIMEOUT` | backend.lifetime.webhook | `2000` | milliseconds | -| `WEBHOOK_URL` | backend.serviceUrls.WEBHOOK_URL | `undefined` | endpoint on the Account Servicing Entity that consumes webhook events | -| `WEBHOOK_WORKERS` | backend.workers.webhook | `1` | number of workers processing webhook events | -| `WEBHOOK_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that WEBHOOK_WORKERS will wait until they check an empty webhook event queue again | -| `WITHDRAWAL_THROTTLE_DELAY` | backend.withdrawalThrottleDelay | `undefined` | delay in liquidity withdrawal processing | -| `ENABLE_MANUAL_MIGRATIONS` | backend.enableManualMigrations | `false` | When set to true, user needs to run database manually with command `npm run knex -- migrate:latest --env production` | + ## Auth -| Variable | Helm Value Name | Default | Description | -| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ACCESS_TOKEN_DELETION_DAYS` | auth.accessToken.deletionDays | `30` | days until expired or revoked access tokens are deleted | -| `ACCESS_TOKEN_EXPIRY_SECONDS` | auth.accessToken.expirySeconds | `10 * 60` | expiry time in seconds for access tokens (default: 10 minutes) | -| `ADMIN_PORT` | auth.port.admin | `3003` | Admin API GraphQL Server port | -| `AUTH_DATABASE_URL` | auth.postgresql.host, auth.postgresql.port, auth.postgresql.username, auth.postgresql.database, auth.postgresql.password | `postgresql://postgres:password@localhost:5432/auth_development` | Postgres database URL of database storing the grant data; For Helm, these components are provided individually. | -| `AUTH_PORT` | auth.port.auth | `3006` | port of this Open Payments Auth Server | -| `AUTH_SERVER_URL` | | | Public endpoint for this Rafiki instance's public Open Payment routes. | -| `COOKIE_KEY` | auth.cookieKey | | [koa KeyGrip key](https://koajs.com/#app-keys-) that is used to sign cookies for an interaction session | -| `DATABASE_CLEANUP_WORKERS` | auth.workers.cleanup | `1` | number of workers processing expired or revoked access tokens | -| `IDENTITY_SERVER_URL` | auth.identityServer.domain | | endpoint of the identity server controlled by the Account Servicing Entity | -| `IDENTITY_SERVER_SECRET` | auth.identityServer.secret | | API key to fetch the identity server endpoint | -| `INCOMING_PAYMENT_INTERACTION` | auth.interaction.incomingPayment | `false` | flag - incoming payments grant requests are interactive or not | -| `INTERACTION_EXPIRY_SECONDS` | auth.interactionExpirySeconds | `600` | time in seconds for which a user can interact with a grant request | -| `INTERACTION_PORT` | auth.port.interaction | `3009` | Port number for the interaction APIs | -| `INTROSPECTION_PORT` | auth.port.introspection | `3007` | port of this Open Payments Auth - Token Introspection Server | -| `LIST_ALL_ACCESS_INTERACTION` | | `true` | Specify whether grant requests including a `list-all` action should require interaction. In these requests, the client asks to list resources that they themselves did not create. | -| `LOG_LEVEL` | auth.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | -| `NODE_ENV` | auth.nodeEnv | `development` | node environment, `development`, `test`, or `production` | -| `QUOTE_INTERACTION` | auth.interaction.quote | `false` | flag - quote grants are interactive or not | -| `REDIS_TLS_CA_FILE_PATH` | auth.redis.tlsCaFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_TLS_CERT_FILE_PATH` | auth.redis.tlsCertFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_TLS_KEY_FILE_PATH` | auth.redis.tlsKeyFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | -| `REDIS_URL` | `auth.redis.host`, `auth.redis.port` | `redis://127.0.0.1:6379` | The connection URL for Redis. For Helm, these components are provided individually. | -| `TRUST_PROXY` | | `false` | flag to use X-Forwarded-Proto header to determine if connections is secure | -| `WAIT_SECONDS` | auth.grant.waitSeconds | `5` | wait time included in grant request response (`grant.continue`) | -| `ENABLE_MANUAL_MIGRATIONS` | auth.enableManualMigrations | `false` | When set to true, user needs to run database manually with command `npm run knex -- migrate:latest --env production` | + ## Frontend -| Variable | Helm Value Name | Default | Description | -| -------------------------------- | -------------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `GRAPHQL_URL` | frontend.serviceUrls.GRAPHQL_URL | `http://localhost:3001/graphql` | URL for the GraphQL Admin API | -| `OPEN_PAYMENTS_URL` | frontend.serviceUrls.OPEN_PAYMENTS_URL | `http://localhost:3003/` | Open Payments API Endpoint | -| `PORT` | frontend.port | `3005` | Port from which to host the Remix app | -| `ENABLE_INSECURE_MESSAGE_COOKIE` | | _undefined_ | Values of `true`, `t`, `1` will not use a `secure` message cookie which is required for flash messages to work over http. When not set, the secure flag is set according to `NODE_ENV`. | + diff --git a/packages/documentation/src/partials/auth-variables.mdx b/packages/documentation/src/partials/auth-variables.mdx new file mode 100644 index 0000000000..abdf1c4527 --- /dev/null +++ b/packages/documentation/src/partials/auth-variables.mdx @@ -0,0 +1,29 @@ +import { LinkOut } from '@interledger/docs-design-system' + +| Variable | Helm Value Name | Default | Description | +| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ACCESS_TOKEN_DELETION_DAYS` | auth.accessToken.deletionDays | `30` | days until expired or revoked access tokens are deleted | +| `ACCESS_TOKEN_EXPIRY_SECONDS` | auth.accessToken.expirySeconds | `10 * 60` | expiry time in seconds for access tokens (default: 10 minutes) | +| `ADMIN_PORT` | auth.port.admin | `3003` | Admin API GraphQL Server port | +| `AUTH_DATABASE_URL` | auth.postgresql.host, auth.postgresql.port, auth.postgresql.username, auth.postgresql.database, auth.postgresql.password | `postgresql://postgres:password@localhost:5432/auth_development` | Postgres database URL of database storing the grant data; For Helm, these components are provided individually. | +| `AUTH_PORT` | auth.port.auth | `3006` | port of this Open Payments Auth Server | +| `AUTH_SERVER_URL` | | | Public endpoint for this Rafiki instance's public Open Payment routes. | +| `COOKIE_KEY` | auth.cookieKey | | [koa KeyGrip key](https://koajs.com/#app-keys-) that is used to sign cookies for an interaction session | +| `DATABASE_CLEANUP_WORKERS` | auth.workers.cleanup | `1` | number of workers processing expired or revoked access tokens | +| `IDENTITY_SERVER_URL` | auth.identityServer.domain | | endpoint of the identity server controlled by the Account Servicing Entity | +| `IDENTITY_SERVER_SECRET` | auth.identityServer.secret | | API key to fetch the identity server endpoint | +| `INCOMING_PAYMENT_INTERACTION` | auth.interaction.incomingPayment | `false` | flag - incoming payments grant requests are interactive or not | +| `INTERACTION_EXPIRY_SECONDS` | auth.interactionExpirySeconds | `600` | time in seconds for which a user can interact with a grant request | +| `INTERACTION_PORT` | auth.port.interaction | `3009` | Port number for the interaction APIs | +| `INTROSPECTION_PORT` | auth.port.introspection | `3007` | port of this Open Payments Auth - Token Introspection Server | +| `LIST_ALL_ACCESS_INTERACTION` | | `true` | Specify whether grant requests including a `list-all` action should require interaction. In these requests, the client asks to list resources that they themselves did not create. | +| `LOG_LEVEL` | auth.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | +| `NODE_ENV` | auth.nodeEnv | `development` | node environment, `development`, `test`, or `production` | +| `QUOTE_INTERACTION` | auth.interaction.quote | `false` | flag - quote grants are interactive or not | +| `REDIS_TLS_CA_FILE_PATH` | auth.redis.tlsCaFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_TLS_CERT_FILE_PATH` | auth.redis.tlsCertFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_TLS_KEY_FILE_PATH` | auth.redis.tlsKeyFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_URL` | `auth.redis.host`, `auth.redis.port` | `redis://127.0.0.1:6379` | The connection URL for Redis. For Helm, these components are provided individually. | +| `TRUST_PROXY` | | `false` | flag to use X-Forwarded-Proto header to determine if connections is secure | +| `WAIT_SECONDS` | auth.grant.waitSeconds | `5` | wait time included in grant request response (`grant.continue`) | +| `ENABLE_MANUAL_MIGRATIONS` | auth.enableManualMigrations | `false` | When set to true, user needs to run database manually with command `npm run knex -- migrate:latest --env production` | diff --git a/packages/documentation/src/partials/backend-variables.mdx b/packages/documentation/src/partials/backend-variables.mdx new file mode 100644 index 0000000000..a0cf4be2b8 --- /dev/null +++ b/packages/documentation/src/partials/backend-variables.mdx @@ -0,0 +1,56 @@ +import { LinkOut } from '@interledger/docs-design-system' + +| Variable | Helm Value Name | Default | Description | +| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ADMIN_PORT` | backend.port.admin | `3001` | Admin API GraphQL Server port | +| `AUTH_SERVER_GRANT_URL` | | `undefined` | endpoint on the Open Payments Auth Server to request a grant | +| `AUTH_SERVER_INTROSPECTION_URL` | | `undefined` | endpoint on the Open Payments Auth Server to introspect an access token | +| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/integration/deployment/playground/autopeering/) is enabled, its server will use this port | +| `CONNECTOR_PORT` | backend.port.connector | `3002` | port of the ILP connector for for sending packets over ILP over HTTP | +| `DATABASE_URL` | backend.postgresql.host, backend.postgresql.port, backend.postgresql.username, backend.postgresql.database, backend.postgresql.password | `postgresql://postgres:password@localhost:5432/development` | Postgres database URL of database storing the resource data; For Helm, these components are provided individually. | +| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/integration/deployment/playground/autopeering/). | +| `ENABLE_SPSP_PAYMENT_POINTERS` | | `true` | enables SPSP route | +| `EXCHANGE_RATES_LIFETIME` | backend.lifetime.exchangeRate | `15_000` | time in milliseconds the exchange rates provided by the ASE via the EXCHANGE_RATES_URL are valid for | +| `EXCHANGE_RATES_URL` | backend.serviceUrls.EXCHANGE_RATES_URL | `undefined` | endpoint on the Account Servicing Entity to request exchange rates | +| `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` | backend.idempotencyTTL | `86400000` | TTL in milliseconds for idempotencyKey on GraphQL mutations (Admin API). Default: 24hrs | +| `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` | | `2000` | TTL in milliseconds for idempotencyKey concurrency lock on GraphQL mutations (Admin API) | +| `ILP_ADDRESS` | backend.ilp.address | `undefined` | ILP address of this Rafiki instance | +| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/integration/deployment/playground/autopeering/) | +| `INCOMING_PAYMENT_EXPIRY_MAX_MS` | | `2592000000` | Maximum milliseconds into the future incoming payments expiry can be set to on creation. Default: 30 days | +| `INCOMING_PAYMENT_WORKERS` | backend.workers.incomingPayment | `1` | number of workers processing incoming payment requests | +| `INCOMING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that INCOMING_PAYMENT_WORKERS will wait until they check an empty incoming payment request queue again | +| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/integration/deployment/playground/autopeering/) | +| `KEY_ID` | backend.key.id | `undefined` | this Rafiki instance's client key id | +| `LOG_LEVEL` | backend.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | +| `NODE_ENV` | backend.nodeEnv | `development` | node environment, `development`, `test`, or `production` | +| `OPEN_PAYMENTS_PORT` | backend.port.openPayments | `3003` | port of the Open Payments resource server port | +| `OPEN_PAYMENTS_URL` | backend.serviceUrls.OPEN_PAYMENTS_URL | `undefined` | public endpoint of this Open Payments Resource Server | +| `OUTGOING_PAYMENT_WORKERS` | backend.workers.outgoingPayment | `4` | number of workers processing outgoing payment requests | +| `OUTGOING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that OUTGOING_PAYMENT_WORKERS will wait until they check an empty outgoing payment request queue again | +| `PRIVATE_KEY_FILE` | backend.key.file | `undefined` | the path to this Rafiki instance's client private key | +| `QUOTE_LIFESPAN` | backend.lifetime.quote | `5 * 60_000` | time in milliseconds an Open Payments quote is valid for | +| `REDIS_TLS_CA_FILE_PATH` | backend.redis.tlsCaFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_TLS_CERT_FILE_PATH` | backend.redis.tlsCertFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_TLS_KEY_FILE_PATH` | backend.redis.tlsKeyFile | `''` | [Redis TLS config](https://redis.io/docs/management/security/encryption/) | +| `REDIS_URL` | backend.redis.host, backend.redis.port | `redis://127.0.0.1:6379` | Redis URL of database handling ILP packet data URL; For Helm, these components are provided individually. | +| `SIGNATURE_SECRET` | backend.quoteSignatureSecret | `undefined` | secret to generate request header signatures for webhook event requests | +| `SIGNATURE_VERSION` | | `1` | version number to generate request header signatures for webhook event requests | +| `SLIPPAGE` | backend.ilp.slippage | `0.01` | accepted ILP rate fluctuation, default 1% | +| `STREAM_SECRET` | backend.ilp.streamSecret | undefined | seed secret to generate shared STREAM secrets | +| `TIGERBEETLE_CLUSTER_ID` | | `0` | Tigerbeetle cluster ID picked by the system that starts the TigerBeetle cluster to create a [Tigerbeetle client](https://docs.tigerbeetle.com/clients/node#creating-a-client) | +| `TIGERBEETLE_REPLICA_ADDRESSES` | | `3004` | Tigerbeetle replica addresses for all replicas in the cluster, which are comma separated IP addresses/ports, to create a [Tigerbeetle client](https://docs.tigerbeetle.com/clients/node#creating-a-client) | +| `TRUST_PROXY` | | `false` | flag to use X-Forwarded-Proto header to determine if connections is secure | +| `USE_TIGERBEETLE` | | `true` | flag - use TigerBeetle or Postgres for accounting | +| `WALLET_ADDRESS_DEACTIVATION_PAYMENT_GRACE_PERIOD_MS` | | `86400000` | time in milliseconds into the future to set expiration of open incoming payments when deactivating wallet address. Default: 1 days | +| `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` | | `1500` | time in milliseconds the ASE has to create a missing wallet address until timeout | +| `WALLET_ADDRESS_POLLING_FREQUENCY_MS` | | `100` | frequency of polling while waiting for ASE to create a missing wallet address | +| `WALLET_ADDRESS_URL` | backend.serviceUrls.WALLET_ADDRESS_URL | `http://127.0.0.1:3001/.well-known/pay` | this Rafiki instance's internal wallet address | +| `WALLET_ADDRESS_WORKERS` | backend.workers.walletAddress | `1` | number of workers processing wallet address requests | +| `WALLET_ADDRESS_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that WALLET_ADDRESS_WORKERS will wait until they check an empty wallet address request queue again | +| `WEBHOOK_MAX_RETRY` | backend.webhookMaxRetry | `10` | maximum number of times Rafiki backend retries sending a certain webhook event to the configured WEBHOOK_URL | +| `WEBHOOK_TIMEOUT` | backend.lifetime.webhook | `2000` | milliseconds | +| `WEBHOOK_URL` | backend.serviceUrls.WEBHOOK_URL | `undefined` | endpoint on the Account Servicing Entity that consumes webhook events | +| `WEBHOOK_WORKERS` | backend.workers.webhook | `1` | number of workers processing webhook events | +| `WEBHOOK_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that WEBHOOK_WORKERS will wait until they check an empty webhook event queue again | +| `WITHDRAWAL_THROTTLE_DELAY` | backend.withdrawalThrottleDelay | `undefined` | delay in liquidity withdrawal processing | +| `ENABLE_MANUAL_MIGRATIONS` | backend.enableManualMigrations | `false` | When set to true, user needs to run database manually with command `npm run knex -- migrate:latest --env production` | diff --git a/packages/documentation/src/partials/frontend-variables.mdx b/packages/documentation/src/partials/frontend-variables.mdx new file mode 100644 index 0000000000..a69b6f252e --- /dev/null +++ b/packages/documentation/src/partials/frontend-variables.mdx @@ -0,0 +1,8 @@ +import { LinkOut } from '@interledger/docs-design-system' + +| Variable | Helm Value Name | Default | Description | +| -------------------------------- | -------------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `GRAPHQL_URL` | frontend.serviceUrls.GRAPHQL_URL | `http://localhost:3001/graphql` | URL for the GraphQL Admin API | +| `OPEN_PAYMENTS_URL` | frontend.serviceUrls.OPEN_PAYMENTS_URL | `http://localhost:3003/` | Open Payments API Endpoint | +| `PORT` | frontend.port | `3005` | Port from which to host the Remix app | +| `ENABLE_INSECURE_MESSAGE_COOKIE` | | _undefined_ | Values of `true`, `t`, `1` will not use a `secure` message cookie which is required for flash messages to work over http. When not set, the secure flag is set according to `NODE_ENV`. | From e10ec254eb655e58a1bd61fd6504c7c7fd380dbc Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Wed, 28 Aug 2024 12:13:44 +0300 Subject: [PATCH 45/91] docs: mi/update-env-variables --- .../src/content/docs/resources/environment-variables.mdx | 8 ++------ packages/documentation/src/partials/variables-warning.mdx | 8 ++++++++ 2 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 packages/documentation/src/partials/variables-warning.mdx diff --git a/packages/documentation/src/content/docs/resources/environment-variables.mdx b/packages/documentation/src/content/docs/resources/environment-variables.mdx index 932323efb9..dd2ae09b18 100644 --- a/packages/documentation/src/content/docs/resources/environment-variables.mdx +++ b/packages/documentation/src/content/docs/resources/environment-variables.mdx @@ -6,15 +6,11 @@ import { LinkOut } from '@interledger/docs-design-system' import BackEnv from '/src/partials/backend-variables.mdx' import AuthEnv from '/src/partials/auth-variables.mdx' import FrontEnv from '/src/partials/frontend-variables.mdx' +import VarWarn from '/src/partials/variables-warning.mdx' To run Rafiki you must set the environment variables for the `backend`, `auth` and `frontend` services listed below. -:::caution -If you are running Rafiki via Docker, then you must update the variables in the docker-compose files of the respective services. - -If you are running Rafiki via Helm and Kubernetes, then you must update the variables in the values.yaml file of the example Helm chart. - -::: + ## Backend diff --git a/packages/documentation/src/partials/variables-warning.mdx b/packages/documentation/src/partials/variables-warning.mdx new file mode 100644 index 0000000000..2171423399 --- /dev/null +++ b/packages/documentation/src/partials/variables-warning.mdx @@ -0,0 +1,8 @@ +import { LinkOut } from '@interledger/docs-design-system' + +:::caution +If you are running Rafiki via Docker, then you must update the variables in the docker-compose files of the respective services. + +If you are running Rafiki via Helm and Kubernetes, then you must update the variables in the values.yaml file of the example Helm chart. + +::: From 68c4cd2434016f13b88de601d89dc417394d22b3 Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Wed, 28 Aug 2024 12:28:47 +0300 Subject: [PATCH 46/91] docs user guide updates Added screenshots Added new image classes Content edits --- .../public/img/admin-guide/delete-peer.png | Bin 0 -> 17304 bytes .../content/docs/admin/admin-user-guide.mdx | 102 ++++++++++-------- 2 files changed, 57 insertions(+), 45 deletions(-) create mode 100644 packages/documentation/public/img/admin-guide/delete-peer.png diff --git a/packages/documentation/public/img/admin-guide/delete-peer.png b/packages/documentation/public/img/admin-guide/delete-peer.png new file mode 100644 index 0000000000000000000000000000000000000000..823b98587aca2344b95c79028d063e0ba0d1cf39 GIT binary patch literal 17304 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 literal 0 HcmV?d00001 diff --git a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx index eb7cb10578..b523ae4aed 100644 --- a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx +++ b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx @@ -4,6 +4,8 @@ title: Rafiki Admin application user guide import { LinkOut } from '@interledger/docs-design-system' +import { LargeImg } from '@interledger/docs-design-system' + The Rafiki Admin application provides tools to manage peers, assets, wallet addresses, webhooks, payments, and account settings. The purpose of this document is to help you navigate and use the Rafiki Admin application effectively. ## Getting started @@ -17,10 +19,9 @@ The Rafiki Admin application provides tools to manage peers, assets, wallet addr After logging in, you’ll be greeted by the main landing page with a left-hand navigation menu. This menu provides access to all of the main functionality needed to manage your Rafiki instance. -Rafiki Admin application user interface welcome screen with navigation options like Home, Peers, Assets, Wallet Addresses, Webhooks, and more on the left sidebar. Each of the following menu items leads to a different page of the Rafiki Admin application: @@ -38,20 +39,18 @@ The Peers page allows you to manage peering relationships in your Rafiki instanc On this page, all configured peers are displayed in a table where you can view the peer name, its ILP address, asset details including the asset type and scale, and the outgoing HTTP endpoint. -A screenshot of the Rafiki Admin application user interface displaying the "Peers" section. It shows a table containing a peer with details including ILP address, asset, and outgoing HTTP endpoint. A "Create peer" button is in the top right. ### Create peer To create a new peer, select **Create Peer** from the main Peers page. -A screenshot of the Rafiki Admin application user interface displaying the "Create Peer" section. It shows several text fields to configure in order to create a new peer. A "Create" button is in the lower right. Fill out the following fields to configure and create your peer: @@ -72,10 +71,9 @@ After completing these fields, select **Create** to add the new peer. To edit an existing peer, select any peer entry from the table on the main Peers page. This opens the Edit Peer page where you can view and modify peer settings. -A screenshot of the Rafiki Admin application user interface displaying the "Edit Peer" section. It shows several text fields configured for an existing peer. This page is used to view peer details, edit peer details, and delete a peer. While the Edit Peer page shares fields with the Create Peer page, it also includes additional fields and actions specific to managing an existing peer: @@ -83,7 +81,7 @@ While the Edit Peer page shares fields with the Create Peer page, it also includ | **Section** | **Field/Action** | **Description** | | --------------------- | ------------------ | ----------------------------------------------------------------------------------------- | | General Information | Peer ID | A unique identifier assigned by Rafiki when the peer was created. This cannot be changed. | -| Asset Information | View Asset | To see more information about an asset, select **View asset**. | +| Asset Information | View Asset | For more information about an asset, select **View asset**. | | Liquidity Information | Amount | Current amount of peer liquidity available. | | | Deposit Liquidity | To increase the amount of liquidity available, select **Deposit liquidity**. | | | Withdraw Liquidity | To reduce the amount of liquidity available, select **Withdraw liquidity**. | @@ -94,26 +92,31 @@ After editing any of the above fields in the General Information or HTTP Informa The final section of the Peers page is the irreversible action of deleting a peer. Select **Delete peer** to make this change. + + +Confirm the deletion by typing "delete peer" into the text field and selecting **Delete this peer**. + ## Assets The Assets page allows you to manage assets in your Rafiki instance, including viewing, editing, and creating assets. On this page, all configured assets are displayed in a table where you can view the asset ID, the asset code, the scale, and the withdrawal threshold. -A screenshot of the Rafiki Admin application user interface displaying the "Assets" section. It shows a table containing four assets with details including ID, asset code, asset scale, and withdrawal threshold. An "Add asset" button is in the top right. ### Create asset To create a new asset, select **Add Asset** from the main Assets page. -A screenshot of the Rafiki Admin application user interface displaying the "Create Asset" section. It shows several text fields to configure in order to create a new asset. A "Create" button is in the lower right. Fill out the following fields to create your new asset: @@ -130,23 +133,22 @@ After completing these fields, select **Create** to add the new asset. To edit an existing asset, select any asset entry from the table on the main Assets page. This opens the Edit Asset page where you can view and modify asset settings. -A screenshot of the Rafiki Admin application user interface displaying the "Edit Asset" section. It shows several text fields configured for an existing asset. This page is used to view and edit asset details. While the Edit Asset page shares fields with the Create Asset page, it also includes additional fields and actions specific to managing an existing asset: -| **Section** | **Field/Action** | **Description** | -| --------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | -| General Information | Asset ID | A unique identifier assigned by Rafiki when the asset was created. This cannot be changed. | -| Liquidity Information | Amount | Current amount of asset liquidity available. | -| | Deposit Liquidity | To increase the amount of liquidity available, select **Deposit liquidity**. | -| | Withdraw Liquidity | To reduce the amount of liquidity available, select **Withdraw liquidity**. | -| Sending Fee | Fixed Fee | Flat fee per asset. | -| | Basis Points | A variable fee per asset. One basis point fee is equal to 0.01% of the total amount, 100 basis points = 1%, 10000 basis points = 100% | -| | Fee history | To view a list of asset fees over time, select **Fee history**. | +| **Section** | **Field/Action** | **Description** | +| --------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| General Information | Asset ID | A unique identifier assigned by Rafiki when the asset was created. This cannot be changed. | +| Liquidity Information | Amount | Current amount of asset liquidity available. | +| | Deposit Liquidity | To increase the amount of liquidity available, select **Deposit liquidity**. | +| | Withdraw Liquidity | To reduce the amount of liquidity available, select **Withdraw liquidity**. | +| Sending Fee | Fixed Fee | Flat fee per asset, specified in the smallest unit as defined by the asset scale. In our screenshot above, a fixed fee value of 100 with a scale of 2 represents 1 USD. | +| | Basis Points | A variable fee per asset. One basis point fee is equal to 0.01% of the total amount, 100 basis points = 1%, 10000 basis points = 100% | +| | Fee history | To view a list of asset fees over time, select **Fee history**. | After editing any of the above fields in the General Information or Sending Fee sections, select **Save** to commit those changes. @@ -156,32 +158,30 @@ The Wallet Addresses page allows you to manage the wallet addresses associated w On this page, all configured wallet addresses are displayed in the table where you can view the address URL, the public name, and the wallet status. -A screenshot of the Rafiki Admin application user interface displaying the "Wallet Addresses" section. It shows a table containing four wallet addresses with details including URL of the address, public name, and status. A "Create wallet address" button is in the top right. ### Create wallet address To create a new wallet address, select **Create wallet address** from the main Wallet Address page. -A screenshot of the Rafiki Admin application user interface displaying the "Create Wallet Address" section. It shows several text fields to configure in order to create a new wallet address. A "Create" button is in the lower right. Fill out the following fields to create a new wallet address: -| **Section** | **Field** | **Description** | -| ------------------- | ------------------- | -------------------------------------------------------------- | -| General Information | Wallet address name | The URL of the wallet. Once set, it cannot be changed. | -| | Public name | The name associated with the wallet that is visible to others. | -| | Asset | Select an asset to associate with this wallet. | +| **Section** | **Field** | **Description** | +| ------------------- | ------------------- | --------------------------------------------------------------------------- | +| General Information | Wallet address name | The URL of the wallet. Once set, it cannot be changed. | +| | Public name | The name associated with the wallet that is visible to anyone with the URL. | +| | Asset | Select an asset to associate with this wallet. | :::note -At least one asset has to be created prior to creating a new wallet address. See [Create asset](#create-asset) for more information. +At least one asset has to be created prior to creating a new wallet address. Refer to [Create asset](#create-asset) for more information. ::: After completing this section, select **Create** to add the new wallet address. @@ -190,10 +190,9 @@ After completing this section, select **Create** to add the new wallet address. To edit an existing wallet address, select any wallet address entry from the table on the main Wallet Addresses page. This opens the Edit Wallet Address page where you can view and modify wallet address details. -A screenshot of the Rafiki Admin application user interface displaying the "Edit Wallet Address" section. It shows several text fields configured for an existing wallet address. This page is used to view and edit wallet address details. While the Edit Wallet Address page shares fields with the Create Wallet Address page, it also includes additional fields and actions specific to managing an existing wallet address. @@ -206,22 +205,37 @@ While the Edit Wallet Address page shares fields with the Create Wallet Address | Asset Information | Code | The asset code, generally an ISO 4217 currency code where available. | | | Scale | Difference in order of magnitude between the standard unit and a fractional unit. | | | Withdrawal threshold | The minimum amount of liquidity that can be withdrawn from the asset. | -| | View asset | To see more information about an asset, select **View asset**. | +| | View asset | For more information about an asset, select **View asset**. | | Liquidity Information | Amount | Current amount of liquidity available for this wallet. | | | Withdraw | To withdraw funds from this wallet, select **Withdraw**. | After editing any of the above fields in the General Information section, select **Save** to commit those changes. +:::note[What if I need to edit or delete a wallet address?] +When managing wallet addresses in Rafiki, there are certain restrictions and limitations to be aware of: + +**Editing wallet address URLs** + +The URL of an existing wallet address cannot be edited. Changing the URL could disrupt the transaction history associated with that wallet address, potentially leading to inaccuracies in payment records. + +**Deleting wallet addresses** + +Wallet addresses cannot be deleted from the system. This restriction exists to ensure that any payments tied to a wallet address remain intact and accessible for reporting purposes. + +**Solution** + +In both cases, the recommended approach is to create a new wallet address and deactivate the old one. Note that deactivation of a wallet address is currently only available via the API and not through the Rafiki Admin application. +::: + ## Webhooks -The Webhook Events page allows you to monitor and manage webhook events within your Rafiki instance. Webhook events in Rafiki are the main communication channel between you and your Rafiki instance. See [Webhook events](/integration/before-you-begin#webhook-events) for more information about webhook events. +The Webhook Events page allows you to monitor and manage webhook events within your Rafiki instance. Webhook events in Rafiki are the main communication channel between you and your Rafiki instance. Refer to [Webhook events](/integration/before-you-begin#webhook-events) for more information about webhook events. -All webhook events that have been triggered are displayed in the table. For each webhook event, you can see the webhook ID, the event type, and the date and time of the event. There is also a field at the top of the page allowing you to filter the table by event type, making it easier to drill down into specific events. +All webhook events that have been triggered are displayed in the table. For each webhook event, the webhook ID, the event type, and the date and time of the event are provided. There is also a field at the top of the page allowing you to filter the table by event type, making it easier to drill down into specific events. -A screenshot of the Rafiki Admin application user interface displaying the "Webhook Events" section. It shows a table containing one webhook event with details including ID, type of webhook, and the date of the event. A "View data" button is also present in the table row for a detailed JSON view of the event data. To view the webhook event as a JSON representation, select **View data**. @@ -232,20 +246,18 @@ The Payments page allows you to view all incoming and outgoing payments in your All payments are displayed in the table. For each payment, you can view the unique payment ID, type of payment, state of the payment, and the date and time the payment was created. There is also a field at the top of the page allowing you to filter the table by payment type, making it easier to drill down into specific transactions. -A screenshot of the Rafiki Admin application user interface displaying the "Payments" section. It shows a table where payment details would be displayed including ID, payment type, payment state, and the date of the payment. ## Account settings The Account Settings page allows you to manage your personal account information, including updating your email address and password. -A screenshot of the Rafiki Admin application user interface displaying the "Account Settings" section. It shows two text fields: one to change an email address and one to change a password. To change your email address, enter the new email address and select **Save**. From 8d865420bb6a6ec20579a7a560a3279388b79256 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Wed, 28 Aug 2024 18:21:51 +0300 Subject: [PATCH 47/91] docs: idp and service updates --- .../docs/integration/before-you-begin.mdx | 144 ++++++++++++++---- .../deploy-to-prod/endpoints/idp.mdx | 91 ----------- .../deployment/services/auth-service.mdx | 6 +- .../deployment/services/backend-service.mdx | 6 +- 4 files changed, 117 insertions(+), 130 deletions(-) delete mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx diff --git a/packages/documentation/src/content/docs/integration/before-you-begin.mdx b/packages/documentation/src/content/docs/integration/before-you-begin.mdx index 3fd333e984..eadfb254b7 100644 --- a/packages/documentation/src/content/docs/integration/before-you-begin.mdx +++ b/packages/documentation/src/content/docs/integration/before-you-begin.mdx @@ -2,22 +2,21 @@ title: Before you begin --- -import { LinkOut } from '@interledger/docs-design-system' - -import { Mermaid, CodeBlock } from '@interledger/docs-design-system' +import { Badge } from '@astrojs/starlight/components' +import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' As you begin setting up your production environment, there are a few integration details that should be approached first. Begin by configuring Rafiki to: - Support cross-currency transactions by providing [exchange rate details](#provide-exchange-rate-details) - Charge [fees](#charge-fees-for-facilitating-transfers) for facilitating transfers - Integrate with your [identity provider](#integrate-with-your-identity-provider) -- Establish a mechanism for managing liquidity via [webhook events] +- Establish a mechanism for managing liquidity via [webhook events](#manage-liquidity-via-webhook-events) ## Provide exchange rate details To support cross-currency transactions, you must provide Rafiki with an endpoint from where it can fetch current exchange rates. -Jump to [exchange rate environment variables](#exchange-rate-environment-variables). +Skip to the [exchange rate environment variables](#exchange-rate-environment-variables) for a summary of required variables. ### Rate probes and slippage @@ -94,7 +93,7 @@ You can define: ### Example -For this example, assume the asset scale is 2. You'll charge a fixed fee of 100 (`$1.00`) and a variable fee of 100 (`1%`). +For this example, assume your asset scale is 2. You'll charge a fixed fee of 100 (\$1.00) and a variable fee of 100 (1%). #### Backend Admin API `setFee` mutation @@ -135,12 +134,12 @@ mutation SetFee($input: SetFeeInput!) { ``` -| Variable | Description | -| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `assetId` | The unique ID assigned by Rafiki when the asset was created. | -| `type` | Indicates who incurs the fee: either the sender (`SENDING`) or receiver (`RECEIVING`). | -| `fixed` | The amount of the flat, fixed fee to charge. Assuming USD with an asset scale of 2, a value of `100` equals `$1.00`. | -| `basisPoints` | The amount of the variable fee to charge based on the total amount. One basis point is equal to 0.01% of the total amount. 100 basis points equals 1%, and 10000 basis points equals 100%. In this example, the fee is 1%. | +| Variable | Description | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `assetId` | The unique ID assigned by Rafiki when the asset was created. | +| `type` | Indicates who incurs the fee: either the sender (`SENDING`) or receiver (`RECEIVING`). | +| `fixed` | The amount of the flat, fixed fee to charge. Assuming USD with an asset scale of 2, a value of `100` equals \$1.00. | +| `basisPoints` | The amount of the variable fee to charge based on the total amount. One basis point is equal to 0.01% of the total amount. `100` basis points equals 1%, and `10000` basis points equals 100%. In this example, the fee is 1%. | #### JSON Response @@ -168,7 +167,91 @@ mutation SetFee($input: SetFeeInput!) { ## Integrate with your identity provider -## Webhook Events +An identity provider (IdP) is a system or service that stores and manages user identity information, authentication, and consent. Integration with an IdP is required due to Rafiki's use of the Open Payments standard and APIs. Skip to the [IdP environment variables](#idp-environment-variables) for a summary of required variables. + +Your IdP will: + +- Authenticate requests from clients to create payments and quotes on Rafiki's backend +- Manage interactions with end users, such as your account holders, to gather consent + +Before a client can make an outgoing payment request, it must obtain a grant from your authorization server. Open Payments requires explicit interaction by an individual (typically the client's end user) before issuing the grant. Presenting the end-user with a consent screen from which they choose to accept or deny the payment is an example of an interaction. + +The interaction is facilitated by your IdP. Your IdP: + +- Provides the consent screen +- Sends the user's interaction choice to your authorization server +- Redirects the user after the interaction is complete + +### Rafiki Admin + +Rafiki Admin is a web app that allows you to manage your Rafiki instance through a UI. Out of the box, we provide Ory Kratos for the identity and user management of your administrators. Kratos is for internal use and cannot be used as an identity provider for your Open Payments authorization server. + +### IdP environment variables + +| Environment variable | Description | Required | +| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `IDENTITY_SERVER_DOMAIN` | The URL that your authorization server will direct the client to so the client's end-user can complete the interaction and authorize a grant. | Y | +| `IDENTITY_SERVER_SECRET` | A shared secret between your authorization server and your IdP that your authorization server will use to secure its IdP-related endpoints. Your IdP must provide this secret when it sends requests to your authorization server. | Y | + +### Endpoints + +There are a number of endpoints that facilitate communication between your IdP and your authorization server after a pending grant request is created. + +The endpoints are called in the sequence listed in the table below. + +| Method | Endpoint | Purpose | +| ---------------------------------------------------- | ------------------------------- | --------------------------------------------------------------- | +| | `/interact/:id /:nonce` | [Establish interaction session](#establish-interaction-session) | +| | `/grant/:id /:nonce` | [Fetch grant information](#fetch-grant-information) | +| | `/grant/:id /:nonce` | [Accept or reject grant](#accept-or-reject-grant) | +| | `/interact/:id /:nonce /finish` | [Finish interaction](#finish-interaction) | +| | `/interact/:id /:nonce` | [Continue grant](#continue-grant) | + +Each interaction with an endpoint is identified by an `id` and a `nonce`. Both are provided as query parameters when your authorization server redirects to your IdP. + +#### Establish interaction session + +Called by the client and establishes an interactive session with your authorization server, which redirects the browser session to the IdP consent screen. + +#### Fetch grant information + +Called by your IdP to retrieve a list of access rights, requested by the client, from your authorization server. The access rights are presented to the client's end-user on the consent screen. The authorization server's response is served on the `INTERACTION_PORT`, which is `3009` by default. + +| Header | Description | Required | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | +| `x-idp-secret` | Used to secure communication between your IdP and authorization server using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | + +#### Accept or reject grant + +Your IdP communicates the end-user’s acceptance or rejection on the consent screen to your authorization server, then redirects to `GET /interact/:id/:nonce/finish`. The response is served on `INTERACTION_PORT`, which is `3009` by default. + +| Header | Description | Required | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | +| `x-idp-secret` | Used to secure communication between your IdP and authorization server using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | + +#### Finish interaction + +Your IdP ends the interaction initiated by `GET /interact/:id/:nonce` and redirects the end-user's browser session to the URI of the grant initialization request. A query parameter will indicate a failure, or on success, a SHA-256 hash parameter that the client can use to verify the successful interaction. + +| Query parameter | Description | Required | +| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `id` | Interaction ID | Y | +| `nonce` | Interaction nonce | Y | +| `result` | Success or failure of the grant authorization. In case of success, the SHA-256 hash of the interaction is sent in the response along with the `interact_ref` that identifies the interaction on the authorization server and the URI of the grant initialization request. | Y | + +The following tables list examples of the different possible response types on this endpoint. + +| Response | Description | Example | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| Rejected | The interaction was rejected by the end-user. | `?result=grant_rejected` | +| Invalid | The grant was not in a state where it could be accepted or rejected (e.g., grant was already approved) | `?result=grant_invalid` | +| Success | The grant was successful with the following returned in the response:
    • A hash representing the SHA-256 hash of values provided by the client in the grant initialization request (`interact.finish.nonce`), and the values in the response returned from your authorization server (`interact.finish`).
    • The `interact_ref` that identifies the interaction on your authorization server alongside the hash
    • The URI of the grant initialization request (e.g., `https://www.auth-server.com`)
    | `hash=p28jsq0Y2KK3WS__a42tavNC64ldGTBroywsWxT4md_jZQ1R\HZT8BOWYHcLmObM7XHPAdJzTZMtKBsaraJ64A &interact_ref=4IFWWIKYBC2PQ6U56NL1` | + +#### Continue grant + +The client requests a grant from your authorization server for an accepted interaction. Your authorization server responds with an access token. + +## Manage liquidity via webhook events Rafiki does not hold user account balances but tracks liquidity within asset, peer, and payment accounts in its own database. To effectively manage liquidity, you need to expose an endpoint that listens for specific events dispatched by Rafiki. These events notify your system of time-sensitive status updates, warnings, and errors. @@ -299,24 +382,23 @@ BD - Need updated workflow info/overview of outgoing payments Outgoing payment events - | **Attribute** | **Type** | **Description** | **Required?** | - -|-------------------|----------|----------------------------------------------------------------------------------------------------|---------------| -| `id` | String | Incoming payment ID | **Y** | -| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | **Y** | -| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | -| `state` | String | Outgoing payment state, either `PENDING`, `PROCESSING`, `COMPLETED`, or `EXPIRED` | **Y** | -| `receiver` | String | Wallet address URL of the receiver | **Y** | -| `debitAmount` | Object | Amount to send (fixed send) | **Y** | -| `sentAmount` | Object | Amount to receive (fixed receive) | **Y** | -| `metadata` | Object | Additional metadata associated with the outgoing payment | N | -| `createdAt` | String | Date-time of creation | **Y** | -| `updatedAt` | String | Date-time of last update | **Y** | -| `expiresAt` | String | Date-time of payment expiration | **Y** | -| `error` | String | ?? | N | -| `stateAttempts` | Integer | ?? | **Y** | -| `balance` | String | ?? | **Y** | -| `peerId` | String | ?? | N | +| Attribute | Type | Description | Required | +| ----------------- | ------- | -------------------------------------------------------------------------------------------------- | -------- | +| `id` | String | Incoming payment ID | **Y** | +| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | **Y** | +| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | +| `state` | String | Outgoing payment state, either `PENDING`, `PROCESSING`, `COMPLETED`, or `EXPIRED` | **Y** | +| `receiver` | String | Wallet address URL of the receiver | **Y** | +| `debitAmount` | Object | Amount to send (fixed send) | **Y** | +| `sentAmount` | Object | Amount to receive (fixed receive) | **Y** | +| `metadata` | Object | Additional metadata associated with the outgoing payment | N | +| `createdAt` | String | Date-time of creation | **Y** | +| `updatedAt` | String | Date-time of last update | **Y** | +| `expiresAt` | String | Date-time of payment expiration | **Y** | +| `error` | String | ?? | N | +| `stateAttempts` | Integer | ?? | **Y** | +| `balance` | String | ?? | **Y** | +| `peerId` | String | ?? | N | ##### `outgoing_payment.created` diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx deleted file mode 100644 index 7ef138d8de..0000000000 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/endpoints/idp.mdx +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: IDP ---- - -import { LinkOut } from '@interledger/docs-design-system' - -import { CodeBlock } from '@interledger/docs-design-system' - -An identity provider (IdP) is a system or service that manages user authentication, identity information, and consent. When you use your Google account credentials to “Sign in with Google” on an app or website, for example, Google is acting as your identity provider. - -To facilitate payments initiated by third party applications (clients) via the [Open Payments APIs](/concepts/open-payments) on your users' accounts, you must integrate your Rafiki instance with your IdP to handle user authentication and consent. This authentication and consent facilitates the authorization of grants to resources provided by Open Payments. The Rafiki `backend` package exposes the APIs for Open Payments, and the Rafiki `auth` package provides an Authorization Server (AS), which serves as a reference implementation of an opinionated version of the Grant Negotiation Authorization Protocol (GNAP) that authorizes requests to those APIs. - -The AS in the auth package extends its own API for integrating an IdP with Rafiki. This Auth Admin API, different from the Backend Admin API, facilitates interactions to obtain user consent, authorize a grant, fetch information about a particular grant, and communicate that a user has authorized a grant. An OpenAPI specification of these API endpoints can be found here. - -## Integrate IdP with Rafiki - -### Prerequisites - -To integrate your IdP with your Rafiki instance, you must define the following environment variables: - -`IDENTITY_SERVER_DOMAIN` : the URL the AS will redirect the user to complete an interaction and authorize a grant. - -`IDENTITY_SERVER_SECRET` : a shared secret between the AS and IdP that the AS will use to secure its IDP-related endpoints. The IdP must provide this secret when it sends requests to the AS. - -### Endpoints - -There are five main endpoints that facilitate the communication between the IdP and the AS after a pending grant request has been created. Each specific interaction of an endpoint is identified by an interaction `id` and an interaction `nonce`. Both the `id` and the `nonce` are provided as query parameters when the authorization server redirects to the IdP. - -The endpoints are called in the following sequence: - -#### Establish interaction session - -Called by the client and establishes an interactive session with the AS, which redirects the browser session to the IdP consent screen. - -| Method | URL | -| ------ | -------------------- | -| `GET` | /interact/:id/:nonce | - -#### Fetch grant information - -Called by the IdP and requests the AS for grant information to list out all of the access rights requested by the client. The access rights requested will be presented to the user on the consent screen. The response is served on the `INTERACTION_PORT`, which is 3009 by default. - -| Method | URL | -| ------ | ----------------- | -| `GET` | /grant/:id/:nonce | - -| Header | Description | Required | -| -------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `x-idp-secret` | Used to secure communication between IdP and AS using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | - -#### Accept or reject grant - -IdP communicates the user’s acceptance or rejection on the consent screen to the AS and then redirects to `GET /interact/:id/:nonce/finish`. The response is served on `INTERACTION_PORT`, which is 3009 by default. - -| Method | URL | -| ------ | ----------------- | -| `GET` | /grant/:id/:nonce | - -| Header | Description | Required | -| -------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `x-idp-secret` | Used to secure communication between IdP and AS using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | - -#### Finish interaction - -IdP ends the interaction initiated by `GET /interact/:id/:nonce` and redirects the browser session to the URI of the grant initialization request. A query parameter will indicate a failure, or on success, a SHA-256 hash parameter that the client can use to verify the successful interaction. - -| Method | URL | -| ------ | --------------------------- | -| `GET` | /interact/:id/:nonce/finish | - -| Query Parameters | Description | Required | -| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `id` | Interaction ID | Y | -| `nonce` | Interaction nonce | Y | -| `result` | Success or failure grant authorization. In case of success, the SHA-256 hash of the interaction is sent in the response along with `interact_ref` that identifies the interaction on the AS, and the URI of the grant initialization request. | Y | - -The following tables list examples of the different possible response types on this endpoint. - -| Response | Description | Example | -| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -| Rejected | The interaction was rejected by the user. | `?result=grant_rejected` | -| Invalid | The grant was not in a state where it could be accepted or rejected (e.g., grant was already approved) | `?result=grant_invalid` | -| Success | The grant was successful with the following returned in the response:
    • A hash representing the SHA-256 hash of values provided by the client in the grant initialization request (`interact.finish.nonce`), and the values in the response returned from the AS (`interact.finish`).
    • The `interact_ref` that identifies the interaction on the AS alongside the hash
    • The URI of the grant initialization request (e.g., `https://www.auth-server.com`)
    | `hash=p28jsq0Y2KK3WS__a42tavNC64ldGTBroywsWxT4md_jZQ1R\HZT8BOWYHcLmObM7XHPAdJzTZMtKBsaraJ64A &interact_ref=4IFWWIKYBC2PQ6U56NL1` | - -#### Continue grant - -The client requests a grant from the AS for an accepted interaction. The AS responds with an access token. - -| Method | URL | -| ------ | -------------------- | -| `POST` | /interact/:id/:nonce | diff --git a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx index fb77a1c8d3..2773325cef 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx @@ -9,7 +9,7 @@ Rafiki’s incoming payments, quotes, and outgoing payments. Quotes and outgoing payments call the ILP connector, described in the next section, to send ILP packets. Quoting sends unfulfillable probe packets, for example to determine a transaction’s cost before executing the payment. Outgoing payments send packets as part of executing the payment. -:::note -The calls to the ILP connector are made by calling the `makeIlpPlugin`, which is an implementation detail of an ILP connector that Rafiki will abstract. After calling the plugin, it will be passed to the `@interledger/pay` library to facilitate sending payments over Interledger using STREAM. -::: - ## Interledger connector The `backend` service exposes an ILP connector to send and receive STREAM packets between peers. @@ -47,7 +43,7 @@ The roles of the connector include: The connector receives incoming packets via HTTP and/or direct calls from within the `backend`. The `backend` includes an HTTP server listening on the configured `CONNECTOR_PORT`. -The amounts within ILP packets are used to update account balances in your accounting database (TigerBeetle or Postgres). Amounts are adjusted based on Rafiki’s configured [exchange rates](/integration/before-you-begin#provide-exchange-rate-details) and the asset used by the sending (outgoing) and receiving (destination) accounts. The total amount received for the STREAM connection is tracked in Redis in order to support STREAM receipts. +The amounts within ILP packets are used to update account liquidities in your accounting database (TigerBeetle or Postgres). Amounts are adjusted based on Rafiki’s configured [exchange rates](/integration/before-you-begin#provide-exchange-rate-details) and the asset used by the sending (outgoing) and receiving (destination) accounts. The total amount received for the STREAM connection is tracked in Redis. ## GraphQL Backend Admin API From 8cd920c14cbbeb963897fa8602289f4a4646de71 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Wed, 28 Aug 2024 18:33:38 +0300 Subject: [PATCH 48/91] docs: fix link errors --- .../documentation/src/content/docs/admin/admin-user-guide.mdx | 4 ++-- .../src/content/docs/admin/manage-wallet-addresses.mdx | 4 ++-- .../content/docs/concepts/accounts-transfers-liquidity.mdx | 4 ++-- .../running-your-instance/creating-wallet-address.mdx | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx index b523ae4aed..44d97b7ddb 100644 --- a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx +++ b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx @@ -229,9 +229,9 @@ In both cases, the recommended approach is to create a new wallet address and de ## Webhooks -The Webhook Events page allows you to monitor and manage webhook events within your Rafiki instance. Webhook events in Rafiki are the main communication channel between you and your Rafiki instance. Refer to [Webhook events](/integration/before-you-begin#webhook-events) for more information about webhook events. +The Webhook Events page allows you to monitor and manage webhook events within your Rafiki instance. Webhook events in Rafiki are the main communication channel between you and your Rafiki instance. See Webhook events for more information about webhook events. -All webhook events that have been triggered are displayed in the table. For each webhook event, the webhook ID, the event type, and the date and time of the event are provided. There is also a field at the top of the page allowing you to filter the table by event type, making it easier to drill down into specific events. +All webhook events that have been triggered are displayed in the table. For each webhook event, you can see the webhook ID, the event type, and the date and time of the event. There is also a field at the top of the page allowing you to filter the table by event type, making it easier to drill down into specific events. double-entry accounting
    . @@ -99,7 +99,7 @@ A peering agreement is a legal contract between the parties involved in a peerin #### Payment liquidity -Payment liquidity is managed for incoming and outgoing payments created via Open Payments through liquidity accounts in your accounting database. When incoming or outgoing payments are created via the Open Payments APIs, a corresponding liquidity account is automatically created. Liquidity must be deposited to an outgoing payment account before the payment can be processed. You are notified to deposit or withdraw liquidity via [webhook events](/integration/before-you-begin#webhook-events). +Payment liquidity is managed for incoming and outgoing payments created via Open Payments through liquidity accounts in your accounting database. When incoming or outgoing payments are created via the Open Payments APIs, a corresponding liquidity account is automatically created. Liquidity must be deposited to an outgoing payment account before the payment can be processed. You are notified to deposit or withdraw liquidity via webhook events. ## TigerBeetle diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx index 6fb3f98113..30c0cbe753 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx @@ -4,7 +4,7 @@ title: Creating wallet address (strategies for identity lookup) import { LinkOut } from '@interledger/docs-design-system' -import { CodeBlock } from '@interledger/docs-design-system' +import { CodeBlock } from '@interledger/docs-design-system' To allow your account holders the ability to send and receive payments via the Open Payments APIs, you must create at least one wallet address for each account. The wallet address serves as a standardized identifier for a payment account. @@ -177,4 +177,4 @@ id ## Creating wallet addresses dynamically -An alternative approach to creating wallet addresses for your account holders is to generate the addresses dynamically when your Rafiki instance fires the [`wallet_address.not_found`](/integration/before-you-begin#webhook-events) webhook event. This event fires when Rafiki does not find the wallet address requested from an Open Payments API call. When receiving this event, you can look up the associated account in your system and call the `CreateWalletAddress` and `CreateWalletAddressKey` mutations to create the wallet address and its associated private-public key pair. Even if you opt to create the initial batch of wallet addresses for your existing account holders via a one-time script, you may implement this process to dynamically create wallet addresses for any new accounts you onboard to your system. +An alternative approach to creating wallet addresses for your account holders is to generate the addresses dynamically when your Rafiki instance fires the `wallet_address.not_found` webhook event. This event fires when Rafiki does not find the wallet address requested from an Open Payments API call. When receiving this event, you can look up the associated account in your system and call the `CreateWalletAddress` and `CreateWalletAddressKey` mutations to create the wallet address and its associated private-public key pair. Even if you opt to create the initial batch of wallet addresses for your existing account holders via a one-time script, you may implement this process to dynamically create wallet addresses for any new accounts you onboard to your system. From 6f57b3824aaced8896095ce17923f3ddc5c3aef4 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Wed, 28 Aug 2024 18:47:16 +0300 Subject: [PATCH 49/91] docs: variables to service pages --- .../src/content/docs/admin/admin-user-guide.mdx | 2 +- .../src/content/docs/admin/manage-wallet-addresses.mdx | 2 +- .../content/docs/concepts/accounts-transfers-liquidity.mdx | 2 +- .../running-your-instance/creating-wallet-address.mdx | 2 +- .../docs/integration/deployment/services/auth-service.mdx | 5 +++++ .../docs/integration/deployment/services/backend-service.mdx | 5 +++++ .../integration/deployment/services/frontend-service.mdx | 5 +++++ 7 files changed, 19 insertions(+), 4 deletions(-) diff --git a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx index 44d97b7ddb..518027591e 100644 --- a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx +++ b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx @@ -231,7 +231,7 @@ In both cases, the recommended approach is to create a new wallet address and de The Webhook Events page allows you to monitor and manage webhook events within your Rafiki instance. Webhook events in Rafiki are the main communication channel between you and your Rafiki instance. See Webhook events for more information about webhook events. -All webhook events that have been triggered are displayed in the table. For each webhook event, you can see the webhook ID, the event type, and the date and time of the event. There is also a field at the top of the page allowing you to filter the table by event type, making it easier to drill down into specific events. +All webhook events that have been triggered are displayed in the table. For each webhook event, you can see the webhook ID, the event type, and the date and time of the event. There is also a field at the top of the page allowing you to filter the table by event type, making it easier to drill down into specific events. double-entry accounting. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx index 30c0cbe753..d5e7d12ed5 100644 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx +++ b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx @@ -4,7 +4,7 @@ title: Creating wallet address (strategies for identity lookup) import { LinkOut } from '@interledger/docs-design-system' -import { CodeBlock } from '@interledger/docs-design-system' +import { CodeBlock } from '@interledger/docs-design-system' To allow your account holders the ability to send and receive payments via the Open Payments APIs, you must create at least one wallet address for each account. The wallet address serves as a standardized identifier for a payment account. diff --git a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx index 2773325cef..ca00a16700 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx @@ -3,6 +3,7 @@ title: Auth service --- import { LinkOut } from '@interledger/docs-design-system' +import Auth from '/src/partials/auth-variables.mdx' Rafiki’s `auth` service provides you with a reference implementation of an Open Payments authorization server. You can use the `auth` service as an alternative to developing your own in-house service for grant authorization and authentication. @@ -46,3 +47,7 @@ For more information about interactive grants and how they work with identity pr ## GraphQL Auth Admin API The `auth` service exposes a [GraphQL Auth Admin API](/integration/deployment/apis/graphql/admin-api-overview#auth-admin-api) to manage auth-related resources, such as Open Payments grants. + +## Environment variables + + diff --git a/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx index a43c2e21bf..8890c4cd82 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx @@ -3,6 +3,7 @@ title: Backend service --- import { LinkOut } from '@interledger/docs-design-system' +import Backend from '/src/partials/backend-variables.mdx' Rafiki’s `backend` service is the software’s main service for handling business logic and external communication. The service is responsible for: @@ -48,3 +49,7 @@ The amounts within ILP packets are used to update account liquidities in your ac ## GraphQL Backend Admin API The `backend` service exposes a GraphQL [Backend Admin API](/integration/deployment/apis/graphql/admin-api-overview#backend-admin-api) to manage assets, peers, wallet addresses, Open Payments resources, and several types of liquidity. + +## Environment variables + + diff --git a/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx index 0250097f3f..a276c55c5e 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx @@ -3,6 +3,7 @@ title: Frontend service --- import { LinkOut } from '@interledger/docs-design-system' +import Frontend from '/src/partials/frontend-variables.mdx' Rafiki’s `frontend` service provides an optional internal admin interface, called the [Rafiki Admin application](/admin/admin-user-guide), for you to manage your Rafiki instance through a Remix web app. This service communicates with the [Backend Admin API](/integration/deployment/apis/graphql/admin-api-overview#backend-admin-api) to facilitate administrative tasks within Rafiki. @@ -18,3 +19,7 @@ You must also set the environment variables for the `frontend` service. ## Rafiki admin settings While the `frontend` service is not required to run a Rafiki instance, it is highly recommended. A number of administrative tasks could be performed programmatically via the Backend Admin API, but the `frontend` service makes these functions available through a user-friendly interface. + +## Environment variables + + From 3ea57a77acf75faa9567ce34f44335e32b63dc4b Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Thu, 29 Aug 2024 22:25:08 +0300 Subject: [PATCH 50/91] docs: breaking up pages --- packages/documentation/astro.config.mjs | 26 ++ .../docs/integration/exchange-rates.mdx | 91 +++++ .../src/content/docs/integration/fees.mdx | 82 ++++ .../content/docs/integration/get-started.mdx | 13 + .../src/content/docs/integration/idp.mdx | 92 +++++ .../docs/integration/webhook-events.mdx | 354 ++++++++++++++++++ 6 files changed, 658 insertions(+) create mode 100644 packages/documentation/src/content/docs/integration/exchange-rates.mdx create mode 100644 packages/documentation/src/content/docs/integration/fees.mdx create mode 100644 packages/documentation/src/content/docs/integration/get-started.mdx create mode 100644 packages/documentation/src/content/docs/integration/idp.mdx create mode 100644 packages/documentation/src/content/docs/integration/webhook-events.mdx diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index f512d7e8a8..74ced7409b 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -92,6 +92,32 @@ export default defineConfig({ label: 'Before you begin', link: '/integration/before-you-begin' }, + { + label: 'Get started', + collapsed: true, + items: [ + { + label: 'Overview', + link: '/integration/get-started' + }, + { + label: 'Fees', + link: '/integration/fees' + }, + { + label: 'Exchange rates', + link: '/integration/exchange-rates' + }, + { + label: 'Webhook events', + link: '/integration/webhook-events' + }, + { + label: 'Identity provider (IdP)', + link: '/integration/idp' + } + ] + }, { label: 'Deployment', collapsed: true, diff --git a/packages/documentation/src/content/docs/integration/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/exchange-rates.mdx new file mode 100644 index 0000000000..6962b4e32f --- /dev/null +++ b/packages/documentation/src/content/docs/integration/exchange-rates.mdx @@ -0,0 +1,91 @@ +--- +title: Exchange rates +--- + +import { Badge } from '@astrojs/starlight/components' +import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' + +Every Interledger payment is preceded by a rate probe. A rate probe provides a quote that estimates the cost of transferring value over the network, including any fees connector nodes may charge. For a rate probe to be successful, Rafiki needs current exchange rates. + +## Specify your exchange rates endpoint + +Rafiki fetches exchange rates from your exchange rates endpoint. Set your endpoint via the `backend` service's `EXCHAGE_RATES_URL` variable. An OpenAPI specification for the endpoint is available. + + + ``` EXCHANGE_RATES_URL: http://cloud-nine-wallet/rates ``` + + +The endpoint must accept requests and respond as follows. + + + ``` GET https://cloud-nine-wallet/rates ``` + + + +``` +{ + "base": "USD", + "rates": { + "EUR": 0.813399, + } +} +``` + + +### Response objects + +| Variable | Type | Description | Required | +| -------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `base` | String | The asset code represented as an ISO 4217 currency code, e.g. USD | Y | +| `rates` | Object | Object containing `` pairs, e.g. `{EUR: 0.8930}` | Y | +| `rates.` | Number | The exchange rate given `base` and `` | Y | + +## Specify rate caching duration (optional) + +Specify how long your Rafiki instance will cache exchange rates via the `backend` service's `EXCHANGE_RATES_LIFETIME` variable or use the default setting of `15_000` ms (15 seconds). + +Caching improves performance as Rafiki will not need to request the rates from your endpoint for every payment. + +``` EXCHANGE_RATES_LIFETIME: 20_000 ``` + +## Specify slippage (optional) + +As exchange rates and fees charged by connectors fluctuate, there will likely be a variance between the estimated amount provided in the quote and the actual amount required when the payment is initiated. This difference is called slippage. + +Set your allowed slippage rate to a value between 0 and 1 via the `backend` service's `SLIPPAGE` variable or use the default setting of `0.01` (1%). + +``` SLIPPAGE: 0.05 ``` + +### Example + +Let's assume your Rafiki instance is using the default slippage of `0.01` (1%). The rate probe that precedes a USD payment returns a quote of `$1.00`. One percent of one dollar equals one cent. + +If the total of the payment, inclusive of currency exchange rates and network fees, amounts to `$1.01`, the payment will be successful. If the total is `$1.02` or more, the payment will fail. + +Below is a minimalistic example of a successful (200) response. + +```json +export function loader({ request }: LoaderFunctionArgs) { + const base = new URL(request.url).searchParams.get('base') || 'USD' + + return json( + { + base, + rates: config.seed.rates[base] || {} + }, + { status: 200 } + ) +} +``` + +## Exchange rate environment variables + +The exchange rate environment variables are part of the `backend` service. + +The file that contains your variables varies depending on whether you are running Rafiki via Docker (`docker-compose.yaml`) or via Helm and Kubernetes (`values.yaml` for the Helm chart). + +| Environment variable | Description | Required | +| ------------------------- | ----------------------------------------------------------------------------------------------- | -------- | +| `EXCHANGE_RATES_URL` | Your exchange rates endpoint | Y | +| `EXCHANGE_RATES_LIFETIME` | The amount of time Rafiki caches exchange rates, in ms | Y | +| `SLIPPAGE` | The variance allowed between a quote and the actual amount required when a payment is initiated | Y | diff --git a/packages/documentation/src/content/docs/integration/fees.mdx b/packages/documentation/src/content/docs/integration/fees.mdx new file mode 100644 index 0000000000..58b06d3317 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/fees.mdx @@ -0,0 +1,82 @@ +--- +title: Fees +--- + +import { Badge } from '@astrojs/starlight/components' +import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' + +You can charge fees on top of estimated network fees to facilitate transfers. Each asset you support can have a different fee structure and you can specify both fixed and variable fees per asset. + +## Set fees using the `setFee` GraphQL mutation + + +```graphql +mutation SetFee($input: SetFeeInput!) { + setFee(input: $input) { + code + success + message + fee { + id + assetId + type + fixed + basisPoints + createdAt + } + } +} +``` + + +### Example + +Let's assume your asset scale is 2. You'll charge a fixed fee of 100 (\$1.00) and a variable fee of 100 (1%). + + +```json +{ + "input": { + "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", + "type": "SENDING", + "fee": { + "fixed": 100, + "basisPoints": 100 + } + } +} +``` + + +| Variable | Description | +| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `assetId` | The asset's unique ID assigned by Rafiki when the asset was created. | +| `type` | `SENDING` indicates the sender will incur the fee. Note that the API spec shows `RECEIVING` as a possible value; however, it's not been implemented. | +| `fixed` | The amount of the flat, fixed fee to charge. Assuming USD with an asset scale of 2 in the example above, the value of `100` equals \$1.00. | +| `basisPoints` | The amount of the variable fee to charge based on the total amount. One basis point is equal to 0.01% of the total amount. `100` basis points equals 1%, and `10000` basis points equals 100%. In the example above, the fee is 1%. | + + +```json +{ + "data": { + "setFee": { + "code": "200", + "success": true, + "message": "Fee set", + "fee": { + "id": "140fd9c0-8f14-4850-9724-102f04d97e69", + "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", + "type": "SENDING", + "fixed": "100", + "basisPoints": 100, + "createdAt": "2023-09-13T14:59:53.435Z" + } + } + } +} +``` + + +## Set fees using Rafiki Admin + +After an asset is created, select to edit the asset within the [Rafiki Admin](/admin/admin-user-guide#edit-asset) application, then add a fixed fee and/or basis point for the asset. diff --git a/packages/documentation/src/content/docs/integration/get-started.mdx b/packages/documentation/src/content/docs/integration/get-started.mdx new file mode 100644 index 0000000000..92c895f3ef --- /dev/null +++ b/packages/documentation/src/content/docs/integration/get-started.mdx @@ -0,0 +1,13 @@ +--- +title: Get started +--- + +import { Badge } from '@astrojs/starlight/components' +import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' + +As you begin setting up your production environment, there are a few integration details that should be approached first. Begin by configuring Rafiki to: + +- Support cross-currency transactions by providing [exchange rate details](/integration/exchange-rates) +- Charge [fees](/integration/fees) for facilitating transfers +- Integrate with your [identity provider](/integration/idp) +- Establish a mechanism for managing liquidity via [webhook events](/integration/webhook-events) diff --git a/packages/documentation/src/content/docs/integration/idp.mdx b/packages/documentation/src/content/docs/integration/idp.mdx new file mode 100644 index 0000000000..9e1a8bfe84 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/idp.mdx @@ -0,0 +1,92 @@ +--- +title: Identity provider (IdP) +--- + +import { Badge } from '@astrojs/starlight/components' +import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' + +## Integrate with your identity provider + +An identity provider (IdP) is a system or service that stores and manages user identity information, authentication, and consent. Integration with an IdP is required due to Rafiki's use of the Open Payments standard and APIs. Skip to the [IdP environment variables](#idp-environment-variables) for a summary of required variables. + +Your IdP will: + +- Authenticate requests from clients to create payments and quotes on Rafiki's backend +- Manage interactions with end users, such as your account holders, to gather consent + +Before a client can make an outgoing payment request, it must obtain a grant from your authorization server. Open Payments requires explicit interaction by an individual (typically the client's end user) before issuing the grant. Presenting the end-user with a consent screen from which they choose to accept or deny the payment is an example of an interaction. + +The interaction is facilitated by your IdP. Your IdP: + +- Provides the consent screen +- Sends the user's interaction choice to your authorization server +- Redirects the user after the interaction is complete + +### Rafiki Admin + +Rafiki Admin is a web app that allows you to manage your Rafiki instance through a UI. Out of the box, we provide Ory Kratos for the identity and user management of your administrators. Kratos is for internal use and cannot be used as an identity provider for your Open Payments authorization server. + +### IdP environment variables + +| Environment variable | Description | Required | +| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `IDENTITY_SERVER_DOMAIN` | The URL that your authorization server will direct the client to so the client's end-user can complete the interaction and authorize a grant. | Y | +| `IDENTITY_SERVER_SECRET` | A shared secret between your authorization server and your IdP that your authorization server will use to secure its IdP-related endpoints. Your IdP must provide this secret when it sends requests to your authorization server. | Y | + +### Endpoints + +There are a number of endpoints that facilitate communication between your IdP and your authorization server after a pending grant request is created. + +The endpoints are called in the sequence listed in the table below. + +| Method | Endpoint | Purpose | +| ---------------------------------------------------- | ------------------------------- | --------------------------------------------------------------- | +| | `/interact/:id /:nonce` | [Establish interaction session](#establish-interaction-session) | +| | `/grant/:id /:nonce` | [Fetch grant information](#fetch-grant-information) | +| | `/grant/:id /:nonce` | [Accept or reject grant](#accept-or-reject-grant) | +| | `/interact/:id /:nonce /finish` | [Finish interaction](#finish-interaction) | +| | `/interact/:id /:nonce` | [Continue grant](#continue-grant) | + +Each interaction with an endpoint is identified by an `id` and a `nonce`. Both are provided as query parameters when your authorization server redirects to your IdP. + +#### Establish interaction session + +Called by the client and establishes an interactive session with your authorization server, which redirects the browser session to the IdP consent screen. + +#### Fetch grant information + +Called by your IdP to retrieve a list of access rights, requested by the client, from your authorization server. The access rights are presented to the client's end-user on the consent screen. The authorization server's response is served on the `INTERACTION_PORT`, which is `3009` by default. + +| Header | Description | Required | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | +| `x-idp-secret` | Used to secure communication between your IdP and authorization server using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | + +#### Accept or reject grant + +Your IdP communicates the end-user’s acceptance or rejection on the consent screen to your authorization server, then redirects to `GET /interact/:id/:nonce/finish`. The response is served on `INTERACTION_PORT`, which is `3009` by default. + +| Header | Description | Required | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | +| `x-idp-secret` | Used to secure communication between your IdP and authorization server using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | + +#### Finish interaction + +Your IdP ends the interaction initiated by `GET /interact/:id/:nonce` and redirects the end-user's browser session to the URI of the grant initialization request. A query parameter will indicate a failure, or on success, a SHA-256 hash parameter that the client can use to verify the successful interaction. + +| Query parameter | Description | Required | +| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `id` | Interaction ID | Y | +| `nonce` | Interaction nonce | Y | +| `result` | Success or failure of the grant authorization. In case of success, the SHA-256 hash of the interaction is sent in the response along with the `interact_ref` that identifies the interaction on the authorization server and the URI of the grant initialization request. | Y | + +The following tables list examples of the different possible response types on this endpoint. + +| Response | Description | Example | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| Rejected | The interaction was rejected by the end-user. | `?result=grant_rejected` | +| Invalid | The grant was not in a state where it could be accepted or rejected (e.g., grant was already approved) | `?result=grant_invalid` | +| Success | The grant was successful with the following returned in the response:
    • A hash representing the SHA-256 hash of values provided by the client in the grant initialization request (`interact.finish.nonce`), and the values in the response returned from your authorization server (`interact.finish`).
    • The `interact_ref` that identifies the interaction on your authorization server alongside the hash
    • The URI of the grant initialization request (e.g., `https://www.auth-server.com`)
    | `hash=p28jsq0Y2KK3WS__a42tavNC64ldGTBroywsWxT4md_jZQ1R\HZT8BOWYHcLmObM7XHPAdJzTZMtKBsaraJ64A &interact_ref=4IFWWIKYBC2PQ6U56NL1` | + +#### Continue grant + +The client requests a grant from your authorization server for an accepted interaction. Your authorization server responds with an access token. diff --git a/packages/documentation/src/content/docs/integration/webhook-events.mdx b/packages/documentation/src/content/docs/integration/webhook-events.mdx new file mode 100644 index 0000000000..c03e2cbe6d --- /dev/null +++ b/packages/documentation/src/content/docs/integration/webhook-events.mdx @@ -0,0 +1,354 @@ +--- +title: Webhook events +--- + +import { Badge, Tabs, TabItem, Steps } from '@astrojs/starlight/components' +import { + Mermaid, + CodeBlock, + LinkOut, + Disclosure +} from '@interledger/docs-design-system' + +The main communication channel between you and your Rafiki instance is composed of the Backend Admin API and a set of webhook events. + +Most events will require you to interact with Rafiki to deposit or withdraw liquidity, or to provide wallet address information. + +Rafiki itself does not hold user account balances. Instead it keeps track of liquidity within asset, peer, and payment accounts in its own database. Liquidity needs to be managed primarily as a response to events that happen in Rafiki. + +## Specify your webhook event endpoint + +Specify your webhook endpoint via the `backend` service's WEBHOOK_URL variable. + + + ``` WEBHOOK_URL: http://cloud-nine-wallet/webhooks ``` + + +When events occur in Rafiki, your `backend` service makes a request to your webhook endpoint. The `backend` service expects a `200` status in the response to confirm a successful receipt. + +## Event handler + +For Rafiki to notify you about these events, you must expose a webhook endpoint that listens for the events dispatched by Rafiki and reacts accordingly. These events notify your system of time-sensitive status updates, warnings, and errors. + +Your expected behavior when observing the webhook events is detailed below. + +## Request body + +Each webhook event is sent as JSON payload that follows a similar format: + +| Attribute | Type | Description | Required? | +| --------- | ------------------------- | --------------------------------------------------- | --------- | +| `id` | String | Unique webhook event ID | Y | +| `type` | [EventType](#event-types) | `EventType` value | Y | +| `data` | Object | Additional data that coincides with the `EventType` | Y | + + + + + ```json + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "type": "incoming_payment.created", + "data": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "walletAddressId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "client": "string", + "completed": true, + "incomingAmount": "string", + "receivedAmount": "string", + "metadata": { + "additionalProp1": {} + }, + "createdAt": "2024-08-29T08:13:08.966Z", + "updatedAt": "2024-08-29T08:13:08.966Z", + "expiresAt": "2024-08-29T08:13:08.966Z" + } + } + ``` + + + ```json + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "type": "outgoing_payment.created", + "data": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "walletAddressId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "client": "string", + "state": "FUNDING", + "receiver": "https://example.com/", + "debitAmount": "string", + "sentAmount": "string", + "metadata": { + "additionalProp1": {} + }, + "createdAt": "2024-08-29T11:07:56.090Z", + "updatedAt": "2024-08-29T11:07:56.090Z", + "expiresAt": "2024-08-29T11:07:56.090Z", + "error": "string", + "stateAttempts": 0, + "balance": "string", + "peerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6" + } + } + ``` + + + ```json + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "type": "asset.liquidity_low", + "data": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "asset": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "code": "string", + "scale": 0 + }, + "liquidityThreshold": "string", + "balance": "string" + } + } + ``` + + + ```json + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "type": "wallet_address.not_found", + "data": { + "walletAddressUrl": "string" + } + } + ``` + + + + +## Event types + +The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle. + +| Value | Description | +| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | +| [`incoming_payment.created`](#incoming_paymentcreated) | An incoming payment has been created. | +| [`incoming_payment.completed`](#incoming_paymentcompleted) | An incoming payment is complete and will not accept any additional incoming funds. | +| [`incoming_payment.expired`](#incoming_paymentexpired) | An incoming payment expired and will not accept any additional incoming funds. | +| [`outgoing_payment.created`](#outgoing_paymentcreated) | An outgoing payment was created. | +| [`outgoing_payment.completed`](#outgoing_paymentcompleted) | An outgoing payment completed. | +| [`outgoing_payment.failed`](#outgoing_paymentfailed) | An outgoing payment partially or completely failed. | +| [`wallet_address.not_found`](#wallet_addressnot_found) | A requested wallet address was not found. | +| [`wallet_address.web_monetization`](#wallet_addressweb_monetization) | Web Monetization payments received via STREAM. | +| [`asset.liquidity_low`](#assetliquidity_low) | Asset liquidity has dropped below defined threshold. | +| [`peer.liquidity_low`](#peerliquidity_low) | Peer liquidity has dropped below defined threshold. | + +An OpenAPI specification of the webhook requests and their corresponding data can be found here. + +Additionally, the local playground playground contains example payloads in the Bruno collection that can be used to test a webhook service integration. + +--- + +## Incoming payment event sequence + +### Incoming payment created + +The `incoming_payment.created` event tells you when an incoming payment is created. This event is purely informational because, at this point, the incoming payment has not received any funds and no actions around liquidity are required. You can use this event to display upcoming incoming payments to your users. + +The incoming payment will either complete or expire. + +### Incoming payment completed + +The `incoming_payment.completed` event indicates the payment completed either automatically or manually, and that any funds received into the incoming payment should be withdrawn and then credited to the recipient's account on your ledger. + +Two `incoming_payment.completed` events are shown in the diagram below. The first is for a one-phase transfer and the second is for a two-phase transfer. In both examples, the recipient is credited with \$10. + +### Incoming payment expired + +The `incoming_payment.expired` event only fires if funds were received for the incoming payment and signals the end of any additional payments. + +The primary use case for this event is for use with streaming payments, such as those supported through Web Monetization. The event indicates that the incoming payment expired and any funds already received for the payment should be withdrawn and credited to the recipient's account on your ledger. + +:::note +In a scenario where the sender didn't specify the `incomingAmount` when the incoming payment was first created, receiving an `incoming_payment.expired` event indicates that no further payments are expected. +::: + +In the diagram below, \$2.55 was received before the payment expired and the recipient is credited with that amount. + +>ASE: Webhook event: incoming_payment.created + ASE->>ASE: no action required + + note over ASE,R: Incoming payment completed (one-phase transfer) + + R->>ASE: Webhook event: incoming_payment.completed, receivedAmount: $10 + ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: Credit recipient's account with $10 + + note over ASE,R: Incoming payment completed (two-phase transfer) + + R->>ASE: Webhook event: incoming_payment.completed, receivedAmount: $10 + ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: Credit recipient's account with $10 + ASE->>R: Backend Admin API call: PostLiquidityWithdrawal + R->>R: Two-phase transfer completed + + note over ASE,R: Incoming payment expired + R->>ASE: Webhook event: incoming_payment.expired, receivedAmount: $2.55 + ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: Credit recipient's account with $2.55 + +`} +/> + +## Outgoing payment event sequence + +### Outgoing payment created + +The `outgoing_payment.created` event tells you when an outgoing payment is created and is awaiting liquidity. Verify the sender's account balance and perform any other necessary verifications before funding or cancelling the outgoing payment in case the sender has insufficient funds. If the outgoing payment is not fulfilled, you can cancel it. Otherwise, you must put a hold on the sender's account and deposit the funds into Rafiki. + +### Outgoing payment completed + +The `outgoing.payment_completed event indicates that an outgoing payment has successfully sent as many funds as possible to the receiver against the incoming payment. Withdraw any excess liquidity from the outgoing payment in Rafiki that arises from differences sent between the send and received amounts and use it as you see fit. One option would be to return it to the sender. Another option is to retain the excess liquidity as a service fee. Then, remove the hold on the sender's account and debit their account on your ledger. + +Two `outgoing.payment_completed` events are shown in the diagram below. The first is for a one-phase transfer and the second is for a two-phase transfer. In both examples, the outgoing payment amount is \$12 and you choose to keep \$0.50 in fees. + +### Outgoing payment failed + +The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was unsuccessful. Withdraw any remaining liquidity from that outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` is `0`), remove the hold from the sender's account. If the payment partially failed, remove the hold from the sender's account and debit the sender's account on your ledger with the amount sent. Considering the discrepancy between the quote amount and the amount sent, you should refrain from taking a sending fee. + +>ASE: Webhook event + ASE->>ASE: a + + note over ASE,R: I + + R->>ASE: 1 + +`} +/> + +## Wallet address event sequences + +### Wallet address received Web Monetization payments + +A wallet address received WM payments via ILP STREAM. + +### Wallet address not found + +A wallet address was requested via the Open Payments wallet address server API but it doesn't exist in your Rafiki instance. + +--- + +## Low asset liquidity event sequence + +The `asset.liquidity_low` event indicates that an asset's liquidity has dropped below your predefined liquidity threshold. Check if you already have, or can acquire, additional liquidity for that specific asset. If so, deposit it in Rafiki. Cross-currency transfers will fail if you don't increase the asset's liquidity. + +--- + +## Low peer liquidity event sequence + +The `peer.liquidity_low` event indicates that a peer's liquidity has dropped below your predefined liquidity threshold. Decide whether you want to extend the peer's credit line or if your peer must settle first, then extend them a new line of credit. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. + +--- + +--- + +#### Incoming payment events + +Incoming payment events + +| **Attribute** | **Type** | **Description** | **Required?** | +| ----------------- | -------- | -------------------------------------------------------------------------------------------------- | ------------- | +| `id` | String | Incoming payment ID | **Y** | +| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | **Y** | +| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | +| `completed` | Boolean | True if the incoming payment has completed receiving funds | **Y** | +| `incomingAmount` | Object | The maximum amount that should be paid into the wallet address under this incoming payment | N | +| `receivedAmount` | Object | The total amount that has been paid into the wallet address under this incoming payment | **Y** | +| `metadata` | Object | Additional metadata associated with the incoming payment | N | +| `createdAt` | String | Date-time of creation | **Y** | +| `updatedAt` | String | Date-time of last update | **Y** | +| `expiresAt` | String | Date-time of payment expiration | **Y** | + +#### Outgoing payment events + +Outgoing payment events + +| Attribute | Type | Description | Required | +| ----------------- | ------- | -------------------------------------------------------------------------------------------------- | -------- | +| `id` | String | Incoming payment ID | **Y** | +| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | **Y** | +| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | +| `state` | String | Outgoing payment state, either `PENDING`, `PROCESSING`, `COMPLETED`, or `EXPIRED` | **Y** | +| `receiver` | String | Wallet address URL of the receiver | **Y** | +| `debitAmount` | Object | Amount to send (fixed send) | **Y** | +| `sentAmount` | Object | Amount to receive (fixed receive) | **Y** | +| `metadata` | Object | Additional metadata associated with the outgoing payment | N | +| `createdAt` | String | Date-time of creation | **Y** | +| `updatedAt` | String | Date-time of last update | **Y** | +| `expiresAt` | String | Date-time of payment expiration | **Y** | +| `error` | String | ?? | N | +| `stateAttempts` | Integer | ?? | **Y** | +| `balance` | String | ?? | **Y** | +| `peerId` | String | ?? | N | + +#### Wallet address events + +##### `wallet_address.web_monetization` + +The `wallet_address.web_monetization` event indicates that a wallet address received Web Monetization payments via the ILP STREAM protocol. You should withdraw that liquidity from the wallet address in Rafiki and credit the receiver’s account on your ledger. + +Example: A wallet address received **$0.33** + +>ASE: webhook event: wallet address web monetization,
    receivedAmount: $0.33 + ASE->>R: admin API call: CreateWalletAddressWithdrawal + ASE->>ASE: credit receiver's account with $0.33 + +`} +/> + +##### `wallet_address.not_found` + +The `wallet_address.not_found` event indicates that a wallet address was requested via the Open Payments Wallet address server API, but it doesn’t exist in your Rafiki instance. When receiving this event, you can look up the associated account in your system and create a wallet address. The initial request for the wallet address will succeed if you create it within the configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. + +Example: The wallet address `https://example-wallet.com/carla_garcia` was requested but does not exist yet. + +>ASE: webhook event: wallet address not found,
    wallet address: https://example-wallet.com/carla_garcia + ASE->>R: admin API call: CreateWalletAddress
    url: https://example-wallet.com/carla_garcia,
    public name: Carla Eva Garcia + +`} +/> + +### Error handling + +If an error occurs when Rafiki sends a webhook event (i.e., a non-200 status is returned or the request timed out), Rafiki will retry the webhook requests at increasing intervals until a 200 status is returned. The first retry is after 10 seconds, the second after 20 more, the next after 30 more, etc. The maximum number of retries for webhook events is configured via the `WEBHOOK_MAX_RETRY` environment variable. + +Additionally, the timeout for webhook requests is configured with the `WEBHOOK_TIMEOUT` environment variable. + +### Best Practices + +#### Duplicate Events + +The `id` in the webhook event payload is a unique UUID, which your system can use to determine whether the event has been received previously, preventing duplicate event processing. + +#### Asynchronous Handling + +Consider using a worker to process received webhook events, especially if requests to credit/debit user accounts are lengthy processes. Doing so allows the server to process events at a rate suitable for the system and reduce the number of failed/retried webhook events since the webhook event listener can immediately reply with a successful 200 status. From e0ec5777fb1066335dfec1228580f7629d3bd2ec Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Thu, 29 Aug 2024 22:38:15 +0300 Subject: [PATCH 51/91] docs: fixing borked links obviously --- .../docs/integration/webhook-events.mdx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/webhook-events.mdx b/packages/documentation/src/content/docs/integration/webhook-events.mdx index c03e2cbe6d..327ae0e6a7 100644 --- a/packages/documentation/src/content/docs/integration/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/webhook-events.mdx @@ -129,18 +129,18 @@ Each webhook event is sent as JSON payload that follows a similar format: The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle. -| Value | Description | -| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | -| [`incoming_payment.created`](#incoming_paymentcreated) | An incoming payment has been created. | -| [`incoming_payment.completed`](#incoming_paymentcompleted) | An incoming payment is complete and will not accept any additional incoming funds. | -| [`incoming_payment.expired`](#incoming_paymentexpired) | An incoming payment expired and will not accept any additional incoming funds. | -| [`outgoing_payment.created`](#outgoing_paymentcreated) | An outgoing payment was created. | -| [`outgoing_payment.completed`](#outgoing_paymentcompleted) | An outgoing payment completed. | -| [`outgoing_payment.failed`](#outgoing_paymentfailed) | An outgoing payment partially or completely failed. | -| [`wallet_address.not_found`](#wallet_addressnot_found) | A requested wallet address was not found. | -| [`wallet_address.web_monetization`](#wallet_addressweb_monetization) | Web Monetization payments received via STREAM. | -| [`asset.liquidity_low`](#assetliquidity_low) | Asset liquidity has dropped below defined threshold. | -| [`peer.liquidity_low`](#peerliquidity_low) | Peer liquidity has dropped below defined threshold. | +| Value | Description | +| ----------------------------------- | ---------------------------------------------------------------------------------- | +| [`incoming_payment.created`] | An incoming payment has been created. | +| [`incoming_payment.completed`] | An incoming payment is complete and will not accept any additional incoming funds. | +| [`incoming_payment.expired`] | An incoming payment expired and will not accept any additional incoming funds. | +| [`outgoing_payment.created`] | An outgoing payment was created. | +| [`outgoing_payment.completed`] | An outgoing payment completed. | +| [`outgoing_payment.failed`] | An outgoing payment partially or completely failed. | +| [`wallet_address.not_found`] | A requested wallet address was not found. | +| [`wallet_address.web_monetization`] | Web Monetization payments received via STREAM. | +| [`asset.liquidity_low`] | Asset liquidity has dropped below defined threshold. | +| [`peer.liquidity_low`] | Peer liquidity has dropped below defined threshold. | An OpenAPI specification of the webhook requests and their corresponding data can be found here. From 2c25a1bd84d9931c95439c288ec2aa7920af78f8 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Mon, 2 Sep 2024 12:26:14 -0400 Subject: [PATCH 52/91] docs: pushing to see which links break --- packages/documentation/astro.config.mjs | 18 +- .../src/content/docs/admin/manage-assets.mdx | 2 +- .../src/content/docs/admin/manage-peering.mdx | 2 +- .../src/content/docs/concepts/interledger.mdx | 2 +- .../docs/integration/before-you-begin.mdx | 571 ------------------ .../running-your-instance/adding-asset.mdx | 94 --- .../creating-wallet-address.mdx | 180 ------ .../{ => get-started}/exchange-rates.mdx | 0 .../integration/{ => get-started}/fees.mdx | 0 .../integration/{ => get-started}/idp.mdx | 0 .../overview.mdx} | 0 .../{ => get-started}/webhook-events.mdx | 209 +++---- .../docs/resources/webhook-event-types.mdx | 18 + 13 files changed, 127 insertions(+), 969 deletions(-) delete mode 100644 packages/documentation/src/content/docs/integration/before-you-begin.mdx delete mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx delete mode 100644 packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx rename packages/documentation/src/content/docs/integration/{ => get-started}/exchange-rates.mdx (100%) rename packages/documentation/src/content/docs/integration/{ => get-started}/fees.mdx (100%) rename packages/documentation/src/content/docs/integration/{ => get-started}/idp.mdx (100%) rename packages/documentation/src/content/docs/integration/{get-started.mdx => get-started/overview.mdx} (100%) rename packages/documentation/src/content/docs/integration/{ => get-started}/webhook-events.mdx (63%) create mode 100644 packages/documentation/src/content/docs/resources/webhook-event-types.mdx diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index 74ced7409b..d1c676766e 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -88,33 +88,29 @@ export default defineConfig({ label: 'Integration', collapsed: true, items: [ - { - label: 'Before you begin', - link: '/integration/before-you-begin' - }, { label: 'Get started', collapsed: true, items: [ { label: 'Overview', - link: '/integration/get-started' + link: '/integration/get-started/overview' }, { label: 'Fees', - link: '/integration/fees' + link: '/integration/get-started/fees' }, { label: 'Exchange rates', - link: '/integration/exchange-rates' + link: '/integration/get-started/exchange-rates' }, { label: 'Webhook events', - link: '/integration/webhook-events' + link: '/integration/get-started/webhook-events' }, { label: 'Identity provider (IdP)', - link: '/integration/idp' + link: '/integration/get-started/idp' } ] }, @@ -245,6 +241,10 @@ export default defineConfig({ label: 'Environment variables', link: '/resources/environment-variables' }, + { + label: 'Webhook event types', + link: '/resources/webhook-event-types', + }, { label: 'Get involved', link: '/resources/get-involved' diff --git a/packages/documentation/src/content/docs/admin/manage-assets.mdx b/packages/documentation/src/content/docs/admin/manage-assets.mdx index f29412249f..0ad3a81a4c 100644 --- a/packages/documentation/src/content/docs/admin/manage-assets.mdx +++ b/packages/documentation/src/content/docs/admin/manage-assets.mdx @@ -6,7 +6,7 @@ import { LinkOut } from '@interledger/docs-design-system' import { CodeBlock } from '@interledger/docs-design-system' -[Assets](/concepts/accounts-transfers-liquidity#assets) in Rafiki can be added through the Backend Admin API or the Rafiki Admin application. +Assets in Rafiki can be added through the Backend Admin API or the Rafiki Admin application. ## The `asset` type diff --git a/packages/documentation/src/content/docs/admin/manage-peering.mdx b/packages/documentation/src/content/docs/admin/manage-peering.mdx index 66cbc8b009..8085e3d5dc 100644 --- a/packages/documentation/src/content/docs/admin/manage-peering.mdx +++ b/packages/documentation/src/content/docs/admin/manage-peering.mdx @@ -8,7 +8,7 @@ import { CodeBlock } from '@interledger/docs-design-system' ## Prerequisites -To add a peer and send Interledger payments you and the account servicing entity (ASE) you intend to peer with must both: +To add a peer and send Interledger payments you and the account servicing entity (ASE) you intend to peer with must both: - Run an implementation of an [Interledger connector](/integration/deployment/services/backend-service#interledger-connector) (ideally Rafiki). - Agree on an [asset](/concepts/accounts-transfers-liquidity#assets) for the peering relationship. You can set up multiple peering relationships with the same peer based on different assets. At least one asset shared by you and your peer must be added to your Rafiki instance prior to setting up the peering relationship. diff --git a/packages/documentation/src/content/docs/concepts/interledger.mdx b/packages/documentation/src/content/docs/concepts/interledger.mdx index f35c6386b3..da8cfe10bf 100644 --- a/packages/documentation/src/content/docs/concepts/interledger.mdx +++ b/packages/documentation/src/content/docs/concepts/interledger.mdx @@ -14,7 +14,7 @@ Interledger itself is a network of computers that enables sending payments acros For two nodes on the Interledger network to exchange ILP packets with one another, the two nodes must be peers. There are a number of [requirements](/integration/peering#add-peer) that both you and your potential peer must meet in order to form a peering relationship. -Since the purpose of peering is to facilitate payments, which often involves extending lines of credit, your peer should be someone you trust. We strongly recommend you and your potential peer define your expectations and outline your agreements in a legally-binding document before you add them as a peer in Rafiki. +Since the purpose of peering is to facilitate payments, which often involves extending lines of credit, your peer should be someone you trust. We strongly recommend you and your potential peer define your expectations and outline your agreements in a legally-binding document peering with one another. ## Connectors diff --git a/packages/documentation/src/content/docs/integration/before-you-begin.mdx b/packages/documentation/src/content/docs/integration/before-you-begin.mdx deleted file mode 100644 index eadfb254b7..0000000000 --- a/packages/documentation/src/content/docs/integration/before-you-begin.mdx +++ /dev/null @@ -1,571 +0,0 @@ ---- -title: Before you begin ---- - -import { Badge } from '@astrojs/starlight/components' -import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' - -As you begin setting up your production environment, there are a few integration details that should be approached first. Begin by configuring Rafiki to: - -- Support cross-currency transactions by providing [exchange rate details](#provide-exchange-rate-details) -- Charge [fees](#charge-fees-for-facilitating-transfers) for facilitating transfers -- Integrate with your [identity provider](#integrate-with-your-identity-provider) -- Establish a mechanism for managing liquidity via [webhook events](#manage-liquidity-via-webhook-events) - -## Provide exchange rate details - -To support cross-currency transactions, you must provide Rafiki with an endpoint from where it can fetch current exchange rates. - -Skip to the [exchange rate environment variables](#exchange-rate-environment-variables) for a summary of required variables. - -### Rate probes and slippage - -Every Interledger payment is preceded by a rate probe. A rate probe provides a quote that estimates the cost of transferring value over the network, including any fees connector nodes may charge. For the rate probe to be successful, Rafiki needs current exchange rates. - -As exchange rates and fees charged by connectors fluctuate, there will likely be a variance between the estimated amount provided in the quote and the actual amount required when the payment is initiated. This difference is called slippage. - -Rafiki's default slippage is set to `0.01` (1%). This value can be changed to a value between 0 and 1 via the `SLIPPAGE` variable. - -#### Slippage example - -Using the default slippage of `0.01` (1%), the rate probe's quote returns `$1.00` USD. A payment of `$1.01` USD will be successful. However, the payment will fail if the total, inclusive of exchange rate and network fees, amounts to `$1.02` USD or more. - -### Requests to your exchange rates endpoint - -When Rafiki issues a `GET` request to your endpoint, the endpoint must respond with the following. - -| Variable | Type | Description | Required | -| -------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `base` | String | The asset code represented as an ISO 4217 currency code, e.g. USD | Y | -| `rates` | Object | Object containing `` pairs, e.g. `{EUR: 0.8930}` | Y | -| `rates.` | Number | The exchange rate given `base` and `` | Y | - -We provide an OpenAPI specification for the endpoint, if needed. - -Below is a minimalistic example of a successful (200) request, taken from our mock account servicing entity. - -```json {13} -import type { LoaderFunctionArgs } from '@remix-run/node' -import { json } from '@remix-run/node' -import { CONFIG as config } from '~/lib/parse_config.server' - -export function loader({ request }: LoaderFunctionArgs) { - const base = new URL(request.url).searchParams.get('base') || 'USD' - - return json( - { - base, - rates: config.seed.rates[base] || {} - }, - { status: 200 } - ) -} -``` - -### Exchange rates lifetime - -Specify how long your Rafiki instance will cache exchange rates via the `EXCHANGE_RATES_LIFETIME` variable (default is `15_000` ms). Caching improves performance as Rafiki will not need to request the rates from your endpoint for every payment. - -### Exchange rate environment variables - -The exchange rate environment variables are part of the `backend` service. - -The file that contains your variables varies depending on whether you are running Rafiki via Docker (`docker-compose.yaml`) or via Helm and Kubernetes (`values.yaml` for the Helm chart). - -| Environment variable | Description | Required | -| ------------------------- | ----------------------------------------------------------------------------------------------- | -------- | -| `EXCHANGE_RATES_URL` | Your exchange rates endpoint | Y | -| `EXCHANGE_RATES_LIFETIME` | The amount of time Rafiki caches exchange rates, in ms | Y | -| `SLIPPAGE` | The variance allowed between a quote and the actual amount required when a payment is initiated | Y | - -## Charge fees for facilitating transfers - -You can charge fees on top of estimated network fees to facilitate transfers. Each asset you support can have a different fee structure. - -You can define: - -- A fixed fee amount (optional) -- A variable fee amount via basis points (optional) -- Whether the fee is incurred by the sender or the receiver - :::note - The Backend Admin API allows you to set one or the other. The [Rafiki Admin app](/admin/admin-user-guide) only allows you to set the fee to be incurred by the sender. - ::: - -### Example - -For this example, assume your asset scale is 2. You'll charge a fixed fee of 100 (\$1.00) and a variable fee of 100 (1%). - -#### Backend Admin API `setFee` mutation - - -```graphql -mutation SetFee($input: SetFeeInput!) { - setFee(input: $input) { - code - success - message - fee { - id - assetId - type - fixed - basisPoints - createdAt - } - } -} -``` - - -#### JSON Request - - -```json -{ - "input": { - "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", - "type": "SENDING", - "fee": { - "fixed": 100, - "basisPoints": 100 - } - } -} -``` - - -| Variable | Description | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `assetId` | The unique ID assigned by Rafiki when the asset was created. | -| `type` | Indicates who incurs the fee: either the sender (`SENDING`) or receiver (`RECEIVING`). | -| `fixed` | The amount of the flat, fixed fee to charge. Assuming USD with an asset scale of 2, a value of `100` equals \$1.00. | -| `basisPoints` | The amount of the variable fee to charge based on the total amount. One basis point is equal to 0.01% of the total amount. `100` basis points equals 1%, and `10000` basis points equals 100%. In this example, the fee is 1%. | - -#### JSON Response - - -```json -{ - "data": { - "setFee": { - "code": "200", - "success": true, - "message": "Fee set", - "fee": { - "id": "140fd9c0-8f14-4850-9724-102f04d97e69", - "assetId": "14863f6f-4bda-42ef-8715-bf4762898af8", - "type": "SENDING", - "fixed": "100", - "basisPoints": 100, - "createdAt": "2023-09-13T14:59:53.435Z" - } - } - } -} -``` - - -## Integrate with your identity provider - -An identity provider (IdP) is a system or service that stores and manages user identity information, authentication, and consent. Integration with an IdP is required due to Rafiki's use of the Open Payments standard and APIs. Skip to the [IdP environment variables](#idp-environment-variables) for a summary of required variables. - -Your IdP will: - -- Authenticate requests from clients to create payments and quotes on Rafiki's backend -- Manage interactions with end users, such as your account holders, to gather consent - -Before a client can make an outgoing payment request, it must obtain a grant from your authorization server. Open Payments requires explicit interaction by an individual (typically the client's end user) before issuing the grant. Presenting the end-user with a consent screen from which they choose to accept or deny the payment is an example of an interaction. - -The interaction is facilitated by your IdP. Your IdP: - -- Provides the consent screen -- Sends the user's interaction choice to your authorization server -- Redirects the user after the interaction is complete - -### Rafiki Admin - -Rafiki Admin is a web app that allows you to manage your Rafiki instance through a UI. Out of the box, we provide Ory Kratos for the identity and user management of your administrators. Kratos is for internal use and cannot be used as an identity provider for your Open Payments authorization server. - -### IdP environment variables - -| Environment variable | Description | Required | -| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `IDENTITY_SERVER_DOMAIN` | The URL that your authorization server will direct the client to so the client's end-user can complete the interaction and authorize a grant. | Y | -| `IDENTITY_SERVER_SECRET` | A shared secret between your authorization server and your IdP that your authorization server will use to secure its IdP-related endpoints. Your IdP must provide this secret when it sends requests to your authorization server. | Y | - -### Endpoints - -There are a number of endpoints that facilitate communication between your IdP and your authorization server after a pending grant request is created. - -The endpoints are called in the sequence listed in the table below. - -| Method | Endpoint | Purpose | -| ---------------------------------------------------- | ------------------------------- | --------------------------------------------------------------- | -| | `/interact/:id /:nonce` | [Establish interaction session](#establish-interaction-session) | -| | `/grant/:id /:nonce` | [Fetch grant information](#fetch-grant-information) | -| | `/grant/:id /:nonce` | [Accept or reject grant](#accept-or-reject-grant) | -| | `/interact/:id /:nonce /finish` | [Finish interaction](#finish-interaction) | -| | `/interact/:id /:nonce` | [Continue grant](#continue-grant) | - -Each interaction with an endpoint is identified by an `id` and a `nonce`. Both are provided as query parameters when your authorization server redirects to your IdP. - -#### Establish interaction session - -Called by the client and establishes an interactive session with your authorization server, which redirects the browser session to the IdP consent screen. - -#### Fetch grant information - -Called by your IdP to retrieve a list of access rights, requested by the client, from your authorization server. The access rights are presented to the client's end-user on the consent screen. The authorization server's response is served on the `INTERACTION_PORT`, which is `3009` by default. - -| Header | Description | Required | -| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | -| `x-idp-secret` | Used to secure communication between your IdP and authorization server using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | - -#### Accept or reject grant - -Your IdP communicates the end-user’s acceptance or rejection on the consent screen to your authorization server, then redirects to `GET /interact/:id/:nonce/finish`. The response is served on `INTERACTION_PORT`, which is `3009` by default. - -| Header | Description | Required | -| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | -| `x-idp-secret` | Used to secure communication between your IdP and authorization server using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | - -#### Finish interaction - -Your IdP ends the interaction initiated by `GET /interact/:id/:nonce` and redirects the end-user's browser session to the URI of the grant initialization request. A query parameter will indicate a failure, or on success, a SHA-256 hash parameter that the client can use to verify the successful interaction. - -| Query parameter | Description | Required | -| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `id` | Interaction ID | Y | -| `nonce` | Interaction nonce | Y | -| `result` | Success or failure of the grant authorization. In case of success, the SHA-256 hash of the interaction is sent in the response along with the `interact_ref` that identifies the interaction on the authorization server and the URI of the grant initialization request. | Y | - -The following tables list examples of the different possible response types on this endpoint. - -| Response | Description | Example | -| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -| Rejected | The interaction was rejected by the end-user. | `?result=grant_rejected` | -| Invalid | The grant was not in a state where it could be accepted or rejected (e.g., grant was already approved) | `?result=grant_invalid` | -| Success | The grant was successful with the following returned in the response:
    • A hash representing the SHA-256 hash of values provided by the client in the grant initialization request (`interact.finish.nonce`), and the values in the response returned from your authorization server (`interact.finish`).
    • The `interact_ref` that identifies the interaction on your authorization server alongside the hash
    • The URI of the grant initialization request (e.g., `https://www.auth-server.com`)
    | `hash=p28jsq0Y2KK3WS__a42tavNC64ldGTBroywsWxT4md_jZQ1R\HZT8BOWYHcLmObM7XHPAdJzTZMtKBsaraJ64A &interact_ref=4IFWWIKYBC2PQ6U56NL1` | - -#### Continue grant - -The client requests a grant from your authorization server for an accepted interaction. Your authorization server responds with an access token. - -## Manage liquidity via webhook events - -Rafiki does not hold user account balances but tracks liquidity within asset, peer, and payment accounts in its own database. To effectively manage liquidity, you need to expose an endpoint that listens for specific events dispatched by Rafiki. These events notify your system of time-sensitive status updates, warnings, and errors. - -When an event occurs in your Rafiki instance, the Rafiki `backend` service sends a POST request to your configured `WEBHOOK_URL` [environment variable](/resources/environment-variables/). Your endpoint must respond with a 200 status code to confirm a successful receipt. - -### Request body - -Each webhook event is sent as JSON payload that follows a similar format: - -| **Attribute** | **Type** | **Description** | **Required?** | -| ------------- | ------------------------- | --------------------------------------------------- | ------------- | -| `id` | String | Unique webhook event ID | Y | -| `type` | [EventType](#event-types) | `EventType` value | Y | -| `data` | Object | Additional data that coincides with the `EventType` | Y | - -### Event types - -The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle. - -| Value | Description | -| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | -| [`incoming_payment.created`](#incoming_paymentcreated) | An incoming payment has been created. | -| [`incoming_payment.completed`](#incoming_paymentcompleted) | An incoming payment is complete and will not accept any additional incoming funds. | -| [`incoming_payment.expired`](#incoming_paymentexpired) | An incoming payment expired and will not accept any additional incoming funds. | -| [`outgoing_payment.created`](#outgoing_paymentcreated) | An outgoing payment was created. | -| [`outgoing_payment.completed`](#outgoing_paymentcompleted) | An outgoing payment completed. | -| [`outgoing_payment.failed`](#outgoing_paymentfailed) | An outgoing payment partially or completely failed. | -| [`wallet_address.not_found`](#wallet_addressnot_found) | A requested wallet address was not found. | -| [`wallet_address.web_monetization`](#wallet_addressweb_monetization) | Web Monetization payments received via STREAM. | -| [`asset.liquidity_low`](#assetliquidity_low) | Asset liquidity has dropped below defined threshold. | -| [`peer.liquidity_low`](#peerliquidity_low) | Peer liquidity has dropped below defined threshold. | - -An OpenAPI specification of the webhook requests and their corresponding data can be found here. - -Additionally, the local playground playground contains example payloads in the Bruno collection that can be used to test a webhook service integration. - -#### Incoming payment events - -BD - Need updated workflow info/overview of incoming payments - -Incoming payment events - -| **Attribute** | **Type** | **Description** | **Required?** | -| ----------------- | -------- | -------------------------------------------------------------------------------------------------- | ------------- | -| `id` | String | Incoming payment ID | **Y** | -| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | **Y** | -| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | -| `completed` | Boolean | True if the incoming payment has completed receiving funds | **Y** | -| `incomingAmount` | Object | The maximum amount that should be paid into the wallet address under this incoming payment | N | -| `receivedAmount` | Object | The total amount that has been paid into the wallet address under this incoming payment | **Y** | -| `metadata` | Object | Additional metadata associated with the incoming payment | N | -| `createdAt` | String | Date-time of creation | **Y** | -| `updatedAt` | String | Date-time of last update | **Y** | -| `expiresAt` | String | Date-time of payment expiration | **Y** | - -##### `incoming_payment.created` - -The `incoming_payment.created` event indicates that an incoming payment was created. No funds are received in your Rafiki instance, so no action is required. This webhook event is informational and allows you to display upcoming incoming payments to your users. - ->ASE: webhook event: incoming payment created - ASE->>ASE: no action required - -`} -/> - -##### `incoming_payment.completed` - -The `incoming_payment.completed` event indicates that an incoming payment was completed, either automatically or manually, and that any funds received into this incoming payment should be withdrawn and credited to the recipient’s account on your ledger. - -In addition, the `CreateIncomingPaymentWithdrawal` supports two-phase transfers. - -Example: An incoming payment was completed and the recipient received **$10**. - ->ASE: webhook event: incoming payment completed,
    receivedAmount: $10 - ASE->>R: admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: credit receiver's account with $10 - -`} -/> - -Example: An incoming payment supporting two-phase transfers was completed and received **$10**. - ->ASE: webhook event: incoming payment completed,
    receivedAmount: $10 - ASE->>R: admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: credit receiver's account with $10 - ASE->>R: admin API call: PostLiquidityWithdrawal - R->>R: 2-phase transfer completed - -`} -/> - -##### `incoming_payment.expired` - -The `incoming_payment.expired` event indicates that an incoming payment has expired and that any funds previously received for this incoming payment should be withdrawn and credited to the recipient’s account on your ledger. Note that this event is only fired if funds were received for the incoming payment. In cases where the sender did not specify the `incomingAmount` when the `incomingPayment` resource was initially created, the `incoming_payment.expired` event notifies you that no further payments are expected. The primary use case of the `incoming_payment.expired` event to signal the end of any additional payments is a streaming payments example, such as Web Monetization. - -Example: An incoming payment has expired and received **$2.55**. - ->ASE: webhook event: incoming payment expired,
    receivedAmount: $2.55 - ASE->>R: admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: credit receiver's account with $2.55 - -`} -/> - -#### Outgoing payment events - -BD - Need updated workflow info/overview of outgoing payments - -Outgoing payment events - -| Attribute | Type | Description | Required | -| ----------------- | ------- | -------------------------------------------------------------------------------------------------- | -------- | -| `id` | String | Incoming payment ID | **Y** | -| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | **Y** | -| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | -| `state` | String | Outgoing payment state, either `PENDING`, `PROCESSING`, `COMPLETED`, or `EXPIRED` | **Y** | -| `receiver` | String | Wallet address URL of the receiver | **Y** | -| `debitAmount` | Object | Amount to send (fixed send) | **Y** | -| `sentAmount` | Object | Amount to receive (fixed receive) | **Y** | -| `metadata` | Object | Additional metadata associated with the outgoing payment | N | -| `createdAt` | String | Date-time of creation | **Y** | -| `updatedAt` | String | Date-time of last update | **Y** | -| `expiresAt` | String | Date-time of payment expiration | **Y** | -| `error` | String | ?? | N | -| `stateAttempts` | Integer | ?? | **Y** | -| `balance` | String | ?? | **Y** | -| `peerId` | String | ?? | N | - -##### `outgoing_payment.created` - -The `outgoing_payment.created` event indicates that an outgoing payment was created and is awaiting liquidity. You should verify the sender’s account balance and perform other verifications before funding or canceling the outgoing payment in case the sender has insufficient funds in their account. If the outgoing payment is not fulfilled, you can cancel it. Otherwise, you must put a hold on the sender’s account and deposit the funds into Rafiki. - -Example: An outgoing payment for **$12** has been created. - ->ASE: webhook event: outgoing payment created,
    debitAmount: $12 - ASE->>ASE: check if account has enough balance - alt Account has enough balance - ASE->>ASE: put hold of $12 on sender's account - ASE->>R: admin API call: DepositOutgoingPaymentLiquidity - end - alt Account does not have enough balance - ASE->>R: admin API call: CancelOutgoingPayment
    reason: Not enough balance - end - -`} -/> - -##### `outgoing_payment.completed` - -The `outgoing_payment.completed` event indicates that an outgoing payment has successfully sent as many funds as possible to the receiver against the associated incoming payment. You should withdraw any excess liquidity from that outgoing payment in Rafiki that arises from differences between the sent and received amounts and use it as you see fit. One option would be to return it to the sender. Another option is to retain the excess liquidity as a service fee. Furthermore, you should remove the hold on the sender’s account and debit it. - -In addition, the `CreateOutgoingPaymentWithdrawal` supports [two-phase transfers](https://rafiki.dev/reference/glossary/#two-phase-transfers). - -Example: An outgoing payment amount for **$12** has been completed. **$11.50** were sent. You keep **$0.50** as fees. - ->ASE: webhook event: outgoing completed,
    debitAmount: $12, sentAmount:$11.50 - ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal - ASE->>ASE: remove the hold and deduct $12 from the sender's account,
    credit ASE's account with $0.50 - -`} -/> - -Example: An outgoing payment supporting two-phase transfers for **$12** has been completed. **$11.50** were sent. You keep **$0.50** as fees. - ->ASE: webhook event: outgoing completed,
    debitAmount: $12, sentAmount:$11.50 - ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal - ASE->>ASE: remove the hold and deduct $12 from the sender's account,
    credit ASE's account with $0.50 - ASE->>R: admin API call: PostLiquidityWithdrawal - R->>R: 2-phase transfer completed - -`} -/> - -##### `outgoing_payment.failed` - -The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was unsuccessful. You should withdraw any remaining liquidity from that outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` was 0), you should remove the hold from the sender’s account. If the payment failed partially, you should remove the hold from the sender’s account and debit it with the amount sent. Considering the discrepancy between the quote amount and the amount sent, you should refrain from taking a sending fee. - -Example: An outgoing payment for **$12** has failed. **$8** were sent. - ->ASE: webhook event: outgoing failed,
    debitAmount: $12, sentAmount:$8 - ASE->>R: admin API call: CreateOutgoingPaymentWithdrawal - ASE->>ASE: remove the hold and deduct $8 from the sender's account - -`} -/> - -#### Wallet address events - -BD - Need updated workflow info/overview of wallet address events - -##### `wallet_address.web_monetization` - -The `wallet_address.web_monetization` event indicates that a wallet address received Web Monetization payments via the ILP STREAM protocol. You should withdraw that liquidity from the wallet address in Rafiki and credit the receiver’s account on your ledger. - -Example: A wallet address received **$0.33** - ->ASE: webhook event: wallet address web monetization,
    receivedAmount: $0.33 - ASE->>R: admin API call: CreateWalletAddressWithdrawal - ASE->>ASE: credit receiver's account with $0.33 - -`} -/> - -##### `wallet_address.not_found` - -The `wallet_address.not_found` event indicates that a wallet address was requested via the Open Payments Wallet address server API, but it doesn’t exist in your Rafiki instance. When receiving this event, you can look up the associated account in your system and create a wallet address. The initial request for the wallet address will succeed if you create it within the configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. - -Example: The wallet address `https://example-wallet.com/carla_garcia` was requested but does not exist yet. - ->ASE: webhook event: wallet address not found,
    wallet address: https://example-wallet.com/carla_garcia - ASE->>R: admin API call: CreateWalletAddress
    url: https://example-wallet.com/carla_garcia,
    public name: Carla Eva Garcia - -`} -/> - -#### Liquidity events - -BD - Need updated workflow info/overview of asset/peer liquidity events - -##### `asset.liquidity_low` - -The `asset.liquidity_low` event indicates that an asset’s liquidity has dropped below a predefined liquidity threshold. When receiving this event, you should check if you already have or can acquire additional liquidity for that specific asset and, if so, deposit it in Rafiki. Cross-currency transfers will fail if you do not increase that asset’s liquidity in Rafiki. - -Example: The asset liquidity for USD (scale: 2) drops below **$100.00**. - ->ASE: webhook event: liquidity (asset) low,
    asset: USD (scale: 2, id: "abc") - ASE->>R: admin API call: DepositAssetLiquidity - -`} -/> - -##### `peer.liquidity_low` - -The `peer.liquidity_low` event indicates that a peer’s liquidity has dropped below a predefined liquidity threshold. When receiving this event, you must decide if you want to extend that peer’s credit line or whether the peer must settle first and then extend a new line of credit to that peer. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. - -Example: The peer liquidity for Happy Life Bank drops below **$100.00**. - ->ASE: webhook event: liquidity (peer) low,
    peer: Happy Life Bank (asset: "USD", scale: 2, id: "abc") - ASE->>R: admin API call: DepositPeerLiquidity - -`} -/> - -### Error handling - -If an error occurs when Rafiki sends a webhook event (i.e., a non-200 status is returned or the request timed out), Rafiki will retry the webhook requests at increasing intervals until a 200 status is returned. The first retry is after 10 seconds, the second after 20 more, the next after 30 more, etc. The maximum number of retries for webhook events is configured via the `WEBHOOK_MAX_RETRY` environment variable. - -Additionally, the timeout for webhook requests is configured with the `WEBHOOK_TIMEOUT` environment variable. - -### Best Practices - -#### Duplicate Events - -The `id` in the webhook event payload is a unique UUID, which your system can use to determine whether the event has been received previously, preventing duplicate event processing. - -#### Asynchronous Handling - -Consider using a worker to process received webhook events, especially if requests to credit/debit user accounts are lengthy processes. Doing so allows the server to process events at a rate suitable for the system and reduce the number of failed/retried webhook events since the webhook event listener can immediately reply with a successful 200 status. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx deleted file mode 100644 index bb5eb2a3a0..0000000000 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/adding-asset.mdx +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Adding asset ---- - -import { LinkOut } from '@interledger/docs-design-system' - -import { CodeBlock } from '@interledger/docs-design-system' - -[Assets](/concepts/accounts-transfers-liquidity#assets) in Rafiki can be added through the Backend Admin API or the Rafiki Admin application. - -## The `asset` type - -The `asset` type in Rafiki consists of a value, an asset code, and an asset scale. - -| **Property** | **Type** | **Description** | **Example** | -| ------------ | -------- | -------------------------------------------------------------------------------------------------------------------- | ----------- | -| `value` | BigInt | Numerical amount | 10000 | -| `assetCode` | String | Should be an ISO 4217 currency code where available | “USD” | -| `assetScale` | Integer | Difference in order of magnitude between the standard unit and a fractional unit | 2 | - -To convert from an asset to a currency amount that is more human-readable, apply the following formula: - -$currencyAmount = \frac{value}{10^{assetScale}}$ - -Using the example from the table above, our formula looks like this: - -$\frac{10000}{10^2} =100.00$ USD - -## Add an asset using the Backend Admin API - -Rafiki’s Backend Admin API implements a GraphQL interface. Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts; a query and an object containing query variables. - -To add US dollars, for example, as an asset type to your Rafiki instance, call the `CreateAsset` mutation and pass the `input` parameters for the asset `code`, represented by its ISO 4217 currency code (USD), and scale variables as follows: - - - -```graphql -// Query: - -mutation CreateAsset($input: CreateAssetInput!) { - createAsset(input: $input) { - code - success - message - asset { - id - code - scale - } - } -} - - -// Query Variables: - -{ - "input": { - "code": "USD", - "scale": 2 - } -} - -``` - - - - - -```graphql -{ - "data": { - "createAsset": { - "code": "200", - "success": true, - "message": "Created Asset", - "asset": { - "id": "b3dffeda-1e0e-47d4-82a3-69b1a622eeb9", - "code": "USD", - "scale": 2 - } - } - } -} - - -``` - - - -## Add an asset using the Rafiki Admin application - -Alternatively, assets can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/integration/deployment/playground/overview/#running-the-local-environment). - -See the [Rafiki Admin application user guide](/admin/admin-user-guide/#assets) for more information on adding assets. diff --git a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx b/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx deleted file mode 100644 index d5e7d12ed5..0000000000 --- a/packages/documentation/src/content/docs/integration/deploy-to-prod/running-your-instance/creating-wallet-address.mdx +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: Creating wallet address (strategies for identity lookup) ---- - -import { LinkOut } from '@interledger/docs-design-system' - -import { CodeBlock } from '@interledger/docs-design-system' - -To allow your account holders the ability to send and receive payments via the Open Payments APIs, you must create at least one wallet address for each account. The wallet address serves as a standardized identifier for a payment account. - -You can create wallet addresses for your account holders using the Backend Admin API. Note that at least one asset must be created before the wallet address is created. The `assetId` of the asset must be provided as an input variable when issuing the GraphQL mutation query. - -## Creating wallet addresses through a script - -One approach to issuing wallet addresses to your account holders is writing a one-time script to loop through your list of account holders and call the `CreateWalletAddress` GraphQL mutation along with the input parameters. The following is an example: - - - -```graphql -// Query: - -mutation CreateWalletAddress($input:CreateWalletAddressInput!) { - createWalletAddress(input:$input) { - code - success - message - walletAddress { - id - createdAt - publicName - url - asset { - code - id - scale - } - } - } -} - - -// Input parameters **NOTE - `additionalProperties` are optional: - -{ - "input": { - "assetId": "0ddc0b7d-1822-4213-948e-915dda58850b", - "publicName": "Sarah Marshall", - "url": "https://example.wallet.com/sarah", - "additionalProperties": [ - { - "key": "iban", - "value": "NL93 8601 1117 947", - "visibleInOpenPayments": false - }, - {"key": "nickname", "value": "S Mar", "visibleInOpenPayments": true } - ] - } -} - -``` - - - - - -```graphql -{ - "data": -{"createWalletAddress": { - "code":"200", - "success":true, - "message":"Created wallet address", - "walletAddress": { - "id":"695e7546-1803-4b45-96b6-6a53f4082018", - "createdAt":"2023-03-03T09:07:01.107Z", - "publicName":"Sarah Marshall", "url":"https://example.wallet.com/sarah", - "asset": { -"id":"0ddc0b7d-1822-4213-948e-915dda58850b", - "code":"USD", - "scale":2 - } - } - } - } -} - -``` - - - -You SHOULD store at least the `walletAddress.id` in their internal database to be able to reference the account and wallet address. - -### Create wallet address key - -To use the Open Payments APIs, a wallet address must be associated with at least one private-public key pair to sign an API request. One or multiple public keys are linked to the wallet address so that third parties can verify request signatures. The key pair can be added using the `CreateWalletAddressKey` GraphQL mutation. If you create wallet addresses for your account holders via a one-time script, you must call this mutation for each new wallet address. - - - -```graphql -// Query: - -mutation -CreateWalletAddressKey -($input:CreateWalletAddressKeyInput!) -{ - createWalletAddressKey(input:$input) { - code - message - success - walletAddressKey -{ -id - walletAddressId - revoked - jwk{ - alg - crv - kid - kty - x - } - - createdAt - } -} -} - - -// Input parameters - -{ - "input": { - "jwk": { - "kid": "keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", - "x":"ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8", - "alg":"EdDSA", - "kty":"OKP", - "crv":"Ed25519" -}, -"walletAddressId":"695e7546-1803-4b45-96b6-6a53f4082018" - }} - -``` - - - - - -```graphql -{ - "data": { - "createWalletAddressKey": { -"code":"200", -"message":"Added Key To Wallet Address", -"success":true, -"walletAddressKey": { - "id":"f2953571-f10c-44eb-ab41-4450a7ad6771", -"walletAddressId":"695e7546-1803-4b45-96b6-6a53f4082018", -"revoked":false, -"jwk": { -"alg":"EdDSA", -"crv":"Ed25519", - "kid":"keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", - "kty":"OKP", -"x":"ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8" -}, - "createdAt":"2023-03-03T09:26:41.424Z" -} - } - } -} - - -``` - - - -## Creating wallet addresses dynamically - -An alternative approach to creating wallet addresses for your account holders is to generate the addresses dynamically when your Rafiki instance fires the `wallet_address.not_found` webhook event. This event fires when Rafiki does not find the wallet address requested from an Open Payments API call. When receiving this event, you can look up the associated account in your system and call the `CreateWalletAddress` and `CreateWalletAddressKey` mutations to create the wallet address and its associated private-public key pair. Even if you opt to create the initial batch of wallet addresses for your existing account holders via a one-time script, you may implement this process to dynamically create wallet addresses for any new accounts you onboard to your system. diff --git a/packages/documentation/src/content/docs/integration/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx similarity index 100% rename from packages/documentation/src/content/docs/integration/exchange-rates.mdx rename to packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx diff --git a/packages/documentation/src/content/docs/integration/fees.mdx b/packages/documentation/src/content/docs/integration/get-started/fees.mdx similarity index 100% rename from packages/documentation/src/content/docs/integration/fees.mdx rename to packages/documentation/src/content/docs/integration/get-started/fees.mdx diff --git a/packages/documentation/src/content/docs/integration/idp.mdx b/packages/documentation/src/content/docs/integration/get-started/idp.mdx similarity index 100% rename from packages/documentation/src/content/docs/integration/idp.mdx rename to packages/documentation/src/content/docs/integration/get-started/idp.mdx diff --git a/packages/documentation/src/content/docs/integration/get-started.mdx b/packages/documentation/src/content/docs/integration/get-started/overview.mdx similarity index 100% rename from packages/documentation/src/content/docs/integration/get-started.mdx rename to packages/documentation/src/content/docs/integration/get-started/overview.mdx diff --git a/packages/documentation/src/content/docs/integration/webhook-events.mdx b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx similarity index 63% rename from packages/documentation/src/content/docs/integration/webhook-events.mdx rename to packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx index 327ae0e6a7..28f4a4e304 100644 --- a/packages/documentation/src/content/docs/integration/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx @@ -12,31 +12,37 @@ import { The main communication channel between you and your Rafiki instance is composed of the Backend Admin API and a set of webhook events. -Most events will require you to interact with Rafiki to deposit or withdraw liquidity, or to provide wallet address information. - -Rafiki itself does not hold user account balances. Instead it keeps track of liquidity within asset, peer, and payment accounts in its own database. Liquidity needs to be managed primarily as a response to events that happen in Rafiki. +Most events require you to interact with Rafiki to provide wallet address information or manage (deposit or withdraw) liquidity. Instead of holding user account balances, Rafiki keeps track of liquidity within your instance's asset, peer, and payment accounts within its own database. ## Specify your webhook event endpoint -Specify your webhook endpoint via the `backend` service's WEBHOOK_URL variable. +First, specify your webhook endpoint via the `backend` service's WEBHOOK_URL variable. This endpoint is the URL to which your `backend` service will makes a request when an event occurs. The `backend` service expects a `200` status in the response to confirm a successful receipt. ``` WEBHOOK_URL: http://cloud-nine-wallet/webhooks ``` -When events occur in Rafiki, your `backend` service makes a request to your webhook endpoint. The `backend` service expects a `200` status in the response to confirm a successful receipt. +## Set up your event listener + + + + -## Event handler -For Rafiki to notify you about these events, you must expose a webhook endpoint that listens for the events dispatched by Rafiki and reacts accordingly. These events notify your system of time-sensitive status updates, warnings, and errors. + +"The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle." + + + +For Rafiki to notify you about webhook events, you must expose a webhook endpoint that listens for the events dispatched by Rafiki and reacts accordingly. These events notify your system of time-sensitive status updates, warnings, and errors. Your expected behavior when observing the webhook events is detailed below. ## Request body -Each webhook event is sent as JSON payload that follows a similar format: +Each webhook event is sent as a JSON payload that follows a similar format. The parameters within the `data` object will vary depending on the event. -| Attribute | Type | Description | Required? | +| Attribute | Type | Description | Required | | --------- | ------------------------- | --------------------------------------------------- | --------- | | `id` | String | Unique webhook event ID | Y | | `type` | [EventType](#event-types) | `EventType` value | Y | @@ -125,28 +131,11 @@ Each webhook event is sent as JSON payload that follows a similar format: -## Event types - -The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle. +## Error handling -| Value | Description | -| ----------------------------------- | ---------------------------------------------------------------------------------- | -| [`incoming_payment.created`] | An incoming payment has been created. | -| [`incoming_payment.completed`] | An incoming payment is complete and will not accept any additional incoming funds. | -| [`incoming_payment.expired`] | An incoming payment expired and will not accept any additional incoming funds. | -| [`outgoing_payment.created`] | An outgoing payment was created. | -| [`outgoing_payment.completed`] | An outgoing payment completed. | -| [`outgoing_payment.failed`] | An outgoing payment partially or completely failed. | -| [`wallet_address.not_found`] | A requested wallet address was not found. | -| [`wallet_address.web_monetization`] | Web Monetization payments received via STREAM. | -| [`asset.liquidity_low`] | Asset liquidity has dropped below defined threshold. | -| [`peer.liquidity_low`] | Peer liquidity has dropped below defined threshold. | - -An OpenAPI specification of the webhook requests and their corresponding data can be found here. - -Additionally, the local playground playground contains example payloads in the Bruno collection that can be used to test a webhook service integration. +If an error occurs when Rafiki sends a webhook event (i.e., a non-200 status is returned or the request timed out), Rafiki will retry the webhook requests at increasing intervals until a 200 status is returned. The first retry is after 10 seconds, the second after 20 more, the next after 30 more, etc. The maximum number of retries for webhook events is configured via the `WEBHOOK_MAX_RETRY` environment variable. ---- +Additionally, the timeout for webhook requests is configured with the `WEBHOOK_TIMEOUT` environment variable. ## Incoming payment event sequence @@ -164,12 +153,12 @@ Two `incoming_payment.completed` events are shown in the diagram below. The firs ### Incoming payment expired -The `incoming_payment.expired` event only fires if funds were received for the incoming payment and signals the end of any additional payments. +The `incoming_payment.expired` event will only fire if funds were received for the incoming payment. The event signals the end of any additional payments. -The primary use case for this event is for use with streaming payments, such as those supported through Web Monetization. The event indicates that the incoming payment expired and any funds already received for the payment should be withdrawn and credited to the recipient's account on your ledger. +The primary use case for this event is to know when a streaming payment, such as one supported through Web Monetization, has expired. In response to the event, any funds already received for the payment should be withdrawn and credited to the recipient's account on your ledger. :::note -In a scenario where the sender didn't specify the `incomingAmount` when the incoming payment was first created, receiving an `incoming_payment.expired` event indicates that no further payments are expected. +In a scenario where a sender didn't specify an `incomingAmount` when the incoming payment was first created, receiving an `incoming_payment.expired` event indicates that no further payments are expected. ::: In the diagram below, \$2.55 was received before the payment expired and the recipient is credited with that amount. @@ -208,17 +197,21 @@ In the diagram below, \$2.55 was received before the payment expired and the rec ### Outgoing payment created -The `outgoing_payment.created` event tells you when an outgoing payment is created and is awaiting liquidity. Verify the sender's account balance and perform any other necessary verifications before funding or cancelling the outgoing payment in case the sender has insufficient funds. If the outgoing payment is not fulfilled, you can cancel it. Otherwise, you must put a hold on the sender's account and deposit the funds into Rafiki. +The `outgoing_payment.created` event tells you when an outgoing payment is created and is awaiting liquidity. Verify the sender's account balance and perform any other necessary verifications before funding the payment. + +If the sender has insufficient funds or should otherwise not be fulfilled, cancel the outgoing payment.Otherwise, put a hold on the sender's account and deposit the funds into Rafiki. ### Outgoing payment completed -The `outgoing.payment_completed event indicates that an outgoing payment has successfully sent as many funds as possible to the receiver against the incoming payment. Withdraw any excess liquidity from the outgoing payment in Rafiki that arises from differences sent between the send and received amounts and use it as you see fit. One option would be to return it to the sender. Another option is to retain the excess liquidity as a service fee. Then, remove the hold on the sender's account and debit their account on your ledger. +The `outgoing.payment_completed` event indicates that as much as possible has been sent to the receiver against their incoming payment. -Two `outgoing.payment_completed` events are shown in the diagram below. The first is for a one-phase transfer and the second is for a two-phase transfer. In both examples, the outgoing payment amount is \$12 and you choose to keep \$0.50 in fees. +If there is excess liquidity in Rafiki due to differences between the sent and received amounts, withdraw the excess from the outgoing payment. What you choose to do with the excess is a business decision. One option is to return the excess to the sender. Another option is to retain the excess as a service fee. Lastly, remove the hold on your sender's account and debit their account on your ledger. + +Two `outgoing.payment_completed` events are shown in the diagram below. The first is for a one-phase transfer and the second is for a two-phase transfer. In both examples, the outgoing payment amount is \$12 and you choose to keep the \$0.50 in excess liquidity as a service fee. ### Outgoing payment failed -The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was unsuccessful. Withdraw any remaining liquidity from that outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` is `0`), remove the hold from the sender's account. If the payment partially failed, remove the hold from the sender's account and debit the sender's account on your ledger with the amount sent. Considering the discrepancy between the quote amount and the amount sent, you should refrain from taking a sending fee. +The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was unsuccessful. Withdraw any remaining liquidity from the outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` is `0`), remove the hold from your sender's account. If the payment partially failed, remove the hold from your sender's account, then debit the sender's account on your ledger with the amount that was sent successfully. Since there will be a discrepancy between the quote amount and the sent amount, we suggest you refrain from taking a sending fee. >ASE: Webhook event: wallet address Web Monetization,
    receivedAmount: $0.33 + ASE->>R: Backend Admin API call: CreateWalletAddressWithdrawal + ASE->>ASE: credit receiver's account with $0.33 + +`} +/> ### Wallet address not found -A wallet address was requested via the Open Payments wallet address server API but it doesn't exist in your Rafiki instance. +The `wallet_address.not_found` event indicates that a wallet address was requested by a peer via the Open Payments Wallet address server API, but the address doesn’t exist in your Rafiki instance. ---- +If you receive this event, you can look up the associated account in your system and create a wallet address for the account. The initial wallet address request will succeed if you create it within your configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. -## Low asset liquidity event sequence + + ``` WALLET_ADDRESS_LOOKUP_TIMEOUT_MS: ``` + -The `asset.liquidity_low` event indicates that an asset's liquidity has dropped below your predefined liquidity threshold. Check if you already have, or can acquire, additional liquidity for that specific asset. If so, deposit it in Rafiki. Cross-currency transfers will fail if you don't increase the asset's liquidity. +The following sequence diagram shows what happens when the wallet address `https://example-wallet.com/carla_garcia` was requested from your Rafiki instance, but the address does not exist yet. ---- +>ASE: Webhook event: wallet address not found,
    wallet address: https://example-wallet.com/carla_garcia + ASE->>R: Backend Admin API call: CreateWalletAddress
    url: https://example-wallet.com/carla_garcia,
    public name: Carla Eva Garcia -The `peer.liquidity_low` event indicates that a peer's liquidity has dropped below your predefined liquidity threshold. Decide whether you want to extend the peer's credit line or if your peer must settle first, then extend them a new line of credit. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. +`} +/> ---- +## Low asset liquidity event sequence ---- +The `asset.liquidity_low` event indicates that an asset's liquidity has dropped below your predefined liquidity threshold. Check if you already have, or can acquire, additional liquidity for that specific asset. If so, deposit it in Rafiki. Cross-currency transfers will fail if you don't increase the asset's liquidity. -#### Incoming payment events +## Low peer liquidity event sequence -Incoming payment events +The `peer.liquidity_low` event indicates that a peer's liquidity has dropped below your predefined liquidity threshold. Decide whether you want to extend the peer's credit line or if your peer must settle before you will extend a new line of credit. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. -| **Attribute** | **Type** | **Description** | **Required?** | -| ----------------- | -------- | -------------------------------------------------------------------------------------------------- | ------------- | -| `id` | String | Incoming payment ID | **Y** | -| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | **Y** | +## Incoming payment event attributes + +| Attribute | Type | Description | Required | +| --------- | ---- | ----------- | ------------- | +| `id` | String | Incoming payment ID | Y | +| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | Y | | `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | -| `completed` | Boolean | True if the incoming payment has completed receiving funds | **Y** | +| `completed` | Boolean | When `true`, the incoming payment has completed receiving funds | Y | | `incomingAmount` | Object | The maximum amount that should be paid into the wallet address under this incoming payment | N | -| `receivedAmount` | Object | The total amount that has been paid into the wallet address under this incoming payment | **Y** | +| `receivedAmount` | Object | The total amount that has been paid into the wallet address under this incoming payment | Y | | `metadata` | Object | Additional metadata associated with the incoming payment | N | -| `createdAt` | String | Date-time of creation | **Y** | -| `updatedAt` | String | Date-time of last update | **Y** | -| `expiresAt` | String | Date-time of payment expiration | **Y** | +| `createdAt` | String | Date-time of creation | Y | +| `updatedAt` | String | Date-time of last update | Y | +| `expiresAt` | String | Date-time of payment expiration | Y | -#### Outgoing payment events +## Outgoing payment event attributes -Outgoing payment events +**COPYPASTA** | Attribute | Type | Description | Required | | ----------------- | ------- | -------------------------------------------------------------------------------------------------- | -------- | -| `id` | String | Incoming payment ID | **Y** | -| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | **Y** | +| `id` | String | Incoming payment ID | Y | +| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | Y | | `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | -| `state` | String | Outgoing payment state, either `PENDING`, `PROCESSING`, `COMPLETED`, or `EXPIRED` | **Y** | -| `receiver` | String | Wallet address URL of the receiver | **Y** | -| `debitAmount` | Object | Amount to send (fixed send) | **Y** | -| `sentAmount` | Object | Amount to receive (fixed receive) | **Y** | +| `state` | String | Outgoing payment state, either `PENDING`, `PROCESSING`, `COMPLETED`, or `EXPIRED` | Y | +| `receiver` | String | Wallet address URL of the receiver | Y | +| `debitAmount` | Object | Amount to send (fixed send) | Y | +| `sentAmount` | Object | Amount to receive (fixed receive) | Y | | `metadata` | Object | Additional metadata associated with the outgoing payment | N | -| `createdAt` | String | Date-time of creation | **Y** | -| `updatedAt` | String | Date-time of last update | **Y** | -| `expiresAt` | String | Date-time of payment expiration | **Y** | +| `createdAt` | String | Date-time of creation | Y | +| `updatedAt` | String | Date-time of last update | Y | +| `expiresAt` | String | Date-time of payment expiration | Y | | `error` | String | ?? | N | -| `stateAttempts` | Integer | ?? | **Y** | -| `balance` | String | ?? | **Y** | +| `stateAttempts` | Integer | ?? | Y | +| `balance` | String | ?? | Y | | `peerId` | String | ?? | N | -#### Wallet address events - -##### `wallet_address.web_monetization` +## Wallet address event attributes -The `wallet_address.web_monetization` event indicates that a wallet address received Web Monetization payments via the ILP STREAM protocol. You should withdraw that liquidity from the wallet address in Rafiki and credit the receiver’s account on your ledger. +## Asset liquidity low event attributes -Example: A wallet address received **$0.33** +## Peer liquidity low event attributes ->ASE: webhook event: wallet address web monetization,
    receivedAmount: $0.33 - ASE->>R: admin API call: CreateWalletAddressWithdrawal - ASE->>ASE: credit receiver's account with $0.33 - -`} -/> +### Duplicate events -##### `wallet_address.not_found` - -The `wallet_address.not_found` event indicates that a wallet address was requested via the Open Payments Wallet address server API, but it doesn’t exist in your Rafiki instance. When receiving this event, you can look up the associated account in your system and create a wallet address. The initial request for the wallet address will succeed if you create it within the configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. - -Example: The wallet address `https://example-wallet.com/carla_garcia` was requested but does not exist yet. - ->ASE: webhook event: wallet address not found,
    wallet address: https://example-wallet.com/carla_garcia - ASE->>R: admin API call: CreateWalletAddress
    url: https://example-wallet.com/carla_garcia,
    public name: Carla Eva Garcia - -`} -/> - -### Error handling - -If an error occurs when Rafiki sends a webhook event (i.e., a non-200 status is returned or the request timed out), Rafiki will retry the webhook requests at increasing intervals until a 200 status is returned. The first retry is after 10 seconds, the second after 20 more, the next after 30 more, etc. The maximum number of retries for webhook events is configured via the `WEBHOOK_MAX_RETRY` environment variable. - -Additionally, the timeout for webhook requests is configured with the `WEBHOOK_TIMEOUT` environment variable. +The `id` in the webhook event payload is a unique UUID, which your system can use to determine whether the event has been received previously, preventing duplicate event processing. -### Best Practices +### Asynchronous handling -#### Duplicate Events +Consider using a worker to process received webhook events, especially if requests to credit/debit user accounts are lengthy processes. Doing so allows the server to process events at a rate suitable for the system and reduce the number of failed/retried webhook events since the webhook event listener can immediately reply with a successful `200` status. -The `id` in the webhook event payload is a unique UUID, which your system can use to determine whether the event has been received previously, preventing duplicate event processing. +----- -#### Asynchronous Handling +An OpenAPI specification of the webhook requests and their corresponding data can be found here. -Consider using a worker to process received webhook events, especially if requests to credit/debit user accounts are lengthy processes. Doing so allows the server to process events at a rate suitable for the system and reduce the number of failed/retried webhook events since the webhook event listener can immediately reply with a successful 200 status. +Additionally, the local playground playground contains example payloads in the Bruno collection that can be used to test a webhook service integration. \ No newline at end of file diff --git a/packages/documentation/src/content/docs/resources/webhook-event-types.mdx b/packages/documentation/src/content/docs/resources/webhook-event-types.mdx new file mode 100644 index 0000000000..9a366e22f5 --- /dev/null +++ b/packages/documentation/src/content/docs/resources/webhook-event-types.mdx @@ -0,0 +1,18 @@ +--- +title: Webhook event types +--- + +The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle. + +| Value | Description | +| ----------------------------------- | ---------------------------------------------------------------------------------- | +| `incoming_payment.created` | An incoming payment has been created. | +| `incoming_payment.completed` | An incoming payment is complete and will not accept any additional incoming funds. | +| `incoming_payment.expired` | An incoming payment expired and will not accept any additional incoming funds. | +| `outgoing_payment.created` | An outgoing payment was created. | +| `outgoing_payment.completed` | An outgoing payment completed. | +| `outgoing_payment.failed` | An outgoing payment partially or completely failed. | +| `wallet_address.not_found` | A requested wallet address was not found. | +| `wallet_address.web_monetization` | Web Monetization payments received via STREAM. | +| `asset.liquidity_low` | Asset liquidity has dropped below defined threshold. | +| `peer.liquidity_low` | Peer liquidity has dropped below defined threshold. | \ No newline at end of file From fd56e019a5331975904446cfc02426719955380a Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Mon, 2 Sep 2024 12:32:33 -0400 Subject: [PATCH 53/91] docs: fixing links --- .../documentation/src/content/docs/concepts/telemetry.mdx | 2 +- .../docs/integration/deployment/services/auth-service.mdx | 2 +- .../integration/deployment/services/backend-service.mdx | 2 +- .../src/content/docs/integration/get-started/overview.mdx | 8 ++++---- .../docs/integration/get-started/webhook-events.mdx | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/documentation/src/content/docs/concepts/telemetry.mdx b/packages/documentation/src/content/docs/concepts/telemetry.mdx index f890178b90..452ae98bac 100644 --- a/packages/documentation/src/content/docs/concepts/telemetry.mdx +++ b/packages/documentation/src/content/docs/concepts/telemetry.mdx @@ -159,7 +159,7 @@ You must deploy your own OTEL Collector that acts as a sidecar container to Rafi | `LIVENET` | Boolean | Determines where to send metrics. Defaults to `false`, resulting in metrics being sent to the testnet OTEL Collector.

    Set to `true` on production environments dealing with real money.

    | N | | `OPEN_TELEMETRY_COLLECTOR_URLS` | String | A CSV of URLs for OTEL Collectors (e.g., `http://otel-collector-NLB-e3172ff9d2f4bc8a.elb.eu-west-2.amazonaws.com:4317,http://happy-life-otel-collector:4317`). | N | | `OPEN_TELEMETRY_EXPORT_INTERVAL` | Number | Indicates, in milliseconds, how often the instrumented Rafiki instance should send metrics. Defaults to `15000`. | N | -| `TELEMETRY_EXCHANGE_RATES_URL` | String |

    Defines the endpoint Rafiki will query for exchange rates. Used as a fallback if/when [exchange rates](/integration/before-you-begin#provide-exchange-rate-details) aren’t provided.

    When set, the response format of the external exchange rates API should be of type `rates`, as is expected by the rate service.

    Defaults to `https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json`, which points to a public S3 that has the previously mentioned required format, updated daily.

    | N | +| `TELEMETRY_EXCHANGE_RATES_URL` | String |

    Defines the endpoint Rafiki will query for exchange rates. Used as a fallback if/when [exchange rates](/integration/get-started/exchange-rates) aren’t provided.

    When set, the response format of the external exchange rates API should be of type `rates`, as is expected by the rate service.

    Defaults to `https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json`, which points to a public S3 that has the previously mentioned required format, updated daily.

    | N | ### Example Docker OTEL Collector image and configuration diff --git a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx index ca00a16700..8a2168f8df 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx @@ -36,7 +36,7 @@ When a request comes from a client registered with another instance of Rafiki, t An identity provider (IdP) is a system or service that manages user authentication, identity information, and consent. When you use your Google account credentials to “Sign in with Google” on an app or website, for example, Google is acting as your identity provider. -Integration with an [IdP](/integration/before-you-begin#integrate-with-your-identity-provider) is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. +Integration with an [IdP](/integration/get-started/idp) is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. :::note Rafiki’s [`frontend`](/integration/deployment/services/frontend-service) service requires an IdP for authentication and user management of your administrators. Out of the box, Rafiki uses Ory Kratos to enable your admins to access the Admin API. Kratos is for internal use and cannot be used for your customer-facing Open Payments authorization server. diff --git a/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx b/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx index 8890c4cd82..afd177a6ca 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx +++ b/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx @@ -44,7 +44,7 @@ The roles of the connector include: The connector receives incoming packets via HTTP and/or direct calls from within the `backend`. The `backend` includes an HTTP server listening on the configured `CONNECTOR_PORT`. -The amounts within ILP packets are used to update account liquidities in your accounting database (TigerBeetle or Postgres). Amounts are adjusted based on Rafiki’s configured [exchange rates](/integration/before-you-begin#provide-exchange-rate-details) and the asset used by the sending (outgoing) and receiving (destination) accounts. The total amount received for the STREAM connection is tracked in Redis. +The amounts within ILP packets are used to update account liquidities in your accounting database (TigerBeetle or Postgres). Amounts are adjusted based on Rafiki’s configured [exchange rates](/integration/get-started/exchange-rates) and the asset used by the sending (outgoing) and receiving (destination) accounts. The total amount received for the STREAM connection is tracked in Redis. ## GraphQL Backend Admin API diff --git a/packages/documentation/src/content/docs/integration/get-started/overview.mdx b/packages/documentation/src/content/docs/integration/get-started/overview.mdx index 92c895f3ef..f8f3966fe8 100644 --- a/packages/documentation/src/content/docs/integration/get-started/overview.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/overview.mdx @@ -7,7 +7,7 @@ import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' As you begin setting up your production environment, there are a few integration details that should be approached first. Begin by configuring Rafiki to: -- Support cross-currency transactions by providing [exchange rate details](/integration/exchange-rates) -- Charge [fees](/integration/fees) for facilitating transfers -- Integrate with your [identity provider](/integration/idp) -- Establish a mechanism for managing liquidity via [webhook events](/integration/webhook-events) +- Support cross-currency transactions by providing [exchange rate details](/integration/get-started/exchange-rates) +- Charge [fees](/integration/get-started/fees) for facilitating transfers +- Integrate with your [identity provider](/integration/get-started/idp) +- Establish a mechanism for managing liquidity via [webhook events](/integration/get-started/webhook-events) diff --git a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx index 28f4a4e304..943e6447e3 100644 --- a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx @@ -45,7 +45,7 @@ Each webhook event is sent as a JSON payload that follows a similar format. The | Attribute | Type | Description | Required | | --------- | ------------------------- | --------------------------------------------------- | --------- | | `id` | String | Unique webhook event ID | Y | -| `type` | [EventType](#event-types) | `EventType` value | Y | +| `type` | EventType | `EventType` value | Y | | `data` | Object | Additional data that coincides with the `EventType` | Y | From 6f41c97275ab241aa7148b1cafac399fec998909 Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Tue, 3 Sep 2024 15:49:46 -0500 Subject: [PATCH 54/91] docs - adding glossary Added glossary draft Also minor tweaks to Rafiki Admin guide (fixed table headings, added frontend package info) --- packages/documentation/astro.config.mjs | 2 +- .../content/docs/admin/admin-user-guide.mdx | 17 +-- .../src/content/docs/admin/manage-peering.mdx | 2 +- .../src/content/docs/concepts/telemetry.mdx | 12 +- .../get-started/webhook-events.mdx | 78 +++++------- .../src/content/docs/resources/glossary.mdx | 117 +++++++++++------- .../docs/resources/webhook-event-types.mdx | 6 +- 7 files changed, 126 insertions(+), 108 deletions(-) diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index d1c676766e..6de58d4046 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -243,7 +243,7 @@ export default defineConfig({ }, { label: 'Webhook event types', - link: '/resources/webhook-event-types', + link: '/resources/webhook-event-types' }, { label: 'Get involved', diff --git a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx index 518027591e..a2af5bc252 100644 --- a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx +++ b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx @@ -13,6 +13,7 @@ The Rafiki Admin application provides tools to manage peers, assets, wallet addr ### Prerequisites - Familiarity with general Rafiki concepts. The [Rafiki overview](/overview/overview) is a great place to start. +- Running the Rafiki `frontend` package. See [Frontend service](/integration/deployment/services/frontend-service) for more information. - Rafiki Admin login credentials ## Navigation @@ -55,7 +56,7 @@ To create a new peer, select **Create Peer** from the main Peers page. Fill out the following fields to configure and create your peer: -| **Section** | **Field** | **Description** | +| Section | Field | Description | | ------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------- | | General Information | Name | A public name for the peer to identify it on your system. | | | Static ILP Address | The peer’s ILP address, obtained from the peer. | @@ -78,7 +79,7 @@ To edit an existing peer, select any peer entry from the table on the main Peers While the Edit Peer page shares fields with the Create Peer page, it also includes additional fields and actions specific to managing an existing peer: -| **Section** | **Field/Action** | **Description** | +| Section | Field/Action | Description | | --------------------- | ------------------ | ----------------------------------------------------------------------------------------- | | General Information | Peer ID | A unique identifier assigned by Rafiki when the peer was created. This cannot be changed. | | Asset Information | View Asset | For more information about an asset, select **View asset**. | @@ -92,9 +93,11 @@ After editing any of the above fields in the General Information or HTTP Informa The final section of the Peers page is the irreversible action of deleting a peer. Select **Delete peer** to make this change. - Confirm the deletion by typing "delete peer" into the text field and selecting **Delete this peer**. @@ -121,7 +124,7 @@ To create a new asset, select **Add Asset** from the main Assets page. Fill out the following fields to create your new asset: -| **Section** | **Field** | **Description** | +| Section | Field | Description | | ------------------- | -------------------- | --------------------------------------------------------------------------------- | | General Information | Code | The asset code, generally an ISO 4217 currency code where available. | | | Scale | Difference in order of magnitude between the standard unit and a fractional unit. | @@ -140,7 +143,7 @@ To edit an existing asset, select any asset entry from the table on the main Ass While the Edit Asset page shares fields with the Create Asset page, it also includes additional fields and actions specific to managing an existing asset: -| **Section** | **Field/Action** | **Description** | +| Section | Field/Action | Description | | --------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | General Information | Asset ID | A unique identifier assigned by Rafiki when the asset was created. This cannot be changed. | | Liquidity Information | Amount | Current amount of asset liquidity available. | @@ -174,7 +177,7 @@ To create a new wallet address, select **Create wallet address** from the main W Fill out the following fields to create a new wallet address: -| **Section** | **Field** | **Description** | +| Section | Field | Description | | ------------------- | ------------------- | --------------------------------------------------------------------------- | | General Information | Wallet address name | The URL of the wallet. Once set, it cannot be changed. | | | Public name | The name associated with the wallet that is visible to anyone with the URL. | @@ -197,7 +200,7 @@ To edit an existing wallet address, select any wallet address entry from the tab While the Edit Wallet Address page shares fields with the Create Wallet Address page, it also includes additional fields and actions specific to managing an existing wallet address. -| **Section** | **Field/Action** | **Description** | +| Section | Field/Action | Description | | --------------------- | -------------------- | ------------------------------------------------------------------------------------------- | | General Information | ID | A unique identifier assigned by Rafiki when the wallet was created. This cannot be changed. | | | URL | The wallet address. This cannot be changed. | diff --git a/packages/documentation/src/content/docs/admin/manage-peering.mdx b/packages/documentation/src/content/docs/admin/manage-peering.mdx index 8085e3d5dc..66cbc8b009 100644 --- a/packages/documentation/src/content/docs/admin/manage-peering.mdx +++ b/packages/documentation/src/content/docs/admin/manage-peering.mdx @@ -8,7 +8,7 @@ import { CodeBlock } from '@interledger/docs-design-system' ## Prerequisites -To add a peer and send Interledger payments you and the account servicing entity (ASE) you intend to peer with must both: +To add a peer and send Interledger payments you and the account servicing entity (ASE) you intend to peer with must both: - Run an implementation of an [Interledger connector](/integration/deployment/services/backend-service#interledger-connector) (ideally Rafiki). - Agree on an [asset](/concepts/accounts-transfers-liquidity#assets) for the peering relationship. You can set up multiple peering relationships with the same peer based on different assets. At least one asset shared by you and your peer must be added to your Rafiki instance prior to setting up the peering relationship. diff --git a/packages/documentation/src/content/docs/concepts/telemetry.mdx b/packages/documentation/src/content/docs/concepts/telemetry.mdx index 452ae98bac..106244c81d 100644 --- a/packages/documentation/src/content/docs/concepts/telemetry.mdx +++ b/packages/documentation/src/content/docs/concepts/telemetry.mdx @@ -153,12 +153,12 @@ You must deploy your own OTEL Collector that acts as a sidecar container to Rafi ### Telemetry environment variables -| Variable name | Type | Description | Required | -| -------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | -| `ENABLE_TELEMETRY` | Boolean | Enables the telemetry service on Rafiki. Defaults to `true`. | N | -| `LIVENET` | Boolean | Determines where to send metrics. Defaults to `false`, resulting in metrics being sent to the testnet OTEL Collector.

    Set to `true` on production environments dealing with real money.

    | N | -| `OPEN_TELEMETRY_COLLECTOR_URLS` | String | A CSV of URLs for OTEL Collectors (e.g., `http://otel-collector-NLB-e3172ff9d2f4bc8a.elb.eu-west-2.amazonaws.com:4317,http://happy-life-otel-collector:4317`). | N | -| `OPEN_TELEMETRY_EXPORT_INTERVAL` | Number | Indicates, in milliseconds, how often the instrumented Rafiki instance should send metrics. Defaults to `15000`. | N | +| Variable name | Type | Description | Required | +| -------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `ENABLE_TELEMETRY` | Boolean | Enables the telemetry service on Rafiki. Defaults to `true`. | N | +| `LIVENET` | Boolean | Determines where to send metrics. Defaults to `false`, resulting in metrics being sent to the testnet OTEL Collector.

    Set to `true` on production environments dealing with real money.

    | N | +| `OPEN_TELEMETRY_COLLECTOR_URLS` | String | A CSV of URLs for OTEL Collectors (e.g., `http://otel-collector-NLB-e3172ff9d2f4bc8a.elb.eu-west-2.amazonaws.com:4317,http://happy-life-otel-collector:4317`). | N | +| `OPEN_TELEMETRY_EXPORT_INTERVAL` | Number | Indicates, in milliseconds, how often the instrumented Rafiki instance should send metrics. Defaults to `15000`. | N | | `TELEMETRY_EXCHANGE_RATES_URL` | String |

    Defines the endpoint Rafiki will query for exchange rates. Used as a fallback if/when [exchange rates](/integration/get-started/exchange-rates) aren’t provided.

    When set, the response format of the external exchange rates API should be of type `rates`, as is expected by the rate service.

    Defaults to `https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json`, which points to a public S3 that has the previously mentioned required format, updated daily.

    | N | ### Example Docker OTEL Collector image and configuration diff --git a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx index 943e6447e3..ceb30ddbad 100644 --- a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx @@ -24,16 +24,8 @@ First, specify your webhook endpoint via the `backend` service's WEBHOOK_URL var ## Set up your event listener - - - - - - "The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle." - - For Rafiki to notify you about webhook events, you must expose a webhook endpoint that listens for the events dispatched by Rafiki and reacts accordingly. These events notify your system of time-sensitive status updates, warnings, and errors. Your expected behavior when observing the webhook events is detailed below. @@ -42,11 +34,11 @@ Your expected behavior when observing the webhook events is detailed below. Each webhook event is sent as a JSON payload that follows a similar format. The parameters within the `data` object will vary depending on the event. -| Attribute | Type | Description | Required | -| --------- | ------------------------- | --------------------------------------------------- | --------- | -| `id` | String | Unique webhook event ID | Y | -| `type` | EventType | `EventType` value | Y | -| `data` | Object | Additional data that coincides with the `EventType` | Y | +| Attribute | Type | Description | Required | +| --------- | --------- | --------------------------------------------------- | -------- | +| `id` | String | Unique webhook event ID | Y | +| `type` | EventType | `EventType` value | Y | +| `data` | Object | Additional data that coincides with the `EventType` | Y | @@ -197,13 +189,13 @@ In the diagram below, \$2.55 was received before the payment expired and the rec ### Outgoing payment created -The `outgoing_payment.created` event tells you when an outgoing payment is created and is awaiting liquidity. Verify the sender's account balance and perform any other necessary verifications before funding the payment. +The `outgoing_payment.created` event tells you when an outgoing payment is created and is awaiting liquidity. Verify the sender's account balance and perform any other necessary verifications before funding the payment. If the sender has insufficient funds or should otherwise not be fulfilled, cancel the outgoing payment.Otherwise, put a hold on the sender's account and deposit the funds into Rafiki. ### Outgoing payment completed -The `outgoing.payment_completed` event indicates that as much as possible has been sent to the receiver against their incoming payment. +The `outgoing.payment_completed` event indicates that as much as possible has been sent to the receiver against their incoming payment. If there is excess liquidity in Rafiki due to differences between the sent and received amounts, withdraw the excess from the outgoing payment. What you choose to do with the excess is a business decision. One option is to return the excess to the sender. Another option is to retain the excess as a service fee. Lastly, remove the hold on your sender's account and debit their account on your ledger. @@ -250,13 +242,11 @@ In the sequence diagram below, a wallet address on your Rafiki instance received ### Wallet address not found -The `wallet_address.not_found` event indicates that a wallet address was requested by a peer via the Open Payments Wallet address server API, but the address doesn’t exist in your Rafiki instance. +The `wallet_address.not_found` event indicates that a wallet address was requested by a peer via the Open Payments Wallet address server API, but the address doesn’t exist in your Rafiki instance. If you receive this event, you can look up the associated account in your system and create a wallet address for the account. The initial wallet address request will succeed if you create it within your configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. - - ``` WALLET_ADDRESS_LOOKUP_TIMEOUT_MS: ``` - +``` WALLET_ADDRESS_LOOKUP_TIMEOUT_MS: ``` The following sequence diagram shows what happens when the wallet address `https://example-wallet.com/carla_garcia` was requested from your Rafiki instance, but the address does not exist yet. @@ -281,18 +271,18 @@ The `peer.liquidity_low` event indicates that a peer's liquidity has dropped bel ## Incoming payment event attributes -| Attribute | Type | Description | Required | -| --------- | ---- | ----------- | ------------- | -| `id` | String | Incoming payment ID | Y | -| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | Y | -| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | -| `completed` | Boolean | When `true`, the incoming payment has completed receiving funds | Y | -| `incomingAmount` | Object | The maximum amount that should be paid into the wallet address under this incoming payment | N | -| `receivedAmount` | Object | The total amount that has been paid into the wallet address under this incoming payment | Y | -| `metadata` | Object | Additional metadata associated with the incoming payment | N | -| `createdAt` | String | Date-time of creation | Y | -| `updatedAt` | String | Date-time of last update | Y | -| `expiresAt` | String | Date-time of payment expiration | Y | +| Attribute | Type | Description | Required | +| ----------------- | ------- | -------------------------------------------------------------------------------------------------- | -------- | +| `id` | String | Incoming payment ID | Y | +| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | Y | +| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | +| `completed` | Boolean | When `true`, the incoming payment has completed receiving funds | Y | +| `incomingAmount` | Object | The maximum amount that should be paid into the wallet address under this incoming payment | N | +| `receivedAmount` | Object | The total amount that has been paid into the wallet address under this incoming payment | Y | +| `metadata` | Object | Additional metadata associated with the incoming payment | N | +| `createdAt` | String | Date-time of creation | Y | +| `updatedAt` | String | Date-time of last update | Y | +| `expiresAt` | String | Date-time of payment expiration | Y | ## Outgoing payment event attributes @@ -300,20 +290,20 @@ The `peer.liquidity_low` event indicates that a peer's liquidity has dropped bel | Attribute | Type | Description | Required | | ----------------- | ------- | -------------------------------------------------------------------------------------------------- | -------- | -| `id` | String | Incoming payment ID | Y | -| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | Y | +| `id` | String | Incoming payment ID | Y | +| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | Y | | `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | -| `state` | String | Outgoing payment state, either `PENDING`, `PROCESSING`, `COMPLETED`, or `EXPIRED` | Y | -| `receiver` | String | Wallet address URL of the receiver | Y | -| `debitAmount` | Object | Amount to send (fixed send) | Y | -| `sentAmount` | Object | Amount to receive (fixed receive) | Y | +| `state` | String | Outgoing payment state, either `PENDING`, `PROCESSING`, `COMPLETED`, or `EXPIRED` | Y | +| `receiver` | String | Wallet address URL of the receiver | Y | +| `debitAmount` | Object | Amount to send (fixed send) | Y | +| `sentAmount` | Object | Amount to receive (fixed receive) | Y | | `metadata` | Object | Additional metadata associated with the outgoing payment | N | -| `createdAt` | String | Date-time of creation | Y | -| `updatedAt` | String | Date-time of last update | Y | -| `expiresAt` | String | Date-time of payment expiration | Y | +| `createdAt` | String | Date-time of creation | Y | +| `updatedAt` | String | Date-time of last update | Y | +| `expiresAt` | String | Date-time of payment expiration | Y | | `error` | String | ?? | N | -| `stateAttempts` | Integer | ?? | Y | -| `balance` | String | ?? | Y | +| `stateAttempts` | Integer | ?? | Y | +| `balance` | String | ?? | Y | | `peerId` | String | ?? | N | ## Wallet address event attributes @@ -332,8 +322,8 @@ The `id` in the webhook event payload is a unique UUID, which your system can us Consider using a worker to process received webhook events, especially if requests to credit/debit user accounts are lengthy processes. Doing so allows the server to process events at a rate suitable for the system and reduce the number of failed/retried webhook events since the webhook event listener can immediately reply with a successful `200` status. ------ +--- An OpenAPI specification of the webhook requests and their corresponding data can be found here. -Additionally, the local playground playground contains example payloads in the Bruno collection that can be used to test a webhook service integration. \ No newline at end of file +Additionally, the local playground playground contains example payloads in the Bruno collection that can be used to test a webhook service integration. diff --git a/packages/documentation/src/content/docs/resources/glossary.mdx b/packages/documentation/src/content/docs/resources/glossary.mdx index 18578290b1..6be2d41e7e 100644 --- a/packages/documentation/src/content/docs/resources/glossary.mdx +++ b/packages/documentation/src/content/docs/resources/glossary.mdx @@ -6,79 +6,104 @@ import { LinkOut } from '@interledger/docs-design-system' import { CodeBlock } from '@interledger/docs-design-system' -Potential terms to include in the glossary: +## Account servicing entity (ASE) -A +An entity that provides and maintains a payment account for a payer and/or payee. An ASE is a regulated entity within the country or countries it operates. Examples include digital wallets, banks, and mobile money providers. Non-regulated entities should not use Rafiki in production environments due to the potential legal and compliance risks involved. -- Account servicing entity (ASE) -- Auth service -- Authorization server +## Auth service -B +A reference implementation of an Open Payments authorization server in Rafiki. The `auth` service manages grant authorization and authentication, allowing clients (e.g., third-party applications) to create payments and quotes. It issues access tokens and validates client access rights through communication with the resource server. -- Backend service +## Authorization server -C +A server that grants delegated authorization and privileges, via GNAP, to a particular instance of client software in the form of access tokens, allowing the client to call the Open Payments APIs. -- Client +We've provided an opinionated version of a GNAP authorization server via the `auth` service, meaning that we've made certain decisions regarding the implementation and configuration of the server that may limit customization but ensure consistency and adherence to preferred practices. -G +## Backend service -- Grant Negotiation and Authorization Protocol (GNAP) -- Grants +The core service in Rafiki responsible for managing business logic and external communication. The `backend` service exposes Open Payments API endpoints for account management, operates an Interledger connector for STREAM packet exchange, and provides a GraphQL Backend Admin API for managing accounts and settings. -I +## Client -- Identity provider (IdP) -- Incoming payments +An application or service, such as a mobile or web app, that interacts with the authorization server to obtain grants and tokens. A client uses these tokens to access resources on a resource server to perform actions, such as retriving transaction history and setting up payments, on behalf of a user or system. -// We’ll need to decide which Interledger-related terms should be defined in our glossary and which to link out to the Interledger docs so we don’t duplicate too much info. +## Frontend service -- Interledger -- Interledger connector / ILP connector -- Interledger Protocol (ILP) -- ILP packets +An optional internal interface in Rafiki, known as the Rafiki Admin, used to manage your Rafiki instance. The `frontend` service communicates with the Backend Admin API through a Remix web app, facilitating administrative tasks within the Rafiki environment. -L +## Grant Negotiation and Authorization Protocol (GNAP) -- Ledger +The Grant Negotiation Authorization Protocol (GNAP) defines a mechanism for delegating authorization to a piece of software (client), and conveying the results and artifacts of that delegation to the software. This delegation can include access to a set of APIs as well as subject information passed directly to the software. For more information, refer to the specification. -N +## Grant -- Non-regulated entity +A delegation of authorization from a resource owner to a client instance, allowing it to access protected resources or perform actions on the owner's behalf. In Rafiki, this process is managed by the authorization server, which issues grants as access tokens. These grants permit third-party clients to interact with Open Payments APIs, such as creating payments or retrieving account information, based on the permissions granted by the resource owner. -O +## Identity provider (IdP) -- Open Payments -- Opinionated As in, “The Rafiki backend exposes the APIs for Open Payments, and requests to them are authorized by an opinionated version of GNAP.” -- Outgoing payments +A system or service that stores and manages user identity information, authentication, and consent for Rafiki. Integration with an IdP is essential due to Rafiki’s use of the Open Payments standard. The IdP authenticates client requests, manages user interactions to gather consent, and facilitates the authorization process by presenting consent screens and redirecting users based on their decisions. -P +## Incoming payment -- Payment pointer -- Peer -- Protected resource +An incoming payment resource is an object created by the recipient’s ASE, on their resource server, that represents a payment being received by an entity. This resource contains information about the incoming payment, such as the amount, currency, receiver’s wallet address, and payment status. It is used to track and manage payments that are expected to or have been received. -Q +## Interledger -- Quotes +An open protocol stack designed to facilitate the transfer of value across different currencies, platforms, and payment networks. Rafiki is a reference implementation of the Interledger stack, allowing you to quickly enable Interledger functionality on your users' accounts, allowing you to join the Interledger network and enable Interledger functionality on your users' accounts. For more information, refer to the Interledger specification. -R +## ILP packet -- Rafiki -- Regulated entity -- Resource server +A packet is a unit of data that carries payment information through the network. A single payment is broken into smaller packets of value which are then routed across the Interledger network. -S +## Open Payments -- Simple Payment Setup Protocol (SPSP) -- Streaming Transport for the Real-Time Exchange of Assets and Messages (STREAM) +An API standard and a set of APIs that allows third-party clients to securely retrieve account information and initiate payments from your customers' accounts with their consent. By adhering to this standard, Rafiki enables integration with external applications and supports the secure and uniform management of payments, quotes, and account data through the Open Payments APIs. For more information, visit the Open Payments documentation. -T +## Outgoing payment -- TigerBeetle +An outgoing payment resource is an object created by the sender’s ASE, on their resource server, that represents a payment being sent by an entity. This resource contains information about the outgoing payment, such as the amount, currency, receiver’s wallet address, and payment status. Outgoing payment resources require explicit consent from the sender before the resource can be created. -W +## Payment pointer -- Wallet address -- Web Monetization (WM) +A type of wallet address for an account within the Interledger network. They're similar to email addresses in that they're used to determine which account to send a payment from and which account to deliver the payment to. Every payment pointer serves as a Simple Payment Setup Protocol (SPSP) endpoint and must resolve to an HTTPS URL. + +## Peer + +A peer is a counterparty that a party transacts with in the Interledger Protocol. Peering relationships are established to exchange information and route payments efficiently across the network. + +## Protected resource + +An Open Payments API that can be accessed by a client if and only if a valid and sufficient access token is provided. + +## Quote + +A quote resource is an object created by the sender’s ASE, on their resource server, after the incoming payment resource is created by the recipient’s ASE. A quote resource represents a potential payment being received by an entity and contains information about the potential payment, but is mainly used to indicate the total cost, including any applicable fees, to make the payment. The quote resource also serves as a commitment from the sender’s ASE to deliver a particular amount to the receiver’s ASE and it only valid for a limited time. + +## Rafiki + +Rafiki is open-source software that allows Account Servicing Entities (ASEs) to enable Interledger functionality on its users’ accounts. It serves as a packaged solution for facilitating payments over the Interledger network. + +## Resource server + +A resource server is responsible for hosting and managing access to protected resources related to payments. It enforces access controls based on tokens provided by the authorization server, ensuring that only authorized clients can interact with payment-related resources like incoming payments, quotes, and outgoing payments through the Open Payments APIs. + +## Simple Payment Setup Protocol (SPSP) + +The Simple Payments Setup Protocol is a basic protocol for exchanging payment information between payee and payer to facilitate payment over Interledger. For more details, refer to the SPSP specification. + +## Streaming Transport for the Real-Time Exchange of Assets and Messages (STREAM) + +STREAM is a multiplexed Interledger Transport Protocol that provides for sending multiple “streams” of money and data between two parties using ILP. For more details, refer to the STREAM specification. + +## TigerBeetle + +A distributed financial accounting database designed for mission-critical safety and performance. For more information, visit the official website. + +## Wallet address + +A secure, unique URL that identifies an Open Payments-enabled account. It acts as an entry point to the Open Payments APIs, facilitating interactions like sending and receiving payments. Similar to how an email address serves as a public identifier for an email account, a wallet address is publicly shareable and used to interact with the underlying payment account without compromising its security. + +## Web Monetization + +A browser API that allows websites to stream payments directly from visitors to site owners as they interact with the content. Rafiki supports Web Monetization payment flows natively, enabling seamless integration for websites looking to implement this feature and monetize their content via the Interledger network. For more details, visit the Web Monetization website. diff --git a/packages/documentation/src/content/docs/resources/webhook-event-types.mdx b/packages/documentation/src/content/docs/resources/webhook-event-types.mdx index 9a366e22f5..26a103f568 100644 --- a/packages/documentation/src/content/docs/resources/webhook-event-types.mdx +++ b/packages/documentation/src/content/docs/resources/webhook-event-types.mdx @@ -4,8 +4,8 @@ title: Webhook event types The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle. -| Value | Description | -| ----------------------------------- | ---------------------------------------------------------------------------------- | +| Value | Description | +| --------------------------------- | ---------------------------------------------------------------------------------- | | `incoming_payment.created` | An incoming payment has been created. | | `incoming_payment.completed` | An incoming payment is complete and will not accept any additional incoming funds. | | `incoming_payment.expired` | An incoming payment expired and will not accept any additional incoming funds. | @@ -15,4 +15,4 @@ The following is an enumeration of all the event types along with their descript | `wallet_address.not_found` | A requested wallet address was not found. | | `wallet_address.web_monetization` | Web Monetization payments received via STREAM. | | `asset.liquidity_low` | Asset liquidity has dropped below defined threshold. | -| `peer.liquidity_low` | Peer liquidity has dropped below defined threshold. | \ No newline at end of file +| `peer.liquidity_low` | Peer liquidity has dropped below defined threshold. | From aee048782efa0c011830a3e94ed27f9bd4e70d76 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Tue, 3 Sep 2024 17:10:25 -0400 Subject: [PATCH 55/91] docs: you know the drill --- packages/documentation/astro.config.mjs | 20 +- .../docs/integration/apis/graphql-apis.mdx | 25 ++ .../get-started/exchange-rates.mdx | 4 +- .../get-started/webhook-events.mdx | 398 ++++++++++++------ .../src/content/docs/integration/peering.mdx | 2 +- .../content/docs/resources/architecture.mdx | 9 +- 6 files changed, 305 insertions(+), 153 deletions(-) create mode 100644 packages/documentation/src/content/docs/integration/apis/graphql-apis.mdx diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index 6de58d4046..5ef4255c7a 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -177,17 +177,19 @@ export default defineConfig({ } ] }, - { - label: 'Peering', - link: '/integration/peering' - }, { label: 'Integration checklist', link: '/integration/integration-checklist' }, { label: 'APIs', - link: '/integration/apis/' + collapsed: true, + items: [ + { + label: 'GraphQL Admin APIs', + link: '/integration/apis/graphql-apis' + } + ] } ] }, @@ -211,14 +213,6 @@ export default defineConfig({ label: 'Manage peering relationships', link: '/admin/manage-peering' }, - { - label: 'Manage keys', - link: '/admin/manage-keys' - }, - { - label: 'Manage grants', - link: '/admin/manage-grants' - }, { label: 'Manage wallet addresses', link: '/admin/manage-wallet-addresses' diff --git a/packages/documentation/src/content/docs/integration/apis/graphql-apis.mdx b/packages/documentation/src/content/docs/integration/apis/graphql-apis.mdx new file mode 100644 index 0000000000..fa59208cac --- /dev/null +++ b/packages/documentation/src/content/docs/integration/apis/graphql-apis.mdx @@ -0,0 +1,25 @@ +--- +title: Overview +--- + +Rafiki provides two GraphQL APIs, described below. As described on GraphQL.org, GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL APIs are organized in terms of types and fields, not endpoints. + +## Backend Admin API + +The Backend Admin API provides you with comprehensive capabilities to manage your Rafiki instance. Core functionality includes managing peering relationships, assets, wallet addresses and their public keys, as well as liquidity management through deposits and withdrawals. Another important aspect of the Backend Admin API is to manage Open Payments resources like payments and quotes. + +This API is complemented by the Rafiki Admin app, a frontend interface for Rafiki management that directly interacts with the Backend Admin API. Visit the [Rafiki Admin User Guide](/admin/admin-user-guide) for more information. + +## Auth Admin API + +The Auth Admin API allows you to get information about a grant, such as its status, state, related payment details, and the wallet address of the grantee’s account. The API also allows you to revoke grants. + +## Idempotency + +Wikipedia describes idempotence as being the property of “certain operations in…computer science whereby [the operations] can be applied multiple times without changing the result beyond the initial application.” “An operation can be repeated or retried as often as necessary without causing unintended effects. With non-idempotent operations, the algorithm may have to keep track of whether the operation was already performed.” + +Several mutations in the Admin APIs utilize an idempotency key to allow for safely retrying requests without performing operations multiple times. The key should be unique, typically a V4 UUID. + +For the Admin APIs, whenever a mutation with an `idempotencyKey` is called, the request payload and the request response are saved under that key. Any subsequent requests made with the same idempotency key will return the original response and status of the request, regardless of whether the request was successful. Keys are cached for a default of 24 hours. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` backend environment flag. + +Additionally, in the chance that a request is made while still concurrently processing the first request under the same `idempotencyKey`, the APIs will return an error. This provides further safeguards from potential errors in the system. The timing to prevent processing concurrent requests is 2 seconds by default. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` environment flag. diff --git a/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx index 6962b4e32f..32d7f4417b 100644 --- a/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx @@ -17,11 +17,11 @@ Rafiki fetches exchange rates from your exchange rates endpoint. Set your endpoi The endpoint must accept requests and respond as follows. - + ``` GET https://cloud-nine-wallet/rates ``` - + ``` { "base": "USD", diff --git a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx index ceb30ddbad..8137fb77ee 100644 --- a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx @@ -1,5 +1,10 @@ --- title: Webhook events +tableOfContents: + maxHeadingLevel: 4 +banner: + content: | + This page is still very much being worked on --- import { Badge, Tabs, TabItem, Steps } from '@astrojs/starlight/components' @@ -10,37 +15,35 @@ import { Disclosure } from '@interledger/docs-design-system' -The main communication channel between you and your Rafiki instance is composed of the Backend Admin API and a set of webhook events. +The main communication channel between you and your Rafiki instance is composed of the [Backend Admin API](/integration/apis/graphql-apis) and a set of webhook events. -Most events require you to interact with Rafiki to provide wallet address information or manage (deposit or withdraw) liquidity. Instead of holding user account balances, Rafiki keeps track of liquidity within your instance's asset, peer, and payment accounts within its own database. +Most events require you to interact with Rafiki to provide wallet address information or manage (deposit or withdraw) liquidity. This page describes how you should handle each webhook event. -## Specify your webhook event endpoint - -First, specify your webhook endpoint via the `backend` service's WEBHOOK_URL variable. This endpoint is the URL to which your `backend` service will makes a request when an event occurs. The `backend` service expects a `200` status in the response to confirm a successful receipt. - - - ``` WEBHOOK_URL: http://cloud-nine-wallet/webhooks ``` - +:::note +Rafiki doesn't hold _user_ account balances. Instead, Rafiki keeps track of the liquidity within your instance's asset, peer, and payment accounts within its own database. +::: -## Set up your event listener +## Specify your webhook endpoint -"The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle." +For Rafiki to notify you about webhook events, you must expose a webhook endpoint that listens for the events dispatched by Rafiki. These events notify your system of time-sensitive status updates, warnings, and errors so that you can react accordingly. -For Rafiki to notify you about webhook events, you must expose a webhook endpoint that listens for the events dispatched by Rafiki and reacts accordingly. These events notify your system of time-sensitive status updates, warnings, and errors. +When an event occurs, the [`backend`](/integration/services/backend-service) service makes a request to your configured webhook endpoint. The `backend` service expects a `200` status in return. -Your expected behavior when observing the webhook events is detailed below. +| Environment variable | Type | Description | +| -------------------- | --------- | ------------------------------------------------------------------- | +| `WEBHOOK_URL` | `backend` | The endpoint to where requests are made when a webhook event occurs | -## Request body +## Webhook event request body -Each webhook event is sent as a JSON payload that follows a similar format. The parameters within the `data` object will vary depending on the event. +Each webhook event is sent as a JSON payload with the following structure in the request body. The parameters within the `data` object will vary depending on the event. -| Attribute | Type | Description | Required | -| --------- | --------- | --------------------------------------------------- | -------- | -| `id` | String | Unique webhook event ID | Y | -| `type` | EventType | `EventType` value | Y | -| `data` | Object | Additional data that coincides with the `EventType` | Y | +| Attribute | Type | Description | Required | +| --------- | ------ | --------------------------------------------------- | -------- | +| `id` | String | UUID for the event | Y | +| `type` | Enum | The `EventType` | Y | +| `data` | Object | Additional data that coincides with the `EventType` | Y | - + ```json @@ -123,194 +126,323 @@ Each webhook event is sent as a JSON payload that follows a similar format. The +We provide an OpenAPI specification for the webhook events fired by Rafiki. + +Additionally, the [local playground](/integration/deployment/playground/overview) contains example payloads in the Bruno collection that can be used to test your webhook service integration. + ## Error handling -If an error occurs when Rafiki sends a webhook event (i.e., a non-200 status is returned or the request timed out), Rafiki will retry the webhook requests at increasing intervals until a 200 status is returned. The first retry is after 10 seconds, the second after 20 more, the next after 30 more, etc. The maximum number of retries for webhook events is configured via the `WEBHOOK_MAX_RETRY` environment variable. +If a non-200 status is returned, indicating an error, or the request times out, Rafiki will retry the webhook request at increasing intervals until a `200` status is returned. You can configure + +The first retry is after 10 seconds. Additional retries occur after 20 more seconds, then after 30 more seconds, and so on. + +| Environment variable | Type | Description | +| -------------------- | --------- | --------------------------------------------------------------------------------------------------------------- | +| `WEBHOOK_TIMEOUT` | `backend` | The amount of time, in milliseconds, after which a webhook request will time out | +| `WEBHOOK_MAX_RETRY` | `backend` | The maximum number of retries for a webhook event when a non-200 status is returned or if the request timed out | + +## Webhook events + +### Incoming payments + +| Event type | Description | +| ----------------------------------------------------------- | --------------------------------------------------------------------------------- | +| [`incoming_payment.created`](#incoming-payment-created) | An incoming payment has been created | +| [`incoming_payment.completed`](#incoming-payment-completed) | An incoming payment is complete and will not accept any additional incoming funds | +| [`incoming_payment.expired`](#incoming-payment-expired) | An incoming payment expired and will not accept any additional incoming funds | + +#### Incoming payment created -Additionally, the timeout for webhook requests is configured with the `WEBHOOK_TIMEOUT` environment variable. + + >ASE: Fires incoming_payment.created event to WEBHOOK_URL endpoint + ASE->>ASE: No action required -### Incoming payment created +`} +/> + + -The `incoming_payment.created` event tells you when an incoming payment is created. This event is purely informational because, at this point, the incoming payment has not received any funds and no actions around liquidity are required. You can use this event to display upcoming incoming payments to your users. +The `incoming_payment.created` event indicates an incoming payment was created. This event is purely informational because, at this point, the incoming payment has not received any funds and no actions around liquidity are required. You can use this event to display upcoming incoming payments to your users. The incoming payment will either complete or expire. -### Incoming payment completed +#### Incoming payment completed + + + +{' '} + An incoming +payment of $10 was completed. + + >ASE: Fires incoming_payment.completed event to WEBHOOK_URL endpoint, receivedAmount: $10 + ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: Credit recipient's account with $10 + +`} +/> + +{' '} + An incoming +payment of $10 was completed. + + >ASE: Fires incoming_payment.completed event to WEBHOOK_URL endpoint, receivedAmount: $10 + ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: Credit recipient's account with $10 + ASE->>R: Backend Admin API call: PostLiquidityWithdrawal + R->>R: Two-phase transfer completed + +`} +/> + + The `incoming_payment.completed` event indicates the payment completed either automatically or manually, and that any funds received into the incoming payment should be withdrawn and then credited to the recipient's account on your ledger. -Two `incoming_payment.completed` events are shown in the diagram below. The first is for a one-phase transfer and the second is for a two-phase transfer. In both examples, the recipient is credited with \$10. +#### Incoming payment expired + + + \$2.55 was received before the payment expired. The recipient is thus credited with \$2.55. + + >ASE: Fires incoming_payment.expired event to WEBHOOK_URL endpoint, receivedAmount: $2.55 + ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal + ASE->>ASE: Credit recipient's account with $2.55 + + +`} +/> + + The `incoming_payment.expired` event will only fire if funds were received for the incoming payment. The event signals the end of any additional payments. The primary use case for this event is to know when a streaming payment, such as one supported through Web Monetization, has expired. In response to the event, any funds already received for the payment should be withdrawn and credited to the recipient's account on your ledger. :::note -In a scenario where a sender didn't specify an `incomingAmount` when the incoming payment was first created, receiving an `incoming_payment.expired` event indicates that no further payments are expected. +In some scenarios, a sender may not have specified an `incomingAmount` when the incoming payment was created. Receiving an `incoming_payment.expired` event indicates that no further payments are expected. ::: -In the diagram below, \$2.55 was received before the payment expired and the recipient is credited with that amount. +### Outgoing payments + +| Event type | Description | +| ----------------------------------------------------------- | -------------------------------------------------- | +| [`outgoing_payment.created`](#outgoing-payment-created) | An outgoing payment has been created | +| [`outgoing_payment.completed`](#outgoing-payment-completed) | An outgoing payment has completed | +| [`outgoing_payment.failed`](#outgoing-payment-failed) | An outgoing payment partially or completely failed | + +#### Outgoing payment created + + ->ASE: Webhook event: incoming_payment.created - ASE->>ASE: no action required + >ASE: Fires outgoing_payment.created event to WEBHOOK_URL endpoint, debitAmount: $12 + ASE->>ASE: Checks that sender's account has sufficient funds + alt Account has sufficient funds + ASE->>ASE: Put hold of $12 on sender's account + ASE->>R: Backend Admin API call: DepositOutgoingPaymentLiquidity + else Account has insufficient funds + ASE->>R: Backend Admin API call: CancelOutgoingPayment, reason: Insufficient funds + end + +`} +/> + + - R->>ASE: Webhook event: incoming_payment.completed, receivedAmount: $10 - ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: Credit recipient's account with $10 +The `outgoing_payment.created` event indicates an outgoing payment was created and is awaiting liquidity. Verify the sender's account balance and perform any other necessary verifications before funding the payment. - note over ASE,R: Incoming payment completed (two-phase transfer) +If the sender has insufficient funds or if the payment should otherwise not be fulfilled, cancel the outgoing payment. Otherwise, put a hold on the sender's account and deposit the funds into Rafiki. - R->>ASE: Webhook event: incoming_payment.completed, receivedAmount: $10 - ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: Credit recipient's account with $10 - ASE->>R: Backend Admin API call: PostLiquidityWithdrawal - R->>R: Two-phase transfer completed +#### Outgoing payment completed - note over ASE,R: Incoming payment expired - R->>ASE: Webhook event: incoming_payment.expired, receivedAmount: $2.55 - ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal - ASE->>ASE: Credit recipient's account with $2.55 + + +{' '} + An outgoing +payment for \$12 is complete. \$11.50 was sent. You choose to keep \$0.50 as a +service fee. + + >ASE: Fires outgoing_payment.completed event to WEBHOOK_URL endpoint, debitAmount: $12, sentAmount: $11.50 + ASE->>R: Backend Admin API call: CreateOutgoingPaymentWithdrawal + ASE->>ASE: Remove hold and deduct $12 from sender's account, credit your account with $0.50 `} /> -## Outgoing payment event sequence + An outgoing payment for \$12 is complete. \$11.50 was sent. You choose to keep \$0.50 as a service fee. -### Outgoing payment created + >ASE: Fires outgoing_payment.completed event to WEBHOOK_URL endpoint, debitAmount: $12, sentAmount: $11.50 + ASE->>R: Backend Admin API call: CreateOutgoingPaymentWithdrawal + ASE->>ASE: Remove hold and deduct $12 from sender's account, credit your account with $0.50 + ASE->>R: Backend Admin API call: PostLiquidityWithdrawal + R->>R: Two-phase transfer complete -If the sender has insufficient funds or should otherwise not be fulfilled, cancel the outgoing payment.Otherwise, put a hold on the sender's account and deposit the funds into Rafiki. +`} +/> -### Outgoing payment completed + The `outgoing.payment_completed` event indicates that as much as possible has been sent to the receiver against their incoming payment. If there is excess liquidity in Rafiki due to differences between the sent and received amounts, withdraw the excess from the outgoing payment. What you choose to do with the excess is a business decision. One option is to return the excess to the sender. Another option is to retain the excess as a service fee. Lastly, remove the hold on your sender's account and debit their account on your ledger. -Two `outgoing.payment_completed` events are shown in the diagram below. The first is for a one-phase transfer and the second is for a two-phase transfer. In both examples, the outgoing payment amount is \$12 and you choose to keep the \$0.50 in excess liquidity as a service fee. +#### Outgoing payment failed -### Outgoing payment failed + -The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was unsuccessful. Withdraw any remaining liquidity from the outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` is `0`), remove the hold from your sender's account. If the payment partially failed, remove the hold from your sender's account, then debit the sender's account on your ledger with the amount that was sent successfully. Since there will be a discrepancy between the quote amount and the sent amount, we suggest you refrain from taking a sending fee. +An outgoing payment for \$12 failed. \$8 was sent successfully. ->ASE: Webhook event - ASE->>ASE: a - - note over ASE,R: I - - R->>ASE: 1 + R->>ASE: Fires outgoing_payment.failed event to WEBHOOK_URL endpoint, debitAmount: $12, sentAmount: $8 + ASE->>R: Backend Admin API call: CreateOutgoingPaymentWithdrawal + ASE->>ASE: Remove hold and deduct $8 from the sender's account `} /> -## Wallet address event sequences + -### Wallet address received Web Monetization payments +The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was unsuccessful. Withdraw any remaining liquidity from the outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` is `0`), remove the hold from your sender's account. If the payment partially failed, remove the hold from your sender's account, then debit the sender's account on your ledger with the amount that was sent successfully. Since there will be a discrepancy between the quoted amount and the actual sent amount, we suggest you refrain from taking a sending fee. -The `wallet_address.web_monetization` event indicates that a wallet address received Web Monetization payments via the ILP STREAM protocol. Withdraw the liquidity from the wallet address in Rafiki and credit the receiver’s account on your ledger. +--- -In the sequence diagram below, a wallet address on your Rafiki instance received $0.33. +### Wallet addresses ->ASE: Webhook event: wallet address Web Monetization,
    receivedAmount: $0.33 - ASE->>R: Backend Admin API call: CreateWalletAddressWithdrawal - ASE->>ASE: credit receiver's account with $0.33 +#### Wallet address not found + + + >ASE: Fires event to WEBHOOK_URL endpoint, `} /> -### Wallet address not found + The `wallet_address.not_found` event indicates that a wallet address was requested by a peer via the Open Payments Wallet address server API, but the address doesn’t exist in your Rafiki instance. If you receive this event, you can look up the associated account in your system and create a wallet address for the account. The initial wallet address request will succeed if you create it within your configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. -``` WALLET_ADDRESS_LOOKUP_TIMEOUT_MS: ``` - The following sequence diagram shows what happens when the wallet address `https://example-wallet.com/carla_garcia` was requested from your Rafiki instance, but the address does not exist yet. - + >ASE: Fires event to WEBHOOK_URL endpoint, + +`} +/> + +
    + +The `wallet_address.web_monetization` event indicates that a wallet address received Web Monetization payments via the ILP STREAM protocol. Withdraw the liquidity from the wallet address in Rafiki and credit the receiver’s account on your ledger. + +In the sequence diagram below, a wallet address on your Rafiki instance received $0.33. + +--- + +### Low asset liquidity + +| Event type | Description | +| --------------------------------------------- | ------------------------------------------------------------- | +| [`asset.liquidity_low`](#asset-liquidity-low) | Your asset liquidity has dropped below your defined threshold | + +#### Asset liquidity low - R->>ASE: Webhook event: wallet address not found,
    wallet address: https://example-wallet.com/carla_garcia - ASE->>R: Backend Admin API call: CreateWalletAddress
    url: https://example-wallet.com/carla_garcia,
    public name: Carla Eva Garcia + + >ASE: Fires event to WEBHOOK_URL endpoint, `} /> -## Low asset liquidity event sequence + The `asset.liquidity_low` event indicates that an asset's liquidity has dropped below your predefined liquidity threshold. Check if you already have, or can acquire, additional liquidity for that specific asset. If so, deposit it in Rafiki. Cross-currency transfers will fail if you don't increase the asset's liquidity. -## Low peer liquidity event sequence +--- + +### Low peer liquidity + +| Event type | Description | +| ------------------------------------------- | ------------------------------------------------------------ | +| [`peer.liquidity_low`](#peer-liquidity-low) | Your peer liquidity has dropped below your defined threshold | + +#### Peer liquidity low + + + >ASE: Fires event to WEBHOOK_URL endpoint, + +`} +/> + + The `peer.liquidity_low` event indicates that a peer's liquidity has dropped below your predefined liquidity threshold. Decide whether you want to extend the peer's credit line or if your peer must settle before you will extend a new line of credit. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. -## Incoming payment event attributes - -| Attribute | Type | Description | Required | -| ----------------- | ------- | -------------------------------------------------------------------------------------------------- | -------- | -| `id` | String | Incoming payment ID | Y | -| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | Y | -| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | -| `completed` | Boolean | When `true`, the incoming payment has completed receiving funds | Y | -| `incomingAmount` | Object | The maximum amount that should be paid into the wallet address under this incoming payment | N | -| `receivedAmount` | Object | The total amount that has been paid into the wallet address under this incoming payment | Y | -| `metadata` | Object | Additional metadata associated with the incoming payment | N | -| `createdAt` | String | Date-time of creation | Y | -| `updatedAt` | String | Date-time of last update | Y | -| `expiresAt` | String | Date-time of payment expiration | Y | - -## Outgoing payment event attributes - -**COPYPASTA** - -| Attribute | Type | Description | Required | -| ----------------- | ------- | -------------------------------------------------------------------------------------------------- | -------- | -| `id` | String | Incoming payment ID | Y | -| `walletAddressId` | String | ID of the wallet address under which this incoming payment was created | Y | -| `client` | String | Information about the wallet address of the Open Payments client that created the incoming payment | N | -| `state` | String | Outgoing payment state, either `PENDING`, `PROCESSING`, `COMPLETED`, or `EXPIRED` | Y | -| `receiver` | String | Wallet address URL of the receiver | Y | -| `debitAmount` | Object | Amount to send (fixed send) | Y | -| `sentAmount` | Object | Amount to receive (fixed receive) | Y | -| `metadata` | Object | Additional metadata associated with the outgoing payment | N | -| `createdAt` | String | Date-time of creation | Y | -| `updatedAt` | String | Date-time of last update | Y | -| `expiresAt` | String | Date-time of payment expiration | Y | -| `error` | String | ?? | N | -| `stateAttempts` | Integer | ?? | Y | -| `balance` | String | ?? | Y | -| `peerId` | String | ?? | N | - -## Wallet address event attributes - -## Asset liquidity low event attributes - -## Peer liquidity low event attributes +--- ## Best practices diff --git a/packages/documentation/src/content/docs/integration/peering.mdx b/packages/documentation/src/content/docs/integration/peering.mdx index f4fc4729e8..5bd2696e72 100644 --- a/packages/documentation/src/content/docs/integration/peering.mdx +++ b/packages/documentation/src/content/docs/integration/peering.mdx @@ -1,5 +1,5 @@ --- -title: Peering or maybe setup +title: Peering setup --- ## Add asset diff --git a/packages/documentation/src/content/docs/resources/architecture.mdx b/packages/documentation/src/content/docs/resources/architecture.mdx index d12e83dfb9..b227a013a0 100644 --- a/packages/documentation/src/content/docs/resources/architecture.mdx +++ b/packages/documentation/src/content/docs/resources/architecture.mdx @@ -10,15 +10,16 @@ Rafiki is a collection of three services that run together. Each one can be scal - [Auth](/integration/deployment/services/auth-service) - A reference implementation of an Open Payments authorization server, used for grant authorization and authentication - [Frontend](/integration/deployment/services/frontend-service) - An optional internal user interface, called the [Rafiki Admin](/admin/admin-user-guide), for you to manage your Rafiki instance -These services rely on four databases. +These services rely on a number of databases. -- A Postgres database used by the `backend` service for Open Payments resources -- A separate Postgres database used by the `auth` service for storing auth-related resources (grants, access tokens, and interactions) +- A Postgres database used by the `auth` service for storing auth-related resources (grants, access tokens, and interactions) +- A Redis database used by the `auth` service to store session data +- A Postgres database used by the `backend` service for Open Payments resources and application data - TigerBeetle , used by the `backend` service for accounting balances at the ILP layer -- Redis, used by the `backend` service as a cache to share STREAM connection details across processes and by the `auth` service to store session data +- A Redis database used by the `backend` service as a cache to share STREAM connection details across processes An additional package for [token introspection](/integration/deployment/services/token-introspection) is also included with Rafiki. This is an internal package that requires no action on your part if you’re using Rafiki’s `auth` service. From be89fd98fd80c199c0aef9e8105977d5245add3f Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Tue, 3 Sep 2024 17:13:21 -0400 Subject: [PATCH 56/91] docs: fixing link --- .../src/content/docs/integration/get-started/webhook-events.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx index 8137fb77ee..0aaf53980a 100644 --- a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx @@ -27,7 +27,7 @@ Rafiki doesn't hold _user_ account balances. Instead, Rafiki keeps track of the For Rafiki to notify you about webhook events, you must expose a webhook endpoint that listens for the events dispatched by Rafiki. These events notify your system of time-sensitive status updates, warnings, and errors so that you can react accordingly. -When an event occurs, the [`backend`](/integration/services/backend-service) service makes a request to your configured webhook endpoint. The `backend` service expects a `200` status in return. +When an event occurs, the [`backend`](/integration/deployment/services/backend-service) service makes a request to your configured webhook endpoint. The `backend` service expects a `200` status in return. | Environment variable | Type | Description | | -------------------- | --------- | ------------------------------------------------------------------- | From 8cb588450223d960cb1dfd0f6cb9d13901af8735 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Wed, 4 Sep 2024 08:36:39 +0200 Subject: [PATCH 57/91] chore: formatting CodeBlock elements --- .../src/content/docs/admin/manage-assets.mdx | 6 ++-- .../src/content/docs/admin/manage-peering.mdx | 8 ++--- .../docs/admin/manage-wallet-addresses.mdx | 13 +++----- .../get-started/exchange-rates.mdx | 32 ++++++++++++++++--- .../docs/integration/get-started/fees.mdx | 12 +++++-- 5 files changed, 44 insertions(+), 27 deletions(-) diff --git a/packages/documentation/src/content/docs/admin/manage-assets.mdx b/packages/documentation/src/content/docs/admin/manage-assets.mdx index 0ad3a81a4c..19f0abde3a 100644 --- a/packages/documentation/src/content/docs/admin/manage-assets.mdx +++ b/packages/documentation/src/content/docs/admin/manage-assets.mdx @@ -32,7 +32,7 @@ Rafiki’s Backend Admin API implements a GraphQL interface. Data insertions and To add US dollars, for example, as an asset type to your Rafiki instance, call the `CreateAsset` mutation and pass the `input` parameters for the asset `code`, represented by its ISO 4217 currency code (USD), and scale variables as follows: - + ```graphql // Query: @@ -64,7 +64,7 @@ mutation CreateAsset($input: CreateAssetInput!) { - + ```graphql { @@ -81,8 +81,6 @@ mutation CreateAsset($input: CreateAssetInput!) { } } } - - ``` diff --git a/packages/documentation/src/content/docs/admin/manage-peering.mdx b/packages/documentation/src/content/docs/admin/manage-peering.mdx index 66cbc8b009..b052ff0b94 100644 --- a/packages/documentation/src/content/docs/admin/manage-peering.mdx +++ b/packages/documentation/src/content/docs/admin/manage-peering.mdx @@ -36,7 +36,7 @@ To add a peer to your Rafiki instance call the `CreatePeer` mutation query and p | `http.outgoing.authtoken` | The token that you will use to present to your peer and connect to and send packets to their Rafiki instance. | Y | | `initialLiquidity` | Initial amount of liquidity to deposit for peer. Liquidity can also be deposited using the `DepositPeerLiquidity` mutation. | N | - + ```graphql // Query: @@ -73,12 +73,11 @@ mutation CreatePeer($input: CreatePeerInput!) { "initialLiquidity": } } - ``` - + ```graphql { @@ -99,9 +98,6 @@ mutation CreatePeer($input: CreatePeerInput!) { } } } - - - ``` diff --git a/packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx b/packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx index 341b103176..27a222c27f 100644 --- a/packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx +++ b/packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx @@ -14,7 +14,7 @@ You can create wallet addresses for your account holders using the Backend Admin One approach to issuing wallet addresses to your account holders is writing a one-time script to loop through your list of account holders and call the `CreateWalletAddress` GraphQL mutation along with the input parameters. The following is an example: - + ```graphql // Query: @@ -56,12 +56,11 @@ mutation CreateWalletAddress($input:CreateWalletAddressInput!) { ] } } - ``` - + ```graphql { @@ -83,7 +82,6 @@ mutation CreateWalletAddress($input:CreateWalletAddressInput!) { } } } - ``` @@ -94,7 +92,7 @@ You SHOULD store at least the `walletAddress.id` in their internal database to b To use the Open Payments APIs, a wallet address must be associated with at least one private-public key pair to sign an API request. One or multiple public keys are linked to the wallet address so that third parties can verify request signatures. The key pair can be added using the `CreateWalletAddressKey` GraphQL mutation. If you create wallet addresses for your account holders via a one-time script, you must call this mutation for each new wallet address. - + ```graphql // Query: @@ -139,12 +137,11 @@ id }, "walletAddressId":"695e7546-1803-4b45-96b6-6a53f4082018" }} - ``` - + ```graphql { @@ -169,8 +166,6 @@ id } } } - - ``` diff --git a/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx index 32d7f4417b..efcfba6f67 100644 --- a/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx @@ -12,16 +12,25 @@ Every Interledger payment is preceded by a rate probe. A rate probe provides a q Rafiki fetches exchange rates from your exchange rates endpoint. Set your endpoint via the `backend` service's `EXCHAGE_RATES_URL` variable. An OpenAPI specification for the endpoint is available. - ``` EXCHANGE_RATES_URL: http://cloud-nine-wallet/rates ``` + +``` +EXCHANGE_RATES_URL: http://cloud-nine-wallet/rates +``` + The endpoint must accept requests and respond as follows. - ``` GET https://cloud-nine-wallet/rates ``` + +``` +GET https://cloud-nine-wallet/rates +``` + - + + ``` { "base": "USD", @@ -30,6 +39,7 @@ The endpoint must accept reques } } ``` + ### Response objects @@ -46,7 +56,13 @@ Specify how long your Rafiki instance will cache exchange rates via the `backend Caching improves performance as Rafiki will not need to request the rates from your endpoint for every payment. -``` EXCHANGE_RATES_LIFETIME: 20_000 ``` + + +``` +EXCHANGE_RATES_LIFETIME: 20_000 +``` + + ## Specify slippage (optional) @@ -54,7 +70,13 @@ As exchange rates and fees charged by connectors fluctuate, there will likely be Set your allowed slippage rate to a value between 0 and 1 via the `backend` service's `SLIPPAGE` variable or use the default setting of `0.01` (1%). -``` SLIPPAGE: 0.05 ``` + + +``` +SLIPPAGE: 0.05 +``` + + ### Example diff --git a/packages/documentation/src/content/docs/integration/get-started/fees.mdx b/packages/documentation/src/content/docs/integration/get-started/fees.mdx index 58b06d3317..2460ea32f5 100644 --- a/packages/documentation/src/content/docs/integration/get-started/fees.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/fees.mdx @@ -9,7 +9,8 @@ You can charge fees on top of estimated network fees to facilitate transfers. Ea ## Set fees using the `setFee` GraphQL mutation - + + ```graphql mutation SetFee($input: SetFeeInput!) { setFee(input: $input) { @@ -27,13 +28,15 @@ mutation SetFee($input: SetFeeInput!) { } } ``` + ### Example Let's assume your asset scale is 2. You'll charge a fixed fee of 100 (\$1.00) and a variable fee of 100 (1%). - + + ```json { "input": { @@ -46,6 +49,7 @@ Let's assume your asset scale is 2. You'll charge a fixed fee of 100 (\$1.00) an } } ``` + | Variable | Description | @@ -55,7 +59,8 @@ Let's assume your asset scale is 2. You'll charge a fixed fee of 100 (\$1.00) an | `fixed` | The amount of the flat, fixed fee to charge. Assuming USD with an asset scale of 2 in the example above, the value of `100` equals \$1.00. | | `basisPoints` | The amount of the variable fee to charge based on the total amount. One basis point is equal to 0.01% of the total amount. `100` basis points equals 1%, and `10000` basis points equals 100%. In the example above, the fee is 1%. | - + + ```json { "data": { @@ -75,6 +80,7 @@ Let's assume your asset scale is 2. You'll charge a fixed fee of 100 (\$1.00) an } } ``` + ## Set fees using Rafiki Admin From 5964353d084fc1bde2cbdbe35804d38acb681b04 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Wed, 4 Sep 2024 08:43:17 +0200 Subject: [PATCH 58/91] chore: Badge component formatting --- .../integration/get-started/webhook-events.mdx | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx index 0aaf53980a..6bad6402ce 100644 --- a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx @@ -176,8 +176,9 @@ The incoming payment will either complete or expire. {' '} - An incoming -payment of $10 was completed. + + An incoming payment +of $10 was completed. {' '} - An incoming -payment of $10 was completed. + + An incoming payment +of $10 was completed. >R: Backend Admin API call: CreateIncomingPaymentWithdrawal ASE->>ASE: Credit recipient's account with $2.55 - `} /> @@ -283,9 +284,9 @@ If the sender has insufficient funds or if the payment should otherwise not be f {' '} - An outgoing -payment for \$12 is complete. \$11.50 was sent. You choose to keep \$0.50 as a -service fee. + + An outgoing payment +for \$12 is complete. \$11.50 was sent. You choose to keep \$0.50 as a service fee. Date: Wed, 4 Sep 2024 17:35:01 -0500 Subject: [PATCH 59/91] Docs - page updates - Removed placeholders and added a short description for "Accounts, transfers, and liquidity" - Reconfigured "manage assets" to match the structure Melissa showcased in "Fees" --- .../src/content/docs/admin/manage-assets.mdx | 74 ++++++++----------- .../concepts/accounts-transfers-liquidity.mdx | 4 +- 2 files changed, 30 insertions(+), 48 deletions(-) diff --git a/packages/documentation/src/content/docs/admin/manage-assets.mdx b/packages/documentation/src/content/docs/admin/manage-assets.mdx index 19f0abde3a..eecc3a5e2f 100644 --- a/packages/documentation/src/content/docs/admin/manage-assets.mdx +++ b/packages/documentation/src/content/docs/admin/manage-assets.mdx @@ -2,69 +2,55 @@ title: Manage assets --- -import { LinkOut } from '@interledger/docs-design-system' - -import { CodeBlock } from '@interledger/docs-design-system' +import { Badge } from '@astrojs/starlight/components' +import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' Assets in Rafiki can be added through the Backend Admin API or the Rafiki Admin application. -## The `asset` type - -The `asset` type in Rafiki consists of a value, an asset code, and an asset scale. - -| **Property** | **Type** | **Description** | **Example** | -| ------------ | -------- | -------------------------------------------------------------------------------------------------------------------- | ----------- | -| `value` | BigInt | Numerical amount | 10000 | -| `assetCode` | String | Should be an ISO 4217 currency code where available | “USD” | -| `assetScale` | Integer | Difference in order of magnitude between the standard unit and a fractional unit | 2 | - -To convert from an asset to a currency amount that is more human-readable, apply the following formula: - -$currencyAmount = \frac{value}{10^{assetScale}}$ - -Using the example from the table above, our formula looks like this: - -$\frac{10000}{10^2} =100.00$ USD - -## Add an asset using the Backend Admin API - -Rafiki’s Backend Admin API implements a GraphQL interface. Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts; a query and an object containing query variables. - -To add US dollars, for example, as an asset type to your Rafiki instance, call the `CreateAsset` mutation and pass the `input` parameters for the asset `code`, represented by its ISO 4217 currency code (USD), and scale variables as follows: +## Add an asset using the `createAsset` GraphQL mutation - + ```graphql -// Query: - mutation CreateAsset($input: CreateAssetInput!) { createAsset(input: $input) { - code - success - message - asset { - id - code - scale - } + code + success + message + asset { + id + code + scale + } } } +``` + + +### Example -// Query Variables: +To add US dollars, for example, as an asset type to your Rafiki instance, call the `CreateAsset` mutation and pass the `input` parameters for the asset `code`, represented by its ISO 4217 currency code (USD), and `scale` variables as follows: + + +```json { "input": { - "code": "USD", - "scale": 2 + "code": "USD", + "scale": 2 } } - ``` - +| Variable | Description | +| -------- | --------------------------------------------------------------------------------- | +| `code` | The asset code, generally an ISO 4217 currency code where available. | +| `scale` | Difference in order of magnitude between the standard unit and a fractional unit. | + + ```graphql { @@ -87,6 +73,4 @@ mutation CreateAsset($input: CreateAssetInput!) { ## Add an asset using the Rafiki Admin application -Alternatively, assets can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/integration/deployment/playground/overview/#running-the-local-environment). - -See the [Rafiki Admin application user guide](/admin/admin-user-guide/#assets) for more information on adding assets. +Alternatively, assets can be added through the [Rafiki Admin](/admin/admin-user-guide/#assets) application. Navigate to the main Assets page and then configure the asset code and scale. diff --git a/packages/documentation/src/content/docs/concepts/accounts-transfers-liquidity.mdx b/packages/documentation/src/content/docs/concepts/accounts-transfers-liquidity.mdx index 367ee4783f..e53d13bd8e 100644 --- a/packages/documentation/src/content/docs/concepts/accounts-transfers-liquidity.mdx +++ b/packages/documentation/src/content/docs/concepts/accounts-transfers-liquidity.mdx @@ -62,11 +62,9 @@ $\frac{10000}{10^2} =100.00$ USD Transfers in Rafiki are based on double-entry accounting, increasing both the total debits of one account and the total credits of another by the same amount. Deposits and withdrawals are both types of transfers. -// NEED TO EXPLAIN WHY WE ARE DESCRIBING SINGLE AND TWO PHASE TRANSFERS NEXT - ### Single-phase transfer -TBD +A single-phase transfer posts funds to accounts immediately when they are created. ### Two-phase transfer From 36faaf2dd865437f2845b688386fde025c498a68 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Wed, 4 Sep 2024 20:22:58 -0400 Subject: [PATCH 60/91] docs: attempting to make things explode --- packages/documentation/astro.config.mjs | 135 ++++++++---------- .../content/docs/admin/admin-user-guide.mdx | 2 +- .../content/docs/admin/manage-liquidity.mdx | 4 +- .../src/content/docs/admin/manage-peering.mdx | 6 +- .../apis/graphql/admin-api-overview.mdx | 2 +- .../docs/integration/apis/graphql-apis.mdx | 25 ---- .../integration/deployment/apis/openapis.mdx | 5 - .../deployment/playground/testnet.mdx | 20 --- .../get-started/exchange-rates.mdx | 7 +- .../docs/integration/get-started/fees.mdx | 2 +- .../docs/integration/get-started/idp.mdx | 40 +++++- .../docs/integration/get-started/overview.mdx | 28 +++- .../get-started/webhook-events.mdx | 113 ++++++++------- .../playground/autopeering.mdx | 0 .../{deployment => }/playground/overview.mdx | 8 +- .../docs/integration/playground/testnet.mdx | 20 +++ .../{deployment => }/prod/helm-k8s.mdx | 0 .../{deployment => }/prod/nginx.mdx | 0 .../{deployment => }/requirements.mdx | 0 .../services/auth-service.mdx | 4 +- .../services/backend-service.mdx | 5 +- .../services/frontend-service.mdx | 4 +- .../services/token-introspection.mdx | 0 .../overview/account-servicing-entities.mdx | 24 ---- .../concepts/accounts-transfers-liquidity.mdx | 4 +- .../{ => overview}/concepts/interledger.mdx | 2 +- .../{ => overview}/concepts/open-payments.mdx | 4 +- .../{ => overview}/concepts/telemetry.mdx | 2 +- .../src/content/docs/overview/overview.mdx | 73 +++++++--- .../content/docs/resources/architecture.mdx | 8 +- .../content/docs/resources/get-involved.mdx | 2 +- .../src/partials/backend-variables.mdx | 8 +- 32 files changed, 284 insertions(+), 273 deletions(-) rename packages/documentation/src/content/docs/{integration/deployment => }/apis/graphql/admin-api-overview.mdx (98%) delete mode 100644 packages/documentation/src/content/docs/integration/apis/graphql-apis.mdx delete mode 100644 packages/documentation/src/content/docs/integration/deployment/apis/openapis.mdx delete mode 100644 packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx rename packages/documentation/src/content/docs/integration/{deployment => }/playground/autopeering.mdx (100%) rename packages/documentation/src/content/docs/integration/{deployment => }/playground/overview.mdx (95%) create mode 100644 packages/documentation/src/content/docs/integration/playground/testnet.mdx rename packages/documentation/src/content/docs/integration/{deployment => }/prod/helm-k8s.mdx (100%) rename packages/documentation/src/content/docs/integration/{deployment => }/prod/nginx.mdx (100%) rename packages/documentation/src/content/docs/integration/{deployment => }/requirements.mdx (100%) rename packages/documentation/src/content/docs/integration/{deployment => }/services/auth-service.mdx (84%) rename packages/documentation/src/content/docs/integration/{deployment => }/services/backend-service.mdx (87%) rename packages/documentation/src/content/docs/integration/{deployment => }/services/frontend-service.mdx (84%) rename packages/documentation/src/content/docs/integration/{deployment => }/services/token-introspection.mdx (100%) delete mode 100644 packages/documentation/src/content/docs/overview/account-servicing-entities.mdx rename packages/documentation/src/content/docs/{ => overview}/concepts/accounts-transfers-liquidity.mdx (95%) rename packages/documentation/src/content/docs/{ => overview}/concepts/interledger.mdx (91%) rename packages/documentation/src/content/docs/{ => overview}/concepts/open-payments.mdx (63%) rename packages/documentation/src/content/docs/{ => overview}/concepts/telemetry.mdx (98%) diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index 5ef4255c7a..c529e6ac3b 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -66,19 +66,19 @@ export default defineConfig({ items: [ { label: 'Accounts, transfers, and liquidity', - link: '/concepts/accounts-transfers-liquidity' + link: '/overview/concepts/accounts-transfers-liquidity' }, { label: 'Interledger', - link: '/concepts/interledger' + link: '/overview/concepts/interledger' }, { label: 'Open Payments', - link: '/concepts/open-payments' + link: '/overview/concepts/open-payments' }, { label: 'Telemetry', - link: '/concepts/telemetry' + link: '/overview/concepts/telemetry' } ] } @@ -97,100 +97,79 @@ export default defineConfig({ link: '/integration/get-started/overview' }, { - label: 'Fees', - link: '/integration/get-started/fees' + label: 'Webhook events', + link: '/integration/get-started/webhook-events' + }, + { + label: 'Identity provider (IdP)', + link: '/integration/get-started/idp' }, { label: 'Exchange rates', link: '/integration/get-started/exchange-rates' }, { - label: 'Webhook events', - link: '/integration/get-started/webhook-events' + label: 'Fees', + link: '/integration/get-started/fees' }, - { - label: 'Identity provider (IdP)', - link: '/integration/get-started/idp' - } ] }, { - label: 'Deployment', + label: 'Requirements', + link: '/integration/requirements' + }, + { + label: 'Integration checklist', + link: '/integration/integration-checklist' + }, + { + label: 'Docker', + link: '/integration/prod/nginx' + }, + { + label: 'Helm and K8s', + link: '/integration/prod/helm-k8s' + }, + { + label: 'Services', collapsed: true, items: [ { - label: 'Requirements', - link: '/integration/deployment/requirements' + label: 'Auth service', + link: '/integration/services/auth-service' }, { - label: 'Services', - collapsed: true, - items: [ - { - label: 'Auth service', - link: '/integration/deployment/services/auth-service' - }, - { - label: 'Backend service', - link: '/integration/deployment/services/backend-service' - }, - { - label: 'Frontend service', - link: '/integration/deployment/services/frontend-service' - }, - { - label: 'Token introspection', - link: '/integration/deployment/services/token-introspection' - } - ] + label: 'Backend service', + link: '/integration/services/backend-service' }, { - label: 'Deploy locally', - collapsed: true, - items: [ - { - label: 'Local playground overview', - link: '/integration/deployment/playground/overview' - }, - { - label: 'Autopeering', - link: '/integration/deployment/playground/autopeering' - }, - { - label: 'Test network', - link: '/integration/deployment/playground/testnet' - } - ] + label: 'Frontend service', + link: '/integration/services/frontend-service' }, { - label: 'Deploy to production', - items: [ - { - label: 'nginx', - link: '/integration/deployment/prod/nginx' - }, - { - label: 'Helm and K8s', - link: '/integration/deployment/prod/helm-k8s' - } - ] + label: 'Token introspection', + link: '/integration/services/token-introspection' } - ] - }, - { - label: 'Integration checklist', - link: '/integration/integration-checklist' + ], }, { - label: 'APIs', + label: 'Test locally', collapsed: true, items: [ { - label: 'GraphQL Admin APIs', - link: '/integration/apis/graphql-apis' + label: 'Local playground', + link: '/integration/playground/overview' + }, + { + label: 'Autopeering', + link: '/integration/playground/autopeering' + }, + { + label: 'Test network', + link: '/integration/playground/testnet' } - ] - } + ], + }, ] }, { @@ -244,7 +223,17 @@ export default defineConfig({ link: '/resources/get-involved' } ] - } + }, + { + label: 'APIs', + collapsed: true, + items: [ + { + label: 'GraphQL Admin APIs', + link: '/apis/graphql/admin-api-overview' + } + ] + }, ] } ], diff --git a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx index a2af5bc252..84faff8f5e 100644 --- a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx +++ b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx @@ -13,7 +13,7 @@ The Rafiki Admin application provides tools to manage peers, assets, wallet addr ### Prerequisites - Familiarity with general Rafiki concepts. The [Rafiki overview](/overview/overview) is a great place to start. -- Running the Rafiki `frontend` package. See [Frontend service](/integration/deployment/services/frontend-service) for more information. +- Running the Rafiki `frontend` package. See [Frontend service](/integration/services/frontend-service) for more information. - Rafiki Admin login credentials ## Navigation diff --git a/packages/documentation/src/content/docs/admin/manage-liquidity.mdx b/packages/documentation/src/content/docs/admin/manage-liquidity.mdx index f7c49ac9da..8c8ae9897f 100644 --- a/packages/documentation/src/content/docs/admin/manage-liquidity.mdx +++ b/packages/documentation/src/content/docs/admin/manage-liquidity.mdx @@ -4,11 +4,11 @@ title: Manage liquidity import { LinkOut } from '@interledger/docs-design-system' -As an implementation of the Interledger Protocol, Rafiki provides [accounting](/concepts/accounts-transfers-liquidity) between transacting parties but doesn’t handle settlement. You and the account servicing entities you decide to peer with must agree on the means and how often you will settle your accounts. Consequently, Rafiki can manage the liquidity used to fund payments made through the Interledger network. +As an implementation of the Interledger Protocol, Rafiki provides [accounting](/overview/concepts/accounts-transfers-liquidity) between transacting parties but doesn’t handle settlement. You and the account servicing entities you decide to peer with must agree on the means and how often you will settle your accounts. Consequently, Rafiki can manage the liquidity used to fund payments made through the Interledger network. ## Add liquidity via GraphQL -Liquidity can be managed in Rafiki through the [`backend`](/integration/deployment/services/backend-service/) Admin API, which implements a GraphQL interface, or via the [Rafiki Admin application](/admin/admin-user-guide). Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts: a query and an object containing query variables. +Liquidity can be managed in Rafiki through the [`backend`](/integration/services/backend-service/) Admin API, which implements a GraphQL interface, or via the [Rafiki Admin application](/admin/admin-user-guide). Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts: a query and an object containing query variables. As Rafiki supports several types of liquidity, we’ll cover the typical scenarios you’ll need to manage. diff --git a/packages/documentation/src/content/docs/admin/manage-peering.mdx b/packages/documentation/src/content/docs/admin/manage-peering.mdx index b052ff0b94..2af8e3b9c6 100644 --- a/packages/documentation/src/content/docs/admin/manage-peering.mdx +++ b/packages/documentation/src/content/docs/admin/manage-peering.mdx @@ -10,8 +10,8 @@ import { CodeBlock } from '@interledger/docs-design-system' To add a peer and send Interledger payments you and the account servicing entity (ASE) you intend to peer with must both: -- Run an implementation of an [Interledger connector](/integration/deployment/services/backend-service#interledger-connector) (ideally Rafiki). -- Agree on an [asset](/concepts/accounts-transfers-liquidity#assets) for the peering relationship. You can set up multiple peering relationships with the same peer based on different assets. At least one asset shared by you and your peer must be added to your Rafiki instance prior to setting up the peering relationship. +- Run an implementation of an [Interledger connector](/integration/services/backend-service#interledger-connector) (ideally Rafiki). +- Agree on an [asset](/overview/concepts/accounts-transfers-liquidity#assets) for the peering relationship. You can set up multiple peering relationships with the same peer based on different assets. At least one asset shared by you and your peer must be added to your Rafiki instance prior to setting up the peering relationship. - Agree on a `maxPacketAmount` value, which specifies how many packets a payment is split into. - Communicate your respective static Interledger (ILP) addresses. - Communicate a connection endpoint for the other peer to send packets to. @@ -104,6 +104,6 @@ mutation CreatePeer($input: CreatePeerInput!) { ## Add a peer using the Rafiki Admin application -Alternatively, a peer can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/integration/deployment/playground/overview/#running-the-local-environment). +Alternatively, a peer can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/integration/playground/overview/#running-the-local-environment). See the [Rafiki Admin application user guide](/admin/admin-user-guide/#peers) for more information on adding peers. diff --git a/packages/documentation/src/content/docs/integration/deployment/apis/graphql/admin-api-overview.mdx b/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx similarity index 98% rename from packages/documentation/src/content/docs/integration/deployment/apis/graphql/admin-api-overview.mdx rename to packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx index cc6ea04385..f6bc241fda 100644 --- a/packages/documentation/src/content/docs/integration/deployment/apis/graphql/admin-api-overview.mdx +++ b/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx @@ -24,4 +24,4 @@ Several mutations in the Admin APIs utilize an idempotency key to allow for safe For the Admin APIs, whenever a mutation with an `idempotencyKey` is called, the request payload and the request response are saved under that key. Any subsequent requests made with the same idempotency key will return the original response and status of the request, regardless of whether the request was successful. Keys are cached for a default of 24 hours. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS backend` environment flag. -Additionally, in the chance that a request is made while still concurrently processing the first request under the same `idempotencyKey`, the APIs will return an error. This provides further safeguards from potential errors in the system. The timing to prevent processing concurrent requests is `2` seconds by default. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` environment flag. +Additionally, in the chance that a request is made while still concurrently processing the first request under the same `idempotencyKey`, the APIs will return an error. This provides further safeguards from potential errors in the system. The timing to prevent processing concurrent requests is `2` seconds by default. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` environment flag. \ No newline at end of file diff --git a/packages/documentation/src/content/docs/integration/apis/graphql-apis.mdx b/packages/documentation/src/content/docs/integration/apis/graphql-apis.mdx deleted file mode 100644 index fa59208cac..0000000000 --- a/packages/documentation/src/content/docs/integration/apis/graphql-apis.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Overview ---- - -Rafiki provides two GraphQL APIs, described below. As described on GraphQL.org, GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL APIs are organized in terms of types and fields, not endpoints. - -## Backend Admin API - -The Backend Admin API provides you with comprehensive capabilities to manage your Rafiki instance. Core functionality includes managing peering relationships, assets, wallet addresses and their public keys, as well as liquidity management through deposits and withdrawals. Another important aspect of the Backend Admin API is to manage Open Payments resources like payments and quotes. - -This API is complemented by the Rafiki Admin app, a frontend interface for Rafiki management that directly interacts with the Backend Admin API. Visit the [Rafiki Admin User Guide](/admin/admin-user-guide) for more information. - -## Auth Admin API - -The Auth Admin API allows you to get information about a grant, such as its status, state, related payment details, and the wallet address of the grantee’s account. The API also allows you to revoke grants. - -## Idempotency - -Wikipedia describes idempotence as being the property of “certain operations in…computer science whereby [the operations] can be applied multiple times without changing the result beyond the initial application.” “An operation can be repeated or retried as often as necessary without causing unintended effects. With non-idempotent operations, the algorithm may have to keep track of whether the operation was already performed.” - -Several mutations in the Admin APIs utilize an idempotency key to allow for safely retrying requests without performing operations multiple times. The key should be unique, typically a V4 UUID. - -For the Admin APIs, whenever a mutation with an `idempotencyKey` is called, the request payload and the request response are saved under that key. Any subsequent requests made with the same idempotency key will return the original response and status of the request, regardless of whether the request was successful. Keys are cached for a default of 24 hours. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` backend environment flag. - -Additionally, in the chance that a request is made while still concurrently processing the first request under the same `idempotencyKey`, the APIs will return an error. This provides further safeguards from potential errors in the system. The timing to prevent processing concurrent requests is 2 seconds by default. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` environment flag. diff --git a/packages/documentation/src/content/docs/integration/deployment/apis/openapis.mdx b/packages/documentation/src/content/docs/integration/deployment/apis/openapis.mdx deleted file mode 100644 index f92e159809..0000000000 --- a/packages/documentation/src/content/docs/integration/deployment/apis/openapis.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: OpenAPIs ---- - -## Placeholder diff --git a/packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx b/packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx deleted file mode 100644 index e7c3255721..0000000000 --- a/packages/documentation/src/content/docs/integration/deployment/playground/testnet.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Testnet ---- - -import { LinkOut } from '@interledger/docs-design-system' - -## The Test Network - -The [Local Playground](/integration/deployment/playground/overview/) is not the only way to test and try out Rafiki. You can also try the Test Network, which is a Rafiki implementation bundled with a wallet and an e-commerce application available online. As it is a test environment, you can experiment integrating with the Interledger network without using real money. - -### Applications - -The current applications include: - -- An Interledger test wallet -- An e-commerce application - -## Peering with the Test Network - -If you have installed the [Local Playground](/integration/deployment/playground/overview/) you can peer your local Rafiki instance with the remote Test Network. Refer to the [autopeering](/integration/deployment/playground/autopeering/) page for more details. diff --git a/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx index efcfba6f67..bd0567fc3f 100644 --- a/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx @@ -1,11 +1,16 @@ --- title: Exchange rates +banner: + content: | + MELISSA IS STILL WORKING ON THIS PAGE --- import { Badge } from '@astrojs/starlight/components' import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' -Every Interledger payment is preceded by a rate probe. A rate probe provides a quote that estimates the cost of transferring value over the network, including any fees connector nodes may charge. For a rate probe to be successful, Rafiki needs current exchange rates. +If you plan on supporting cross-currency transactions, you must specify from where your Rafiki instance will fetch current exchange rates. + +Every Interledger payment is preceded by a rate probe. This probe provides a quote that estimates the full cost of transferring value over the network. For a rate probe involving a cross-currency transaction to be successful, Rafiki needs to know the exchange rates for each currency that makes up the transaction. ## Specify your exchange rates endpoint diff --git a/packages/documentation/src/content/docs/integration/get-started/fees.mdx b/packages/documentation/src/content/docs/integration/get-started/fees.mdx index 2460ea32f5..2c3cb0dae1 100644 --- a/packages/documentation/src/content/docs/integration/get-started/fees.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/fees.mdx @@ -5,7 +5,7 @@ title: Fees import { Badge } from '@astrojs/starlight/components' import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' -You can charge fees on top of estimated network fees to facilitate transfers. Each asset you support can have a different fee structure and you can specify both fixed and variable fees per asset. +You have the option to charge fees, on top of any estimated network fees, for facilitating transfers. Each asset you support can have a different fee structure and you can specify both fixed and variable fees per asset. ## Set fees using the `setFee` GraphQL mutation diff --git a/packages/documentation/src/content/docs/integration/get-started/idp.mdx b/packages/documentation/src/content/docs/integration/get-started/idp.mdx index 9e1a8bfe84..475a8e7443 100644 --- a/packages/documentation/src/content/docs/integration/get-started/idp.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/idp.mdx @@ -1,20 +1,30 @@ --- title: Identity provider (IdP) +banner: + content: | + MELISSA IS STILL WORKING ON THIS PAGE --- import { Badge } from '@astrojs/starlight/components' import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' -## Integrate with your identity provider +An identity provider (IdP) is a system or service that stores and manages user identity information, authentication, and consent. Examples of IdPs include OpenID Connect and Okta. + +Since Rafiki requires Open Payments, Rafiki also requires that you integrate with an IdP. The purpose of the IdP is to: + +- Authenticate requests from clients, such as mobile apps, to create quotes and payments on Rafiki's backend +- Facilitate interactions with resource owners, such as your account holders, to gather consent + +## Facilitating interactions + +Before a client can make an outgoing payment request, it must obtain a grant from your authorization server. -An identity provider (IdP) is a system or service that stores and manages user identity information, authentication, and consent. Integration with an IdP is required due to Rafiki's use of the Open Payments standard and APIs. Skip to the [IdP environment variables](#idp-environment-variables) for a summary of required variables. +auth +service provides you with a reference implementation of an Open Payments authorization server. You can use the auth service as an alternative to developing your own in-house service for grant authorization and authentication. -Your IdP will: -- Authenticate requests from clients to create payments and quotes on Rafiki's backend -- Manage interactions with end users, such as your account holders, to gather consent -Before a client can make an outgoing payment request, it must obtain a grant from your authorization server. Open Payments requires explicit interaction by an individual (typically the client's end user) before issuing the grant. Presenting the end-user with a consent screen from which they choose to accept or deny the payment is an example of an interaction. + Open Payments requires explicit interaction by an individual (typically the client's end user) before issuing the grant. Presenting the end-user with a consent screen from which they choose to accept or deny the payment is an example of an interaction. The interaction is facilitated by your IdP. Your IdP: @@ -22,6 +32,24 @@ The interaction is facilitated by your IdP. Your IdP: - Sends the user's interaction choice to your authorization server - Redirects the user after the interaction is complete + + + +----- + +The auth service includes support for such integration. + +Part of the Open Payments standard states that outgoing payment grant request must be interactive. In an interactive grant request, explicit interaction by an individual (e.g., an account holder) is required to approve a grant. A common example of this from the perspective of a mobile app user is being asked to authenticate (sign in) and then consent (approve) to some action. + +---- + + + +## Integrate with your identity provider + + + + ### Rafiki Admin Rafiki Admin is a web app that allows you to manage your Rafiki instance through a UI. Out of the box, we provide Ory Kratos for the identity and user management of your administrators. Kratos is for internal use and cannot be used as an identity provider for your Open Payments authorization server. diff --git a/packages/documentation/src/content/docs/integration/get-started/overview.mdx b/packages/documentation/src/content/docs/integration/get-started/overview.mdx index f8f3966fe8..c0f05a555d 100644 --- a/packages/documentation/src/content/docs/integration/get-started/overview.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/overview.mdx @@ -2,12 +2,26 @@ title: Get started --- -import { Badge } from '@astrojs/starlight/components' -import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' +import { LinkOut } from '@interledger/docs-design-system' -As you begin setting up your production environment, there are a few integration details that should be approached first. Begin by configuring Rafiki to: +Before you begin setting up your production environment, consider the following. -- Support cross-currency transactions by providing [exchange rate details](/integration/get-started/exchange-rates) -- Charge [fees](/integration/get-started/fees) for facilitating transfers -- Integrate with your [identity provider](/integration/get-started/idp) -- Establish a mechanism for managing liquidity via [webhook events](/integration/get-started/webhook-events) +## Webhook events + +The main communication channel between you and your Rafiki instance is composed of the Backend Admin API and a set of webhook events. Most of these events require you to interact with Rafiki. The [Webhook events](/integration/get-started/webhook-events) page describes each event and explains the action you're expected to take when a particular event fires. + +## Identity provider (IdP) + +An identity provider (IdP) is a system or service that stores and manages user identity information, authentication, and consent. Examples of IdPs include OpenID Connect and Okta. + +Since Rafiki requires Open Payments, Rafiki also requires that you integrate with an IdP. The [`auth`](/integration/services/auth-service) service includes support for such integration. Visit the [Identity provider (IdP)](/integration/get-started/idp) page for more integration details. + +Part of the Open Payments standard states that outgoing payment grant request must be interactive. In an interactive grant request, explicit interaction by an individual (e.g., an account holder) is required to approve a grant. A common example of this from the perspective of a mobile app user is being asked to authenticate (sign in) and then consent (approve) to some action. + +## Exchange rates + +To support cross-currency transactions, you must specify from where your Rafiki instance will fetch current [exchange rates](/integration/get-started/exchange-rates). Exchange rates are calculated as part of a payment's quote, which estimates the full cost of transferring value over the network. + +## Fees + +You have the option to charge fees on top of estimated network fees to facilitate transfers. Each asset you support can have a different fee structure. Visit the [Fees](/integration/get-started/fees) page for details. \ No newline at end of file diff --git a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx index 6bad6402ce..9af0de8155 100644 --- a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx @@ -4,7 +4,7 @@ tableOfContents: maxHeadingLevel: 4 banner: content: | - This page is still very much being worked on + MELISSA IS STILL WORKING ON THIS PAGE --- import { Badge, Tabs, TabItem, Steps } from '@astrojs/starlight/components' @@ -15,7 +15,7 @@ import { Disclosure } from '@interledger/docs-design-system' -The main communication channel between you and your Rafiki instance is composed of the [Backend Admin API](/integration/apis/graphql-apis) and a set of webhook events. +The main communication channel between you and your Rafiki instance is composed of the [Backend Admin API](/apis/admin-api-overview) and a set of webhook events. Most events require you to interact with Rafiki to provide wallet address information or manage (deposit or withdraw) liquidity. This page describes how you should handle each webhook event. @@ -27,7 +27,7 @@ Rafiki doesn't hold _user_ account balances. Instead, Rafiki keeps track of the For Rafiki to notify you about webhook events, you must expose a webhook endpoint that listens for the events dispatched by Rafiki. These events notify your system of time-sensitive status updates, warnings, and errors so that you can react accordingly. -When an event occurs, the [`backend`](/integration/deployment/services/backend-service) service makes a request to your configured webhook endpoint. The `backend` service expects a `200` status in return. +When an event occurs, the [`backend`](/integration/services/backend-service) service makes a request to your configured webhook endpoint. The `backend` service expects a `200` status in return. | Environment variable | Type | Description | | -------------------- | --------- | ------------------------------------------------------------------- | @@ -43,6 +43,10 @@ Each webhook event is sent as a JSON payload with the following structure in the | `type` | Enum | The `EventType` | Y | | `data` | Object | Additional data that coincides with the `EventType` | Y | +:::tip[Duplicate events] +The `id` in the webhook event payload is unique. Your system can use the ID to determine whether the event has been received previously, preventing duplicate event processing. +::: + @@ -128,9 +132,15 @@ Each webhook event is sent as a JSON payload with the following structure in the We provide an OpenAPI specification for the webhook events fired by Rafiki. -Additionally, the [local playground](/integration/deployment/playground/overview) contains example payloads in the Bruno collection that can be used to test your webhook service integration. +Additionally, the [local playground](/integration/playground/overview) contains example payloads in the Bruno collection that can be used to test your webhook service integration. + +## Event handling + +### Asynchronous handling + +If requests to credit/debit user accounts are lengthy processes, we recommend using a worker to process received events. The worker allows the server to process events at a rate suitable for your system and reduces the number of failed/retried events since your event listener can immediately reply with a successful `200` status. -## Error handling +### Error handling If a non-200 status is returned, indicating an error, or the request times out, Rafiki will retry the webhook request at increasing intervals until a `200` status is returned. You can configure @@ -159,7 +169,7 @@ The first retry is after 10 seconds. Additional retries occur after 20 more seco participant R as Rafiki participant ASE as Account servicing entity - R->>ASE: Fires incoming_payment.created event to WEBHOOK_URL endpoint + R->>ASE: Fires incoming_payment.created event to webhook endpoint ASE->>ASE: No action required `} @@ -185,7 +195,7 @@ of $10 was completed. participant R as Rafiki participant ASE as Account servicing entity - R->>ASE: Fires incoming_payment.completed event to WEBHOOK_URL endpoint, receivedAmount: $10 + R->>ASE: Fires incoming_payment.completed event to webhook endpoint,
    receivedAmount: $10 ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal ASE->>ASE: Credit recipient's account with $10 @@ -202,7 +212,7 @@ of $10 was completed. participant R as Rafiki participant ASE as Account servicing entity - R->>ASE: Fires incoming_payment.completed event to WEBHOOK_URL endpoint, receivedAmount: $10 + R->>ASE: Fires incoming_payment.completed event to webhook endpoint,
    receivedAmount: $10 ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal ASE->>ASE: Credit recipient's account with $10 ASE->>R: Backend Admin API call: PostLiquidityWithdrawal @@ -225,7 +235,7 @@ The `incoming_payment.completed` event indicates the payment completed either au participant R as Rafiki participant ASE as Account servicing entity - R->>ASE: Fires incoming_payment.expired event to WEBHOOK_URL endpoint, receivedAmount: $2.55 + R->>ASE: Fires incoming_payment.expired event to webhook endpoint,
    receivedAmount: $2.55 ASE->>R: Backend Admin API call: CreateIncomingPaymentWithdrawal ASE->>ASE: Credit recipient's account with $2.55 @@ -261,13 +271,13 @@ An outgoing payment for \$12 was created. participant R as Rafiki participant ASE as Account servicing entity - R->>ASE: Fires outgoing_payment.created event to WEBHOOK_URL endpoint, debitAmount: $12 + R->>ASE: Fires outgoing_payment.created event to webhook endpoint,
    debitAmount: $12 ASE->>ASE: Checks that sender's account has sufficient funds alt Account has sufficient funds ASE->>ASE: Put hold of $12 on sender's account ASE->>R: Backend Admin API call: DepositOutgoingPaymentLiquidity else Account has insufficient funds - ASE->>R: Backend Admin API call: CancelOutgoingPayment, reason: Insufficient funds + ASE->>R: Backend Admin API call: CancelOutgoingPayment,
    reason: Insufficient funds end `} @@ -293,9 +303,9 @@ for \$12 is complete. \$11.50 was sent. You choose to keep \$0.50 as a service f participant R as Rafiki participant ASE as Account servicing entity - R->>ASE: Fires outgoing_payment.completed event to WEBHOOK_URL endpoint, debitAmount: $12, sentAmount: $11.50 + R->>ASE: Fires outgoing_payment.completed event to webhook endpoint,
    debitAmount: $12, sentAmount: $11.50 ASE->>R: Backend Admin API call: CreateOutgoingPaymentWithdrawal - ASE->>ASE: Remove hold and deduct $12 from sender's account, credit your account with $0.50 + ASE->>ASE: Remove hold and deduct $12 from sender's account,
    credit your account with $0.50 `} /> @@ -307,9 +317,9 @@ for \$12 is complete. \$11.50 was sent. You choose to keep \$0.50 as a service f participant R as Rafiki participant ASE as Account servicing entity - R->>ASE: Fires outgoing_payment.completed event to WEBHOOK_URL endpoint, debitAmount: $12, sentAmount: $11.50 + R->>ASE: Fires outgoing_payment.completed event to webhook endpoint,
    debitAmount: $12, sentAmount: $11.50 ASE->>R: Backend Admin API call: CreateOutgoingPaymentWithdrawal - ASE->>ASE: Remove hold and deduct $12 from sender's account, credit your account with $0.50 + ASE->>ASE: Remove hold and deduct $12 from sender's account,
    credit your account with $0.50 ASE->>R: Backend Admin API call: PostLiquidityWithdrawal R->>R: Two-phase transfer complete @@ -318,7 +328,7 @@ for \$12 is complete. \$11.50 was sent. You choose to keep \$0.50 as a service f
    -The `outgoing.payment_completed` event indicates that as much as possible has been sent to the receiver against their incoming payment. +The `outgoing.payment_completed` event indicates that as much as possible has been sent to the recipient against their incoming payment. If there is excess liquidity in Rafiki due to differences between the sent and received amounts, withdraw the excess from the outgoing payment. What you choose to do with the excess is a business decision. One option is to return the excess to the sender. Another option is to retain the excess as a service fee. Lastly, remove the hold on your sender's account and debit their account on your ledger. @@ -333,7 +343,7 @@ An outgoing payment for \$12 failed. \$8 was sent successfully. participant R as Rafiki participant ASE as Account servicing entity - R->>ASE: Fires outgoing_payment.failed event to WEBHOOK_URL endpoint, debitAmount: $12, sentAmount: $8 + R->>ASE: Fires outgoing_payment.failed event to webhook endpoint,
    debitAmount: $12, sentAmount: $8 ASE->>R: Backend Admin API call: CreateOutgoingPaymentWithdrawal ASE->>ASE: Remove hold and deduct $8 from the sender's account @@ -344,56 +354,59 @@ An outgoing payment for \$12 failed. \$8 was sent successfully. The `outgoing_payment.failed` event indicates that an outgoing payment has either partially or completely failed and a retry was unsuccessful. Withdraw any remaining liquidity from the outgoing payment in Rafiki. If the payment failed completely (the `sentAmount` is `0`), remove the hold from your sender's account. If the payment partially failed, remove the hold from your sender's account, then debit the sender's account on your ledger with the amount that was sent successfully. Since there will be a discrepancy between the quoted amount and the actual sent amount, we suggest you refrain from taking a sending fee. ---- - ### Wallet addresses | Event type | Description | | --------------------------------------------------------------------- | --------------------------------------------------------------------- | -| [`wallet_address.not_found`](#wallet-address-not-found) | The requested wallet address was not found on your instance of Rafiki | +| [`wallet_address.not_found`](#wallet-address-not-found) | The requested wallet address was not found on this Rafiki instance | | [`wallet_address.web_monetization`](#wallet-address-web-monetization) | Web Monetization payments have been received via STREAM | #### Wallet address not found + + The wallet address, `https://wallet.example.com/carla_garcia` was requested but does not exist. + >ASE: Fires event to WEBHOOK_URL endpoint, - + R->>ASE: Fires wallet_address.not_found event to webhook endpoint,
    wallet address: https://wallet.example.com/carla_garcia + ASE->>R: Backend Admin API call: CreateWalletAddress,
    url: https://wallet.example.com/carla_garcia,
    public name: Carla Eva Garcia `} />
    -The `wallet_address.not_found` event indicates that a wallet address was requested by a peer via the Open Payments Wallet address server API, but the address doesn’t exist in your Rafiki instance. +The `wallet_address.not_found` event indicates that a wallet address was requested via the Open Payments wallet address API call, but the address doesn’t exist in your Rafiki instance. -If you receive this event, you can look up the associated account in your system and create a wallet address for the account. The initial wallet address request will succeed if you create it within your configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. +When you receive this event, look up the associated account in your system and create a wallet address for the account. The initial wallet address request will succeed if you create it within your configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. -The following sequence diagram shows what happens when the wallet address `https://example-wallet.com/carla_garcia` was requested from your Rafiki instance, but the address does not exist yet. +| Environment variable | Type | Description | +| -------------------- | ---- | ----------- | +| `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` | `backend` | The time in milliseconds that you have to create a missing wallet address before the initial request times out | #### Wallet address Web Monetization + + A wallet address received a Web Monetization payment of \$0.33 + >ASE: Fires event to WEBHOOK_URL endpoint, - + R->>ASE: Fires wallet_address.web_monetization event to webhook endpoint,
    receivedAmount: $0.33 + ASE->>R: Backend Admin API call: CreateWalletAddressWithdrawal + ASE->>ASE: Credit recipient's account with $0.33 `} />
    -The `wallet_address.web_monetization` event indicates that a wallet address received Web Monetization payments via the ILP STREAM protocol. Withdraw the liquidity from the wallet address in Rafiki and credit the receiver’s account on your ledger. - -In the sequence diagram below, a wallet address on your Rafiki instance received $0.33. - ---- +The `wallet_address.web_monetization` event indicates that a wallet address received Web Monetization payments via the ILP STREAM protocol. Withdraw the liquidity from the wallet address in Rafiki and credit the recipient's account on your ledger. ### Low asset liquidity @@ -404,13 +417,16 @@ In the sequence diagram below, a wallet address on your Rafiki instance received #### Asset liquidity low + + Your asset liquidity for USD (asset scale: 2) drops below \$100.00. + >ASE: Fires event to WEBHOOK_URL endpoint, - + R->>ASE: Fires asset.liquidity_low event to webhook endpoint,
    asset: USD (scale: 2, id: "abc") + ASE->>R: Backend Admin API call: DepositAssetLiquidity `} /> @@ -418,8 +434,6 @@ In the sequence diagram below, a wallet address on your Rafiki instance received The `asset.liquidity_low` event indicates that an asset's liquidity has dropped below your predefined liquidity threshold. Check if you already have, or can acquire, additional liquidity for that specific asset. If so, deposit it in Rafiki. Cross-currency transfers will fail if you don't increase the asset's liquidity. ---- - ### Low peer liquidity | Event type | Description | @@ -429,34 +443,19 @@ The `asset.liquidity_low` event indicates that an asset's liquidity has dropped #### Peer liquidity low + + The liquidity for your peer, Happy Life Bank, drops below \$100.00 USD. + >ASE: Fires event to WEBHOOK_URL endpoint, - + R->>ASE: Fires peer.liquidity_low event to webhook endpoint,
    peer: Happy Life Bank (asset: "USD", scale: 2, id: "abc") + ASE->>R: Backend Admin API call: DepositPeerLiquidity `} />
    -The `peer.liquidity_low` event indicates that a peer's liquidity has dropped below your predefined liquidity threshold. Decide whether you want to extend the peer's credit line or if your peer must settle before you will extend a new line of credit. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. - ---- - -## Best practices - -### Duplicate events - -The `id` in the webhook event payload is a unique UUID, which your system can use to determine whether the event has been received previously, preventing duplicate event processing. - -### Asynchronous handling - -Consider using a worker to process received webhook events, especially if requests to credit/debit user accounts are lengthy processes. Doing so allows the server to process events at a rate suitable for the system and reduce the number of failed/retried webhook events since the webhook event listener can immediately reply with a successful `200` status. - ---- - -An OpenAPI specification of the webhook requests and their corresponding data can be found here. - -Additionally, the local playground playground contains example payloads in the Bruno collection that can be used to test a webhook service integration. +The `peer.liquidity_low` event indicates that a peer's liquidity has dropped below your predefined liquidity threshold. Decide whether you want to extend the peer's credit line or if your peer must settle before you will extend a new line of credit. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. \ No newline at end of file diff --git a/packages/documentation/src/content/docs/integration/deployment/playground/autopeering.mdx b/packages/documentation/src/content/docs/integration/playground/autopeering.mdx similarity index 100% rename from packages/documentation/src/content/docs/integration/deployment/playground/autopeering.mdx rename to packages/documentation/src/content/docs/integration/playground/autopeering.mdx diff --git a/packages/documentation/src/content/docs/integration/deployment/playground/overview.mdx b/packages/documentation/src/content/docs/integration/playground/overview.mdx similarity index 95% rename from packages/documentation/src/content/docs/integration/deployment/playground/overview.mdx rename to packages/documentation/src/content/docs/integration/playground/overview.mdx index cf8cc3a38f..21ca7ae3a5 100644 --- a/packages/documentation/src/content/docs/integration/deployment/playground/overview.mdx +++ b/packages/documentation/src/content/docs/integration/playground/overview.mdx @@ -6,16 +6,16 @@ import { LinkOut } from '@interledger/docs-design-system' import { CodeBlock } from '@interledger/docs-design-system' -The Local Playground provides a suite of packages that, together, mock an account servicing entity that has deployed Rafiki. It exposes an SPSP endpoint, the [Open Payments APIs](/concepts/open-payments) with its required GNAP auth endpoints to request grants, a STREAM endpoint for receiving Interledger packets, and an admin UI to view and manage each Rafiki instance. +The Local Playground provides a suite of packages that, together, mock an account servicing entity that has deployed Rafiki. It exposes an SPSP endpoint, the [Open Payments APIs](/overview/concepts/open-payments) with its required GNAP auth endpoints to request grants, a STREAM endpoint for receiving Interledger packets, and an admin UI to view and manage each Rafiki instance. This suite of packages includes: | Package name | Services | | --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | -| [`backend`](/integration/deployment/services/backend-service) |
    • SPSP
    • Open Payments APIs
    • GraphQL Admin APIs
    • STREAM endpoint
    | -| [`auth`](/integration/deployment/services/auth-service) | GNAP auth server | +| [`backend`](/integration/services/backend-service) |
    • SPSP
    • Open Payments APIs
    • GraphQL Admin APIs
    • STREAM endpoint
    | +| [`auth`](/integration/services/auth-service) | GNAP auth server | | `mock-account-servicing-entity` | mocks an account servicing entity | -| [`frontend`](/integration/deployment/services/frontend-service) | Remix app to expose a UI for Rafiki admin management via interaction with the Backend Admin APIs | +| [`frontend`](/integration/services/frontend-service) | Remix app to expose a UI for Rafiki admin management via interaction with the Backend Admin APIs | These packages depend on the following databases: diff --git a/packages/documentation/src/content/docs/integration/playground/testnet.mdx b/packages/documentation/src/content/docs/integration/playground/testnet.mdx new file mode 100644 index 0000000000..3c81e2025a --- /dev/null +++ b/packages/documentation/src/content/docs/integration/playground/testnet.mdx @@ -0,0 +1,20 @@ +--- +title: Testnet +--- + +import { LinkOut } from '@interledger/docs-design-system' + +## The Test Network + +The [Local Playground](/integration/playground/overview/) is not the only way to test and try out Rafiki. You can also try the Test Network, which is a Rafiki implementation bundled with a wallet and an e-commerce application available online. As it is a test environment, you can experiment integrating with the Interledger network without using real money. + +### Applications + +The current applications include: + +- An Interledger test wallet +- An e-commerce application + +## Peering with the Test Network + +If you have installed the [Local Playground](/integration/playground/overview/) you can peer your local Rafiki instance with the remote Test Network. Refer to the [autopeering](/integration/playground/autopeering/) page for more details. diff --git a/packages/documentation/src/content/docs/integration/deployment/prod/helm-k8s.mdx b/packages/documentation/src/content/docs/integration/prod/helm-k8s.mdx similarity index 100% rename from packages/documentation/src/content/docs/integration/deployment/prod/helm-k8s.mdx rename to packages/documentation/src/content/docs/integration/prod/helm-k8s.mdx diff --git a/packages/documentation/src/content/docs/integration/deployment/prod/nginx.mdx b/packages/documentation/src/content/docs/integration/prod/nginx.mdx similarity index 100% rename from packages/documentation/src/content/docs/integration/deployment/prod/nginx.mdx rename to packages/documentation/src/content/docs/integration/prod/nginx.mdx diff --git a/packages/documentation/src/content/docs/integration/deployment/requirements.mdx b/packages/documentation/src/content/docs/integration/requirements.mdx similarity index 100% rename from packages/documentation/src/content/docs/integration/deployment/requirements.mdx rename to packages/documentation/src/content/docs/integration/requirements.mdx diff --git a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx b/packages/documentation/src/content/docs/integration/services/auth-service.mdx similarity index 84% rename from packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx rename to packages/documentation/src/content/docs/integration/services/auth-service.mdx index 8a2168f8df..cac13461e1 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/auth-service.mdx +++ b/packages/documentation/src/content/docs/integration/services/auth-service.mdx @@ -39,14 +39,14 @@ An identity provider (IdP) is a system or service that manages user authenticati Integration with an [IdP](/integration/get-started/idp) is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. :::note -Rafiki’s [`frontend`](/integration/deployment/services/frontend-service) service requires an IdP for authentication and user management of your administrators. Out of the box, Rafiki uses Ory Kratos to enable your admins to access the Admin API. Kratos is for internal use and cannot be used for your customer-facing Open Payments authorization server. +Rafiki’s [`frontend`](/integration/services/frontend-service) service requires an IdP for authentication and user management of your administrators. Out of the box, Rafiki uses Ory Kratos to enable your admins to access the Admin API. Kratos is for internal use and cannot be used for your customer-facing Open Payments authorization server. ::: For more information about interactive grants and how they work with identity providers, review the Grant negotiation and authorization page in the Open Payments docs. ## GraphQL Auth Admin API -The `auth` service exposes a [GraphQL Auth Admin API](/integration/deployment/apis/graphql/admin-api-overview#auth-admin-api) to manage auth-related resources, such as Open Payments grants. +The `auth` service exposes a [GraphQL Auth Admin API](/apis/graphql/admin-api-overview#auth-admin-api) to manage auth-related resources, such as Open Payments grants. ## Environment variables diff --git a/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx b/packages/documentation/src/content/docs/integration/services/backend-service.mdx similarity index 87% rename from packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx rename to packages/documentation/src/content/docs/integration/services/backend-service.mdx index afd177a6ca..3fce4eaec2 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/backend-service.mdx +++ b/packages/documentation/src/content/docs/integration/services/backend-service.mdx @@ -27,7 +27,7 @@ You must also set the environment variables for the `backend` service. ## Open Payments -The `backend` service exposes the Open Payments APIs, which are auth-protected using an opinionated version of the Grant Negotiation and Authorization Protocol (GNAP). Review the [`auth`](/integration/deployment/services/auth-service) service page for more details about grant authorization and authentication. +The `backend` service exposes the Open Payments APIs, which are auth-protected using an opinionated version of the Grant Negotiation and Authorization Protocol (GNAP). Review the [`auth`](/integration/services/auth-service) service page for more details about grant authorization and authentication. The `backend` service allows you to manage Open Payments incoming payments, quotes, and outgoing payments. Quotes and outgoing payments call the ILP connector, described in the next section, to send ILP packets. Quoting sends unfulfillable probe packets, for example to determine a transaction’s cost before executing the payment. Outgoing payments send packets as part of executing the payment. @@ -39,7 +39,6 @@ The roles of the connector include: - Accepting packets via ILP over HTTP and authenticating the packets against ILP account credentials. An incoming packet is only accepted if it's from a configured peer and accompanied by the peer’s incoming HTTP `authToken`. - Converting currencies. -- Routing packets to the appropriate peers if you are not the intended recipient. Otherwise the packets will terminate at your local Rafiki’s STREAM server. - Fulfilling packets with an internal STREAM server. The connector receives incoming packets via HTTP and/or direct calls from within the `backend`. The `backend` includes an HTTP server listening on the configured `CONNECTOR_PORT`. @@ -48,7 +47,7 @@ The amounts within ILP packets are used to update account liquidities in your ac ## GraphQL Backend Admin API -The `backend` service exposes a GraphQL [Backend Admin API](/integration/deployment/apis/graphql/admin-api-overview#backend-admin-api) to manage assets, peers, wallet addresses, Open Payments resources, and several types of liquidity. +The `backend` service exposes a GraphQL [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to manage assets, peers, wallet addresses, Open Payments resources, and several types of liquidity. ## Environment variables diff --git a/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx b/packages/documentation/src/content/docs/integration/services/frontend-service.mdx similarity index 84% rename from packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx rename to packages/documentation/src/content/docs/integration/services/frontend-service.mdx index a276c55c5e..eae53f2c82 100644 --- a/packages/documentation/src/content/docs/integration/deployment/services/frontend-service.mdx +++ b/packages/documentation/src/content/docs/integration/services/frontend-service.mdx @@ -5,13 +5,13 @@ title: Frontend service import { LinkOut } from '@interledger/docs-design-system' import Frontend from '/src/partials/frontend-variables.mdx' -Rafiki’s `frontend` service provides an optional internal admin interface, called the [Rafiki Admin application](/admin/admin-user-guide), for you to manage your Rafiki instance through a Remix web app. This service communicates with the [Backend Admin API](/integration/deployment/apis/graphql/admin-api-overview#backend-admin-api) to facilitate administrative tasks within Rafiki. +Rafiki’s `frontend` service provides an optional internal admin interface, called the [Rafiki Admin application](/admin/admin-user-guide), for you to manage your Rafiki instance through a Remix web app. This service communicates with the [Backend Admin API](/apis/graphql/admin-api-overview#backend-admin-api) to facilitate administrative tasks within Rafiki. ## Requirements The following are required when using the `frontend` service: -- A Rafiki [`backend`](/integration/deployment/services/backend-service) service up and running to access the Backend Admin API. +- A Rafiki [`backend`](/integration/services/backend-service) service up and running to access the Backend Admin API. - An identity provider for authentication and user management. Out of the box, the Rafiki Admin application uses Ory Kratos, a secure and fully open-source identity management solution. Kratos will be made optional in a future Rafiki release, allowing you to run your own solution if you so choose. You must also set the environment variables for the `frontend` service. diff --git a/packages/documentation/src/content/docs/integration/deployment/services/token-introspection.mdx b/packages/documentation/src/content/docs/integration/services/token-introspection.mdx similarity index 100% rename from packages/documentation/src/content/docs/integration/deployment/services/token-introspection.mdx rename to packages/documentation/src/content/docs/integration/services/token-introspection.mdx diff --git a/packages/documentation/src/content/docs/overview/account-servicing-entities.mdx b/packages/documentation/src/content/docs/overview/account-servicing-entities.mdx deleted file mode 100644 index caa0b948bd..0000000000 --- a/packages/documentation/src/content/docs/overview/account-servicing-entities.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Account servicing entities ---- - -import { LinkOut } from '@interledger/docs-design-system' - -An Account Servicing Entity (ASE) is an organization that provides and maintains payment accounts for payers and payees. These payers and payees are regulated within the jurisdictions they operate and can include a variety of financial institutions such as banks, digital wallet providers, and mobile money providers. - -Rafiki is software that removes the complexities of implementing the ILP stack. In this context, an ASE integrates Rafiki into their internal systems to enhance account features by enabling Interledger functionality on its users’ accounts. This integration allows ASEs to join the Interledger network efficiently and facilitates the seamless sending and receiving of payments. - -## Key functions of ASEs - -- **Regulatory compliance** - ASEs are responsible for onboarding account holders in compliance with regulatory requirements, such as performing Know Your Customer (KYC) checks, Anti-Money Laundering (AML) processes, and sanctions screening. -- **Account provision and maintenance** - ASEs manage the creation, upkeep, and security of payment accounts. This includes providing channels for account holders (individuals or businesses) to interact with their accounts via mobile apps, websites, and other interfaces. -- **Transaction handling** - ASEs handle deposits and withdrawals through various external payment methods such as bank transfers, credit cards, and other payment services. -- **Ledger management** - ASEs maintain a ledger of account balances and transaction histories for their account holders. -- **Authentication and consent** - Using the Open Payments standard, ASEs authenticate account holders and manage consents to grant secure access to their accounts. -- **API key management** - ASEs keep a record of the public keys used by account holders to access the Open Payments APIs, ensuring secure and authenticated transactions. - -## Examples of ASEs - -- **Banks** - Traditional financial institutions offering a wide range of payment services. -- **Digital wallets** - Software applications that store payment methods, card credentials, and personal information. A digital wallet is basically an electronic version of a physical wallet you would carry. -- **Mobile money** - Mobile payments system based on accounts held by a mobile operator and accessible from subscribers' mobile phones. The conversion of cash into electronic value (and vice versa) happens at retail stores (or agents). All transactions are authorized and recorded in real-time using SMS. diff --git a/packages/documentation/src/content/docs/concepts/accounts-transfers-liquidity.mdx b/packages/documentation/src/content/docs/overview/concepts/accounts-transfers-liquidity.mdx similarity index 95% rename from packages/documentation/src/content/docs/concepts/accounts-transfers-liquidity.mdx rename to packages/documentation/src/content/docs/overview/concepts/accounts-transfers-liquidity.mdx index e53d13bd8e..a297c69ff4 100644 --- a/packages/documentation/src/content/docs/concepts/accounts-transfers-liquidity.mdx +++ b/packages/documentation/src/content/docs/overview/concepts/accounts-transfers-liquidity.mdx @@ -38,7 +38,7 @@ Before peering with another account servicing entity, you must agree on the asse Furthermore, an account servicing entity performing currency exchange must provide asset liquidity. Asset liquidity ensures there is enough value available to handle transactions in the specified assets. -Assets are managed via the [Backend Admin API](/integration/deployment/services/backend-service#graphql-backend-admin-api) or the [Rafiki Admin application](/admin/admin-user-guide/). Wallet addresses are created for existing assets and are tied to those assets. +Assets are managed via the [Backend Admin API](/integration/services/backend-service#graphql-backend-admin-api) or the [Rafiki Admin application](/admin/admin-user-guide/). Wallet addresses are created for existing assets and are tied to those assets. ### The `asset` type @@ -103,4 +103,4 @@ Payment liquidity is managed for incoming and outgoing payments created via Open TigerBeetle is a high-performance distributed financial accounting database used by Rafiki’s `backend` service to store account balance data at the ILP layer. Both liquidity and settlement accounts in Rafiki correspond to TigerBeetle credit and debit accounts, respectively. TigerBeetle only holds balance data without any additional ILP packet metadata. For detailed information on TigerBeetle, including its consensus mechanism and its limitations, visit the official TigerBeetle documentation and blog. -You have the flexibility to choose whether to use TigerBeetle or opt for a separate Postgres database. However, TigerBeetle is recommended due to its speed, efficiency, and dedicated design for handling double ledger accounting. For more information about Tigerbeetle in a production environment, see [Running Rafiki in production](/integration/deployment/prod/helm-k8s/#tigerbeetle). +You have the flexibility to choose whether to use TigerBeetle or opt for a separate Postgres database. However, TigerBeetle is recommended due to its speed, efficiency, and dedicated design for handling double ledger accounting. For more information about Tigerbeetle in a production environment, see [Running Rafiki in production](/integration/prod/helm-k8s/#tigerbeetle). diff --git a/packages/documentation/src/content/docs/concepts/interledger.mdx b/packages/documentation/src/content/docs/overview/concepts/interledger.mdx similarity index 91% rename from packages/documentation/src/content/docs/concepts/interledger.mdx rename to packages/documentation/src/content/docs/overview/concepts/interledger.mdx index da8cfe10bf..dd349dca79 100644 --- a/packages/documentation/src/content/docs/concepts/interledger.mdx +++ b/packages/documentation/src/content/docs/overview/concepts/interledger.mdx @@ -24,7 +24,7 @@ Each node on the Interledger network can take on the role of sender, connector, - Connector - An intermediary between a sender and receiver that forwards ILP packets. Connectors can facilitate payments to or from anyone they’re peered with. - Receiver - The final recipient of the payment. -Rafiki’s [backend service](/integration/deployment/services/backend-service) includes an Interledger connector for sending and receiving ILP packets via ILPoverHTTP. You can learn more about a connector’s role in the ILP packet lifecycle on the Interledger developer’s site. +Rafiki’s [backend service](/integration/services/backend-service) includes an Interledger connector for sending and receiving ILP packets via ILPoverHTTP. You can learn more about a connector’s role in the ILP packet lifecycle on the Interledger developer’s site. If the sender and receiver nodes are peers, then the payment flow is straightforward and no intermediary connector nodes are needed. However, if the sender and receiver aren’t peers, then the payment must be routed through one or more connectors. diff --git a/packages/documentation/src/content/docs/concepts/open-payments.mdx b/packages/documentation/src/content/docs/overview/concepts/open-payments.mdx similarity index 63% rename from packages/documentation/src/content/docs/concepts/open-payments.mdx rename to packages/documentation/src/content/docs/overview/concepts/open-payments.mdx index 84592a4f58..883b3f92a3 100644 --- a/packages/documentation/src/content/docs/concepts/open-payments.mdx +++ b/packages/documentation/src/content/docs/overview/concepts/open-payments.mdx @@ -31,8 +31,8 @@ We strongly encourage you to familiarize yourself with the Open Payments standar ## Rafiki's `backend` service -Rafiki’s [`backend`](/integration/deployment/services/backend-service) service is the main service for handling business logic and external communication. The service is responsible for, among other things, exposing the endpoints of the Open Payments APIs for clients to perform account management tasks. Every request and response is validated against the Open Payments specification. +Rafiki’s [`backend`](/integration/services/backend-service) service is the main service for handling business logic and external communication. The service is responsible for, among other things, exposing the endpoints of the Open Payments APIs for clients to perform account management tasks. Every request and response is validated against the Open Payments specification. ## Rafiki's auth service -Rafiki’s [`auth`](/integration/deployment/services/auth-service) service is a reference implementation of an opinionated Open Payments authorization server. The authorization server is responsible for delegating authorization (via grants) to clients to use the Open Payments APIs, resolving clients’ public keys to authenticate and authorize incoming requests, and creating payments and quotes on the backend. Open Payments leverages the Grant Negotiation and Authorization Protocol (GNAP) for delegating authorization. You can learn more about the protocol by reviewing its specification. +Rafiki’s [`auth`](/integration/services/auth-service) service is a reference implementation of an opinionated Open Payments authorization server. The authorization server is responsible for delegating authorization (via grants) to clients to use the Open Payments APIs, resolving clients’ public keys to authenticate and authorize incoming requests, and creating payments and quotes on the backend. Open Payments leverages the Grant Negotiation and Authorization Protocol (GNAP) for delegating authorization. You can learn more about the protocol by reviewing its specification. diff --git a/packages/documentation/src/content/docs/concepts/telemetry.mdx b/packages/documentation/src/content/docs/overview/concepts/telemetry.mdx similarity index 98% rename from packages/documentation/src/content/docs/concepts/telemetry.mdx rename to packages/documentation/src/content/docs/overview/concepts/telemetry.mdx index 106244c81d..fa2bca6527 100644 --- a/packages/documentation/src/content/docs/concepts/telemetry.mdx +++ b/packages/documentation/src/content/docs/overview/concepts/telemetry.mdx @@ -165,7 +165,7 @@ You must deploy your own OTEL Collector that acts as a sidecar container to Rafi Below is an example of a Docker OTEL Collector image and configuration that integrates with Rafiki and sends data to a Prometheus remote write endpoint. -The configuration can be tested in our [Local Playground](/integration/deployment/playground/overview) by providing the environment variables in the table above to `happy-life-backend` in the `docker-compose.yml` file. +The configuration can be tested in our [Local Playground](/integration/playground/overview) by providing the environment variables in the table above to `happy-life-backend` in the `docker-compose.yml` file. #### Docker Compose config diff --git a/packages/documentation/src/content/docs/overview/overview.mdx b/packages/documentation/src/content/docs/overview/overview.mdx index 5b72bb9c71..661de002f5 100644 --- a/packages/documentation/src/content/docs/overview/overview.mdx +++ b/packages/documentation/src/content/docs/overview/overview.mdx @@ -3,37 +3,68 @@ title: Overview --- import { LinkOut } from '@interledger/docs-design-system' +import { Card, CardGrid } from '@astrojs/starlight/components'; -Rafiki is open-source software that allows Account Servicing Entities (ASEs) to enable Interledger functionality on its users’ accounts. It serves as a packaged solution for facilitating payments over the Interledger network. +Rafiki is open-source software that is freely available to any licensed **account servicing entity** (ASE) that wants to implement [Interledger](#interledger) and [Open Payments](#open-payments) on its users' accounts. -Implementing the Interledger Protocol stack can be complex and challenging. Rafiki simplifies this process by providing a reference implementation, reducing development overhead for ASEs, and fostering broader adoption of Interledger technology. +Implementing and maintaining the Interledger Protocol (ILP) stack on your own can be difficult and time-consuming. Rafiki is maintained by a dedicated team, making it the perfect solution for ASEs who want to integrate with the Interledger network without developing and maintaining their own implementations. -## What Rafiki can help you do + +It's an entity that provides and maintains payment accounts for its customers and is regulated within the jurisdictions it operates. Examples of ASEs include banks, digital wallet providers, and mobile money providers. Rafiki should **not** be used in production by non-regulated entities. [Learn more about ASEs](#more-about-account-servicing-entities-ases) + -- **Issue of payment pointers** - Rafiki facilitates creating and managing payment pointers, enabling users to send and receive payments over the Interledger network. -- **Facilitate Interledger payments** - Rafiki facilitates sending and receiving payments using the Interledger Protocol (ILP). -- **Enable third-party access** - Rafiki allows ASEs to authorize third-party access for initiating payments and managing transaction data using the Open Payments standard. +## Real-world use cases -## What Rafiki is not +### Peer-to-peer payments -Rafiki distinguishes itself as open-source software deployed by ASEs, rather than a platform, service, library, or standalone wallet. It provides the underlying infrastructure for Interledger functionality. +Rafiki enables seamless peer-to-peer payments, including cross-currency transactions. Users can transfer funds directly to each other’s accounts, regardless of their respective currencies, leveraging the interoperability of the Interledger network. -:::caution -Rafiki is intended for use by Account Servicing Entities only and should not be used in production by non-regulated entities. -::: +### eCommerce payments -## Real-world usage examples +Rafiki facilitates eCommerce transactions for both one-time purchases and recurring subscriptions. ASEs can integrate Rafiki into their platforms to offer customers flexible payment options and streamline the checkout process. -- **Peer-to-peer payments** - Rafiki enables seamless peer-to-peer payments, including cross-currency transactions. Users can transfer funds directly to each other’s accounts, regardless of their respective currencies, leveraging the interoperability of the Interledger network. -- **eCommerce payments** - Rafiki facilitates eCommerce transactions for both one-time purchases and recurring subscriptions. ASEs can integrate Rafiki into their platforms to offer customers flexible payment options and streamline the checkout process. -- **Web Monetization** - Websites can implement Web Monetization, a browser API that enables the streaming of payments directly from web site visitors to site owners. Rafiki provides support for Web Monetization payment flows right out of the box. +### Web Monetization -## Rafiki architecture +Websites can implement Web Monetization, a browser API that enables the streaming of payments directly from web site visitors to site owners. Rafiki provides support for Web Monetization payment flows right out of the box. -At its most basic level, Rafiki is comprised of the following three services: +## Interledger -- An authorization service that handles authorizing and authenticating incoming requests. -- A backend service that allows you to manage business logic, such as account management and balance tracking; facilitates third-party access to accounts via an Open Payments implementation; and simplifies peering with other nodes on the Interledger network. -- A front-end web application that allows Rafiki administrators to manage their Rafiki instance. +The Interledger network is a network of nodes that have implemented the Interledger Protocol (ILP) stack. Rafiki is a reference implementation if the ILP stack, enabling you to more easily become a node on the network and start sending and receiving payments. -For more detailed information on the components and architecture of Rafiki, see [Architecture](/resources/architecture). +Interledger is designed to be a network on top of existing payment networks that serves as the interoperability layer between them all, forwarding payment messages (packets) while also taking care of currency conversion. Interledger ensures that packets take the fastest and cheapest route from one Interledger node to another. + +[Learn more about Interledger](/overview/concepts/interledger) + +## Open Payments + +Open Payments is an API standard and set of open RESTful APIs that facilitate interoperability in the setup and completion of payments. The standard provides a uniform way to create and manage grants and resources for incoming payments, quotes, and outgoing payments. + +By following the Open Payments standard, Rafiki allows your customers' accounts to become Open Payments-enabled. Clients, such as mobile apps, can then call the Open Payments APIs to securely retrieve transaction data and initiate payments from your customers' accounts with your customers' prior consent. + +[Learn more about Open Payments](/overview/concepts/open-payments) + +## More about account servicing entities (ASEs) + +As regulated entities, ASEs are subject to the laws, rules, and regulations of their jurisdictions. As such, Rafiki should **not** be used in production environments by non-regulated entities. + +Below are just a few examples of an ASE's responsibilities and obligations. + +### Regulatory compliance + +ASEs must onboarding account holders in compliance with regulatory requirements, such as performing Know Your Customer (KYC) checks, anti-money laundering (AML) processes, and sanctions screening. + +### Account provisioning and maintenance + +ASEs manage the creation, upkeep, and security of payment accounts. This includes providing channels for account holders (individuals or businesses) to interact with their accounts via mobile apps, websites, and other interfaces. + +### Transaction handling + +ASEs handle deposits and withdrawals through various external payment methods such as bank transfers, credit cards, and other payment services. + +### Ledger management + +ASEs maintain a ledger of account balances and transaction histories for their account holders. + +### Authentication and consent + +In the context of Open Payments, ASEs are responsible for authenticating resource owners (e.g., account holders) and obtaining their consent when clients, such as mobile apps, request access to a resource (e.g., an account). \ No newline at end of file diff --git a/packages/documentation/src/content/docs/resources/architecture.mdx b/packages/documentation/src/content/docs/resources/architecture.mdx index b227a013a0..1b1f794e83 100644 --- a/packages/documentation/src/content/docs/resources/architecture.mdx +++ b/packages/documentation/src/content/docs/resources/architecture.mdx @@ -6,9 +6,9 @@ import { LinkOut } from '@interledger/docs-design-system' Rafiki is a collection of three services that run together. Each one can be scaled horizontally. -- [Backend](/integration/deployment/services/backend-service) - The main service, responsible for handling business logic and external communication -- [Auth](/integration/deployment/services/auth-service) - A reference implementation of an Open Payments authorization server, used for grant authorization and authentication -- [Frontend](/integration/deployment/services/frontend-service) - An optional internal user interface, called the [Rafiki Admin](/admin/admin-user-guide), for you to manage your Rafiki instance +- [Backend](/integration/services/backend-service) - The main service, responsible for handling business logic and external communication +- [Auth](/integration/services/auth-service) - A reference implementation of an Open Payments authorization server, used for grant authorization and authentication +- [Frontend](/integration/services/frontend-service) - An optional internal user interface, called the [Rafiki Admin](/admin/admin-user-guide), for you to manage your Rafiki instance These services rely on a number of databases. @@ -21,6 +21,6 @@ These services rely on a number of databases. , used by the `backend` service for accounting balances at the ILP layer - A Redis database used by the `backend` service as a cache to share STREAM connection details across processes -An additional package for [token introspection](/integration/deployment/services/token-introspection) is also included with Rafiki. This is an internal package that requires no action on your part if you’re using Rafiki’s `auth` service. +An additional package for [token introspection](/integration/services/token-introspection) is also included with Rafiki. This is an internal package that requires no action on your part if you’re using Rafiki’s `auth` service. Rafiki architecture diagram diff --git a/packages/documentation/src/content/docs/resources/get-involved.mdx b/packages/documentation/src/content/docs/resources/get-involved.mdx index 158b20aa1c..0b9ca087af 100644 --- a/packages/documentation/src/content/docs/resources/get-involved.mdx +++ b/packages/documentation/src/content/docs/resources/get-involved.mdx @@ -8,7 +8,7 @@ import { LinkOut } from '@interledger/docs-design-system' - Begin a new discussion or contribute to existing discussions in the Rafiki GitHub repo. - Join the `interledger.slack.com` workspace and ask any questions you have in the `#rafiki` channel. -- Try [running the system locally](/integration/deployment/playground/overview) and ask any questions you have in the #rafiki Slack channel. +- Try [running the system locally](/integration/playground/overview) and ask any questions you have in the #rafiki Slack channel. For more details about spec contributions and development, visit `contributing.md`. diff --git a/packages/documentation/src/partials/backend-variables.mdx b/packages/documentation/src/partials/backend-variables.mdx index a0cf4be2b8..7e3c27e735 100644 --- a/packages/documentation/src/partials/backend-variables.mdx +++ b/packages/documentation/src/partials/backend-variables.mdx @@ -5,21 +5,21 @@ import { LinkOut } from '@interledger/docs-design-system' | `ADMIN_PORT` | backend.port.admin | `3001` | Admin API GraphQL Server port | | `AUTH_SERVER_GRANT_URL` | | `undefined` | endpoint on the Open Payments Auth Server to request a grant | | `AUTH_SERVER_INTROSPECTION_URL` | | `undefined` | endpoint on the Open Payments Auth Server to introspect an access token | -| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/integration/deployment/playground/autopeering/) is enabled, its server will use this port | +| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/integration/playground/autopeering/) is enabled, its server will use this port | | `CONNECTOR_PORT` | backend.port.connector | `3002` | port of the ILP connector for for sending packets over ILP over HTTP | | `DATABASE_URL` | backend.postgresql.host, backend.postgresql.port, backend.postgresql.username, backend.postgresql.database, backend.postgresql.password | `postgresql://postgres:password@localhost:5432/development` | Postgres database URL of database storing the resource data; For Helm, these components are provided individually. | -| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/integration/deployment/playground/autopeering/). | +| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/integration/playground/autopeering/). | | `ENABLE_SPSP_PAYMENT_POINTERS` | | `true` | enables SPSP route | | `EXCHANGE_RATES_LIFETIME` | backend.lifetime.exchangeRate | `15_000` | time in milliseconds the exchange rates provided by the ASE via the EXCHANGE_RATES_URL are valid for | | `EXCHANGE_RATES_URL` | backend.serviceUrls.EXCHANGE_RATES_URL | `undefined` | endpoint on the Account Servicing Entity to request exchange rates | | `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` | backend.idempotencyTTL | `86400000` | TTL in milliseconds for idempotencyKey on GraphQL mutations (Admin API). Default: 24hrs | | `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` | | `2000` | TTL in milliseconds for idempotencyKey concurrency lock on GraphQL mutations (Admin API) | | `ILP_ADDRESS` | backend.ilp.address | `undefined` | ILP address of this Rafiki instance | -| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/integration/deployment/playground/autopeering/) | +| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/integration/playground/autopeering/) | | `INCOMING_PAYMENT_EXPIRY_MAX_MS` | | `2592000000` | Maximum milliseconds into the future incoming payments expiry can be set to on creation. Default: 30 days | | `INCOMING_PAYMENT_WORKERS` | backend.workers.incomingPayment | `1` | number of workers processing incoming payment requests | | `INCOMING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that INCOMING_PAYMENT_WORKERS will wait until they check an empty incoming payment request queue again | -| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/integration/deployment/playground/autopeering/) | +| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/integration/playground/autopeering/) | | `KEY_ID` | backend.key.id | `undefined` | this Rafiki instance's client key id | | `LOG_LEVEL` | backend.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | | `NODE_ENV` | backend.nodeEnv | `development` | node environment, `development`, `test`, or `production` | From 4c86f9203745b7ea9c47a105f51331483f9dc3a9 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Wed, 4 Sep 2024 20:25:53 -0400 Subject: [PATCH 61/91] docs: fixing links and running prettier --- packages/documentation/astro.config.mjs | 10 +++---- .../docs/apis/graphql/admin-api-overview.mdx | 2 +- .../get-started/exchange-rates.mdx | 2 +- .../docs/integration/get-started/idp.mdx | 18 +++--------- .../docs/integration/get-started/overview.mdx | 2 +- .../get-started/webhook-events.mdx | 28 +++++++++++-------- .../docs/integration/playground/overview.mdx | 6 ++-- .../src/content/docs/overview/overview.mdx | 16 +++++++---- .../src/partials/backend-variables.mdx | 8 +++--- 9 files changed, 45 insertions(+), 47 deletions(-) diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index c529e6ac3b..dcd0fb7c6c 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -111,7 +111,7 @@ export default defineConfig({ { label: 'Fees', link: '/integration/get-started/fees' - }, + } ] }, { @@ -150,7 +150,7 @@ export default defineConfig({ label: 'Token introspection', link: '/integration/services/token-introspection' } - ], + ] }, { label: 'Test locally', @@ -168,8 +168,8 @@ export default defineConfig({ label: 'Test network', link: '/integration/playground/testnet' } - ], - }, + ] + } ] }, { @@ -233,7 +233,7 @@ export default defineConfig({ link: '/apis/graphql/admin-api-overview' } ] - }, + } ] } ], diff --git a/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx b/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx index f6bc241fda..cc6ea04385 100644 --- a/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx +++ b/packages/documentation/src/content/docs/apis/graphql/admin-api-overview.mdx @@ -24,4 +24,4 @@ Several mutations in the Admin APIs utilize an idempotency key to allow for safe For the Admin APIs, whenever a mutation with an `idempotencyKey` is called, the request payload and the request response are saved under that key. Any subsequent requests made with the same idempotency key will return the original response and status of the request, regardless of whether the request was successful. Keys are cached for a default of 24 hours. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS backend` environment flag. -Additionally, in the chance that a request is made while still concurrently processing the first request under the same `idempotencyKey`, the APIs will return an error. This provides further safeguards from potential errors in the system. The timing to prevent processing concurrent requests is `2` seconds by default. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` environment flag. \ No newline at end of file +Additionally, in the chance that a request is made while still concurrently processing the first request under the same `idempotencyKey`, the APIs will return an error. This provides further safeguards from potential errors in the system. The timing to prevent processing concurrent requests is `2` seconds by default. The default can be changed via the `backend` service’s `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` environment flag. diff --git a/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx index bd0567fc3f..57ea4ffdb9 100644 --- a/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx @@ -8,7 +8,7 @@ banner: import { Badge } from '@astrojs/starlight/components' import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' -If you plan on supporting cross-currency transactions, you must specify from where your Rafiki instance will fetch current exchange rates. +If you plan on supporting cross-currency transactions, you must specify from where your Rafiki instance will fetch current exchange rates. Every Interledger payment is preceded by a rate probe. This probe provides a quote that estimates the full cost of transferring value over the network. For a rate probe involving a cross-currency transaction to be successful, Rafiki needs to know the exchange rates for each currency that makes up the transaction. diff --git a/packages/documentation/src/content/docs/integration/get-started/idp.mdx b/packages/documentation/src/content/docs/integration/get-started/idp.mdx index 475a8e7443..4704ea5f18 100644 --- a/packages/documentation/src/content/docs/integration/get-started/idp.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/idp.mdx @@ -17,14 +17,12 @@ Since Rafiki requires Open Payments, Rafiki also requires that you integrate wit ## Facilitating interactions -Before a client can make an outgoing payment request, it must obtain a grant from your authorization server. +Before a client can make an outgoing payment request, it must obtain a grant from your authorization server. auth service provides you with a reference implementation of an Open Payments authorization server. You can use the auth service as an alternative to developing your own in-house service for grant authorization and authentication. - - - Open Payments requires explicit interaction by an individual (typically the client's end user) before issuing the grant. Presenting the end-user with a consent screen from which they choose to accept or deny the payment is an example of an interaction. +Open Payments requires explicit interaction by an individual (typically the client's end user) before issuing the grant. Presenting the end-user with a consent screen from which they choose to accept or deny the payment is an example of an interaction. The interaction is facilitated by your IdP. Your IdP: @@ -32,24 +30,16 @@ The interaction is facilitated by your IdP. Your IdP: - Sends the user's interaction choice to your authorization server - Redirects the user after the interaction is complete - - - ------ +--- The auth service includes support for such integration. Part of the Open Payments standard states that outgoing payment grant request must be interactive. In an interactive grant request, explicit interaction by an individual (e.g., an account holder) is required to approve a grant. A common example of this from the perspective of a mobile app user is being asked to authenticate (sign in) and then consent (approve) to some action. ----- - - +--- ## Integrate with your identity provider - - - ### Rafiki Admin Rafiki Admin is a web app that allows you to manage your Rafiki instance through a UI. Out of the box, we provide Ory Kratos for the identity and user management of your administrators. Kratos is for internal use and cannot be used as an identity provider for your Open Payments authorization server. diff --git a/packages/documentation/src/content/docs/integration/get-started/overview.mdx b/packages/documentation/src/content/docs/integration/get-started/overview.mdx index c0f05a555d..613ed2d43c 100644 --- a/packages/documentation/src/content/docs/integration/get-started/overview.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/overview.mdx @@ -24,4 +24,4 @@ To support cross-currency transactions, you must specify from where your Rafiki ## Fees -You have the option to charge fees on top of estimated network fees to facilitate transfers. Each asset you support can have a different fee structure. Visit the [Fees](/integration/get-started/fees) page for details. \ No newline at end of file +You have the option to charge fees on top of estimated network fees to facilitate transfers. Each asset you support can have a different fee structure. Visit the [Fees](/integration/get-started/fees) page for details. diff --git a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx index 9af0de8155..92c0a4567b 100644 --- a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx @@ -15,7 +15,7 @@ import { Disclosure } from '@interledger/docs-design-system' -The main communication channel between you and your Rafiki instance is composed of the [Backend Admin API](/apis/admin-api-overview) and a set of webhook events. +The main communication channel between you and your Rafiki instance is composed of the [Backend Admin API](/apis/graphql/admin-api-overview) and a set of webhook events. Most events require you to interact with Rafiki to provide wallet address information or manage (deposit or withdraw) liquidity. This page describes how you should handle each webhook event. @@ -356,16 +356,16 @@ The `outgoing_payment.failed` event indicates that an outgoing payment has eithe ### Wallet addresses -| Event type | Description | -| --------------------------------------------------------------------- | --------------------------------------------------------------------- | +| Event type | Description | +| --------------------------------------------------------------------- | ------------------------------------------------------------------ | | [`wallet_address.not_found`](#wallet-address-not-found) | The requested wallet address was not found on this Rafiki instance | -| [`wallet_address.web_monetization`](#wallet-address-web-monetization) | Web Monetization payments have been received via STREAM | +| [`wallet_address.web_monetization`](#wallet-address-web-monetization) | Web Monetization payments have been received via STREAM | #### Wallet address not found - The wallet address, `https://wallet.example.com/carla_garcia` was requested but does not exist. +The wallet address, `https://wallet.example.com/carla_garcia` was requested but does not exist. >ASE: Fires wallet_address.not_found event to webhook endpoint,
    wallet address: https://wallet.example.com/carla_garcia ASE->>R: Backend Admin API call: CreateWalletAddress,
    url: https://wallet.example.com/carla_garcia,
    public name: Carla Eva Garcia + `} /> @@ -383,15 +384,15 @@ The `wallet_address.not_found` event indicates that a wallet address was request When you receive this event, look up the associated account in your system and create a wallet address for the account. The initial wallet address request will succeed if you create it within your configured `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` time frame. -| Environment variable | Type | Description | -| -------------------- | ---- | ----------- | -| `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` | `backend` | The time in milliseconds that you have to create a missing wallet address before the initial request times out | +| Environment variable | Type | Description | +| ---------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------- | +| `WALLET_ADDRESS_LOOKUP_TIMEOUT_MS` | `backend` | The time in milliseconds that you have to create a missing wallet address before the initial request times out | #### Wallet address Web Monetization - A wallet address received a Web Monetization payment of \$0.33 +A wallet address received a Web Monetization payment of \$0.33 >ASE: Fires wallet_address.web_monetization event to webhook endpoint,
    receivedAmount: $0.33 ASE->>R: Backend Admin API call: CreateWalletAddressWithdrawal ASE->>ASE: Credit recipient's account with $0.33 + `} /> @@ -418,7 +420,7 @@ The `wallet_address.web_monetization` event indicates that a wallet address rece - Your asset liquidity for USD (asset scale: 2) drops below \$100.00. +Your asset liquidity for USD (asset scale: 2) drops below \$100.00. >ASE: Fires asset.liquidity_low event to webhook endpoint,
    asset: USD (scale: 2, id: "abc") ASE->>R: Backend Admin API call: DepositAssetLiquidity + `} /> @@ -444,7 +447,7 @@ The `asset.liquidity_low` event indicates that an asset's liquidity has dropped - The liquidity for your peer, Happy Life Bank, drops below \$100.00 USD. +The liquidity for your peer, Happy Life Bank, drops below \$100.00 USD. >ASE: Fires peer.liquidity_low event to webhook endpoint,
    peer: Happy Life Bank (asset: "USD", scale: 2, id: "abc") ASE->>R: Backend Admin API call: DepositPeerLiquidity + `} />
    -The `peer.liquidity_low` event indicates that a peer's liquidity has dropped below your predefined liquidity threshold. Decide whether you want to extend the peer's credit line or if your peer must settle before you will extend a new line of credit. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. \ No newline at end of file +The `peer.liquidity_low` event indicates that a peer's liquidity has dropped below your predefined liquidity threshold. Decide whether you want to extend the peer's credit line or if your peer must settle before you will extend a new line of credit. If you cannot or do not increase the peer liquidity in Rafiki, transfers to that peer will fail. diff --git a/packages/documentation/src/content/docs/integration/playground/overview.mdx b/packages/documentation/src/content/docs/integration/playground/overview.mdx index 21ca7ae3a5..7bbcc65cbf 100644 --- a/packages/documentation/src/content/docs/integration/playground/overview.mdx +++ b/packages/documentation/src/content/docs/integration/playground/overview.mdx @@ -10,11 +10,11 @@ The Local Playground provides a suite of packages that, together, mock an accoun This suite of packages includes: -| Package name | Services | -| --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| Package name | Services | +| ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | | [`backend`](/integration/services/backend-service) |
    • SPSP
    • Open Payments APIs
    • GraphQL Admin APIs
    • STREAM endpoint
    | | [`auth`](/integration/services/auth-service) | GNAP auth server | -| `mock-account-servicing-entity` | mocks an account servicing entity | +| `mock-account-servicing-entity` | mocks an account servicing entity | | [`frontend`](/integration/services/frontend-service) | Remix app to expose a UI for Rafiki admin management via interaction with the Backend Admin APIs | These packages depend on the following databases: diff --git a/packages/documentation/src/content/docs/overview/overview.mdx b/packages/documentation/src/content/docs/overview/overview.mdx index 661de002f5..6eaae29689 100644 --- a/packages/documentation/src/content/docs/overview/overview.mdx +++ b/packages/documentation/src/content/docs/overview/overview.mdx @@ -3,14 +3,18 @@ title: Overview --- import { LinkOut } from '@interledger/docs-design-system' -import { Card, CardGrid } from '@astrojs/starlight/components'; +import { Card, CardGrid } from '@astrojs/starlight/components' -Rafiki is open-source software that is freely available to any licensed **account servicing entity** (ASE) that wants to implement [Interledger](#interledger) and [Open Payments](#open-payments) on its users' accounts. +Rafiki is open-source software that is freely available to any licensed **account servicing entity** (ASE) that wants to implement [Interledger](#interledger) and [Open Payments](#open-payments) on its users' accounts. Implementing and maintaining the Interledger Protocol (ILP) stack on your own can be difficult and time-consuming. Rafiki is maintained by a dedicated team, making it the perfect solution for ASEs who want to integrate with the Interledger network without developing and maintaining their own implementations. - -It's an entity that provides and maintains payment accounts for its customers and is regulated within the jurisdictions it operates. Examples of ASEs include banks, digital wallet providers, and mobile money providers. Rafiki should **not** be used in production by non-regulated entities. [Learn more about ASEs](#more-about-account-servicing-entities-ases) + + It's an entity that provides and maintains payment accounts for its customers + and is regulated within the jurisdictions it operates. Examples of ASEs + include banks, digital wallet providers, and mobile money providers. Rafiki + should **not** be used in production by non-regulated entities. [Learn more + about ASEs](#more-about-account-servicing-entities-ases) ## Real-world use cases @@ -51,7 +55,7 @@ Below are just a few examples of an ASE's responsibilities and obligations. ### Regulatory compliance -ASEs must onboarding account holders in compliance with regulatory requirements, such as performing Know Your Customer (KYC) checks, anti-money laundering (AML) processes, and sanctions screening. +ASEs must onboarding account holders in compliance with regulatory requirements, such as performing Know Your Customer (KYC) checks, anti-money laundering (AML) processes, and sanctions screening. ### Account provisioning and maintenance @@ -67,4 +71,4 @@ ASEs maintain a ledger of account balances and transaction histories for their a ### Authentication and consent -In the context of Open Payments, ASEs are responsible for authenticating resource owners (e.g., account holders) and obtaining their consent when clients, such as mobile apps, request access to a resource (e.g., an account). \ No newline at end of file +In the context of Open Payments, ASEs are responsible for authenticating resource owners (e.g., account holders) and obtaining their consent when clients, such as mobile apps, request access to a resource (e.g., an account). diff --git a/packages/documentation/src/partials/backend-variables.mdx b/packages/documentation/src/partials/backend-variables.mdx index 7e3c27e735..f8a4fd1ffe 100644 --- a/packages/documentation/src/partials/backend-variables.mdx +++ b/packages/documentation/src/partials/backend-variables.mdx @@ -5,21 +5,21 @@ import { LinkOut } from '@interledger/docs-design-system' | `ADMIN_PORT` | backend.port.admin | `3001` | Admin API GraphQL Server port | | `AUTH_SERVER_GRANT_URL` | | `undefined` | endpoint on the Open Payments Auth Server to request a grant | | `AUTH_SERVER_INTROSPECTION_URL` | | `undefined` | endpoint on the Open Payments Auth Server to introspect an access token | -| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/integration/playground/autopeering/) is enabled, its server will use this port | +| `AUTO_PEERING_SERVER_PORT` | | `3005` | If [auto-peering](/integration/playground/autopeering/) is enabled, its server will use this port | | `CONNECTOR_PORT` | backend.port.connector | `3002` | port of the ILP connector for for sending packets over ILP over HTTP | | `DATABASE_URL` | backend.postgresql.host, backend.postgresql.port, backend.postgresql.username, backend.postgresql.database, backend.postgresql.password | `postgresql://postgres:password@localhost:5432/development` | Postgres database URL of database storing the resource data; For Helm, these components are provided individually. | -| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/integration/playground/autopeering/). | +| `ENABLE_AUTO_PEERING` | | `false` | Flag to enable auto peering. View [documentation](/integration/playground/autopeering/). | | `ENABLE_SPSP_PAYMENT_POINTERS` | | `true` | enables SPSP route | | `EXCHANGE_RATES_LIFETIME` | backend.lifetime.exchangeRate | `15_000` | time in milliseconds the exchange rates provided by the ASE via the EXCHANGE_RATES_URL are valid for | | `EXCHANGE_RATES_URL` | backend.serviceUrls.EXCHANGE_RATES_URL | `undefined` | endpoint on the Account Servicing Entity to request exchange rates | | `GRAPHQL_IDEMPOTENCY_KEY_TTL_MS` | backend.idempotencyTTL | `86400000` | TTL in milliseconds for idempotencyKey on GraphQL mutations (Admin API). Default: 24hrs | | `GRAPHQL_IDEMPOTENCY_KEY_LOCK_MS` | | `2000` | TTL in milliseconds for idempotencyKey concurrency lock on GraphQL mutations (Admin API) | | `ILP_ADDRESS` | backend.ilp.address | `undefined` | ILP address of this Rafiki instance | -| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/integration/playground/autopeering/) | +| `ILP_CONNECTOR_URL` | | `undefined` | The ILP connector address where ILP packets are received. Communicated during [auto-peering](/integration/playground/autopeering/) | | `INCOMING_PAYMENT_EXPIRY_MAX_MS` | | `2592000000` | Maximum milliseconds into the future incoming payments expiry can be set to on creation. Default: 30 days | | `INCOMING_PAYMENT_WORKERS` | backend.workers.incomingPayment | `1` | number of workers processing incoming payment requests | | `INCOMING_PAYMENT_WORKER_IDLE` | backend.workerIdle | `200` | time in milliseconds that INCOMING_PAYMENT_WORKERS will wait until they check an empty incoming payment request queue again | -| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/integration/playground/autopeering/) | +| `INSTANCE_NAME` | | `undefined` | this Rafiki instance's name used to communicate for [auto-peering](/integration/playground/autopeering/) | | `KEY_ID` | backend.key.id | `undefined` | this Rafiki instance's client key id | | `LOG_LEVEL` | backend.logLevel | `info` | [Pino Log Level](https://getpino.io/#/docs/api?id=levels) | | `NODE_ENV` | backend.nodeEnv | `development` | node environment, `development`, `test`, or `production` | From cf16d3448f61138df770e4b1a6fbe58b2a4433cb Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Thu, 5 Sep 2024 18:14:37 -0400 Subject: [PATCH 62/91] docs: trying to finish --- packages/documentation/astro.config.mjs | 48 ++-- .../docs/admin/manage-wallet-addresses.mdx | 175 ------------- .../docs/integration/get-started/idp.mdx | 110 -------- .../docs/integration/get-started/overview.mdx | 27 -- .../integration/integration-checklist.mdx | 13 - .../content/docs/integration/requirements.mdx | 5 - .../requirements/assets.mdx} | 32 +-- .../exchange-rates.mdx | 33 +-- .../docs/integration/requirements/idp.mdx | 93 +++++++ .../integration/requirements/overview.mdx | 64 +++++ .../sending-fees.mdx} | 4 +- .../requirements/wallet-addresses.mdx | 238 ++++++++++++++++++ .../webhook-events.mdx | 16 +- .../integration/services/auth-service.mdx | 2 +- .../integration/services/backend-service.mdx | 2 +- .../docs/overview/concepts/telemetry.mdx | 14 +- .../src/content/docs/overview/overview.mdx | 6 +- 17 files changed, 464 insertions(+), 418 deletions(-) delete mode 100644 packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx delete mode 100644 packages/documentation/src/content/docs/integration/get-started/idp.mdx delete mode 100644 packages/documentation/src/content/docs/integration/get-started/overview.mdx delete mode 100644 packages/documentation/src/content/docs/integration/integration-checklist.mdx delete mode 100644 packages/documentation/src/content/docs/integration/requirements.mdx rename packages/documentation/src/content/docs/{admin/manage-assets.mdx => integration/requirements/assets.mdx} (69%) rename packages/documentation/src/content/docs/integration/{get-started => requirements}/exchange-rates.mdx (70%) create mode 100644 packages/documentation/src/content/docs/integration/requirements/idp.mdx create mode 100644 packages/documentation/src/content/docs/integration/requirements/overview.mdx rename packages/documentation/src/content/docs/integration/{get-started/fees.mdx => requirements/sending-fees.mdx} (89%) create mode 100644 packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx rename packages/documentation/src/content/docs/integration/{get-started => requirements}/webhook-events.mdx (95%) diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index dcd0fb7c6c..0b2ac4fbdd 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -89,39 +89,39 @@ export default defineConfig({ collapsed: true, items: [ { - label: 'Get started', + label: 'Requirements', collapsed: true, items: [ { - label: 'Overview', - link: '/integration/get-started/overview' + label: 'Overview and checklist', + link: '/integration/requirements/overview' }, { - label: 'Webhook events', - link: '/integration/get-started/webhook-events' + label: 'Assets', + link: '/integration/requirements/assets' }, { - label: 'Identity provider (IdP)', - link: '/integration/get-started/idp' + label: 'Wallet addresses', + link: '/integration/requirements/wallet-addresses' + }, + { + label: 'Webhook events', + link: '/integration/requirements/webhook-events' }, { label: 'Exchange rates', - link: '/integration/get-started/exchange-rates' + link: '/integration/requirements/exchange-rates' }, { - label: 'Fees', - link: '/integration/get-started/fees' + label: 'Sending fees', + link: '/integration/requirements/sending-fees' + }, + { + label: 'Identity provider (IdP)', + link: '/integration/requirements/idp' } ] }, - { - label: 'Requirements', - link: '/integration/requirements' - }, - { - label: 'Integration checklist', - link: '/integration/integration-checklist' - }, { label: 'Docker', link: '/integration/prod/nginx' @@ -180,21 +180,13 @@ export default defineConfig({ label: 'Rafiki Admin', link: '/admin/admin-user-guide' }, - { - label: 'Manage assets', - link: '/admin/manage-assets' - }, - { - label: 'Manage liquidity', - link: '/admin/manage-liquidity' - }, { label: 'Manage peering relationships', link: '/admin/manage-peering' }, { - label: 'Manage wallet addresses', - link: '/admin/manage-wallet-addresses' + label: 'Manage liquidity', + link: '/admin/manage-liquidity' } ] }, diff --git a/packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx b/packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx deleted file mode 100644 index 27a222c27f..0000000000 --- a/packages/documentation/src/content/docs/admin/manage-wallet-addresses.mdx +++ /dev/null @@ -1,175 +0,0 @@ ---- -title: Manage wallet addresses ---- - -import { LinkOut } from '@interledger/docs-design-system' - -import { CodeBlock } from '@interledger/docs-design-system' - -To allow your account holders the ability to send and receive payments via the Open Payments APIs, you must create at least one wallet address for each account. The wallet address serves as a standardized identifier for a payment account. - -You can create wallet addresses for your account holders using the Backend Admin API. Note that at least one asset must be created before the wallet address is created. The `assetId` of the asset must be provided as an input variable when issuing the GraphQL mutation query. - -## Creating wallet addresses through a script - -One approach to issuing wallet addresses to your account holders is writing a one-time script to loop through your list of account holders and call the `CreateWalletAddress` GraphQL mutation along with the input parameters. The following is an example: - - - -```graphql -// Query: - -mutation CreateWalletAddress($input:CreateWalletAddressInput!) { - createWalletAddress(input:$input) { - code - success - message - walletAddress { - id - createdAt - publicName - url - asset { - code - id - scale - } - } - } -} - - -// Input parameters **NOTE - `additionalProperties` are optional: - -{ - "input": { - "assetId": "0ddc0b7d-1822-4213-948e-915dda58850b", - "publicName": "Sarah Marshall", - "url": "https://example.wallet.com/sarah", - "additionalProperties": [ - { - "key": "iban", - "value": "NL93 8601 1117 947", - "visibleInOpenPayments": false - }, - {"key": "nickname", "value": "S Mar", "visibleInOpenPayments": true } - ] - } -} -``` - - - - - -```graphql -{ - "data": -{"createWalletAddress": { - "code":"200", - "success":true, - "message":"Created wallet address", - "walletAddress": { - "id":"695e7546-1803-4b45-96b6-6a53f4082018", - "createdAt":"2023-03-03T09:07:01.107Z", - "publicName":"Sarah Marshall", "url":"https://example.wallet.com/sarah", - "asset": { -"id":"0ddc0b7d-1822-4213-948e-915dda58850b", - "code":"USD", - "scale":2 - } - } - } - } -} -``` - - - -You SHOULD store at least the `walletAddress.id` in their internal database to be able to reference the account and wallet address. - -### Create wallet address key - -To use the Open Payments APIs, a wallet address must be associated with at least one private-public key pair to sign an API request. One or multiple public keys are linked to the wallet address so that third parties can verify request signatures. The key pair can be added using the `CreateWalletAddressKey` GraphQL mutation. If you create wallet addresses for your account holders via a one-time script, you must call this mutation for each new wallet address. - - - -```graphql -// Query: - -mutation -CreateWalletAddressKey -($input:CreateWalletAddressKeyInput!) -{ - createWalletAddressKey(input:$input) { - code - message - success - walletAddressKey -{ -id - walletAddressId - revoked - jwk{ - alg - crv - kid - kty - x - } - - createdAt - } -} -} - - -// Input parameters - -{ - "input": { - "jwk": { - "kid": "keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", - "x":"ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8", - "alg":"EdDSA", - "kty":"OKP", - "crv":"Ed25519" -}, -"walletAddressId":"695e7546-1803-4b45-96b6-6a53f4082018" - }} -``` - - - - - -```graphql -{ - "data": { - "createWalletAddressKey": { -"code":"200", -"message":"Added Key To Wallet Address", -"success":true, -"walletAddressKey": { - "id":"f2953571-f10c-44eb-ab41-4450a7ad6771", -"walletAddressId":"695e7546-1803-4b45-96b6-6a53f4082018", -"revoked":false, -"jwk": { -"alg":"EdDSA", -"crv":"Ed25519", - "kid":"keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", - "kty":"OKP", -"x":"ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8" -}, - "createdAt":"2023-03-03T09:26:41.424Z" -} - } - } -} -``` - - - -## Creating wallet addresses dynamically - -An alternative approach to creating wallet addresses for your account holders is to generate the addresses dynamically when your Rafiki instance fires the `wallet_address.not_found` webhook event. This event fires when Rafiki does not find the wallet address requested from an Open Payments API call. When receiving this event, you can look up the associated account in your system and call the `CreateWalletAddress` and `CreateWalletAddressKey` mutations to create the wallet address and its associated private-public key pair. Even if you opt to create the initial batch of wallet addresses for your existing account holders via a one-time script, you may implement this process to dynamically create wallet addresses for any new accounts you onboard to your system. diff --git a/packages/documentation/src/content/docs/integration/get-started/idp.mdx b/packages/documentation/src/content/docs/integration/get-started/idp.mdx deleted file mode 100644 index 4704ea5f18..0000000000 --- a/packages/documentation/src/content/docs/integration/get-started/idp.mdx +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: Identity provider (IdP) -banner: - content: | - MELISSA IS STILL WORKING ON THIS PAGE ---- - -import { Badge } from '@astrojs/starlight/components' -import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' - -An identity provider (IdP) is a system or service that stores and manages user identity information, authentication, and consent. Examples of IdPs include OpenID Connect and Okta. - -Since Rafiki requires Open Payments, Rafiki also requires that you integrate with an IdP. The purpose of the IdP is to: - -- Authenticate requests from clients, such as mobile apps, to create quotes and payments on Rafiki's backend -- Facilitate interactions with resource owners, such as your account holders, to gather consent - -## Facilitating interactions - -Before a client can make an outgoing payment request, it must obtain a grant from your authorization server. - -auth -service provides you with a reference implementation of an Open Payments authorization server. You can use the auth service as an alternative to developing your own in-house service for grant authorization and authentication. - -Open Payments requires explicit interaction by an individual (typically the client's end user) before issuing the grant. Presenting the end-user with a consent screen from which they choose to accept or deny the payment is an example of an interaction. - -The interaction is facilitated by your IdP. Your IdP: - -- Provides the consent screen -- Sends the user's interaction choice to your authorization server -- Redirects the user after the interaction is complete - ---- - -The auth service includes support for such integration. - -Part of the Open Payments standard states that outgoing payment grant request must be interactive. In an interactive grant request, explicit interaction by an individual (e.g., an account holder) is required to approve a grant. A common example of this from the perspective of a mobile app user is being asked to authenticate (sign in) and then consent (approve) to some action. - ---- - -## Integrate with your identity provider - -### Rafiki Admin - -Rafiki Admin is a web app that allows you to manage your Rafiki instance through a UI. Out of the box, we provide Ory Kratos for the identity and user management of your administrators. Kratos is for internal use and cannot be used as an identity provider for your Open Payments authorization server. - -### IdP environment variables - -| Environment variable | Description | Required | -| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `IDENTITY_SERVER_DOMAIN` | The URL that your authorization server will direct the client to so the client's end-user can complete the interaction and authorize a grant. | Y | -| `IDENTITY_SERVER_SECRET` | A shared secret between your authorization server and your IdP that your authorization server will use to secure its IdP-related endpoints. Your IdP must provide this secret when it sends requests to your authorization server. | Y | - -### Endpoints - -There are a number of endpoints that facilitate communication between your IdP and your authorization server after a pending grant request is created. - -The endpoints are called in the sequence listed in the table below. - -| Method | Endpoint | Purpose | -| ---------------------------------------------------- | ------------------------------- | --------------------------------------------------------------- | -| | `/interact/:id /:nonce` | [Establish interaction session](#establish-interaction-session) | -| | `/grant/:id /:nonce` | [Fetch grant information](#fetch-grant-information) | -| | `/grant/:id /:nonce` | [Accept or reject grant](#accept-or-reject-grant) | -| | `/interact/:id /:nonce /finish` | [Finish interaction](#finish-interaction) | -| | `/interact/:id /:nonce` | [Continue grant](#continue-grant) | - -Each interaction with an endpoint is identified by an `id` and a `nonce`. Both are provided as query parameters when your authorization server redirects to your IdP. - -#### Establish interaction session - -Called by the client and establishes an interactive session with your authorization server, which redirects the browser session to the IdP consent screen. - -#### Fetch grant information - -Called by your IdP to retrieve a list of access rights, requested by the client, from your authorization server. The access rights are presented to the client's end-user on the consent screen. The authorization server's response is served on the `INTERACTION_PORT`, which is `3009` by default. - -| Header | Description | Required | -| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | -| `x-idp-secret` | Used to secure communication between your IdP and authorization server using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | - -#### Accept or reject grant - -Your IdP communicates the end-user’s acceptance or rejection on the consent screen to your authorization server, then redirects to `GET /interact/:id/:nonce/finish`. The response is served on `INTERACTION_PORT`, which is `3009` by default. - -| Header | Description | Required | -| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | -| `x-idp-secret` | Used to secure communication between your IdP and authorization server using the shared secret defined in the `IDENTITY_SERVER_SECRET` environment variable. | Y | - -#### Finish interaction - -Your IdP ends the interaction initiated by `GET /interact/:id/:nonce` and redirects the end-user's browser session to the URI of the grant initialization request. A query parameter will indicate a failure, or on success, a SHA-256 hash parameter that the client can use to verify the successful interaction. - -| Query parameter | Description | Required | -| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `id` | Interaction ID | Y | -| `nonce` | Interaction nonce | Y | -| `result` | Success or failure of the grant authorization. In case of success, the SHA-256 hash of the interaction is sent in the response along with the `interact_ref` that identifies the interaction on the authorization server and the URI of the grant initialization request. | Y | - -The following tables list examples of the different possible response types on this endpoint. - -| Response | Description | Example | -| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -| Rejected | The interaction was rejected by the end-user. | `?result=grant_rejected` | -| Invalid | The grant was not in a state where it could be accepted or rejected (e.g., grant was already approved) | `?result=grant_invalid` | -| Success | The grant was successful with the following returned in the response:
    • A hash representing the SHA-256 hash of values provided by the client in the grant initialization request (`interact.finish.nonce`), and the values in the response returned from your authorization server (`interact.finish`).
    • The `interact_ref` that identifies the interaction on your authorization server alongside the hash
    • The URI of the grant initialization request (e.g., `https://www.auth-server.com`)
    | `hash=p28jsq0Y2KK3WS__a42tavNC64ldGTBroywsWxT4md_jZQ1R\HZT8BOWYHcLmObM7XHPAdJzTZMtKBsaraJ64A &interact_ref=4IFWWIKYBC2PQ6U56NL1` | - -#### Continue grant - -The client requests a grant from your authorization server for an accepted interaction. Your authorization server responds with an access token. diff --git a/packages/documentation/src/content/docs/integration/get-started/overview.mdx b/packages/documentation/src/content/docs/integration/get-started/overview.mdx deleted file mode 100644 index 613ed2d43c..0000000000 --- a/packages/documentation/src/content/docs/integration/get-started/overview.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Get started ---- - -import { LinkOut } from '@interledger/docs-design-system' - -Before you begin setting up your production environment, consider the following. - -## Webhook events - -The main communication channel between you and your Rafiki instance is composed of the Backend Admin API and a set of webhook events. Most of these events require you to interact with Rafiki. The [Webhook events](/integration/get-started/webhook-events) page describes each event and explains the action you're expected to take when a particular event fires. - -## Identity provider (IdP) - -An identity provider (IdP) is a system or service that stores and manages user identity information, authentication, and consent. Examples of IdPs include OpenID Connect and Okta. - -Since Rafiki requires Open Payments, Rafiki also requires that you integrate with an IdP. The [`auth`](/integration/services/auth-service) service includes support for such integration. Visit the [Identity provider (IdP)](/integration/get-started/idp) page for more integration details. - -Part of the Open Payments standard states that outgoing payment grant request must be interactive. In an interactive grant request, explicit interaction by an individual (e.g., an account holder) is required to approve a grant. A common example of this from the perspective of a mobile app user is being asked to authenticate (sign in) and then consent (approve) to some action. - -## Exchange rates - -To support cross-currency transactions, you must specify from where your Rafiki instance will fetch current [exchange rates](/integration/get-started/exchange-rates). Exchange rates are calculated as part of a payment's quote, which estimates the full cost of transferring value over the network. - -## Fees - -You have the option to charge fees on top of estimated network fees to facilitate transfers. Each asset you support can have a different fee structure. Visit the [Fees](/integration/get-started/fees) page for details. diff --git a/packages/documentation/src/content/docs/integration/integration-checklist.mdx b/packages/documentation/src/content/docs/integration/integration-checklist.mdx deleted file mode 100644 index 8abd00c393..0000000000 --- a/packages/documentation/src/content/docs/integration/integration-checklist.mdx +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Integration checklist ---- - -For ease of reference, here is a list of things to check before you operate Rafiki in production and participate as a node on the Interledger network. - -- [ ] Are you licensed as a financial entity (e.g. bank, fintech) in the jurisdiction that you are operating in? -- [ ] Have you set up of your Rates endpoint? -- [ ] Did you integrate your Rafiki instance with your Identity Provider (IDP) service and configure the user consent screen along with the interaction flow? -- [ ] Have you selected a strategy to create wallet addresses for your account holders? -- [ ] Did you determine which enpoints to expose and how (nginx / apache / K8s)? -- [ ] Are your admin services secured from external access? -- [ ] Did you add at least one [asset](/integration/peering#add-asset) either via the `backend` admin API or the Rafiki Admin application? diff --git a/packages/documentation/src/content/docs/integration/requirements.mdx b/packages/documentation/src/content/docs/integration/requirements.mdx deleted file mode 100644 index dd0133d6b6..0000000000 --- a/packages/documentation/src/content/docs/integration/requirements.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Requirements ---- - -including peering agreement diff --git a/packages/documentation/src/content/docs/admin/manage-assets.mdx b/packages/documentation/src/content/docs/integration/requirements/assets.mdx similarity index 69% rename from packages/documentation/src/content/docs/admin/manage-assets.mdx rename to packages/documentation/src/content/docs/integration/requirements/assets.mdx index eecc3a5e2f..9f052adca2 100644 --- a/packages/documentation/src/content/docs/admin/manage-assets.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/assets.mdx @@ -1,5 +1,5 @@ --- -title: Manage assets +title: Assets --- import { Badge } from '@astrojs/starlight/components' @@ -9,7 +9,7 @@ Assets in Rafiki can be added through the Backend Admin API or the Rafiki Admin ## Add an asset using the `createAsset` GraphQL mutation - + ```graphql mutation CreateAsset($input: CreateAssetInput!) { @@ -30,7 +30,7 @@ mutation CreateAsset($input: CreateAssetInput!) { ### Example -To add US dollars, for example, as an asset type to your Rafiki instance, call the `CreateAsset` mutation and pass the `input` parameters for the asset `code`, represented by its ISO 4217 currency code (USD), and `scale` variables as follows: +To add US dollars, for example, as an asset type to your Rafiki instance, call the `createAsset` mutation and pass the `input` parameters for the asset `code`, represented by its ISO 4217 currency code (USD), and `scale` variables as follows: @@ -52,25 +52,25 @@ To add US dollars, for example, as an asset type to your Rafiki instance, call t -```graphql +```json { "data": { - "createAsset": { - "code": "200", - "success": true, - "message": "Created Asset", - "asset": { - "id": "b3dffeda-1e0e-47d4-82a3-69b1a622eeb9", - "code": "USD", - "scale": 2 - } - } + "createAsset": { + "code": "200", + "success": true, + "message": "Created Asset", + "asset": { + "id": "b3dffeda-1e0e-47d4-82a3-69b1a622eeb9", + "code": "USD", + "scale": 2 + } + } } } ``` -## Add an asset using the Rafiki Admin application +## Add an asset using Rafiki Admin -Alternatively, assets can be added through the [Rafiki Admin](/admin/admin-user-guide/#assets) application. Navigate to the main Assets page and then configure the asset code and scale. +Assets can be added through the [Rafiki Admin](/admin/admin-user-guide/#assets) application. Navigate to the main Assets page and then configure the asset code and scale. diff --git a/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx b/packages/documentation/src/content/docs/integration/requirements/exchange-rates.mdx similarity index 70% rename from packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx rename to packages/documentation/src/content/docs/integration/requirements/exchange-rates.mdx index 57ea4ffdb9..5f5e06f150 100644 --- a/packages/documentation/src/content/docs/integration/get-started/exchange-rates.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/exchange-rates.mdx @@ -1,17 +1,16 @@ --- title: Exchange rates -banner: - content: | - MELISSA IS STILL WORKING ON THIS PAGE --- import { Badge } from '@astrojs/starlight/components' import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' -If you plan on supporting cross-currency transactions, you must specify from where your Rafiki instance will fetch current exchange rates. +If you plan to support cross-currency transactions, you must specify from where your Rafiki instance will fetch current exchange rates. Every Interledger payment is preceded by a rate probe. This probe provides a quote that estimates the full cost of transferring value over the network. For a rate probe involving a cross-currency transaction to be successful, Rafiki needs to know the exchange rates for each currency that makes up the transaction. +Often, it's the receiving ASE that provides the exchange rates for each ILP packet. For example, let's say you and your peer transact in USD. Your peer also supports MXN. If a USD payment from from your side was addressed to a wallet address set up for MXN on your peer's side, then your peer would provide the USD to MXN exchange rate. + ## Specify your exchange rates endpoint Rafiki fetches exchange rates from your exchange rates endpoint. Set your endpoint via the `backend` service's `EXCHAGE_RATES_URL` variable. An OpenAPI specification for the endpoint is available. @@ -61,14 +60,6 @@ Specify how long your Rafiki instance will cache exchange rates via the `backend Caching improves performance as Rafiki will not need to request the rates from your endpoint for every payment. - - -``` -EXCHANGE_RATES_LIFETIME: 20_000 -``` - - - ## Specify slippage (optional) As exchange rates and fees charged by connectors fluctuate, there will likely be a variance between the estimated amount provided in the quote and the actual amount required when the payment is initiated. This difference is called slippage. @@ -85,7 +76,7 @@ SLIPPAGE: 0.05 ### Example -Let's assume your Rafiki instance is using the default slippage of `0.01` (1%). The rate probe that precedes a USD payment returns a quote of `$1.00`. One percent of one dollar equals one cent. +Let's say your Rafiki instance is using the default slippage of `0.01` (1%). The rate probe that precedes a USD payment returns a quote of `$1.00`. One percent of one dollar equals one cent. If the total of the payment, inclusive of currency exchange rates and network fees, amounts to `$1.01`, the payment will be successful. If the total is `$1.02` or more, the payment will fail. @@ -105,14 +96,10 @@ export function loader({ request }: LoaderFunctionArgs) { } ``` -## Exchange rate environment variables - -The exchange rate environment variables are part of the `backend` service. - -The file that contains your variables varies depending on whether you are running Rafiki via Docker (`docker-compose.yaml`) or via Helm and Kubernetes (`values.yaml` for the Helm chart). +## Environment variables -| Environment variable | Description | Required | -| ------------------------- | ----------------------------------------------------------------------------------------------- | -------- | -| `EXCHANGE_RATES_URL` | Your exchange rates endpoint | Y | -| `EXCHANGE_RATES_LIFETIME` | The amount of time Rafiki caches exchange rates, in ms | Y | -| `SLIPPAGE` | The variance allowed between a quote and the actual amount required when a payment is initiated | Y | +| Variable | Type | Description | Required | +| ------------------------- | --------- | ----------------------------------------------------------------------------------------------- | -------- | +| `EXCHANGE_RATES_URL` | `backend` | Your exchange rates endpoint | Y | +| `EXCHANGE_RATES_LIFETIME` | `backend` | The amount of time Rafiki caches exchange rates, in ms | Y | +| `SLIPPAGE` | `backend` | The variance allowed between a quote and the actual amount required when a payment is initiated | Y | diff --git a/packages/documentation/src/content/docs/integration/requirements/idp.mdx b/packages/documentation/src/content/docs/integration/requirements/idp.mdx new file mode 100644 index 0000000000..8ca31062f1 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/requirements/idp.mdx @@ -0,0 +1,93 @@ +--- +title: Identity provider (IdP) +--- + +import { Badge } from '@astrojs/starlight/components' +import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' + +An identity provider (IdP) is a system or service that stores and manages user identity information, authentication, and consent. Examples of IdPs include OpenID Connect and Okta. + +Integration with an IdP is required if you plan to support Open Payments outgoing payments for your users. Open Payments requires that outgoing payment grant requests, which precede outgoing payment requests, be interactive. In an interactive grant request, explicit interaction by an individual (e.g., an account holder) is required to approve the grant. An example of an interaction is an end-user tapping an Approve button in an app to authorize a payment. + +Your IdP will: + +- Authenticate requests from clients, such as mobile apps, to create quotes and payments on Rafiki's backend +- Facilitate interactions with the individual to gather consent + +:::note +We provide Ory Kratos, a cloud-based user management system, for the identity and user management of your Rafiki Admin users. Kratos is for internal use only and **cannot** be used here as your IdP. +::: + +### Interactions and consent + +Before an Open Payments outgoing payment is created, an outgoing payment grant must be issued. + +Outgoing payment grant requests must be interactive. This means the request requires explicit interaction, often from the account holder, to gather consent (permission) to create the outgoing payment. The interaction is facilitated by your IdP. Your IdP: + +1. Provides an interface to gather consent, for example, a consent screen +2. Sends the interaction choice to your authorization server +3. Sends a request to your authorization server to finish the interaction +4. Redirects the user after the interaction is complete + +### Authorization server + +The purpose of an Open Payments authorization server is to grant permission to clients to access the Open Payments APIs for creating incoming payments, quotes, and outgoing payments against an account holder's account. + +Rafiki's [auth service](/integration/services/auth-service) provides you with a reference implementation of an Open Payments authorization server. The server extends an API for your IdP to use to begin and finish an interaction, collect authorization, acquire information about a particular grant, and communicate that a user has authorized a grant. You can use the service as an alternative to developing your own in-house service. + +## Rafiki integration + +### Environment variables + +| Variable | Type | Description | Required | +| ------------------------ | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `IDENTITY_SERVER_URL` | `backend` | The URL of your IdP. This URL is where your authorization server will direct clients to so end users can complete the interaction and authorize a grant. | Y | +| `IDENTITY_SERVER_SECRET` | `backend` | A shared secret between your authorization server and your IdP that your authorization server will use to secure its IdP-related endpoints.
    When your IdP sends requests to your authorization server, your IdP must provide the secret via an `x-idp-secret` header. | Y | + +### IDENTITY_SERVER_URL endpoints + +We have a number of endpoints that facilitate communication between your IdP and authorization server after a pending grant request is created. + +Each interaction with an endpoint is identified by an `id` and a `nonce`. Both are provided as query parameters when your authorization server redirects to your IdP. + +The endpoints are called in the sequence listed in the table below. + +| Method | Endpoint | Purpose | +| ---------------------------------------------------- | ------------------------------- | ---------------------------------------------------------------- | +| | `/interact/{id}/{nonce}` | [Start user interaction session](#establish-interaction-session) | +| | `/grant/{id}/{nonce}` | [Look up grant information](#fetch-grant-information) | +| | `/grant/{id}/{nonce}/{choice}` | [Accept or reject grant](#accept-or-reject-grant) | +| | `/interact/{id}/{nonce}/finish` | [Finish user interaction](#finish-interaction) | +| | `/interact/{id}/{nonce}` | [Continue grant](#continue-grant) | + +We also provide an OpenAPI specification that describes the endpoints. + +#### Start user interaction session + +Called by the client and establishes an interactive session with your authorization server, which redirects the client's browser session to the IdP consent screen. + +#### Look up grant information + +Called by your IdP to retrieve a list of access rights, requested by the client, from your authorization server. The access rights are presented to the client's end-user on the consent screen. The authorization server's response is served on the `INTERACTION_PORT`, which is `3009` by default. + +#### Accept or reject grant + +Your IdP communicates the choice made by the end-user on the consent screen (accept/reject) to your authorization server. Then, your IdP redirects to `GET /interact/:id/:nonce/finish`. The response is served on `INTERACTION_PORT`, which is `3009` by default. + +#### Finish interaction + +Your IdP ends the interaction and redirects the end-user's browser session to the URI of the grant initialization request. + +The `result` query parameter will indicate the success or failure of the grant authorization. In case of success, the SHA-256 hash of the interaction is sent in the response along with an `interact_ref` that identifies the interaction on the authorization server and the URI of the grant initialization request. + +The following table lists examples of the different possible response types on this endpoint. + +| Response | Description | Example | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| Rejected | The interaction was rejected by the end-user. | `?result=grant_rejected` | +| Invalid | The grant was not in a state where it could be accepted or rejected (e.g., grant was already approved) | `?result=grant_invalid` | +| Success | The grant was successful with the following returned in the response:
    • A hash representing the SHA-256 hash of values provided by the client in the grant initialization request (`interact.finish.nonce`), and the values in the response returned from your authorization server (`interact.finish`).
    • The `interact_ref` that identifies the interaction on your authorization server alongside the hash
    • The URI of the grant initialization request (e.g., `https://www.auth-server.com`)
    | `hash=p28jsq0Y2KK3WS__a42tavNC64ldGTBroywsWxT4md_jZQ1R\HZT8BOWYHcLmObM7XHPAdJzTZMtKBsaraJ64A &interact_ref=4IFWWIKYBC2PQ6U56NL1` | + +#### Continue grant + +The client requests a grant from your authorization server for an accepted interaction. Your authorization server responds with an access token. diff --git a/packages/documentation/src/content/docs/integration/requirements/overview.mdx b/packages/documentation/src/content/docs/integration/requirements/overview.mdx new file mode 100644 index 0000000000..3e549518de --- /dev/null +++ b/packages/documentation/src/content/docs/integration/requirements/overview.mdx @@ -0,0 +1,64 @@ +--- +title: Requirements overview and integration checklist +--- + +import { LinkOut } from '@interledger/docs-design-system' + +You must meet the following requirements before you deploy Rafiki to a production environment. + +## Be an account servicing entity + +An account servicing entity (ASE) is an entity that provides and maintains payment accounts for its customers and is regulated within the jurisdictions it operates. Examples of ASEs include banks, digital wallet providers, and mobile money providers. The [Introducing Rafiki](/overview/overview#more-about-account-servicing-entities) page provides a few examples of an ASE's responsibilities and obligations. + +Rafiki should not be used in production by non-regulated entities. + +## Support at least one asset + +You must set up Rafiki to support at least one asset. An asset in Rafiki represents an item of value that can be transferred via the Interledger Protocol. Since the Interledger Protocol aims to create an internet of value, it allows for the transfer of any asset, not just currency. In practice, however, assets are usually denominated in a currency (fiat or branded currencies). + +[Set up your assets](/integration/requirements/assets) + +## Associate each user-facing payment account with a wallet address + +A wallet address is a publicly shareable standardized ID for a payment account. Each payment account belonging to your users (e.g., customers) must have at least one associated wallet address for the account to be able to send and/or receive payments via Open Payments and Interledger. + +[Set up your wallet addresses](/integration/requirements/wallet-addresses) + +## Expose a webhook endpoint and react to events accordingly + +The main communication channel between you and your Rafiki instance is composed of the Backend Admin API and a set of webhook events. Most of these events require you to interact with Rafiki. You must expose a webhook endpoint that listens for events dispatched by Rafiki, then react accordingly (for example, deposit or withdraw liquidity). + +[Specify your webhook endpoint and learn how to handle each event](/integration/requirements/webhook-events) + +## Expose an exchange rate endpoint + +To support cross-currency transactions, you must specify from where your Rafiki instance will fetch current exchange rates. Exchange rates are calculated as part of a payment's quote, which estimates the full cost of transferring value over the network. + +[Specify your exchange rate endpoint](/integration/requirements/exchange-rates) + +## Charge a sending fee + +You can charge a sending fee, on top of any estimated network fees, for facilitating transfers. Each asset you support can have a different fee structure. + +[Define your sending fees](/integration/requirements/sending-fees) + +## Integrate with an identity provider (IdP) + +An identity provider (IdP) is a system or service that stores and manages user identity information, authentication, and consent. Examples of IdPs include OpenID Connect and Okta. + +Integration with an IdP is required if you plan to support Open Payments outgoing payments for your users. Open Payments requires that outgoing payment grant requests be interactive. In an interactive grant request, explicit interaction by an individual (e.g., an account holder) is required to approve the grant. Your IdP will handle the authentication and consent required to authorize a grant request. + +[Integrate Rafiki with your IdP](/integration/requirements/idp) + +## Integration checklist + +Ensure you've completed the following tasks before you deploy Rafiki to a production environment and join the Interledger network. + +- [ ] You are a licensed financial account servicing entity within the jurisdiction(s) you operate in +- [ ] You have added at least one asset, either through the Backend Admin API or the Rafiki Admin app +- [ ] You have implemented a strategy for creating wallet addresses for your account holders +- [ ] You have set up your webhook endpoint and understand how to handle each webhook event +- [ ] You have set up your exchange rates endpoint +- [ ] You have defined the sending fee you will charge, if any, for each asset, either through the Backend Admin API or the Rafiki Admin app +- [ ] If supporting Open Payments outgoing payments, you have integrated with an IdP and configured the user consent screen and interaction flow +- [ ] Your admin services are secured from external access diff --git a/packages/documentation/src/content/docs/integration/get-started/fees.mdx b/packages/documentation/src/content/docs/integration/requirements/sending-fees.mdx similarity index 89% rename from packages/documentation/src/content/docs/integration/get-started/fees.mdx rename to packages/documentation/src/content/docs/integration/requirements/sending-fees.mdx index 2c3cb0dae1..a37bf8548e 100644 --- a/packages/documentation/src/content/docs/integration/get-started/fees.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/sending-fees.mdx @@ -1,11 +1,11 @@ --- -title: Fees +title: Sending fees --- import { Badge } from '@astrojs/starlight/components' import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' -You have the option to charge fees, on top of any estimated network fees, for facilitating transfers. Each asset you support can have a different fee structure and you can specify both fixed and variable fees per asset. +You have the option to charge sending fees, on top of any estimated network fees, for facilitating transfers. Each asset you support can have a different fee structure and you can specify both fixed and variable fees per asset. The fee amount is added on top of the quote that is generated after the ILP rate probe completes. ## Set fees using the `setFee` GraphQL mutation diff --git a/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx b/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx new file mode 100644 index 0000000000..c74c3343d5 --- /dev/null +++ b/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx @@ -0,0 +1,238 @@ +--- +title: Wallet addresses +--- + +import { LinkOut } from '@interledger/docs-design-system' +import { CodeBlock } from '@interledger/docs-design-system' + +:::danger +Creating key pairs is more of an optional thing than anything. It can stay a part of this doc but it should be its own section. The section should reference the open payments docs somewhere. The key pairs are only needed if the ASE wants to allow their users to use/be OP clients under their wallet addresses. +::: + +Each payment account belonging to your users (e.g., customers) must have at least one associated wallet address for the account to be able to send and receive payments over Interledger and Open Payments. A wallet address serves as a publicly shareable standardized ID for a payment account. + +:::note +Your Rafiki instance must be set up for at least one asset before wallet addresses can be created as each wallet address must have an asset assigned to it. +::: + +## Create wallet addresses + +There are a few ways in which you can create wallet addresses. + +- [Through a script](#create-wallet-addresses-through-a-script) +- [In response to the `wallet_address.not_found` webhook event](#create-wallet-addresses-in-response-to-a-webhook-event) +- [In the Rafiki Admin app](#create-and-manage-wallet-addresses-using-rafiki-admin) + +All wallet addresses must also be associated with at least one [public-private key pair](#create-a-wallet-address-key-pair) to sign API requests. If you use Rafiki Admin to create wallet addresses, this happens automatically. + +### Create wallet addresses through a script + +Writing your own script that loops through your list of account is one way to batch create wallet addresses for your existing account holders. + +Your script must first call the `createWalletAddress` GraphQL mutation, then call the [`createWalletAddressKey`](#create-a-wallet-address-key-pair) mutation for each new wallet address. + +We strongly recommend you store at least the `walletAddress.id` in your internal database to be able to reference the account and wallet address later. + + + +```graphql +mutation CreateWalletAddress($input: CreateWalletAddressInput!) { + createWalletAddress(input: $input) { + code + success + message + walletAddress { + id + createdAt + publicName + url + asset { + code + id + scale + } + } + } +} +``` + + + +### Example + + + +```json +{ + "input": { + "assetId": "0ddc0b7d-1822-4213-948e-915dda58850b", + "publicName": "Sarah Marshall", + "url": "https://example.wallet.com/sarah", + "additionalProperties": [ + { + "key": "iban", + "value": "NL93 8601 1117 947", + "visibleInOpenPayments": false + }, + { + "key": "nickname", + "value": "S Mar", + "visibleInOpenPayments": true + } + ] + } +} +``` + + + +| Variable | Description | +| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| `assetId` | The unique ID of the asset, assigned by Rafiki when the asset was created, that the wallet address's underlying payment account is denominated in | +| `publicName` | The public name associated with the wallet address | +| `url` | The wallet address's URL | +| `additionalProperties` | Optional [additional properties](/apis/graphql/backend/inputobjects/#additionalpropertyinput) associated with the wallet address | + + + +```json +{ + "data": { + "createWalletAddress": { + "code": "200", + "success": true, + "message": "Created wallet address", + "walletAddress": { + "id": "695e7546-1803-4b45-96b6-6a53f4082018", + "createdAt": "2023-03-03T09:07:01.107Z", + "publicName": "Sarah Marshall", + "url": "https://example.wallet.com/sarah", + "asset": { + "id": "0ddc0b7d-1822-4213-948e-915dda58850b", + "code": "USD", + "scale": 2 + } + } + } + } +} +``` + + + +### Create wallet addresses in response to a webhook event + +The `wallet_address.not_found` event fires when a wallet address is requested through the Open Payments Get Wallet Address API, but Rafiki can't find the address. + +When you receive the event, look up the associated account in your system, then call the `createWalletAddress` and `createWalletAddressKey` mutations to create the address and its public-private key pair. + +--- + +## Create a wallet address key pair + +A wallet address must be associated with at least one public-private key pair to sign Open Payment API requests. The public key enables clients, such as mobile apps, to verify request signatures. + +Add a key pair to a wallet address using the `createWalletAddressKey` GraphQL mutation. + + + +```graphql +mutation CreateWalletAddressKey($input: CreateWalletAddressKeyInput!) { + createWalletAddressKey(input: $input) { + code + message + success + walletAddressKey { + id + walletAddressId + revoked + jwk { + alg + crv + kid + kty + x + } + createdAt + } + } +} +``` + + + +#### Example + + + +```json +{ + "input": { + "jwk": { + "kid": "keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", + "x": "ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8", + "alg": "EdDSA", + "kty": "OKP", + "crv": "Ed25519" + }, + "walletAddressId": "695e7546-1803-4b45-96b6-6a53f4082018" + } +} +``` + + + +A JSON web key is a JSON data structure that represents a cryptographic key. + + + Section 4 + of the JSON Web Key (JWK) specification describes the JWK format and associated +parameters (kty, alg, kid). + + + Section 6 + of the JSON Web Algorithms (JWA) specification describes the cryptographic +algorithm for keys (incl parameters kty, crv, x) + +| Variable | Description | +| ----------------- | -------------------------------------------- | +| `jwk` | JSON web key object that represents the keys | +| `kid` | A key ID that identifies the keys | +| `x` | The base64 url-encoded public key | +| `alg` | The algorithm used to generate the key pair | +| `kty` | . | +| `crv` | . | +| `walletAddressId` | . | + + + +```json +{ + "data": { + "createWalletAddressKey": { + "code": "200", + "message": "Added Key To Wallet Address", + "success": true, + "walletAddressKey": { + "id": "f2953571-f10c-44eb-ab41-4450a7ad6771", + "walletAddressId": "695e7546-1803-4b45-96b6-6a53f4082018", + "revoked": false, + "jwk": { + "alg": "EdDSA", + "crv": "Ed25519", + "kid": "keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5", + "kty": "OKP", + "x": "ubqoInifJ5sssIPPnQR1gVPfmoZnJtPhTkyMXNoJF_8" + }, + "createdAt": "2023-03-03T09:26:41.424Z" + } + } + } +} +``` + + + +## Create and manage wallet addresses using Rafiki Admin + +You can create and manage wallet addresses manually through the [Rafiki Admin](/admin/admin-user-guide#create-wallet-address) app. If you use Rafiki Admin to create wallet addresses, it will assign each address a public-private key pair automatically. diff --git a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx b/packages/documentation/src/content/docs/integration/requirements/webhook-events.mdx similarity index 95% rename from packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx rename to packages/documentation/src/content/docs/integration/requirements/webhook-events.mdx index 92c0a4567b..fc90d79883 100644 --- a/packages/documentation/src/content/docs/integration/get-started/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/webhook-events.mdx @@ -15,7 +15,7 @@ import { Disclosure } from '@interledger/docs-design-system' -The main communication channel between you and your Rafiki instance is composed of the [Backend Admin API](/apis/graphql/admin-api-overview) and a set of webhook events. +The main communication channel between you and your Rafiki instance is composed of the Backend Admin API and a set of webhook events. Most events require you to interact with Rafiki to provide wallet address information or manage (deposit or withdraw) liquidity. This page describes how you should handle each webhook event. @@ -29,9 +29,9 @@ For Rafiki to notify you about webhook events, you must expose a webhook endpoin When an event occurs, the [`backend`](/integration/services/backend-service) service makes a request to your configured webhook endpoint. The `backend` service expects a `200` status in return. -| Environment variable | Type | Description | -| -------------------- | --------- | ------------------------------------------------------------------- | -| `WEBHOOK_URL` | `backend` | The endpoint to where requests are made when a webhook event occurs | +| Variable | Type | Description | +| ------------- | --------- | ------------------------------------------------------------------- | +| `WEBHOOK_URL` | `backend` | The endpoint to where requests are made when a webhook event occurs | ## Webhook event request body @@ -146,10 +146,10 @@ If a non-200 status is returned, indicating an error, or the request times out, The first retry is after 10 seconds. Additional retries occur after 20 more seconds, then after 30 more seconds, and so on. -| Environment variable | Type | Description | -| -------------------- | --------- | --------------------------------------------------------------------------------------------------------------- | -| `WEBHOOK_TIMEOUT` | `backend` | The amount of time, in milliseconds, after which a webhook request will time out | -| `WEBHOOK_MAX_RETRY` | `backend` | The maximum number of retries for a webhook event when a non-200 status is returned or if the request timed out | +| Variable | Type | Description | +| ------------------- | --------- | --------------------------------------------------------------------------------------------------------------- | +| `WEBHOOK_TIMEOUT` | `backend` | The amount of time, in milliseconds, after which a webhook request will time out | +| `WEBHOOK_MAX_RETRY` | `backend` | The maximum number of retries for a webhook event when a non-200 status is returned or if the request timed out | ## Webhook events diff --git a/packages/documentation/src/content/docs/integration/services/auth-service.mdx b/packages/documentation/src/content/docs/integration/services/auth-service.mdx index cac13461e1..dad5fcc686 100644 --- a/packages/documentation/src/content/docs/integration/services/auth-service.mdx +++ b/packages/documentation/src/content/docs/integration/services/auth-service.mdx @@ -36,7 +36,7 @@ When a request comes from a client registered with another instance of Rafiki, t An identity provider (IdP) is a system or service that manages user authentication, identity information, and consent. When you use your Google account credentials to “Sign in with Google” on an app or website, for example, Google is acting as your identity provider. -Integration with an [IdP](/integration/get-started/idp) is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. +Integration with an [IdP](/integration/requirements/idp) is required when using Rafiki’s `auth` service because Open Payments requires interactive outgoing payment grant requests. This means there must be explicit interaction by an individual (typically a client’s end user/your customer) to approve or deny an outgoing payment before a grant is issued. :::note Rafiki’s [`frontend`](/integration/services/frontend-service) service requires an IdP for authentication and user management of your administrators. Out of the box, Rafiki uses Ory Kratos to enable your admins to access the Admin API. Kratos is for internal use and cannot be used for your customer-facing Open Payments authorization server. diff --git a/packages/documentation/src/content/docs/integration/services/backend-service.mdx b/packages/documentation/src/content/docs/integration/services/backend-service.mdx index 3fce4eaec2..7f948dc7d4 100644 --- a/packages/documentation/src/content/docs/integration/services/backend-service.mdx +++ b/packages/documentation/src/content/docs/integration/services/backend-service.mdx @@ -43,7 +43,7 @@ The roles of the connector include: The connector receives incoming packets via HTTP and/or direct calls from within the `backend`. The `backend` includes an HTTP server listening on the configured `CONNECTOR_PORT`. -The amounts within ILP packets are used to update account liquidities in your accounting database (TigerBeetle or Postgres). Amounts are adjusted based on Rafiki’s configured [exchange rates](/integration/get-started/exchange-rates) and the asset used by the sending (outgoing) and receiving (destination) accounts. The total amount received for the STREAM connection is tracked in Redis. +The amounts within ILP packets are used to update account liquidities in your accounting database (TigerBeetle or Postgres). Amounts are adjusted based on Rafiki’s configured [exchange rates](/integration/requirements/exchange-rates) and the asset used by the sending (outgoing) and receiving (destination) accounts. The total amount received for the STREAM connection is tracked in Redis. ## GraphQL Backend Admin API diff --git a/packages/documentation/src/content/docs/overview/concepts/telemetry.mdx b/packages/documentation/src/content/docs/overview/concepts/telemetry.mdx index fa2bca6527..be70f9d7aa 100644 --- a/packages/documentation/src/content/docs/overview/concepts/telemetry.mdx +++ b/packages/documentation/src/content/docs/overview/concepts/telemetry.mdx @@ -153,13 +153,13 @@ You must deploy your own OTEL Collector that acts as a sidecar container to Rafi ### Telemetry environment variables -| Variable name | Type | Description | Required | -| -------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `ENABLE_TELEMETRY` | Boolean | Enables the telemetry service on Rafiki. Defaults to `true`. | N | -| `LIVENET` | Boolean | Determines where to send metrics. Defaults to `false`, resulting in metrics being sent to the testnet OTEL Collector.

    Set to `true` on production environments dealing with real money.

    | N | -| `OPEN_TELEMETRY_COLLECTOR_URLS` | String | A CSV of URLs for OTEL Collectors (e.g., `http://otel-collector-NLB-e3172ff9d2f4bc8a.elb.eu-west-2.amazonaws.com:4317,http://happy-life-otel-collector:4317`). | N | -| `OPEN_TELEMETRY_EXPORT_INTERVAL` | Number | Indicates, in milliseconds, how often the instrumented Rafiki instance should send metrics. Defaults to `15000`. | N | -| `TELEMETRY_EXCHANGE_RATES_URL` | String |

    Defines the endpoint Rafiki will query for exchange rates. Used as a fallback if/when [exchange rates](/integration/get-started/exchange-rates) aren’t provided.

    When set, the response format of the external exchange rates API should be of type `rates`, as is expected by the rate service.

    Defaults to `https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json`, which points to a public S3 that has the previously mentioned required format, updated daily.

    | N | +| Variable name | Type | Description | Required | +| -------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `ENABLE_TELEMETRY` | Boolean | Enables the telemetry service on Rafiki. Defaults to `true`. | N | +| `LIVENET` | Boolean | Determines where to send metrics. Defaults to `false`, resulting in metrics being sent to the testnet OTEL Collector.

    Set to `true` on production environments dealing with real money.

    | N | +| `OPEN_TELEMETRY_COLLECTOR_URLS` | String | A CSV of URLs for OTEL Collectors (e.g., `http://otel-collector-NLB-e3172ff9d2f4bc8a.elb.eu-west-2.amazonaws.com:4317,http://happy-life-otel-collector:4317`). | N | +| `OPEN_TELEMETRY_EXPORT_INTERVAL` | Number | Indicates, in milliseconds, how often the instrumented Rafiki instance should send metrics. Defaults to `15000`. | N | +| `TELEMETRY_EXCHANGE_RATES_URL` | String |

    Defines the endpoint Rafiki will query for exchange rates. Used as a fallback if/when [exchange rates](/integration/requirements/exchange-rates) aren’t provided.

    When set, the response format of the external exchange rates API should be of type `rates`, as is expected by the rate service.

    Defaults to `https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json`, which points to a public S3 that has the previously mentioned required format, updated daily.

    | N | ### Example Docker OTEL Collector image and configuration diff --git a/packages/documentation/src/content/docs/overview/overview.mdx b/packages/documentation/src/content/docs/overview/overview.mdx index 6eaae29689..21d54370ef 100644 --- a/packages/documentation/src/content/docs/overview/overview.mdx +++ b/packages/documentation/src/content/docs/overview/overview.mdx @@ -14,7 +14,7 @@ Implementing and maintaining the Interledger Protocol (ILP) stack on your own ca and is regulated within the jurisdictions it operates. Examples of ASEs include banks, digital wallet providers, and mobile money providers. Rafiki should **not** be used in production by non-regulated entities. [Learn more - about ASEs](#more-about-account-servicing-entities-ases) + about ASEs](#more-about-account-servicing-entities)
    ## Real-world use cases @@ -47,7 +47,9 @@ By following the Open Payments standard, Rafiki allows your customers' accounts [Learn more about Open Payments](/overview/concepts/open-payments) -## More about account servicing entities (ASEs) +## More about account servicing entities + +An account servicing entity (ASE) is a regulated entity that provides and maintains payment accounts for its customers. Examples of ASEs include banks, digital wallet providers, and mobile money providers. As regulated entities, ASEs are subject to the laws, rules, and regulations of their jurisdictions. As such, Rafiki should **not** be used in production environments by non-regulated entities. From 08c8807f66da6c26c5680f61dff03a9ac7399b3b Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Thu, 5 Sep 2024 18:17:31 -0400 Subject: [PATCH 63/91] docs: silly linkout component --- .../docs/integration/requirements/wallet-addresses.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx b/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx index c74c3343d5..ca4e80068e 100644 --- a/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx @@ -184,12 +184,12 @@ mutation CreateWalletAddressKey($input: CreateWalletAddressKeyInput!) { A JSON web key is a JSON data structure that represents a cryptographic key. - +In Section 4 of the JSON Web Key (JWK) specification describes the JWK format and associated parameters (kty, alg, kid). - +In Section 6 of the JSON Web Algorithms (JWA) specification describes the cryptographic algorithm for keys (incl parameters kty, crv, x) From 8c5cc000e183834e9f0518a390d028e8db76fea8 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Thu, 5 Sep 2024 18:20:07 -0400 Subject: [PATCH 64/91] docs: fix idp links --- .../src/content/docs/integration/requirements/idp.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/requirements/idp.mdx b/packages/documentation/src/content/docs/integration/requirements/idp.mdx index 8ca31062f1..f8847d8236 100644 --- a/packages/documentation/src/content/docs/integration/requirements/idp.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/idp.mdx @@ -54,8 +54,8 @@ The endpoints are called in the sequence listed in the table below. | Method | Endpoint | Purpose | | ---------------------------------------------------- | ------------------------------- | ---------------------------------------------------------------- | -| | `/interact/{id}/{nonce}` | [Start user interaction session](#establish-interaction-session) | -| | `/grant/{id}/{nonce}` | [Look up grant information](#fetch-grant-information) | +| | `/interact/{id}/{nonce}` | [Start user interaction session](#start-user-interaction-session) | +| | `/grant/{id}/{nonce}` | [Look up grant information](#look-up-grant-information) | | | `/grant/{id}/{nonce}/{choice}` | [Accept or reject grant](#accept-or-reject-grant) | | | `/interact/{id}/{nonce}/finish` | [Finish user interaction](#finish-interaction) | | | `/interact/{id}/{nonce}` | [Continue grant](#continue-grant) | From 79883d7af06e25c4777b386b571eaeabe8a29456 Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Fri, 6 Sep 2024 13:48:23 +0200 Subject: [PATCH 65/91] docs: mi/manage-peering --- .../src/content/docs/admin/manage-peering.mdx | 106 +++++++++--------- .../docs/integration/requirements/idp.mdx | 12 +- .../requirements/wallet-addresses.mdx | 6 +- 3 files changed, 63 insertions(+), 61 deletions(-) diff --git a/packages/documentation/src/content/docs/admin/manage-peering.mdx b/packages/documentation/src/content/docs/admin/manage-peering.mdx index 2af8e3b9c6..d66631b014 100644 --- a/packages/documentation/src/content/docs/admin/manage-peering.mdx +++ b/packages/documentation/src/content/docs/admin/manage-peering.mdx @@ -2,13 +2,13 @@ title: Manage peering relationships --- -import { LinkOut } from '@interledger/docs-design-system' +import { CodeBlock, LinkOut } from '@interledger/docs-design-system' -import { CodeBlock } from '@interledger/docs-design-system' +To join the Interledger network and be able to send and receive payments, you must add one or more peer(s) to your Rafiki instance. ## Prerequisites -To add a peer and send Interledger payments you and the account servicing entity (ASE) you intend to peer with must both: +Before you add a peer, you and the account servicing entity (ASE) you intend to peer with must both: - Run an implementation of an [Interledger connector](/integration/services/backend-service#interledger-connector) (ideally Rafiki). - Agree on an [asset](/overview/concepts/accounts-transfers-liquidity#assets) for the peering relationship. You can set up multiple peering relationships with the same peer based on different assets. At least one asset shared by you and your peer must be added to your Rafiki instance prior to setting up the peering relationship. @@ -20,47 +20,36 @@ To add a peer and send Interledger payments you and the account servicing entity Optionally, you may also deposit an initial liquidity for your peer. -## Add a peer using the Backend Admin API +## Add peer using the `CreatePeer` GraphQL mutation -Rafiki’s Backend Admin API implements a GraphQL interface. Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts; a query and an object containing query variables. - -To add a peer to your Rafiki instance call the `CreatePeer` mutation query and pass the query variables for the following: - -| Query parameters | Description | Required | -| -------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -------- | -| `assetID` | the ID of the asset that you and your peer will use to ultimately settle your net obligations outside of Interledger. | Y | -| `staticILPaddress` | Your peer’s static ILP address (the following example uses `g.othergreatwallet`) | Y | -| `name` | Your peer’s name (the following example uses “The Other Great Wallet”) | Y | -| `http.incoming.authTokens` | The token your peer will use to present and connect to and send packets to your Rafiki instance. | Y | -| `http.outgoing.endpoint` | Your peer’s connector endpoint. By default it is on local port 0.0.0.0:3002 | Y | -| `http.outgoing.authtoken` | The token that you will use to present to your peer and connect to and send packets to their Rafiki instance. | Y | -| `initialLiquidity` | Initial amount of liquidity to deposit for peer. Liquidity can also be deposited using the `DepositPeerLiquidity` mutation. | N | - - + ```graphql -// Query: - mutation CreatePeer($input: CreatePeerInput!) { createPeer(input: $input) { - code - success - message - peer { - id - asset { - code - scale - } - staticIlpAddress - name - } + code + success + message + peer { + id + asset { + code + scale + } + staticIlpAddress + name + } } } +``` + + +### Example -// Query Variables (substitute the asset ID from the “create asset” response for INSERT_ASSET_ID): + +```json { "input": { "staticIlpAddress": "g.othergreatwallet", @@ -77,33 +66,44 @@ mutation CreatePeer($input: CreatePeerInput!) { - -```graphql +| Variable | Description | Required | +| -------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -------- | +| `assetID` | The ID of the asset that you and your peer will use to ultimately settle your net obligations outside of Interledger. | Y | +| `staticILPaddress` | Your peer’s static ILP address (the example uses `g.othergreatwallet`) | Y | +| `name` | Your peer’s name (the example uses “The Other Great Wallet”) | Y | +| `http.incoming.authTokens` | The token your peer will use to present and connect to and send packets to your Rafiki instance. | Y | +| `http.outgoing.endpoint` | Your peer’s connector endpoint. By default it is on local port 0.0.0.0:3002 | Y | +| `http.outgoing.authtoken` | The token that you will use to present to your peer and connect to and send packets to their Rafiki instance. | Y | +| `initialLiquidity` | Initial amount of liquidity to deposit for peer. Liquidity can also be deposited using the `DepositPeerLiquidity` mutation. | N | + + + +```json { "data": { - "createPeer": { - "code": "200", - "success": true, - "message": "Created ILP Peer", - "peer": { - "id": "480ef339-7842-4501-a905-923fc1339cef", - "asset": { - "code": "USD", - "scale": 2 - }, - "staticIlpAddress": "g.othergreatwallet", - "name": "The Other Great Wallet" - } - } + "createPeer": { + "code": "200", + "success": true, + "message": "Created ILP Peer", + "peer": { + "id": "480ef339-7842-4501-a905-923fc1339cef", + "asset": { + "code": "USD", + "scale": 2 + }, + "staticIlpAddress": "g.othergreatwallet", + "name": "The Other Great Wallet" + } + } } } ``` -## Add a peer using the Rafiki Admin application +## Add a peer using Rafiki Admin -Alternatively, a peer can be added through the Rafiki Admin application, which Rafiki makes available through its `frontend` package. Ideally, this will be done using your [local Rafiki environment](/integration/playground/overview/#running-the-local-environment). +Alternatively, a peer can be added through the [Rafiki Admin](/admin/admin-user-guide#create-peer) application. Ideally, this will be done using your [local Rafiki environment](/integration/playground/overview/#running-the-local-environment). -See the [Rafiki Admin application user guide](/admin/admin-user-guide/#peers) for more information on adding peers. +Refer to the [Rafiki Admin application user guide](/admin/admin-user-guide/#peers) for more information on adding peers. diff --git a/packages/documentation/src/content/docs/integration/requirements/idp.mdx b/packages/documentation/src/content/docs/integration/requirements/idp.mdx index f8847d8236..16efbf54af 100644 --- a/packages/documentation/src/content/docs/integration/requirements/idp.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/idp.mdx @@ -52,13 +52,13 @@ Each interaction with an endpoint is identified by an `id` and a `nonce`. Both a The endpoints are called in the sequence listed in the table below. -| Method | Endpoint | Purpose | -| ---------------------------------------------------- | ------------------------------- | ---------------------------------------------------------------- | +| Method | Endpoint | Purpose | +| ---------------------------------------------------- | ------------------------------- | ----------------------------------------------------------------- | | | `/interact/{id}/{nonce}` | [Start user interaction session](#start-user-interaction-session) | -| | `/grant/{id}/{nonce}` | [Look up grant information](#look-up-grant-information) | -| | `/grant/{id}/{nonce}/{choice}` | [Accept or reject grant](#accept-or-reject-grant) | -| | `/interact/{id}/{nonce}/finish` | [Finish user interaction](#finish-interaction) | -| | `/interact/{id}/{nonce}` | [Continue grant](#continue-grant) | +| | `/grant/{id}/{nonce}` | [Look up grant information](#look-up-grant-information) | +| | `/grant/{id}/{nonce}/{choice}` | [Accept or reject grant](#accept-or-reject-grant) | +| | `/interact/{id}/{nonce}/finish` | [Finish user interaction](#finish-interaction) | +| | `/interact/{id}/{nonce}` | [Continue grant](#continue-grant) | We also provide an OpenAPI specification that describes the endpoints. diff --git a/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx b/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx index ca4e80068e..89b8eabbae 100644 --- a/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx @@ -185,12 +185,14 @@ mutation CreateWalletAddressKey($input: CreateWalletAddressKeyInput!) { A JSON web key is a JSON data structure that represents a cryptographic key. In - Section 4 +Section 4 + of the JSON Web Key (JWK) specification describes the JWK format and associated parameters (kty, alg, kid). In - Section 6 +Section 6 + of the JSON Web Algorithms (JWA) specification describes the cryptographic algorithm for keys (incl parameters kty, crv, x) From e4138fb558efe87862cb27c0b6ea646560e09fbc Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Fri, 6 Sep 2024 13:56:57 +0200 Subject: [PATCH 66/91] docs: mi/manage-peering --- .../src/content/docs/admin/manage-peering.mdx | 1 - .../docs/integration/requirements/wallet-addresses.mdx | 10 ++-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/packages/documentation/src/content/docs/admin/manage-peering.mdx b/packages/documentation/src/content/docs/admin/manage-peering.mdx index d66631b014..dfdd8b6ddd 100644 --- a/packages/documentation/src/content/docs/admin/manage-peering.mdx +++ b/packages/documentation/src/content/docs/admin/manage-peering.mdx @@ -66,7 +66,6 @@ mutation CreatePeer($input: CreatePeerInput!) { - | Variable | Description | Required | | -------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -------- | | `assetID` | The ID of the asset that you and your peer will use to ultimately settle your net obligations outside of Interledger. | Y | diff --git a/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx b/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx index 89b8eabbae..e801ca665f 100644 --- a/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx @@ -184,16 +184,10 @@ mutation CreateWalletAddressKey($input: CreateWalletAddressKeyInput!) { A JSON web key is a JSON data structure that represents a cryptographic key. -In -Section 4 - - of the JSON Web Key (JWK) specification describes the JWK format and associated +In Section 4 of the JSON Web Key (JWK) specification describes the JWK format and associated parameters (kty, alg, kid). -In -Section 6 - - of the JSON Web Algorithms (JWA) specification describes the cryptographic +In Section 6 of the JSON Web Algorithms (JWA) specification describes the cryptographic algorithm for keys (incl parameters kty, crv, x) | Variable | Description | From fca233786e10564aea9de3ab0e0607a953f8e27c Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Fri, 6 Sep 2024 15:56:38 -0500 Subject: [PATCH 67/91] docs-updating manage liquidity Overhaul of manage liquidity Small fixes to manage assets --- .../content/docs/admin/manage-liquidity.mdx | 448 ++++++++++++------ .../docs/integration/requirements/assets.mdx | 6 +- 2 files changed, 294 insertions(+), 160 deletions(-) diff --git a/packages/documentation/src/content/docs/admin/manage-liquidity.mdx b/packages/documentation/src/content/docs/admin/manage-liquidity.mdx index 8c8ae9897f..1c0546904c 100644 --- a/packages/documentation/src/content/docs/admin/manage-liquidity.mdx +++ b/packages/documentation/src/content/docs/admin/manage-liquidity.mdx @@ -2,14 +2,10 @@ title: Manage liquidity --- -import { LinkOut } from '@interledger/docs-design-system' +import { CodeBlock, LinkOut } from '@interledger/docs-design-system' As an implementation of the Interledger Protocol, Rafiki provides [accounting](/overview/concepts/accounts-transfers-liquidity) between transacting parties but doesn’t handle settlement. You and the account servicing entities you decide to peer with must agree on the means and how often you will settle your accounts. Consequently, Rafiki can manage the liquidity used to fund payments made through the Interledger network. -## Add liquidity via GraphQL - -Liquidity can be managed in Rafiki through the [`backend`](/integration/services/backend-service/) Admin API, which implements a GraphQL interface, or via the [Rafiki Admin application](/admin/admin-user-guide). Data insertions and modifications in GraphQL can be specified explicitly via a mutation query. Each GraphQL request has two parts: a query and an object containing query variables. - As Rafiki supports several types of liquidity, we’ll cover the typical scenarios you’ll need to manage. :::note @@ -22,72 +18,100 @@ Asset liquidity specifies the amount of value denominated in an asset you have p You should define and adjust the asset liquidity based on your risk tolerance. -### Example - -You’ve configured your Rafiki instance with two assets, EUR and USD, with an asset scale of 0. The EUR liquidity is 10, and the USD liquidity is 50. With liquidity support for these two assets, your Rafiki instance can function as a connector node within the Interledger network and provide currency exchange between a sender sending a payment in EUR and a recipient receiving the payment in USD. - -In a cross-currency transaction, your Rafiki instance would receive packets totaling 10 EUR and send packets worth 11 USD. The EUR liquidity would be increased to 20 EUR, and the USD liquidity would be reduced to 39 USD. +### Deposit asset liquidity using the `DepositAssetLiquidity` mutation -If your Rafiki instance were to receive 50 EUR, but needed to send 55 USD, the transaction would fail because your instance does not have enough USD liquidity. + -### Deposit Asset Liquidity - -You can deposit asset liquidity via the `DepositAssetLiquidity` mutation: - -```sh -mutation -DepositAssetLiquidity($input:DepositAssetLiquidityInput!) { - depositAssetLiquidity(input:$input) { +```graphql +mutation DepositAssetLiquidity($input: DepositAssetLiquidityInput!) { + depositAssetLiquidity(input: $input) { code success message error - } + } } ``` -The following are example `input` parameters for the `DepositAssetLiquidity` mutation query above. + -```sh -{ "input": { - "id":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "assetId":"7b8b0f65-896d-4403-b7ba-2e24bf20eb35", - "amount":"100", - "idempotencyKey":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f" - } +#### Example + + + +```json +{ + "input": { + "id": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "assetId": "7b8b0f65-896d-4403-b7ba-2e24bf20eb35", + "amount": "100", + "idempotencyKey": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f" + } } ``` -### Withdraw Asset Liquidity + + +| Variable | Description | +| ---------------- | -------------------------------------------------------------------------- | +| `assetID` | The id of the asset to deposit liquidity into | +| `amount` | Amount of liquidity to deposit | +| `id` | The id of the transfer (deposit) | +| `idempotencyKey` | Unique key to ensure duplicate or retried requests are processed only once | + +If the asset liquidity deposit was successful, `DepositAssetLiquidity` returns `true`. + +### Withdraw asset liquidity using the `CreateAssetLiquidityWithdrawal` mutation -You can withdraw asset liquidity via the `CreateAssetLiquidityWithdrawal` mutation: + -```sh -mutation -CreateAssetLiquidityWithdrawal( - $input:CreateAssetLiquidityWithdrawalInput! +```graphql +mutation CreateAssetLiquidityWithdrawal( + $input: CreateAssetLiquidityWithdrawalInput! ) { - createAssetLiquidityWithdrawal(input:$input) { - code - success - message - error - } + createAssetLiquidityWithdrawal(input: $input) { + code + success + message + error + } } ``` -The following are example `input` parameters for the `CreateAssetLiquidityWithdrawal` mutation query above. + + +#### Example + + -```sh -{"input": { - "id":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "assetId":"7b8b0f65-896d-4403-b7ba-2e24bf20eb35", - "amount":"100", - "idempotencyKey":"b97fd85a-126e-42ef-b40d-1a50a70ffa6f", - "timeoutSeconds":0} +```json +{ + "input": { + "id": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "assetId": "7b8b0f65-896d-4403-b7ba-2e24bf20eb35", + "amount": "100", + "idempotencyKey": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "timeoutSeconds": 0 + } } ``` + + +| Variable | Description | +| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | The id of the transfer (withdrawal) | +| `assetId` | The id of the asset to withdraw liquidity from | +| `amount` | Amount of liquidity to withdraw | +| `idempotencyKey` | Unique key to ensure duplicate or retried requests are processed only once | +| `timeoutSeconds` | Interval, in seconds, after a pending transfer is initiated at which it can be posted or voided (zero denotes a no timeout, single-phase posted transfer) | + +If the asset liquidity withdrawal was successful, `CreateAssetLiquidityWithdrawal` returns `true`. + +### Deposit and withdraw asset liquidity using Rafiki Admin + +Asset liquidity can also be added through the [Rafiki Admin](/admin/admin-user-guide/#edit-asset) application. Navigate to the liquidity information section on the main Assets page and then select deposit or withdraw liquidity. + ## Peer Liquidity Peer liquidity is the line of credit denominated in the asset of the peering relationship in Rafiki that you extend to your respective peer. You must determine how much credit you will extend in your peering agreement, which depends on how much you trust the peer. If peer liquidity is insufficient, Rafiki cannot initiate payments to that peer. Once peer liquidity is used up, you should settle with your peer and reset their peer liquidity. @@ -96,76 +120,113 @@ Peer liquidity is the line of credit denominated in the asset of the peering rel You must decide whether to secure liquidity with your peers by extending credit or requiring them to pre-fund your accounts. Those agreements must be made before setting up peering relationships in Rafiki and are not managed through Interledger or Rafiki. ::: -### Example +### Deposit peer liquidity using the `DepositPeerLiquidity` mutation -A configured peer, _Cloud Nine Wallet,_ has a peer liquidity of 100 USD. Your Rafiki instance can send packets up to 100 USD to wallet addresses issued by _Cloud Nine Wallet_. Once that liquidity is used up, you should settle with _Cloud Nine Wallet_ and reset their liquidity to 100 USD. + -### Deposit Peer Liquidity - -You can add liquidity for a particular peer via the `DepositPeerLiquidity` mutation. - -```sh -mutation DepositPeerLiquidity($input:DepositPeerLiquidityInput!) { - depositPeerLiquidity(input:$input) { +```graphql +mutation DepositPeerLiquidity($input: DepositPeerLiquidityInput!) { + depositPeerLiquidity(input: $input) { code success message - error} + error + } } ``` -The following are example `input` parameters for the `DepositPeerLiquidity` mutation query above. + -```sh -{"input": {"id":"a09b730d-8610-4fda-98fa-ec7acb19c775", - "peerId":"73158598-2e0c-4973-895e-aebd115af260", - "amount":"1000000", - "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", - "timeoutSeconds":0} +#### Example + + + +```json +{ + "input": { + "id": "a09b730d-8610-4fda-98fa-ec7acb19c775", + "peerId": "73158598-2e0c-4973-895e-aebd115af260", + "amount": "1000000", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" + } } ``` -### Withdraw Peer Liquidity + + +| Variable | Description | +| ---------------- | -------------------------------------------------------------------------- | +| `id` | The id of the transfer (deposit) | +| `peerId` | The id of the peer to deposit liquidity into | +| `amount` | Amount of liquidity to deposit | +| `idempotencyKey` | Unique key to ensure duplicate or retried requests are processed only once | + +If the peer liquidity deposit was successful, `DepositPeerLiquidity` returns `true`. + +### Withdraw peer liquidity using the `CreatePeerLiquidityWithdrawal` mutation -In case you want to reduce your peer’s credit line, you can withdraw peer liquidity via the `CreatePeerLiquidityWithdrawal` mutation: + -```sh +```graphql mutation CreatePeerLiquidityWithdrawal( - $input:CreatePeerLiquidityWithdrawalInput! + $input: CreatePeerLiquidityWithdrawalInput! ) { - createPeerLiquidityWithdrawal(input:$input) { + createPeerLiquidityWithdrawal(input: $input) { code success message - error} + error + } } ``` -The following are example `input` parameters for the `CreatePeerLiquidityWithdrawal` mutation query above. + + +#### Example -```sh + + +```json { -"input": {"id":"421fae87-9a59-4217-9ff8-faf55ffab9c6", -"peerId":"73158598-2e0c-4973-895e-aebd115af260", -"amount":"100", -"timeoutSeconds":0 -} + "input": { + "id": "421fae87-9a59-4217-9ff8-faf55ffab9c6", + "peerId": "73158598-2e0c-4973-895e-aebd115af260", + "amount": "100", + "idempotencyKey": "b97fd85a-126e-42ef-b40d-1a50a70ffa6f", + "timeoutSeconds": 0 + } } ``` + + +| Variable | Description | +| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | The id of the transfer (withdrawal) | +| `peerId` | The id of the peer to withdraw liquidity from | +| `amount` | Amount of liquidity to withdraw | +| `idempotencyKey` | Unique key to ensure duplicate or retried requests are processed only once | +| `timeoutSeconds` | Interval, in seconds, after a pending transfer is initiated at which it can be posted or voided (zero denotes a no timeout, single-phase posted transfer) | + +If the peer liquidity withdrawal was successful, `CreatePeerLiquidityWithdrawal` returns `true`. + +### Deposit and withdraw peer liquidity using Rafiki Admin + +Peer liquidity can also be added through the [Rafiki Admin](/admin/admin-user-guide/#edit-peer) application. Navigate to the liquidity information section on the main Peers page and then select deposit or withdraw liquidity. + ## Payment Liquidity When Open Payments incoming or outgoing payments are created, your Rafiki instance creates a liquidity account within the accounting database. Liquidity must be deposited into an outgoing payment before the payment can be processed. Rafiki will notify you to deposit liquidity via the `outgoing_payment.created` webhook event. Similarly, packets received for an incoming payment increase its liquidity account. Rafiki will notify you to withdraw that liquidity via the `incoming_payment.completed` webhook event. -### Incoming payment +### Withdraw incoming payment liquidity using the `CreateIncomingPaymentWithdrawal` mutation -You can withdraw incoming payment liquidity via the `CreateIncomingPaymentWithdrawal` mutation query: + -```sh +```graphql mutation CreateIncomingPaymentWithdrawal( - $input:CreateIncomingPaymentWithdrawalInput! + $input: CreateIncomingPaymentWithdrawalInput! ) { - createIncomingPaymentWithdrawal(input:$input) { + createIncomingPaymentWithdrawal(input: $input) { code error message @@ -174,71 +235,116 @@ mutation CreateIncomingPaymentWithdrawal( } ``` -The following are example `input` parameters for the `CreateIncomingPaymentWithdrawal` mutation query above. + + +#### Example + + -```sh -{ "input": {"incomingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052, "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", -"timeoutSeconds":0 +```json +{ + "input": { + "incomingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775", + "timeoutSeconds": 0 } } ``` -### Outgoing payment + + +| Variable | Description | +| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `incomingPaymentId` | The id of the incoming payment to withdraw from | +| `idempotencyKey` | Unique key to ensure duplicate or retried requests are processed only once | +| `timeoutSeconds` | Interval, in seconds, after a pending transfer is initiated at which it can be posted or voided (zero denotes a no timeout, single-phase posted transfer) | + +If the incoming payment liquidity withdrawal was successful, `CreateIncomingPaymentWithdrawal` returns `true`. -You can deposit outgoing payment liquidity via the `DepositOutgoingPaymentLiquidity` mutation query: +### Deposit outgoing payment liquidity using the `DepositOutgoingPaymentLiquidity` mutation -```sh + + +```graphql mutation DepositOutgoingPaymentLiquidity( - $input:DepositOutgoingPaymentLiquidityInput!) -{ - depositOutgoingPaymentLiquidity(input:$input) { - code - error - message - success - } + $input: DepositOutgoingPaymentLiquidityInput! +) { + depositOutgoingPaymentLiquidity(input: $input) { + code + error + message + success + } } ``` -The following are example `input` parameters for the `DepositOutgoingPaymentLiquidity` mutation query above. + + +#### Example -```sh + + +```json { - "input":{ - "outgoingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775" + "input": { + "outgoingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" } } ``` -You can withdraw outgoing payment liquidity via the `CreateOutgoingPaymentWithdrawal` mutation: - -```sh -mutation -CreateOutgoingPaymentWithdrawal -( - $input:CreateOutgoingPaymentWithdrawalInput!) { - createOutgoingPaymentWithdrawal -(input:$input) { - code - error - message - success -} + + +| Variable | Description | +| ------------------- | -------------------------------------------------------------------------- | +| `outgoingPaymentId` | The id of the outgoing payment to deposit into | +| `idempotencyKey` | Unique key to ensure duplicate or retried requests are processed only once | + +If the outgoing payment liquidity deposit was successful, `DepositOutgoingPaymentLiquidity` returns `true`. + +### Withdraw outgoing payment liquidity using the `CreateOutgoingPaymentWithdrawal` mutation + + + +```graphql +mutation CreateOutgoingPaymentWithdrawal( + $input: CreateOutgoingPaymentWithdrawalInput! +) { + createOutgoingPaymentWithdrawal(input: $input) { + code + error + message + success + } } ``` -The following are example `input` parameters for the `CreateOutgoingPaymentWithdrawal` mutation query above. + + +#### Example + + -```sh -{"input": { - "outgoingPaymentId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775", - "timeoutSeconds":0 - } +```json +{ + "input": { + "outgoingPaymentId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775", + "timeoutSeconds": 0 + } } ``` + + +| Variable | Description | +| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `outgoingPaymentId` | The id of the outgoing payment to withdraw from | +| `idempotencyKey` | Unique key to ensure duplicate or retried requests are processed only once | +| `timeoutSeconds` | Interval, in seconds, after a pending transfer is initiated at which it can be posted or voided (zero denotes a no timeout, single-phase posted transfer) | + +If the outgoing payment liquidity withdrawal was successful, `CreateOutgoingPaymentWithdrawal` returns `true`. + ## Two-phase withdrawals Rafiki supports two-phase withdrawals via the `PostLiquidityWithdrawal` and `VoidLiquidityWithdrawal` mutations. When a withdrawal liquidity transaction is requested with a non-zero `timeout` value (zero denotes absence of a timeout), the transfer will be created as a two-phase transfer. If the timeout interval passes before the transfer is either posted or voided, the transfer expires and the full amount is returned to the original account. @@ -255,52 +361,80 @@ The following withdrawal transactions supports two-phase transfers: - Incoming payment withdrawal - Outgoing payment withdrawal -### Examples +### Post and commit a sucessful transfer using the `PostLiquidityWithdrawal` mutation -You can post a successful transfer via the `PostLiquidityWithdrawal` mutation query: + -```sh -mutation -PostLiquidityWithdrawal($input:PostLiquidityWithdrawalInput!) {postLiquidityWithdrawal -( -input:$input) { - code - error - message - success} +```graphql +mutation PostLiquidityWithdrawal($input: PostLiquidityWithdrawalInput!) { + postLiquidityWithdrawal(input: $input) { + code + error + message + success + } } ``` -The following are example `input` parameters for the `PostLiquidityWithdrawal` mutation query above. + -```sh +#### Example + + + +```json { - "input": { - "withdrawalId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", - "idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775"} + "input": { + "withdrawalId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" + } } ``` -You can void an unsuccessful transfer via the `VoidLiquidityWithdrawal` mutation query: - -```sh -mutation -VoidLiquidityWithdrawal($input:VoidLiquidityWithdrawalInput!) { - voidLiquidityWithdrawal -(input:$input) { - code - error - message - success} + + +| Variable | Description | +| ---------------- | -------------------------------------------------------------------------- | +| `withdrawalId` | The id of the liquidity withdrawal to post | +| `idempotencyKey` | Unique key to ensure duplicate or retried requests are processed only once | + +If the liquidity withdrawal was successfully posted, `PostLiquidityWithdrawal` returns `true`. + +### Void and rollback an unsuccessful transfer using the `VoidLiquidityWithdrawal` mutation + + + +```graphql +mutation VoidLiquidityWithdrawal($input: VoidLiquidityWithdrawalInput!) { + voidLiquidityWithdrawal(input: $input) { + code + error + message + success + } } ``` -The following are example `input` parameters for the `VoidLiquidityWithdrawal` mutation query above. + + +#### Example -```sh -{"input": { - "withdrawalId":"b4f85d5c-652d-472d-873c-4ba2a5e39052", -"idempotencyKey":"a09b730d-8610-4fda-98fa-ec7acb19c775" - } + + +```json +{ + "input": { + "withdrawalId": "b4f85d5c-652d-472d-873c-4ba2a5e39052", + "idempotencyKey": "a09b730d-8610-4fda-98fa-ec7acb19c775" + } } ``` + + + +| Variable | Description | +| ---------------- | -------------------------------------------------------------------------- | +| `withdrawalId` | The id of the liquidity withdrawal to void | +| `idempotencyKey` | Unique key to ensure duplicate or retried requests are processed only once | + +If the liquidity withdrawal was successfully voided and rolled back, `VoidLiquidityWithdrawal` returns `true`. diff --git a/packages/documentation/src/content/docs/integration/requirements/assets.mdx b/packages/documentation/src/content/docs/integration/requirements/assets.mdx index 9f052adca2..4bab508101 100644 --- a/packages/documentation/src/content/docs/integration/requirements/assets.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/assets.mdx @@ -7,9 +7,9 @@ import { Mermaid, CodeBlock, LinkOut } from '@interledger/docs-design-system' Assets in Rafiki can be added through the Backend Admin API or the Rafiki Admin application. -## Add an asset using the `createAsset` GraphQL mutation +## Add an asset using the `CreateAsset` GraphQL mutation - + ```graphql mutation CreateAsset($input: CreateAssetInput!) { @@ -30,7 +30,7 @@ mutation CreateAsset($input: CreateAssetInput!) { ### Example -To add US dollars, for example, as an asset type to your Rafiki instance, call the `createAsset` mutation and pass the `input` parameters for the asset `code`, represented by its ISO 4217 currency code (USD), and `scale` variables as follows: +To add US dollars, for example, as an asset type to your Rafiki instance, call the `CreateAsset` mutation and pass the `input` parameters for the asset `code`, represented by its ISO 4217 currency code (USD), and `scale` variables as follows: From 54b9d7926413a5d60c6330daaa4e356c33347961 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Fri, 6 Sep 2024 18:00:27 -0400 Subject: [PATCH 68/91] docs: wallet and webhook updates --- .../requirements/wallet-addresses.mdx | 56 ++++++++----------- .../requirements/webhook-events.mdx | 3 - .../docs/overview/concepts/open-payments.mdx | 2 +- .../docs/resources/webhook-event-types.mdx | 2 +- 4 files changed, 25 insertions(+), 38 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx b/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx index e801ca665f..03d62e700d 100644 --- a/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/wallet-addresses.mdx @@ -5,10 +5,6 @@ title: Wallet addresses import { LinkOut } from '@interledger/docs-design-system' import { CodeBlock } from '@interledger/docs-design-system' -:::danger -Creating key pairs is more of an optional thing than anything. It can stay a part of this doc but it should be its own section. The section should reference the open payments docs somewhere. The key pairs are only needed if the ASE wants to allow their users to use/be OP clients under their wallet addresses. -::: - Each payment account belonging to your users (e.g., customers) must have at least one associated wallet address for the account to be able to send and receive payments over Interledger and Open Payments. A wallet address serves as a publicly shareable standardized ID for a payment account. :::note @@ -23,15 +19,11 @@ There are a few ways in which you can create wallet addresses. - [In response to the `wallet_address.not_found` webhook event](#create-wallet-addresses-in-response-to-a-webhook-event) - [In the Rafiki Admin app](#create-and-manage-wallet-addresses-using-rafiki-admin) -All wallet addresses must also be associated with at least one [public-private key pair](#create-a-wallet-address-key-pair) to sign API requests. If you use Rafiki Admin to create wallet addresses, this happens automatically. - ### Create wallet addresses through a script Writing your own script that loops through your list of account is one way to batch create wallet addresses for your existing account holders. -Your script must first call the `createWalletAddress` GraphQL mutation, then call the [`createWalletAddressKey`](#create-a-wallet-address-key-pair) mutation for each new wallet address. - -We strongly recommend you store at least the `walletAddress.id` in your internal database to be able to reference the account and wallet address later. +Ensure your script calls the `createWalletAddress` GraphQL mutation. @@ -58,7 +50,9 @@ mutation CreateWalletAddress($input: CreateWalletAddressInput!) { -### Example +We strongly recommend you store at least the `walletAddress.id` in your internal database to be able to reference the account and wallet address later. + +#### Example @@ -122,17 +116,23 @@ mutation CreateWalletAddress($input: CreateWalletAddressInput!) { ### Create wallet addresses in response to a webhook event -The `wallet_address.not_found` event fires when a wallet address is requested through the Open Payments Get Wallet Address API, but Rafiki can't find the address. +The [`wallet_address.not_found`](/integration/requirements/webhook-events#wallet-address-not-found) event fires when a wallet address is requested through the Open Payments Get Wallet Address API, but Rafiki can't find the address. -When you receive the event, look up the associated account in your system, then call the `createWalletAddress` and `createWalletAddressKey` mutations to create the address and its public-private key pair. +When you receive the event, look up the associated account in your system, then call the `createWalletAddress` mutation to create a wallet address for the account. ---- +The mutation and example JSON request/response is the same as what's given [above](#create-wallet-addresses-through-a-script). + +### Create and manage wallet addresses using Rafiki Admin + +You can create and manage wallet addresses manually through the [Rafiki Admin](/admin/admin-user-guide#create-wallet-address) app. ## Create a wallet address key pair -A wallet address must be associated with at least one public-private key pair to sign Open Payment API requests. The public key enables clients, such as mobile apps, to verify request signatures. +Creating a public-private key pair for each wallet address is not required when integrating with Rafiki. -Add a key pair to a wallet address using the `createWalletAddressKey` GraphQL mutation. +You only need to create key pairs for wallet addresses if you want to allow your account holders to use/be Open Payments clients under their wallet addresses. For more information, review the Open Payments documentation about clients and client keys. + +Use the `createWalletAddressKey` GraphQL mutation to create a key pair and associate it with a wallet address. @@ -182,23 +182,17 @@ mutation CreateWalletAddressKey($input: CreateWalletAddressKeyInput!) { -A JSON web key is a JSON data structure that represents a cryptographic key. +The request is a standard request to create a JSON Web Key (JWK), which is a JSON data structure that represents a cryptographic key. Section 4 of the JWK specification describes the format and associated parameters `kty`, `alg`, and `kid`. Section 6 of the JSON Web Algorithms (JWA) specification describes the cryptographic algorithm for the keys and associated parameters `kty`, `crv`, and `x`. -In Section 4 of the JSON Web Key (JWK) specification describes the JWK format and associated -parameters (kty, alg, kid). +Open Payments requires the following values. -In Section 6 of the JSON Web Algorithms (JWA) specification describes the cryptographic -algorithm for keys (incl parameters kty, crv, x) +| Parameter | Required value | Description | +| --------- | -------------- | ----------------------------------------------------------------------------- | +| `alg` | `EdDSA` | The algorithm used to generate the key pair | +| `kty` | `OKP` | The key type identifying the cryptographic algorithm family used with the key | +| `crv` | `Ed25519` | The cryptographic curve used with the key | -| Variable | Description | -| ----------------- | -------------------------------------------- | -| `jwk` | JSON web key object that represents the keys | -| `kid` | A key ID that identifies the keys | -| `x` | The base64 url-encoded public key | -| `alg` | The algorithm used to generate the key pair | -| `kty` | . | -| `crv` | . | -| `walletAddressId` | . | +Additionally, the request must contain the `walletAddressId` of the wallet address that the key pair will be associated with. @@ -228,7 +222,3 @@ algorithm for keys (incl parameters kty, crv, x) ``` - -## Create and manage wallet addresses using Rafiki Admin - -You can create and manage wallet addresses manually through the [Rafiki Admin](/admin/admin-user-guide#create-wallet-address) app. If you use Rafiki Admin to create wallet addresses, it will assign each address a public-private key pair automatically. diff --git a/packages/documentation/src/content/docs/integration/requirements/webhook-events.mdx b/packages/documentation/src/content/docs/integration/requirements/webhook-events.mdx index fc90d79883..6b6a4757f0 100644 --- a/packages/documentation/src/content/docs/integration/requirements/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/webhook-events.mdx @@ -2,9 +2,6 @@ title: Webhook events tableOfContents: maxHeadingLevel: 4 -banner: - content: | - MELISSA IS STILL WORKING ON THIS PAGE --- import { Badge, Tabs, TabItem, Steps } from '@astrojs/starlight/components' diff --git a/packages/documentation/src/content/docs/overview/concepts/open-payments.mdx b/packages/documentation/src/content/docs/overview/concepts/open-payments.mdx index 883b3f92a3..b6f53ecce9 100644 --- a/packages/documentation/src/content/docs/overview/concepts/open-payments.mdx +++ b/packages/documentation/src/content/docs/overview/concepts/open-payments.mdx @@ -29,7 +29,7 @@ We strongly encourage you to familiarize yourself with the Open Payments standar Grant negotiation and authorization -## Rafiki's `backend` service +## Rafiki's backend service Rafiki’s [`backend`](/integration/services/backend-service) service is the main service for handling business logic and external communication. The service is responsible for, among other things, exposing the endpoints of the Open Payments APIs for clients to perform account management tasks. Every request and response is validated against the Open Payments specification. diff --git a/packages/documentation/src/content/docs/resources/webhook-event-types.mdx b/packages/documentation/src/content/docs/resources/webhook-event-types.mdx index 26a103f568..4e30cb87c2 100644 --- a/packages/documentation/src/content/docs/resources/webhook-event-types.mdx +++ b/packages/documentation/src/content/docs/resources/webhook-event-types.mdx @@ -2,7 +2,7 @@ title: Webhook event types --- -The following is an enumeration of all the event types along with their descriptions, which you must listen to and handle. +The following is an enumeration of all of Rafiki's [webhook event](/integration/requirements/webhook-events) types along with their descriptions, which you must listen to and handle. | Value | Description | | --------------------------------- | ---------------------------------------------------------------------------------- | From 9a4025d70d4011633c0e35fed74029efc2bd49fb Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Sat, 7 Sep 2024 15:29:18 +0200 Subject: [PATCH 69/91] docs: mi/environment-variables-update --- packages/documentation/astro.config.mjs | 2 +- .../content/docs/integration/prod/nginx.mdx | 2 +- .../docs/resources/environment-variables.mdx | 20 +++++++++++++++++-- .../src/partials/variables-warning.mdx | 4 ++-- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index 0b2ac4fbdd..6066335726 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -123,7 +123,7 @@ export default defineConfig({ ] }, { - label: 'Docker', + label: 'Docker Compose', link: '/integration/prod/nginx' }, { diff --git a/packages/documentation/src/content/docs/integration/prod/nginx.mdx b/packages/documentation/src/content/docs/integration/prod/nginx.mdx index 859566c662..0e0947659d 100644 --- a/packages/documentation/src/content/docs/integration/prod/nginx.mdx +++ b/packages/documentation/src/content/docs/integration/prod/nginx.mdx @@ -1,5 +1,5 @@ --- -title: nginx +title: Docker Compose --- This is an example deployment of Rafiki on a Linux virtual machine using nginx as a reverse proxy. You must change the values in the examples appropriate for your environment. diff --git a/packages/documentation/src/content/docs/resources/environment-variables.mdx b/packages/documentation/src/content/docs/resources/environment-variables.mdx index dd2ae09b18..cf751460ea 100644 --- a/packages/documentation/src/content/docs/resources/environment-variables.mdx +++ b/packages/documentation/src/content/docs/resources/environment-variables.mdx @@ -2,13 +2,28 @@ title: Environment variables --- -import { LinkOut } from '@interledger/docs-design-system' +import { LinkOut, CodeBlock } from '@interledger/docs-design-system' import BackEnv from '/src/partials/backend-variables.mdx' import AuthEnv from '/src/partials/auth-variables.mdx' import FrontEnv from '/src/partials/frontend-variables.mdx' import VarWarn from '/src/partials/variables-warning.mdx' -To run Rafiki you must set the environment variables for the `backend`, `auth` and `frontend` services listed below. +Environment variables are key value pairs that are used to configure how your Rafiki instance will run within your infrastructure and integrate with your systems. + +Each environment variable name is uppercase, followed by an equal sign and the value of the variable. + + +``` + +WEBHOOKS_URL=http://my-business/webhooks + +``` + + + +The environment variable in the example above specifies the HTTP endpoint at which you want your Rafiki instance to send you notifications of webhook events. + +To run Rafiki you must set the environment variables for the `backend`, `auth` and `frontend` services where listed as required below. @@ -23,3 +38,4 @@ To run Rafiki you must set the environment variables for the `backend`, `auth` a ## Frontend +``` diff --git a/packages/documentation/src/partials/variables-warning.mdx b/packages/documentation/src/partials/variables-warning.mdx index 2171423399..0096bc8eed 100644 --- a/packages/documentation/src/partials/variables-warning.mdx +++ b/packages/documentation/src/partials/variables-warning.mdx @@ -1,8 +1,8 @@ import { LinkOut } from '@interledger/docs-design-system' :::caution -If you are running Rafiki via Docker, then you must update the variables in the docker-compose files of the respective services. +If you are running Rafiki via Docker, you must update the variables in the `docker-compose.yml` files of the respective services. -If you are running Rafiki via Helm and Kubernetes, then you must update the variables in the values.yaml file of the example Helm chart. +If you are running Rafiki via Helm and Kubernetes, you must update the variables in the values.yaml file of the Helm chart template. ::: From 08dc85ccdd1f47757f9c618e0a7a1279bde48a07 Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Sat, 7 Sep 2024 16:45:31 +0200 Subject: [PATCH 70/91] docs: mi/nginx-docker-compose-update --- .../content/docs/integration/prod/nginx.mdx | 141 +----------------- 1 file changed, 5 insertions(+), 136 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/prod/nginx.mdx b/packages/documentation/src/content/docs/integration/prod/nginx.mdx index 0e0947659d..d34e65093f 100644 --- a/packages/documentation/src/content/docs/integration/prod/nginx.mdx +++ b/packages/documentation/src/content/docs/integration/prod/nginx.mdx @@ -22,7 +22,7 @@ certbot certonly --manual --preferred-challenges=dns --email EMAIL --server http ​ :::note -Domain can be in wildcard format. You will also need to update TXT record in this step +Domain can be in wildcard format. You will also need to update the TXT record in this step. ::: As Let's encrypt certificates are valid for 90 days, you must set up a cron process to renew the certificate on a regular schedule: @@ -43,143 +43,12 @@ Next update the DNS records to point to the static external IP address of the vo | connector | connector.DOMAIN | connector.myrafiki.com | | admin | admin.DOMAIN | admin.myrafiki.com | | ilp | ilp.DOMAIN | ilp.myrafiki.com | -| autopeer | autopeer.DOMAIN | autopeer.myrafiki.com | ## Server preparation Create nginx configuration files for every exposed domain: -### Happy Life Bank - -#### Auth - -```sh -server { - server_name auth.myrafiki.com; - - listen 443 ssl; - - ssl_certificate /etc/letsencrypt/live/auth.myrafiki.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/auth.myrafiki.com/privkey.pem; - - include /etc/letsencrypt/options-ssl-nginx.conf; - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; - - location / { - proxy_http_version 1.1; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade ""; - proxy_set_header Connection ""; - proxy_set_header Host $server_name; - proxy_set_header Accept-Encoding ""; - proxy_cache_bypass $http_upgrade; - - proxy_pass_request_headers on; - - proxy_pass http://localhost:3002; - } -} - -server { - server_name auth.myrafiki.com; - - listen 80; - - if ($host = auth.myrafiki.com) { - return 301 https://$host$request_uri; - } - - return 404; -} -``` - -#### Admin - -```sh - - server_name admin.myrafiki.com; - - listen 443 ssl; - - ssl_certificate /etc/letsencrypt/live/admin.myrafiki.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/admin.myrafiki.com/privkey.pem; - - include /etc/letsencrypt/options-ssl-nginx.conf; - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; - - location / { - proxy_http_version 1.1; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade ""; - proxy_set_header Connection ""; - proxy_set_header Host $server_name; - proxy_set_header Accept-Encoding ""; - proxy_cache_bypass $http_upgrade; - - proxy_pass_request_headers on; - - proxy_pass http://localhost:4010; - } -} - -server { - server_name admin.myrafiki.com; - - listen 80; - - if ($host = admin.myrafiki.com) { - return 301 https://$host$request_uri; - } - - return 404; -} -``` - -#### ILP - -```sh -server { - server_name ilp.myrafiki.com; - - listen 443 ssl; - - ssl_certificate /etc/letsencrypt/live/ilp.myrafiki.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/ilp.myrafiki.com/privkey.pem; - - include /etc/letsencrypt/options-ssl-nginx.conf; - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; - - location / { - proxy_http_version 1.1; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade ""; - proxy_set_header Connection ""; - proxy_set_header Host $server_name; - proxy_set_header Accept-Encoding ""; - proxy_cache_bypass $http_upgrade; - - proxy_pass_request_headers on; - - proxy_pass http://localhost:4000; - } -} - -server { - server_name ilp.myrafiki.com; - - listen 80; - - if ($host = ilp.myrafiki.com) { - return 301 https://$host$request_uri; - } - - return 404; -} -``` - -### Cloud Nine Wallet - -#### Auth +### Auth ```sh server { @@ -221,7 +90,7 @@ server { } ``` -#### Admin +### Admin ```sh @@ -263,7 +132,7 @@ server { } ``` -#### ILP +### ILP ```sh server { @@ -305,7 +174,7 @@ server { } ``` -#### Connector +### Connector ```sh server { From feb1f82f8aa1dfa3bd9c59bf4ea8538cbaef3b4c Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Sat, 7 Sep 2024 16:55:31 +0200 Subject: [PATCH 71/91] docs: mi/docker-compose-update --- .../content/docs/integration/prod/nginx.mdx | 69 +++++++++---------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/packages/documentation/src/content/docs/integration/prod/nginx.mdx b/packages/documentation/src/content/docs/integration/prod/nginx.mdx index d34e65093f..4defcbd457 100644 --- a/packages/documentation/src/content/docs/integration/prod/nginx.mdx +++ b/packages/documentation/src/content/docs/integration/prod/nginx.mdx @@ -20,7 +20,6 @@ Generate the Let’s encrypt certificates: certbot certonly --manual --preferred-challenges=dns --email EMAIL --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d DOMAIN ``` -​ :::note Domain can be in wildcard format. You will also need to update the TXT record in this step. ::: @@ -39,25 +38,25 @@ Next update the DNS records to point to the static external IP address of the vo | service | URL | example | | --------- | ---------------- | ---------------------- | +| admin | admin.DOMAIN | admin.myrafiki.com | | auth | auth.DOMAIN | auth.myrafiki.com | | connector | connector.DOMAIN | connector.myrafiki.com | -| admin | admin.DOMAIN | admin.myrafiki.com | | ilp | ilp.DOMAIN | ilp.myrafiki.com | ## Server preparation Create nginx configuration files for every exposed domain: -### Auth +### Admin ```sh -server { - server_name auth.myrafiki.com; + + server_name admin.myrafiki.com; listen 443 ssl; - ssl_certificate /etc/letsencrypt/live/auth.myrafiki.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/auth.myrafiki.com/privkey.pem; + ssl_certificate /etc/letsencrypt/live/admin.myrafiki.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/admin.myrafiki.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; @@ -73,16 +72,16 @@ server { proxy_pass_request_headers on; - proxy_pass http://localhost:3002; + proxy_pass http://localhost:4010; } } server { - server_name auth.myrafiki.com; + server_name admin.myrafiki.com; listen 80; - if ($host = auth.myrafiki.com) { + if ($host = admin.myrafiki.com) { return 301 https://$host$request_uri; } @@ -90,16 +89,16 @@ server { } ``` -### Admin +### Auth ```sh - - server_name admin.myrafiki.com; +server { + server_name auth.myrafiki.com; listen 443 ssl; - ssl_certificate /etc/letsencrypt/live/admin.myrafiki.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/admin.myrafiki.com/privkey.pem; + ssl_certificate /etc/letsencrypt/live/auth.myrafiki.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/auth.myrafiki.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; @@ -115,16 +114,16 @@ server { proxy_pass_request_headers on; - proxy_pass http://localhost:4010; + proxy_pass http://localhost:3002; } } server { - server_name admin.myrafiki.com; + server_name auth.myrafiki.com; listen 80; - if ($host = admin.myrafiki.com) { + if ($host = auth.myrafiki.com) { return 301 https://$host$request_uri; } @@ -132,16 +131,15 @@ server { } ``` -### ILP +### Connector ```sh server { - server_name ilp.myrafiki.com; + server_name connector.myrafiki.com; listen 443 ssl; - - ssl_certificate /etc/letsencrypt/live/ilp.myrafiki.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/ilp.myrafiki.com/privkey.pem; + ssl_certificate /etc/letsencrypt/live/connector.myrafiki.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/connector.myrafiki.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; @@ -157,32 +155,33 @@ server { proxy_pass_request_headers on; - proxy_pass http://localhost:4000; + proxy_pass http://localhost:3002; } } server { - server_name ilp.myrafiki.com; + server_name connector.myrafiki.com; listen 80; - if ($host = ilp.myrafiki.com) { - return 301 https://$host$request_uri; + if ($host = connector.myrafiki.com) { + return 301 https://$host$request_uri; } return 404; } ``` -### Connector +### ILP ```sh server { - server_name connector.myrafiki.com; + server_name ilp.myrafiki.com; listen 443 ssl; - ssl_certificate /etc/letsencrypt/live/connector.myrafiki.com/fullchain.pem; # managed by Certbot - ssl_certificate_key /etc/letsencrypt/live/connector.myrafiki.com/privkey.pem; # managed by Certbot + + ssl_certificate /etc/letsencrypt/live/ilp.myrafiki.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/ilp.myrafiki.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; @@ -198,17 +197,17 @@ server { proxy_pass_request_headers on; - proxy_pass http://localhost:3002; + proxy_pass http://localhost:4000; } } server { - server_name connector.myrafiki.com; + server_name ilp.myrafiki.com; listen 80; - if ($host = connector.myrafiki.com) { - return 301 https://$host$request_uri; + if ($host = ilp.myrafiki.com) { + return 301 https://$host$request_uri; } return 404; From 686fb7fc8ce0e87b4edb2e567042d5941afc6eaa Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Sat, 7 Sep 2024 18:48:27 +0200 Subject: [PATCH 72/91] docs: mi/webhook-event-types --- .../docs/resources/webhook-event-types.mdx | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/documentation/src/content/docs/resources/webhook-event-types.mdx b/packages/documentation/src/content/docs/resources/webhook-event-types.mdx index 4e30cb87c2..4291ef7fa9 100644 --- a/packages/documentation/src/content/docs/resources/webhook-event-types.mdx +++ b/packages/documentation/src/content/docs/resources/webhook-event-types.mdx @@ -2,17 +2,19 @@ title: Webhook event types --- +Webhooks notify you of specific events that occur within your Rafiki instance allowing you to integrate Interledger payments with your system and business processes. For example, Rafiki will notify you when one of your account holders has received an Interledger payment, at which point you would credit their account on your ledger. + The following is an enumeration of all of Rafiki's [webhook event](/integration/requirements/webhook-events) types along with their descriptions, which you must listen to and handle. -| Value | Description | -| --------------------------------- | ---------------------------------------------------------------------------------- | -| `incoming_payment.created` | An incoming payment has been created. | -| `incoming_payment.completed` | An incoming payment is complete and will not accept any additional incoming funds. | -| `incoming_payment.expired` | An incoming payment expired and will not accept any additional incoming funds. | -| `outgoing_payment.created` | An outgoing payment was created. | -| `outgoing_payment.completed` | An outgoing payment completed. | -| `outgoing_payment.failed` | An outgoing payment partially or completely failed. | -| `wallet_address.not_found` | A requested wallet address was not found. | -| `wallet_address.web_monetization` | Web Monetization payments received via STREAM. | -| `asset.liquidity_low` | Asset liquidity has dropped below defined threshold. | -| `peer.liquidity_low` | Peer liquidity has dropped below defined threshold. | +| Value | Description | +| -------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | +| [`incoming_payment.created`](/integration/requirements/webhook-events/#incoming-payment-created) | An incoming payment has been created. | +| [`incoming_payment.completed`](/integration/requirements/webhook-events/#incoming-payment-completed) | An incoming payment is complete and will not accept any additional incoming funds. | +| [`incoming_payment.expired`](/integration/requirements/webhook-events/#incoming-payment-expired) | An incoming payment expired and will not accept any additional incoming funds. | +| [`outgoing_payment.created`](/integration/requirements/webhook-events/#outgoing-payment-created) | An outgoing payment was created. | +| [`outgoing_payment.completed`](/integration/requirements/webhook-events/#outgoing-payment-completed) | An outgoing payment completed. | +| [`outgoing_payment.failed`](/integration/requirements/webhook-events/#outgoing-payment-failed) | An outgoing payment partially or completely failed. | +| [`wallet_address.not_found`](/integration/requirements/webhook-events/#wallet-address-not-found) | A requested wallet address was not found. | +| [`wallet_address.web_monetization`](/integration/requirements/webhook-events/#wallet-address-web-monetization) | Web Monetization payments received via STREAM. | +| [`asset.liquidity_low`](/integration/requirements/webhook-events/#asset-liquidity-low) | Asset liquidity has dropped below defined threshold. | +| [`peer.liquidity_low`](/integration/requirements/webhook-events/#peer-liquidity-low) | Peer liquidity has dropped below defined threshold. | From d39379362c5bdf9458d3229cf273b89244a1d0c8 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Sat, 7 Sep 2024 19:03:51 -0400 Subject: [PATCH 73/91] docs: edit to overview --- .../documentation/src/content/docs/overview/overview.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/documentation/src/content/docs/overview/overview.mdx b/packages/documentation/src/content/docs/overview/overview.mdx index 21d54370ef..44a0268394 100644 --- a/packages/documentation/src/content/docs/overview/overview.mdx +++ b/packages/documentation/src/content/docs/overview/overview.mdx @@ -17,19 +17,19 @@ Implementing and maintaining the Interledger Protocol (ILP) stack on your own ca about ASEs](#more-about-account-servicing-entities) -## Real-world use cases +## Use cases ### Peer-to-peer payments -Rafiki enables seamless peer-to-peer payments, including cross-currency transactions. Users can transfer funds directly to each other’s accounts, regardless of their respective currencies, leveraging the interoperability of the Interledger network. +In the context of Rafiki, a peer is another ASE with whom you transact. Forming a peering relationship requires you to both agree on the currency in which you will transact, on a settlement mechanism and cadence, and other details. Interledger creates interoperability between different payment systems and currencies, making it easier for peers to directly transact with one another. ### eCommerce payments -Rafiki facilitates eCommerce transactions for both one-time purchases and recurring subscriptions. ASEs can integrate Rafiki into their platforms to offer customers flexible payment options and streamline the checkout process. +If a merchant accepts Interledger as a payment method, then a customer can pay using their wallet address instead of entering, for example, a credit card number and other personal details on the merchant’s site. Rafiki’s implementation of Interledger and Open Payments means your account holders can use their wallet addresses for both one-time purchases and recurring purchases, such as subscriptions, anywhere Interledger is an accepted payment method. ### Web Monetization -Websites can implement Web Monetization, a browser API that enables the streaming of payments directly from web site visitors to site owners. Rafiki provides support for Web Monetization payment flows right out of the box. +With Web Monetization, site visitors can pay an amount of their choosing to a participating site with little to no interaction. Both the site and the site visitor must have an Open Payments-enabled wallet address in order to receive and send payments. Rafiki’s implementation of Interledger’s Simple Payment Setup Protocol (SPSP) and the Open Payments standard means you can assign one or more wallet addresses to your account holders’ accounts, making these accounts support incoming and outgoing Web Monetization payments right out of the box. ## Interledger From 89f08f2a841f5a281a036102676d7bb2ae30e3b7 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Sun, 8 Sep 2024 09:35:24 -0400 Subject: [PATCH 74/91] docs: fix error Copy/paste put the wrong quotation marks around linkout href --- packages/documentation/src/content/docs/overview/overview.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/documentation/src/content/docs/overview/overview.mdx b/packages/documentation/src/content/docs/overview/overview.mdx index 44a0268394..bc85eb4801 100644 --- a/packages/documentation/src/content/docs/overview/overview.mdx +++ b/packages/documentation/src/content/docs/overview/overview.mdx @@ -29,7 +29,7 @@ If a merchant accepts Interledger as a payment method, then a customer can pay u ### Web Monetization -With Web Monetization, site visitors can pay an amount of their choosing to a participating site with little to no interaction. Both the site and the site visitor must have an Open Payments-enabled wallet address in order to receive and send payments. Rafiki’s implementation of Interledger’s Simple Payment Setup Protocol (SPSP) and the Open Payments standard means you can assign one or more wallet addresses to your account holders’ accounts, making these accounts support incoming and outgoing Web Monetization payments right out of the box. +With Web Monetization, site visitors can pay an amount of their choosing to a participating site with little to no interaction. Both the site and the site visitor must have an Open Payments-enabled wallet address in order to receive and send payments. Rafiki’s implementation of Interledger’s Simple Payment Setup Protocol (SPSP) and the Open Payments standard means you can assign one or more wallet addresses to your account holders’ accounts, making these accounts support incoming and outgoing Web Monetization payments right out of the box. ## Interledger From 7e7fa6708f819ec5b12ffb86bcfcad8c5cc2fb09 Mon Sep 17 00:00:00 2001 From: Sarah Jones Date: Mon, 9 Sep 2024 10:47:27 +0200 Subject: [PATCH 75/91] chore: included generated api docs (#2943) --- packages/documentation/astro.config.mjs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index 6066335726..9d7c30f809 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -223,6 +223,20 @@ export default defineConfig({ { label: 'GraphQL Admin APIs', link: '/apis/graphql/admin-api-overview' + }, + { + label: 'Backend Admin API', + collapsed: true, + autogenerate: { + directory: 'apis/graphql/backend' + } + }, + { + label: 'Auth Admin API', + collapsed: true, + autogenerate: { + directory: 'apis/graphql/auth' + } } ] } From dc8762290181f34a0efd3cf1f11bbd34969f5e88 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Mon, 9 Sep 2024 12:12:35 -0400 Subject: [PATCH 76/91] Update packages/documentation/src/content/docs/overview/concepts/accounts-transfers-liquidity.mdx Co-authored-by: Sarah Jones --- .../docs/overview/concepts/accounts-transfers-liquidity.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/documentation/src/content/docs/overview/concepts/accounts-transfers-liquidity.mdx b/packages/documentation/src/content/docs/overview/concepts/accounts-transfers-liquidity.mdx index a297c69ff4..f6d0bf8400 100644 --- a/packages/documentation/src/content/docs/overview/concepts/accounts-transfers-liquidity.mdx +++ b/packages/documentation/src/content/docs/overview/concepts/accounts-transfers-liquidity.mdx @@ -40,7 +40,7 @@ Furthermore, an account servicing entity performing currency exchange must provi Assets are managed via the [Backend Admin API](/integration/services/backend-service#graphql-backend-admin-api) or the [Rafiki Admin application](/admin/admin-user-guide/). Wallet addresses are created for existing assets and are tied to those assets. -### The `asset` type +### The asset type The `asset` type in Rafiki consists of a value, an asset code, and an asset scale. From 6d2abecbd311fe2897dca09a6ae9b4bece79c6c2 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:02:39 -0400 Subject: [PATCH 77/91] docs: accounting updates and t tables --- packages/documentation/astro.config.mjs | 4 +- .../content/docs/admin/manage-liquidity.mdx | 2 +- .../src/content/docs/admin/manage-peering.mdx | 2 +- .../requirements/webhook-events.mdx | 4 +- .../docs/overview/concepts/accounting.mdx | 1218 +++++++++++++++++ .../src/content/docs/overview/overview.mdx | 2 +- 6 files changed, 1225 insertions(+), 7 deletions(-) create mode 100644 packages/documentation/src/content/docs/overview/concepts/accounting.mdx diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index 9d7c30f809..47a0c9af0a 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -65,8 +65,8 @@ export default defineConfig({ collapsed: true, items: [ { - label: 'Accounts, transfers, and liquidity', - link: '/overview/concepts/accounts-transfers-liquidity' + label: 'Accounting', + link: '/overview/concepts/accounting' }, { label: 'Interledger', diff --git a/packages/documentation/src/content/docs/admin/manage-liquidity.mdx b/packages/documentation/src/content/docs/admin/manage-liquidity.mdx index 1c0546904c..906ff80d44 100644 --- a/packages/documentation/src/content/docs/admin/manage-liquidity.mdx +++ b/packages/documentation/src/content/docs/admin/manage-liquidity.mdx @@ -4,7 +4,7 @@ title: Manage liquidity import { CodeBlock, LinkOut } from '@interledger/docs-design-system' -As an implementation of the Interledger Protocol, Rafiki provides [accounting](/overview/concepts/accounts-transfers-liquidity) between transacting parties but doesn’t handle settlement. You and the account servicing entities you decide to peer with must agree on the means and how often you will settle your accounts. Consequently, Rafiki can manage the liquidity used to fund payments made through the Interledger network. +As an implementation of the Interledger Protocol, Rafiki provides [accounting](/overview/concepts/accounting) between transacting parties but doesn’t handle settlement. You and the account servicing entities you decide to peer with must agree on the means and how often you will settle your accounts. Consequently, Rafiki can manage the liquidity used to fund payments made through the Interledger network. As Rafiki supports several types of liquidity, we’ll cover the typical scenarios you’ll need to manage. diff --git a/packages/documentation/src/content/docs/admin/manage-peering.mdx b/packages/documentation/src/content/docs/admin/manage-peering.mdx index dfdd8b6ddd..6fab621d7d 100644 --- a/packages/documentation/src/content/docs/admin/manage-peering.mdx +++ b/packages/documentation/src/content/docs/admin/manage-peering.mdx @@ -11,7 +11,7 @@ To join the Interledger network and be able to send and receive payments, you mu Before you add a peer, you and the account servicing entity (ASE) you intend to peer with must both: - Run an implementation of an [Interledger connector](/integration/services/backend-service#interledger-connector) (ideally Rafiki). -- Agree on an [asset](/overview/concepts/accounts-transfers-liquidity#assets) for the peering relationship. You can set up multiple peering relationships with the same peer based on different assets. At least one asset shared by you and your peer must be added to your Rafiki instance prior to setting up the peering relationship. +- Agree on an [asset](/overview/concepts/accounting#assets) for the peering relationship. You can set up multiple peering relationships with the same peer based on different assets. At least one asset shared by you and your peer must be added to your Rafiki instance prior to setting up the peering relationship. - Agree on a `maxPacketAmount` value, which specifies how many packets a payment is split into. - Communicate your respective static Interledger (ILP) addresses. - Communicate a connection endpoint for the other peer to send packets to. diff --git a/packages/documentation/src/content/docs/integration/requirements/webhook-events.mdx b/packages/documentation/src/content/docs/integration/requirements/webhook-events.mdx index 6b6a4757f0..e2125e6a86 100644 --- a/packages/documentation/src/content/docs/integration/requirements/webhook-events.mdx +++ b/packages/documentation/src/content/docs/integration/requirements/webhook-events.mdx @@ -184,7 +184,7 @@ The incoming payment will either complete or expire. {' '} - An incoming payment + An incoming payment of $10 was completed. An outgoing payment + An outgoing payment for \$12 is complete. \$11.50 was sent. You choose to keep \$0.50 as a service fee. double-entry accounting. + +In this context, accounts in Rafiki are specifically the accounts that peers hold with one another. These are not customer accounts. This distinction is crucial for understanding how Rafiki handles transactions and settlements. + +### Liquidity accounts + +A liquidity account holds a non-negative balance, with Rafiki ensuring that total debits do not exceed total credits. + +There is one liquidity account for each of the following resources: + +- Asset +- Peer +- Wallet address (for SPSP/Web Monetization receiving) +- Incoming payment +- Outgoing payment + +### Settlement accounts + +A settlement account holds a non-positive balance, with Rafiki ensuring that total credits do not exceed total debits. A settlement account represents the total funds you as the ASE have deposited into Rafiki. + +Before you can peer with another ASE, you must both agree on the asset you will use for settlement. The Interledger packets exchanged between you and your peer will be denominated in the agreed-upon asset. + +There is one settlement account for each asset. + +### Assets + +An asset represents an item of value that can be transferred via the Interledger Protocol. Since the Interledger Protocol aims to create an internet of value, it allows for the transfer of any asset, not just currency. In practice, however, assets are usually denominated in a currency (fiat or branded currencies). + +In Rafiki, the `asset` type is comprised of the following properties. + +| Property | Type | Description | Example | +| ------------ | ------- | ---------------------------------------------------------------------------------------------------------------------- | ------- | +| `value ` | BigInt | A numerical amount | `10000` | +| `assetCode` | String | Should be an ISO 4217 currency code whenever possible | `"USD"` | +| `assetScale` | Integer | Difference in order of magnitude between the standard unit and a fractional unit | `2` | + +To convert an asset amount into a currency amount that's easier to read, apply the following formula: + +$currencyAmount = \frac{value}{10^{assetScale}}$ + +Using the example from the table above, our formula looks like this: + +$\frac{10000}{10^2} =100.00$ USD + +### TigerBeetle + +TigerBeetle is a high-performance distributed financial accounting database used by Rafiki’s `backend` service to store account balance data at the ILP layer. Both liquidity and settlement accounts in Rafiki correspond to TigerBeetle credit and debit accounts, respectively. TigerBeetle only holds balance data without any additional ILP packet metadata. For detailed information on TigerBeetle, including its consensus mechanism and its limitations, visit the official TigerBeetle documentation and blog. + +You have the flexibility to choose whether to use TigerBeetle or opt for a separate Postgres database. However, TigerBeetle is recommended due to its speed, efficiency, and dedicated design for handling double ledger accounting. For more information about Tigerbeetle in a production environment, see [Running Rafiki in production](/integration/prod/helm-k8s/#tigerbeetle). + +## Liquidity + +Rafiki tracks liquidity using the Interledger Protocol, which is a clearing protocol, without physically holding funds. + +### Asset liquidity + +Asset liquidity represents the value, denominated in a given asset, that Rafiki has at its disposal in which to send or forward ILP packets. Asset liquidity increases when packets are received and decreases when packets are sent. Asset liquidity is always positive and cannot fall below zero. + +Additionally, you must provide asset liquidity if you are exchanging one currency for another. Asset liquidity ensures there is enough value available to handle transactions in the specified assets. + +You should define and adjust asset liquidity based on your liquidity risk profile. + +#### Asset liquidity examples + +Your Rafiki instance is configured with two assets: EUR and USD. You've set both to have an asset scale of 0. Your EUR liquidity is 10, and your USD liquidity is 50. + +In a cross currency transaction: + +- Rafiki receives packets worth 10 EUR and sends packets worth 11 USD. Your EUR liquidity increases to 20 (10 + 10) and your USD liquidity decreases to 39 (50 - 11). +- Rafiki receives packets worth 50 EUR which equates to 55 USD. This transaction fails because Rafiki does not have enough USD liquidity. + +### Peer liquidity + +Peer liquidity is the credit line, denominated in the asset of the peering relationship, you extend to a peer. Peer liquidity should be defined in the peering agreement and depends on the trust between you and your peer. If peer liquidity is insufficient, payments will not be processed. When peer liquidity is used up, you and your peer should settle then reset your liquidity. + +:::note +A peering agreement is a legal contract between the parties involved in a peering relationship. It defines terms such as the assets involved, auth tokens, connection endpoints, and other operational details. It is not configured or managed within Rafiki but is necessary for establishing the terms under which assets are exchanged between peers. +::: + +#### Peer liquidity example + +Your peer, Cloud Nine Wallet, has a peer liquidity of 100 USD. Rafiki can send packets that total up to 100 USD to wallet addresses issued by Cloud Nine Wallet. + +After the 100 USD liquidity is used up, you settle with Cloud Nine Wallet and reset the peer liquidity in Rafiki to 100 USD. + +### Payment liquidity + +Payment liquidity is managed for incoming and outgoing payments created via Open Payments through liquidity accounts in your accounting database. When incoming or outgoing payments are created via the Open Payments APIs, a corresponding liquidity account is automatically created. Liquidity must be deposited to an outgoing payment account before the payment can be processed. You are notified to deposit or withdraw liquidity via [webhook events](/integration/requirements/webhook-events). + +## Transfers + +Transfers in Rafiki are based on double-entry accounting, increasing both the total debits (withdrawals )of one account and the total credits (deposits) of another by the same amount. + +### Single-phase transfer + +A single-phase transfer posts funds to accounts immediately when the transfer is created. + +### Two-phase transfer + +A two-phase transfer moves funds in stages. + +1. Reserve funds (`pending`) +2. Resolve funds (`post`, `void`, or `expire`) + +The name _two-phase transfer_ is a reference to the two-phase commit protocol for distributed transactions. + +### Intra-Rafiki transfer examples + +Remember that a settlement account will always have a zero or negative balance and a liquidity account will always have a zero or positive balance. + +#### Deposits + +A deposit is the act of debiting the settlement account and crediting the liquidity account. + +**Depositing asset liquidity** + +| Debit Account | Credit Account | +| ------------- | --------------- | +| Settlement | Asset liquidity | + +**Example:** Depositing `100 USD` + + + + + + + + + + +
    USD settlement acct USD asset liquidity acct
    + + + + + + + + + +
    DebitCredit
    100
    +
    + + + + + + + + + +
    DebitCredit
    100
    +
    + +**Depositing peer liquidity** + +| Debit Account | Credit Account | +| ------------- | -------------- | +| Settlement | Peer liquidity | + +**Example:** Peering relationship in USD, depositing `100 USD` + + + + + + + + + + +
    USD settlement acct USD peer liquidity acct
    + + + + + + + + + +
    DebitCredit
    100
    +
    + + + + + + + + + +
    DebitCredit
    100
    +
    + +**Depositing outgoing payment liquidity** + +| Debit Account | Credit Account | +| ------------- | ---------------- | +| Settlement | Outgoing payment | + +**Example:** Depositing `35 USD` + + + + + + + + + + +
    USD settlement acctUSD outgoing payment liquidity acct
    + + + + + + + + + +
    DebitCredit
    35
    +
    + + + + + + + + + +
    DebitCredit
    35
    +
    + +#### Withdrawals + +A withdrawal is the act of debiting the liquidity account and crediting the settlement account. + +**Withdrawing asset liquidity** + +| Debit Account | Credit Account | +| --------------- | -------------- | +| Asset liquidity | Settlement | + +**Example:** Withdrawing `50 USD` + + + + + + + + + + +
    USD asset liquidity acctUSD settlement acct
    + + + + + + + + + +
    DebitCredit
    50
    +
    + + + + + + + + + +
    DebitCredit
    50
    +
    + +**Withdrawing peer liquidity** + +| Debit Account | Credit Account | +| -------------- | -------------- | +| Peer liquidity | Settlement | + +**Example:** Peering relationship in USD, withdrawing `50 USD` + + + + + + + + + + +
    USD peer liquidity acctUSD settlement acct
    + + + + + + + + + +
    DebitCredit
    50
    +
    + + + + + + + + + +
    DebitCredit
    50
    +
    + +**Withdrawing wallet address liquidity** + +| Debit Account | Credit Account | +| -------------- | -------------- | +| Wallet address | Settlement | + +**Example:** Withdrawing `2 USD` + + + + + + + + + + +
    USD wallet address liquidity acctUSD settlement acct
    + + + + + + + + + +
    DebitCredit
    2
    +
    + + + + + + + + + +
    DebitCredit
    2
    +
    + +**Withdrawing incoming payment liquidity** + +| Debit Account | Credit Account | +| ---------------- | -------------- | +| Incoming payment | Settlement | + +**Example:** Withdrawing `25 USD` + + + + + + + + + + +
    USD incoming payment liquidity acctUSD settlement acct
    + + + + + + + + + +
    DebitCredit
    25
    +
    + + + + + + + + + +
    DebitCredit
    25
    +
    + +**Withdrawing outgoing payment liquidity** + +| Debit Account | Credit Account | +| ---------------- | -------------- | +| Outgoing payment | Settlement | + +**Example:** Withdrawing `1 USD` + + + + + + + + + + +
    USD outgoing payment liquidity acctUSD settlement acct
    + + + + + + + + + +
    DebitCredit
    1
    +
    + + + + + + + + + +
    DebitCredit
    1
    +
    + +#### Payments in the same asset + +**Simple Payment Setup Protocol (SPSP) / Web Monetization** + +| Debit Account | Credit Account | +| ---------------- | -------------- | +| Outgoing payment | Wallet address | + +**Example:** Send a Web Monetization Payment of `2 USD` over SPSP to a wallet address. Sender and receiver have wallet addresses at the same Rafiki. + + + + + + + + + + +
    USD outgoing payment liquidity acctUSD wallet address liquidity acct
    + + + + + + + + + +
    DebitCredit
    2
    +
    + + + + + + + + + +
    DebitCredit
    2
    +
    + +**Send amount < receive amount** + +| Debit Account | Credit Account | +| ---------------- | ---------------- | +| Outgoing payment | Incoming payment | +| Asset liquidity | Incoming payment | + +**Example:** Sender consented to a payment of `14 USD` but the quote promised to deliver `15 USD`. + + + + + + + + + + + + +
    USD outgoing payment liquidity acctUSD asset liquidity acctUSD incoming payment liquidity acct
    + + + + + + + + + +
    DebitCredit
    14
    +
    + + + + + + + + + +
    DebitCredit
    1
    +
    + + + + + + + + + +
    DebitCredit
    15
    +
    + +**Send amount > receive amount** + +| Debit Account | Credit Account | +| ---------------- | ---------------- | +| Outgoing payment | Incoming payment | +| Outgoing payment | Asset liquidity | + +**Example:** Sender consented to a payment of `15 USD` but the quote promised to deliver `14 USD`. + + + + + + + + + + + + +
    USD outgoing payment liquidity acctUSD asset liquidity acctUSD incoming payment liquidity acct
    + + + + + + + + + +
    DebitCredit
    15
    +
    + + + + + + + + + +
    DebitCredit
    1
    +
    + + + + + + + + + +
    DebitCredit
    14
    +
    + +#### Cross currency payments + +**Exchanging currencies** + +| Debit Account | Credit Account | Asset | +| ---------------- | ---------------- | ----- | +| Outgoing payment | Asset liquidity | `USD` | +| Asset liquidity | Incoming payment | `EUR` | + +**Example:** Outgoing payment for `10 USD`, incoming payment receives `9 EUR`. + + + + + + + + + + + + + + + + + + +
    USD outgoing payment liquidity acctUSD asset liquidity acct
    + + + + + + + + + +
    DebitCredit
    10
    +
    + + + + + + + + + +
    DebitCredit
    10
    +
    EUR asset liquidity acctEUR incoming payment liquidity acct
    + + + + + + + + + +
    DebitCredit
    9
    +
    + + + + + + + + + +
    DebitCredit
    9
    +
    + +**Exchanging currencies in Simple Payment Setup Protocol (SPSP) / Web Monetization** + +| Debit Account | Credit Account | Asset | +| ---------------- | --------------- | ----- | +| Outgoing payment | Asset liquidity | `USD` | +| Asset liquidity | Wallet address | `EUR` | + +**Example:** Outgoing payment for `2 USD`, wallet address receives `1 EUR`. + + + + + + + + + + + + + + + + + + +
    USD outgoing payment liquidity acctUSD asset liquidity acct
    + + + + + + + + + +
    DebitCredit
    2
    +
    + + + + + + + + + +
    DebitCredit
    2
    +
    EUR asset liquidity acctEUR wallet address liquidity acct
    + + + + + + + + + +
    DebitCredit
    1
    +
    + + + + + + + + + +
    DebitCredit
    1
    +
    + +### Interledger transfer examples + +In these examples, the sender and receiver do not have wallet addresses at the same Rafiki instance. + +Remember that a settlement account will always have a zero or negative balance and a liquidity account will always have a zero or positive balance. + +#### Sending connector + +**Same asset** + +| Debit Account | Credit Account | +| ---------------- | -------------- | +| Outgoing payment | Peer liquidity | + +**Example:** Sender creates an outgoing payment for 100 USD to an incoming payment at a peer's Rafiki instance. The peering relationship is in USD. + + + + + + + + + + +
    USD outgoing payment liquidity acctUSD peer liquidity acct
    + + + + + + + + + +
    DebitCredit
    100
    +
    + + + + + + + + + +
    DebitCredit
    100
    +
    + +**Cross currency** + +| Debit Account | Credit Account | Asset | +| ---------------- | --------------- | ----- | +| Outgoing payment | Asset liquidity | `USD` | +| Asset Liquidity | Peer Liquidity | `EUR` | + +**Example:** Sender creates an outgoing payment for 100 USD to an incoming payment at a peer's Rafiki instance. The peering relationship is in EUR, so payment is converted on the sending side. + + + + + + + + + + + + + + + + + + +
    USD outgoing payment liquidity acctUSD asset liquidity acct
    + + + + + + + + + +
    DebitCredit
    100
    +
    + + + + + + + + + +
    DebitCredit
    100
    +
    EUR asset liquidity acctEUR peer liquidity acct
    + + + + + + + + + +
    DebitCredit
    90
    +
    + + + + + + + + + +
    DebitCredit
    90
    +
    + +#### Receiving connector + +**Same asset** + +| Debit Account | Credit Account | +| -------------- | ---------------- | +| Peer liquidity | Incoming payment | + +**Example:** An incoming payment receives `100 USD` from an outgoing payment at a peer's Rafiki instance. + + + + + + + + + + +
    USD peer liquidity acctUSD incoming payment liquidity acct
    + + + + + + + + + +
    DebitCredit
    100
    +
    + + + + + + + + + +
    DebitCredit
    100
    +
    + +**Same asset in Simple Payment Setup Protocol (SPSP) / Web Monetization** + +| Debit Account | Credit Account | +| -------------- | -------------- | +| Peer liquidity | Wallet address | + +**Example:** A wallet address receives `2 USD` from an ILP payment at a peer's Rafiki instance. + + + + + + + + + + +
    USD peer liquidity acctUSD wallet address liquidity acct
    + + + + + + + + + +
    DebitCredit
    2
    +
    + + + + + + + + + +
    DebitCredit
    2
    +
    + +**Cross currency** + +| Debit Account | Credit Account | Asset | +| --------------- | ---------------- | ----- | +| Peer liquidity | Asset liquidity | `USD` | +| Asset liquidity | Incoming payment | `EUR` | + +**Example:** A Rafiki instance receives `10 USD` from a peer (peering relationship in USD) to be deposited in an incoming payment liquidity account denominated in EUR. The payment is converted to EUR and deposited. + + + + + + + + + + + + + + + + + + +
    USD peer liquidity acctUSD asset liquidity acct
    + + + + + + + + + +
    DebitCredit
    10
    +
    + + + + + + + + + +
    DebitCredit
    10
    +
    EUR asset liquidity acctEUR incoming payment liquidity acct
    + + + + + + + + + +
    DebitCredit
    9
    +
    + + + + + + + + + +
    DebitCredit
    9
    +
    + +**Cross-currency in Simple Payment Setup Protocol (SPSP) / Web Monetization** + +| Debit Account | Credit Account | Asset | +| --------------- | --------------- | ----- | +| Peer liquidity | Asset liquidity | `USD` | +| Asset liquidity | Wallet address | `EUR` | + +**Example:** A Rafiki instance receives `10 USD` from a peer (peering relationship in USD) to be deposited in a wallet address liquidity account denominated in EUR. The payment is converted to EUR and deposited. + + + + + + + + + + + + + + + + + + +
    USD peer liquidity acctUSD asset liquidity acct
    + + + + + + + + + +
    DebitCredit
    2
    +
    + + + + + + + + + +
    DebitCredit
    2
    +
    EUR asset liquidity acctEUR wallet address liquidity acct
    + + + + + + + + + +
    DebitCredit
    1
    +
    + + + + + + + + + +
    DebitCredit
    1
    +
    + +#### Connector + +**Same asset** + +| Debit Account | Credit Account | +| -------------- | -------------- | +| Peer liquidity | Peer liquidity | + +**Example:** Rafiki forwards `10 USD` from peer A to peer B. + + + + + + + + + + +
    USD peer "A" liquidity acctUSD peer "B" liquidity acct
    + + + + + + + + + +
    DebitCredit
    10
    +
    + + + + + + + + + +
    DebitCredit
    10
    +
    + +**Cross currency** + +| Debit Account | Credit Account | Asset | +| --------------- | --------------- | ----- | +| Peer liquidity | Asset liquidity | `USD` | +| Asset liquidity | Peer liquidity | `EUR` | + +**Example:** Rafiki receives `100 USD` from peer A and forwards `90 EUR` to peer B. + + + + + + + + + + + + + + + + + + +
    USD peer "A" liquidity acctUSD asset liquidity acct
    + + + + + + + + + +
    DebitCredit
    100
    +
    + + + + + + + + + +
    DebitCredit
    100
    +
    EUR asset liquidity acctEUR peer "B" liquidity acct
    + + + + + + + + + +
    DebitCredit
    90
    +
    + + + + + + + + + +
    DebitCredit
    90
    +
    diff --git a/packages/documentation/src/content/docs/overview/overview.mdx b/packages/documentation/src/content/docs/overview/overview.mdx index bc85eb4801..dbc189f387 100644 --- a/packages/documentation/src/content/docs/overview/overview.mdx +++ b/packages/documentation/src/content/docs/overview/overview.mdx @@ -25,7 +25,7 @@ In the context of Rafiki, a peer is another ASE with whom you transact. Forming ### eCommerce payments -If a merchant accepts Interledger as a payment method, then a customer can pay using their wallet address instead of entering, for example, a credit card number and other personal details on the merchant’s site. Rafiki’s implementation of Interledger and Open Payments means your account holders can use their wallet addresses for both one-time purchases and recurring purchases, such as subscriptions, anywhere Interledger is an accepted payment method. +If a merchant accepts Interledger or Open Payments as a payment method, then a customer can pay using their wallet address instead of entering, for example, a credit card number and other personal details on the merchant’s site. Rafiki’s implementation of Interledger and Open Payments means your account holders can use their wallet addresses for both one-time purchases and recurring purchases, such as subscriptions, anywhere Interledger or Open Payments is an accepted payment method. ### Web Monetization From 703847c2635d7486146ccfd371d675344fc8e736 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:48:24 -0400 Subject: [PATCH 78/91] docs: updating links outside of user docs --- README.md | 21 +++++++------- localenv/README.md | 6 ++-- .../app/root.tsx | 4 +-- .../integration/playground/autopeering.mdx | 2 +- .../docs/integration/playground/overview.mdx | 2 +- .../docs/overview/concepts/interledger.mdx | 4 +-- .../frontend/app/routes/peers.$peerId.tsx | 27 +++-------------- packages/frontend/app/routes/peers.create.tsx | 29 ++++--------------- 8 files changed, 28 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 062ededc56..f06c4d7d7d 100644 --- a/README.md +++ b/README.md @@ -4,22 +4,23 @@ ## What is Rafiki? -Rafiki is open source software that provides an efficient solution for an [Account Servicing Entity](https://rafiki.dev/concepts/account-servicing-entity/) to enable Interledger functionality on its users' accounts. +Rafiki is open source software that provides an efficient solution for an [account servicing entity](https://rafiki.dev/overview/overview) to enable Interledger functionality on its users' accounts. This includes -- sending and receiving payments (via [SPSP](https://rafiki.dev/reference/glossary/#simple-payments-setup-protocol-spsp) and [Open Payments](https://rafiki.dev/concepts/open-payments/overview/)) -- allowing third-party access to initiate payments and view transaction data (via [Open Payments](https://rafiki.dev/concepts/open-payments/overview/)) +- sending and receiving payments (via [SPSP](https://rafiki.dev/resources/glossary#simple-payment-setup-protocol-spsp) and [Open Payments](https://rafiki.dev/overview/concepts/open-payments)) +- allowing third-party access to initiate payments and view transaction data (via [Open Payments](https://rafiki.dev/overview/concepts/open-payments)) -**❗ Rafiki is intended to be run by [Account Servicing Entities](https://rafiki.dev/reference/glossary/#account-servicing-entity) only and should not be used in production by non-regulated entities.** +**❗ Rafiki is intended to be run by account servicing entities only and should not be used in production by non-regulated entities.** -Rafiki is made up of several components, including an Interledger connector, a high-throughput accounting database called [TigerBeetle](https://rafiki.dev/concepts/accounting/tigerbeetle/), and several APIs: +Rafiki is made up of several components, including an Interledger connector, a high-throughput accounting database called [TigerBeetle](https://rafiki.dev/overview/concepts/accounting#tigerbeetle), and several APIs: -- the [Admin API](https://rafiki.dev/apis/backend/schema/) to create [peering relationships](https://rafiki.dev/concepts/interledger-protocol/peering/), add supported [assets](https://rafiki.dev/concepts/asset/), and issue [wallet addresses](https://rafiki.dev/reference/glossary/#wallet-address) -- the [Open Payments](https://rafiki.dev/reference/glossary/#open-payments) API to allow third parties (with the account holder's consent) to initiate payments and to view the transaction history -- the [SPSP](https://rafiki.dev/reference/glossary/#simple-payments-setup-protocol-spsp) API for simple Interledger Payments +- the [Admin APIs](https://rafiki.dev/apis/graphql/admin-api-overview) to create [peering relationships](https://rafiki.dev/overview/concepts/interledger#peers), +add supported [assets](https://rafiki.dev/overview/concepts/accounting#assets), and issue [wallet addresses](https://rafiki.dev/resources/glossary#wallet-address) +- the [Open Payments](https://rafiki.dev/overview/concepts/open-payments) API to allow third parties (with the account holder's consent) to initiate payments and to view the transaction history +- the [SPSP](https://rafiki.dev/resources/glossary#simple-payment-setup-protocol-spsp) API for simple Interledger Payments -Additionally, this package also includes a reference implementation of a [GNAP](https://rafiki.dev/reference/glossary/#grant-negotiation-authorization-protocol) authorization server, which handles the access control for the [Open Payments](https://rafiki.dev/reference/glossary/#open-payments) API. For more information on the architecture, check out the [Architecture documentation](https://rafiki.dev/introduction/architecture/). +Additionally, this package also includes a reference implementation of a [GNAP](https://rafiki.dev/resources/glossary#grant-negotiation-and-authorization-protocol-gnap) authorization server, which handles the access control for the Open Payment API. For more information on the architecture, check out the [Architecture documentation](https://rafiki.dev/resources/architecture). ### New to Interledger? @@ -28,7 +29,7 @@ Never heard of Interledger before? Or would you like to learn more? Here are som - [Interledger Website](https://interledger.org/) - [Interledger Specs](https://interledger.org/rfcs/0027-interledger-protocol-4/) - [Interledger Explainer Video](https://twitter.com/Interledger/status/1567916000074678272) -- [Open Payments](https://openpayments.guide/) +- [Open Payments](https://openpayments.dev/) - [Web monetization](https://webmonetization.org/) ## Contributing diff --git a/localenv/README.md b/localenv/README.md index b6a13bab4c..42379f3b94 100644 --- a/localenv/README.md +++ b/localenv/README.md @@ -1,12 +1,12 @@ # Local Playground -We have created a suite of packages that, together, mock an account servicing entity that has deployed Rafiki, exposing an [SPSP](https://rafiki.dev/reference/glossary/#simple-payments-setup-protocol-spsp) endpoint, the [Open Payments](https://rafiki.dev/concepts/open-payments/overview/) APIs with its required [GNAP](https://rafiki.dev/reference/glossary/#grant-negotiation-authorization-protocol) auth endpoints to request grants, a STREAM endpoint for receiving Interledger packets, and a UI to view and manage the Rafiki instance. +We have created a suite of packages that, together, mock an account servicing entity that has deployed Rafiki, exposing an [SPSP](https://rafiki.dev/resources/glossary#simple-payment-setup-protocol-spsp) endpoint, the [Open Payments](https://rafiki.dev/overview/concepts/open-payments) APIs with its required [GNAP](https://rafiki.dev/resources/glossary#grant-negotiation-and-authorization-protocol-gnap) auth endpoints to request grants, a STREAM endpoint for receiving Interledger packets, and a UI to view and manage the Rafiki instance. These packages include: - `backend` (SPSP, Open Payments APIs, GraphQL Admin APIs, STREAM endpoint) - `auth` (GNAP auth server) -- `mock-account-servicing-entity` (mocks an [Account Servicing Entity](https://rafiki.dev/concepts/account-servicing-entity/) +- `mock-account-servicing-entity` (mocks an [account servicing entity](https://rafiki.dev/overview/overview) - `frontend` (Remix app to expose a UI for Rafiki Admin management via interaction with the `backend` Admin APIs) - `kratos` (An identity and user management solution for the `frontend`) - `mailslurper` (A SMTP mail server to catch account recovery emails) @@ -27,7 +27,7 @@ This environment will set up a playground where you can use the Rafiki Admin API ## Environment overview -![Docker compose environment](../packages/documentation/public/img/localenv-architecture.png) +![Docker compose environment](../packages/documentation/public/img/localenv.png) #### Cloud Nine Wallet diff --git a/localenv/mock-account-servicing-entity/app/root.tsx b/localenv/mock-account-servicing-entity/app/root.tsx index a48b6ecbbf..5d776ead63 100644 --- a/localenv/mock-account-servicing-entity/app/root.tsx +++ b/localenv/mock-account-servicing-entity/app/root.tsx @@ -114,9 +114,9 @@ export default function App() { This is an example application for an{' '} - [Account Servicing Entity] + [account servicing entity] , used for demonstration & internal development purposes only. diff --git a/packages/documentation/src/content/docs/integration/playground/autopeering.mdx b/packages/documentation/src/content/docs/integration/playground/autopeering.mdx index 6bb53c4443..c2ceaa4fc6 100644 --- a/packages/documentation/src/content/docs/integration/playground/autopeering.mdx +++ b/packages/documentation/src/content/docs/integration/playground/autopeering.mdx @@ -23,7 +23,7 @@ The exposed ports are: | ILP connector | 3002 | | Auth server | 3006 | -To use the Open Payments example in the Bruno API collection, follow these steps: +To use the Open Payments example in the Bruno API collection, follow these steps: 1. Navigate to localhost:3030 to find the list of created wallet addresses. Alternatively, you can run the following command: diff --git a/packages/documentation/src/content/docs/integration/playground/overview.mdx b/packages/documentation/src/content/docs/integration/playground/overview.mdx index 7bbcc65cbf..b0b3cac78a 100644 --- a/packages/documentation/src/content/docs/integration/playground/overview.mdx +++ b/packages/documentation/src/content/docs/integration/playground/overview.mdx @@ -225,7 +225,7 @@ You have to go through an interaction flow by clicking on the `redirect` link in #### Admin UI -To manage and view information about the Rafiki instance(s) using the [Rafiki Admin application](/admin/admin-user-guide/), you can navigate to `localhost:3010` (Cloud Nine Wallet) or `localhost:4010` (Happy Life Bank). The Rafiki Admin application runs a Remix app for querying info and executing mutations against the Rafiki Backend [Admin ](https://rafiki.dev/playground/overview/#admin-apis)[API](https://rafiki.dev/playground/overview/#admin-apis). +To manage and view information about the Rafiki instance(s) using the [Rafiki Admin application](/admin/admin-user-guide/), you can navigate to `localhost:3010` (Cloud Nine Wallet) or `localhost:4010` (Happy Life Bank). The Rafiki Admin application runs a Remix app for querying info and executing mutations against the Rafiki [Backend Admin API](https://rafiki.dev/integration/playground/overview#admin-apis). Access to the Rafiki Admin application is managed using Ory Kratos, a secure and fully open-source identity and user management solution. Check it out on GitHub. Since access to the UI is invitation-only, the registration flow is not publicly available. To access the Admin UI, click the registration link provided in the logs during the local environment startup or manually add a new user with the `invite-user` script. diff --git a/packages/documentation/src/content/docs/overview/concepts/interledger.mdx b/packages/documentation/src/content/docs/overview/concepts/interledger.mdx index dd349dca79..531d791e36 100644 --- a/packages/documentation/src/content/docs/overview/concepts/interledger.mdx +++ b/packages/documentation/src/content/docs/overview/concepts/interledger.mdx @@ -53,9 +53,7 @@ When a `GET` request is made to a payment pointer, the response contains the ILP ## STREAM Protocol -The STREAM Protocol is the transport layer protocol in the Interledger Protocol stack. After -SPSP communicates the ILP address of the destination account and the shared secret, -the STREAM protocol uses these details to set up a STREAM connection between the +The STREAM Protocol is the transport layer protocol in the Interledger Protocol stack. After SPSP communicates the ILP address of the destination account and the shared secret, the STREAM protocol uses these details to set up a STREAM connection between the counterparties.{' '} Rafiki’s `backend` service includes an Interledger connector for sending and receiving STREAM packets. STREAM packets are encoded, encrypted, and sent as the `data` field in ILP packets. The protocol uses the shared secret to authenticate and encrypt packets, and to generate conditions and fulfillments. diff --git a/packages/frontend/app/routes/peers.$peerId.tsx b/packages/frontend/app/routes/peers.$peerId.tsx index 03fa16b501..3727277140 100644 --- a/packages/frontend/app/routes/peers.$peerId.tsx +++ b/packages/frontend/app/routes/peers.$peerId.tsx @@ -126,7 +126,7 @@ export default function ViewPeerPage() { The name of the{' '}
    peer @@ -211,13 +211,7 @@ export default function ViewPeerPage() { error={response?.errors.http.fieldErrors.incomingAuthTokens} description={ <> - List of valid tokens to accept when receiving{' '} - - incoming ILP packets from the peer. - + List of valid tokens to accept when receiving incoming ILP packets from the peer. } /> @@ -230,13 +224,7 @@ export default function ViewPeerPage() { error={response?.errors.http.fieldErrors.outgoingAuthToken} description={ <> - List of valid tokens to present when sending{' '} - - outgoing ILP packets to the peer. - + List of valid tokens to present when sending outgoing ILP packets to the peer. } /> @@ -249,14 +237,7 @@ export default function ViewPeerPage() { error={response?.errors.http.fieldErrors.outgoingEndpoint} description={ <> - Endpoint on the peer to which{' '} - - outgoing ILP packets - {' '} - will be sent. + Endpoint on the peer to which outgoing ILP packets will be sent. } /> diff --git a/packages/frontend/app/routes/peers.create.tsx b/packages/frontend/app/routes/peers.create.tsx index c643078f58..495eeca7fc 100644 --- a/packages/frontend/app/routes/peers.create.tsx +++ b/packages/frontend/app/routes/peers.create.tsx @@ -64,7 +64,7 @@ export default function CreatePeerPage() { The name of the{' '} peer {' '} @@ -126,13 +126,7 @@ export default function CreatePeerPage() { error={response?.errors?.fieldErrors?.incomingAuthTokens} description={ <> - List of valid tokens to accept when receiving{' '} - - incoming ILP packets from the peer. - + List of valid tokens to accept when receiving incoming ILP packets from the peer. } /> @@ -144,13 +138,7 @@ export default function CreatePeerPage() { error={response?.errors?.fieldErrors?.outgoingAuthToken} description={ <> - List of valid tokens to present when sending{' '} - - outgoing ILP packets to the peer. - + List of valid tokens to present when sending outgoing ILP packets to the peer. } /> @@ -162,14 +150,7 @@ export default function CreatePeerPage() { error={response?.errors?.fieldErrors?.outgoingEndpoint} description={ <> - Endpoint on the peer to which{' '} - - outgoing ILP packets - {' '} - will be sent. + Endpoint on the peer to which outgoing ILP packets will be sent. } /> @@ -198,7 +179,7 @@ export default function CreatePeerPage() { The type of{' '} asset {' '} From e6be98cdba3d320643519af27784a03bd1e3aa20 Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Mon, 9 Sep 2024 15:32:24 -0500 Subject: [PATCH 79/91] docs: updating Rafiki Admin guide - Adding contextual information around obtaining login credentials - Adding information around deactivating a wallet address through the UI --- .../src/content/docs/admin/admin-user-guide.mdx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx index 84faff8f5e..3435decf64 100644 --- a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx +++ b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx @@ -16,6 +16,12 @@ The Rafiki Admin application provides tools to manage peers, assets, wallet addr - Running the Rafiki `frontend` package. See [Frontend service](/integration/services/frontend-service) for more information. - Rafiki Admin login credentials +:::note[Login credentials] +The admin user must run a script to generate a registration link and then send that link to a user via email or Slack. Currently, the process for obtaining login credentials is not automated, nor is the method for sending a registration link. + +For more information about obtaining login credentials, refer to the [Admin UI](/integration/playground/overview/#admin-ui) section of the local playground page. +::: + ## Navigation After logging in, you’ll be greeted by the main landing page with a left-hand navigation menu. This menu provides access to all of the main functionality needed to manage your Rafiki instance. @@ -227,7 +233,7 @@ Wallet addresses cannot be deleted from the system. This restriction exists to e **Solution** -In both cases, the recommended approach is to create a new wallet address and deactivate the old one. Note that deactivation of a wallet address is currently only available via the API and not through the Rafiki Admin application. +In both cases, the recommended approach is to create a new wallet address and deactivate the old one. To deactivate a wallet address, change the wallet status to Inactive. ::: ## Webhooks From 96440a9b64abbaec7f108eab044e79d79bc51ad2 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Tue, 10 Sep 2024 07:45:16 -0400 Subject: [PATCH 80/91] docs: minor updates to non-user docs --- README.md | 2 +- localenv/mock-account-servicing-entity/app/root.tsx | 2 +- packages/frontend/app/routes/peers.create.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f06c4d7d7d..df7ce9c775 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ## What is Rafiki? -Rafiki is open source software that provides an efficient solution for an [account servicing entity](https://rafiki.dev/overview/overview) to enable Interledger functionality on its users' accounts. +Rafiki is open source software that provides an efficient solution for an [account servicing entity](https://rafiki.dev/resources/glossary#account-servicing-entity-ase) to enable Interledger functionality on its users' accounts. This includes diff --git a/localenv/mock-account-servicing-entity/app/root.tsx b/localenv/mock-account-servicing-entity/app/root.tsx index 5d776ead63..1373c4a7f5 100644 --- a/localenv/mock-account-servicing-entity/app/root.tsx +++ b/localenv/mock-account-servicing-entity/app/root.tsx @@ -114,7 +114,7 @@ export default function App() { This is an example application for an{' '} [account servicing entity] diff --git a/packages/frontend/app/routes/peers.create.tsx b/packages/frontend/app/routes/peers.create.tsx index 495eeca7fc..95fa0ab02e 100644 --- a/packages/frontend/app/routes/peers.create.tsx +++ b/packages/frontend/app/routes/peers.create.tsx @@ -138,7 +138,7 @@ export default function CreatePeerPage() { error={response?.errors?.fieldErrors?.outgoingAuthToken} description={ <> - List of valid tokens to present when sending outgoing ILP packets to the peer. + Valid auth token to present when sending outgoing ILP packets to the peer. } /> From 3336b2d5fe6baf784300165740f1280b5c46aa47 Mon Sep 17 00:00:00 2001 From: Mohammed Islam Date: Tue, 10 Sep 2024 15:51:10 +0200 Subject: [PATCH 81/91] docs: mi/docs-update-091024 --- packages/documentation/astro.config.mjs | 4 ++-- .../documentation/public/img/localenv.png | Bin 306410 -> 303630 bytes .../prod/{nginx.mdx => docker-compose.mdx} | 0 .../docs/integration/prod/helm-k8s.mdx | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename packages/documentation/src/content/docs/integration/prod/{nginx.mdx => docker-compose.mdx} (100%) diff --git a/packages/documentation/astro.config.mjs b/packages/documentation/astro.config.mjs index 47a0c9af0a..bbc3a3a2c9 100644 --- a/packages/documentation/astro.config.mjs +++ b/packages/documentation/astro.config.mjs @@ -124,10 +124,10 @@ export default defineConfig({ }, { label: 'Docker Compose', - link: '/integration/prod/nginx' + link: '/integration/prod/docker-compose' }, { - label: 'Helm and K8s', + label: 'Helm and Kubernetes', link: '/integration/prod/helm-k8s' }, { diff --git a/packages/documentation/public/img/localenv.png b/packages/documentation/public/img/localenv.png index 8441ae825e6e28846274c771d874c1da2cde5ece..1ba128ba64daa72e2c28ca2c9ae245a2290197fe 100644 GIT binary patch literal 303630 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%0AaGq`3nk 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

    eRa9)@fRTJeb=dYtPG= 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

    h9x#gNncL5=c$ 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 YuxL7iE#AT88i0QGS=gFCH>Jk>53?=ORR910 diff --git a/packages/documentation/src/content/docs/rafikiadmin/overview.md b/packages/documentation/src/content/docs/rafikiadmin/overview.md deleted file mode 100644 index 7839bf6760..0000000000 --- a/packages/documentation/src/content/docs/rafikiadmin/overview.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Overview ---- - -Rafiki Admin provides a user-friendly administrative interface for interacting with the `backend` admin API [mutations](/apis/backend/mutations) and [queries](/apis/backend/queries). In this web application, you'll be able to view and manage peering relationships, assets, and wallet addresses, among other settings. - -![Rafiki Admin home screen](/img/rafiki-admin.png) - -In order to run Rafiki Admin you'll need a Rafiki backend instance up and running, an Ory Kratos identity management service, and an SMTP mail server for sending account recovery emails. All of these services, along with Rafiki Admin are available within the local playground for testing and devlopment purposes. See the local environment pages for more information on how to set it up. TLDR: to get the whole environment up, run the command `pnpm localenv:compose up` from the root of your project. - -Access to Rafiki Admin is restricted to ensure that only authorized users can register. This is achieved by using an invitation-only system, where new users are invited by an administrator. The registration flow is not public, so users cannot sign up on their own. Instead, administrators create accounts using the `invite-user` script. See [Rafiki Admin Auth](/rafikiadmin/auth) for more details. From 6fe96488f3b2ac45d2b32b85213c5c9e0282b7d8 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 10 Sep 2024 20:44:01 +0200 Subject: [PATCH 86/91] chore:formatting --- README.md | 4 ++-- packages/frontend/app/routes/peers.$peerId.tsx | 9 ++++++--- packages/frontend/app/routes/peers.create.tsx | 9 ++++++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index df7ce9c775..072def3a80 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@ This includes Rafiki is made up of several components, including an Interledger connector, a high-throughput accounting database called [TigerBeetle](https://rafiki.dev/overview/concepts/accounting#tigerbeetle), and several APIs: -- the [Admin APIs](https://rafiki.dev/apis/graphql/admin-api-overview) to create [peering relationships](https://rafiki.dev/overview/concepts/interledger#peers), -add supported [assets](https://rafiki.dev/overview/concepts/accounting#assets), and issue [wallet addresses](https://rafiki.dev/resources/glossary#wallet-address) +- the [Admin APIs](https://rafiki.dev/apis/graphql/admin-api-overview) to create [peering relationships](https://rafiki.dev/overview/concepts/interledger#peers), + add supported [assets](https://rafiki.dev/overview/concepts/accounting#assets), and issue [wallet addresses](https://rafiki.dev/resources/glossary#wallet-address) - the [Open Payments](https://rafiki.dev/overview/concepts/open-payments) API to allow third parties (with the account holder's consent) to initiate payments and to view the transaction history - the [SPSP](https://rafiki.dev/resources/glossary#simple-payment-setup-protocol-spsp) API for simple Interledger Payments diff --git a/packages/frontend/app/routes/peers.$peerId.tsx b/packages/frontend/app/routes/peers.$peerId.tsx index 722fc1e515..589488f510 100644 --- a/packages/frontend/app/routes/peers.$peerId.tsx +++ b/packages/frontend/app/routes/peers.$peerId.tsx @@ -211,7 +211,8 @@ export default function ViewPeerPage() { error={response?.errors.http.fieldErrors.incomingAuthTokens} description={ <> - List of valid tokens to accept when receiving incoming ILP packets from the peer. + List of valid tokens to accept when receiving incoming + ILP packets from the peer. } /> @@ -224,7 +225,8 @@ export default function ViewPeerPage() { error={response?.errors.http.fieldErrors.outgoingAuthToken} description={ <> - Valid auth token to present when sending outgoing ILP packets to the peer. + Valid auth token to present when sending outgoing ILP + packets to the peer. } /> @@ -237,7 +239,8 @@ export default function ViewPeerPage() { error={response?.errors.http.fieldErrors.outgoingEndpoint} description={ <> - Endpoint on the peer to which outgoing ILP packets will be sent. + Endpoint on the peer to which outgoing ILP packets will + be sent. } /> diff --git a/packages/frontend/app/routes/peers.create.tsx b/packages/frontend/app/routes/peers.create.tsx index e753a8cb7c..973b210d3d 100644 --- a/packages/frontend/app/routes/peers.create.tsx +++ b/packages/frontend/app/routes/peers.create.tsx @@ -126,7 +126,8 @@ export default function CreatePeerPage() { error={response?.errors?.fieldErrors?.incomingAuthTokens} description={ <> - List of valid tokens to accept when receiving incoming ILP packets from the peer. + List of valid tokens to accept when receiving incoming + ILP packets from the peer. } /> @@ -138,7 +139,8 @@ export default function CreatePeerPage() { error={response?.errors?.fieldErrors?.outgoingAuthToken} description={ <> - Valid auth token to present when sending outgoing ILP packets to the peer. + Valid auth token to present when sending outgoing ILP + packets to the peer. } /> @@ -150,7 +152,8 @@ export default function CreatePeerPage() { error={response?.errors?.fieldErrors?.outgoingEndpoint} description={ <> - Endpoint on the peer to which outgoing ILP packets will be sent. + Endpoint on the peer to which outgoing ILP packets will + be sent. } /> From a7433107bb5604d3e5c4d6eb2bf72f12a0830eff Mon Sep 17 00:00:00 2001 From: Sarah Jones Date: Tue, 10 Sep 2024 20:44:52 +0200 Subject: [PATCH 87/91] Update packages/documentation/src/content/docs/admin/admin-user-guide.mdx --- .../documentation/src/content/docs/admin/admin-user-guide.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx index 3435decf64..7627edb222 100644 --- a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx +++ b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx @@ -265,7 +265,7 @@ All payments are displayed in the table. For each payment, you can view the uniq The Account Settings page allows you to manage your personal account information, including updating your email address and password. From ed1b34c998133b88035e1ac166387fd5593c3acf Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 10 Sep 2024 21:07:52 +0200 Subject: [PATCH 88/91] chore: fixing broken links from the update with main --- localenv/README.md | 2 +- .../backend/src/payment-method/ilp/connector/core/README.md | 2 +- packages/documentation/src/content/docs/rafikiadmin/auth.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/localenv/README.md b/localenv/README.md index 91803268af..32ae59ff92 100644 --- a/localenv/README.md +++ b/localenv/README.md @@ -255,7 +255,7 @@ Note that you have to go through an interaction flow by clicking on the `redirec #### Admin UI -In order to manage and view information about the Rafiki instance(s) you can use the [Rafiki Admin](https://rafiki.dev/rafikiadmin/overview/) UI. We have secured access to Rafiki Admin using [Ory Kratos](https://www.ory.sh/docs/kratos/ory-kratos-intro); however, in our local playground setup we've chosen to disable authorization for easier development and testing interactions. +In order to manage and view information about the Rafiki instance(s) you can use the [Rafiki Admin](https://rafiki.dev/admin/admin-user-guide) UI. We have secured access to Rafiki Admin using [Ory Kratos](https://www.ory.sh/docs/kratos/ory-kratos-intro); however, in our local playground setup we've chosen to disable authorization for easier development and testing interactions. If you'd like to enable authorization locally you can run `pnpm localenv:compose:adminauth up` and check out the setup in the [`admin-auth`](./admin-auth/) subdirectory. Note that, if authorization is enabled, you must register separately for Cloud Nine Wallet's Rafiki Admin and Happy Life Bank's Rafiki Admin, as they are intended to operate as distinct mock account servicing entities. Once you've registered, you can always come back to your Rafiki Admin account by navigating to [`localhost:3010`](http://localhost:3010) (Cloud Nine Wallet) or [`localhost:4010`](http://localhost:4010) (Happy Life Bank) and logging in. Since access to the UI is on an invitation-only basis the registration flow is not publicly available. As such, in order to access Rafiki Admin you can manually add a new user with the invite-user script. Run `docker exec -it npm run invite-user -- example@mail.com`, and it will output a link to the terminal. Copy and paste this link in your browser and you will automatically be logged in and directed to the account settings page. The next step is changing your password. We are using a simple email and password authentication method. diff --git a/packages/backend/src/payment-method/ilp/connector/core/README.md b/packages/backend/src/payment-method/ilp/connector/core/README.md index c250dbe5e5..c8f4e5d6a5 100644 --- a/packages/backend/src/payment-method/ilp/connector/core/README.md +++ b/packages/backend/src/payment-method/ilp/connector/core/README.md @@ -4,7 +4,7 @@ ## Telemetry Collection -Currently, we collect packet count and packet amount metrics directly within the connector core. These metrics are captured at the Interledger layer to track packet activity while ensuring privacy by collecting amounts at the packet level, rather than at the transaction level. This approach helps to preserve privacy, as we do not expose entire transaction amounts, while also incorporating privacy-preserving measures into the collected amounts. You can read more about privacy [here](https://rafiki.dev/telemetry/privacy/). +Currently, we collect packet count and packet amount metrics directly within the connector core. These metrics are captured at the Interledger layer to track packet activity while ensuring privacy by collecting amounts at the packet level, rather than at the transaction level. This approach helps to preserve privacy, as we do not expose entire transaction amounts, while also incorporating privacy-preserving measures into the collected amounts. You can read more about privacy [here](https://rafiki.dev/overview/concepts/telemetry#privacy). ### Why We Collect on the Sending Side diff --git a/packages/documentation/src/content/docs/rafikiadmin/auth.md b/packages/documentation/src/content/docs/rafikiadmin/auth.md index 2f33e57ff8..b71a1fb265 100644 --- a/packages/documentation/src/content/docs/rafikiadmin/auth.md +++ b/packages/documentation/src/content/docs/rafikiadmin/auth.md @@ -6,7 +6,7 @@ title: Rafiki Admin Auth Rafiki Admin functions as an interface to the Rafiki backend service and relies on the [Ory Kratos](https://www.ory.sh/docs/kratos/ory-kratos-intro) identity and user management solution. It doesn’t operate independently; all actions performed in the Rafiki Admin interface, such as fetching data or executing commands, are passed to the Rafiki `backend` service. -Ory Kratos, a secure and open-source identity and user management solution, handles authentication (login) and user management (account creation and password recovery). Check it out on [GitHub](https://github.com/ory/kratos). For an example of how to get these services up and running, see our [local environment](/playground/overview) setup. +Ory Kratos, a secure and open-source identity and user management solution, handles authentication (login) and user management (account creation and password recovery). Check it out on [GitHub](https://github.com/ory/kratos). For an example of how to get these services up and running, see our [local environment](/integration/playground/overview) setup. > **Note: Ory Kratos and Rafiki Admin must be hosted on the same top-level domain. Hosting Kratos on a subdomain is generally not recommended by Ory, but if you choose this approach, ensure you follow the guidelines provided in the Kratos documentation.** From 7ff9b6836c917051ab980ad5c22beb5687b7accc Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:18:42 -0500 Subject: [PATCH 89/91] docs: update Rafiki Admin guide - Incorporate Rafiki Admin auth information in the guide --- .../content/docs/admin/admin-user-guide.mdx | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx index 7627edb222..a883bf5912 100644 --- a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx +++ b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx @@ -6,7 +6,7 @@ import { LinkOut } from '@interledger/docs-design-system' import { LargeImg } from '@interledger/docs-design-system' -The Rafiki Admin application provides tools to manage peers, assets, wallet addresses, webhooks, payments, and account settings. The purpose of this document is to help you navigate and use the Rafiki Admin application effectively. +The Rafiki Admin application provides tools to manage peers, assets, wallet addresses, webhooks, payments, and account settings. It functions as an interface to the Rafiki [backend service](/integration/services/backend-service/) and all actions performed, such as fetching data or executing commands, are passed to the Rafiki `backend` service. The purpose of this document is to help you navigate and use the Rafiki Admin application effectively. ## Getting started @@ -14,14 +14,44 @@ The Rafiki Admin application provides tools to manage peers, assets, wallet addr - Familiarity with general Rafiki concepts. The [Rafiki overview](/overview/overview) is a great place to start. - Running the Rafiki `frontend` package. See [Frontend service](/integration/services/frontend-service) for more information. -- Rafiki Admin login credentials -:::note[Login credentials] -The admin user must run a script to generate a registration link and then send that link to a user via email or Slack. Currently, the process for obtaining login credentials is not automated, nor is the method for sending a registration link. +## Identity and user management -For more information about obtaining login credentials, refer to the [Admin UI](/integration/playground/overview/#admin-ui) section of the local playground page. +Rafiki Admin relies on the Ory Kratos identity and user management solution to handle authentication (login) and user management (account creation and password recovery). + +:::note +Ory Kratos and Rafiki Admin should be hosted on the same top-level domain. Hosting Kratos on a subdomain is generally not recommended by Ory, but if you choose this approach, ensure you follow the guidelines provided in the Kratos documentation. +::: + +### Login and account management + +Access to Rafiki Admin is restricted to ensure that only authorized users can register. This is achieved by using an invitation-only system, where new users are invited by an administrator. The registration flow is not public, so users cannot sign up on their own. Instead, administrators create accounts using the `invite-user` script. + +An administrator (someone with backend interface system access) can run the invite-user script in one of two ways, either from outside the container, on the host machine where Docker is running, `docker exec -it npm run invite-user -- example@mail.com`, or directly inside the Rafiki Admin Docker container `npm run invite-user -- example@mail.com`. + +After running the invite-user script, it generates a recovery link that also serves as an invitation link. This link is output to the terminal, and the administrator can send it to the user. When the user opens the link in their browser, they are automatically logged in and taken to the account settings page, where they can set a new password. Afterward, they can log in normally via the Rafiki Admin URL. + + + +:::note +The invitation link is single-use for security purposes. Once accessed, it becomes invalid. If sending the link through Slack, ensure you format it as code by placing it inside backticks (\`) to prevent Slack from automatically previewing the link, which would invalidate it. Example: \``http://localhost:4433/self-service/recovery?flow=116250ee-07bd-4b5c-a98e-87406192bb4b&token=miv0yZ7DFKKw8RyBBQvWoOsTRa2TVuZm`\`. ::: +There is an automated account recovery flow which requires an SMTP mail server for sending recovery links to users. Alternatively, an administrator may generate a recovery link using the same `invite-user` script. + +To remove a user, administrators can use the following script: `docker exec -it npm run delete-user -- example@mail.com`. + +### Why Ory Kratos? + +We chose Kratos for its open-source nature, lightweight design, and robust security features. It eliminates the need to manage password hashing, storage, or account recovery flows ourselves, allowing us to focus on what we do best. + +Kratos also enhances security with features like built-in breach detection, secure session management, and regular security updates. + +Ory Kratos provides frontend components (such as forms and buttons) for identity management flows like login, and account settings. These components are not fixed in design; they are fetched via API calls which allows us to match the identity management components with Rafiki Admin's overall look and feel. + ## Navigation After logging in, you’ll be greeted by the main landing page with a left-hand navigation menu. This menu provides access to all of the main functionality needed to manage your Rafiki instance. From d1db96d47daf91043785cc4454140dca2226b329 Mon Sep 17 00:00:00 2001 From: brad-dow <162852233+brad-dow@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:22:01 -0500 Subject: [PATCH 90/91] docs: folder cleanup - Removed auth.md - Removed rafikiadmin folder --- .../src/content/docs/rafikiadmin/auth.md | 35 ------------------- 1 file changed, 35 deletions(-) delete mode 100644 packages/documentation/src/content/docs/rafikiadmin/auth.md diff --git a/packages/documentation/src/content/docs/rafikiadmin/auth.md b/packages/documentation/src/content/docs/rafikiadmin/auth.md deleted file mode 100644 index b71a1fb265..0000000000 --- a/packages/documentation/src/content/docs/rafikiadmin/auth.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Rafiki Admin Auth ---- - -## Setup - -Rafiki Admin functions as an interface to the Rafiki backend service and relies on the [Ory Kratos](https://www.ory.sh/docs/kratos/ory-kratos-intro) identity and user management solution. It doesn’t operate independently; all actions performed in the Rafiki Admin interface, such as fetching data or executing commands, are passed to the Rafiki `backend` service. - -Ory Kratos, a secure and open-source identity and user management solution, handles authentication (login) and user management (account creation and password recovery). Check it out on [GitHub](https://github.com/ory/kratos). For an example of how to get these services up and running, see our [local environment](/integration/playground/overview) setup. - -> **Note: Ory Kratos and Rafiki Admin must be hosted on the same top-level domain. Hosting Kratos on a subdomain is generally not recommended by Ory, but if you choose this approach, ensure you follow the guidelines provided in the Kratos documentation.** - -## Login and account management - -Access to Rafiki Admin is restricted to ensure that only authorized users can register. This is achieved by using an invitation-only system, where new users are invited by an administrator. The registration flow is not public, so users cannot sign up on their own. Instead, administrators create accounts using the `invite-user` script. - -An administrator (someone with backend interface system access) can run the invite-user script in one of two ways, either from outside the container, on the host machine where Docker is running, `docker exec -it npm run invite-user -- example@mail.com`, or directly inside the Rafiki Admin Docker container `npm run invite-user -- example@mail.com`. - -After running the invite-user script, it generates a recovery link that also serves as an invitation link. This link is output to the terminal, and the administrator can send it to the user. When the user opens the link in their browser, they are automatically logged in and taken to the account settings page, where they can set a new password. Afterward, they can log in normally via the Rafiki Admin URL. - -![Rafiki account settings screen](/img/rafiki-auth.png) - -> **Note**: The invitation link is single-use for security purposes. Once accessed, it becomes invalid. If sending the link through Slack, ensure you format it as code by placing it inside backticks (\`) to prevent Slack from automatically previewing the link, which would invalidate it. Example: \``http://localhost:4433/self-service/recovery?flow=116250ee-07bd-4b5c-a98e-87406192bb4b&token=miv0yZ7DFKKw8RyBBQvWoOsTRa2TVuZm`\`. - -There is an automated account recovery flow which requires an SMTP mail server for sending recovery links to users. Alternatively, an administrator may generate a recovery link using the same `invite-user` script. - -To remove a user, administrators can use the following script: `docker exec -it npm run delete-user -- example@mail.com`. - -## Why Ory Kratos? - -We chose Kratos for its open-source nature, lightweight design, and robust security features. It eliminates the need to manage password hashing, storage, or account recovery flows ourselves, allowing us to focus on what we do best. - -Kratos also enhances security with features like built-in breach detection, secure session management, and regular security updates. - -Ory Kratos provides frontend components (such as forms and buttons) for identity management flows like login, and account settings. These components are not fixed in design; they are fetched via API calls which allows us to match the identity management components with Rafiki Admin's overall look and feel. From 06d0a534dc121f6238e192d6429be6afc2c2be97 Mon Sep 17 00:00:00 2001 From: Melissa Henderson <57110301+melissahenderson@users.noreply.github.com> Date: Tue, 10 Sep 2024 17:23:24 -0400 Subject: [PATCH 91/91] docs: cleaning up dupe admin auth info --- .../content/docs/admin/admin-user-guide.mdx | 26 +++++++++++-- .../docs/integration/playground/overview.mdx | 38 ++++++------------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx index a883bf5912..32bd1a65ce 100644 --- a/packages/documentation/src/content/docs/admin/admin-user-guide.mdx +++ b/packages/documentation/src/content/docs/admin/admin-user-guide.mdx @@ -27,9 +27,19 @@ Ory Kratos and Rafiki Admin should be hosted on the same top-level domain. Hosti Access to Rafiki Admin is restricted to ensure that only authorized users can register. This is achieved by using an invitation-only system, where new users are invited by an administrator. The registration flow is not public, so users cannot sign up on their own. Instead, administrators create accounts using the `invite-user` script. -An administrator (someone with backend interface system access) can run the invite-user script in one of two ways, either from outside the container, on the host machine where Docker is running, `docker exec -it npm run invite-user -- example@mail.com`, or directly inside the Rafiki Admin Docker container `npm run invite-user -- example@mail.com`. +#### Invite a user -After running the invite-user script, it generates a recovery link that also serves as an invitation link. This link is output to the terminal, and the administrator can send it to the user. When the user opens the link in their browser, they are automatically logged in and taken to the account settings page, where they can set a new password. Afterward, they can log in normally via the Rafiki Admin URL. +An administrator (someone with backend interface system access) can run the `invite-user` script in one of two ways: from outside the container on the host machine where Docker is running or directly inside the Rafiki Admin Docker container. + +```nginx title="Outside container on host machine" +docker exec -it npm run invite-user -- example@mail.com +``` + +```nginx title="Inside Rafiki Admin Docker container" +npm run invite-user -- example@mail.com +``` + +After running the `invite-user` script, the script generates a recovery link that also serves as an invitation link. This link is output to the terminal, and the administrator can send it to the user. When the user opens the link in their browser, they are automatically logged in and taken to the account settings page where they can set a new password. Afterward, they can log in normally via the Rafiki Admin URL. npm run delete-user -- example@mail.com`. +```nginx +docker exec -it npm run delete-user -- example@mail.com. +``` ### Why Ory Kratos? diff --git a/packages/documentation/src/content/docs/integration/playground/overview.mdx b/packages/documentation/src/content/docs/integration/playground/overview.mdx index b0b3cac78a..0f30ff9040 100644 --- a/packages/documentation/src/content/docs/integration/playground/overview.mdx +++ b/packages/documentation/src/content/docs/integration/playground/overview.mdx @@ -6,7 +6,7 @@ import { LinkOut } from '@interledger/docs-design-system' import { CodeBlock } from '@interledger/docs-design-system' -The Local Playground provides a suite of packages that, together, mock an account servicing entity that has deployed Rafiki. It exposes an SPSP endpoint, the [Open Payments APIs](/overview/concepts/open-payments) with its required GNAP auth endpoints to request grants, a STREAM endpoint for receiving Interledger packets, and an admin UI to view and manage each Rafiki instance. +The Local Playground provides a suite of packages that, together, mock an account servicing entity that has deployed Rafiki. It exposes an SPSP endpoint, the [Open Payments APIs](/overview/concepts/open-payments) with its required GNAP auth endpoints to request grants, a STREAM endpoint for receiving Interledger packets, and the Rafiki Admin app to view and manage each Rafiki instance. This suite of packages includes: @@ -92,7 +92,7 @@ The following components are made available via the Local Playground: | c | Open Payments API | http://localhost:3000 | | d | Auth Admin API | http://localhost:3003/graphql | | e | Open Payments Auth API | http://localhost:3006 | -| f | Admin UI | http://localhost:3010 | +| f | Rafiki Admin UI | http://localhost:3010 | | g | Kratos API | http://localhost:4433 | #### Mock account servicing entity 2 - Happy Life Bank @@ -104,7 +104,7 @@ The following components are made available via the Local Playground: | j | Open Payments API | http://localhost:4000 | | k | Auth Admin API | http://localhost:4003/graphql | | l | Open Payments Auth API | http://localhost:4006 | -| m | Admin UI | http://localhost:4010 | +| m | Rafiki Admin UI | http://localhost:4010 | | n | Kratos API | http://localhost:4432 | #### Mail Slurper @@ -223,43 +223,29 @@ You have to go through an interaction flow by clicking on the `redirect` link in 9. Creates an outgoing payment on the sender's account 10. Fetches the outgoing payment on the sender's account -#### Admin UI +#### Rafiki Admin -To manage and view information about the Rafiki instance(s) using the [Rafiki Admin application](/admin/admin-user-guide/), you can navigate to `localhost:3010` (Cloud Nine Wallet) or `localhost:4010` (Happy Life Bank). The Rafiki Admin application runs a Remix app for querying info and executing mutations against the Rafiki [Backend Admin API](https://rafiki.dev/integration/playground/overview#admin-apis). +Manage and view information about the Rafiki instance(s) through the [Rafiki Admin](/admin/admin-user-guide/) application. Rafiki Admin is a Remix app for querying info and executing mutations against the Rafiki [Backend Admin API](https://rafiki.dev/integration/playground/overview#admin-apis). -Access to the Rafiki Admin application is managed using Ory Kratos, a secure and fully open-source identity and user management solution. Check it out on GitHub. Since access to the UI is invitation-only, the registration flow is not publicly available. To access the Admin UI, click the registration link provided in the logs during the local environment startup or manually add a new user with the `invite-user` script. +- Cloud Nine Wallet - http://localhost:3010 +- Happy Life Bank - http://localhost:4010 -Run the following Docker command in a terminal window, and it will output a recovery link. - -```sh -docker exec -it npm run invite-user -- example@mail.com` -``` - -The recovery link doubles as the invitation method. Copy and paste this link into your browser, and you will automatically be logged in and directed to the account settings page, where you can change the password for the account. +Visit the Rafiki Admin user guide to learn how to [invite](/admin/admin-user-guide#invite-a-user) and [remove](/admin/admin-user-guide#remove-a-user) users via provided scripts. :::note -A separate registration is required for Cloud Nine Wallet's Rafiki Admin and Happy Life Bank's Rafiki Admin, since they are each designed to run as separate mock account servicing entities. Once you've registered, you can always come back to your Rafiki Admin account by navigating to [`localhost:3010`](http://localhost:3010) (Cloud Nine Wallet) or [`localhost:4010`](http://localhost:4010) (Happy Life Bank) and logging in. - +Separate registrations/users are required for each mock ASE's Admin app as the ASEs are designed to run as separate mock entities. After you've registered, you can come back to your Rafiki Admin account by navigating to [`localhost:3010`](http://localhost:3010) (Cloud Nine Wallet) or [`localhost:4010`](http://localhost:4010) (Happy Life Bank) and logging in. ::: -##### Password recovery +##### Rafiki Admin password recovery -Follow these steps to reset an account’s password. +Follow these steps to reset a user's Rafiki Admin password. 1. Click the forgot password link and enter an email for a registered user. 2. Open [Mail Slurper](http://localhost:4436/) to access the recovery link for the account. -##### Remove users - -Remove users by running the following script in a terminal window: - -```sh -docker exec -it npm run delete-user -- example@mail.com. -``` - #### Admin APIs -In addition to using the Admin UI to interact with the Admin APIs, you can also use the Apollo Explorer on [localhost:3001/graphql](http://localhost:3001/graphql) and [localhost:4001/graphql](http://localhost:4001/graphql) for Cloud Nine Wallet and Happy Life Bank, respectively, and via the [Bruno collection](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Rafiki%20Admin%20APIs). The Bruno collection is configured to use the local environment's default endpoints. +In addition to using Rafiki Admin to interact with the Admin APIs, you can also use the Apollo Explorer on [localhost:3001/graphql](http://localhost:3001/graphql) and [localhost:4001/graphql](http://localhost:4001/graphql) for Cloud Nine Wallet and Happy Life Bank, respectively, and via the [Bruno collection](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Rafiki%20Admin%20APIs). The Bruno collection is configured to use the local environment's default endpoints. #### SPSP

    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 RvBUc$DvIg~nR3S7{}1W_2rU2r literal 306410 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%0DT@sl2~*4Ja5A2hz@RJ-@M*xcGEf8`j6ig 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 z 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%0Dfn4cU-L{?JYX^c`*e-9kT60#^ef)-S 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 Date: Tue, 10 Sep 2024 18:15:46 +0200 Subject: [PATCH 82/91] chore: wording update for outgoing auth token --- packages/frontend/app/routes/peers.$peerId.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/app/routes/peers.$peerId.tsx b/packages/frontend/app/routes/peers.$peerId.tsx index 3727277140..4956165325 100644 --- a/packages/frontend/app/routes/peers.$peerId.tsx +++ b/packages/frontend/app/routes/peers.$peerId.tsx @@ -224,7 +224,7 @@ export default function ViewPeerPage() { error={response?.errors.http.fieldErrors.outgoingAuthToken} description={ <> - List of valid tokens to present when sending outgoing ILP packets to the peer. + Valid auth token to present when sending outgoing ILP packets to the peer. } /> From 82a29d98916ea9e8ccced2ddb8dc3ab8d648ff18 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 10 Sep 2024 18:26:19 +0200 Subject: [PATCH 83/91] feat: updated 404 page --- packages/documentation/src/content/docs/404.mdx | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 packages/documentation/src/content/docs/404.mdx diff --git a/packages/documentation/src/content/docs/404.mdx b/packages/documentation/src/content/docs/404.mdx new file mode 100644 index 0000000000..697015aeb3 --- /dev/null +++ b/packages/documentation/src/content/docs/404.mdx @@ -0,0 +1,12 @@ +--- +title: 404 - Page Not Found +description: It seems like the page you're looking for doesn't exist. +template: splash +hero: + tagline: It seems like the page you're looking for doesn't exist. + actions: + - text: Go to Rafiki docs + link: /overview/overview + icon: open-book + variant: primary +--- From d39d18499ebdbdef465a0f587a21637f56b76530 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 10 Sep 2024 20:35:27 +0200 Subject: [PATCH 84/91] chore: removed unused files --- .../src/content/docs/introduction/overview.md | 24 -- .../src/content/docs/playground/overview.md | 273 ------------------ 2 files changed, 297 deletions(-) delete mode 100644 packages/documentation/src/content/docs/introduction/overview.md delete mode 100644 packages/documentation/src/content/docs/playground/overview.md diff --git a/packages/documentation/src/content/docs/introduction/overview.md b/packages/documentation/src/content/docs/introduction/overview.md deleted file mode 100644 index ef7805e625..0000000000 --- a/packages/documentation/src/content/docs/introduction/overview.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Overview ---- - -## What is Rafiki? - -Rafiki is open source software that allows an [Account Servicing Entity](/reference/glossary#account-servicing-entity) to enable [Interledger](/reference/glossary#interledger-protocol) functionality on its users' accounts. - -This includes - -- sending and receiving payments (via [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) and [Open Payments](/reference/glossary#open-payments)) -- allowing third-party access to initiate payments and view transation data (via [Open Payments](/reference/glossary#open-payments)) - -:::caution -Rafiki is intended to be run by [Account Servicing Entities](/reference/glossary#account-servicing-entity) only and should not be used in production by non-regulated entities. -::: - -Rafiki is made up of several components including an Interledger connector, a high-throughput accounting database called [TigerBeetle](/reference/glossary#tigerbeetle), an internal [admin interface](/rafikiadmin/overview), and several APIs: - -- the [Admin API](/integration/management) to create [peering relationships](/reference/glossary#peer), add supported [assets](/reference/glossary#asset), and issue [wallet addresses](/reference/glossary#wallet-address) -- the [Open Payments](/reference/glossary#open-payments) API to allow third-parties (with the account holder's consent) to initiate payments and to view the transaction history -- the [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) API for simple Interledger Payments - -Additionally, this package also includes a reference implementation of a [GNAP](/reference/glossary#grant-negotiation-authorization-protocol) authorization server which handles the access control for the [Open Payments](/reference/glossary#open-payments) API. For more information on the architecture, check out the [Architecture documentation](/introduction/architecture). diff --git a/packages/documentation/src/content/docs/playground/overview.md b/packages/documentation/src/content/docs/playground/overview.md deleted file mode 100644 index 2bc1718f4e..0000000000 --- a/packages/documentation/src/content/docs/playground/overview.md +++ /dev/null @@ -1,273 +0,0 @@ ---- -title: Overview ---- - -We have created a suite of packages that, together, mock an account servicing entity that has deployed Rafiki, exposing an [SPSP](/reference/glossary#simple-payments-setup-protocol-spsp) endpoint, the [Open Payments](/reference/glossary#open-payments) APIs with its required [GNAP](/reference/glossary#grant-negotiation-authorization-protocol) auth endpoints to request grants, a STREAM endpoint for receiving Interledger packets, and a UI to view and manage the Rafiki instance. - -These packages include: - -- `backend` (SPSP, Open Payments APIs, GraphQL Admin APIs, STREAM endpoint) -- `auth` (GNAP auth server) -- `mock-account-servicing-entity` (mocks an [Account Servicing Entity](/reference/glossary#account-servicing-entity)) -- `frontend` (Remix app to expose a UI for Rafiki Admin management via interaction with the `backend` Admin APIs) -- `kratos` (An identity and user management solution for the `frontend`) -- `mailslurper` (A SMTP mail server to catch account recovery emails for the `frontend`) - -These packages depend on the following databases: - -- TigerBeetle or Postgres (accounting) -- Postgres (Open Payments resources, auth resources) -- Redis (STREAM details, auth sessions) - -We provide containerized versions of our packages together with two pre-configured docker-compose files ([Cloud Nine Wallet](https://github.com/interledger/rafiki/blob/main/localenv/cloud-nine-wallet/docker-compose.yml) and [Happy Life Bank](https://github.com/interledger/rafiki/blob/main/localenv/happy-life-bank/docker-compose.yml)) to start two Mock Account Servicing Entities with their respective Rafiki backend and auth servers. They automatically peer and 2 to 3 user accounts are created on both of them. - -This environment will set up a playground where you can use the Rafiki Admin APIs and the Open Payments APIs. - -## Disclaimer - -> **The Mock ASE provided in this repository is intended solely for internal use and demonstration purposes. It is not designed to serve as a reference architecture. If you are looking for a reference implementation of an ASE, please refer to the [Test Wallet](https://github.com/interledger/testnet).** - -## Environment overview - -![Docker compose environment](/img/localenv-architecture.png) - -#### Cloud Nine Wallet - -(a) User Interface - accessible at http://localhost:3030 - -(b) Admin API - accessible at http://localhost:3001/graphql - -(c) Open Payments API - accessible at http://localhost:3000 - -(d) Auth Admin API - accessible at http://localhost:3003/graphql - -(e) Open Payments Auth API - accessible at http://localhost:3006 - -(f) Admin UI - accessible at http://localhost:3010 - -(g) Kratos API - accessible at http://localhost:4433 - -#### Happy Life Bank - -(h) User Interface - accessible at http://localhost:3031 - -(i) Admin API - accessible at http://localhost:4001/graphql - -(j) Open Payments API - accessible at http://localhost:4000 - -(k) Auth Admin API - accessible at http://localhost:4003/graphql - -(l) Open Payments Auth API - accessible at http://localhost:4006 - -(m) Admin UI - accessible at http://localhost:4010 - -(n) Kratos API - accessible at http://localhost:4432 - -#### Mail Slurper - -(o) Mail UI - accessible at http://localhost:4436 - -#### Database - -Postgres Server - accessible at http://localhost:5432 - -### Exploring Accounts on Mock Account Servicing Entity - -Navigate to [`localhost:3030`](http://localhost:3030) to view the accounts on one instance of the Mock Account Servicing Entity called Cloud Nine Wallet. - -![Mock Account Servicing Entity Accounts](/img/map-accounts.png) - -The accounts of the second instance (Happy Life Bank) can be found on [`localhost:3031`](http://localhost:3031). - -When clicking on the Account Name, you can view the account information, the available balance, and see a list of transactions. - -![Mock Account Servicing Entity Transactions](/img/map-transactions.png) - -## Running the local environment - -### Dependencies - -- [Rafiki local environment setup](https://github.com/interledger/rafiki/blob/main/README.md#environment-setup) -- [docker](https://docs.docker.com/get-docker/) -- [Bruno](https://www.usebruno.com/downloads), an open source API client - -### Setup - -The following should be run from the root of the project. - -```sh -# If you have spun up the environment before, remember to first tear down and remove volumes! - -# start the local environment -pnpm localenv:compose up - -# tear down and remove volumes -pnpm localenv:compose down --volumes - -# tear down, delete database volumes and remove images -pnpm localenv:compose down --volumes --rmi all -``` - -If you want to use Postgres as the accounting database instead of TigerBeetle, you can use the `psql` variant of the `localenv:compose` commands: - -```sh -pnpm localenv:compose:psql up -pnpm localenv:compose:psql down --volumes -``` - -The local environment consists of a primary Rafiki instance and a secondary Rafiki instance, each with -its own docker compose files ([Cloud Nine Wallet](https://github.com/interledger/rafiki/blob/main/localenv/cloud-nine-wallet/docker-compose.yml), [Happy Life Bank](https://github.com/interledger/rafiki/blob/main/localenv/happy-life-bank/docker-compose.yml)). -The primary Cloud Nine Wallet docker compose file (`./cloud-nine-wallet/docker-compose.yml`) includes the main Rafiki services `backend` and `auth`, as well -as the required data stores tigerbeetle (if enabled), redis, and postgres, so it can be run on its own. -The secondary Happy Life Bank docker compose file (`./happy-life-bank/docker-compose.yml`) includes only the Rafiki services, not the data stores. It uses the -data stores created by the primary Rafiki instance so it can't be run by itself. -The `pnpm localenv:compose up` command starts both the primary instance and the secondary. - -### Debugging - -Debuggers for the services are exposed on the following ports: - -| IP and Port | Services | -| -------------- | ------------------------- | -| 127.0.0.1:9229 | Cloud Nine Wallet Backend | -| 127.0.0.1:9230 | Cloud Nine Auth | -| 127.0.0.1:9231 | Happy Life Bank Backend | -| 127.0.0.1:9232 | Happy Life Bank Auth | - -#### With a chromium browser: - -- go to `chrome://inspect` -- Click "Configure" and add the IP addresses and ports detailed above -- start docker containers -- click "inspect" on the service you want to debug to open the chromium debugger - -You can either trigger the debugger by adding `debugger` statements in code and restarting, or by adding breakpoints directly in the chromium debugger after starting the docker containers. - -#### With VS Code: - -For debugging with VS Code, you can add this configuration to your `.vscode/launch.json`): - -```json -{ - "name": "Attach to docker (cloud-nine-backend)", - "type": "node", - "request": "attach", - "port": 9229, - "address": "localhost", - "localRoot": "${workspaceFolder}", - "remoteRoot": "/home/rafiki/", - "restart": true -}, -``` - -`localRoot` will vary depending on the location of `launch.json` relative to rafiki's root directory. - -For more ways to connect debuggers, see the Node docs for debugging: https://nodejs.org/en/learn/getting-started/debugging - -### Shutting down - -```sh -# tear down -pnpm localenv:compose down - -# tear down and delete database volumes -pnpm localenv:compose down --volumes - -# tear down, delete database volumes and remove images -pnpm localenv:compose down --volumes --rmi all -``` - -### Commands - -| Command | Description | -| ------------------------------------------------ | ------------------------------------------------ | -| `pnpm localenv:compose config` | Show all merged config (with Tigerbeetle) | -| `pnpm localenv:compose up` | Start (with Tigerbeetle) | -| `pnpm localenv:compose up -d` | Start (with Tigerbeetle) detached | -| `pnpm localenv:compose down` | Down (with Tigerbeetle) | -| `pnpm localenv:compose down --volumes` | Down and kill volumes (with Tigerbeetle) | -| `pnpm localenv:compose down --volumes --rmi all` | Down, kill volumes (with Tigerbeetle) and images | -| `pnpm localenv:compose:psql config` | Show all merged config (with Postgresql) | -| `pnpm localenv:compose build` | Build all the containers (with Tigerbeetle) | -| `pnpm localenv:compose:psql up` | Start (with Postgresql) | -| `pnpm localenv:compose:psql up -d` | Start (with Postgresql) detached | -| `pnpm localenv:compose:psql down` | Down (with Postgresql) | -| `pnpm localenv:compose:psql down --volumes` | Down (with Postgresql) and kill volumes | -| `pnpm localenv:compose:psql build` | Build all the containers (with Postgresql) | - -### Usage - -#### Bruno & Open Payments APIs - -The Open Payments APIs can be interacted with using the [Bruno collection](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki) ([resource server endpoints](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Open%20Payments%20APIs) and [auth server endpoints](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Open%20Payments%20Auth%20APIs)). It requires you to - -1. load the collection into Bruno by clicking "Open Collection" -2. navigating to `/rafiki/bruno/collections/Rafiki` on your machine and clicking "Open" -3. Furthermore, you need to either load the [Local Environment](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/environments/Local%20Playground.bru) or the [Remote Environment](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/environments/Remote.bru). - -The Examples folder in the Bruno collection includes an [Open Payments](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Examples/Open%20Payments) example that can be executed one by one. It - -1. requests the sender's wallet address -2. requests the receiver's wallet address -3. requests a grant to create an incoming payment on the receiver's account -4. creates an incoming payment on receiver's account -5. requests a grant to create (and read) a quote on the sender's account -6. creates a quote on the sender's account -7. requests a grant to create (and read) an outgoing payment on the sender's account - -Note that you have to go through an interaction flow by clicking on the `redirect` link in the grant request response. More information about the interaction flow can be found [here](/concepts/open-payments/grant-interaction). - -8. continues the grant request -9. creates an outgoing payment on the sender's account -10. fetches the outgoing payment on the sender's account - -#### Admin UI - -In order to manage, and view information about the Rafiki instance(s) you can use the [Rafiki Admin](/rafikiadmin/overview) UI. We have secured access to Rafiki Admin using [Ory Kratos](https://www.ory.sh/docs/kratos/ory-kratos-intro). Since access to the UI is on an invitation-only basis the registration flow is not publicly available. As such, in order to access Rafiki Admin you can click the registration link provided in the logs during `localenv` startup or you can manually add a new user with the invite-user script. Run `docker exec -it npm run invite-user -- example@mail.com` and it will output a link to the terminal. Copy and paste this link in your browser and you will automatically be logged in and directed to the account settings page. The next step is changing your password. We're using a simple email and password authentication method. - -Note that a separate registration is required for Cloud Nine Wallet's Rafiki Admin and Happy Life Bank's Rafiki Admin, since they are each designed to run as separate mock account servicing entities. Once you've registered, you can always come back to your Rafiki Admin account by navigating to [`localhost:3010`](http://localhost:3010) (Cloud Nine Wallet) or [`localhost:4010`](http://localhost:4010) (Happy Life Bank) and logging in. - -You can test the account recovery flow by clicking "Forgot pasword?" on the login page and by navigating to [`localhost:4436`](http://localhost:4436) (Mailslurper interface). - -#### Admin APIs - -In addition to the using the Admin UI for interacting with the Admin APIs, you can also use the Apollo explorer (on [`localhost:3001/graphql`](http://localhost:3001/graphql) and [`localhost:4001/graphql`](http://localhost:4001/graphql), respectively), and also via the [Bruno collection](https://github.com/interledger/rafiki/tree/main/bruno/collections/Rafiki/Rafiki%20Admin%20APIs). The Bruno collection is configured to use the default endpoints of the local environment. - -#### SPSP - -Every wallet address also serves as an SPSP endpoint. A GET request to e.g. `http://localhost:3000/accounts/gfranklin` with `Accept` header `application/spsp4+json` will return an SPSP response with STREAM connection details. - -```http -http GET http://localhost:3000/accounts/gfranklin Host:backend Accept:application/spsp4+json - -HTTP/1.1 200 OK -Connection: keep-alive -Content-Length: 220 -Content-Type: application/spsp4+json -Date: Thu, 23 Feb 2023 13:07:24 GMT -Keep-Alive: timeout=5 - -{ - "destination_account": "test.rafiki.viXmy1OVHgvmQakNjX1C6kQMri92DzHeISEv-5VzTDuFhrpsrkDzsq5OO9Lfa9yed0L2RJGC9hA_IX-zztTtTZ87shCYvsQ", - "receipts_enabled": false, - "shared_secret": "Rz_vudcg13EPs8ehL2drvZFJS1LJ4Y3EltOI60-lQ78" -} - -``` - -### Known Issues - -#### No data in Mock Account Servicing Entity (MASE) - -It is possible that upon (re)starting the local playground, you may run into an issue where there are no accounts/wallet addresses visible in the mock account servicing entities' pages (http://localhost:3030, http://localhost:3031). This is because seeding of the initial account data only works against an empty database. To correct this, clear the volumes, and restart the container via: - -```sh -pnpm localenv:compose down --volumes -pnpm localenv:compose up -d -``` - -#### TigerBeetle container exits with code 137 - -This is a known [issue](https://docs.tigerbeetle.com/getting-started/with-docker-compose/#exited-with-code-137) when running TigerBeetle in Docker: the container exits without logs and simply shows error code 137. To fix this, increase the Docker memory limit. - -If you are running the local playground in Docker on a Windows machine using WSL, you can increase the memory limit by [configuring](https://learn.microsoft.com/en-us/windows/wsl/wsl-config#example-wslconfig-file) your `.wslconfig` file. From ef29d661b971f3d6bc9fa7806babf08c07cdfd3d Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Tue, 10 Sep 2024 20:40:53 +0200 Subject: [PATCH 85/91] chore: removed unused files --- .../documentation/public/img/rafiki-admin.png | Bin 25631 -> 0 bytes .../documentation/public/img/rafiki-auth.png | Bin 26981 -> 0 bytes .../src/content/docs/rafikiadmin/overview.md | 11 ----------- 3 files changed, 11 deletions(-) delete mode 100644 packages/documentation/public/img/rafiki-admin.png delete mode 100644 packages/documentation/public/img/rafiki-auth.png delete mode 100644 packages/documentation/src/content/docs/rafikiadmin/overview.md diff --git a/packages/documentation/public/img/rafiki-admin.png b/packages/documentation/public/img/rafiki-admin.png deleted file mode 100644 index 001099bd38fafba3001d279d98cf7ba6ceb941ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25631 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Ӛu`KKkELuKSjWw-KM2OgBzy;GP_ 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 diff --git a/packages/documentation/public/img/rafiki-auth.png b/packages/documentation/public/img/rafiki-auth.png deleted file mode 100644 index d84849bb09c289d715cbeba6f3256ffbb8dabfa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26981 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

  • n*A;>9LJ;QVM)S?3zyb@(Qz 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 literal 0 HcmV?d00001 diff --git a/packages/documentation/public/img/admin-guide/home.png b/packages/documentation/public/img/admin-guide/home.png new file mode 100644 index 0000000000000000000000000000000000000000..0f66bf26f6cdaf4ce22cb3084233fcac3a3a5e3b GIT binary patch literal 95217 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 z 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%0AP|V= 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 literal 0 HcmV?d00001 diff --git a/packages/documentation/public/img/admin-guide/peers.png b/packages/documentation/public/img/admin-guide/peers.png new file mode 100644 index 0000000000000000000000000000000000000000..a448f299c3e4b32bac2476da0cbd2e474de6bcdd GIT binary patch literal 59189 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ξuf(@qbqgEGKeYU9}$2=c- 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