diff --git a/packages/admin/__tests__/ProtocolGovernance.test.ts b/packages/admin/__tests__/ProtocolGovernance.test.ts index 3cf468c8..e35963f0 100644 --- a/packages/admin/__tests__/ProtocolGovernance.test.ts +++ b/packages/admin/__tests__/ProtocolGovernance.test.ts @@ -6,10 +6,11 @@ import { type Address } from 'viem'; // Define mocks using vi.hoisted const mocks = vi.hoisted(() => { - const mockRegistry = { - setSuperPaymaster: vi.fn(), - setStaking: vi.fn(), - adminConfigureRole: vi.fn(), + const mockRegistry = { + setSuperPaymaster: vi.fn(), + setStaking: vi.fn(), + getRoleConfig: vi.fn(), + configureRole: vi.fn(), transferOwnership: vi.fn(), SUPER_PAYMASTER: vi.fn(), GTOKEN_STAKING: vi.fn(), @@ -58,7 +59,21 @@ describe('ProtocolGovernance', () => { // Default Resolves mocks.mockRegistry.setSuperPaymaster.mockResolvedValue('0xSetSPHash'); mocks.mockRegistry.setStaking.mockResolvedValue('0xSetStakingHash'); - mocks.mockRegistry.adminConfigureRole.mockResolvedValue('0xConfigRoleHash'); + mocks.mockRegistry.getRoleConfig.mockResolvedValue({ + minStake: 0n, + ticketPrice: 0n, + slashThreshold: 0n, + slashBase: 0n, + slashInc: 0n, + slashMax: 0n, + exitFeePercent: 0n, + isActive: true, + minExitFee: 0n, + description: '', + owner: '0x0000000000000000000000000000000000000000', + roleLockDuration: 0n, + }); + mocks.mockRegistry.configureRole.mockResolvedValue('0xConfigRoleHash'); mocks.mockRegistry.transferOwnership.mockResolvedValue('0xTransferHash'); // Getters @@ -92,39 +107,35 @@ describe('ProtocolGovernance', () => { }); describe('Role Governance', () => { - it('configureRole should call adminConfigureRole', async () => { - const params = { - roleId: '0xRole' as const, // Cast as specific Hex if checked, strict typing - minStake: 100n, - entryBurn: 50n - }; - - // Note: In test file we might need exact types matching what viem expects - // but mocks usually accept any args. config.params.roleId needs to match. - + const ROLE_ID = '0x1234567890123456789012345678901234567890123456789012345678901234' as const; + + it('configureRole should read current config then write merged config', async () => { const result = await governance.configureRole({ - roleId: '0x1234567890123456789012345678901234567890123456789012345678901234', - minStake: 100n + roleId: ROLE_ID, + minStake: 100n, + ticketPrice: 50n, }); - + expect(result).toBe('0xConfigRoleHash'); - expect(mocks.mockRegistry.adminConfigureRole).toHaveBeenCalledWith(expect.objectContaining({ - roleId: '0x1234567890123456789012345678901234567890123456789012345678901234', - minStake: 100n, - entryBurn: 0n // Defaulted in method + expect(mocks.mockRegistry.getRoleConfig).toHaveBeenCalledWith({ roleId: ROLE_ID }); + expect(mocks.mockRegistry.configureRole).toHaveBeenCalledWith(expect.objectContaining({ + roleId: ROLE_ID, + config: expect.objectContaining({ + minStake: 100n, + ticketPrice: 50n, + }), })); }); - it('configureRole should throw on invalid params', async () => { - // The implementation checks if some params are defined. - // If we pass an empty object (besides required roleId), it might fail if we don't handle logic. - // Let's check implementation behavior: - // "if (params.minStake !== undefined || params.entryBurn !== undefined) { ... }" - // Else throws. - - await expect(governance.configureRole({ - roleId: '0x1234567890123456789012345678901234567890123456789012345678901234' - })).rejects.toThrow('Invalid parameters'); + it('configureRole with no overrides should still call configureRole with unchanged values', async () => { + const result = await governance.configureRole({ roleId: ROLE_ID }); + + expect(result).toBe('0xConfigRoleHash'); + expect(mocks.mockRegistry.getRoleConfig).toHaveBeenCalledWith({ roleId: ROLE_ID }); + expect(mocks.mockRegistry.configureRole).toHaveBeenCalledWith(expect.objectContaining({ + roleId: ROLE_ID, + config: expect.objectContaining({ minStake: 0n }), + })); }); }); diff --git a/packages/admin/src/ProtocolGovernance.ts b/packages/admin/src/ProtocolGovernance.ts index 7472d60e..647520f4 100644 --- a/packages/admin/src/ProtocolGovernance.ts +++ b/packages/admin/src/ProtocolGovernance.ts @@ -88,31 +88,30 @@ export class ProtocolGovernance extends BaseClient { } /** - * Configure a Role's parameters (Admin only) - * e.g. Setting minStake for ROLE_PAYMASTER_SUPER + * Configure a Role's parameters (Admin only). + * Reads the current on-chain config first, then merges the provided overrides + * and writes back the full struct via configureRole. */ async configureRole(params: { roleId: Hex; minStake?: bigint; - entryBurn?: bigint; + ticketPrice?: bigint; exitFeePercent?: bigint; minExitFee?: bigint; }, options?: TransactionOptions): Promise { - const registry = registryActions(this.registryAddress); - - // Use the admin shortcut if only updating financial params - if (params.minStake !== undefined || params.entryBurn !== undefined) { - return await registry(this.client).adminConfigureRole({ - roleId: params.roleId, - minStake: params.minStake || 0n, // Careful: this might overwrite if API expects full set - entryBurn: params.entryBurn || 0n, - exitFeePercent: params.exitFeePercent || 0n, - minExitFee: params.minExitFee || 0n, - account: options?.account - }); - } - - throw new Error("Invalid parameters for configureRole"); + const registry = registryActions(this.registryAddress)(this.client); + const current = await registry.getRoleConfig({ roleId: params.roleId }); + return await (registry as any).configureRole({ + roleId: params.roleId, + config: { + ...current, + ...(params.minStake !== undefined && { minStake: params.minStake }), + ...(params.ticketPrice !== undefined && { ticketPrice: params.ticketPrice }), + ...(params.exitFeePercent !== undefined && { exitFeePercent: params.exitFeePercent }), + ...(params.minExitFee !== undefined && { minExitFee: params.minExitFee }), + }, + account: options?.account, + }); } // =========================================== diff --git a/packages/core/__tests__/actions/registry.test.ts b/packages/core/__tests__/actions/registry.test.ts index c1a97823..ec44c9fb 100644 --- a/packages/core/__tests__/actions/registry.test.ts +++ b/packages/core/__tests__/actions/registry.test.ts @@ -11,11 +11,12 @@ describe('RegistryActions Bulk Coverage', () => { beforeEach(() => { resetMocks(); p = createMockPublicClient(); w = createMockWalletClient(); }); describe('Role Management (Writes)', () => { - it('adminConfigureRole', async () => { w.writeContract.mockResolvedValue('0x'); await registryActions(ADDR)(w).adminConfigureRole({ roleId: '0x01', minStake: 1n, entryBurn: 1n, exitFeePercent: 1n, minExitFee: 1n, account: USER }); expect(w.writeContract).toHaveBeenCalled(); }); it('createNewRole', async () => { w.writeContract.mockResolvedValue('0x'); await registryActions(ADDR)(w).createNewRole({ roleId: '0x01', config: {} as any, roleOwner: USER, account: USER }); expect(w.writeContract).toHaveBeenCalled(); }); it('setRoleLockDuration', async () => { w.writeContract.mockResolvedValue('0x'); await registryActions(ADDR)(w).setRoleLockDuration({ roleId: '0x01', duration: 100n, account: USER }); expect(w.writeContract).toHaveBeenCalled(); }); it('setRoleOwner', async () => { w.writeContract.mockResolvedValue('0x'); await registryActions(ADDR)(w).setRoleOwner({ roleId: '0x01', newOwner: USER, account: USER }); expect(w.writeContract).toHaveBeenCalled(); }); it('exitRole', async () => { w.writeContract.mockResolvedValue('0x'); await registryActions(ADDR)(w).exitRole({ roleId: '0x01', account: USER }); expect(w.writeContract).toHaveBeenCalled(); }); + it('syncExitFees - sends tx for non-empty array', async () => { w.writeContract.mockResolvedValue('0x'); await registryActions(ADDR)(w).syncExitFees({ roles: ['0x01' as `0x${string}`], account: USER }); expect(w.writeContract).toHaveBeenCalled(); }); + it('syncExitFees - rejects empty array', async () => { await expect(registryActions(ADDR)(w).syncExitFees({ roles: [], account: USER })).rejects.toThrow('must not be empty'); }); }); describe('Community & Credit (Views/Writes)', () => { @@ -57,10 +58,7 @@ describe('RegistryActions Bulk Coverage', () => { it('creditTierConfig', async () => { p.readContract.mockResolvedValue(100n); expect(await registryActions(ADDR)(p).creditTierConfig({ tierIndex: 0n })).toBe(100n); }); it('levelThresholds', async () => { p.readContract.mockResolvedValue(100n); expect(await registryActions(ADDR)(p).levelThresholds({ levelIndex: 0n })).toBe(100n); }); it('calculateExitFee', async () => { p.readContract.mockResolvedValue(5n); expect(await registryActions(ADDR)(p).calculateExitFee({ roleId: '0x01', amount: 100n })).toBe(5n); }); - it('accountToUser', async () => { p.readContract.mockResolvedValue(USER); expect(await registryActions(ADDR)(p).accountToUser({ account: USER })).toBe(USER); }); - it('roleOwners', async () => { p.readContract.mockResolvedValue(USER); expect(await registryActions(ADDR)(p).roleOwners({ roleId: '0x01' })).toBe(USER); }); it('roleStakes', async () => { p.readContract.mockResolvedValue(100n); expect(await registryActions(ADDR)(p).roleStakes({ roleId: '0x01', user: USER })).toBe(100n); }); - it('roleLockDurations', async () => { p.readContract.mockResolvedValue(100n); expect(await registryActions(ADDR)(p).roleLockDurations({ roleId: '0x01' })).toBe(100n); }); it('roleMetadata', async () => { p.readContract.mockResolvedValue('0x'); expect(await registryActions(ADDR)(p).roleMetadata({ roleId: '0x01', user: USER })).toBe('0x'); }); }); diff --git a/packages/core/__tests__/actions/staking.test.ts b/packages/core/__tests__/actions/staking.test.ts index 34358ea1..d223bdff 100644 --- a/packages/core/__tests__/actions/staking.test.ts +++ b/packages/core/__tests__/actions/staking.test.ts @@ -11,7 +11,7 @@ describe('StakingActions Bulk Coverage', () => { beforeEach(() => { resetMocks(); p = createMockPublicClient(); w = createMockWalletClient(); }); describe('Staking Operations', () => { - it('lockStake', async () => { w.writeContract.mockResolvedValue('0x'); await stakingActions(ADDR)(w).lockStake({ user: USER, roleId: '0x01', stakeAmount: 100n, entryBurn: 10n, payer: USER, account: USER }); expect(w.writeContract).toHaveBeenCalled(); }); + it('lockStake', async () => { w.writeContract.mockResolvedValue('0x'); await stakingActions(ADDR)(w).lockStake({ user: USER, roleId: '0x01', stakeAmount: 100n, ticketPrice: 10n, payer: USER, account: USER }); expect(w.writeContract).toHaveBeenCalled(); }); it('topUpStake', async () => { w.writeContract.mockResolvedValue('0x'); await stakingActions(ADDR)(w).topUpStake({ user: USER, roleId: '0x01', stakeAmount: 100n, payer: USER, account: USER }); expect(w.writeContract).toHaveBeenCalled(); }); it('unlockStake', async () => { w.writeContract.mockResolvedValue('0x'); await stakingActions(ADDR)(w).unlockStake({ user: USER, roleId: '0x01', account: USER }); expect(w.writeContract).toHaveBeenCalled(); }); it('slash', async () => { w.writeContract.mockResolvedValue('0x'); await stakingActions(ADDR)(w).slash({ user: USER, amount: 100n, reason: 'test', account: USER }); expect(w.writeContract).toHaveBeenCalled(); }); diff --git a/packages/core/src/abis/Registry.json b/packages/core/src/abis/Registry.json index ffd3df72..c59c1649 100644 --- a/packages/core/src/abis/Registry.json +++ b/packages/core/src/abis/Registry.json @@ -1,1925 +1,1847 @@ { "abi": [ - { - "type": "constructor", - "inputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "GTOKEN_STAKING", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract IGTokenStaking" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MYSBT", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract IMySBT" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "ROLE_ANODE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "ROLE_COMMUNITY", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "ROLE_DVT", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "ROLE_ENDUSER", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "ROLE_KMS", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "ROLE_PAYMASTER_AOA", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "ROLE_PAYMASTER_SUPER", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "SUPER_PAYMASTER", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "UPGRADE_INTERFACE_VERSION", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "accountToUser", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "batchUpdateGlobalReputation", - "inputs": [ - { - "name": "proposalId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "users", - "type": "address[]", - "internalType": "address[]" - }, - { - "name": "newScores", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "epoch", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "proof", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "blsAggregator", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "blsValidator", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract IBLSValidator" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "communityByENS", - "inputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "communityByName", - "inputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "configureRole", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "config", - "type": "tuple", - "internalType": "struct IRegistry.RoleConfig", - "components": [ - { - "name": "minStake", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "entryBurn", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "slashThreshold", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashBase", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashInc", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashMax", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "exitFeePercent", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "isActive", - "type": "bool", - "internalType": "bool" - }, - { - "name": "minExitFee", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "description", - "type": "string", - "internalType": "string" - }, - { - "name": "owner", - "type": "address", - "internalType": "address" - }, - { - "name": "roleLockDuration", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "creditTierConfig", - "inputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "executedProposals", - "inputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "exitRole", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "getCreditLimit", - "inputs": [ - { - "name": "user", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleConfig", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct IRegistry.RoleConfig", - "components": [ - { - "name": "minStake", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "entryBurn", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "slashThreshold", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashBase", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashInc", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashMax", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "exitFeePercent", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "isActive", - "type": "bool", - "internalType": "bool" - }, - { - "name": "minExitFee", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "description", - "type": "string", - "internalType": "string" - }, - { - "name": "owner", - "type": "address", - "internalType": "address" - }, - { - "name": "roleLockDuration", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleMembers", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "address[]", - "internalType": "address[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleUserCount", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getUserRoles", - "inputs": [ - { - "name": "user", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32[]", - "internalType": "bytes32[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "globalReputation", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "hasRole", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "initialize", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_gtokenStaking", - "type": "address", - "internalType": "address" - }, - { - "name": "_mysbt", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "isReputationSource", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "lastReputationEpoch", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "levelThresholds", - "inputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proposedRoleNames", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "registerRole", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "user", - "type": "address", - "internalType": "address" - }, - { - "name": "roleData", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "roleConfigs", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "minStake", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "entryBurn", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "slashThreshold", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashBase", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashInc", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashMax", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "exitFeePercent", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "isActive", - "type": "bool", - "internalType": "bool" - }, - { - "name": "minExitFee", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "description", - "type": "string", - "internalType": "string" - }, - { - "name": "owner", - "type": "address", - "internalType": "address" - }, - { - "name": "roleLockDuration", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "roleLockDurations", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "roleMemberIndex", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "roleMembers", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "roleMetadata", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "roleOwners", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "roleSBTTokenIds", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "roleStakes", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "safeMintForRole", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "user", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "tokenId", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setBLSAggregator", - "inputs": [ - { - "name": "_aggregator", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setBLSValidator", - "inputs": [ - { - "name": "_validator", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setCreditTier", - "inputs": [ - { - "name": "level", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "limit", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setLevelThresholds", - "inputs": [ - { - "name": "thresholds", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setMySBT", - "inputs": [ - { - "name": "_mysbt", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setReputationSource", - "inputs": [ - { - "name": "source", - "type": "address", - "internalType": "address" - }, - { - "name": "active", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setStaking", - "inputs": [ - { - "name": "_staking", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setSuperPaymaster", - "inputs": [ - { - "name": "_sp", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateOperatorBlacklist", - "inputs": [ - { - "name": "operator", - "type": "address", - "internalType": "address" - }, - { - "name": "users", - "type": "address[]", - "internalType": "address[]" - }, - { - "name": "statuses", - "type": "bool[]", - "internalType": "bool[]" - }, - { - "name": "proof", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "userRoleCount", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "userRoles", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "version", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "pure" - }, - { - "type": "event", - "name": "BLSAggregatorUpdated", - "inputs": [ - { - "name": "oldAgg", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newAgg", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BLSValidatorUpdated", - "inputs": [ - { - "name": "oldVal", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newVal", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BurnExecuted", - "inputs": [ - { - "name": "user", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "roleId", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "reason", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "CreditTierUpdated", - "inputs": [ - { - "name": "level", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "creditLimit", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ExitFeeSyncFailed", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "GlobalReputationUpdated", - "inputs": [ - { - "name": "user", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newScore", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "epoch", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "MySBTContractUpdated", - "inputs": [ - { - "name": "oldMySBT", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newMySBT", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ReputationSourceUpdated", - "inputs": [ - { - "name": "source", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "isActive", - "type": "bool", - "indexed": false, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleConfigured", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "config", - "type": "tuple", - "indexed": false, - "internalType": "struct IRegistry.RoleConfig", - "components": [ - { - "name": "minStake", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "entryBurn", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "slashThreshold", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashBase", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashInc", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "slashMax", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "exitFeePercent", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "isActive", - "type": "bool", - "internalType": "bool" - }, - { - "name": "minExitFee", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "description", - "type": "string", - "internalType": "string" - }, - { - "name": "owner", - "type": "address", - "internalType": "address" - }, - { - "name": "roleLockDuration", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "name": "timestamp", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleExited", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "user", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "exitFee", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "timestamp", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleGranted", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleRegistered", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "user", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "burnAmount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "timestamp", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleRevoked", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StakingContractUpdated", - "inputs": [ - { - "name": "oldStaking", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newStaking", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "SuperPaymasterUpdated", - "inputs": [ - { - "name": "oldSP", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newSP", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "AddressEmptyCode", - "inputs": [ - { - "name": "target", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "BLSFailed", - "inputs": [] - }, - { - "type": "error", - "name": "BLSNotConfigured", - "inputs": [] - }, - { - "type": "error", - "name": "BLSProofRequired", - "inputs": [] - }, - { - "type": "error", - "name": "BatchTooLarge", - "inputs": [] - }, - { - "type": "error", - "name": "CallerNotCommunity", - "inputs": [] - }, - { - "type": "error", - "name": "ERC1967InvalidImplementation", - "inputs": [ - { - "name": "implementation", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "ERC1967NonPayable", - "inputs": [] - }, - { - "type": "error", - "name": "FailedInnerCall", - "inputs": [] - }, - { - "type": "error", - "name": "FeeTooHigh", - "inputs": [] - }, - { - "type": "error", - "name": "InsufficientConsensus", - "inputs": [] - }, - { - "type": "error", - "name": "InsufficientStake", - "inputs": [ - { - "name": "provided", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "required", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "InvalidAddr", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidInitialization", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidParam", - "inputs": [] - }, - { - "type": "error", - "name": "LenMismatch", - "inputs": [] - }, - { - "type": "error", - "name": "LockNotMet", - "inputs": [] - }, - { - "type": "error", - "name": "NotInitializing", - "inputs": [] - }, - { - "type": "error", - "name": "OwnableInvalidOwner", - "inputs": [ - { - "name": "owner", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "OwnableUnauthorizedAccount", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "ProposalExecuted", - "inputs": [] - }, - { - "type": "error", - "name": "ReentrancyGuardReentrantCall", - "inputs": [] - }, - { - "type": "error", - "name": "RoleAlreadyGranted", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "user", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "RoleNotConfigured", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "isActive", - "type": "bool", - "internalType": "bool" - } - ] - }, - { - "type": "error", - "name": "RoleNotGranted", - "inputs": [ - { - "name": "roleId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "user", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "SPNotSet", - "inputs": [] - }, - { - "type": "error", - "name": "ThreshNotAscending", - "inputs": [] - }, - { - "type": "error", - "name": "TooManyLevels", - "inputs": [] - }, - { - "type": "error", - "name": "UUPSUnauthorizedCallContext", - "inputs": [] - }, - { - "type": "error", - "name": "UUPSUnsupportedProxiableUUID", - "inputs": [ - { - "name": "slot", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "Unauthorized", - "inputs": [] - }, - { - "type": "error", - "name": "UnauthorizedSource", - "inputs": [] - } - ], - "bytecode": "0x60a08060405234610123573315610110575f8054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360018055306080525f5160206160675f395f51905f525460ff8160401c16610101576002600160401b03196001600160401b038216016100ae575b604051615f3f908161012882396080518181816140bc01526141580152f35b6001600160401b0319166001600160401b039081175f5160206160675f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f8061008f565b63f92ee8a960e01b5f5260045ffd5b631e4fbdf760e01b5f525f60045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816306a36aee14614fd6575080630dbb492914614f9057806310fdfea714614f6957806311c85b0b14614f3157806315de32ca14614ed557806317e1c59514614b5057806319c46e8114614b2a5780631a08a81914614af05780631b02e44f146145c05780631cae0412146145715780632822ffce146145395780632c333e251461448c57806336db9caf146144475780633b60288a14614418578063410087ad146143ba57806343e6a160146143935780634b8b8a6e146143695780634f1ef2861461411b57806352d1902d146140a257806354fd4d501461404357806359dc912614613ffb5780635c44541214613fc35780635ee05b17146139cf5780636229738c1461394f578063669d77621461346c578063715018a61461341a578063727b52a514612c9d57806377c0d7e714612c575780637f52815514612c05578063826600ce14612bde5780638da5cb5b14612bb85780638ff39099146128a6578063919d1e2c1461287f57806391d1485414612834578063920983fb146127fa578063995d74ef146127985780639b1465a31461275d578063a2d0020e14612735578063a3246ad31461267c578063aa9e8cf714612649578063ad3cb1cc146125fc578063af5eda02146125d2578063b5e936ab146123ee578063bb2ae6bf14612282578063bc95910114612220578063be30742f146121f9578063bf0cb042146121d1578063bf28c98a14612194578063c0c53b8b1461085f578063c8ee23ef14610819578063cd5d1e74146107b7578063ce830e7b1461057a578063d12b93ff14610553578063e350d77b14610529578063e74c7bd7146104f1578063e79e97391461048f578063e7b8913814610430578063e9ebf831146103f5578063f2fde38b146103a45763f538e1dc146102b2575f80fd5b346103a15760203660031901126103a157604090600435815260076020522080546001820154916002810154610390600383015460405190610302826102fb81600489016151e3565b03836152af565b60ff60066001600160a01b03600588015416960154946040519889988952602089015263ffffffff8116604089015263ffffffff8160201c16606089015263ffffffff8160401c16608089015263ffffffff8160601c1660a089015261ffff8160801c1660c089015260901c16151560e08701526101008601526101806101208601526101808501906152d0565b916101408401526101608301520390f35b80fd5b50346103a15760203660031901126103a1576103be615087565b6103c6615602565b6001600160a01b038116156103e1576103de90615cd9565b80f35b631e4fbdf760e01b82526004829052602482fd5b50346103a157806003193601126103a15760206040517f3b5016dc6721b132ddcb7027030b137a739df81e419695dae0899a866c1c514d8152f35b50346103a15760203660031901126103a157600435906001600160401b0382116103a15760206001600160a01b03818061046d366004880161530f565b604051928184925191829101835e8101600f8152030190205416604051908152f35b50346103a15760203660031901126103a1576104a9615087565b6104b1615602565b6001600160a01b0380600454921691828219821617600455167f1f7cd67c986d0cce4aa6f69075b5278a05438ef2a5d1abf6eeded51ba81232458380a380f35b50346103a15760203660031901126103a15760406020916001600160a01b03610518615087565b168152601583522054604051908152f35b50346103a15760203660031901126103a15760406020916004358152601b83522054604051908152f35b50346103a157806003193601126103a15760206001600160a01b0360065416604051908152f35b50346103a15760803660031901126103a157610594615087565b906024356001600160401b0381116107b3576105b490369060040161517b565b926044356001600160401b0381116107af576105d490369060040161517b565b9490926064356001600160401b0381116107ab576105f6903690600401615108565b9190610600615628565b338752601760205260ff6040882054161561079c5787840361078d576001600160a01b036004541692831561077e576001600160a01b03600654169182151580610775575b6106b5575b5050508596823b156106b157869461067a869260405198899788968795632fa66a7f60e11b87526004870161559d565b03925af180156106a657610691575b506001805580f35b8161069b916152af565b6103a157805f610689565b6040513d84823e3d90fd5b8680fd5b6107019260209285926106e48a6106d68f8e8d604051998a958c870161559d565b03601f1981018652856152af565b604051635c73957b60e11b8152958694859384936004850161543e565b03915afa90811561076a578791610730575b5015610721575f808061064a565b63eeee2fe160e01b8652600486fd5b90506020813d602011610762575b8161074b602093836152af565b810103126106b15761075c9061537f565b5f610713565b3d915061073e565b6040513d89823e3d90fd5b50811515610645565b63cf8d29eb60e01b8852600488fd5b638b140a8160e01b8752600487fd5b635cfb0e7f60e01b8752600487fd5b8580fd5b8380fd5b5080fd5b50346103a15760203660031901126103a1576107d1615087565b6107d9615602565b6001600160a01b0380600354921691828219821617600355167f171f7dbde35aed7cddf3ece2dad8f4eb62443a3d6bf8616586da6fd03c6b4ed98380a380f35b50346103a15760403660031901126103a1576001600160a01b03604061083d61509d565b92600435815260096020522091165f52602052602060405f2054604051908152f35b50346103a15760603660031901126103a157610879615087565b61088161509d565b6044356001600160a01b0381168091036107af577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549160ff8360401c1615926001600160401b0381168015908161218c575b6001149081612182575b159081612179575b5061216a5767ffffffffffffffff1981166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00558361212b575b5061092c84615cd9565b6001600160a01b03166001600160a01b031960025416176002556001600160a01b0319600354161760035582602092836040519161096a82846152af565b8383526040519261097a84615264565b6801a055690d9db8000084528284016729a2241af62c0000815260408501600a81526060860160028152608087016001815260a08801600a815260c08901916103e8835260e08a0193600185526101008b0196670de0b6b3a764000088526101208c019889526101408c01996001600160a01b03169c8d8b526101608d019b62278d008d525f516020615eea5f395f51905f52825260079052604090209b518c555160018c015560028b01955163ffffffff1663ffffffff1663ffffffff198754161786555163ffffffff16610a6d90869067ffffffff0000000082549160201b169067ffffffff000000001916179055565b51845463ffffffff60401b191660409190911b63ffffffff60401b1617845551835463ffffffff60601b191660609190911b63ffffffff60601b1617835551825461ffff60801b191660809190911b61ffff60801b1617825551815460ff60901b191690151560901b60ff60901b1617905551600385015551805160048501916001600160401b038211611bb657610b0f82610b0985546151ab565b856154c1565b88908a601f84116001146120bb5792806001600160a01b039593610b4c93600699989692611b3b575b50508160011b915f199060031b1c19161790565b90555b51166001600160a01b036005850191166001600160a01b031982541617905551910155836001600160a01b0360025416801515806120b1575b61204f575b5050604051610b9c84826152af565b848152838560405192610bae84615264565b6802b5e3af16b18800008452828401674563918244f40000815260408501600a81526060860160028152608087016001815260a08801600a815260c08901916103e8835260e08a0193600185526101008b0196671bc16d674ec8000088526101208c019889526101408c01998d8b526101608d019b62278d008d525f516020615eca5f395f51905f52825260079052604090209b518c555160018c015560028b01955163ffffffff1663ffffffff1663ffffffff198754161786555163ffffffff16610c9790869067ffffffff0000000082549160201b169067ffffffff000000001916179055565b51845463ffffffff60401b191660409190911b63ffffffff60401b1617845551835463ffffffff60601b191660609190911b63ffffffff60601b1617835551825461ffff60801b191660809190911b61ffff60801b1617825551815460ff60901b191690151560901b60ff60901b1617905551600385015551805160048501916001600160401b038211611bb657610d3382610b0985546151ab565b88908a601f8411600114611fdf5792806001600160a01b039593610d6f93600699989692611b3b5750508160011b915f199060031b1c19161790565b90555b51166001600160a01b036005850191166001600160a01b031982541617905551910155836001600160a01b036002541680151580611fd5575b611f73575b5050604051610dbf84826152af565b848152838560405192610dd184615264565b6801a055690d9db8000084528284016729a2241af62c0000815260408501600a81526060860160028152608087016001815260a08801600a815260c08901916103e8835260e08a0193600185526101008b0196670de0b6b3a764000088526101208c019889526101408c01998d8b526101608d019b62278d008d527f3b5016dc6721b132ddcb7027030b137a739df81e419695dae0899a866c1c514d825260079052604090209b518c555160018c015560028b01955163ffffffff1663ffffffff1663ffffffff198754161786555163ffffffff16610ecd90869067ffffffff0000000082549160201b169067ffffffff000000001916179055565b51845463ffffffff60401b191660409190911b63ffffffff60401b1617845551835463ffffffff60601b191660609190911b63ffffffff60601b1617835551825461ffff60801b191660809190911b61ffff60801b1617825551815460ff60901b191690151560901b60ff60901b1617905551600385015551805160048501916001600160401b038211611bb657610f6982610b0985546151ab565b88908a601f8411600114611f035792806001600160a01b039593610fa593600699989692611b3b5750508160011b915f199060031b1c19161790565b90555b51166001600160a01b036005850191166001600160a01b031982541617905551910155836001600160a01b036002541680151580611ef9575b611e84575b5050604051610ff584826152af565b84815283856040519261100784615264565b6801158e460913d000008452828401671bc16d674ec80000815260408501600f81526060860160018152608087016001815260a088016005815260c08901916103e8835260e08a0193600185526101008b0196670de0b6b3a764000088526101208c019889526101408c01998d8b526101608d019b62278d008d527f3aa2e9509f29532b71f822e18bcde843a8070a508d564188ec8a6adf59eff28a825260079052604090209b518c555160018c015560028b01955163ffffffff1663ffffffff1663ffffffff198754161786555163ffffffff1661110390869067ffffffff0000000082549160201b169067ffffffff000000001916179055565b51845463ffffffff60401b191660409190911b63ffffffff60401b1617845551835463ffffffff60601b191660609190911b63ffffffff60601b1617835551825461ffff60801b191660809190911b61ffff60801b1617825551815460ff60901b191690151560901b60ff60901b1617905551600385015551805160048501916001600160401b038211611bb65761119f82610b0985546151ab565b88908a601f8411600114611e145792806001600160a01b0395936111db93600699989692611b3b5750508160011b915f199060031b1c19161790565b90555b51166001600160a01b036005850191166001600160a01b031982541617905551910155836001600160a01b036002541680151580611e0a575b611d95575b505060405161122b84826152af565b84815283856040519261123d84615264565b68056bc75e2d631000008452828401678ac7230489e80000815260408501600581526060860160058152608087016002815260a088016014815260c08901916103e8835260e08a0193600185526101008b0196674563918244f4000088526101208c019889526101408c01998d8b526101608d019b62278d008d527f6fb2b25080d21c908f32ff8ff99eb1d552c210854f7de48a40406764c09c68f8825260079052604090209b518c555160018c015560028b01955163ffffffff1663ffffffff1663ffffffff198754161786555163ffffffff1661133990869067ffffffff0000000082549160201b169067ffffffff000000001916179055565b51845463ffffffff60401b191660409190911b63ffffffff60401b1617845551835463ffffffff60601b191660609190911b63ffffffff60601b1617835551825461ffff60801b191660809190911b61ffff60801b1617825551815460ff60901b191690151560901b60ff60901b1617905551600385015551805160048501916001600160401b038211611bb6576113d582610b0985546151ab565b88908a601f8411600114611d255792806001600160a01b03959361141193600699989692611b3b5750508160011b915f199060031b1c19161790565b90555b51166001600160a01b036005850191166001600160a01b031982541617905551910155836001600160a01b036002541680151580611d1b575b611ca6575b505060405161146184826152af565b84815283856040519261147384615264565b6801a055690d9db8000084528284016729a2241af62c0000815260408501600a81526060860160028152608087016001815260a08801600a815260c08901916101f4835260e08a0193600185526101008b0196670de0b6b3a764000088526101208c019889526101408c01998d8b526101608d019b62278d008d525f516020615eaa5f395f51905f52825260079052604090209b518c555160018c015560028b01955163ffffffff1663ffffffff1663ffffffff198754161786555163ffffffff1661155c90869067ffffffff0000000082549160201b169067ffffffff000000001916179055565b51845463ffffffff60401b191660409190911b63ffffffff60401b1617845551835463ffffffff60601b191660609190911b63ffffffff60601b1617835551825461ffff60801b191660809190911b61ffff60801b1617825551815460ff60901b191690151560901b60ff60901b1617905551600385015551805160048501916001600160401b038211611bb6576115f882610b0985546151ab565b88908a601f8411600114611c365792806001600160a01b03959361163493600699989692611b3b5750508160011b915f199060031b1c19161790565b90555b51166001600160a01b036005850191166001600160a01b031982541617905551910155836001600160a01b036002541680151580611c2c575b611bca575b505060405161168484826152af565b84815283856040519261169684615264565b670429d069189e0000845282840166b1a2bc2ec50000815260408501838152606086018481526080870185815260a0880186815260c08901916103e8835260e08a0193600185526101008b019666b1a2bc2ec5000088526101208c019889526101408c01998d8b526101608d019b62093a808d525f516020615e8a5f395f51905f52825260079052604090209b518c555160018c015560028b01955163ffffffff1663ffffffff1663ffffffff198754161786555163ffffffff1661177890869067ffffffff0000000082549160201b169067ffffffff000000001916179055565b51845463ffffffff60401b191660409190911b63ffffffff60401b1617845551835463ffffffff60601b191660609190911b63ffffffff60601b1617835551825461ffff60801b191660809190911b61ffff60801b1617825551815460ff60901b191690151560901b60ff60901b1617905551600385015551805160048501916001600160401b038211611bb65761181482610b0985546151ab565b88908a601f8411600114611b465792806001600160a01b03959361185093600699989692611b3b5750508160011b915f199060031b1c19161790565b90555b51166001600160a01b036005850191166001600160a01b031982541617905551910155836001600160a01b036002541680151580611b31575b611ad0575b506001905260168352836040812055600284526016835268056bc75e2d6310000060408520556003845260168352681043561a882930000060408520556004845260168352682086ac35105260000060408520556005845260168352683635c9adc5dea0000060408520556006845260168352686c6b935b8bbd4000006040852055601854600160401b811015611abc57806001611934920160185560186150f3565b81549060031b90600d821b915f19901b1916179055601854600160401b811015611abc5780600161196a920160185560186150f3565b81549060031b906022821b915f19901b1916179055601854600160401b811015611abc578060016119a0920160185560186150f3565b81549060031b906059821b915f19901b1916179055601854600160401b811015611abc578060016119d6920160185560186150f3565b81549060031b9060e9821b915f19901b1916179055601854600160401b811015611abc57806001611a0c920160185560186150f3565b81549060031b90610262821b915f19901b191617905583526017825260408320600160ff19825416179055611a3f575080f35b7fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29068ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005560405160018152a180f35b634e487b7160e01b85526041600452602485fd5b803b156107b357818091606460405180948193636b26335560e11b83525f516020615e8a5f395f51905f5260048401526103e8602484015266b1a2bc2ec5000060448401525af1156118915781611b26916152af565b6107af57835f611891565b50803b151561188c565b015190505f80610b38565b50838b52898b209190601f1984168c5b8c828210611ba057505092600192859260069998966001600160a01b03989610611b88575b505050811b019055611853565b01515f1960f88460031b161c191690555f8080611b7b565b6001859682939686015181550195019301611b56565b634e487b7160e01b8a52604160045260248afd5b803b156107b357818091606460405180948193636b26335560e11b83525f516020615eaa5f395f51905f5260048401526101f46024840152670de0b6b3a764000060448401525af1156116755781611c21916152af565b6107af57835f611675565b50803b1515611670565b50838b52898b209190601f1984168c5b8c828210611c9057505092600192859260069998966001600160a01b03989610611c78575b505050811b019055611637565b01515f1960f88460031b161c191690555f8080611c6b565b6001859682939686015181550195019301611c46565b803b156107b357818091606460405180948193636b26335560e11b83527f6fb2b25080d21c908f32ff8ff99eb1d552c210854f7de48a40406764c09c68f860048401526103e86024840152674563918244f4000060448401525af1156114525781611d10916152af565b6107af57835f611452565b50803b151561144d565b50838b52898b209190601f1984168c5b8c828210611d7f57505092600192859260069998966001600160a01b03989610611d67575b505050811b019055611414565b01515f1960f88460031b161c191690555f8080611d5a565b6001859682939686015181550195019301611d35565b803b156107b357818091606460405180948193636b26335560e11b83527f3aa2e9509f29532b71f822e18bcde843a8070a508d564188ec8a6adf59eff28a60048401526103e86024840152670de0b6b3a764000060448401525af11561121c5781611dff916152af565b6107af57835f61121c565b50803b1515611217565b50838b52898b209190601f1984168c5b8c828210611e6e57505092600192859260069998966001600160a01b03989610611e56575b505050811b0190556111de565b01515f1960f88460031b161c191690555f8080611e49565b6001859682939686015181550195019301611e24565b803b156107b357818091606460405180948193636b26335560e11b83527f3b5016dc6721b132ddcb7027030b137a739df81e419695dae0899a866c1c514d60048401526103e86024840152670de0b6b3a764000060448401525af115610fe65781611eee916152af565b6107af57835f610fe6565b50803b1515610fe1565b50838b52898b209190601f1984168c5b8c828210611f5d57505092600192859260069998966001600160a01b03989610611f45575b505050811b019055610fa8565b01515f1960f88460031b161c191690555f8080611f38565b6001859682939686015181550195019301611f13565b803b156107b357818091606460405180948193636b26335560e11b83525f516020615eca5f395f51905f5260048401526103e86024840152671bc16d674ec8000060448401525af115610db05781611fca916152af565b6107af57835f610db0565b50803b1515610dab565b50838b52898b209190601f1984168c5b8c82821061203957505092600192859260069998966001600160a01b03989610612021575b505050811b019055610d72565b01515f1960f88460031b161c191690555f8080612014565b6001859682939686015181550195019301611fef565b803b156107b357818091606460405180948193636b26335560e11b83525f516020615eea5f395f51905f5260048401526103e86024840152670de0b6b3a764000060448401525af115610b8d57816120a6916152af565b6107af57835f610b8d565b50803b1515610b88565b50838b52898b209190601f1984168c5b8c82821061211557505092600192859260069998966001600160a01b039896106120fd575b505050811b019055610b4f565b01515f1960f88460031b161c191690555f80806120f0565b60018596829396860151815501950193016120cb565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555f610922565b63f92ee8a960e01b8652600486fd5b9050155f6108e6565b303b1591506108de565b8591506108d4565b50346103a15760203660031901126103a15760ff60406020926001600160a01b036121bd615087565b168152601784522054166040519015158152f35b50346103a157806003193601126103a15760206040515f516020615eea5f395f51905f528152f35b50346103a157806003193601126103a15760206001600160a01b0360055416604051908152f35b50346103a15760203660031901126103a15761223a615087565b612242615602565b6001600160a01b0380600554921691828219821617600555167f019f532f6e08ee8944dc2e7ac40f3c97ad4a20618aee847ddf7c502821c7dad48380a380f35b50346103a15760203660031901126103a1576004356001600160401b0381116107b3576122b390369060040161517b565b6122bb615602565b601481116123df57601854836018558061239e575b50825b8181106122de578380f35b8015158061235f575b612350576122f6818385615464565b35601854600160401b81101561233c579061233461231e8360018096950160185560186150f3565b819391549060031b91821b915f19901b19161790565b9055016122d3565b634e487b7160e01b86526041600452602486fd5b637342d4e360e11b8452600484fd5b5061236b818385615464565b355f19820182811161238a57612382908486615464565b3510156122e7565b634e487b7160e01b86526011600452602486fd5b60188452835b8181106123b157506122d0565b60019085817fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0155016123a4565b63194a3c0f60e11b8352600483fd5b50346103a15760203660031901126103a1578060405161240d81615264565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e082015281610100820152610120810160609052816101408201526101600152600435815260076020526040902060405161247081615264565b81548152600182015491602082019283526002810154604083019063ffffffff8116825260608401908060201c63ffffffff16825260808501908060401c63ffffffff16825260a086018160601c63ffffffff16815260c08701908260801c61ffff16825260e088019260901c60ff1615158352600387015493610100890194855260405195868060048b0190612506916151e3565b0361251190886152af565b6101208a0196875260058901546001600160a01b0316986101408b01998a5260060154976101608b019889526040519b8c9b60208d525160208d01525160408c01525163ffffffff1660608b01525163ffffffff1660808a01525163ffffffff1660a08901525163ffffffff1660c08801525161ffff1660e08701525115156101008601525161012085015251610140840161018090526101a084016125b6916152d0565b91516001600160a01b0316610160840152516101808301520390f35b50346103a15760203660031901126103a15760406020916004358152601683522054604051908152f35b50346103a157806003193601126103a1575061264560405161261f6040826152af565b60058152640352e302e360dc1b60208201526040519182916020835260208301906152d0565b0390f35b50346103a15760203660031901126103a1576001600160a01b0360406020926004358152601a8452205416604051908152f35b50346103a15760203660031901126103a1576004358152600a60205260408120604051908160208254918281520190819285526020852090855b81811061271657505050826126cc9103836152af565b604051928392602084019060208552518091526040840192915b8181106126f4575050500390f35b82516001600160a01b03168452859450602093840193909201916001016126e6565b82546001600160a01b03168452602090930192600192830192016126b6565b50346103a157806003193601126103a15760206040515f516020615eaa5f395f51905f528152f35b50346103a157806003193601126103a15760206040517f6fb2b25080d21c908f32ff8ff99eb1d552c210854f7de48a40406764c09c68f88152f35b50346103a15760203660031901126103a1576127b2615087565b6127ba615602565b6001600160a01b0380600654921691828219821617600655167f9e5ee21152afb219d78a3588775fe954c5094514af1627c6d4b203175091d3048380a380f35b50346103a15760203660031901126103a1576001600160a01b03604060209282612822615087565b16815260108452205416604051908152f35b50346103a15760403660031901126103a1576001600160a01b03604061285861509d565b92600435815260086020522091165f52602052602060ff60405f2054166040519015158152f35b50346103a157806003193601126103a15760206001600160a01b0360045416604051908152f35b50346103a15760203660031901126103a1576128c0615087565b6128c8615602565b6001600160a01b036002549116806001600160a01b03198316176002556001600160a01b0360405192167f7042586b23181180eb30b4798702d7a0233b7fc2551e89806770e8e5d9392e6a8480a360e081018181106001600160401b03821117612ba4576040525f516020615eea5f395f51905f5281525f516020615eca5f395f51905f5260208201527f3b5016dc6721b132ddcb7027030b137a739df81e419695dae0899a866c1c514d60408201527f3aa2e9509f29532b71f822e18bcde843a8070a508d564188ec8a6adf59eff28a60608201527f6fb2b25080d21c908f32ff8ff99eb1d552c210854f7de48a40406764c09c68f860808201525f516020615eaa5f395f51905f5260a08201525f516020615e8a5f395f51905f5260c0820152815b600781106129f8578280f35b612a028183615e1e565b5183526007602052604083209083604051612a1c81615264565b8354815260018401546020820152600284015463ffffffff8116604083015263ffffffff8160201c16606083015263ffffffff8160401c16608083015263ffffffff8160601c1660a083015260c082019161ffff8260801c16835260ff60e082019260901c161515825261016060066003880154976101008401988952604051612ab481612aad81600486016151e3565b03826152af565b6101208501526001600160a01b03600582015416610140850152015491015251612ae5575b505060019150016129ec565b6001600160a01b036002541661ffff612afe8588615e1e565b51925116945190803b156107af57604051636b26335560e11b8152600481019390935261ffff95909516602483015260448201529281908490606490829084905af19283612b8f575b5050600191155f14612b8a57612b5d8184615e1e565b517f9bf6cb2782f3e5887935d2bae3e6fd270dda91e454f1a7bff80c950ff8a452ad8580a25b835f612ad9565b612b83565b81612b99916152af565b6107af57835f612b47565b634e487b7160e01b83526041600452602483fd5b50346103a157806003193601126103a1576001600160a01b036020915416604051908152f35b50346103a157806003193601126103a15760206001600160a01b0360025416604051908152f35b50346103a15760403660031901126103a157602435906004358152600a602052604081209081548310156103a15760206001600160a01b03612c4785856150f3565b90549060031b1c16604051908152f35b50346103a15760403660031901126103a1576001600160a01b036040612c7b61509d565b926004358152600b6020522091165f52602052602060405f2054604051908152f35b50346103a15760203660031901126103a157600435612cba615628565b8082526008602052604082206001600160a01b0333165f5260205260ff60405f205416156134045780825260076020526006604083200154806132fc575b508082526009602052604082206001600160a01b0333165f5260205260405f2054905f516020615e8a5f395f51905f5281145f1461307757826001600160a01b0360035416803b156107b3578180916024604051809481936316bf12d760e21b83523360048401525af180156106a657613062575b50505b80604051838152604060208201526004604082015263115e1a5d60e21b60608201527fe80f99d9789e367c229c526d3d3f84d44d3daf77ea65f7bbe8510f176ac45a2360803392a38083526008602052604083206001600160a01b0333165f5260205260405f2060ff198154169055612de93382615d16565b33835260136020526040832054613045575b33835260126020526040832091825492845b848110612fb5575b50509091503383526013602052604083205415612efa575b60025460405163374e4d7360e01b81523360048201526024810184905291906020908390604490829088906001600160a01b03165af1908115612eef578491612eb5575b612e7b9250615488565b906040519182524260208301527f0d9361411a652b66cd4aed24a96d36c0b048899896c927d879a9d3ba2790d9c660403393a36001805580f35b90506020823d602011612ee7575b81612ed0602093836152af565b81010312612ee357612e7b915190612e71565b5f80fd5b3d9150612ec3565b6040513d86823e3d90fd5b826001600160a01b036004541680612f6a575b506001600160a01b0360035416803b156107b35781809160246040518094819363374e7fa360e01b83523360048401525af180156106a657612f51575b5050612e2d565b81612f5b916152af565b612f6657825f612f4a565b8280fd5b803b156107b3578180916044604051809481936351cb857360e11b83523360048401528160248401525af180156106a65715612f0d5781612faa916152af565b612f6657825f612f0d565b83612fc082846150f3565b90549060031b1c14612fd457600101612e0d565b909192935f19810190811161238a5761231e612ff361300192856150f3565b90549060031b1c92846150f3565b905580548015613031575f19019061301982826150f3565b8154905f199060031b1b191690555581905f80612e15565b634e487b7160e01b85526031600452602485fd5b33835260136020526040832061305b8154615495565b9055612dfb565b8161306c916152af565b612f6657825f612d6d565b5f516020615eaa5f395f51905f528103612d7057808352600d602052604083206001600160a01b0333165f52602052612aad6130bc60405f20604051928380926151e3565b805180613125575b5050826001600160a01b0360035416803b156107b35781809160446040518094819363d977b66b60e01b83523360048401523360248401525af180156106a657613110575b5050612d70565b8161311a916152af565b612f6657825f613109565b81019060208201906020818403126107ab576020810151906001600160401b0382116106b157019160c090839003126132f8576040519061316582615294565b60208301516001600160401b0381116106b15781602061318792860101615583565b825260408301516001600160401b0381116106b1578160206131ab92860101615583565b926020830193845260608101516001600160401b0381116132f4578260206131d592840101615583565b604084015260808101516001600160401b0381116132f4578260206131fc92840101615583565b606084015260a08101516001600160401b0381116132f45760c092602061322592840101615583565b6080840152015160a0820152336001600160a01b036132448351615353565b5416146132c9575b508051805190811515918261329a575b5050613269575b806130c4565b6020809151604051928184925191829101835e8101600f8152030190206001600160a01b031981541690555f613263565b6001600160a01b039192508060206040519401845e820191600f83526020813394030190205416145f8061325c565b6132d39051615353565b805473ffffffffffffffffffffffffffffffffffffffff191690555f61324c565b8780fd5b8480fd5b6002546040516318581cf760e11b815233600482015260248101849052908490829060449082906001600160a01b03165afa8015612eef57849061337e575b65ffffffffffff91501690810180911161336a57421061335b575f612cf8565b6314bc3b5b60e11b8252600482fd5b634e487b7160e01b83526011600452602483fd5b503d8085833e61338e81836152af565b81019060a0818303126132f8576133a481615530565b506133b160208201615530565b5060408101519065ffffffffffff821682036107ab576080810151906001600160401b0382116106b1570182601f820112156107ab5765ffffffffffff928160206133fe9351910161554d565b5061333b565b633a401ef360e21b825260045233602452604490fd5b50346103a157806003193601126103a157613433615602565b806001600160a01b038154811981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50346103a15761347b36615135565b929190613486615628565b6001600160a01b0382169384156139405761080081116139405783865260076020526040862092604051926134ba84615264565b8454845260018501549460208501958652600660028201549163ffffffff8316604088015263ffffffff8360201c16606088015263ffffffff8360401c16608088015263ffffffff8360601c1660a088015261ffff8360801c1660c088015260ff60e088019360901c1615158352600381015461010088015260405161354781612aad81600486016151e3565b6101208801526001600160a01b0360058201541661014088015201546101608601525115806139285750858852600860205260408820875f5260205260ff60405f20541693848095613911575b6138fa575f516020615eca5f395f51905f52871480156138e4575b613894575b6135c08483858a615648565b949091821561388b575b518083106138745750856136e9578361361b9593604095936135f0938a5192848d615a68565b86896001600160a01b036003541692855196879586948593631f1f342160e11b8552600485016153a9565b03925af19081156136de5786916136ae575b50838652600c60205260408620855f5260205260405f20555f1461368457507f2c48d754bbf59f20e71c13710fac35aa1ea020da58dcbb366de0ef7f75c9377d6040845b8151908152426020820152a36001805580f35b60407f2c48d754bbf59f20e71c13710fac35aa1ea020da58dcbb366de0ef7f75c9377d9151613671565b6136d0915060403d6040116136d7575b6136c881836152af565b81019061538c565b505f61362d565b503d6136be565b6040513d88823e3d90fd5b90896001600160a01b03600254168982526009602052604082208b5f5260205261371760405f205484615488565b90803b15612f66578b9160848c85809460405196879586946325e5c05160e11b86528260048701526024860152604485015260648401525af180156106a65761385b575b50889052600960205260408a20895f5260205260405f2055868952600d60205260408920885f5260205260405f20916001600160401b038211611bb6576137a682610b0985546151ab565b89908a601f84116001146137ef57928061361b9795936137dd9360409896926137e45750508160011b915f199060031b1c19161790565b90556135f0565b013590505f80610b38565b50838b5260208b2091601f1984168c5b81811061384357509260019285926040989661361b9a98961061382a575b505050811b0190556135f0565b01355f19600384901b60f8161c191690555f808061381d565b919360206001819287870135815501950192016137ff565b81613865916152af565b61387057895f61375b565b8980fd5b6322df051360e11b8b52600483905260245260448afd5b805192506135ca565b5f516020615eaa5f395f51905f528952600860205260408920885f5260205260ff60405f2054166135b457633a401ef360e21b89525f516020615eaa5f395f51905f526004526024889052604489fd5b505f516020615eea5f395f51905f5287146135af565b6044898989631b753c1b60e21b8352600452602452fd5b505f516020615e8a5f395f51905f52871415613594565b63159818c760e11b8952600487905215602452604488fd5b633494a40d60e21b8652600486fd5b50346103a15760403660031901126103a157613969615087565b60243590811515809203612f665760206001600160a01b037f6be30291a8f228c9342613e5e66df1a1b85aa570ac1bca9219f3ac7b7f73bbf3926139ab615602565b1692838552601782526040852060ff1981541660ff8316179055604051908152a280f35b5034612ee3576040366003190112612ee3576004356001600160401b0360243511612ee3576024353603610180600319820112612ee357815f5260076020526001600160a01b03600560405f2001541680155f14613f9357506001600160a01b035f54163303613f85575b6107d061ffff613a4e60c4602435016154a1565b1611613f76576001600160a01b03613a6b61014460243501615474565b1615613f6757815f52600760205260405f209060243560040135825560248035013560018301556002820163ffffffff613aa96044602435016154b0565b1663ffffffff19825416178155613ae9613ac76064602435016154b0565b825467ffffffff00000000191660209190911b67ffffffff0000000016178255565b613b1a613afa6084602435016154b0565b825463ffffffff60401b191660409190911b63ffffffff60401b16178255565b613b4b613b2b60a4602435016154b0565b825463ffffffff60601b191660609190911b63ffffffff60601b16178255565b613b78613b5c60c4602435016154a1565b825461ffff60801b191660809190911b61ffff60801b16178255565b60e460243501358015158103612ee357815460ff60901b191690151560901b60ff60901b16179055610104602435013560038301556022190161012460243501351215612ee3576001600160401b03602435610124810135016004013511612ee357602480356101248101350160048101353603910113612ee357613c1c60046101246024350135602435010135613c1360048401546151ab565b600484016154c1565b5f6001601f60243561012481013501600401351114613eb25790613c776006925f9060046101246024350135602435010135613e9a575b5060046101246024350135602435010135908160011b915f199060031b1c19161790565b60048201555b613c8c61014460243501615474565b6001600160a01b036005830191166001600160a01b0319825416179055610164602435013591829101556001600160a01b0360025416613cd060c4602435016154a1565b90803b15612ee357604051636b26335560e11b81526004810185905261ffff90921660248084019190915235610104013560448301525f9082908183816064810103925af18015613e8f57613e7a575b5060405160408152602435600401356040820152602480350135606082015263ffffffff613d5260446024350161551f565b16608082015263ffffffff613d6b60646024350161551f565b1660a082015263ffffffff613d8460846024350161551f565b1660c082015263ffffffff613d9d60a46024350161551f565b1660e082015260c4602435013561ffff81168091036132f857610100820152613dca60e460243501615372565b1515610120820152610104602435013561014082015260243561012460243501350191602460048401359301906001600160401b0384116107ab5783360382136107ab57613e4983927f287e005099116032e1bba9482a5b0df09cc99f7e82a4482fa2810c52158d473d956101806101608601526101c085019161541e565b906001600160a01b03613e61610144602435016150b3565b166101808401526101a08301524260208301520390a280f35b613e879193505f906152af565b5f915f613d20565b6040513d5f823e3d90fd5b6024803561012481013501909101013590505f613c53565b90600481015f5260205f205f925b6024356101248101350160040135601f19168410613f4457600693506024356101248101350160040135601f19811610613f16575b5050600160046101246024350135602435010135811b016004820155613c7d565b602480356101248101350191820101355f196004929092013560031b60f8169190911c191690555f80613ef5565b602480356101248101350182010135825560209384019360019092019101613ec0565b63e481c26960e01b5f5260045ffd5b63cd4e616760e01b5f5260045ffd5b6282b42960e81b5f5260045ffd5b33141580613faf575b15613a3a576282b42960e81b5f5260045ffd5b506001600160a01b035f5416331415613f9c565b34612ee3576020366003190112612ee357600435601854811015612ee357613fec6020916150c7565b90549060031b1c604051908152f35b34612ee3576020366003190112612ee3576004355f526019602052612645612aad61402f60405f20604051928380926151e3565b6040519182916020835260208301906152d0565b34612ee3575f366003190112612ee3576126456040516140646040826152af565b600e81527f52656769737472792d342e312e3000000000000000000000000000000000000060208201526040519182916020835260208301906152d0565b34612ee3575f366003190112612ee3576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361410c5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b63703e46dd60e11b5f5260045ffd5b6040366003190112612ee35761412f615087565b6024356001600160401b038111612ee35761414e90369060040161530f565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803014908115614334575b5061410c57614190615602565b6040516352d1902d60e01b81526001600160a01b0383169290602081600481875afa5f9181614300575b506141d25783634c9c8ce360e01b5f5260045260245ffd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8592036142ee5750813b156142dc57806001600160a01b03197f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28151156142c4575f808360206142ba95519101845af43d156142bc573d9161429e836152f4565b926142ac60405194856152af565b83523d5f602085013e615e2f565b005b606091615e2f565b5050346142cd57005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d60201161432c575b8161431c602093836152af565b81010312612ee3575190856141ba565b3d915061430f565b90506001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141583614183565b34612ee3576020366003190112612ee3576004355f52600a602052602060405f2054604051908152f35b34612ee3575f366003190112612ee35760206040515f516020615e8a5f395f51905f528152f35b34612ee3576020366003190112612ee3576004356001600160401b038111612ee3576001600160a01b036020806143f68194369060040161530f565b604051928184925191829101835e8101600e8152030190205416604051908152f35b34612ee3576020366003190112612ee3576004355f526011602052602060ff60405f2054166040519015158152f35b34612ee3576040366003190112612ee35761446061509d565b6004355f52600c6020526001600160a01b0360405f2091165f52602052602060405f2054604051908152f35b34612ee3576020366003190112612ee3576001600160a01b036144ad615087565b165f52601460205260405f2054600190601854805b6144de575b825f526016602052602060405f2054604051908152f35b5f198101818111614525576144f2906150c7565b90549060031b1c82101561450f5761450990615495565b806144c2565b80925060019150018091116145255781806144c7565b634e487b7160e01b5f52601160045260245ffd5b34612ee3576020366003190112612ee3576001600160a01b0361455a615087565b165f526013602052602060405f2054604051908152f35b34612ee3576040366003190112612ee35761458a61509d565b6004355f52600d6020526001600160a01b0360405f2091165f52602052612645612aad61402f60405f20604051928380926151e3565b34612ee35760a0366003190112612ee3576004356024356001600160401b038111612ee3576145f390369060040161517b565b916044356001600160401b038111612ee35761461390369060040161517b565b919093606435916084356001600160401b038111612ee357614639903690600401615108565b614644929192615628565b335f52601760205260ff60405f20541615614ae157858403614ad25760c88411614ac3578015614ab457808301608084820312612ee35783356001600160401b038111612ee3578161469791860161530f565b5060208401356001600160401b038111612ee357816146b791860161530f565b506040840135906001600160401b038211612ee3576146d791850161530f565b505f6060840135805b614a9557506003906001600160a01b036005541680614a33575b5010614a24576006546001600160a01b031615614a1557816149d6575b60405192602084019283525f60408501525f606085015260e060808501526147446101008501868a6153dd565b848103601f190160a0860152878152927f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8811612ee357846147ae60206147f2978d82988d60051b8092858301378c60c08401524660e0840152010301601f1981018352826152af565b5190209160405192848401528383526147c86040846152af565b6001600160a01b03600654169160405195869485938493635c73957b60e11b85526004850161543e565b03915afa908115613e8f575f9161499c575b501561498d575f5b8181106148195760018055005b6001600160a01b0361483461482f838589615464565b615474565b1690815f52601560205260405f205484111561498257815f52601460205260405f20549161486382878a615464565b3592808411156149095760646148798286615488565b116148d6575b507fbb42fde0252fd03324102c3666f457311508c4dd05f96e66e0fd26f0c28e854260406001945b835f52601460205280825f2055835f52601560205287825f20558151908152876020820152a201935b9361480c565b925060648301809311614525577fbb42fde0252fd03324102c3666f457311508c4dd05f96e66e0fd26f0c28e854261487f565b83811161493d575b507fbb42fde0252fd03324102c3666f457311508c4dd05f96e66e0fd26f0c28e854260406001946148a7565b60646149498583615488565b111561491157606319810193508311614525577fbb42fde0252fd03324102c3666f457311508c4dd05f96e66e0fd26f0c28e8542614911565b6001915001936148d0565b63eeee2fe160e01b5f5260045ffd5b90506020813d6020116149ce575b816149b7602093836152af565b81010312612ee3576149c89061537f565b86614804565b3d91506149aa565b815f52601160205260ff60405f205416614a0657815f52601160205260405f20600160ff19825416179055614717565b63cf88c65760e01b5f5260045ffd5b6342ddf9b760e11b5f5260045ffd5b630897acc560e11b5f5260045ffd5b602060049160405192838092630859bc9d60e31b82525afa5f9181614a61575b50156146fa5791508a6146fa565b9091506020813d602011614a8d575b81614a7d602093836152af565b81010312612ee35751908c614a53565b3d9150614a70565b905f19820182811161452557614aae9216918291615a5a565b916146e0565b635599c7cb60e11b5f5260045ffd5b6305beb17160e11b5f5260045ffd5b638b140a8160e01b5f5260045ffd5b635cfb0e7f60e01b5f5260045ffd5b34612ee3575f366003190112612ee35760206040517f3aa2e9509f29532b71f822e18bcde843a8070a508d564188ec8a6adf59eff28a8152f35b34612ee3575f366003190112612ee35760206001600160a01b0360035416604051908152f35b34612ee357614b5e36615135565b9192614b68615628565b805f52600760205260405f209260405192614b8284615264565b8454845260018501549460208501958652600660028201549163ffffffff8316604088015263ffffffff8360201c16606088015263ffffffff8360401c16608088015263ffffffff8360601c1660a088015261ffff8360801c1660c088015260ff60e088019360901c16151583526003810154610100880152604051614c0f81612aad81600486016151e3565b6101208801526001600160a01b036005820154166101408801520154610160860152511580614ebe5750825f52600860205260405f206001600160a01b0387165f5260205260ff60405f205416614e9e57335f9081527f2e2141118778e59f80a0cf148a1d7116c470229e7ee2d444743e9072b52a0c8d602052604090205460ff1615614e8f575f516020615eca5f395f51905f5283148015614e79575b614e0e575b614cbe82828886615648565b948115614e05575b51808210614def575095614ce8604093614d44935f9933928a5192868a615a68565b6001600160a01b038116948351978880948193338a8a7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8780a46003546362c00b1f60e11b84526001600160a01b0316958990600485016153a9565b03925af1928315613e8f576020945f94614daa575b5060407f2c48d754bbf59f20e71c13710fac35aa1ea020da58dcbb366de0ef7f75c9377d91835f52600c8752815f20855f52875285825f20555181519081524287820152a360018055604051908152f35b7f2c48d754bbf59f20e71c13710fac35aa1ea020da58dcbb366de0ef7f75c9377d919450614de6604091823d84116136d7576136c881836152af565b50949150614d59565b906322df051360e11b5f5260045260245260445ffd5b80519150614cc6565b6001600160a01b0386165f9081527f2e2141118778e59f80a0cf148a1d7116c470229e7ee2d444743e9072b52a0c8d602052604090205460ff16614cb2576001600160a01b0386633a401ef360e21b5f525f516020615eaa5f395f51905f526004521660245260445ffd5b505f516020615eea5f395f51905f528314614cad565b631e82e51960e01b5f5260045ffd5b6001600160a01b038684631b753c1b60e21b5f526004521660245260445ffd5b8363159818c760e11b5f526004521560245260445ffd5b34612ee3576040366003190112612ee3577f7e684e0b76ed13bc9cf7e4fbac7d11873036be9c9a83f9958382721eeda460106040600435602435614f17615602565b815f52601660205280835f205582519182526020820152a1005b34612ee3576020366003190112612ee3576001600160a01b03614f52615087565b165f526014602052602060405f2054604051908152f35b34612ee3575f366003190112612ee35760206040515f516020615eca5f395f51905f528152f35b34612ee3576040366003190112612ee357614fa9615087565b6001600160a01b0360243591165f52601260205260405f208054821015612ee357602091613fec916150f3565b34612ee3576020366003190112612ee3576001600160a01b03614ff7615087565b165f52601260205260405f20908154808252602082019081935f5260205f20905f5b818110615071575050508161502f9103826152af565b604051918291602083019060208452518091526040830191905f5b818110615058575050500390f35b825184528594506020938401939092019160010161504a565b8254845260209093019260019283019201615019565b600435906001600160a01b0382168203612ee357565b602435906001600160a01b0382168203612ee357565b35906001600160a01b0382168203612ee357565b6018548110156150df5760185f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b80548210156150df575f5260205f2001905f90565b9181601f84011215612ee3578235916001600160401b038311612ee35760208381860195010111612ee357565b6060600319820112612ee357600435916024356001600160a01b0381168103612ee35791604435906001600160401b038211612ee35761517791600401615108565b9091565b9181601f84011215612ee3578235916001600160401b038311612ee3576020808501948460051b010111612ee357565b90600182811c921680156151d9575b60208310146151c557565b634e487b7160e01b5f52602260045260245ffd5b91607f16916151ba565b5f92918154916151f2836151ab565b8083529260018116908115615247575060011461520e57505050565b5f9081526020812093945091925b83831061522d575060209250010190565b60018160209294939454838587010152019101919061521c565b915050602093945060ff929192191683830152151560051b010190565b61018081019081106001600160401b0382111761528057604052565b634e487b7160e01b5f52604160045260245ffd5b60c081019081106001600160401b0382111761528057604052565b90601f801991011681019081106001600160401b0382111761528057604052565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6001600160401b03811161528057601f01601f191660200190565b81601f82011215612ee357602081359101615329826152f4565b9261533760405194856152af565b82845282820111612ee357815f92602092838601378301015290565b60208091604051928184925191829101835e8101600e81520301902090565b35908115158203612ee357565b51908115158203612ee357565b9190826040910312612ee3576153a660208351930161537f565b90565b6153a693926001600160a01b03606093168252602082015281604082015201906152d0565b90816020910312612ee3575190565b916020908281520191905f5b8181106153f65750505090565b9091926020806001926001600160a01b03615410886150b3565b1681520194019291016153e9565b908060209392818452848401375f828201840152601f01601f1916010190565b916153a693916154569160408552604085019161541e565b9160208184039101526152d0565b91908110156150df5760051b0190565b356001600160a01b0381168103612ee35790565b9190820391821161452557565b8015614525575f190190565b3561ffff81168103612ee35790565b3563ffffffff81168103612ee35790565b919091601f83116154d2575b505050565b8183116154de57505050565b5f5260205f206020601f830160051c9210615517575b81601f9101920160051c03905f5b828110156154cd575f82820155600101615502565b5f91506154f4565b359063ffffffff82168203612ee357565b51906fffffffffffffffffffffffffffffffff82168203612ee357565b929192615559826152f4565b9161556760405193846152af565b829481845281830111612ee3578281602093845f96015e010152565b9080601f83011215612ee35781516153a69260200161554d565b916020936001600160a01b036155c39397969716845260608585015260608401916153dd565b9060408183039101528281520191905f5b8181106155e15750505090565b9091926020806001926155f387615372565b151581520194019291016155d4565b6001600160a01b035f5416330361561557565b63118cdaa760e01b5f523360045260245ffd5b600260015414615639576002600155565b633ee5aeb560e01b5f5260045ffd5b9193909290915f905f516020615eaa5f395f51905f52810361589f575050830192602081850312612ee3578035906001600160401b038211612ee357019160c083850312612ee3576040519261569d84615294565b80356001600160401b038111612ee357856156b991830161530f565b845260208101356001600160401b038111612ee357856156da91830161530f565b946020850195865260408201356001600160401b038111612ee3578161570191840161530f565b604086015260608201356001600160401b038111612ee3578161572591840161530f565b60608601526080820135906001600160401b038211612ee35761574991830161530f565b608085015260a0808501910135815283515115615890576001600160a01b036157728551615353565b54166158905751936157c06040516157b9816157ab86602083016001600160a01b03606092168152604060208201525f60408201520190565b03601f1981018352826152af565b9451615353565b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841617905551805180615857575b50505b6001600160a01b03600454169081615808575050565b813b15612ee3576001600160a01b0360445f928360405195869485936351cb857360e11b8552166004840152600160248401525af18015613e8f5761584b575b50565b5f615855916152af565b565b60209181839260405194859301835e8101600f8152030190206001600160a01b0382166001600160a01b03198254161790555f806157ef565b633494a40d60e21b5f5260045ffd5b5f516020615e8a5f395f51905f5203615a005750830192602081850312612ee3578035906001600160401b038211612ee357019160a083850312612ee3576040519260a084018481106001600160401b0382111761528057604052615903816150b3565b8452615911602082016150b3565b946020850195865260408201356001600160401b038111612ee3578161593891840161530f565b60408601526060820135906001600160401b038211612ee35761595c91830161530f565b6060850152608080850191013581525f516020615eaa5f395f51905f525f52600860205260405f206001600160a01b0380875116165f5260205260ff60405f2054161561589057519351604080516001600160a01b039283166020820152808201919091525f60608201526159d481608081016157ab565b9351165f52601060205260405f206001600160a01b0382166001600160a01b03198254161790556157f2565b939060208114615a41575b5050604051615a3b816157ab85602083016001600160a01b03606092168152604060208201525f60408201520190565b916157f2565b819294509060209181010312612ee35735915f80615a0b565b5f1981146145255760010190565b939592919091845f52600860205260405f206001600160a01b0384165f5260205260405f20600160ff19825416179055845f52600960205260405f206001600160a01b0384165f526020528660405f2055845f52600a60205260405f208054600160401b81101561528057615ae781615b0693600188940181556150f3565b9091906001600160a01b038084549260031b9316831b921b1916179055565b845f52600a60205260405f2054855f52600b60205260405f206001600160a01b0385165f5260205260405f2055845f52600d60205260405f206001600160a01b0384165f5260205260405f20916001600160401b03821161528057615b6f82610b0985546151ab565b5f90601f8311600114615c6b579180615ba7926001600160a01b039695945f926137e45750508160011b915f199060031b1c19161790565b90555b16805f52601360205260405f20615bc18154615a5a565b9055805f52601260205260405f20805494600160401b861015615280576001600160a01b0360a49486615c0061231e8a5f97600160209d0181556150f3565b9055816002541692604051998a988997635f7d2b8760e11b895260048901526024880152604487015260648601521660848401525af18015613e8f57615c435750565b6158489060203d602011615c64575b615c5c81836152af565b8101906153ce565b503d615c52565b601f19831691845f5260205f20925f5b818110615cc157509160019391856001600160a01b039897969410615ca8575b505050811b019055615baa565b01355f19600384901b60f8161c191690555f8080615c9b565b91936020600181928787013581550195019201615c7b565b6001600160a01b03805f549216918282198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b805f52600b60205260405f206001600160a01b0383165f5260205260405f205480156154cd57815f52600a60205260405f20905f1981018181116145255782545f19810190811161452557808203615dcc575b50505080548015615db8575f190190615d8282826150f3565b6001600160a01b0382549160031b1b19169055555f52600b6020526001600160a01b0360405f2091165f526020525f6040812055565b634e487b7160e01b5f52603160045260245ffd5b615ae7916001600160a01b03615de5615df693876150f3565b90549060031b1c16928391866150f3565b835f52600b6020526001600160a01b0360405f2091165f5260205260405f20555f8080615d69565b9060078110156150df5760051b0190565b90615e535750805115615e4457805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580615e80575b615e64575090565b6001600160a01b0390639996b31560e01b5f521660045260245ffd5b50803b15615e5c56fe0c34ecc75d3bf122e0609d2576e167f53fb42429262ce8c9b33cab91ff670e3ae94d78b6d8fb99b2c21131eb4552924a60f564d8515a3cc90ef300fc9735c0742024516755f401845808190bb830b0e4523d0df0845503cab52130a794699a0ff86d13979a91272f2c54c4147e588ecbeaad32dd1e0a5332a77356847049a70ea26469706673582212201cd6e4658ce5c58aca2e25263be202374f8bc4b395480f29687377d09b6a181a64736f6c63430008210033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00" + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "GTOKEN_STAKING", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract IGTokenStaking" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MYSBT", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract IMySBT" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ROLE_ANODE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ROLE_COMMUNITY", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ROLE_DVT", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ROLE_ENDUSER", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ROLE_KMS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ROLE_PAYMASTER_AOA", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ROLE_PAYMASTER_SUPER", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SUPER_PAYMASTER", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "batchUpdateGlobalReputation", + "inputs": [ + { + "name": "proposalId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "users", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "newScores", + "type": "uint256[]", + "internalType": "uint256[]" + }, + { + "name": "epoch", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "proof", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "blsAggregator", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "blsValidator", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract IBLSValidator" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "communityByENS", + "inputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "communityByName", + "inputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "configureRole", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "config", + "type": "tuple", + "internalType": "struct IRegistry.RoleConfig", + "components": [ + { + "name": "minStake", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ticketPrice", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "slashThreshold", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashBase", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashInc", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashMax", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "exitFeePercent", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "minExitFee", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "roleLockDuration", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "creditTierConfig", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "exitRole", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getCreditLimit", + "inputs": [ + { + "name": "user", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleConfig", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRegistry.RoleConfig", + "components": [ + { + "name": "minStake", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ticketPrice", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "slashThreshold", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashBase", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashInc", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashMax", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "exitFeePercent", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "minExitFee", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "roleLockDuration", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleMembers", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleUserCount", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getUserRoles", + "inputs": [ + { + "name": "user", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "globalReputation", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "hasRole", + "inputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_owner", + "type": "address", + "internalType": "address" + }, + { + "name": "_gtokenStaking", + "type": "address", + "internalType": "address" + }, + { + "name": "_mysbt", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isReputationSource", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "lastReputationEpoch", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "levelThresholds", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "registerRole", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "roleData", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "roleConfigs", + "inputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "minStake", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ticketPrice", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "slashThreshold", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashBase", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashInc", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashMax", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "exitFeePercent", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "minExitFee", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "roleLockDuration", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "roleMemberIndex", + "inputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "roleMembers", + "inputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "roleMetadata", + "inputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "roleSBTTokenIds", + "inputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "roleStakes", + "inputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "safeMintForRole", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setBLSAggregator", + "inputs": [ + { + "name": "_aggregator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setBLSValidator", + "inputs": [ + { + "name": "_validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setCreditTier", + "inputs": [ + { + "name": "level", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setLevelThresholds", + "inputs": [ + { + "name": "thresholds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMySBT", + "inputs": [ + { + "name": "_mysbt", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setReputationSource", + "inputs": [ + { + "name": "source", + "type": "address", + "internalType": "address" + }, + { + "name": "active", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStaking", + "inputs": [ + { + "name": "_staking", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setSuperPaymaster", + "inputs": [ + { + "name": "_sp", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "syncExitFees", + "inputs": [ + { + "name": "roles", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateOperatorBlacklist", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "users", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "statuses", + "type": "bool[]", + "internalType": "bool[]" + }, + { + "name": "proof", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "userRoleCount", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "userRoles", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "pure" + }, + { + "type": "event", + "name": "BLSAggregatorUpdated", + "inputs": [ + { + "name": "oldAgg", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newAgg", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BLSValidatorUpdated", + "inputs": [ + { + "name": "oldVal", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newVal", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BurnExecuted", + "inputs": [ + { + "name": "user", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "reason", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "CreditTierUpdated", + "inputs": [ + { + "name": "level", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "creditLimit", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ExitFeeSyncFailed", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "GlobalReputationUpdated", + "inputs": [ + { + "name": "user", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newScore", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "epoch", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MySBTContractUpdated", + "inputs": [ + { + "name": "oldMySBT", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newMySBT", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ReputationSourceUpdated", + "inputs": [ + { + "name": "source", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "isActive", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleConfigured", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "config", + "type": "tuple", + "indexed": false, + "internalType": "struct IRegistry.RoleConfig", + "components": [ + { + "name": "minStake", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ticketPrice", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "slashThreshold", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashBase", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashInc", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "slashMax", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "exitFeePercent", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "minExitFee", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "roleLockDuration", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleExited", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "exitFee", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleGranted", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRegistered", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "burnAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRevoked", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StakingContractUpdated", + "inputs": [ + { + "name": "oldStaking", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newStaking", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SuperPaymasterUpdated", + "inputs": [ + { + "name": "oldSP", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newSP", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "BLSFailed", + "inputs": [] + }, + { + "type": "error", + "name": "BLSNotConfigured", + "inputs": [] + }, + { + "type": "error", + "name": "BLSProofRequired", + "inputs": [] + }, + { + "type": "error", + "name": "BatchTooLarge", + "inputs": [] + }, + { + "type": "error", + "name": "CallerNotCommunity", + "inputs": [] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "FeeTooHigh", + "inputs": [] + }, + { + "type": "error", + "name": "InsufficientConsensus", + "inputs": [] + }, + { + "type": "error", + "name": "InsufficientStake", + "inputs": [ + { + "name": "provided", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "required", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidAddr", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidParam", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidProposalId", + "inputs": [] + }, + { + "type": "error", + "name": "LenMismatch", + "inputs": [] + }, + { + "type": "error", + "name": "LockNotMet", + "inputs": [] + }, + { + "type": "error", + "name": "NoStakeToExit", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ReentrancyGuardReentrantCall", + "inputs": [] + }, + { + "type": "error", + "name": "RoleAlreadyGranted", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "RoleNotConfigured", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ] + }, + { + "type": "error", + "name": "RoleNotGranted", + "inputs": [ + { + "name": "roleId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "SPNotSet", + "inputs": [] + }, + { + "type": "error", + "name": "ThreshNotAscending", + "inputs": [] + }, + { + "type": "error", + "name": "TooManyLevels", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "Unauthorized", + "inputs": [] + }, + { + "type": "error", + "name": "UnauthorizedSource", + "inputs": [] + } + ] } diff --git a/packages/core/src/actions/registry.ts b/packages/core/src/actions/registry.ts index c71d463a..4d1c4dc2 100644 --- a/packages/core/src/actions/registry.ts +++ b/packages/core/src/actions/registry.ts @@ -5,7 +5,7 @@ import { AAStarError } from '../errors/index.js'; export type RoleConfigDetailed = { minStake: bigint; - entryBurn: bigint; + ticketPrice: bigint; slashThreshold: number; slashBase: number; slashInc: number; @@ -21,7 +21,7 @@ export type RoleConfigDetailed = { export type RegistryActions = { // Role Management configureRole: (args: { roleId: Hex, config: RoleConfigDetailed, account?: Account | Address }) => Promise; - adminConfigureRole: (args: { roleId: Hex, minStake: bigint, entryBurn: bigint, exitFeePercent: bigint, minExitFee: bigint, account?: Account | Address }) => Promise; + syncExitFees: (args: { roles: Hex[], account?: Account | Address }) => Promise; createNewRole: (args: { roleId: Hex, config: RoleConfigDetailed, roleOwner: Address, account?: Account | Address }) => Promise; registerRole: (args: { roleId: Hex, user: Address, data: Hex, account?: Account | Address }) => Promise; registerRoleSelf: (args: { roleId: Hex, data: Hex, account?: Account | Address }) => Promise; @@ -71,10 +71,7 @@ export type RegistryActions = { creditTierConfig: (args: { tierIndex: bigint }) => Promise; levelThresholds: (args: { levelIndex: bigint }) => Promise; calculateExitFee: (args: { roleId: Hex, amount: bigint }) => Promise; - accountToUser: (args: { account: Address }) => Promise
; - roleOwners: (args: { roleId: Hex }) => Promise
; roleStakes: (args: { roleId: Hex, user: Address }) => Promise; - roleLockDurations: (args: { roleId: Hex }) => Promise; // Constants (Role IDs) ROLE_COMMUNITY: () => Promise; @@ -117,22 +114,6 @@ export const registryActions = (address: Address) => (client: PublicClient | Wal } }, - async adminConfigureRole({ roleId, minStake, entryBurn, exitFeePercent, minExitFee, account }) { - try { - validateRequired(roleId, 'roleId'); - return await (client as any).writeContract({ - address, - abi: RegistryABI, - functionName: 'adminConfigureRole', - args: [roleId, minStake, entryBurn, exitFeePercent, minExitFee], - account: account as any, - chain: (client as any).chain - }); - } catch (error) { - throw AAStarError.fromViemError(error as Error, 'adminConfigureRole'); - } - }, - async createNewRole({ roleId, config, roleOwner, account }) { try { validateRequired(roleId, 'roleId'); @@ -229,7 +210,7 @@ export const registryActions = (address: Address) => (client: PublicClient | Wal if (Array.isArray(result)) { return { minStake: result[0], - entryBurn: result[1], + ticketPrice: result[1], slashThreshold: result[2], slashBase: result[3], slashInc: result[4], @@ -298,6 +279,23 @@ export const registryActions = (address: Address) => (client: PublicClient | Wal } }, + async syncExitFees({ roles, account }) { + validateRequired(roles, 'roles'); + if (roles.length === 0) throw new Error('syncExitFees: roles array must not be empty'); + try { + return await (client as any).writeContract({ + address, + abi: RegistryABI, + functionName: 'syncExitFees', + args: [roles], + account: account as any, + chain: (client as any).chain + }); + } catch (error) { + throw AAStarError.fromViemError(error as Error, 'syncExitFees'); + } + }, + async roleMetadata({ roleId, user }) { try { validateRequired(roleId, 'roleId'); @@ -624,7 +622,7 @@ export const registryActions = (address: Address) => (client: PublicClient | Wal if (Array.isArray(result)) { return { minStake: result[0], - entryBurn: result[1], + ticketPrice: result[1], slashThreshold: result[2], slashBase: result[3], slashInc: result[4], @@ -772,34 +770,6 @@ export const registryActions = (address: Address) => (client: PublicClient | Wal } }, - async accountToUser({ account }) { - try { - validateAddress(account, 'account'); - return await (client as PublicClient).readContract({ - address, - abi: RegistryABI, - functionName: 'accountToUser', - args: [account] - }) as Promise
; - } catch (error) { - throw AAStarError.fromViemError(error as Error, 'accountToUser'); - } - }, - - async roleOwners({ roleId }) { - try { - validateRequired(roleId, 'roleId'); - return await (client as PublicClient).readContract({ - address, - abi: RegistryABI, - functionName: 'roleOwners', - args: [roleId] - }) as Promise
; - } catch (error) { - throw AAStarError.fromViemError(error as Error, 'roleOwners'); - } - }, - async roleStakes({ roleId, user }) { try { validateRequired(roleId, 'roleId'); @@ -815,20 +785,6 @@ export const registryActions = (address: Address) => (client: PublicClient | Wal } }, - async roleLockDurations({ roleId }) { - try { - validateRequired(roleId, 'roleId'); - return await (client as PublicClient).readContract({ - address, - abi: RegistryABI, - functionName: 'roleLockDurations', - args: [roleId] - }) as Promise; - } catch (error) { - throw AAStarError.fromViemError(error as Error, 'roleLockDurations'); - } - }, - // Constants (Role IDs) async ROLE_COMMUNITY() { try { diff --git a/packages/core/src/actions/staking.ts b/packages/core/src/actions/staking.ts index ac62d153..a15e1c82 100644 --- a/packages/core/src/actions/staking.ts +++ b/packages/core/src/actions/staking.ts @@ -5,7 +5,7 @@ import { AAStarError } from '../errors/index.js'; export type StakingActions = { // Staking Operations - lockStake: (args: { user: Address, roleId: Hex, stakeAmount: bigint, entryBurn: bigint, payer: Address, account?: Account | Address }) => Promise; + lockStake: (args: { user: Address, roleId: Hex, stakeAmount: bigint, ticketPrice: bigint, payer: Address, account?: Account | Address }) => Promise; topUpStake: (args: { user: Address, roleId: Hex, stakeAmount: bigint, payer: Address, account?: Account | Address }) => Promise; unlockStake: (args: { user: Address, roleId: Hex, account?: Account | Address }) => Promise; unlockAndTransfer: (args: { user: Address, roleId: Hex, account?: Account | Address }) => Promise; @@ -80,17 +80,17 @@ export const stakingActions = (address: Address) => (client: PublicClient | Wall * @internal * @warning This is a low-level internal API. Use high-level clients instead. */ - async lockStake({ user, roleId, stakeAmount, entryBurn, payer, account }) { + async lockStake({ user, roleId, stakeAmount, ticketPrice, payer, account }) { try { validateAddress(user, 'user'); validateAddress(payer, 'payer'); validateAmount(stakeAmount, 'stakeAmount'); - validateAmount(entryBurn, 'entryBurn'); + validateAmount(ticketPrice, 'ticketPrice'); return await (client as any).writeContract({ address, abi: GTokenStakingABI, functionName: 'lockStake', - args: [user, roleId, stakeAmount, entryBurn, payer], + args: [user, roleId, stakeAmount, ticketPrice, payer], account: account as any, chain: (client as any).chain }); diff --git a/packages/core/src/roles.ts b/packages/core/src/roles.ts index 1a034180..69440fcc 100644 --- a/packages/core/src/roles.ts +++ b/packages/core/src/roles.ts @@ -19,7 +19,7 @@ export const DEFAULT_ADMIN_ROLE: Hash = '0x0000000000000000000000000000000000000 * Community Role * @description Community administrator, can issue xPNTs, configure SBT rules * @permission Community-level governance - * @requirement minStake: 30 GT, entryBurn: 3 GT (line 99) + * @requirement minStake: 30 GT, ticketPrice: 3 GT (line 99) * @exitFee 5% (500 basis points), min 1 GT * @lockDuration 30 days * @source Registry.sol line 32: ROLE_COMMUNITY = keccak256("COMMUNITY") @@ -30,7 +30,7 @@ export const ROLE_COMMUNITY: Hash = keccak256(toHex('COMMUNITY')); * End User Role * @description Community member, can participate and use gasless transactions * @permission Basic user level - * @requirement minStake: 0.3 GT, entryBurn: 0.05 GT (line 100) + * @requirement minStake: 0.3 GT, ticketPrice: 0.05 GT (line 100) * @additionalRequirement Must hold MySBT from community * @exitFee 10% (1000 basis points), min 0.05 GT * @lockDuration 7 days @@ -42,7 +42,7 @@ export const ROLE_ENDUSER: Hash = keccak256(toHex('ENDUSER')); * Paymaster AOA Role (Account Ownership Authentication) * @description Basic Paymaster node operator with account-based auth * @permission Infrastructure operator - * @requirement minStake: 30 GT, entryBurn: 3 GT (line 92) + * @requirement minStake: 30 GT, ticketPrice: 3 GT (line 92) * @exitFee 10% (1000 basis points), min 1 GT * @lockDuration 30 days * @source Registry.sol line 34: ROLE_PAYMASTER_AOA = keccak256("PAYMASTER_AOA") @@ -53,7 +53,7 @@ export const ROLE_PAYMASTER_AOA: Hash = keccak256(toHex('PAYMASTER_AOA')); * Paymaster Super Role * @description Advanced Paymaster operator, can use SuperPaymaster with aPNTs collateral * @permission Infrastructure operator (higher tier) - * @requirement minStake: 50 GT, entryBurn: 5 GT (line 93) + * @requirement minStake: 50 GT, ticketPrice: 5 GT (line 93) * @additionalRequirement aPNTs collateral in SuperPaymaster contract * @exitFee 10% (1000 basis points), min 2 GT * @lockDuration 30 days @@ -65,7 +65,7 @@ export const ROLE_PAYMASTER_SUPER: Hash = keccak256(toHex('PAYMASTER_SUPER')); * DVT Role (Distributed Validator Technology) * @description DVT node operator for consensus validation * @permission Infrastructure operator - * @requirement minStake: 30 GT, entryBurn: 3 GT (line 94) + * @requirement minStake: 30 GT, ticketPrice: 3 GT (line 94) * @exitFee 10% (1000 basis points), min 1 GT * @lockDuration 30 days * @source Registry.sol line 36: ROLE_DVT = keccak256("DVT") @@ -76,7 +76,7 @@ export const ROLE_DVT: Hash = keccak256(toHex('DVT')); * ANODE Role (Anonymous Node) * @description Anonymous infrastructure node operator * @permission Infrastructure operator - * @requirement minStake: 20 GT, entryBurn: 2 GT (line 95) + * @requirement minStake: 20 GT, ticketPrice: 2 GT (line 95) * @exitFee 10% (1000 basis points), min 1 GT * @lockDuration 30 days * @source Registry.sol line 37: ROLE_ANODE = keccak256("ANODE") @@ -87,7 +87,7 @@ export const ROLE_ANODE: Hash = keccak256(toHex('ANODE')); * KMS Role (Key Management Service) * @description KMS operator for secure key storage and management * @permission Infrastructure operator (highest stake) - * @requirement minStake: 100 GT, entryBurn: 10 GT (line 98) + * @requirement minStake: 100 GT, ticketPrice: 10 GT (line 98) * @exitFee 10% (1000 basis points), min 5 GT * @lockDuration 30 days * @source Registry.sol line 38: ROLE_KMS = keccak256("KMS") @@ -101,7 +101,7 @@ export const ROLE_KMS: Hash = keccak256(toHex('KMS')); */ export interface RoleConfig { minStake: bigint; // Minimum GToken stake required - entryBurn: bigint; // Amount burned on entry + ticketPrice: bigint; // Ticket price for role entry slashThreshold: number; // Slash threshold (0-100) slashBase: number; // Base slash percentage slashIncrement: number; // Increment per offense @@ -172,7 +172,7 @@ export const ROLE_PERMISSION_LEVELS: Record = { export const INITIAL_ROLE_STAKES = { [ROLE_PAYMASTER_AOA]: { minStake: '30 GT', - entryBurn: '3 GT', + ticketPrice: '3 GT', exitFeePercent: '10%', minExitFee: '1 GT', lockDuration: '30 days', @@ -180,7 +180,7 @@ export const INITIAL_ROLE_STAKES = { }, [ROLE_PAYMASTER_SUPER]: { minStake: '50 GT', - entryBurn: '5 GT', + ticketPrice: '5 GT', exitFeePercent: '10%', minExitFee: '2 GT', lockDuration: '30 days', @@ -189,7 +189,7 @@ export const INITIAL_ROLE_STAKES = { }, [ROLE_DVT]: { minStake: '30 GT', - entryBurn: '3 GT', + ticketPrice: '3 GT', exitFeePercent: '10%', minExitFee: '1 GT', lockDuration: '30 days', @@ -197,7 +197,7 @@ export const INITIAL_ROLE_STAKES = { }, [ROLE_ANODE]: { minStake: '20 GT', - entryBurn: '2 GT', + ticketPrice: '2 GT', exitFeePercent: '10%', minExitFee: '1 GT', lockDuration: '30 days', @@ -205,7 +205,7 @@ export const INITIAL_ROLE_STAKES = { }, [ROLE_KMS]: { minStake: '100 GT', - entryBurn: '10 GT', + ticketPrice: '10 GT', exitFeePercent: '10%', minExitFee: '5 GT', lockDuration: '30 days', @@ -213,7 +213,7 @@ export const INITIAL_ROLE_STAKES = { }, [ROLE_COMMUNITY]: { minStake: '30 GT', - entryBurn: '3 GT', + ticketPrice: '3 GT', exitFeePercent: '5%', minExitFee: '1 GT', lockDuration: '30 days', @@ -221,7 +221,7 @@ export const INITIAL_ROLE_STAKES = { }, [ROLE_ENDUSER]: { minStake: '0.3 GT', - entryBurn: '0.05 GT', + ticketPrice: '0.05 GT', exitFeePercent: '10%', minExitFee: '0.05 GT', lockDuration: '7 days',