language/diem-framework/modules/doc/DiemId.md
<a name="0x1_DiemId"></a>
0x1::DiemIdModule managing Diem ID.
DiemIdDomainsDiemIdDomainDiemIdDomainManagerDiemIdDomainEventcreate_diem_id_domainpublish_diem_id_domainshas_diem_id_domainspublish_diem_id_domain_manageradd_diem_id_domainremove_diem_id_domainhas_diem_id_domaintc_domain_manager_exists<a name="0x1_DiemId_DiemIdDomains"></a>
DiemIdDomainsThis resource holds an entity's domain names needed to send and receive payments using diem IDs.
<pre><code><b>struct</b> <a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a> has key </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>domains: vector<<a href="DiemId.md#0x1_DiemId_DiemIdDomain">DiemId::DiemIdDomain</a>></code> </dt> <dd> The list of domain names owned by this parent vasp account </dd> </dl> </details> <details> <summary>Specification</summary>All <code><a href="DiemId.md#0x1_DiemId_DiemIdDomain">DiemIdDomain</a></code>s stored in the <code><a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a></code> resource are no more than 63 characters long.
<pre><code><b>invariant</b> <b>forall</b> i in 0..len(domains): len(domains[i].domain) <= <a href="DiemId.md#0x1_DiemId_DOMAIN_LENGTH">DOMAIN_LENGTH</a>; </code></pre>The list of <code><a href="DiemId.md#0x1_DiemId_DiemIdDomain">DiemIdDomain</a></code>s are a set
<pre><code><b>invariant</b> <b>forall</b> i in 0..len(domains): <b>forall</b> j in i + 1..len(domains): domains[i] != domains[j]; </code></pre> </details><a name="0x1_DiemId_DiemIdDomain"></a>
DiemIdDomainStruct to store the limit on-chain
<pre><code><b>struct</b> <a href="DiemId.md#0x1_DiemId_DiemIdDomain">DiemIdDomain</a> has <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>domain: vector<u8></code> </dt> <dd> </dd> </dl> </details> <details> <summary>Specification</summary>All <code><a href="DiemId.md#0x1_DiemId_DiemIdDomain">DiemIdDomain</a></code>s must be no more than 63 characters long.
<pre><code><b>invariant</b> len(domain) <= <a href="DiemId.md#0x1_DiemId_DOMAIN_LENGTH">DOMAIN_LENGTH</a>; </code></pre> </details><a name="0x1_DiemId_DiemIdDomainManager"></a>
DiemIdDomainManager<a name="0x1_DiemId_DiemIdDomainEvent"></a>
DiemIdDomainEvent<a name="@Constants_0"></a>
<a name="0x1_DiemId_DOMAIN_LENGTH"></a>
<pre><code><b>const</b> <a href="DiemId.md#0x1_DiemId_DOMAIN_LENGTH">DOMAIN_LENGTH</a>: u64 = 63; </code></pre><a name="0x1_DiemId_EDIEM_ID_DOMAIN"></a>
DiemIdDomains resource is not or already published.
<pre><code><b>const</b> <a href="DiemId.md#0x1_DiemId_EDIEM_ID_DOMAIN">EDIEM_ID_DOMAIN</a>: u64 = 0; </code></pre><a name="0x1_DiemId_EDIEM_ID_DOMAINS_NOT_PUBLISHED"></a>
DiemIdDomains resource was not published for a VASP account
<pre><code><b>const</b> <a href="DiemId.md#0x1_DiemId_EDIEM_ID_DOMAINS_NOT_PUBLISHED">EDIEM_ID_DOMAINS_NOT_PUBLISHED</a>: u64 = 4; </code></pre><a name="0x1_DiemId_EDIEM_ID_DOMAIN_MANAGER"></a>
DiemIdDomainManager resource is not or already published.
<pre><code><b>const</b> <a href="DiemId.md#0x1_DiemId_EDIEM_ID_DOMAIN_MANAGER">EDIEM_ID_DOMAIN_MANAGER</a>: u64 = 1; </code></pre><a name="0x1_DiemId_EDOMAIN_ALREADY_EXISTS"></a>
DiemID domain already exists
<pre><code><b>const</b> <a href="DiemId.md#0x1_DiemId_EDOMAIN_ALREADY_EXISTS">EDOMAIN_ALREADY_EXISTS</a>: u64 = 3; </code></pre><a name="0x1_DiemId_EDOMAIN_NOT_FOUND"></a>
DiemID domain was not found
<pre><code><b>const</b> <a href="DiemId.md#0x1_DiemId_EDOMAIN_NOT_FOUND">EDOMAIN_NOT_FOUND</a>: u64 = 2; </code></pre><a name="0x1_DiemId_EINVALID_DIEM_ID_DOMAIN"></a>
Invalid domain for DiemIdDomain
<pre><code><b>const</b> <a href="DiemId.md#0x1_DiemId_EINVALID_DIEM_ID_DOMAIN">EINVALID_DIEM_ID_DOMAIN</a>: u64 = 5; </code></pre><a name="0x1_DiemId_create_diem_id_domain"></a>
create_diem_id_domain<a name="0x1_DiemId_CreateDiemIdDomainAbortsIf"></a>
<pre><code><b>schema</b> <a href="DiemId.md#0x1_DiemId_CreateDiemIdDomainAbortsIf">CreateDiemIdDomainAbortsIf</a> { domain: vector<u8>; <b>aborts_if</b> <a href="../../../../../../move-stdlib/docs/Vector.md#0x1_Vector_length">Vector::length</a>(domain) > <a href="DiemId.md#0x1_DiemId_DOMAIN_LENGTH">DOMAIN_LENGTH</a> <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_INVALID_ARGUMENT">Errors::INVALID_ARGUMENT</a>; } </code></pre> </details><a name="0x1_DiemId_publish_diem_id_domains"></a>
publish_diem_id_domainsPublish a <code><a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a></code> resource under <code>created</code> with an empty <code>domains</code>. Before sending or receiving any payments using Diem IDs, the Treasury Compliance account must send a transaction that invokes <code>add_domain_id</code> to set the <code>domains</code> field with a valid domain
<pre><code><b>public</b> <b>fun</b> <a href="DiemId.md#0x1_DiemId_publish_diem_id_domains">publish_diem_id_domains</a>(vasp_account: &signer) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="DiemId.md#0x1_DiemId_publish_diem_id_domains">publish_diem_id_domains</a>( vasp_account: &signer, ) { <a href="Roles.md#0x1_Roles_assert_parent_vasp_role">Roles::assert_parent_vasp_role</a>(vasp_account); <b>assert</b>( !<b>exists</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(<a href="../../../../../../move-stdlib/docs/Signer.md#0x1_Signer_address_of">Signer::address_of</a>(vasp_account)), <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_already_published">Errors::already_published</a>(<a href="DiemId.md#0x1_DiemId_EDIEM_ID_DOMAIN">EDIEM_ID_DOMAIN</a>) ); move_to(vasp_account, <a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a> { domains: <a href="../../../../../../move-stdlib/docs/Vector.md#0x1_Vector_empty">Vector::empty</a>(), }) } </code></pre> </details> <details> <summary>Specification</summary> <pre><code><b>let</b> vasp_addr = <a href="../../../../../../move-stdlib/docs/Signer.md#0x1_Signer_spec_address_of">Signer::spec_address_of</a>(vasp_account); <b>include</b> <a href="Roles.md#0x1_Roles_AbortsIfNotParentVasp">Roles::AbortsIfNotParentVasp</a>{account: vasp_account}; <b>include</b> <a href="DiemId.md#0x1_DiemId_PublishDiemIdDomainsAbortsIf">PublishDiemIdDomainsAbortsIf</a>; <b>include</b> <a href="DiemId.md#0x1_DiemId_PublishDiemIdDomainsEnsures">PublishDiemIdDomainsEnsures</a>; </code></pre><a name="0x1_DiemId_PublishDiemIdDomainsAbortsIf"></a>
<pre><code><b>schema</b> <a href="DiemId.md#0x1_DiemId_PublishDiemIdDomainsAbortsIf">PublishDiemIdDomainsAbortsIf</a> { vasp_addr: address; <b>aborts_if</b> <a href="DiemId.md#0x1_DiemId_has_diem_id_domains">has_diem_id_domains</a>(vasp_addr) <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_ALREADY_PUBLISHED">Errors::ALREADY_PUBLISHED</a>; } </code></pre><a name="0x1_DiemId_PublishDiemIdDomainsEnsures"></a>
<pre><code><b>schema</b> <a href="DiemId.md#0x1_DiemId_PublishDiemIdDomainsEnsures">PublishDiemIdDomainsEnsures</a> { vasp_addr: address; <b>ensures</b> <b>exists</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(vasp_addr); <b>ensures</b> <a href="../../../../../../move-stdlib/docs/Vector.md#0x1_Vector_is_empty">Vector::is_empty</a>(<b>global</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(vasp_addr).domains); } </code></pre> </details><a name="0x1_DiemId_has_diem_id_domains"></a>
has_diem_id_domains<a name="0x1_DiemId_publish_diem_id_domain_manager"></a>
publish_diem_id_domain_managerPublish a <code><a href="DiemId.md#0x1_DiemId_DiemIdDomainManager">DiemIdDomainManager</a></code> resource under <code>tc_account</code> with an empty <code>diem_id_domain_events</code>. When Treasury Compliance account sends a transaction that invokes either <code>add_diem_id_domain</code> or <code>remove_diem_id_domain</code>, a <code><a href="DiemId.md#0x1_DiemId_DiemIdDomainEvent">DiemIdDomainEvent</a></code> is emitted and added to <code>diem_id_domain_events</code>.
<pre><code><b>public</b> <b>fun</b> <a href="DiemId.md#0x1_DiemId_publish_diem_id_domain_manager">publish_diem_id_domain_manager</a>(tc_account: &signer) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="DiemId.md#0x1_DiemId_publish_diem_id_domain_manager">publish_diem_id_domain_manager</a>( tc_account : &signer, ) { <a href="Roles.md#0x1_Roles_assert_treasury_compliance">Roles::assert_treasury_compliance</a>(tc_account); <b>assert</b>( !<b>exists</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomainManager">DiemIdDomainManager</a>>(<a href="../../../../../../move-stdlib/docs/Signer.md#0x1_Signer_address_of">Signer::address_of</a>(tc_account)), <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_already_published">Errors::already_published</a>(<a href="DiemId.md#0x1_DiemId_EDIEM_ID_DOMAIN_MANAGER">EDIEM_ID_DOMAIN_MANAGER</a>) ); move_to( tc_account, <a href="DiemId.md#0x1_DiemId_DiemIdDomainManager">DiemIdDomainManager</a> { diem_id_domain_events: <a href="../../../../../../move-stdlib/docs/Event.md#0x1_Event_new_event_handle">Event::new_event_handle</a><<a href="DiemId.md#0x1_DiemId_DiemIdDomainEvent">DiemIdDomainEvent</a>>(tc_account), } ); } </code></pre> </details> <details> <summary>Specification</summary> <pre><code><b>include</b> <a href="Roles.md#0x1_Roles_AbortsIfNotTreasuryCompliance">Roles::AbortsIfNotTreasuryCompliance</a>{account: tc_account}; <b>aborts_if</b> <a href="DiemId.md#0x1_DiemId_tc_domain_manager_exists">tc_domain_manager_exists</a>() <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_ALREADY_PUBLISHED">Errors::ALREADY_PUBLISHED</a>; <b>ensures</b> <b>exists</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomainManager">DiemIdDomainManager</a>>(<a href="../../../../../../move-stdlib/docs/Signer.md#0x1_Signer_spec_address_of">Signer::spec_address_of</a>(tc_account)); <b>modifies</b> <b>global</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomainManager">DiemIdDomainManager</a>>(<a href="../../../../../../move-stdlib/docs/Signer.md#0x1_Signer_spec_address_of">Signer::spec_address_of</a>(tc_account)); </code></pre> </details><a name="0x1_DiemId_add_diem_id_domain"></a>
add_diem_id_domainAdd a DiemIdDomain to a parent VASP's DiemIdDomains resource. When updating DiemIdDomains, a simple duplicate domain check is done. However, since domains are case insensitive, it is possible by error that two same domains in different lowercase and uppercase format gets added.
<pre><code><b>public</b> <b>fun</b> <a href="DiemId.md#0x1_DiemId_add_diem_id_domain">add_diem_id_domain</a>(tc_account: &signer, address: address, domain: vector<u8>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="DiemId.md#0x1_DiemId_add_diem_id_domain">add_diem_id_domain</a>( tc_account: &signer, address: address, domain: vector<u8>, ) <b>acquires</b> <a href="DiemId.md#0x1_DiemId_DiemIdDomainManager">DiemIdDomainManager</a>, <a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a> { <a href="Roles.md#0x1_Roles_assert_treasury_compliance">Roles::assert_treasury_compliance</a>(tc_account); <b>assert</b>(<a href="DiemId.md#0x1_DiemId_tc_domain_manager_exists">tc_domain_manager_exists</a>(), <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_not_published">Errors::not_published</a>(<a href="DiemId.md#0x1_DiemId_EDIEM_ID_DOMAIN_MANAGER">EDIEM_ID_DOMAIN_MANAGER</a>)); <b>assert</b>( <b>exists</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(address), <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_not_published">Errors::not_published</a>(<a href="DiemId.md#0x1_DiemId_EDIEM_ID_DOMAINS_NOT_PUBLISHED">EDIEM_ID_DOMAINS_NOT_PUBLISHED</a>) ); <b>let</b> account_domains = borrow_global_mut<<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(address); <b>let</b> diem_id_domain = <a href="DiemId.md#0x1_DiemId_create_diem_id_domain">create_diem_id_domain</a>(domain); <b>assert</b>( !<a href="../../../../../../move-stdlib/docs/Vector.md#0x1_Vector_contains">Vector::contains</a>(&account_domains.domains, &diem_id_domain), <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_invalid_argument">Errors::invalid_argument</a>(<a href="DiemId.md#0x1_DiemId_EDOMAIN_ALREADY_EXISTS">EDOMAIN_ALREADY_EXISTS</a>) ); <a href="../../../../../../move-stdlib/docs/Vector.md#0x1_Vector_push_back">Vector::push_back</a>(&<b>mut</b> account_domains.domains, <b>copy</b> diem_id_domain); <a href="../../../../../../move-stdlib/docs/Event.md#0x1_Event_emit_event">Event::emit_event</a>( &<b>mut</b> borrow_global_mut<<a href="DiemId.md#0x1_DiemId_DiemIdDomainManager">DiemIdDomainManager</a>>(@TreasuryCompliance).diem_id_domain_events, <a href="DiemId.md#0x1_DiemId_DiemIdDomainEvent">DiemIdDomainEvent</a> { removed: <b>false</b>, domain: diem_id_domain, address, }, ); } </code></pre> </details> <details> <summary>Specification</summary> <pre><code><b>include</b> <a href="DiemId.md#0x1_DiemId_AddDiemIdDomainAbortsIf">AddDiemIdDomainAbortsIf</a>; <b>include</b> <a href="DiemId.md#0x1_DiemId_AddDiemIdDomainEnsures">AddDiemIdDomainEnsures</a>; <b>include</b> <a href="DiemId.md#0x1_DiemId_AddDiemIdDomainEmits">AddDiemIdDomainEmits</a>; </code></pre><a name="0x1_DiemId_AddDiemIdDomainAbortsIf"></a>
<pre><code><b>schema</b> <a href="DiemId.md#0x1_DiemId_AddDiemIdDomainAbortsIf">AddDiemIdDomainAbortsIf</a> { tc_account: signer; address: address; domain: vector<u8>; <b>let</b> domains = <b>global</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(address).domains; <b>include</b> <a href="Roles.md#0x1_Roles_AbortsIfNotTreasuryCompliance">Roles::AbortsIfNotTreasuryCompliance</a>{account: tc_account}; <b>include</b> <a href="DiemId.md#0x1_DiemId_CreateDiemIdDomainAbortsIf">CreateDiemIdDomainAbortsIf</a>; <b>aborts_if</b> !<b>exists</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(address) <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_NOT_PUBLISHED">Errors::NOT_PUBLISHED</a>; <b>aborts_if</b> !<a href="DiemId.md#0x1_DiemId_tc_domain_manager_exists">tc_domain_manager_exists</a>() <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_NOT_PUBLISHED">Errors::NOT_PUBLISHED</a>; <b>aborts_if</b> contains(domains, <a href="DiemId.md#0x1_DiemId_DiemIdDomain">DiemIdDomain</a> { domain }) <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_INVALID_ARGUMENT">Errors::INVALID_ARGUMENT</a>; } </code></pre><a name="0x1_DiemId_AddDiemIdDomainEnsures"></a>
<pre><code><b>schema</b> <a href="DiemId.md#0x1_DiemId_AddDiemIdDomainEnsures">AddDiemIdDomainEnsures</a> { address: address; domain: vector<u8>; <b>let</b> post domains = <b>global</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(address).domains; <b>ensures</b> contains(domains, <a href="DiemId.md#0x1_DiemId_DiemIdDomain">DiemIdDomain</a> { domain }); } </code></pre><a name="0x1_DiemId_AddDiemIdDomainEmits"></a>
<pre><code><b>schema</b> <a href="DiemId.md#0x1_DiemId_AddDiemIdDomainEmits">AddDiemIdDomainEmits</a> { address: address; domain: vector<u8>; <b>let</b> handle = <b>global</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomainManager">DiemIdDomainManager</a>>(@TreasuryCompliance).diem_id_domain_events; <b>let</b> msg = <a href="DiemId.md#0x1_DiemId_DiemIdDomainEvent">DiemIdDomainEvent</a> { removed: <b>false</b>, domain: <a href="DiemId.md#0x1_DiemId_DiemIdDomain">DiemIdDomain</a> { domain }, address, }; emits msg <b>to</b> handle; } </code></pre> </details><a name="0x1_DiemId_remove_diem_id_domain"></a>
remove_diem_id_domainRemove a DiemIdDomain from a parent VASP's DiemIdDomains resource.
<pre><code><b>public</b> <b>fun</b> <a href="DiemId.md#0x1_DiemId_remove_diem_id_domain">remove_diem_id_domain</a>(tc_account: &signer, address: address, domain: vector<u8>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="DiemId.md#0x1_DiemId_remove_diem_id_domain">remove_diem_id_domain</a>( tc_account: &signer, address: address, domain: vector<u8>, ) <b>acquires</b> <a href="DiemId.md#0x1_DiemId_DiemIdDomainManager">DiemIdDomainManager</a>, <a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a> { <a href="Roles.md#0x1_Roles_assert_treasury_compliance">Roles::assert_treasury_compliance</a>(tc_account); <b>assert</b>(<a href="DiemId.md#0x1_DiemId_tc_domain_manager_exists">tc_domain_manager_exists</a>(), <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_not_published">Errors::not_published</a>(<a href="DiemId.md#0x1_DiemId_EDIEM_ID_DOMAIN_MANAGER">EDIEM_ID_DOMAIN_MANAGER</a>)); <b>assert</b>( <b>exists</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(address), <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_not_published">Errors::not_published</a>(<a href="DiemId.md#0x1_DiemId_EDIEM_ID_DOMAINS_NOT_PUBLISHED">EDIEM_ID_DOMAINS_NOT_PUBLISHED</a>) ); <b>let</b> account_domains = borrow_global_mut<<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(address); <b>let</b> diem_id_domain = <a href="DiemId.md#0x1_DiemId_create_diem_id_domain">create_diem_id_domain</a>(domain); <b>let</b> (has, index) = <a href="../../../../../../move-stdlib/docs/Vector.md#0x1_Vector_index_of">Vector::index_of</a>(&account_domains.domains, &diem_id_domain); <b>if</b> (has) { <a href="../../../../../../move-stdlib/docs/Vector.md#0x1_Vector_remove">Vector::remove</a>(&<b>mut</b> account_domains.domains, index); } <b>else</b> { <b>abort</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_invalid_argument">Errors::invalid_argument</a>(<a href="DiemId.md#0x1_DiemId_EDOMAIN_NOT_FOUND">EDOMAIN_NOT_FOUND</a>) }; <a href="../../../../../../move-stdlib/docs/Event.md#0x1_Event_emit_event">Event::emit_event</a>( &<b>mut</b> borrow_global_mut<<a href="DiemId.md#0x1_DiemId_DiemIdDomainManager">DiemIdDomainManager</a>>(@TreasuryCompliance).diem_id_domain_events, <a href="DiemId.md#0x1_DiemId_DiemIdDomainEvent">DiemIdDomainEvent</a> { removed: <b>true</b>, domain: diem_id_domain, address: address, }, ); } </code></pre> </details> <details> <summary>Specification</summary> <pre><code><b>include</b> <a href="DiemId.md#0x1_DiemId_RemoveDiemIdDomainAbortsIf">RemoveDiemIdDomainAbortsIf</a>; <b>include</b> <a href="DiemId.md#0x1_DiemId_RemoveDiemIdDomainEnsures">RemoveDiemIdDomainEnsures</a>; <b>include</b> <a href="DiemId.md#0x1_DiemId_RemoveDiemIdDomainEmits">RemoveDiemIdDomainEmits</a>; </code></pre><a name="0x1_DiemId_RemoveDiemIdDomainAbortsIf"></a>
<pre><code><b>schema</b> <a href="DiemId.md#0x1_DiemId_RemoveDiemIdDomainAbortsIf">RemoveDiemIdDomainAbortsIf</a> { tc_account: signer; address: address; domain: vector<u8>; <b>let</b> domains = <b>global</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(address).domains; <b>include</b> <a href="Roles.md#0x1_Roles_AbortsIfNotTreasuryCompliance">Roles::AbortsIfNotTreasuryCompliance</a>{account: tc_account}; <b>include</b> <a href="DiemId.md#0x1_DiemId_CreateDiemIdDomainAbortsIf">CreateDiemIdDomainAbortsIf</a>; <b>aborts_if</b> !<b>exists</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(address) <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_NOT_PUBLISHED">Errors::NOT_PUBLISHED</a>; <b>aborts_if</b> !<a href="DiemId.md#0x1_DiemId_tc_domain_manager_exists">tc_domain_manager_exists</a>() <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_NOT_PUBLISHED">Errors::NOT_PUBLISHED</a>; <b>aborts_if</b> !contains(domains, <a href="DiemId.md#0x1_DiemId_DiemIdDomain">DiemIdDomain</a> { domain }) <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_INVALID_ARGUMENT">Errors::INVALID_ARGUMENT</a>; } </code></pre><a name="0x1_DiemId_RemoveDiemIdDomainEnsures"></a>
<pre><code><b>schema</b> <a href="DiemId.md#0x1_DiemId_RemoveDiemIdDomainEnsures">RemoveDiemIdDomainEnsures</a> { address: address; domain: vector<u8>; <b>let</b> post domains = <b>global</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(address).domains; <b>ensures</b> !contains(domains, <a href="DiemId.md#0x1_DiemId_DiemIdDomain">DiemIdDomain</a> { domain }); } </code></pre><a name="0x1_DiemId_RemoveDiemIdDomainEmits"></a>
<pre><code><b>schema</b> <a href="DiemId.md#0x1_DiemId_RemoveDiemIdDomainEmits">RemoveDiemIdDomainEmits</a> { tc_account: signer; address: address; domain: vector<u8>; <b>let</b> handle = <b>global</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomainManager">DiemIdDomainManager</a>>(@TreasuryCompliance).diem_id_domain_events; <b>let</b> msg = <a href="DiemId.md#0x1_DiemId_DiemIdDomainEvent">DiemIdDomainEvent</a> { removed: <b>true</b>, domain: <a href="DiemId.md#0x1_DiemId_DiemIdDomain">DiemIdDomain</a> { domain }, address, }; emits msg <b>to</b> handle; } </code></pre> </details><a name="0x1_DiemId_has_diem_id_domain"></a>
has_diem_id_domain<a name="0x1_DiemId_HasDiemIdDomainAbortsIf"></a>
<pre><code><b>schema</b> <a href="DiemId.md#0x1_DiemId_HasDiemIdDomainAbortsIf">HasDiemIdDomainAbortsIf</a> { addr: address; domain: vector<u8>; <b>include</b> <a href="DiemId.md#0x1_DiemId_CreateDiemIdDomainAbortsIf">CreateDiemIdDomainAbortsIf</a>; <b>aborts_if</b> !<b>exists</b><<a href="DiemId.md#0x1_DiemId_DiemIdDomains">DiemIdDomains</a>>(addr) <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_NOT_PUBLISHED">Errors::NOT_PUBLISHED</a>; } </code></pre> </details><a name="0x1_DiemId_tc_domain_manager_exists"></a>
tc_domain_manager_exists