Subscription Pool
Constructor
constructor(_pool, _soulboundToken, _incentivesController) Sets the Aave
IPool
, theISoulboundToken
contract, and the incentives controller addresses.
Function
ADMIN_ROLE() → bytes32 (view) Returns the identifier for the admin role.
DEFAULT_ADMIN_ROLE() → bytes32 (view) Returns the identifier for the default admin role (manages other roles).
OPERATOR_ROLE() → bytes32 (view) Returns the identifier for the operator role.
batchSyncUserBalance(ops: {asset, accounts[]}[]) (nonpayable) Bulk syncs user balances for multiple assets and account lists. Likely emits
BatchBalanceSynced
and/orBalanceSynced
per item.createVirtualRewardTrackingToken(asset) → address (nonpayable) Deploys or initializes an
IVirtualRewardTrackingToken
for a specific asset and returns its address. EmitsVirtualRewardTrackingTokenCreated
on success.getRoleAdmin(role) → bytes32 (view) Returns the admin role that controls
role
.grantAdmin(newAdmin) (nonpayable) Convenience method to grant admin privileges to
newAdmin
(internally equivalent tograntRole(DEFAULT_ADMIN_ROLE, newAdmin)
).grantOperator(newOperator) (nonpayable) Convenience method to grant operator privileges to
newOperator
(likegrantRole(OPERATOR_ROLE, newOperator)
).grantRole(role, account) (nonpayable) Grants
role
toaccount
. EmitsRoleGranted
. Access-controlled by the role’s admin.hasRole(role, account) → bool (view) Checks whether
account
holdsrole
.incentivesController() → address (view) Returns the
IAaveIncentivesController
address currently configured.isAdmin(admin) → bool (view) True if
admin
has administrative privileges.isOperator(guardian) → bool (view) True if
guardian
has operator privileges.isSubscriptionAllowed(asset) → bool (view) Returns whether actions (e.g., supplying/trackers) are currently allowed for
asset
.overrideUserBalance(asset, account, newBalance) (nonpayable) Force-sets a user’s tracked balance for an
asset
. Intended for admin/operator maintenance; emitsBalanceOverridden
.pool() → address (view) Returns the
IPool
(Aave pool) address used by this contract.renounceRole(role, callerConfirmation) (nonpayable) Caller gives up
role
, with an extracallerConfirmation
address parameter (safety confirmation). EmitsRoleRevoked
.revokeRole(role, account) (nonpayable) Revokes
role
fromaccount
. EmitsRoleRevoked
. Only callable by the role’s admin.setIncentivesController(controller) (nonpayable) Updates the incentives controller address. Emits
IncentivesControllerUpdated
.setSoulboundToken(newToken) (nonpayable) Updates the
ISoulboundToken
contract reference. EmitsSoulboundTokenUpdated
.setSubscriptionAllowed(asset, allowed) (nonpayable) Toggles whether
asset
is allowed for subscription/supply tracking. EmitsSubscriptionAllowedUpdated
.setTrackingTokenImpl(_trackingTokenImpl) (nonpayable) Sets the implementation address used when creating virtual reward tracking tokens.
soulboundToken() → address (view) Returns the current
ISoulboundToken
address.supply(asset, amount, onBehalfOf, referralCode) (nonpayable) Supplies
amount
ofasset
into the underlying pool (likely Aave), creditingonBehalfOf
. May integrate with incentives and tracking; emitsSupply
.supportsInterface(interfaceId) → bool (view) ERC-165 support check for interface detection.
syncUserBalance(asset, account) (nonpayable) Syncs/refreshes a single user’s tracked balance for an
asset
to match the underlying state. EmitsBalanceSynced
.trackingTokenImpl() → address (view) Returns the current tracking-token implementation address used for clones/deployments.
virtualRewardTrackingTokens(asset) → address (view) Returns the tracking token address associated with
asset
(if created).
[
{
"inputs": [
{ "name": "_pool", "internalType": "address", "type": "address" },
{ "name": "_soulboundToken", "internalType": "address", "type": "address" },
{ "name": "_incentivesController", "internalType": "address", "type": "address" }
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{ "inputs": [], "name": "AccessControlBadConfirmation", "type": "error" },
{
"inputs": [
{ "name": "account", "internalType": "address", "type": "address" },
{ "name": "neededRole", "internalType": "bytes32", "type": "bytes32" }
],
"name": "AccessControlUnauthorizedAccount",
"type": "error"
},
{ "inputs": [], "name": "FailedDeployment", "type": "error" },
{
"inputs": [
{ "name": "balance", "internalType": "uint256", "type": "uint256" },
{ "name": "needed", "internalType": "uint256", "type": "uint256" }
],
"name": "InsufficientBalance",
"type": "error"
},
{ "inputs": [], "name": "InvalidATokenAddress", "type": "error" },
{ "inputs": [], "name": "InvalidAdminAddress", "type": "error" },
{ "inputs": [], "name": "InvalidOperatorAddress", "type": "error" },
{
"inputs": [{ "name": "token", "internalType": "address", "type": "address" }],
"name": "SafeERC20FailedOperation",
"type": "error"
},
{
"inputs": [
{ "name": "createdTrackingTokenAddr", "internalType": "address", "type": "address" }
],
"name": "TrackingTokenAlreadyCreated",
"type": "error"
},
{
"inputs": [
{ "name": "subscriptionPool", "internalType": "address", "type": "address" },
{ "name": "tokenPool", "internalType": "address", "type": "address" }
],
"name": "TrackingTokenPoolMismatched",
"type": "error"
},
{
"inputs": [
{ "indexed": true, "name": "asset", "internalType": "address", "type": "address" },
{ "indexed": true, "name": "account", "internalType": "address", "type": "address" },
{ "indexed": false, "name": "balance", "internalType": "uint256", "type": "uint256" }
],
"name": "BalanceOverridden",
"anonymous": false,
"type": "event"
},
{
"inputs": [
{ "indexed": true, "name": "asset", "internalType": "address", "type": "address" },
{ "indexed": true, "name": "account", "internalType": "address", "type": "address" },
{ "indexed": false, "name": "balance", "internalType": "uint256", "type": "uint256" }
],
"name": "BalanceSynced",
"anonymous": false,
"type": "event"
},
{
"inputs": [
{ "indexed": true, "name": "asset", "internalType": "address", "type": "address" },
{ "indexed": false, "name": "accounts", "internalType": "address[]", "type": "address[]" },
{ "indexed": false, "name": "balances", "internalType": "uint256[]", "type": "uint256[]" }
],
"name": "BatchBalanceSynced",
"anonymous": false,
"type": "event"
},
{
"inputs": [
{ "indexed": true, "name": "oldController", "internalType": "address", "type": "address" },
{ "indexed": true, "name": "newController", "internalType": "address", "type": "address" }
],
"name": "IncentivesControllerUpdated",
"anonymous": false,
"type": "event"
},
{
"inputs": [
{ "indexed": true, "name": "oldPool", "internalType": "address", "type": "address" },
{ "indexed": true, "name": "newPool", "internalType": "address", "type": "address" }
],
"name": "PoolUpdated",
"anonymous": false,
"type": "event"
},
{
"inputs": [
{ "indexed": true, "name": "role", "internalType": "bytes32", "type": "bytes32" },
{ "indexed": true, "name": "previousAdminRole", "internalType": "bytes32", "type": "bytes32" },
{ "indexed": true, "name": "newAdminRole", "internalType": "bytes32", "type": "bytes32" }
],
"name": "RoleAdminChanged",
"anonymous": false,
"type": "event"
},
{
"inputs": [
{ "indexed": true, "name": "role", "internalType": "bytes32", "type": "bytes32" },
{ "indexed": true, "name": "account", "internalType": "address", "type": "address" },
{ "indexed": true, "name": "sender", "internalType": "address", "type": "address" }
],
"name": "RoleGranted",
"anonymous": false,
"type": "event"
},
{
"inputs": [
{ "indexed": true, "name": "role", "internalType": "bytes32", "type": "bytes32" },
{ "indexed": true, "name": "account", "internalType": "address", "type": "address" },
{ "indexed": true, "name": "sender", "internalType": "address", "type": "address" }
],
"name": "RoleRevoked",
"anonymous": false,
"type": "event"
},
{
"inputs": [
{ "indexed": true, "name": "oldToken", "internalType": "address", "type": "address" },
{ "indexed": true, "name": "newToken", "internalType": "address", "type": "address" }
],
"name": "SoulboundTokenUpdated",
"anonymous": false,
"type": "event"
},
{
"inputs": [
{ "indexed": true, "name": "asset", "internalType": "address", "type": "address" },
{ "indexed": false, "name": "oldAllowed", "internalType": "bool", "type": "bool" },
{ "indexed": false, "name": "newAllowed", "internalType": "bool", "type": "bool" }
],
"name": "SubscriptionAllowedUpdated",
"anonymous": false,
"type": "event"
},
{
"inputs": [
{ "indexed": true, "name": "user", "internalType": "address", "type": "address" },
{ "indexed": true, "name": "asset", "internalType": "address", "type": "address" },
{ "indexed": false, "name": "amount", "internalType": "uint256", "type": "uint256" }
],
"name": "Supply",
"anonymous": false,
"type": "event"
},
{
"inputs": [{ "indexed": true, "name": "token", "internalType": "address", "type": "address" }],
"name": "VirtualRewardTrackingTokenCreated",
"anonymous": false,
"type": "event"
},
{
"inputs": [
{ "indexed": true, "name": "user", "internalType": "address", "type": "address" },
{ "indexed": true, "name": "asset", "internalType": "address", "type": "address" },
{ "indexed": false, "name": "amount", "internalType": "uint256", "type": "uint256" }
],
"name": "Withdraw",
"anonymous": false,
"type": "event"
},
{ "outputs": [{ "name": "", "internalType": "bytes32", "type": "bytes32" }], "inputs": [], "name": "ADMIN_ROLE", "stateMutability": "view", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "bytes32", "type": "bytes32" }], "inputs": [], "name": "DEFAULT_ADMIN_ROLE", "stateMutability": "view", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "bytes32", "type": "bytes32" }], "inputs": [], "name": "OPERATOR_ROLE", "stateMutability": "view", "type": "function" },
{
"outputs": [],
"inputs": [
{
"components": [
{ "name": "asset", "internalType": "address", "type": "address" },
{ "name": "accounts", "internalType": "address[]", "type": "address[]" }
],
"name": "ops",
"internalType": "struct ISubscriptionPool.SyncBalanceOperation[]",
"type": "tuple[]"
}
],
"name": "batchSyncUserBalance",
"stateMutability": "nonpayable",
"type": "function"
},
{ "outputs": [{ "name": "", "internalType": "contract IVirtualRewardTrackingToken", "type": "address" }], "inputs": [{ "name": "asset", "internalType": "address", "type": "address" }], "name": "createVirtualRewardTrackingToken", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "bytes32", "type": "bytes32" }], "inputs": [{ "name": "role", "internalType": "bytes32", "type": "bytes32" }], "name": "getRoleAdmin", "stateMutability": "view", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "newAdmin", "internalType": "address", "type": "address" }], "name": "grantAdmin", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "newOperator", "internalType": "address", "type": "address" }], "name": "grantOperator", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "role", "internalType": "bytes32", "type": "bytes32" }, { "name": "account", "internalType": "address", "type": "address" }], "name": "grantRole", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "bool", "type": "bool" }], "inputs": [{ "name": "role", "internalType": "bytes32", "type": "bytes32" }, { "name": "account", "internalType": "address", "type": "address" }], "name": "hasRole", "stateMutability": "view", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "contract IAaveIncentivesController", "type": "address" }], "inputs": [], "name": "incentivesController", "stateMutability": "view", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "bool", "type": "bool" }], "inputs": [{ "name": "admin", "internalType": "address", "type": "address" }], "name": "isAdmin", "stateMutability": "view", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "bool", "type": "bool" }], "inputs": [{ "name": "guardian", "internalType": "address", "type": "address" }], "name": "isOperator", "stateMutability": "view", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "bool", "type": "bool" }], "inputs": [{ "name": "asset", "internalType": "address", "type": "address" }], "name": "isSubscriptionAllowed", "stateMutability": "view", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "asset", "internalType": "address", "type": "address" }, { "name": "account", "internalType": "address", "type": "address" }, { "name": "newBalance", "internalType": "uint256", "type": "uint256" }], "name": "overrideUserBalance", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "contract IPool", "type": "address" }], "inputs": [], "name": "pool", "stateMutability": "view", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "role", "internalType": "bytes32", "type": "bytes32" }, { "name": "callerConfirmation", "internalType": "address", "type": "address" }], "name": "renounceRole", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "role", "internalType": "bytes32", "type": "bytes32" }, { "name": "account", "internalType": "address", "type": "address" }], "name": "revokeRole", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "controller", "internalType": "address", "type": "address" }], "name": "setIncentivesController", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "newToken", "internalType": "address", "type": "address" }], "name": "setSoulboundToken", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "asset", "internalType": "address", "type": "address" }, { "name": "allowed", "internalType": "bool", "type": "bool" }], "name": "setSubscriptionAllowed", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "_trackingTokenImpl", "internalType": "address", "type": "address" }], "name": "setTrackingTokenImpl", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "contract ISoulboundToken", "type": "address" }], "inputs": [], "name": "soulboundToken", "stateMutability": "view", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "asset", "internalType": "address", "type": "address" }, { "name": "amount", "internalType": "uint256", "type": "uint256" }, { "name": "onBehalfOf", "internalType": "address", "type": "address" }, { "name": "referralCode", "internalType": "uint16", "type": "uint16" }], "name": "supply", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "bool", "type": "bool" }], "inputs": [{ "name": "interfaceId", "internalType": "bytes4", "type": "bytes4" }], "name": "supportsInterface", "stateMutability": "view", "type": "function" },
{ "outputs": [], "inputs": [{ "name": "asset", "internalType": "address", "type": "address" }, { "name": "account", "internalType": "address", "type": "address" }], "name": "syncUserBalance", "stateMutability": "nonpayable", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "address", "type": "address" }], "inputs": [], "name": "trackingTokenImpl", "stateMutability": "view", "type": "function" },
{ "outputs": [{ "name": "", "internalType": "address", "type": "address" }], "inputs": [{ "name": "asset", "internalType": "address", "type": "address" }], "name": "virtualRewardTrackingTokens", "stateMutability": "view", "type": "function" }
]
Last updated
Was this helpful?