diff --git a/contracts/royaltyRegistry/messages/execute.ts b/contracts/royaltyRegistry/messages/execute.ts new file mode 100644 index 0000000..a4c018d --- /dev/null +++ b/contracts/royaltyRegistry/messages/execute.ts @@ -0,0 +1,162 @@ +import type { RoyaltyRegistryInstance } from '../index' +import { useRoyaltyRegistryContract } from '../index' + +export type ExecuteType = typeof EXECUTE_TYPES[number] + +export const EXECUTE_TYPES = [ + 'initialize_collection_royalty', + 'set_collection_royalty_default', + 'update_collection_royalty_default', + 'set_collection_royalty_protocol', + 'update_collection_royalty_protocol', +] as const + +export interface ExecuteListItem { + id: ExecuteType + name: string + description?: string +} + +export const EXECUTE_LIST: ExecuteListItem[] = [ + { + id: 'initialize_collection_royalty', + name: 'Initialize Collection Royalty', + description: 'Initialize collection royalty', + }, + { + id: 'set_collection_royalty_default', + name: 'Set Collection Royalty Default', + description: 'Set collection royalty default', + }, + { + id: 'update_collection_royalty_default', + name: 'Update Collection Royalty Default', + description: 'Update collection royalty default', + }, + { + id: 'set_collection_royalty_protocol', + name: 'Set Collection Royalty Protocol', + description: 'Set collection royalty protocol', + }, + { + id: 'update_collection_royalty_protocol', + name: 'Update Collection Royalty Protocol', + description: 'Update collection royalty protocol', + }, +] + +export interface DispatchExecuteProps { + type: ExecuteType + [k: string]: unknown +} + +type Select = T +/** @see {@link RoyaltyRegistryInstance} */ +export type DispatchExecuteArgs = { + contract: string + messages?: RoyaltyRegistryInstance +} & ( + | { type: Select<'initialize_collection_royalty'>; collection: string } + | { type: Select<'set_collection_royalty_default'>; collection: string; recipient: string; royalty: number } + | { + type: Select<'update_collection_royalty_default'> + collection: string + recipient: string + shareDelta: number + decrement: boolean + } + | { + type: Select<'set_collection_royalty_protocol'> + collection: string + protocol: string + recipient: string + royalty: number + } + | { + type: Select<'update_collection_royalty_protocol'> + collection: string + protocol: string + recipient: string + shareDelta: number + decrement: boolean + } +) + +export const dispatchExecute = async (args: DispatchExecuteArgs) => { + const { messages } = args + if (!messages) { + throw new Error('Cannot dispatch execute, messages are not defined') + } + switch (args.type) { + case 'initialize_collection_royalty': { + return messages.initializeCollectionRoyalty(args.collection) + } + case 'set_collection_royalty_default': { + return messages.setCollectionRoyaltyDefault(args.collection, args.recipient, args.royalty) + } + case 'update_collection_royalty_default': { + return messages.updateCollectionRoyaltyDefault(args.collection, args.recipient, args.shareDelta, args.decrement) + } + case 'set_collection_royalty_protocol': { + return messages.setCollectionRoyaltyProtocol(args.collection, args.protocol, args.recipient, args.royalty) + } + case 'update_collection_royalty_protocol': { + return messages.updateCollectionRoyaltyProtocol( + args.collection, + args.protocol, + args.recipient, + args.shareDelta, + args.decrement, + ) + } + default: { + throw new Error('Unknown execution type') + } + } +} + +export const previewExecutePayload = (args: DispatchExecuteArgs) => { + // eslint-disable-next-line react-hooks/rules-of-hooks + const { messages } = useRoyaltyRegistryContract() + const { contract } = args + switch (args.type) { + case 'initialize_collection_royalty': { + return messages(contract)?.initializeCollectionRoyalty(args.collection) + } + case 'set_collection_royalty_default': { + return messages(contract)?.setCollectionRoyaltyDefault(args.collection, args.recipient, args.royalty) + } + case 'update_collection_royalty_default': { + return messages(contract)?.updateCollectionRoyaltyDefault( + args.collection, + args.recipient, + args.shareDelta, + args.decrement, + ) + } + case 'set_collection_royalty_protocol': { + return messages(contract)?.setCollectionRoyaltyProtocol( + args.collection, + args.protocol, + args.recipient, + args.royalty, + ) + } + case 'update_collection_royalty_protocol': { + return messages(contract)?.updateCollectionRoyaltyProtocol( + args.collection, + args.protocol, + args.recipient, + args.shareDelta, + args.decrement, + ) + } + default: { + return {} + } + } +} + +export const isEitherType = (type: unknown, arr: T[]): type is T => { + return arr.some((val) => type === val) +} diff --git a/contracts/royaltyRegistry/messages/query.ts b/contracts/royaltyRegistry/messages/query.ts new file mode 100644 index 0000000..07d6909 --- /dev/null +++ b/contracts/royaltyRegistry/messages/query.ts @@ -0,0 +1,64 @@ +import type { RoyaltyRegistryInstance } from '../contract' + +export type QueryType = typeof QUERY_TYPES[number] + +export const QUERY_TYPES = [ + 'config', + 'collection_royalty_default', + 'collection_royalty_protocol', + 'royalty_payment', +] as const +export interface QueryListItem { + id: QueryType + name: string + description?: string +} + +export const QUERY_LIST: QueryListItem[] = [ + { id: 'config', name: 'Query Config', description: 'View the contract config' }, + { + id: 'collection_royalty_default', + name: 'Query Collection Royalty Details', + description: 'View the collection royalty details', + }, + { + id: 'collection_royalty_protocol', + name: 'Query Collection Royalty Protocol', + description: 'View the collection royalty protocol', + }, + { + id: 'royalty_payment', + name: 'Query Royalty Payment', + description: 'View the royalty payment', + }, +] +/* + //Query + config: () => Promise + collectionRoyaltyDefault: (collection: string) => Promise + collectionRoyaltyProtocol: (collection: string, protocol: string) => Promise + // RoyaltyProtocolByCollection: (collection: string, queryOptions: QqueryOptions) => Promise + royaltyPayment: (collection: string, protocol?: string) => Promise + */ + +export interface DispatchQueryProps { + messages: RoyaltyRegistryInstance | undefined + type: QueryType + collection: string + protocol: string +} + +export const dispatchQuery = (props: DispatchQueryProps) => { + const { messages, type, collection, protocol } = props + switch (type) { + case 'config': + return messages?.config() + case 'collection_royalty_default': + return messages?.collectionRoyaltyDefault(collection) + case 'collection_royalty_protocol': + return messages?.collectionRoyaltyProtocol(collection, protocol) + default: { + throw new Error('unknown query type') + } + } +}