Deployment
Get Role Audit
The role assignments of a market’s deployment, today’s role holders and every later change, verified live
GET
/
seller-financing
/
api
/
markets
/
{marketId}
/
role-audit
curl "https://api.trusset.org/seller-financing/api/markets/cmsg4x7k20003sf9q1d8v6b2e/role-audit" \
-H "X-API-Key: trusset_your_key_here"
const res = await fetch(
`https://api.trusset.org/seller-financing/api/markets/${marketId}/role-audit`,
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { data } = await res.json();
const trussetFree = data.liveVerification.noRoleFor.every(
(r: { holdsAdmin: boolean | null; holdsOperator: boolean | null }) => r.holdsAdmin === false && r.holdsOperator === false
);
const operators = (data.liveVerification.currentHolders ?? [])
.filter((h: { role: string; holdsNow: boolean | null }) => h.role === 'OPERATOR_ROLE' && h.holdsNow === true)
.map((h: { account: string }) => h.account);
if (!data.liveVerification.history.complete) console.log('Role history read in part; call again');
{
"success": true,
"data": {
"docRef": "SF-739AD00ECE63",
"title": "Seller Financing market deployment: role assignments",
"chainId": 11155111,
"market": "0xc35e5f74eC4C1dfB8cE2b8798D6161B706F9B5E1",
"adapter": "0x037B9e26D8B98aa1B1FCC321ba45A87Fc786C7Fc",
"factory": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"assetToken": "0x305382e98F8e6ee24c32dF3567342E1F1DECb9b6",
"paymentToken": "0x98aD0ca091552e23C564B41C74282e5343D03E8a",
"mode": "FREEZE",
"collateralAgent": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"identityRegistry": null,
"currentIdentityRegistry": null,
"repayFee": "1500000",
"transaction": {
"hash": "0xab2709878f3c6a93fef46c073043a8a7206fa5a164e04bf1f2cd5055da619fde",
"blockNumber": 11943817,
"blockHash": "0x2371180b75e06fb38b90fc899a1f982e899f316e144bd84ac4c5f372988021bd",
"timestamp": 1792359828,
"signer": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"outerSender": null,
"outerTarget": null,
"status": 1
},
"assignments": [
{
"role": "DEFAULT_ADMIN_ROLE",
"roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 76
},
{
"role": "OPERATOR_ROLE",
"roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 77
}
],
"atomic": true,
"liveVerification": {
"checkedAtBlock": 11947182,
"checkedAt": "2026-10-19T09:07:00.512Z",
"assignments": [
{
"role": "DEFAULT_ADMIN_ROLE",
"roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 76,
"holdsNow": true
},
{
"role": "OPERATOR_ROLE",
"roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 77,
"holdsNow": true
}
],
"noRoleFor": [
{ "account": "0x2805394e8fCC41bB11613c95967be0104AB88b1c", "label": "factory", "holdsAdmin": false, "holdsOperator": false },
{ "account": "0x5Ad87a0621175206b72d10E4b8577b192e7F40aB", "label": "factory owner", "holdsAdmin": false, "holdsOperator": false }
],
"currentHolders": [
{ "role": "DEFAULT_ADMIN_ROLE", "roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895", "holdsNow": true },
{ "role": "OPERATOR_ROLE", "roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929", "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895", "holdsNow": true }
],
"roleChanges": [],
"registerChanges": [],
"upgrades": [],
"implementation": "0xde0Dd200b23De7a21877980A75ea4143543Bab47",
"history": { "complete": true, "fromBlock": 11943817, "scannedToBlock": 11947182 }
}
},
"error": null,
"metadata": {
"timestamp": "2026-10-19T09:07:00.618Z",
"requestId": "3f7c2a91-6d84-4b0e-9a15-c2e8f4d7b603",
"instanceId": "inst_abc123"
}
}
Seller Financing is in beta and runs on Ethereum Sepolia instances only for now (
DEVELOPMENT instances on Ethereum). A PRODUCTION instance, or one on another network, answers 503 SELLER_FINANCING_UNAVAILABLE. See Seller Financing.- At deployment. Each
RoleGrantedevent the market emitted in the deployment transaction, the signer, and the market’s initial parameters, read from the receipt. - Since. Every
RoleGranted,RoleRevoked,IdentityRegistryUpdatedandUpgradedevent the market emitted after the deployment transaction, read from its event log, and the implementation its ERC-1967 slot names now. - Now. Every role checked live with
hasRole: the grants of the deployment, the admin and operator named at deployment, and every account a laterRoleGrantednamed. Neither the factory nor its owner may hold the admin or operator role, and that is checked too.
auditDocument. Get Role Certificate renders it as a PDF certificate under the same docRef, on the API key and in the Issuer Portal.
Path Parameters
string
required
The market’s record ID, as
id on List Markets.Response Fields
object
Show child attributes
Show child attributes
string
SF- followed by 12 hex characters, derived from the chain, the market and the deployment transaction. The same market always has the same reference.string
Seller Financing market deployment: role assignments.integer
The chain.
string
The market contract.
string
Its collateral adapter.
string
The factory that deployed it.
string
The asset token.
string
The payment token.
string
FREEZE or CUSTODY.string
The collateral agent.
string
The market identity register the deployment set, or
null.string
The market identity register in force now, read live, or
null when the market names none. Absent when it could not be read. registerChanges lists each change in between.string
The repay fee the factory stamped, in the payment token’s smallest unit.
object
Show child attributes
Show child attributes
string
The deployment transaction.
integer
Its block.
string
The block hash.
integer
The block time, in unix seconds.
string
The wallet that signed the deployment. For a smart-account deployment, the smart account.
string
For a smart-account deployment, the wallet that broadcast the outer transaction.
null for a direct one.string
For a smart-account deployment, the contract the outer transaction called, such as the Safe or the ERC-4337 entry point.
null for a direct one.integer
1 for a successful transaction.array
Each role the market granted in the deployment transaction:
{ role, roleHash, account, grantedBy, logIndex }. role is DEFAULT_ADMIN_ROLE or OPERATOR_ROLE, or the raw hash of any other role.boolean
true when the deployment transaction granted roles and the factory made every one of those grants. false when it granted none, or another account made one.object
The live check.
Show child attributes
Show child attributes
integer
The block the check ran against.
string
ISO 8601 time of the check.
array
The same grants with
holdsNow: true when the account still holds the role, false when it was revoked or renounced, null when unread.array
{ account, label, holdsAdmin, holdsOperator } for the factory (label: "factory") and its owner (label: "factory owner"). Both read false on a market where Trusset holds no role. null means unread. When the factory’s owner cannot be read, its row is left out.array
Today’s role holders, as
{ role, roleHash, account, holdsNow }. holdsNow is true, or null when that account’s role could not be read; an account the chain answers false for is left out. role is DEFAULT_ADMIN_ROLE, OPERATOR_ROLE or the raw hash of another role. null when the holders could not be read at all.array
Each
RoleGranted and RoleRevoked after the deployment transaction, oldest first, as { event, blockNumber, transactionHash, logIndex, role, roleHash, account, sender }. sender is the wallet that granted or revoked.array
Each
IdentityRegistryUpdated, as { event, blockNumber, transactionHash, logIndex, previousRegistry, newRegistry }. A register removed or never set reads null.array
Each
Upgraded after the deployment transaction, as { event, blockNumber, transactionHash, logIndex, implementation }. An upgraded implementation is not bound by the rules of the deployed one.string
The implementation the market’s ERC-1967 slot names now.
null when unread.object
How far the event log was read:
{ complete, fromBlock, scannedToBlock }. fromBlock is the deployment block. The log is read in chunks of 10,000 blocks, at most 40 per call. complete is false when the read stopped short of the chain head or a chunk failed, so a later change may be missing from the three lists and an account granted a role there from currentHolders. scannedToBlock is null when nothing could be read.assignments covers the grants of the deployment transaction only. A role revoked later shows there as holdsNow: false. A role the admin granted later is in roleChanges and, while held, in currentHolders. Check history.complete before you rely on either list being exhaustive.curl "https://api.trusset.org/seller-financing/api/markets/cmsg4x7k20003sf9q1d8v6b2e/role-audit" \
-H "X-API-Key: trusset_your_key_here"
const res = await fetch(
`https://api.trusset.org/seller-financing/api/markets/${marketId}/role-audit`,
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { data } = await res.json();
const trussetFree = data.liveVerification.noRoleFor.every(
(r: { holdsAdmin: boolean | null; holdsOperator: boolean | null }) => r.holdsAdmin === false && r.holdsOperator === false
);
const operators = (data.liveVerification.currentHolders ?? [])
.filter((h: { role: string; holdsNow: boolean | null }) => h.role === 'OPERATOR_ROLE' && h.holdsNow === true)
.map((h: { account: string }) => h.account);
if (!data.liveVerification.history.complete) console.log('Role history read in part; call again');
{
"success": true,
"data": {
"docRef": "SF-739AD00ECE63",
"title": "Seller Financing market deployment: role assignments",
"chainId": 11155111,
"market": "0xc35e5f74eC4C1dfB8cE2b8798D6161B706F9B5E1",
"adapter": "0x037B9e26D8B98aa1B1FCC321ba45A87Fc786C7Fc",
"factory": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"assetToken": "0x305382e98F8e6ee24c32dF3567342E1F1DECb9b6",
"paymentToken": "0x98aD0ca091552e23C564B41C74282e5343D03E8a",
"mode": "FREEZE",
"collateralAgent": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"identityRegistry": null,
"currentIdentityRegistry": null,
"repayFee": "1500000",
"transaction": {
"hash": "0xab2709878f3c6a93fef46c073043a8a7206fa5a164e04bf1f2cd5055da619fde",
"blockNumber": 11943817,
"blockHash": "0x2371180b75e06fb38b90fc899a1f982e899f316e144bd84ac4c5f372988021bd",
"timestamp": 1792359828,
"signer": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"outerSender": null,
"outerTarget": null,
"status": 1
},
"assignments": [
{
"role": "DEFAULT_ADMIN_ROLE",
"roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 76
},
{
"role": "OPERATOR_ROLE",
"roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 77
}
],
"atomic": true,
"liveVerification": {
"checkedAtBlock": 11947182,
"checkedAt": "2026-10-19T09:07:00.512Z",
"assignments": [
{
"role": "DEFAULT_ADMIN_ROLE",
"roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 76,
"holdsNow": true
},
{
"role": "OPERATOR_ROLE",
"roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 77,
"holdsNow": true
}
],
"noRoleFor": [
{ "account": "0x2805394e8fCC41bB11613c95967be0104AB88b1c", "label": "factory", "holdsAdmin": false, "holdsOperator": false },
{ "account": "0x5Ad87a0621175206b72d10E4b8577b192e7F40aB", "label": "factory owner", "holdsAdmin": false, "holdsOperator": false }
],
"currentHolders": [
{ "role": "DEFAULT_ADMIN_ROLE", "roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895", "holdsNow": true },
{ "role": "OPERATOR_ROLE", "roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929", "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895", "holdsNow": true }
],
"roleChanges": [],
"registerChanges": [],
"upgrades": [],
"implementation": "0xde0Dd200b23De7a21877980A75ea4143543Bab47",
"history": { "complete": true, "fromBlock": 11943817, "scannedToBlock": 11947182 }
}
},
"error": null,
"metadata": {
"timestamp": "2026-10-19T09:07:00.618Z",
"requestId": "3f7c2a91-6d84-4b0e-9a15-c2e8f4d7b603",
"instanceId": "inst_abc123"
}
}
Error Codes
| Code | HTTP | Cause |
|---|---|---|
MISSING_MARKET_ID | 400 | marketId is longer than 100 characters |
MARKET_NOT_FOUND | 404 | No market with this ID that your instance reaches on its network |
TX_NOT_FOUND | 404 | The deployment transaction could not be loaded from the chain |
CHAIN_UNAVAILABLE | 503 | The chain could not be read. Retry shortly |
SELLER_FINANCING_UNAVAILABLE | 503 | The instance is a PRODUCTION instance or not on Ethereum |
ROLE_AUDIT_FAILED | 500 | Unexpected failure. Retry, or contact support with the request ID |
⌘I
curl "https://api.trusset.org/seller-financing/api/markets/cmsg4x7k20003sf9q1d8v6b2e/role-audit" \
-H "X-API-Key: trusset_your_key_here"
const res = await fetch(
`https://api.trusset.org/seller-financing/api/markets/${marketId}/role-audit`,
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { data } = await res.json();
const trussetFree = data.liveVerification.noRoleFor.every(
(r: { holdsAdmin: boolean | null; holdsOperator: boolean | null }) => r.holdsAdmin === false && r.holdsOperator === false
);
const operators = (data.liveVerification.currentHolders ?? [])
.filter((h: { role: string; holdsNow: boolean | null }) => h.role === 'OPERATOR_ROLE' && h.holdsNow === true)
.map((h: { account: string }) => h.account);
if (!data.liveVerification.history.complete) console.log('Role history read in part; call again');
{
"success": true,
"data": {
"docRef": "SF-739AD00ECE63",
"title": "Seller Financing market deployment: role assignments",
"chainId": 11155111,
"market": "0xc35e5f74eC4C1dfB8cE2b8798D6161B706F9B5E1",
"adapter": "0x037B9e26D8B98aa1B1FCC321ba45A87Fc786C7Fc",
"factory": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"assetToken": "0x305382e98F8e6ee24c32dF3567342E1F1DECb9b6",
"paymentToken": "0x98aD0ca091552e23C564B41C74282e5343D03E8a",
"mode": "FREEZE",
"collateralAgent": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"identityRegistry": null,
"currentIdentityRegistry": null,
"repayFee": "1500000",
"transaction": {
"hash": "0xab2709878f3c6a93fef46c073043a8a7206fa5a164e04bf1f2cd5055da619fde",
"blockNumber": 11943817,
"blockHash": "0x2371180b75e06fb38b90fc899a1f982e899f316e144bd84ac4c5f372988021bd",
"timestamp": 1792359828,
"signer": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"outerSender": null,
"outerTarget": null,
"status": 1
},
"assignments": [
{
"role": "DEFAULT_ADMIN_ROLE",
"roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 76
},
{
"role": "OPERATOR_ROLE",
"roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 77
}
],
"atomic": true,
"liveVerification": {
"checkedAtBlock": 11947182,
"checkedAt": "2026-10-19T09:07:00.512Z",
"assignments": [
{
"role": "DEFAULT_ADMIN_ROLE",
"roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 76,
"holdsNow": true
},
{
"role": "OPERATOR_ROLE",
"roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929",
"account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
"grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
"logIndex": 77,
"holdsNow": true
}
],
"noRoleFor": [
{ "account": "0x2805394e8fCC41bB11613c95967be0104AB88b1c", "label": "factory", "holdsAdmin": false, "holdsOperator": false },
{ "account": "0x5Ad87a0621175206b72d10E4b8577b192e7F40aB", "label": "factory owner", "holdsAdmin": false, "holdsOperator": false }
],
"currentHolders": [
{ "role": "DEFAULT_ADMIN_ROLE", "roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895", "holdsNow": true },
{ "role": "OPERATOR_ROLE", "roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929", "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895", "holdsNow": true }
],
"roleChanges": [],
"registerChanges": [],
"upgrades": [],
"implementation": "0xde0Dd200b23De7a21877980A75ea4143543Bab47",
"history": { "complete": true, "fromBlock": 11943817, "scannedToBlock": 11947182 }
}
},
"error": null,
"metadata": {
"timestamp": "2026-10-19T09:07:00.618Z",
"requestId": "3f7c2a91-6d84-4b0e-9a15-c2e8f4d7b603",
"instanceId": "inst_abc123"
}
}
