/** * ProjectUpdates contract ABI - Full ABI from authoritative source */ export const PROJECT_UPDATES_ABI = [ { inputs: [ { internalType: 'uint256', name: 'initialPricePerUpdate', type: 'uint256', }, ], stateMutability: 'nonpayable', type: 'constructor', }, { inputs: [{ internalType: 'address', name: 'owner', type: 'address' }], name: 'OwnableInvalidOwner', type: 'error', }, { inputs: [{ internalType: 'address', name: 'account', type: 'address' }], name: 'OwnableUnauthorizedAccount', type: 'error', }, { inputs: [{ internalType: 'string', name: 'param', type: 'string' }], name: 'ProjectUpdates__InvalidParams', type: 'error', }, { inputs: [], name: 'ProjectUpdates__NotTokenCreator', type: 'error' }, { inputs: [], name: 'ProjectUpdates__NotAuthorized', type: 'error' }, { inputs: [], name: 'ProjectUpdates__AlreadyAuthority', type: 'error' }, { inputs: [], name: 'ProjectUpdates__NotAuthority', type: 'error' }, { inputs: [{ internalType: 'address', name: 'token', type: 'address' }], name: 'SafeERC20FailedOperation', type: 'error', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'previousOwner', type: 'address', }, { indexed: true, internalType: 'address', name: 'newOwner', type: 'address', }, ], name: 'OwnershipTransferred', type: 'event', }, { anonymous: false, inputs: [ { indexed: false, internalType: 'uint256', name: 'newPricePerUpdate', type: 'uint256', }, ], name: 'PricePerUpdateChanged', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'tokenAddress', type: 'address', }, { indexed: true, internalType: 'address', name: 'creator', type: 'address', }, { indexed: true, internalType: 'uint256', name: 'updateIndex', type: 'uint256', }, { indexed: false, internalType: 'string', name: 'link', type: 'string', }, ], name: 'ProjectUpdatePosted', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'tokenAddress', type: 'address', }, { indexed: true, internalType: 'address', name: 'authority', type: 'address', }, ], name: 'AuthorityAdded', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'tokenAddress', type: 'address', }, { indexed: true, internalType: 'address', name: 'authority', type: 'address', }, ], name: 'AuthorityRemoved', type: 'event', }, { inputs: [], name: 'BOND', outputs: [ { internalType: 'contract IMCV2_Bond', name: '', type: 'address' }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'tokenAddress', type: 'address' }, { internalType: 'address', name: 'authority', type: 'address' }, ], name: 'addAuthority', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'tokenAddress', type: 'address' }, { internalType: 'address', name: 'authority', type: 'address' }, ], name: 'removeAuthority', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'tokenAddress', type: 'address' }, ], name: 'getAuthorities', outputs: [{ internalType: 'address[]', name: '', type: 'address[]' }], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'tokenAddress', type: 'address' }, { internalType: 'address', name: 'authority', type: 'address' }, ], name: 'isAuthority', outputs: [{ internalType: 'bool', name: '', type: 'bool' }], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'tokenAddress', type: 'address' }, { internalType: 'uint256', name: 'offset', type: 'uint256' }, { internalType: 'uint256', name: 'limit', type: 'uint256' }, ], name: 'getLatestProjectUpdates', outputs: [ { components: [ { internalType: 'address', name: 'tokenAddress', type: 'address' }, { internalType: 'string', name: 'link', type: 'string' }, ], internalType: 'struct ProjectUpdates.ProjectUpdate[]', name: 'updates', type: 'tuple[]', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'uint256', name: 'offset', type: 'uint256' }, { internalType: 'uint256', name: 'limit', type: 'uint256' }, ], name: 'getLatestUpdates', outputs: [ { components: [ { internalType: 'address', name: 'tokenAddress', type: 'address' }, { internalType: 'string', name: 'link', type: 'string' }, ], internalType: 'struct ProjectUpdates.ProjectUpdate[]', name: 'updates', type: 'tuple[]', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'getProjectUpdatesCount', outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'tokenAddress', type: 'address' }, ], name: 'getTokenProjectUpdatesCount', outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'owner', outputs: [{ internalType: 'address', name: '', type: 'address' }], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'tokenAddress', type: 'address' }, { internalType: 'string', name: 'link', type: 'string' }, ], name: 'postUpdate', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [], name: 'pricePerUpdate', outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], stateMutability: 'view', type: 'function', }, { inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], name: 'projectUpdates', outputs: [ { internalType: 'address', name: 'tokenAddress', type: 'address' }, { internalType: 'string', name: 'link', type: 'string' }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'renounceOwnership', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'uint256', name: 'newPricePerUpdate', type: 'uint256' }, ], name: 'setPricePerUpdate', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }], name: 'transferOwnership', outputs: [], stateMutability: 'nonpayable', type: 'function', }, ] as const;