@arkiv-network/sdk
Version:
TypeScript client library for Arkiv's blockchains interactions
76 lines (68 loc) • 2.54 kB
text/typescript
import type { Hash, Hex } from "viem"
import type { ArkivClient } from "../../clients/baseClient"
import type { Expiry } from "../../entity"
import { EntityMutationError } from "../../errors"
import type { TxParams } from "../../types"
import { sendArkivTransaction } from "../../utils/arkivTransactions"
import type { ExpirationTime } from "../../utils/expirationTime"
import { getLogger } from "../../utils/logger"
const logger = getLogger("actions:wallet:extend-entity")
/**
* Parameters for extending an entity's life.
*
* An extension **sets a new expiry**; it does not add to the existing one. It is resolved exactly
* as a create's is — a duration counts from now, not from the entity's current expiry — so
* `ExpirationTime.fromDays(30)` means "alive for thirty more days from now" whatever the entity's
* remaining life happened to be.
*
* The engine rejects an extension that would move the expiry earlier, so extending an entity by
* less than it already has left is an error rather than a silent shortening. One that resolves to
* the current expiry changes nothing.
*
* @example
* await client.extendEntity({ entityKey, expiration: ExpirationTime.fromDays(30) })
* await client.extendEntity({ entityKey, expiration: ExpirationTime.atBlock(1_200_000n) })
*/
export type ExtendEntityParameters = {
entityKey: Hex
/** The entity's new lifetime, built with {@link ExpirationTime}. */
expiration: Expiry
}
/**
* The result of extending an entity.
*/
export type ExtendEntityReturnType = {
entityKey: Hex
txHash: Hash
/**
* The block the entity now expires at, as the engine recorded it — read from the
* `ExpiryExtended` event, so a duration is already resolved against the block the transaction
* landed in.
*/
expiresAt: bigint
}
export async function extendEntity(
client: ArkivClient,
data: ExtendEntityParameters,
txParams?: TxParams,
): Promise<ExtendEntityReturnType> {
logger("extendEntity %o", data)
const { receipt, extendedExpiries } = await sendArkivTransaction(
client,
{ extensions: [data] },
txParams,
)
logger("Receipt from extendEntity %o", receipt)
const [expiresAt] = extendedExpiries
if (expiresAt === undefined) {
throw new EntityMutationError(
`Transaction ${receipt.transactionHash} succeeded, but the receipt did not carry the expected entity expiry.`,
{ txHash: receipt.transactionHash },
)
}
return {
txHash: receipt.transactionHash as Hash,
entityKey: data.entityKey,
expiresAt,
}
}