diff --git a/.changeset/silly-owls-attest.md b/.changeset/silly-owls-attest.md new file mode 100644 index 0000000000..ad123bcbb4 --- /dev/null +++ b/.changeset/silly-owls-attest.md @@ -0,0 +1,5 @@ +--- +"@exactly/server": patch +--- + +🦺 add travel rule to offramp transfers diff --git a/server/test/utils/bridge.test.ts b/server/test/utils/bridge.test.ts index cb805efa00..c634862521 100644 --- a/server/test/utils/bridge.test.ts +++ b/server/test/utils/bridge.test.ts @@ -2775,6 +2775,13 @@ describe("bridge utils", () => { source: { currency: "usdc", payment_rail: "optimism" }, destination: { currency: "usd", payment_rail: "ach", external_account_id: "ext-acc-1" }, features: { flexible_amount: true, static_template: true, allow_any_from_address: true }, + travel_rule_data: { + originator: { + is_self: true, + wallet_type: "self_custodied", // cspell:ignore custodied + wallet_attested_ownership_at: expect.stringMatching(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/) as unknown, + }, + }, }); }); @@ -2795,6 +2802,13 @@ describe("bridge utils", () => { source: { currency: "usdc", payment_rail: "optimism" }, destination: { currency: "eur", payment_rail: "sepa", external_account_id: "ext-acc-1" }, features: { flexible_amount: true, static_template: true, allow_any_from_address: true }, + travel_rule_data: { + originator: { + is_self: true, + wallet_type: "self_custodied", // cspell:ignore custodied + wallet_attested_ownership_at: expect.stringMatching(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/) as unknown, + }, + }, }); }); diff --git a/server/utils/ramps/bridge.ts b/server/utils/ramps/bridge.ts index 5e336f8309..4a01df5355 100644 --- a/server/utils/ramps/bridge.ts +++ b/server/utils/ramps/bridge.ts @@ -956,6 +956,13 @@ export async function getOfframpDepositDetails( external_account_id: externalAccountId, }, features: { flexible_amount: true, static_template: true, allow_any_from_address: true }, + travel_rule_data: { + originator: { + is_self: true, + wallet_type: "self_custodied", // cspell:ignore custodied + wallet_attested_ownership_at: new Date().toISOString(), + }, + }, }); return [ @@ -1933,6 +1940,15 @@ const CreateTransfer = object({ blockchain_memo: optional(string()), swift_charges: optional(picklist(["ben", "our", "sha"])), }), + travel_rule_data: optional( + object({ + originator: object({ + is_self: boolean(), + wallet_type: picklist(["external", "hosted", "self_custodied"]), // cspell:ignore custodied + wallet_attested_ownership_at: string(), + }), + }), + ), }); const Transfer = object({