|
885 | 885 | </ul> |
886 | 886 | </nav> |
887 | 887 |
|
| 888 | +</li> |
| 889 | + |
| 890 | + <li class="md-nav__item"> |
| 891 | + <a href="#vehicle-wallet-roles" class="md-nav__link"> |
| 892 | + <span class="md-ellipsis"> |
| 893 | + |
| 894 | + Vehicle Wallet Roles |
| 895 | + |
| 896 | + </span> |
| 897 | + </a> |
| 898 | + |
| 899 | + <nav class="md-nav" aria-label="Vehicle Wallet Roles"> |
| 900 | + <ul class="md-nav__list"> |
| 901 | + |
| 902 | + <li class="md-nav__item"> |
| 903 | + <a href="#session-authority" class="md-nav__link"> |
| 904 | + <span class="md-ellipsis"> |
| 905 | + |
| 906 | + Session Authority |
| 907 | + |
| 908 | + </span> |
| 909 | + </a> |
| 910 | + |
| 911 | +</li> |
| 912 | + |
| 913 | + <li class="md-nav__item"> |
| 914 | + <a href="#payment-decision-service" class="md-nav__link"> |
| 915 | + <span class="md-ellipsis"> |
| 916 | + |
| 917 | + Payment Decision Service |
| 918 | + |
| 919 | + </span> |
| 920 | + </a> |
| 921 | + |
| 922 | +</li> |
| 923 | + |
| 924 | + <li class="md-nav__item"> |
| 925 | + <a href="#why-two-roles" class="md-nav__link"> |
| 926 | + <span class="md-ellipsis"> |
| 927 | + |
| 928 | + Why Two Roles? |
| 929 | + |
| 930 | + </span> |
| 931 | + </a> |
| 932 | + |
| 933 | +</li> |
| 934 | + |
| 935 | + </ul> |
| 936 | + </nav> |
| 937 | + |
888 | 938 | </li> |
889 | 939 |
|
890 | 940 | <li class="md-nav__item"> |
|
1539 | 1589 | </ul> |
1540 | 1590 | </nav> |
1541 | 1591 |
|
| 1592 | +</li> |
| 1593 | + |
| 1594 | + <li class="md-nav__item"> |
| 1595 | + <a href="#vehicle-wallet-roles" class="md-nav__link"> |
| 1596 | + <span class="md-ellipsis"> |
| 1597 | + |
| 1598 | + Vehicle Wallet Roles |
| 1599 | + |
| 1600 | + </span> |
| 1601 | + </a> |
| 1602 | + |
| 1603 | + <nav class="md-nav" aria-label="Vehicle Wallet Roles"> |
| 1604 | + <ul class="md-nav__list"> |
| 1605 | + |
| 1606 | + <li class="md-nav__item"> |
| 1607 | + <a href="#session-authority" class="md-nav__link"> |
| 1608 | + <span class="md-ellipsis"> |
| 1609 | + |
| 1610 | + Session Authority |
| 1611 | + |
| 1612 | + </span> |
| 1613 | + </a> |
| 1614 | + |
| 1615 | +</li> |
| 1616 | + |
| 1617 | + <li class="md-nav__item"> |
| 1618 | + <a href="#payment-decision-service" class="md-nav__link"> |
| 1619 | + <span class="md-ellipsis"> |
| 1620 | + |
| 1621 | + Payment Decision Service |
| 1622 | + |
| 1623 | + </span> |
| 1624 | + </a> |
| 1625 | + |
| 1626 | +</li> |
| 1627 | + |
| 1628 | + <li class="md-nav__item"> |
| 1629 | + <a href="#why-two-roles" class="md-nav__link"> |
| 1630 | + <span class="md-ellipsis"> |
| 1631 | + |
| 1632 | + Why Two Roles? |
| 1633 | + |
| 1634 | + </span> |
| 1635 | + </a> |
| 1636 | + |
| 1637 | +</li> |
| 1638 | + |
| 1639 | + </ul> |
| 1640 | + </nav> |
| 1641 | + |
1542 | 1642 | </li> |
1543 | 1643 |
|
1544 | 1644 | <li class="md-nav__item"> |
@@ -1750,6 +1850,33 @@ <h3 id="layer-3-signedpaymentauthorization-spa">Layer 3: SignedPaymentAuthorizat |
1750 | 1850 | <li><strong>Intent hash</strong> — SPA binds to a canonical SettlementIntent</li> |
1751 | 1851 | <li><strong>Tamper resistance</strong> — SettlementIntent and final settlement must match the signed authorization</li> |
1752 | 1852 | </ul> |
| 1853 | +<h2 id="vehicle-wallet-roles">Vehicle Wallet Roles</h2> |
| 1854 | +<p>In an autonomous deployment, the vehicle wallet plays <strong>two distinct roles</strong> in the MPCP authorization pipeline.</p> |
| 1855 | +<h3 id="session-authority">Session Authority</h3> |
| 1856 | +<p>The wallet creates and signs the <strong>SignedBudgetAuthorization (SBA)</strong> before the session begins. This establishes the session-level spending envelope:</p> |
| 1857 | +<ul> |
| 1858 | +<li>Sets <code>maxAmountMinor</code> — the total spend ceiling for the session</li> |
| 1859 | +<li>Sets <code>destinationAllowlist</code> — the permitted payees</li> |
| 1860 | +<li>Binds to the PolicyGrant via <code>grantId</code></li> |
| 1861 | +</ul> |
| 1862 | +<p>The SBA is signed with the wallet's SBA key (<code>MPCP_SBA_SIGNING_PRIVATE_KEY_PEM</code>). Verifiers check this signature to confirm the budget was set by a trusted session authority.</p> |
| 1863 | +<h3 id="payment-decision-service">Payment Decision Service</h3> |
| 1864 | +<p>For each payment request within the session, the wallet evaluates the request against the loaded policy chain and, if approved, creates and signs a <strong>SignedPaymentAuthorization (SPA)</strong>:</p> |
| 1865 | +<ul> |
| 1866 | +<li>Assigns a unique <code>decisionId</code></li> |
| 1867 | +<li>Commits to the specific amount, destination, and asset</li> |
| 1868 | +<li>Computes and binds an <code>intentHash</code> to a canonical SettlementIntent</li> |
| 1869 | +<li>Signs with the wallet's SPA key (<code>MPCP_SPA_SIGNING_PRIVATE_KEY_PEM</code>)</li> |
| 1870 | +</ul> |
| 1871 | +<p>This decision is made <strong>locally</strong> — no central approval API is contacted. The SPA is a cryptographic proof that the wallet approved this specific payment within the authorized budget.</p> |
| 1872 | +<h3 id="why-two-roles">Why Two Roles?</h3> |
| 1873 | +<p>Separating session authority from payment decisions allows fleet operators to:</p> |
| 1874 | +<ul> |
| 1875 | +<li>Pre-authorize a spending envelope (SBA) before the vehicle enters service</li> |
| 1876 | +<li>Let the vehicle make individual payment decisions (SPA) locally within that envelope</li> |
| 1877 | +<li>Give verifiers a complete, self-contained authorization chain to validate</li> |
| 1878 | +</ul> |
| 1879 | +<hr /> |
1753 | 1880 | <h2 id="wallet-integration">Wallet Integration</h2> |
1754 | 1881 | <p>A machine wallet integrates MPCP by performing checks <em>before</em> signing an SPA.</p> |
1755 | 1882 | <h3 id="decision-flow">Decision Flow</h3> |
|
0 commit comments