Skip to content

Commit d80115a

Browse files
committed
feat(wip): schema enforced wallet address prefixes
1 parent 14e0c8b commit d80115a

File tree

23 files changed

+134
-117
lines changed

23 files changed

+134
-117
lines changed

bruno/collections/Rafiki/Rafiki Admin APIs/Create Tenant.bru

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ body:graphql {
1919
apiSecret
2020
idpConsentUrl
2121
idpSecret
22+
walletAddressPrefix
2223
}
2324
}
2425
}
@@ -30,7 +31,8 @@ body:graphql:vars {
3031
"email": "[email protected]",
3132
"apiSecret": "test-secret",
3233
"idpConsentUrl": "https://example.com/consent",
33-
"idpSecret": "test-idp-secret"
34+
"idpSecret": "test-idp-secret",
35+
"walletAddressPrefix": "https://google.com"
3436
}
3537
}
3638
}

localenv/mock-account-servicing-entity/generated/graphql.ts

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/jest.env.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
process.env.LOG_LEVEL = 'silent'
1+
process.env.LOG_LEVEL = 'info'
22
process.env.INSTANCE_NAME = 'Rafiki'
33
process.env.KEY_ID = 'myKey'
4-
process.env.OPEN_PAYMENTS_URL = 'http://127.0.0.1:3000'
4+
process.env.OPEN_PAYMENTS_URL = 'https://127.0.0.1:3000'
55
process.env.ILP_CONNECTOR_URL = 'http://127.0.0.1:3002'
66
process.env.ILP_ADDRESS = 'test.rafiki'
77
process.env.AUTH_SERVER_GRANT_URL = 'http://127.0.0.1:3006'

packages/backend/migrations/20250930210751_add_prefix_to_tenant.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,20 @@ exports.up = function (knex) {
88
table.string('walletAddressPrefix').unique()
99
})
1010
.then(() => {
11-
knex.raw(
11+
return knex.raw(
1212
`UPDATE "tenants" SET "walletAddressPrefix" = (SELECT "value" from "tenantSettings" WHERE "tenantId" = "tenants"."id" AND "key" = 'WALLET_ADDRESS_URL')`
1313
)
1414
})
1515
.then(() => {
16-
knex.raw(`DELETE "tenantSettings" WHERE "key" = 'WALLET_ADDRESS_URL'`)
16+
return knex.raw(`DELETE FROM "tenantSettings" WHERE "key" = 'WALLET_ADDRESS_URL'`)
17+
})
18+
.then(() => {
19+
return knex.raw(`UPDATE "tenants" SET "walletAddressPrefix" = '${process.env.OPEN_PAYMENTS_URL}/' || gen_random_uuid() WHERE "walletAddressPrefix" IS NULL`)
20+
})
21+
.then(() => {
22+
return knex.schema.alterTable('tenants', (table) => {
23+
table.dropNullable('walletAddressPrefix')
24+
})
1725
})
1826
}
1927

packages/backend/src/graphql/generated/graphql.schema.json

Lines changed: 7 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/src/graphql/generated/graphql.ts

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/src/graphql/resolvers/tenant.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ describe('Tenant Resolvers', (): void => {
241241
idpConsentUrl
242242
idpSecret
243243
publicName
244+
walletAddressPrefix
244245
}
245246
}
246247
}
@@ -274,6 +275,7 @@ describe('Tenant Resolvers', (): void => {
274275
idpConsentUrl
275276
idpSecret
276277
publicName
278+
walletAddressPrefix
277279
}
278280
}
279281
}
@@ -406,6 +408,7 @@ describe('Tenant Resolvers', (): void => {
406408
idpConsentUrl
407409
idpSecret
408410
publicName
411+
walletAddressPrefix
409412
}
410413
}
411414
}
@@ -441,6 +444,7 @@ describe('Tenant Resolvers', (): void => {
441444
idpConsentUrl
442445
idpSecret
443446
publicName
447+
walletAddressPrefix
444448
}
445449
}
446450
}

packages/backend/src/graphql/resolvers/wallet_address.test.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { IocContract } from '@adonisjs/fold'
1717
import { AppServices } from '../../app'
1818
import { Asset } from '../../asset/model'
1919
import { initIocContainer } from '../..'
20-
import { Config } from '../../config/app'
20+
import { Config, IAppConfig } from '../../config/app'
2121
import { truncateTables } from '../../tests/tableManager'
2222
import {
2323
WalletAddressError,
@@ -49,6 +49,7 @@ import { faker } from '@faker-js/faker'
4949
import { Tenant } from '../../tenants/model'
5050
import { createTenant } from '../../tests/tenant'
5151
import { TenantService } from '../../tenants/service'
52+
import { isTenantError } from '../../tenants/errors'
5253

5354
describe('Wallet Address Resolvers', (): void => {
5455
let deps: IocContract<AppServices>
@@ -57,6 +58,7 @@ describe('Wallet Address Resolvers', (): void => {
5758
let walletAddressService: WalletAddressService
5859
let assetService: AssetService
5960
let tenantService: TenantService
61+
let prefix: string
6062

6163
beforeAll(async (): Promise<void> => {
6264
deps = initIocContainer({
@@ -68,6 +70,13 @@ describe('Wallet Address Resolvers', (): void => {
6870
walletAddressService = await deps.use('walletAddressService')
6971
assetService = await deps.use('assetService')
7072
tenantService = await deps.use('tenantService')
73+
const tenant = await tenantService.update({
74+
id: Config.operatorTenantId,
75+
walletAddressPrefix: 'https://alice.me'
76+
})
77+
assert.ok(!isTenantError(tenant))
78+
assert.ok(tenant.walletAddressPrefix)
79+
prefix = tenant.walletAddressPrefix
7180
})
7281

7382
afterEach(async (): Promise<void> => {
@@ -80,10 +89,7 @@ describe('Wallet Address Resolvers', (): void => {
8089
})
8190

8291
beforeEach(async () => {
83-
await tenantService.update({
84-
id: Config.operatorTenantId,
85-
walletAddressPrefix: 'https://alice.me'
86-
})
92+
8793
})
8894

8995
describe('Create Wallet Address', (): void => {
@@ -95,7 +101,7 @@ describe('Wallet Address Resolvers', (): void => {
95101
input = {
96102
assetId: asset.id,
97103
tenantId: Config.operatorTenantId,
98-
address: 'https://alice.me/.well-known/pay'
104+
address: `${prefix}/.well-known/pay`
99105
}
100106
})
101107

packages/backend/src/graphql/schema.graphql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1644,7 +1644,7 @@ input CreateTenantInput {
16441644
"Public name for the tenant."
16451645
publicName: String
16461646
"Prefix for all wallet addresses belonging to this tenant."
1647-
walletAddressPrefix: String
1647+
walletAddressPrefix: String!
16481648
"Initial settings for tenant."
16491649
settings: [TenantSettingInput!]
16501650
}

packages/backend/src/open_payments/wallet_address/errors.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ export enum WalletAddressError {
44
InvalidUrl = 'InvalidUrl',
55
UnknownAsset = 'UnknownAsset',
66
UnknownWalletAddress = 'UnknownWalletAddress',
7-
DuplicateWalletAddress = 'DuplicateWalletAddress',
8-
WalletAddressPrefixNotFound = 'WalletAddressPrefixNotFound'
7+
DuplicateWalletAddress = 'DuplicateWalletAddress'
98
}
109

1110
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
@@ -18,8 +17,7 @@ export const errorToCode: {
1817
[WalletAddressError.InvalidUrl]: GraphQLErrorCode.BadUserInput,
1918
[WalletAddressError.UnknownAsset]: GraphQLErrorCode.BadUserInput,
2019
[WalletAddressError.UnknownWalletAddress]: GraphQLErrorCode.NotFound,
21-
[WalletAddressError.DuplicateWalletAddress]: GraphQLErrorCode.Duplicate,
22-
[WalletAddressError.WalletAddressPrefixNotFound]: GraphQLErrorCode.NotFound
20+
[WalletAddressError.DuplicateWalletAddress]: GraphQLErrorCode.Duplicate
2321
}
2422

2523
export const errorToMessage: {
@@ -29,7 +27,5 @@ export const errorToMessage: {
2927
[WalletAddressError.UnknownAsset]: 'unknown asset',
3028
[WalletAddressError.UnknownWalletAddress]: 'unknown wallet address',
3129
[WalletAddressError.DuplicateWalletAddress]:
32-
'Duplicate wallet address found with the same url',
33-
[WalletAddressError.WalletAddressPrefixNotFound]:
34-
'Prefix configuration for wallet address has not been found.'
30+
'Duplicate wallet address found with the same url'
3531
}

0 commit comments

Comments
 (0)