> For the complete documentation index, see [llms.txt](https://docs.bitsandblocks.tech/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bitsandblocks.tech/readme.md).

# Move -> Soroban: the differential cheat sheet

For Aptos Move developers shipping Soroban contracts. Each entry is composed in the following structure:

* What it is in Move
* What it is in Soroban
* Where the analogy breaks.
* The breakage is the payload.

**Legend:**

* ⚠ **FALSE FRIEND**: your Move instinct produces compiling, working-looking Soroban code that is wrong.
* ∅ **NO ANALOGUE**: nothing on the other side, don't force one.
* 🔧 **DIRECT SWAP**: mechanical rename, low risk.

> **Verified against `soroban-sdk` 27.0.6 · rustc 1.91.1 · Aptos Move 9.4.0** Every Soroban snippet in this document compiles and, where it asserts behaviour, runs green, see [Verification](/reference/12-verification.md). Move snippets are illustrative and not compiled.

**Version note.** `soroban-sdk` major = Stellar protocol version (SDK 27 ↔ protocol 27). Network limits and TTL floors are set by validator vote; the numbers in §6.4 match `InvocationResourceLimits::mainnet()` as baked into SDK 27.0.6 (a snapshot dated 2026-07-10 — the SDK itself notes these are hardcoded and require an SDK update to refresh). Check live values before relying on them: [Stellar Lab network limits](https://lab.stellar.org/network-limits) · `stellar network settings --network mainnet` · [crates.io/soroban-sdk](https://crates.io/crates/soroban-sdk).

***

## Quick map

<table><thead><tr><th width="42.7421875">#</th><th>Concept</th><th width="143">Move</th><th>Soroban</th><th>§</th><th width="80">Flag</th></tr></thead><tbody><tr><td>1</td><td>Transaction authority</td><td><code>&#x26;signer</code></td><td><code>Address</code> param + <code>addr.require_auth()</code></td><td><a href="/pages/KTMle7khPaauN5pSAami#11-signer--address--require_auth">1.1</a></td><td>⚠</td></tr><tr><td>2</td><td>Caller identity</td><td><code>signer::address_of(s)</code></td><td>the <code>Address</code> param itself</td><td><a href="/pages/KTMle7khPaauN5pSAami#11-signer--address--require_auth">1.1</a></td><td>🔧</td></tr><tr><td>3</td><td>Multi-party authorization</td><td>multi-agent tx (N signers)</td><td>N auth entries in one tx</td><td><a href="/pages/KTMle7khPaauN5pSAami#12-multi-agent-transactions--multiple-auth-entries">1.2</a></td><td></td></tr><tr><td>4</td><td>Programmatic signing</td><td>resource account + <code>SignerCapability</code></td><td>custom account (<code>__check_auth</code>) / invoker auth</td><td><a href="/pages/KTMle7khPaauN5pSAami#14-resource-accounts--signercapability--custom-accounts--invoker-auth">1.4</a></td><td></td></tr><tr><td>5</td><td>Module-to-module access</td><td><code>friend</code> / <code>public(friend)</code></td><td>∅ — auth checks replace visibility</td><td><a href="/pages/KTMle7khPaauN5pSAami#15-friend-visibility----auth-replaces-visibility">1.5</a></td><td>∅</td></tr><tr><td>6</td><td>Delegated authority</td><td>capability structs (<code>MintCap</code>, <code>AdminCap</code>…)</td><td>role <code>Address</code> in storage + <code>require_auth</code></td><td><a href="/pages/WSkSCYkpinhh4c5NceDz#21-capability-structs--role-addresses--require_auth-">2.1</a></td><td>⚠</td></tr><tr><td>7</td><td>Composable asset primitive</td><td>Aptos object model (<code>Object&#x3C;T></code>, refs)</td><td>∅ — keyed entries or factory instances</td><td><a href="/pages/WSkSCYkpinhh4c5NceDz#22-the-aptos-object-model----decomposition">2.2</a></td><td>∅</td></tr><tr><td>8</td><td>Enforced obligation</td><td>hot potato (no-ability struct)</td><td>∅ — runtime checks in one invocation</td><td><a href="/pages/WSkSCYkpinhh4c5NceDz#23-hot-potato--">2.3</a></td><td>∅</td></tr><tr><td>9</td><td>Storage operations</td><td><code>move_to</code> / <code>borrow_global</code> / <code>exists</code> / <code>move_from</code></td><td><code>storage().{set,get,has,remove,update}</code></td><td><a href="/pages/Qb5YZYecq3a9JirpCoV0#31-global-storage-operators--envstorage">3.1</a></td><td>⚠</td></tr><tr><td>10</td><td>State ownership</td><td>resources under user accounts</td><td>all state under the contract</td><td><a href="/pages/Qb5YZYecq3a9JirpCoV0#32-ownership-inversion-state-lives-under-the-contract">3.2</a></td><td></td></tr><tr><td>11</td><td>Mutable state access</td><td><code>borrow_global_mut</code> writes through</td><td><code>get</code> returns a copy; write only on <code>set</code></td><td><a href="/pages/Qb5YZYecq3a9JirpCoV0#33-get-returns-a-copy--false-friend">3.3</a></td><td>⚠</td></tr><tr><td>12</td><td>Access declaration</td><td><code>acquires</code> (explicit or inferred)</td><td>transaction footprint, from simulation</td><td><a href="/pages/Qb5YZYecq3a9JirpCoV0#34-acquires--footprints-and-parallelism">3.4</a></td><td></td></tr><tr><td>13</td><td>State lifetime</td><td>state persists once paid</td><td>durability tiers + TTL + archival</td><td><a href="/pages/Qb5YZYecq3a9JirpCoV0#35-storage-durability-ttl-archival--">3.5</a></td><td>∅ ⚠</td></tr><tr><td>14</td><td>Type-level guarantees</td><td>abilities <code>key/store/copy/drop</code></td><td>∅ — every value is plain data</td><td><a href="/pages/thVQmBtPojpK1NMCoB8E#41-abilities----the-headline-difference">4.1</a></td><td>∅ ⚠</td></tr><tr><td>15</td><td>Asset representation</td><td><code>Coin&#x3C;T></code> value in hand</td><td>∅ value objects — funds move only via token calls</td><td><a href="/pages/thVQmBtPojpK1NMCoB8E#42-no-value-objects-funds-never-pass-through-your-code">4.2</a></td><td>⚠</td></tr><tr><td>16</td><td>Type-level asset segregation</td><td>generic entry fns, phantom params</td><td>monomorphic ABI; asset identity = <code>Address</code></td><td><a href="/pages/thVQmBtPojpK1NMCoB8E#43-generics--monomorphic-abi-asset--address-value">4.3</a></td><td>⚠</td></tr><tr><td>17</td><td>Data modelling</td><td>Move 2 enums / positional structs</td><td><code>#[contracttype]</code> enums / tuple structs</td><td><a href="/pages/thVQmBtPojpK1NMCoB8E#44-structs-enums-receiver-functions-">4.4</a></td><td>🔧</td></tr><tr><td>18</td><td>Numeric semantics</td><td>signed types since Move 2.3, but amounts are <code>u64</code></td><td>token amount <code>i128</code> is <strong>signed</strong></td><td><a href="/pages/thVQmBtPojpK1NMCoB8E#45-integers-signedness--overflow--false-friend-2">4.5</a></td><td>⚠</td></tr><tr><td>19</td><td>Code deployment unit</td><td>module published at an address</td><td>Wasm hash (upload) + instances (deploy)</td><td><a href="/pages/aFlWQauhuSfZV4y6UCms#51-module--wasm-hash--contract-instance">5.1</a></td><td></td></tr><tr><td>20</td><td>Dependency linking</td><td>compile-time <code>use other_module</code></td><td>runtime client to an address held in storage</td><td><a href="/pages/aFlWQauhuSfZV4y6UCms#52-cross-contract-compile-time-linking--runtime-dispatch--false-friend">5.2</a></td><td>⚠</td></tr><tr><td>21</td><td>Function visibility</td><td><code>entry</code> / <code>public</code> / private</td><td>one exported namespace, all-public</td><td><a href="/pages/aFlWQauhuSfZV4y6UCms#53-visibility-one-flat-exported-namespace">5.3</a></td><td></td></tr><tr><td>22</td><td>Initialization</td><td><code>init_module(&#x26;signer)</code></td><td><code>__constructor(env, args…)</code></td><td><a href="/pages/aFlWQauhuSfZV4y6UCms#54-init_module--__constructor--and-strictly-better">5.4</a></td><td>🔧</td></tr><tr><td>23</td><td>Upgradeability</td><td>upgrade policy in <code>Move.toml</code></td><td>upgrade entry point compiled in — or immutable by omission</td><td><a href="/pages/aFlWQauhuSfZV4y6UCms#55-upgrade-policy--compiled-in-upgrade-fn">5.5</a></td><td></td></tr><tr><td>24</td><td>Transaction composition</td><td>scripts compose calls in one tx</td><td>exactly one invocation per tx</td><td><a href="/pages/aFlWQauhuSfZV4y6UCms#56-transaction-shape-one-invocation-per-transaction-">5.6</a></td><td>∅</td></tr><tr><td>25</td><td>Failure signalling</td><td><code>abort</code> / <code>assert!</code> codes</td><td><code>#[contracterror]</code> + <code>Result</code> / <code>panic_with_error!</code></td><td><a href="/pages/1QhPf2ZagvL4s2xLGQjX#61-abort-codes--contracterror">6.1</a></td><td></td></tr><tr><td>26</td><td>Failure propagation</td><td>abort always propagates</td><td>callee errors catchable via <code>try_</code> clients</td><td><a href="/pages/1QhPf2ZagvL4s2xLGQjX#62-catchable-callee-failures-">6.2</a></td><td>∅</td></tr><tr><td>27</td><td>Overflow safety</td><td>overflow aborts, always</td><td>Rust semantics behind a profile flag</td><td><a href="/pages/thVQmBtPojpK1NMCoB8E#45-integers-signedness--overflow--false-friend-2">4.5</a></td><td>⚠</td></tr><tr><td>28</td><td>Call dispatch</td><td>static dispatch, reentrancy impossible</td><td>dynamic dispatch, host blocks reentrancy</td><td><a href="/pages/1QhPf2ZagvL4s2xLGQjX#63-dispatch-and-reentrancy">6.3</a></td><td></td></tr><tr><td>29</td><td>Metering model</td><td>gas schedule, no declaration</td><td>multidimensional <strong>declared</strong> resources</td><td><a href="/pages/1QhPf2ZagvL4s2xLGQjX#64-gas--declared-resources-and-hard-ceilings">6.4</a></td><td></td></tr><tr><td>30</td><td>Off-chain observability</td><td><code>#[event]</code> + <code>event::emit</code></td><td><code>#[contractevent]</code>, topics vs data, ~7-day retention</td><td><a href="/pages/swEEbrCf2GzSWkNk6cDw">7</a></td><td>⚠</td></tr><tr><td>31</td><td>Fungible token standard</td><td>Coin / Fungible Asset standards</td><td>SEP-41 + Stellar Asset Contract</td><td><a href="/pages/f1nfcAI8GXkk6mhv3H1f#81-fungible-coinfa--sep-41--sac">8.1</a></td><td>⚠</td></tr><tr><td>32</td><td>Non-fungible token standard</td><td>Digital Asset standard (token objects + refs)</td><td>SEP-50 (<strong>draft</strong>) — and no SAC-equivalent trustable tier</td><td><a href="/pages/f1nfcAI8GXkk6mhv3H1f#82-non-fungible-digital-assets--sep-50">8.2</a></td><td>⚠</td></tr><tr><td>33</td><td>Unit testing</td><td><code>#[test(a = @0x1)]</code>, <code>expected_failure</code></td><td><code>Env</code> testutils, <code>mock_all_auths</code></td><td><a href="/pages/UBxr3HuM2GyrCrqkecLX">9</a></td><td>⚠</td></tr><tr><td>34</td><td>Formal verification</td><td>Move Prover (first-party, in-language <code>spec {}</code>)</td><td>no first-party tool — third-party Certora Sunbeam, Komet</td><td><a href="/pages/UBxr3HuM2GyrCrqkecLX">9</a></td><td>⚠</td></tr><tr><td>35</td><td>Read-only queries</td><td><code>#[view]</code> + <code>/view</code> endpoint</td><td>∅ attribute — any fn via <code>simulateTransaction</code>; view is a call mode</td><td><a href="/pages/aFlWQauhuSfZV4y6UCms#57-view-functions--any-function-invoked-in-simulation">5.7</a></td><td>∅ ⚠</td></tr><tr><td>36</td><td>Customizing token behaviour</td><td>static dispatch + DFA escape hatch (AIP-73)</td><td>dynamic dispatch is the <em>only</em> mechanism; the token is the hook</td><td><a href="/pages/aFlWQauhuSfZV4y6UCms#58-dispatchable-fas-aip-73--dynamic-dispatch--the-only-dispatch-there-is">5.8</a></td><td>⚠</td></tr><tr><td>37</td><td>Event access on-chain</td><td>reading emitted events on-chain</td><td>∅ on both — write-only in production, readable in tests only</td><td><a href="/pages/swEEbrCf2GzSWkNk6cDw#71-reading-events-on-chain---on-both-chains">7.1</a></td><td>∅ ⚠</td></tr></tbody></table>

***

## Contents

1. [Identity & authorization](/the-differential/01-identity-and-authorization.md)
2. [Capabilities & the object model](/the-differential/02-capabilities-and-the-object-model.md)
3. [State & storage](/the-differential/03-state-and-storage.md)
4. [Types & abilities](/the-differential/04-types-and-abilities.md)
5. [Modules vs. contracts](/the-differential/05-modules-vs-contracts.md)
6. [Execution semantics](/the-differential/06-execution-semantics.md)
7. [Events](/the-differential/07-events.md)
8. [Tokens](/the-differential/08-tokens.md)
9. [Testing & assurance](/practice/09-testing-and-assurance.md)
10. [Toolchain quick map](/practice/10-toolchain.md)
11. [Porting reflexes — the grep-able checklist](/practice/11-porting-reflexes.md)
12. [Verification](/reference/12-verification.md)
13. [Primary sources](/reference/13-primary-sources.md)

***

## Contributing

Corrections are the most valuable contribution here — a wrong mapping is worse than a missing one. Missing Move concepts are equally welcome as issues even without an answer. See [CONTRIBUTING.md](/reference/contributing.md); the one hard rule is that Soroban snippets must compile.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.bitsandblocks.tech/readme.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
