Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
e09638e
Initial plan
Copilot Aug 29, 2025
80e4764
Implement XLS-70 CredentialIDs and DepositPreauth credentials support
Copilot Aug 29, 2025
45f7edb
Fix DepositPreauth credentials display by adding parser for nested st…
Copilot Aug 29, 2025
21f8349
Fix parser to handle both nested and flat credential structures, use …
Copilot Aug 29, 2025
be82a21
copilot-setup-steps
mvadari Aug 29, 2025
45142b3
Fix linting, TypeScript, and test failures
Copilot Aug 29, 2025
2ce9473
fix extraneous typing in accountdelete
achowdhry-ripple Nov 26, 2025
6f0ee1e
cleanup, formatting, tested'
achowdhry-ripple Dec 4, 2025
d6a45ab
lock sync
achowdhry-ripple Dec 4, 2025
ecda0b9
transalations null
achowdhry-ripple Dec 4, 2025
b23fb1f
lint
achowdhry-ripple Dec 4, 2025
b48e726
typescript check
achowdhry-ripple Dec 4, 2025
17e6044
Add unit tests for Payment and EscrowFinish CredentialIDs support
Copilot Dec 15, 2025
c863f9a
Fix linting issues in test files
Copilot Dec 15, 2025
7f9c5b6
Remove inline styles and add PaymentChannelClaim CredentialIDs test
Copilot Dec 15, 2025
3366662
Merge branch 'staging' into copilot/fix-bee91805-20d7-4a5a-82d1-51d38…
achowdhry-ripple Dec 16, 2025
abf6e8a
Add unit tests for DepositPreauth TableDetail component
Copilot Dec 16, 2025
7331a7a
revert package and package lock
achowdhry-ripple Dec 16, 2025
40f06bb
fix desc for depositpreauth
achowdhry-ripple Dec 16, 2025
9261c43
fix SimpleGroup display
pdp2121 Dec 16, 2025
64d3a99
Merge branch 'copilot/fix-bee91805-20d7-4a5a-82d1-51d38507fddd' of ht…
pdp2121 Dec 16, 2025
40146ce
translations
achowdhry-ripple Dec 16, 2025
851c3c2
fix payment
achowdhry-ripple Dec 16, 2025
6e2ce73
fix SimpleGroups for Unauthorize
pdp2121 Dec 16, 2025
cc4e2bf
Merge branch 'copilot/fix-bee91805-20d7-4a5a-82d1-51d38507fddd' of ht…
pdp2121 Dec 16, 2025
dc06b62
fix tests
pdp2121 Dec 16, 2025
a1f12f4
fix tests
achowdhry-ripple Dec 16, 2025
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
46 changes: 46 additions & 0 deletions .github/workflows/copilot-setup-steps.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Copilot Setup Steps

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

thoughts on keeping this file? not sure if we actually plan to use copilot going forward cc @mvadari

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Up to you guys, feel free to remove

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@pdp2121 @Patel-Raj11 @ckeshava thoughts? Personally leaning towards removing this since none of us have access yet and the team hasn't agreed on using this going forward

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

what is the purpose of this file? I do not observe any co-pilot specific Github Actions steps here.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

It's telling Copilot how to set up a dev environment to run stuff for the explorer


env:
NODE_VERSION: 22.x
VITE_VALIDATOR: vl.ripple.com
VITE_RIPPLED_WS_PORT: 51233
VITE_RIPPLED_HOST: fake.rippled.example.com
VITE_MAINNET_LINK: mainnet.example.com
VITE_TESTNET_LINK: testnet.example.com
VITE_CUSTOMNETWORK_LINK: custom.example.com
VITE_DATA_URL: https://data.xrpl.org/v1/network

on:
workflow_dispatch:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
copilot-setup:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}

- name: Cache node modules
id: cache-nodemodules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
# caching node_modules
path: node_modules
key: ${{ env.NODE_VERSION }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ env.NODE_VERSION }}-build-${{ env.cache-name }}-
${{ env.NODE_VERSION }}-build-

- name: Install Dependencies
if: steps.cache-nodemodules.outputs.cache-hit != 'true'
run: npm ci
3 changes: 3 additions & 0 deletions public/locales/en-US/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,8 @@
"set_nftoken_minter_description": "It sets <0>{{account}}</0> as the authorized minter for this account",
"deposit_auth": "It authorizes <1><0>{{account}}</0></1> to send payments to this account",
"deposit_unauth": "It removes the authorization for <1><0>{{account}}</0></1> to send payments to this account",
"deposit_auth_credentials": "It authorizes the following credentials:",
"deposit_unauth_credentials": "It removes the authorization for the following credentials:",
"invalid_xrpl_address": "Invalid XRPL address",
"loading": "Loading",
"get_ledger_failed": "Unable to load ledger",
Expand Down Expand Up @@ -584,6 +586,7 @@
"expiration": "Expiration",
"domain_id": "Domain ID",
"accepted_credentials": "Accepted Credentials",
"credential_ids": "Credential IDs",
"data": "Data",
"finish_function": "Finish Function",
"quorum_description": "Min. number of trusted validations needed to confirm a ledger",
Expand Down
3 changes: 3 additions & 0 deletions public/locales/es-ES/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,8 @@
"set_nftoken_minter_description": "Se establece a <0>{{account}}</0> como el acuñador autorizado para esta cuenta",
"deposit_auth": "Se autoriza a <1><0>{{account}}</0></1> a enviar pagos a esta cuenta",
"deposit_unauth": "Se elimina la autorización a <1><0>{{account}}</0></1> para enviar pagos a esta cuenta",
"deposit_auth_credentials": null,
"deposit_unauth_credentials": null,
"invalid_xrpl_address": "Dirección XRPL inválida",
"loading": "Cargando",
"get_ledger_failed": "No ha sido posible cargar el libro contable",
Expand Down Expand Up @@ -577,6 +579,7 @@
"expiration": null,
"domain_id": null,
"accepted_credentials": null,
"credential_ids": null,
"action_from_and": null,
"data": null,
"finish_function": null,
Expand Down
3 changes: 3 additions & 0 deletions public/locales/fr-FR/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,8 @@
"set_nftoken_minter_description": "Définit <0>{{account}}</0> comme le forgeur autorisé pour ce compte.",
"deposit_auth": "Autorise <1><0>{{account}}</0></1> à envoyer des paiements vers ce compte.",
"deposit_unauth": "Supprime l'autorisation pour <1><0>{{account}}</0></1> d'envoyer des paiements à ce compte.",
"deposit_auth_credentials": null,
"deposit_unauth_credentials": null,
"invalid_xrpl_address": "Adresse XRPL invalide",
"loading": "Chargement en cours",
"get_ledger_failed": "Impossible de charger le registre",
Expand Down Expand Up @@ -578,6 +580,7 @@
"expiration": null,
"domain_id": null,
"accepted_credentials": null,
"credential_ids": null,
"action_from_and": null,
"data": null,
"finish_function": null,
Expand Down
3 changes: 3 additions & 0 deletions public/locales/ja-JP/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,8 @@
"set_nftoken_minter_description": "<0>{{account}}</0> をNFTの認可発行者として設定しました。",
"deposit_auth": "<1><0>{{account}}</0></1> からの送金を許可しました",
"deposit_unauth": "<1><0>{{account}}</0></1> からの送金の許可を削除しました",
"deposit_auth_credentials": null,
"deposit_unauth_credentials": null,
"invalid_xrpl_address": "不正なXRPLアドレスです",
"loading": "読み込み中",
"get_ledger_failed": "レジャ情報ーを取得することができません",
Expand Down Expand Up @@ -577,6 +579,7 @@
"expiration": null,
"domain_id": null,
"accepted_credentials": null,
"credential_ids": null,
"action_from_and": null,
"data": null,
"finish_function": null,
Expand Down
3 changes: 3 additions & 0 deletions public/locales/ko-KR/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,8 @@
"set_nftoken_minter_description": "<0>{{account}}</0>을 이 계정의 공인 발행인으로 설정합니다",
"deposit_auth": "<1><0>{{account}}</0></1>을 이 계정으로 결제를 보낼 수 있도록 승인합니다",
"deposit_unauth": "<1><0>{{account}}</0></1>의 이 계정으로의 결제 권한을 삭제합니다",
"deposit_auth_credentials": null,
"deposit_unauth_credentials": null,
"invalid_xrpl_address": "유효하지 않은 XRPL 주소",
"loading": "불러오는 중",
"get_ledger_failed": "원장을 불러올 수 없습니다",
Expand Down Expand Up @@ -575,6 +577,7 @@
"expiration": null,
"domain_id": null,
"accepted_credentials": null,
"credential_ids": null,
"action_from_and": null,
"data": null,
"finish_function": null,
Expand Down
3 changes: 3 additions & 0 deletions public/locales/my-MM/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,8 @@
"set_nftoken_minter_description": "၎င်းသည် <0>{{account}}</0> ကို ဤအကောင့်အတွက် ခွင့်ပြုချက်ရ NFT ထုတ်လုပ်သူအဖြစ် သတ်မှတ်သည်",
"deposit_auth": "၎င်းသည် <1><0>{{account}}</0></1> အား ဤအကောင့်သို့ ငွေပေးချေရန် ခွင့်ပြုသည်",
"deposit_unauth": "၎င်းသည် <1><0>{{account}}</0></1> ၏ ဤအကောင့်သို့ ငွေပေးချေခွင့်ကို ပယ်ဖျက်သည်",
"deposit_auth_credentials": null,
"deposit_unauth_credentials": null,
"invalid_xrpl_address": "XRPL လိပ်စာ မှားယွင်းနေပါသည်",
"loading": "ဖွင့်နေသည်",
"get_ledger_failed": "Ledger ကို ဖွင့်၍မရပါ",
Expand Down Expand Up @@ -734,6 +736,7 @@
"expiration": null,
"domain_id": null,
"accepted_credentials": null,
"credential_ids": null,
"data": null,
"tx_hash": null,
"timestamp": null,
Expand Down
9 changes: 9 additions & 0 deletions src/containers/Transactions/simpleTab.scss
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@ $subdued-color: $black-40;
.rows {
padding-top: 0px;

.groups-title {
display: block;
flex-direction: row;
color: $black-40;
font-size: 14px;
font-weight: 600;
text-transform: uppercase;
}

.partial-row {
display: flex;
overflow: hidden;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,21 @@ import type { AccountDelete } from 'xrpl'
import { SimpleRow } from '../SimpleRow'
import { TransactionSimpleProps } from '../types'
import { Account } from '../../Account'
import { CredentialIDs } from '../CredentialIDs'

export const Simple = ({ data }: TransactionSimpleProps<AccountDelete>) => {
const { t } = useTranslation()
const tx = data.instructions

return (
<SimpleRow label={t('destination')}>
<Account account={tx.Destination} />
{tx.DestinationTag && <span className="dt">:{tx.DestinationTag}</span>}
</SimpleRow>
<>
<SimpleRow label={t('destination')} data-testid="destination">
<Account account={tx.Destination} />
{tx.DestinationTag && <span className="dt">:{tx.DestinationTag}</span>}
</SimpleRow>
{tx.CredentialIDs && tx.CredentialIDs.length > 0 && (
<CredentialIDs credentialIDs={tx.CredentialIDs} />
)}
</>
)
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,51 @@
import i18n from '../../../../../../i18n/testConfigEnglish'

import { createSimpleWrapperFactory } from '../../test/createWrapperFactory'
import {
createSimpleWrapperFactory,
expectSimpleRowText,
expectSimpleRowLabel,
} from '../../test'
import { Simple } from '../Simple'
import mockAccountDelete from './mock_data/AccountDelete.json'
import mockAccountDeleteWithDestinationTag from './mock_data/AccountDeleteWithDestinationTag.json'
import mockAccountDeleteWithCredentialIDs from './mock_data/AccountDeleteWithCredentialIDs.json'

const createWrapper = createSimpleWrapperFactory(Simple, i18n)
const createWrapper = createSimpleWrapperFactory(Simple)

describe('AccountDelete: Simple', () => {
it('renders', () => {
const wrapper = createWrapper(mockAccountDelete)
expect(wrapper.find('.label')).toHaveText('destination')
expect(wrapper.find('.value')).toHaveText(
expectSimpleRowText(
wrapper,
'destination',
'raT74sdzpxJUaubcBAQNS8aLqFMU85Rr5J',
)
wrapper.unmount()
})

it('renders with destination tag', () => {
const wrapper = createWrapper(mockAccountDeleteWithDestinationTag)
expect(wrapper.find('.label')).toHaveText('destination')
expect(wrapper.find('.value')).toHaveText(
expectSimpleRowText(
wrapper,
'destination',
'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn:123123',
)
wrapper.unmount()
})

it('renders with CredentialIDs', () => {
const wrapper = createWrapper(mockAccountDeleteWithCredentialIDs)

expectSimpleRowText(
wrapper,
'destination',
'raT74sdzpxJUaubcBAQNS8aLqFMU85Rr5J',
)
expectSimpleRowText(
wrapper,
'credential-id-0',
'7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955',
)
expectSimpleRowLabel(wrapper, 'credential-id-0', 'credential_ids')

wrapper.unmount()
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
{
"tx": {
"Account": "raf19Ns8czi85kTfia3KJ9ndjSp9baTLyH",
"Destination": "raT74sdzpxJUaubcBAQNS8aLqFMU85Rr5J",
"CredentialIDs": ["7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955"],
"Fee": "5000000",
"Flags": 2147483648,
"Sequence": 58118671,
"SigningPubKey": "0211DA2A9AEF04FB772776CD35291AF20DC09A6F0EF52C1A58E4ED43C8685D7093",
"TransactionType": "AccountDelete",
"TxnSignature": "304402202E61AC4B56BFFD2186D3E9BDECE7B68CD21B9486F691C5B31AA0E84E161E2C1C022048B70011A1D04566883EFEC3E988C31A853B89D18E0159315EF488DE89F7BA8B"
},
"meta": {
"AffectedNodes": [
{
"DeletedNode": {
"FinalFields": {
"Account": "raf19Ns8czi85kTfia3KJ9ndjSp9baTLyH",
"Balance": "0",
"Flags": 0,
"MessageKey": "020000000000000000000000007C50654DCAE0020232ABB4C236F7CE03CF2784B0",
"OwnerCount": 0,
"PreviousTxnID": "9A0AD95BA92118D66BDB3DCF86575BAEBE34D3F640146BD5A68D4AC355E56A21",
"PreviousTxnLgrSeq": 58233607,
"Sequence": 58118672
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "1F8BBAE9AD8533D18C1A2DD03E22232D49A28CCF2383D80CEE50735E82900068",
"PreviousFields": {
"Balance": "19999988",
"Sequence": 58118671
}
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "raT74sdzpxJUaubcBAQNS8aLqFMU85Rr5J",
"Balance": "11468518495",
"Flags": 0,
"OwnerCount": 0,
"Sequence": 58233435
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "40D5C5FF088C4BC3CA79974DCB585DDD04E9D88FF732AE6E7E36F0FF1CDD4220",
"PreviousFields": {
"Balance": "11453518507"
},
"PreviousTxnID": "9A0AD95BA92118D66BDB3DCF86575BAEBE34D3F640146BD5A68D4AC355E56A21",
"PreviousTxnLgrSeq": 58233607
}
}
],
"DeliveredAmount": "14999988",
"TransactionIndex": 34,
"TransactionResult": "tesSUCCESS",
"delivered_amount": "14999988"
},
"hash": "91BCF2965F7381EC01EDA6A36948A23480B566A0DDD3B13610ED8FD59840956D",
"ledger_index": 58233707,
"date": "2020-09-16T23:18:20Z"
}
28 changes: 28 additions & 0 deletions src/containers/shared/components/Transaction/CredentialIDs.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { useTranslation } from 'react-i18next'
import { SimpleRow } from './SimpleRow'

interface CredentialIDsProps {
credentialIDs: string[]
}

export const CredentialIDs = ({ credentialIDs }: CredentialIDsProps) => {
const { t } = useTranslation()

if (!credentialIDs || credentialIDs.length === 0) {
return null
}

return (
<>
{credentialIDs.map((id, index) => (
<SimpleRow
key={id}
label={index === 0 ? t('credential_ids') : ''}
data-testid={`credential-id-${index}`}
>
{id}
</SimpleRow>
))}
</>
)
}
Loading