# Core Types

Core types are the shared records the SDK uses across the client, connectors, and verticals — as opposed to the parameters and results specific to a single operation. They fall into three groups: the [account records](#account) that identify and reference XRPL accounts, the [submission types](#submissionresult) every write resolves to, and the [connector identifiers](#custodiankind) that say which backend owns what.

## Account

[[Source]](https://github.com/ripple/simpleXRPL/blob/95b977b15f8950c5bc076b25165217869c0b06d3/src/domain/model.ts#L37)

A discovered account: its r-address paired with the connector that owns and signs for it. The SDK hands you an `Account` from `client.accounts` and [`connector.listAccounts()`](/docs/simplexrpl/references/connectors). It extends [`AccountRef`](#accountref), so `address` and `custodianRef` come from there.

This is distinct from `AccountData`, the on-chain snapshot returned by [`account.retrieve`](/docs/simplexrpl/references/verticals/account/retrieve).

| Field | Type | Description |
|  --- | --- | --- |
| `address` | `string` | The XRPL r-address — the canonical key the SDK uses to identify the account. Inherited from [`AccountRef`](#accountref). |
| `custodianRef` | [`CustodianRef`](#custodianref) *(optional)* | The owning connector's opaque native id for the account. Inherited from [`AccountRef`](#accountref). |
| `signer` | [`Custodian`](/docs/simplexrpl/references/connectors) | The connector that discovered and signs for this account. |
| `alias` | `string` *(optional)* | A connector-side alias, when the backend exposes one. |
| `ledgerId` | `string` *(optional)* | The connector-specific ledger id backing this address, when the backend needs one disambiguated — e.g. Ripple Custody's multi-ledger Vault accounts, which carry no ledger default of their own. |
| `publicKey` | `string` *(optional)* | The account's XRPL public key (hex), when the connector exposes it. Used to populate `SigningPubKey` on transactions signed by a backend that returns only the signature, e.g. Palisade's raw sign-only path. |
| `metadata` | `object` *(optional)* | Advisory-only. Shape `{ kind?, tags? }`, where `kind` is a [`CustodianKind`](#custodiankind) and `tags` is a list of strings. |


## AccountRef

[[Source]](https://github.com/ripple/simpleXRPL/blob/95b977b15f8950c5bc076b25165217869c0b06d3/src/domain/model.ts#L25)

The minimal reference to an account — just its r-address and the owning connector's native id. [`Account`](#account) extends it, and a connector's `primary` field is an `AccountRef`.

| Field | Type | Description |
|  --- | --- | --- |
| `address` | `string` | The XRPL r-address. |
| `custodianRef` | [`CustodianRef`](#custodianref) *(optional)* | The owning connector's opaque native id for the account. |


## AccountSelector

[[Source]](https://github.com/ripple/simpleXRPL/blob/95b977b15f8950c5bc076b25165217869c0b06d3/src/domain/model.ts#L79)

How you choose the source account for an operation — the `from` option on writes. It is one of three forms:

| Form | Type | Description |
|  --- | --- | --- |
| r-address | `string` | A bare r-address string. |
| `{ address }` | `object` | An object holding an explicit r-address. |
| `{ signer, account? }` | `object` | A connector, optionally narrowed to one of the accounts it owns (by r-address). |


## SubmissionResult

[[Source]](https://github.com/ripple/simpleXRPL/blob/95b977b15f8950c5bc076b25165217869c0b06d3/src/domain/model.ts#L194)

`SubmissionResult<T>` is generic over `T`, the operation-specific `intent` payload — each operation's reference page lists its own return fields. The table below is the same one those pages inline under **Returns**.

Every simpleXRPL write resolves to a `SubmissionResult<T>` — a union tagged by `source`, with the backend's raw response preserved verbatim. Its common fields are:

| Field | Type | Description |
|  --- | --- | --- |
| `intent` | `T` | The operation-specific output — see the operation's own return fields. |
| `source` | `'xrpld' | 'custody' | 'palisade'` | Which backend produced the result; discriminates `response`. |
| `response` | `TxResponse` | custody record | Palisade record | The backend's raw response, preserved verbatim. |
| `txHash` | `string` *(optional)* | The XRPL transaction hash, once the transaction is on-ledger. |
| `intentId` | `string` *(optional)* | The custodian intent id, when the path produced one. Hold onto this to resume via `client.intent`. |
| `idempotencyKey` | `string` *(optional)* | The UUIDv7 this submission carried. Pass it back as a later call's `idempotencyKey` to retry to the same intent rather than creating a duplicate. |


Note
`txHash` being absent doesn't mean the write failed — on a governed connector the intent may still be awaiting approval. Hold onto `intentId` and resume through [`client.intent`](/docs/simplexrpl/references/intent-inspector); see [Intent Inspector](/docs/simplexrpl/references/intent-inspector).

## SubmissionHandle

[[Source]](https://github.com/ripple/simpleXRPL/blob/95b977b15f8950c5bc076b25165217869c0b06d3/src/domain/model.ts#L212)

Returned by an async submission, and by [`client.intent.handleFor()`](/docs/simplexrpl/references/intent-inspector#handlefor). `kind` is a [`CustodianKind`](#custodiankind); `custodian` is the [connector](/docs/simplexrpl/references/connectors) itself.

A `SubmissionHandle` lets you poll or wait for a terminal state without holding the original request open.

| Field | Type | Description |
|  --- | --- | --- |
| `kind` | `CustodianKind` | The connector kind that owns the underlying intent or transaction. |
| `id` | `string` | The custodian-native id (an intent id), or the XRPL transaction hash for local signing. |
| `custodian` | `Custodian` | The connector that produced this handle. |
| `poll` | `() => Promise<SubmissionResult>` | A non-blocking snapshot of the current state. |
| `wait` | `(timeoutMs?: number) => Promise<SubmissionResult>` | Block until terminal state or the timeout (defaults to the connector's). |
| `cancel` | `() => Promise<void>` *(optional)* | Cancel the pending intent, where the backend supports it. |


## OnChainResult

[[Source]](https://github.com/ripple/simpleXRPL/blob/95b977b15f8950c5bc076b25165217869c0b06d3/src/domain/model.ts#L308)

The outcome of a transaction confirmed on-ledger, returned by [`client.intent.awaitOnChain()`](/docs/simplexrpl/references/intent-inspector#awaitonchain).

An `OnChainResult` reports a transaction that reached the ledger.

| Field | Type | Description |
|  --- | --- | --- |
| `txHash` | `string` | The XRPL transaction hash. |
| `mptIssuanceId` | `string` *(optional)* | Present only when the transaction created an MPT issuance. |


## FeeIntent

[[Source]](https://github.com/ripple/simpleXRPL/blob/95b977b15f8950c5bc076b25165217869c0b06d3/src/domain/model.ts#L99)

A normalized fee intent. The public surface never takes raw drops for the fee itself — each path translates this to its backend's fee model. Used as a connector's `defaultFee` and as the per-write `fee` option.

| Field | Type | Description |
|  --- | --- | --- |
| `priority` | `'low' | 'medium' | 'high'` *(optional)* | Priority tier. Backends that cannot honor it auto-price and warn. |
| `maxFeeDrops` | `string` *(optional)* | The maximum fee cap, in drops — the common contract across all paths. |


## CustodianKind

[[Source]](https://github.com/ripple/simpleXRPL/blob/95b977b15f8950c5bc076b25165217869c0b06d3/src/domain/model.ts#L10)

Which signing backend a [connector](/docs/simplexrpl/references/connectors) adapts. One of four string literals:

`'local'` · `'ripple-custody'` · `'palisade-custody'` · `'external'`

## CustodianRef

[[Source]](https://github.com/ripple/simpleXRPL/blob/95b977b15f8950c5bc076b25165217869c0b06d3/src/domain/model.ts#L18)

A connector's opaque native identifier for an account, read only by the connector that owns it. One of:

| Form | Type | Used by |
|  --- | --- | --- |
| account id | `string` | Account-id connectors. |
| `{ vaultId, walletId }` | `object` | Vault-based connectors, e.g. [Palisade](/docs/simplexrpl/references/connectors/palisade). |
| absent | `undefined` | Local wallets, which have no backend-side id. |