PageSourceSearch

https://apptokens.com/assets/js/5c99c812.9fe8d919.js

js apptokens.com collected 2026-10-09 21:55:23 UTC 24,901 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkapptokens=self.webpackChunkapptokens||[]).push([[2009],{6370:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>l,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"integration-guide/creator-token-standards/v4/for-creators/transfer-security","title":"Transfer Security","description":"Creator Token Standard contracts implement transfer security through the use of Transfer Security Levels","source":"@site/docs/integration-guide/creator-token-standards/03-v4/for-creators/transfer-security.md","sourceDirName":"integration-guide/creator-token-standards/03-v4/for-creators","slug":"/integration-guide/creator-token-standards/v4/for-creators/transfer-security","permalink":"/docs/integration-guide/creator-token-standards/v4/for-creators/transfer-security","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_label":"Transfer Security","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"For Creators","permalink":"/docs/category/for-creators-1"},"next":{"title":"Example Contracts","permalink":"/docs/integration-guide/creator-token-standards/v4/for-creators/token-examples"}}');var r=s(4848),i=s(8453);const l={sidebar_label:"Transfer Security",sidebar_position:3},c="Transfer Security",a={},o=[{value:"Transfer Security Levels",id:"transfer-security-levels",level:2},{value:"List Type",id:"list-type",level:2},{value:"Lists",id:"lists",level:2},{value:"OTC",id:"otc",level:2},{value:"Smart Contract Receivers",id:"smart-contract-receivers",level:2},{value:"Authorizers",id:"authorizers",level:2},{value:"Account Freezing",id:"account-freezing",level:2},{value:"Mechanisms By Which Royalties Can Be Evaded (By Security Level)",id:"mechanisms-by-which-royalties-can-be-evaded-by-security-level",level:2},{value:"Transfer Security Functions",id:"transfer-security-functions",level:2},{value:"Token Contract Functions",id:"token-contract-functions",level:3},{value:"setTransferValidator",id:"settransfervalidator",level:4},{value:"Transfer Validator Functions",id:"transfer-validator-functions",level:3},{value:"createList",id:"createlist",level:4},{value:"createListCopy",id:"createlistcopy",level:4},{value:"reassignOwnershipOfList",id:"reassignownershipoflist",level:4},{value:"renounceOwnershipOfList",id:"renounceownershipoflist",level:4},{value:"addAccountsToBlacklist",id:"addaccountstoblacklist",level:4},{value:"addAccountsToWhitelist",id:"addaccountstowhitelist",level:4},{value:"addCodeHashesToBlacklist",id:"addcodehashestoblacklist",level:4},{value:"addCodeHashesToWhitelist",id:"addcodehashestowhitelist",level:4},{value:"addAccountsToAuthorizers",id:"addaccountstoauthorizers",level:4},{value:"removeAccountsFromBlacklist",id:"removeaccountsfromblacklist",level:4},{value:"removeAccountsFromWhitelist",id:"removeaccountsfromwhitelist",level:4},{value:"removeCodeHashesFromBlacklist",id:"removecodehashesfromblacklist",level:4},{value:"removeCodeHashesFromWhitelist",id:"removecodehashesfromwhitelist",level:4},{value:"removeAccountsFromAuthorizers",id:"removeaccountsfromauthorizers",level:4},{value:"setTransferSecurityLevelOfCollection",id:"settransfersecuritylevelofcollection",level:4},{value:"applyListToCollection",id:"applylisttocollection",level:4},{value:"freezeAccountsForCollection",id:"freezeaccountsforcollection",level:4},{value:"unfreezeAccountsForCollection",id:"unfreezeaccountsforcollection",level:4}];function d(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"transfer-security",children:"Transfer Security"})}),"\n",(0,r.jsxs)(t.p,{children:["Creator Token Standard contracts implement transfer security through the use of ",(0,r.jsx)(t.a,{href:"#transfer-security-levels",children:"Transfer Security Levels"}),"\nand ",(0,r.jsx)(t.a,{href:"#lists",children:"Lists"})," giving creators full control over how their creations are distributed and used."]}),"\n",(0,r.jsx)(t.h2,{id:"transfer-security-levels",children:"Transfer Security Levels"}),"\n",(0,r.jsxs)(t.p,{children:["A collection's ",(0,r.jsx)(t.code,{children:"Transfer Security Level"})," determines what restrictions are applied to transfers made by token owners. There\nare nine unique security levels with the default ",(0,r.jsx)(t.code,{children:"Recommended"})," level being functionally equivalent to level ",(0,r.jsx)(t.code,{children:"3"})," while\noptimizing contract initialization gas costs by leaving the storage slot as a zero value."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Level"}),(0,r.jsx)(t.th,{children:"List Type"}),(0,r.jsx)(t.th,{children:"OTC"}),(0,r.jsx)(t.th,{children:"Smart Contract Receivers"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Recommended"}),(0,r.jsx)(t.td,{children:"Whitelist"}),(0,r.jsx)(t.td,{children:"Allowed"}),(0,r.jsx)(t.td,{children:"Allowed"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"1"}),(0,r.jsx)(t.td,{children:"None"}),(0,r.jsx)(t.td,{children:"Allowed"}),(0,r.jsx)(t.td,{children:"Allowed"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"2"}),(0,r.jsx)(t.td,{children:"Blacklist"}),(0,r.jsx)(t.td,{children:"Allowed"}),(0,r.jsx)(t.td,{children:"Allowed"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"3"}),(0,r.jsx)(t.td,{children:"Whitelist"}),(0,r.jsx)(t.td,{children:"Allowed"}),(0,r.jsx)(t.td,{children:"Allowed"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"4"}),(0,r.jsx)(t.td,{children:"Whitelist"}),(0,r.jsx)(t.td,{children:"Blocked"}),(0,r.jsx)(t.td,{children:"Allowed"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"5"}),(0,r.jsx)(t.td,{children:"Whitelist"}),(0,r.jsx)(t.td,{children:"Allowed"}),(0,r.jsx)(t.td,{children:"Blocked Using Code Length Check"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"6"}),(0,r.jsx)(t.td,{children:"Whitelist"}),(0,r.jsx)(t.td,{children:"Allowed"}),(0,r.jsx)(t.td,{children:"Blocked Using EOA Signature Verification"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"7"}),(0,r.jsx)(t.td,{children:"Whitelist"}),(0,r.jsx)(t.td,{children:"Blocked"}),(0,r.jsx)(t.td,{children:"Blocked Using Code Length Check"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"8"}),(0,r.jsx)(t.td,{children:"Whitelist"}),(0,r.jsx)(t.td,{children:"Blocked"}),(0,r.jsx)(t.td,{children:"Blocked Using EOA Signature Verification"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"9"}),(0,r.jsx)(t.td,{children:"None"}),(0,r.jsx)(t.td,{children:"Blocked"}),(0,r.jsx)(t.td,{children:"Blocked by restricting transfer"})]})]})]}),"\n",(0,r.jsxs)(t.p,{children:["Transfer security settings are applied by a ",(0,r.jsx)(t.code,{children:"Transfer Validator"})," contract. Limit Break provides a default transfer validator for use\nby collections. Creators ",(0,r.jsx)(t.em,{children:"may"})," implement their own transfer validator however it is highly recommended to use the default for user\nexperience and gas efficie
1ncy as it provides a single EOA Registry for all collections using Creator Token Standards and will\nminimize user friction on collections that apply security levels 6 or 8."]}),"\n",(0,r.jsxs)(t.p,{children:["Creators can manage their security settings at ",(0,r.jsx)(t.a,{href:"https://developers.freenft.com",children:"https://developers.freenft.com"}),", with direct\ncalls to their token contract (see ",(0,r.jsx)(t.a,{href:"#token-contract-functions",children:"Token Contract Functions"}),") or direct calls to the transfer validator\n(see ",(0,r.jsx)(t.a,{href:"#transfer-validator-functions",children:"Transfer Contract Functions"}),")."]}),"\n",(0,r.jsx)(t.h2,{id:"list-type",children:"List Type"}),"\n",(0,r.jsxs)(t.p,{children:["List types may be ",(0,r.jsx)(t.code,{children:"None"}),", ",(0,r.jsx)(t.code,{children:"Blacklist"})," or ",(0,r.jsx)(t.code,{children:"Whitelist"})," and apply to the over-the-counter (OTC) transfer setting."]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"None"})," is only applied to security level ",(0,r.jsx)(t.code,{children:"1"}),". There are no filter lists applied to the transfer."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Blacklist"})," is only applied to security level ",(0,r.jsx)(t.code,{children:"2"}),". If the transaction caller's codehash or contract address has been added\nto the list the transaction will not be allowed. This type of list is easily bypassed by users that deploy the same contracts to new\naddresses or make small changes to the contract code to get a new codehash without significantly changing the contract logic."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Whitelist"})," is applied to all other security levels. If the transaction caller's codehash or contract address has ",(0,r.jsx)(t.em,{children:"not"})," been added\nto the list the transaction will not be allowed. This type of list allows a creator to specify exactly which contracts are allowed to\ntransact items in the collection."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"lists",children:"Lists"}),"\n",(0,r.jsxs)(t.p,{children:["Lists contain contract addresses and codehashes curated by a list owner and are stored in the Transfer Validator that is utilized\nby the collection. Lists ",(0,r.jsx)(t.em,{children:"may"})," be shared between collections. A list will be enforced during a token transfer transaction based on the\nsecurity level set for the collection."]}),"\n",(0,r.jsx)(t.h2,{id:"otc",children:"OTC"}),"\n",(0,r.jsxs)(t.p,{children:["OTC may be set to ",(0,r.jsx)(t.code,{children:"Allowed"})," or ",(0,r.jsx)(t.code,{children:"Blocked"})," based on the security level selected. If OTC is ",(0,r.jsx)(t.code,{children:"Allowed"})," then a token owner ",(0,r.jsx)(t.em,{children:"may"})," transfer their\ntokens to another address without the transfer routing through another smart contract. If OTC is ",(0,r.jsx)(t.code,{children:"Blocked"})," then a token owner's transfer ",(0,r.jsx)(t.em,{children:"must"}),"\nbe routed through a smart contract."]}),"\n",(0,r.jsx)(t.h2,{id:"smart-contract-receivers",children:"Smart Contract Receivers"}),"\n",(0,r.jsxs)(t.p,{children:["Smart Contract Receivers may be set to ",(0,r.jsx)(t.code,{children:"Allowed"})," or ",(0,r.jsx)(t.code,{children:"Blocked"})," with the blocked state enforcement set to ",(0,r.jsx)(t.code,{children:"Code Length Check"})," or\n",(0,r.jsx)(t.code,{children:"EOA Signature Verification"}),". If smart contract receivers are ",(0,r.jsx)(t.code,{children:"Allowed"})," then a token ",(0,r.jsx)(t.em,{children:"may"})," be transferred to a smart contract.\nIf smart contract receivers are ",(0,r.jsx)(t.code,{children:"Blocked"})," then the transfer validator will check that the receiver is an EOA using contract code\nlength or by requiring the receiver send a signed message to the EOA Registry to prove that their is a private key for the address."]}),"\n",(0,r.jsx)(t.p,{children:"Code length checks may be bypassed by executing transactions from a smart contract's constructor code.\nEOA signature verification requires additional steps and a transaction by the receiver."}),"\n",(0,r.jsx)(t.h2,{id:"authorizers",children:"Authorizers"}),"\n",(0,r.jsx)(t.p,{children:"The Creator Token Transfer Validator now includes a new validation procedure, utilizing approved authorizers to review and approve transfers. Authorizers will provide a signature enabling transfers if the transaction meets certain criteria such as paying royalties, multi-hop transfers, or utilizing a limited smart contract system for gaming restraints."}),"\n",(0,r.jsx)(t.h2,{id:"account-freezing",children:"Account Freezing"}),"\n",(0,r.jsx)(t.p,{children:"As a method of last resort, creators can freeze an account to prevent all transfers from the address. This is intended to prevent malicious actors from circumventing any transfer rules the validators have set via unintended routes or exploits."}),"\n",(0,r.jsx)(t.h2,{id:"mechanisms-by-which-royalties-can-be-evaded-by-security-level",children:"Mechanisms By Which Royalties Can Be Evaded (By Security Level)"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Level"}),(0,r.jsx)(t.th,{children:"Blocked Exchange"}),(0,r.jsx)(t.th,{children:"Pop-Up Exchange"}),(0,r.jsx)(t.th,{children:"OTC / Escrow"}),(0,r.jsx)(t.th,{children:"Wrapper Contracts"}),(0,r.jsx)(t.th,{children:"Trading Multi-Sig Wallets"}),(0,r.jsx)(t.th,{children:"Centralized Exchange w/EOA"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"1"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"2"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"3"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"4"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Yes"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"5"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"Limited"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Yes"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"6"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Yes"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"7"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Limited"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Limited"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"8"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Limited"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"9"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"No"})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"transfer-security-functions",children:"Transfer Security Functions"}),"\n",(0,r.jsx)(t.p,{children:"Transfer security functions are located in two places for a token contract - the token contract itself\nand the transfer validator contract that the token contract has set as its transfer validator."}),"\n",(0,r.jsx)(t.h3,{id:"token-contract-functions",children:"Token Contract Functions"}),"\n",(0,r.jsx)(t.p,{children:"The functions in this section are implemented in the token contract."}),"\n",(0,r.jsx)(t.h4,{id:"settransfervalidator",children:"setTransferValidator"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the token contract owner or any account that is assigned the default admin role to\nset the transfer validator to a new address."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function setTransferValidator(address transferValidator_) public;\n"})}),"\n",(0,r.jsx)(t.h3,{id:"transfer-validator-functions",children:"Transfer Validator Functions"}),"\n",(0,r.jsx)(t.p,{children:"The functions in this section are implemented in the transfer validator used by the token contract."}),"\n",(0,r.jsx)(t.h4,{id:"createlist",children:"createList"}),"\n",(0,r.jsx)(t.p,{children:"Callable by any user to create a new list."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function createList(string calldata name) public returns (uint120);\n"})}),"\n",(0,r.jsx)(t.h4,{id:"createlistcopy",children:"createListCopy"}),"\n",(0,r.jsx)(t.p,{children:"Callable by any user to create a new list copied from an existing list."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function createListCopy(string calldata name, uint120 sourceListId) external returns (uint120);\n"})}),"\n",(0,r.jsx)(t.h4,{id:"reassignownershipoflist",children:"reassignOwnershipOfList"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to transfer ownership of the list to a new owner."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function reassignOwnershipOfList(uint120 id, address newOwner) public;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"renounceownershipoflist",children:"renounceOwnershipOfList"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to renounce ownership of the list and prevent further changes."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function renounceOwnershipOfList(uint120 id) public;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"addaccountstoblacklist",children:"addAccountsToBlacklist"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to add the specified accounts to the list's blacklist."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function addAccountsToBlacklist(\n    uint120 id, \n    address[] calldata accounts\n) external;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"addaccountstowhitelist",children:"addAccountsToWhitelist"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to add the specified accounts to the list's whitelist."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function addAccountsToWhitelist(\n    uint120 id, \n    address[] calldata accounts\n) external;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"addcodehashestoblacklist",children:"addCodeHashesToBlacklist"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to add the specified code hashes to the list's blacklist."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function addCodeHashesToBlacklist(\n    uint120 id, \n    b
1ytes32[] calldata codehashes\n) external;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"addcodehashestowhitelist",children:"addCodeHashesToWhitelist"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to add the specified code hashes to the list's whitelist."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function addCodeHashesToWhitelist(\n    uint120 id, \n    bytes32[] calldata codehashes\n) external;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"addaccountstoauthorizers",children:"addAccountsToAuthorizers"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to add the specified authorizers to the list's approved authorizer addresses."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function addAccountsToAuthorizers(\n    uint120 id, \n    address[] calldata accounts\n) external\n"})}),"\n",(0,r.jsx)(t.h4,{id:"removeaccountsfromblacklist",children:"removeAccountsFromBlacklist"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to remove the specified accounts from the list's blacklist."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function removeAccountsFromBlacklist(\n    uint120 id, \n    address[] calldata accounts\n) external;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"removeaccountsfromwhitelist",children:"removeAccountsFromWhitelist"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to remove the specified accounts from the list's whitelist."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function removeAccountsFromWhitelist(\n    uint120 id, \n    address[] calldata accounts\n) external;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"removecodehashesfromblacklist",children:"removeCodeHashesFromBlacklist"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to remove the specified code hashes from the list's blacklist."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function removeCodeHashesFromBlacklist(\n    uint120 id, \n    bytes32[] calldata codehashes\n) external;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"removecodehashesfromwhitelist",children:"removeCodeHashesFromWhitelist"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to remove the specified code hashes from the list's whitelist."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function removeCodeHashesFromWhitelist(\n    uint120 id, \n    bytes32[] calldata codehashes\n) external;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"removeaccountsfromauthorizers",children:"removeAccountsFromAuthorizers"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the owner of a list to remove the specified authorizers from the list's approved authorizer addresses."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function removeAccountsFromAuthorizers(\n    uint120 id, \n    address[] calldata accounts\n) external\n"})}),"\n",(0,r.jsx)(t.h4,{id:"settransfersecuritylevelofcollection",children:"setTransferSecurityLevelOfCollection"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the token contract, owner of the token contract or any account that has been assigned\nthe default admin role for the token contract to set the token's transfer security level. The caller can\nalso define authorizers, set if authorizers can enable wildcard allowances and enable freezing of accounts."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function setTransferSecurityLevelOfCollection(\n    address collection, \n    TransferSecurityLevels level,\n    bool enableAuthorizationMode,\n    bool authorizersCanSetWildcardOperators,\n    bool enableAccountFreezingMode\n) external;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"applylisttocollection",children:"applyListToCollection"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the token contract, owner of the token contract or any account that has been assigned\nthe default admin role for the token contract to set the list to use when applying whitelist/blacklist\ntransfer restrictions."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function applyListToCollection(address collection, uint120 id) public;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"freezeaccountsforcollection",children:"freezeAccountsForCollection"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the token contract, owner of the token contract or any account that has been assigned\nthe default admin role for the token contract to freeze transferability for a specific set of addresses."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function freezeAccountsForCollection(address collection, address[] calldata accountsToFreeze) public;\n"})}),"\n",(0,r.jsx)(t.h4,{id:"unfreezeaccountsforcollection",children:"unfreezeAccountsForCollection"}),"\n",(0,r.jsx)(t.p,{children:"Callable by the token contract, owner of the token contract or any account that has been assigned\nthe default admin role for the token contract to remove transfer restrictions from a specific set of addresses."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-solidity",children:"function unfreezeAccountsForCollection(address collection, address[] calldata accountsToUnfreeze) public;\n"})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>l,x:()=>c});var n=s(6540);const r={},i=n.createContext(r);function l(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.