import type { SigningCosmWasmClient } from '@cosmjs/cosmwasm-stargate' import type { Coin } from '@cosmjs/proto-signing' export interface InstantiateResponse { readonly contractAddress: string readonly transactionHash: string } export interface SplitsInstance { readonly contractAddress: string //Query getAdmin: () => Promise getMemberWeight: (member: string) => Promise listMembers: (startAfter?: string, limit?: number) => Promise getGroup: () => Promise //Execute updateAdmin: (admin: string) => Promise distribute: () => Promise } export interface SplitsMessages { updateAdmin: (admin: string) => UpdateAdminMessage distribute: () => DistributeMessage } export interface UpdateAdminMessage { sender: string contract: string msg: { update_admin: { admin: string } } funds: Coin[] } export interface DistributeMessage { sender: string contract: string msg: { distribute: Record } funds: Coin[] } export interface SplitsContract { instantiate: ( codeId: number, initMsg: Record, label: string, admin?: string, ) => Promise use: (contractAddress: string) => SplitsInstance messages: (contractAddress: string) => SplitsMessages } export const Splits = (client: SigningCosmWasmClient, txSigner: string): SplitsContract => { const use = (contractAddress: string): SplitsInstance => { ///QUERY const listMembers = async (startAfter?: string, limit?: number): Promise => { return client.queryContractSmart(contractAddress, { list_members: { limit, start_after: startAfter }, }) } const getMemberWeight = async (address: string): Promise => { return client.queryContractSmart(contractAddress, { member: { address }, }) } const getAdmin = async (): Promise => { return client.queryContractSmart(contractAddress, { admin: {}, }) } const getGroup = async (): Promise => { return client.queryContractSmart(contractAddress, { group: {}, }) } /// EXECUTE const updateAdmin = async (admin: string): Promise => { const res = await client.execute( txSigner, contractAddress, { update_admin: { admin, }, }, 'auto', ) return res.transactionHash } const distribute = async (): Promise => { const res = await client.execute( txSigner, contractAddress, { distribute: {}, }, 'auto', ) return res.transactionHash } return { contractAddress, updateAdmin, distribute, getMemberWeight, getAdmin, listMembers, getGroup, } } const instantiate = async ( codeId: number, initMsg: Record, label: string, admin?: string, ): Promise => { const result = await client.instantiate(txSigner, codeId, initMsg, label, 'auto', { admin, }) return { contractAddress: result.contractAddress, transactionHash: result.transactionHash, } } const messages = (contractAddress: string) => { const updateAdmin = (admin: string) => { return { sender: txSigner, contract: contractAddress, msg: { update_admin: { admin }, }, funds: [], } } const distribute = () => { return { sender: txSigner, contract: contractAddress, msg: { distribute: {}, }, funds: [], } } return { updateAdmin, distribute, } } return { use, instantiate, messages } }