upload_code
Call v334 → current #3Uploads WASM contract code without instantiating a contract.
View calls on chainCall Workflow
Click items to navigate. Pan and zoom to explore.
The Big Picture
Sometimes you want to upload code without immediately creating a contract - maybe for governance approval, or to let others instantiate, or to calculate addresses before deployment. This call stores the code on-chain, returning its hash for later use.
Why This Matters
Separating upload from instantiation gives flexibility. Upload code, have it audited, then instantiate later. Or upload once and let a factory contract create instances. Or calculate your contract address before it exists (counterfactual instantiation).
Example Scenario
You want to propose a contract upgrade via governance. Call upload_code with the new WASM. CodeStored event fires with code_hash=0xdef.... Now governance can vote on calling set_code with that hash, without you holding the code bytes in memory during the vote.
Common Questions
- How much deposit is required?
- DepositPerByte * code_size. Larger code = larger deposit. The deposit is returned when code is removed.
- Can anyone instantiate my uploaded code?
- Yes, code is public. Anyone with the code_hash can call instantiate. This is by design - think of code as a template, instances as deployments.
- What's determinism mode?
- Controls whether code must be deterministic (same inputs = same outputs). Most contracts use deterministic mode. Non-deterministic allows randomness but limits some features.
Use Cases
- Pre-upload code before instantiation
- Share code for others to instantiate
- Separate upload and instantiation for better control
- Prepare code for deterministic address calculation
From Chain Metadata
Upload new `code` without instantiating a contract from it. If the code does not already exist a deposit is reserved from the caller and unreserved only when [`Self::remove_code`] is called. The size of the reserve depends on the size of the supplied `code`. If the code already exists in storage it will still return `Ok` and upgrades the in storage version to the current [`InstructionWeights::version`](InstructionWeights). `determinism`: If this is set to any other value but [`Determinism::Enforced`] then the only way to use this code is to delegate call into it from an offchain execution. Set to [`Determinism::Enforced`] if in doubt.
Input Parameters
| # | Name | Type | Description |
|---|---|---|---|
| 0 | code | Vec<u8> Vec | code (Vec<u8>) |
| 1 | storage_deposit_limit | Option Option<<BalanceOf<T> as codec::HasCompact>::Type> | storage_deposit_limit (Option) |
| 2 | determinism | Determinism | determinism (Determinism) |
Permissions
Permission data inferred from metadata. May be incomplete.
Requirements
- Caller has sufficient balance for code storage deposit
- WASM code is valid and passes validation
- Code size is within MaxCodeLen limit
- Code hash is not already stored (unless determinism mode differs)
Effects
Events Emitted
Storage Modified
Postconditions
- Code stored in PristineCode
- CodeInfoOf populated with metadata
- CodeStored event emitted
- Storage deposit held for code
Side Effects
- Deposit locked until code is removed
- Code available for any account to instantiate
Code Examples
// ----------------------------------------------------------------------
// HEADS UP: 1 arg below has a complex type with no usable default.
// Look for `undefined as any` and replace it with real value
// before running — the snippet compiles, but will fail at runtime as-is.
// ----------------------------------------------------------------------
import { createClient, Binary } from "polkadot-api";
import { getWsProvider } from "polkadot-api/ws";
import { sub } from "@polkadot-api/descriptors"; // generated by: npx papi add sub -w wss://entrypoint-finney.opentensor.ai:443
const client = createClient(getWsProvider("wss://entrypoint-finney.opentensor.ai:443"));
const api = client.getTypedApi(sub);
// Build upload_code call (typed, named args)
const code = Binary.fromOpaque(new Uint8Array(0));
const storage_deposit_limit = undefined;
const determinism = undefined as any /* Determinism — replace with real value */;
const tx = api.tx.Contracts.upload_code({
code,
storage_deposit_limit,
determinism,
});Runtime Info
- Pallet Index
- 29
- Call Index
- 3
- First Version
- v334
- Current Version
- v411