Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: accept peering request #1849

Merged
merged 90 commits into from
Sep 19, 2023
Merged
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
4f458ba
feat(backend): WIP - add feeid to quote table
BlairCurrey Aug 15, 2023
7dc1d60
refactor(backend): rename quote gql field
BlairCurrey Aug 15, 2023
e39bb88
Merge branch 'main' into bc/1639/add-fees-to-quote
BlairCurrey Aug 18, 2023
35ed878
Merge branch 'main' into bc/1639/add-fees-to-quote
BlairCurrey Aug 21, 2023
752df9b
fix(backend): add fee relation
BlairCurrey Aug 21, 2023
088058b
feat(backend): WIP calculate fees in quote create
BlairCurrey Aug 21, 2023
5cce896
refactor(backend): rename gql quote field
BlairCurrey Aug 23, 2023
7bc19df
fix(backend): rm unused with graph fetched
BlairCurrey Aug 23, 2023
8383ed5
Merge branch 'main' into bc/1639/add-fees-to-quote
BlairCurrey Aug 23, 2023
a0b2c30
Merge branch 'main' into bc/1639/add-fees-to-quote
BlairCurrey Aug 28, 2023
874bcf6
feat(backend): move fee calculation to quote service
BlairCurrey Aug 30, 2023
d58532c
fix(backend): use quote error
BlairCurrey Aug 31, 2023
4026c23
Merge branch 'main' into bc/1639/add-fees-to-quote
BlairCurrey Aug 31, 2023
d4e0bdf
Merge branch 'main' into bc/1639/add-fees-to-quote
BlairCurrey Sep 2, 2023
9635035
fix(backend): rm unused fn
BlairCurrey Sep 2, 2023
1fd63fd
refactor(backend): rename quote send amount value
BlairCurrey Sep 4, 2023
dc88ba8
refactor(backend): rename quote send amount to debit amount
BlairCurrey Sep 4, 2023
e393681
refactor(backend): rename out payment send amount to debit
BlairCurrey Sep 4, 2023
9a09017
chore(backend): format
BlairCurrey Sep 4, 2023
393198b
chore(documentation): update gql docs
BlairCurrey Sep 4, 2023
c5ea21d
fix(backend,localenv): trx amount
BlairCurrey Sep 4, 2023
46cb2cd
fix(backend): handle cross currency fee in quote
BlairCurrey Sep 6, 2023
28f096a
Merge branch 'main' into bc/1639/add-fees-to-quote
BlairCurrey Sep 6, 2023
4c3ae8e
refactor: update spec and rename more fields
BlairCurrey Sep 7, 2023
93a0da7
fix(backend): outgoing limit test
BlairCurrey Sep 7, 2023
4904216
refactor(backend): rename limits field
BlairCurrey Sep 7, 2023
198b4ea
rename sendAmount to debitAmount
BlairCurrey Sep 7, 2023
44e2884
fix(localenv): postman ecommerce flow
BlairCurrey Sep 7, 2023
75b328a
Merge branch 'main' into bc/1639/add-fees-to-quote
BlairCurrey Sep 7, 2023
56bd689
fix(backend): remove useless checks
BlairCurrey Sep 7, 2023
84c8421
chore(auth): update open-payments package version
BlairCurrey Sep 7, 2023
3a1b353
chore(backend): rm commented out code
BlairCurrey Sep 8, 2023
b33aed1
fix(auth): migration to rename jsonb col
BlairCurrey Sep 8, 2023
fc6d045
Merge branch 'main' into bc/1639/add-fees-to-quote
BlairCurrey Sep 8, 2023
316e7f7
chore(auth): format
BlairCurrey Sep 8, 2023
a74de35
feat: add DuplicatePeer error
mkurapov Sep 11, 2023
62577f3
fix: pass in peerService to autoPeeringService
mkurapov Sep 8, 2023
01cfbf3
chore: update diff
mkurapov Sep 11, 2023
3677482
chore: add to peer resolver test
mkurapov Sep 11, 2023
2ba0761
feat: accept peering request
mkurapov Sep 11, 2023
7e2df45
fix(backend): remove asset join
BlairCurrey Sep 11, 2023
6a5bf5b
refactor(backend): remove variable assignment
BlairCurrey Sep 11, 2023
e361481
feat: wire up router for auto peering
mkurapov Sep 12, 2023
fc27cef
fix: update auto peering service
mkurapov Sep 12, 2023
18f9bf3
feat: correct config
mkurapov Sep 12, 2023
221c269
config: update auto peering routes & errors
mkurapov Sep 12, 2023
3e74ebc
chore: prettier
mkurapov Sep 12, 2023
6ee3165
Merge branch 'mk/1761/duplicate-peer' into mk/1802/accept-peering-req…
mkurapov Sep 12, 2023
b7a7ba6
Merge branch 'main' into mk/1802/accept-peering-request
mkurapov Sep 12, 2023
139426c
Merge branch 'main' into mk/1761/duplicate-peer
mkurapov Sep 12, 2023
788a203
Merge branch 'mk/1761/duplicate-peer' into mk/1802/accept-peering-req…
mkurapov Sep 12, 2023
afa767f
chore: address comments
mkurapov Sep 13, 2023
3ad9a83
Merge branch 'mk/1761/duplicate-peer' into mk/1802/accept-peering-req…
mkurapov Sep 13, 2023
d28da05
Update packages/backend/src/auto-peering/errors.ts
mkurapov Sep 13, 2023
a52658c
Merge branch 'mk/1802/accept-peering-request' of github.com:interledg…
mkurapov Sep 13, 2023
6cb6419
chore: remove axios from app
mkurapov Sep 13, 2023
1e1d461
chore: fix whitespace
mkurapov Sep 13, 2023
310fce3
feature(backend): change error
BlairCurrey Sep 13, 2023
937e495
Merge branch 'main' into bc/1639/add-fees-to-quote
BlairCurrey Sep 13, 2023
e6f6f34
reactor(documentation): update fee explanation
BlairCurrey Sep 13, 2023
0567cf0
feat: use assetId in getByDestinationAddress
mkurapov Sep 13, 2023
76bceb4
feat: update peer on duplicate peering request
mkurapov Sep 13, 2023
de3a256
chore: remove quote url references
BlairCurrey Sep 13, 2023
633ed35
fix(openapi): missing server warning
BlairCurrey Sep 13, 2023
b9910e1
Merge branch 'main' into mk/1802/accept-peering-request
mkurapov Sep 13, 2023
c540606
chore: fix route tests
mkurapov Sep 13, 2023
b0b90c2
feat: support maxPacketAmount and name in peering request
mkurapov Sep 13, 2023
d3648c1
feat: support maxPacketAmount and name in peering request
mkurapov Sep 13, 2023
ba0f6a9
Merge branch 'mk/1802/accept-peering-request' of github.com:interledg…
mkurapov Sep 13, 2023
0e9ccf1
fix: remove getter
mkurapov Sep 13, 2023
bc7c69a
Temporary fix
raducristianpopa Sep 14, 2023
05155a8
chore(token-introspection): generate types
BlairCurrey Sep 14, 2023
9619132
Merge branch 'main' into mk/1802/accept-peering-request
mkurapov Sep 14, 2023
db49061
refactor(documentation): rename sendAmount to debitAmount
BlairCurrey Sep 14, 2023
8fb0154
Merge branch 'bc/1639/add-fees-to-quote' into mk/1802/accept-peering-…
mkurapov Sep 14, 2023
8e8c1a5
Revert "Merge branch 'bc/1639/add-fees-to-quote' into mk/1802/accept-…
mkurapov Sep 14, 2023
a217d32
ci: test heap bump
mkurapov Sep 14, 2023
66293e5
ci: logheapusage
mkurapov Sep 14, 2023
efb5d04
chore: bump jest
mkurapov Sep 14, 2023
0b803cd
Merge branch 'mk/1802/accept-peering-request' of github.com:interledg…
mkurapov Sep 14, 2023
be95eec
chore: update tests
mkurapov Sep 14, 2023
a7a9f65
chore: update tests
mkurapov Sep 14, 2023
c165506
Merge branch 'mk/1802/accept-peering-request' of github.com:interledg…
mkurapov Sep 14, 2023
0f2b805
Merge branch 'main' into mk/1802/accept-peering-request
mkurapov Sep 14, 2023
8bb493e
Revert "ci: logheapusage"
mkurapov Sep 14, 2023
d61dca0
Merge branch 'main' into mk/1802/accept-peering-request
mkurapov Sep 14, 2023
875642f
Merge branch 'main' into mk/1802/accept-peering-request
mkurapov Sep 14, 2023
10bb608
revert fix
mkurapov Sep 14, 2023
f940eb1
fix: revert pnpm lock
mkurapov Sep 14, 2023
f18a7b8
Merge branch 'main' into mk/1802/accept-peering-request
mkurapov Sep 19, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions packages/backend/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -487,8 +487,7 @@ export class App {
const router = new Router<DefaultState, AppContext>()

router.use(bodyParser())

router.get('/', autoPeeringRoutes.get)
router.post('/', autoPeeringRoutes.acceptPeerRequest)

koa.use(router.routes())

Expand Down
38 changes: 38 additions & 0 deletions packages/backend/src/auto-peering/errors.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
export enum AutoPeeringError {
InvalidIlpConfiguration = 'InvalidIlpConfiguration',
InvalidPeerIlpConfiguration = 'InvalidPeerIlpConfiguration',
UnknownAsset = 'UnknownAsset',
PeerUnsupportedAsset = 'PeerUnsupportedAsset',
InvalidPeerUrl = 'InvalidPeerUrl',
InvalidPeeringRequest = 'InvalidPeeringRequest',
DuplicatePeer = 'DuplicatePeer'
}

// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
export const isAutoPeeringError = (o: any): o is AutoPeeringError =>
Object.values(AutoPeeringError).includes(o)

export const errorToCode: {
[key in AutoPeeringError]: number
} = {
[AutoPeeringError.InvalidIlpConfiguration]: 400,
[AutoPeeringError.InvalidPeerIlpConfiguration]: 400,
[AutoPeeringError.UnknownAsset]: 404,
[AutoPeeringError.PeerUnsupportedAsset]: 400,
[AutoPeeringError.InvalidPeerUrl]: 400,
[AutoPeeringError.InvalidPeeringRequest]: 400,
[AutoPeeringError.DuplicatePeer]: 409
}

export const errorToMessage: {
[key in AutoPeeringError]: string
} = {
[AutoPeeringError.InvalidIlpConfiguration]:
'The ILP configuration is misconfigured',
[AutoPeeringError.InvalidPeerIlpConfiguration]: `Requested peer's ILP configuration is misconfigured`,
[AutoPeeringError.UnknownAsset]: 'Unknown asset',
[AutoPeeringError.PeerUnsupportedAsset]: 'Peer does not support asset',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How does the error related to unsupported assets work?

  • when one of the provided assets is not supported it rollbacks everything
  • when one of the provided assets is not supported it keeps creating the others but will return the message AutoPeeringError.PeerUnsupportedAsset

And what is the difference between AutoPeeringError.PeerUnsupportedAsset and AutoPeeringError.UnknownAsset

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Originally, I was thinking about changing how we define the "Peer" in Rafiki to be relationship to be 1 Peer many assets, but after consideration w Sabine we decided it's better to keep what we have now 1 "Peer" defines an ILP relationship over a single asset: it keeps liquidity management a little bit easier to understand, and doesn't require a big overhaul in the service/DB.

As a result,

when one of the provided assets is not supported
this isn't a scenario that would happen, given we only try to attempt to auto-peer using one asset

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And what is the difference between AutoPeeringError.PeerUnsupportedAsset and AutoPeeringError.UnknownAsset

from the perspective of peer 1 trying to peer with peer 2, AutoPeeringError.UnknownAsset
is if your own (peer 1) instance does not support the asset and AutoPeeringError.PeerUnsupportedAsset is when trying to peer with peer 2, peer 2 does not support the asset

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the peer 1 is initializing the peering, won't it do it only for known assets?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it's just the case for the wrong input

[AutoPeeringError.InvalidPeerUrl]: 'Peer URL is invalid',
[AutoPeeringError.InvalidPeeringRequest]: 'Invalid peering request',
[AutoPeeringError.DuplicatePeer]: 'Duplicate peer'
}
70 changes: 44 additions & 26 deletions packages/backend/src/auto-peering/routes.test.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
import { IocContract } from '@adonisjs/fold'
import { initIocContainer } from '..'
import { AppContext, AppServices } from '../app'
import { Config } from '../config/app'
import { AppServices } from '../app'
import { Config, IAppConfig } from '../config/app'
import { createTestApp, TestContainer } from '../tests/app'
import { createAsset } from '../tests/asset'
import { createContext } from '../tests/context'
import { truncateTables } from '../tests/tableManager'
import { AutoPeeringRoutes } from './routes'
import { AutoPeeringError, errorToCode, errorToMessage } from './errors'
import { AutoPeeringRoutes, PeerRequestContext } from './routes'

describe('Auto Peering Routes', (): void => {
let deps: IocContract<AppServices>
let appContainer: TestContainer
let autoPeeringRoutes: AutoPeeringRoutes
let config: IAppConfig

beforeAll(async (): Promise<void> => {
deps = initIocContainer({ ...Config, enableAutoPeering: true })
appContainer = await createTestApp(deps)
autoPeeringRoutes = await deps.use('autoPeeringRoutes')
config = await deps.use('config')
})

afterEach(async (): Promise<void> => {
Expand All @@ -27,41 +30,56 @@ describe('Auto Peering Routes', (): void => {
await appContainer.shutdown()
})

describe('get', (): void => {
test('returns peering details with assets', async (): Promise<void> => {
const assets = await Promise.all([
createAsset(deps),
createAsset(deps),
createAsset(deps)
])
describe('acceptPeerRequest', (): void => {
test('returns peering details', async (): Promise<void> => {
const asset = await createAsset(deps)

const ctx = createContext<AppContext>({
const ctx = createContext<PeerRequestContext>({
headers: { Accept: 'application/json' },
url: `/`
url: `/`,
body: {
staticIlpAddress: 'test.rafiki-money',
ilpConnectorAddress: 'http://peer.rafiki.money',
asset: { code: asset.code, scale: asset.scale },
httpToken: 'someHttpToken',
maxPacketAmount: 1000,
name: 'Rafiki Money'
}
})

await expect(autoPeeringRoutes.get(ctx)).resolves.toBeUndefined()
await expect(
autoPeeringRoutes.acceptPeerRequest(ctx)
).resolves.toBeUndefined()
expect(ctx.status).toBe(200)
expect(ctx.body).toEqual({
ilpAddress: Config.ilpAddress,
assets: expect.arrayContaining(
assets.map((asset) => ({
code: asset.code,
scale: asset.scale
}))
)
staticIlpAddress: config.ilpAddress,
ilpConnectorAddress: config.ilpConnectorAddress,
httpToken: expect.any(String),
name: config.instanceName
})
})

test('returns peering details without assets', async (): Promise<void> => {
const ctx = createContext<AppContext>({
test('properly handles error', async (): Promise<void> => {
const ctx = createContext<PeerRequestContext>({
headers: { Accept: 'application/json' },
url: `/`
url: `/`,
body: {
staticIlpAddress: 'test.rafiki-money',
ilpConnectorAddress: 'http://peer.rafiki.money',
asset: { code: 'ABC', scale: 2 },
httpToken: 'someHttpToken'
}
})

await expect(autoPeeringRoutes.get(ctx)).resolves.toBeUndefined()
await expect(
autoPeeringRoutes.acceptPeerRequest(ctx)
).resolves.toBeUndefined()
expect(ctx.status).toBe(errorToCode[AutoPeeringError.UnknownAsset])
expect(ctx.body).toEqual({
ilpAddress: Config.ilpAddress,
assets: []
error: {
code: errorToCode[AutoPeeringError.UnknownAsset],
message: errorToMessage[AutoPeeringError.UnknownAsset]
}
})
})
})
Expand Down
41 changes: 35 additions & 6 deletions packages/backend/src/auto-peering/routes.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,29 @@
import { AppContext } from '../app'
import { BaseService } from '../shared/baseService'
import { errorToCode, errorToMessage, isAutoPeeringError } from './errors'
import { AutoPeeringService } from './service'

interface PeeringRequestArgs {
staticIlpAddress: string
ilpConnectorAddress: string
asset: { code: string; scale: number }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be easier if we ask for an array of assets?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

replied: #1849 (comment)

httpToken: string
maxPacketAmount?: number
name?: string
}

export type PeerRequestContext = Exclude<AppContext, 'request'> & {
request: {
body: PeeringRequestArgs
}
}

export interface ServiceDependencies extends BaseService {
autoPeeringService: AutoPeeringService
}

export interface AutoPeeringRoutes {
get(ctx: AppContext): Promise<void>
acceptPeerRequest(ctx: PeerRequestContext): Promise<void>
}

export async function createAutoPeeringRoutes(
Expand All @@ -21,15 +37,28 @@ export async function createAutoPeeringRoutes(
}

return {
get: (ctx: AppContext) => getPeeringDetails(deps, ctx)
acceptPeerRequest: (ctx: PeerRequestContext) => acceptPeerRequest(deps, ctx)
}
}

async function getPeeringDetails(
async function acceptPeerRequest(
deps: ServiceDependencies,
ctx: AppContext
ctx: PeerRequestContext
): Promise<void> {
const peeringDetails = await deps.autoPeeringService.getPeeringDetails()
const peeringDetailsOrError =
await deps.autoPeeringService.acceptPeeringRequest(ctx.request.body)

ctx.body = peeringDetails
if (isAutoPeeringError(peeringDetailsOrError)) {
const errorCode = errorToCode[peeringDetailsOrError]
ctx.status = errorCode
ctx.body = {
error: {
code: errorCode,
message: errorToMessage[peeringDetailsOrError]
}
}
} else {
ctx.status = 200
ctx.body = peeringDetailsOrError
}
}
Loading