---
title: VERI
description: VERI is Veritaseum’s ERC-20 token on Ethereum mainnet, with a fixed supply of 100,000,000, in a contract deployed on 23 Apr 2017.
url: https://veri.how/veri
area: veri
kind: collection
updated: 2026-10-19T14:31:08Z
author: Patryk Dwórznik
license: CC BY 4.0
---
# VERI
VERI is Veritaseum’s ERC-20 token on Ethereum mainnet, with a fixed supply of 100,000,000, in a contract deployed on 23 Apr 2017.
## Facts
| Fact | Value |
| --- | --- |
| Address | [0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Chain | [Ethereum (eip155:1)](https://etherscan.io) |
| Standard | [ERC-20](https://eips.ethereum.org/EIPS/eip-20) |
| Symbol | [VERI](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Decimals | [18](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Deployed | [Block 3,586,472 · 23 Apr 2017](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc) |
| Owner | [0x82c48875C17EE5812f909a9d75C0F64f7A8719FE](https://etherscan.io/address/0x82c48875c17ee5812f909a9d75c0f64f7a8719fe) |
| Source | [Verified on Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Transactions | [All transactions](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| ABI | [veri.json](https://veri.how/abi/veri.json) |
| Last verified | 13 Oct 2026 |
The contract has no proxy and cannot be upgraded. Its on-chain name is `Veritaseum`, its symbol `VERI`, and it has 18 decimals.
The supply, 100,000,000 VERI, was set in the constructor. The [verified source](#veri-source) has no mint, burn or pause function, so it cannot change.
Besides the standard ERC-20 functions, the contract has `owner` and `transferOwnership`. Two differences from later ERC-20 contracts matter to indexers: the initial allocation emitted no `Transfer` event, and a failing call throws instead of returning `false`.
## Articles
- [VERI token contract 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374](https://veri.how/veri/contract.md): VERI is an ERC-20 token at 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374 on Ethereum mainnet, deployed on 23 Apr 2017 with a fixed supply of 100,000,000 and no proxy, so the code that runs today is the code deployed then.
- [VERI supply is fixed at 100,000,000](https://veri.how/veri/supply.md): The VERI contract sets totalSupply to 100,000,000 tokens (10^26 base units at 18 decimals) once, when it is deployed, and has no mint, burn or pause function, so the supply cannot change.
- [How VERI differs from a modern ERC-20](https://veri.how/veri/erc20-quirks.md): VERI is 2017 code whose initial allocation and ownership transfer emit no Transfer event, whose decimals() returns uint256, whose failed transfers throw instead of returning false, which has no zero-address checks, and whose transferOwnership moves the owner's whole balance to the new owner, as its one call on 24 Apr 2017 did with all 100,000,000 VERI.
- [Check a VERI balance](https://veri.how/veri/check-balance.md): Call balanceOf(address) on the VERI contract through a public Ethereum JSON-RPC endpoint with curl and divide the result by 10^18; read the balance rather than summing Transfer logs, which miss two balance changes.
---
title: VERI token contract 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374
description: VERI is an ERC-20 token at 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374 on Ethereum mainnet, deployed on 23 Apr 2017 with a fixed supply of 100,000,000 and no proxy, so the code that runs today is the code deployed then.
url: https://veri.how/veri/contract
area: veri
kind: reference
updated: 2026-10-15T00:00:00Z
author: Patryk Dwórznik
license: CC BY 4.0
contracts:
- id: eip155:1:0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374
name: Veritaseum
verified:
date: 2026-10-13
sources:
- title: VERI verified source, Etherscan
url: https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code
- title: VERI contract creation transaction, Etherscan
url: https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc
- title: VERI contract, Blockscout
url: https://eth.blockscout.com/address/0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374?tab=contract
---
# VERI token contract 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374
VERI is an ERC-20 token at 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374 on Ethereum mainnet, deployed on 23 Apr 2017 with a fixed supply of 100,000,000 and no proxy, so the code that runs today is the code deployed then.
## Facts
| Fact | Value |
| --- | --- |
| Address | [0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Chain | [Ethereum (eip155:1)](https://etherscan.io) |
| Standard | [ERC-20](https://eips.ethereum.org/EIPS/eip-20) |
| Symbol | [VERI](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Decimals | [18](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Deployed | [Block 3,586,472 · 23 Apr 2017](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc) |
| Owner | [0x82c48875C17EE5812f909a9d75C0F64f7A8719FE](https://etherscan.io/address/0x82c48875c17ee5812f909a9d75c0f64f7a8719fe) |
| Source | [Verified on Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Transactions | [All transactions](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| ABI | [veri.json](https://veri.how/abi/veri.json) |
| Last verified | 13 Oct 2026 |
The on-chain name of the token is `Veritaseum` and its symbol is `VERI`. The Fact sheet above comes from the contract's verified source and its deployment transaction; the sections below say where each value comes from and how to read it yourself.
## Deployment
The contract was created in block [3,586,472](https://etherscan.io/block/3586472) on 23 Apr 2017 at 12:45:03 UTC by transaction [`0xfda7aad5…3a6fc`](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc). The sender, 0x44CAb6F6DC7045FD4AcD1d0f3d09Fc7a83004bd3, is an externally owned account. The constructor takes no arguments: it gives the whole supply to the sender and emits no event (the [transaction](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc) has no logs).
## Verified source
The source is one Solidity file of about 150 lines, `pragma solidity ^0.4.8`, compiled with v0.4.8+commit.60cc1668 and the optimizer on at 200 runs. Etherscan reports an [exact match](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) and Blockscout shows it as [verified](https://eth.blockscout.com/address/0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374?tab=contract). It declares five contracts and no libraries:
| Contract | What it holds |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `Ownable` | `address public owner`, the `onlyOwner` modifier and `transferOwnership` |
| `SafeMath` | `safeAdd`, `safeSub`, `safeMul`, `safeDiv`, `max64`, `min64`, `max256`, `min256` and a custom `assert` that calls `throw` |
| `ERC20` | the abstract interface: `totalSupply`, the five functions and the `Transfer` and `Approval` events |
| `StandardToken` | the `balances` and `allowed` mappings and the five ERC-20 functions |
| `VeritaseumToken` | `name`, `symbol`, `decimals`, `totalSupply`, the constructor and an overriding `transferOwnership` |
The constants, as written in `VeritaseumToken`:
```solidity
string public name = "Veritaseum";
string public symbol = "VERI";
uint public decimals = 18;
uint public totalSupply = 100000000 ether;
```
`decimals` is declared as `uint`, so `decimals()` returns a `uint256` rather than the `uint8` later tokens use. The value is 18 either way. See [How VERI differs from a modern ERC-20](https://veri.how/veri/erc20-quirks.md) for the other places where this 2017 code departs from today's conventions.
## Not upgradeable
There is no proxy in front of the contract and no `delegatecall` in it ([Blockscout](https://eth.blockscout.com/address/0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374?tab=contract) lists no proxy type or implementation). The bytecode deployed on 23 Apr 2017 is the bytecode that runs today, and nothing in it can be changed.
## Functions and events
The ABI, served at [/abi/veri.json](https://veri.how/abi/veri.json), has these entries and nothing else:
| Function | Selector | Who can call it |
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | --------------------- |
| `name()`, `symbol()`, `decimals()`, `totalSupply()` | `0x06fdde03`, `0x95d89b41`, `0x313ce567`, `0x18160ddd` | anyone, read-only |
| `balanceOf(address)`, `allowance(address,address)` | `0x70a08231`, `0xdd62ed3e` | anyone, read-only |
| `owner()` | `0x8da5cb5b` | anyone, read-only |
| `transfer(address,uint256)`, `transferFrom(address,address,uint256)`, `approve(address,uint256)` | `0xa9059cbb`, `0x23b872dd`, `0x095ea7b3` | any holder or spender |
| `transferOwnership(address)` | `0xf2fde38b` | the owner only |
The events are `Transfer(address,address,uint256)` and `Approval(address,address,uint256)`. There is no mint, burn, pause, freeze or blacklist function, and no event for a change of owner. The owner's one privilege, `transferOwnership`, is described in [How VERI differs from a modern ERC-20](https://veri.how/veri/erc20-quirks.md#transferownership-moves-the-owners-whole-balance).
## Owner
`owner()` returns 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE, an externally owned account, and has since block [3,589,599](https://etherscan.io/block/3589599) on 24 Apr 2017, when the deployer called `transferOwnership` ([transaction](https://etherscan.io/tx/0x5d7d007e7dbf534a2983880be117100691cf351fdc45d6adb2249c6fd3a8d4b1)).
## Check it yourself
Each command is an [`eth_call`](https://ethereum.org/developers/docs/apis/json-rpc/#eth-call) to a public Ethereum JSON-RPC endpoint; swap in `https://eth.drpc.org` if the first one is busy. The result is a 32-byte word (for strings, an ABI-encoded string). The [JSON-RPC API](https://ethereum.org/developers/docs/apis/json-rpc/) reference describes the request format and the other methods.
```sh
# name(): the result ends in "Veritaseum" in hex (5665726974617365756d)
curl -s https://ethereum-rpc.publicnode.com -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x06fdde03"},"latest"]}'
# symbol(): the result ends in "VERI" in hex (56455249)
curl -s https://ethereum-rpc.publicnode.com -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x95d89b41"},"latest"]}'
# decimals(): 0x…12, which is 18
curl -s https://ethereum-rpc.publicnode.com -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x313ce567"},"latest"]}'
# owner(): 0x…82c48875c17ee5812f909a9d75c0f64f7a8719fe
curl -s https://ethereum-rpc.publicnode.com -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x8da5cb5b"},"latest"]}'
```
With [Foundry](https://www.getfoundry.sh/introduction/installation) installed, its `cast` command runs the same calls and decodes the answers:
```sh
export ETH_RPC_URL=https://ethereum-rpc.publicnode.com
# "Veritaseum", "VERI", 18, 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'name()(string)'
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'symbol()(string)'
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'decimals()(uint256)'
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'owner()(address)'
```
To confirm the source matches the bytecode, open the [verified code on Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) and compare it with [`eth_getCode`](https://ethereum.org/developers/docs/apis/json-rpc/#eth-getcode) on either endpoint, or `cast code 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374`. The [data files](https://veri.how/data.md) page lists the ABI and the other files the site serves.
## Sources
1. [VERI verified source, Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code)
2. [VERI contract creation transaction, Etherscan](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc)
3. [VERI contract, Blockscout](https://eth.blockscout.com/address/0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374?tab=contract)
## Related
- [VERI supply is fixed at 100,000,000](https://veri.how/veri/supply.md): The VERI contract sets totalSupply to 100,000,000 tokens (10^26 base units at 18 decimals) once, when it is deployed, and has no mint, burn or pause function, so the supply cannot change.
- [How VERI differs from a modern ERC-20](https://veri.how/veri/erc20-quirks.md): VERI is 2017 code whose initial allocation and ownership transfer emit no Transfer event, whose decimals() returns uint256, whose failed transfers throw instead of returning false, which has no zero-address checks, and whose transferOwnership moves the owner's whole balance to the new owner, as its one call on 24 Apr 2017 did with all 100,000,000 VERI.
- [Check a VERI balance](https://veri.how/veri/check-balance.md): Call balanceOf(address) on the VERI contract through a public Ethereum JSON-RPC endpoint with curl and divide the result by 10^18; read the balance rather than summing Transfer logs, which miss two balance changes.
---
title: VERI supply is fixed at 100,000,000
description: The VERI contract sets totalSupply to 100,000,000 tokens (10^26 base units at 18 decimals) once, when it is deployed, and has no mint, burn or pause function, so the supply cannot change.
url: https://veri.how/veri/supply
area: veri
kind: reference
updated: 2026-10-15T00:00:00Z
author: Patryk Dwórznik
license: CC BY 4.0
contracts:
- id: eip155:1:0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374
name: Veritaseum
verified:
date: 2026-10-13
sources:
- title: VERI verified source, Etherscan
url: https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code
- title: VERI Read Contract view, Etherscan
url: https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#readContract
- title: VERI contract creation transaction, Etherscan
url: https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc
---
# VERI supply is fixed at 100,000,000
The VERI contract sets totalSupply to 100,000,000 tokens (10^26 base units at 18 decimals) once, when it is deployed, and has no mint, burn or pause function, so the supply cannot change.
## Facts
| Fact | Value |
| --- | --- |
| Address | [0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Chain | [Ethereum (eip155:1)](https://etherscan.io) |
| Standard | [ERC-20](https://eips.ethereum.org/EIPS/eip-20) |
| Symbol | [VERI](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Decimals | [18](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Deployed | [Block 3,586,472 · 23 Apr 2017](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc) |
| Owner | [0x82c48875C17EE5812f909a9d75C0F64f7A8719FE](https://etherscan.io/address/0x82c48875c17ee5812f909a9d75c0f64f7a8719fe) |
| Source | [Verified on Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Transactions | [All transactions](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| ABI | [veri.json](https://veri.how/abi/veri.json) |
| Last verified | 13 Oct 2026 |
Total supply, maximum supply and the sum of every balance that can ever exist are the same number for VERI: 100,000,000 tokens. Some token listings show the maximum supply as unknown or unlimited. The contract says otherwise, and the sections below show where.
## Where the number is set
The [verified source](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) declares the supply as a state variable and hands all of it to the deployer in the constructor:
```solidity
uint public totalSupply = 100000000 ether; // total supply of 100 Million Tokens
function VeritaseumToken() {
balances[msg.sender] = totalSupply;
}
```
`100000000 ether` is Solidity for 100,000,000 × 10^18, which is 100000000000000000000000000 base units, or `0x52b7d2dcc80cd2e4000000` in hex. The token has 18 decimals, so that is exactly 100,000,000 VERI. The constructor ran once, in the [creation transaction](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc) of 23 Apr 2017, and no later code path writes `totalSupply`.
## No mint, burn or pause
The contract's state-changing functions are `transfer`, `transferFrom`, `approve` and `transferOwnership`, and that is the complete list (see the [function table](https://veri.how/veri/contract.md#functions-and-events)). None of them touches `totalSupply`. There is no function that creates tokens, none that destroys them, and none that stops transfers. Because the contract is [not upgradeable](https://veri.how/veri/contract.md#not-upgradeable), no such function can be added.
## What still counts in the supply
`totalSupply` never goes down, even when tokens become unreachable:
- **Tokens sent to the zero address.** `transfer` and `transferFrom` have no zero-address check, so VERI can be sent to `0x0`. It stays in `balances[0x0]` and in `totalSupply`. The zero address holds a non-zero VERI balance today; the second command below reads it.
- **Balances overwritten by `transferOwnership`.** That function copies the owner's balance onto the new owner instead of adding to it, so any VERI the new owner already held is destroyed without `totalSupply` changing. It has been called once, from a fresh address, so nothing was lost in practice. The details are in [How VERI differs from a modern ERC-20](https://veri.how/veri/erc20-quirks.md#transferownership-moves-the-owners-whole-balance).
So the sum of all balances can be smaller than `totalSupply`, but `totalSupply` itself is a constant.
## Two declarations, one getter
`totalSupply` is declared twice in the source: once in the abstract `ERC20` contract, which nothing ever writes, and once in `VeritaseumToken`, where it is initialised. The second shadows the first. The getter in the ABI returns the `VeritaseumToken` value, 10^26, which is what Etherscan's [Read Contract](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#readContract) view and the command below return.
## Check it yourself
Each command is an [`eth_call`](https://ethereum.org/developers/docs/apis/json-rpc/#eth-call) to a public Ethereum JSON-RPC endpoint.
```sh
# totalSupply(): 0x…52b7d2dcc80cd2e4000000 = 100000000000000000000000000 = 100,000,000 × 10^18
curl -s https://ethereum-rpc.publicnode.com -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x18160ddd"},"latest"]}'
# balanceOf(0x0): VERI sent to the zero address, still part of totalSupply
curl -s https://ethereum-rpc.publicnode.com -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x70a082310000000000000000000000000000000000000000000000000000000000000000"},"latest"]}'
```
To turn the hex result into tokens, remove the `0x`, convert to decimal and divide by 10^18:
```sh
python3 -c 'print(int("0x52b7d2dcc80cd2e4000000", 16) // 10**18)' # 100000000
```
`https://eth.drpc.org` answers the same calls if the first endpoint is busy.
With [Foundry](https://www.getfoundry.sh/introduction/installation) installed, its `cast` command runs the same calls and decodes the answers:
```sh
export ETH_RPC_URL=https://ethereum-rpc.publicnode.com
# 100000000000000000000000000 [1e26]
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'totalSupply()(uint256)'
# The same, in whole VERI: 100000000.000000000000000000
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'totalSupply()' | xargs cast from-wei
# The zero address's balance, in base units
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'balanceOf(address)(uint256)' $(cast address-zero)
```
## Sources
1. [VERI verified source, Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code)
2. [VERI Read Contract view, Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#readContract)
3. [VERI contract creation transaction, Etherscan](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc)
## Related
- [VERI token contract 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374](https://veri.how/veri/contract.md): VERI is an ERC-20 token at 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374 on Ethereum mainnet, deployed on 23 Apr 2017 with a fixed supply of 100,000,000 and no proxy, so the code that runs today is the code deployed then.
- [How VERI differs from a modern ERC-20](https://veri.how/veri/erc20-quirks.md): VERI is 2017 code whose initial allocation and ownership transfer emit no Transfer event, whose decimals() returns uint256, whose failed transfers throw instead of returning false, which has no zero-address checks, and whose transferOwnership moves the owner's whole balance to the new owner, as its one call on 24 Apr 2017 did with all 100,000,000 VERI.
- [Check a VERI balance](https://veri.how/veri/check-balance.md): Call balanceOf(address) on the VERI contract through a public Ethereum JSON-RPC endpoint with curl and divide the result by 10^18; read the balance rather than summing Transfer logs, which miss two balance changes.
---
title: How VERI differs from a modern ERC-20
description: VERI is 2017 code whose initial allocation and ownership transfer emit no Transfer event, whose decimals() returns uint256, whose failed transfers throw instead of returning false, which has no zero-address checks, and whose transferOwnership moves the owner's whole balance to the new owner, as its one call on 24 Apr 2017 did with all 100,000,000 VERI.
url: https://veri.how/veri/erc20-quirks
area: veri
kind: reference
updated: 2026-10-15T00:00:00Z
author: Patryk Dwórznik
license: CC BY 4.0
contracts:
- id: eip155:1:0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374
name: Veritaseum
verified:
date: 2026-10-13
sources:
- title: VERI verified source, Etherscan
url: https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code
- title: VERI contract creation transaction, Etherscan
url: https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc
- title: The transferOwnership transaction of 24 Apr 2017, Etherscan
url: https://etherscan.io/tx/0x5d7d007e7dbf534a2983880be117100691cf351fdc45d6adb2249c6fd3a8d4b1
- title: The transferOwnership transaction of 24 Apr 2017, Blockscout
url: https://eth.blockscout.com/tx/0x5d7d007e7dbf534a2983880be117100691cf351fdc45d6adb2249c6fd3a8d4b1
- title: "EIP-20: Token Standard"
url: https://eips.ethereum.org/EIPS/eip-20
---
# How VERI differs from a modern ERC-20
VERI is 2017 code whose initial allocation and ownership transfer emit no Transfer event, whose decimals() returns uint256, whose failed transfers throw instead of returning false, which has no zero-address checks, and whose transferOwnership moves the owner's whole balance to the new owner, as its one call on 24 Apr 2017 did with all 100,000,000 VERI.
## Facts
| Fact | Value |
| --- | --- |
| Address | [0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Chain | [Ethereum (eip155:1)](https://etherscan.io) |
| Standard | [ERC-20](https://eips.ethereum.org/EIPS/eip-20) |
| Symbol | [VERI](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Decimals | [18](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Deployed | [Block 3,586,472 · 23 Apr 2017](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc) |
| Owner | [0x82c48875C17EE5812f909a9d75C0F64f7A8719FE](https://etherscan.io/address/0x82c48875c17ee5812f909a9d75c0f64f7a8719fe) |
| Source | [Verified on Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Transactions | [All transactions](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| ABI | [veri.json](https://veri.how/abi/veri.json) |
| Last verified | 13 Oct 2026 |
The VERI contract predates the final [EIP-20](https://eips.ethereum.org/EIPS/eip-20) text and most of the conventions that grew around it. It works with every wallet and tool that calls `balanceOf` and `transfer`, but an indexer, a wrapper or a strict ABI decoder meets the differences below. Each one is read from the [verified source](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code).
## Two balance changes emit no Transfer event
Modern tokens emit `Transfer(0x0, to, amount)` when tokens are created, so that the sum of all `Transfer` logs equals every balance. VERI changes balances twice without a log:
1. **The initial allocation.** The constructor writes `balances[msg.sender] = totalSupply` directly. The [creation transaction](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc) has no logs, so 100,000,000 VERI appeared with no `Transfer`.
2. **`transferOwnership`.** It copies the owner's balance to the new owner and zeroes the old one, with no event. The [one call on record](#the-one-call-on-record) moved all 100,000,000 VERI with no `Transfer`.
An indexer that rebuilds balances from `Transfer` logs therefore puts the whole supply nowhere, and every later balance it computes for the first holders is off. Read `balanceOf` instead, as in [Check a VERI balance](https://veri.how/veri/check-balance.md).
## decimals() returns uint256
```solidity
uint public decimals = 18;
```
EIP-20 specifies `decimals()` as `uint8`. VERI declares it as `uint`, so the ABI and the return word are `uint256`. The value is 18, and a decoder that reads the low byte of the 32-byte word gets the same answer. A strictly typed client that expects `uint8` in the ABI needs the committed [ABI](https://veri.how/abi/veri.json), which says `uint256`.
## Failures throw; successes return true
`transfer`, `transferFrom` and `approve` all `return true`. VERI does not have the "missing return value" problem of some tokens from the same year. But they never return `false`: an insufficient balance or allowance reaches `SafeMath.safeSub`, whose custom `assert` calls `throw`:
```solidity
function safeSub(uint a, uint b) internal returns (uint) {
assert(b <= a);
return a - b;
}
function assert(bool assertion) internal {
if (!assertion) {
throw;
}
}
```
`throw` in Solidity 0.4.8 compiles to an invalid opcode, which reverts the state and consumes all the gas sent with the transaction. A wrapper that checks the return value for failure never sees one; it has to treat a revert as the failure.
## No zero-address checks
`transfer` and `transferFrom` accept any `_to`, including `0x0`. Tokens sent there are not burned: they sit in `balances[0x0]`, still count in `totalSupply`, and show up when you call `balanceOf` for the zero address (the command in [VERI supply is fixed at 100,000,000](https://veri.how/veri/supply.md#check-it-yourself) reads it).
## approve overwrites, with no increase or decrease
```solidity
function approve(address _spender, uint _value) returns (bool success) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
```
`approve` sets the allowance to `_value` whatever it was before, which is the approve/transferFrom race described in EIP-20. There is no `increaseAllowance`, `decreaseAllowance` or `permit`. The safe pattern is to set the allowance to zero before setting a new value.
## transferOwnership moves the owner's whole balance
In most contracts, `transferOwnership` changes an address and nothing else. In VERI it also moves tokens.
### The code
`VeritaseumToken` overrides the `transferOwnership` it inherits from `Ownable` ([verified source](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code)):
```solidity
// VeritaseumToken
function transferOwnership(address _newOwner) onlyOwner {
balances[_newOwner] = balances[owner];
balances[owner] = 0;
Ownable.transferOwnership(_newOwner);
}
// Ownable
function transferOwnership(address newOwner) onlyOwner {
if (newOwner != address(0)) {
owner = newOwner;
}
}
```
### What one call does
Only the current owner can call it (`onlyOwner` throws for anyone else). A successful call does three things, in this order:
1. **Overwrites the new owner's balance with the owner's balance.** It is an assignment, not an addition. Whatever `_newOwner` held before is gone.
2. **Sets the old owner's balance to zero.**
3. **Changes `owner`**, but only if `_newOwner` is not the zero address.
Three things it does not do:
- **It emits no event.** There is no `Transfer` for the moved balance and no `OwnershipTransferred`. A balance rebuilt from `Transfer` logs misses this move entirely (see [above](#two-balance-changes-emit-no-transfer-event)).
- **It does not change `totalSupply`**, even when step 1 destroys tokens. The [supply](https://veri.how/veri/supply.md) stays at 100,000,000.
- **It does not move allowances.** Anything the old owner approved stays in `allowed[oldOwner][spender]`, attached to an address whose balance is now zero.
Ownership carries exactly one power: calling this function again. The owner cannot mint, burn, pause or touch anyone else's balance or allowance.
### Edge cases
These follow from the code; none has happened on chain.
| `_newOwner` is | Result |
| ---------------------------------- | ---------------------------------------------------------------------------------------------------- |
| an address that already holds VERI | its balance is replaced by the owner's; the VERI it held is destroyed and `totalSupply` is unchanged |
| the owner itself | step 1 is a no-op and step 2 zeroes the owner: the owner's whole balance is destroyed |
| the zero address | the balance moves to `0x0`, the owner is zeroed, and `owner` stays as it was: the tokens are lost |
### The one call on record
The deployer, 0x44CAb6F6DC7045FD4AcD1d0f3d09Fc7a83004bd3, called `transferOwnership(0x82c48875C17EE5812f909a9d75C0F64f7A8719FE)` in block [3,589,599](https://etherscan.io/block/3589599) on 24 Apr 2017 at 01:37:44 UTC, the day after deployment ([transaction](https://etherscan.io/tx/0x5d7d007e7dbf534a2983880be117100691cf351fdc45d6adb2249c6fd3a8d4b1)). It used 40,088 gas and emitted no log.
Read from an archive node, the balances around that block are:
| Address | Block 3,589,598 | Block 3,589,599 |
| ------------------------------------------------------ | ---------------- | ---------------- |
| 0x44CAb6F6DC7045FD4AcD1d0f3d09Fc7a83004bd3 (deployer) | 100,000,000 VERI | 0 |
| 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE (new owner) | 0 | 100,000,000 VERI |
So the call moved the full supply. `owner()` has returned 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE ever since; the address is an externally owned account. Every transaction sent to the contract was checked on 13 Oct 2026 for the `transferOwnership` selector `0xf2fde38b`. This is the only successful call. One other [attempt](https://etherscan.io/tx/0x54637b5bca5dbfe2e3dedafaf5f13e85e6d9e0e5657d2867520fa0427e9f52e6), from an address that was not the owner, threw in `onlyOwner` on 26 Dec 2017 and changed nothing. Since the owner has always been an externally owned account, no contract could have called the function on its behalf.
## What else is missing
- `totalSupply` is declared twice (in the abstract `ERC20` and again in `VeritaseumToken`); the getter returns the initialised one, 10^26. See [VERI supply is fixed at 100,000,000](https://veri.how/veri/supply.md#two-declarations-one-getter).
- No ERC-165 `supportsInterface`, no transfer hooks, no pause, no mint and no burn.
- No `delegatecall` and no proxy, so none of the above can be fixed in place.
## Check it yourself
The commands are [`eth_call`](https://ethereum.org/developers/docs/apis/json-rpc/#eth-call) and [`eth_getTransactionReceipt`](https://ethereum.org/developers/docs/apis/json-rpc/#eth-gettransactionreceipt) requests to public Ethereum JSON-RPC endpoints.
```sh
# decimals(): a full 32-byte word, 0x0000…0012
curl -s https://ethereum-rpc.publicnode.com -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x313ce567"},"latest"]}'
# The creation receipt: "logs": [], so the 100,000,000 VERI allocation emitted no Transfer
curl -s https://eth.drpc.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_getTransactionReceipt","params":["0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc"]}'
# The transferOwnership receipt: "logs": [] again, and "gasUsed": "0x9c98" (40,088)
curl -s https://eth.drpc.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_getTransactionReceipt","params":["0x5d7d007e7dbf534a2983880be117100691cf351fdc45d6adb2249c6fd3a8d4b1"]}'
# owner(): 0x…82c48875c17ee5812f909a9d75c0f64f7a8719fe
curl -s https://ethereum-rpc.publicnode.com -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x8da5cb5b"},"latest"]}'
```
The balances before and after the call need an archive node. `https://eth.drpc.org` serves historical `eth_call` without a key: pass `"0x36c5de"` (3,589,598) or `"0x36c5df"` (3,589,599) instead of `"latest"`, with `balanceOf` calldata as in [Check a VERI balance](https://veri.how/veri/check-balance.md).
With [Foundry](https://www.getfoundry.sh/introduction/installation) installed, its `cast` command runs the same calls and decodes the answers:
```sh
export ETH_RPC_URL=https://eth.drpc.org
# 18; the ABI says uint256, so that is the return type to decode with
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'decimals()(uint256)'
# Both receipts print logs []
cast receipt 0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc logs
cast receipt 0x5d7d007e7dbf534a2983880be117100691cf351fdc45d6adb2249c6fd3a8d4b1 logs
# 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'owner()(address)'
# The transferOwnership input, decoded: "transferOwnership(address)" 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE
cast tx 0x5d7d007e7dbf534a2983880be117100691cf351fdc45d6adb2249c6fd3a8d4b1 input | xargs cast 4byte-decode
# The deployer before and after: 100000000000000000000000000 [1e26], then 0
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'balanceOf(address)(uint256)' 0x44CAb6F6DC7045FD4AcD1d0f3d09Fc7a83004bd3 --block 3589598
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'balanceOf(address)(uint256)' 0x44CAb6F6DC7045FD4AcD1d0f3d09Fc7a83004bd3 --block 3589599
# The new owner before and after: 0, then 100000000000000000000000000 [1e26]
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'balanceOf(address)(uint256)' 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE --block 3589598
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'balanceOf(address)(uint256)' 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE --block 3589599
```
## Sources
1. [VERI verified source, Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code)
2. [VERI contract creation transaction, Etherscan](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc)
3. [The transferOwnership transaction of 24 Apr 2017, Etherscan](https://etherscan.io/tx/0x5d7d007e7dbf534a2983880be117100691cf351fdc45d6adb2249c6fd3a8d4b1)
4. [The transferOwnership transaction of 24 Apr 2017, Blockscout](https://eth.blockscout.com/tx/0x5d7d007e7dbf534a2983880be117100691cf351fdc45d6adb2249c6fd3a8d4b1)
5. [EIP-20: Token Standard](https://eips.ethereum.org/EIPS/eip-20)
## Related
- [VERI token contract 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374](https://veri.how/veri/contract.md): VERI is an ERC-20 token at 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374 on Ethereum mainnet, deployed on 23 Apr 2017 with a fixed supply of 100,000,000 and no proxy, so the code that runs today is the code deployed then.
- [VERI supply is fixed at 100,000,000](https://veri.how/veri/supply.md): The VERI contract sets totalSupply to 100,000,000 tokens (10^26 base units at 18 decimals) once, when it is deployed, and has no mint, burn or pause function, so the supply cannot change.
- [Check a VERI balance](https://veri.how/veri/check-balance.md): Call balanceOf(address) on the VERI contract through a public Ethereum JSON-RPC endpoint with curl and divide the result by 10^18; read the balance rather than summing Transfer logs, which miss two balance changes.
---
title: Check a VERI balance
description: Call balanceOf(address) on the VERI contract through a public Ethereum JSON-RPC endpoint with curl and divide the result by 10^18; read the balance rather than summing Transfer logs, which miss two balance changes.
url: https://veri.how/veri/check-balance
area: veri
kind: howto
updated: 2026-10-15T00:00:00Z
author: Patryk Dwórznik
license: CC BY 4.0
contracts:
- id: eip155:1:0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374
name: Veritaseum
verified:
date: 2026-10-13
sources:
- title: VERI verified source, Etherscan
url: https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code
- title: "EIP-20: Token Standard"
url: https://eips.ethereum.org/EIPS/eip-20
- title: Ethereum JSON-RPC, eth_call
url: https://ethereum.org/developers/docs/apis/json-rpc/#eth-call
---
# Check a VERI balance
Call balanceOf(address) on the VERI contract through a public Ethereum JSON-RPC endpoint with curl and divide the result by 10^18; read the balance rather than summing Transfer logs, which miss two balance changes.
## Facts
| Fact | Value |
| --- | --- |
| Address | [0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Chain | [Ethereum (eip155:1)](https://etherscan.io) |
| Standard | [ERC-20](https://eips.ethereum.org/EIPS/eip-20) |
| Symbol | [VERI](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| Decimals | [18](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Deployed | [Block 3,586,472 · 23 Apr 2017](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc) |
| Owner | [0x82c48875C17EE5812f909a9d75C0F64f7A8719FE](https://etherscan.io/address/0x82c48875c17ee5812f909a9d75c0f64f7a8719fe) |
| Source | [Verified on Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code) |
| Transactions | [All transactions](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) |
| ABI | [veri.json](https://veri.how/abi/veri.json) |
| Last verified | 13 Oct 2026 |
You need an address to look up and `curl`. The example uses the contract owner, 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE; replace it with the address you want.
## 1. Build the calldata
`balanceOf(address)` has the selector `0x70a08231`. Append the address, without its `0x`, left-padded with zeros to 32 bytes (64 hex characters), as the [ABI specification](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector-and-argument-encoding) describes:
```
0x70a08231
000000000000000000000000
82c48875c17ee5812f909a9d75c0f64f7a8719fe
```
Joined: `0x70a0823100000000000000000000000082c48875c17ee5812f909a9d75c0f64f7a8719fe`. Case doesn't matter in calldata.
With [Foundry](https://www.getfoundry.sh/introduction/installation) installed, its `cast` command builds it for you, and the later steps show `cast` doing the call and the conversion too:
```sh
# 0x70a0823100000000000000000000000082c48875c17ee5812f909a9d75c0f64f7a8719fe
cast calldata 'balanceOf(address)' 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE
```
## 2. Call the contract
Send an [`eth_call`](https://ethereum.org/developers/docs/apis/json-rpc/#eth-call) to a public Ethereum JSON-RPC endpoint. Either of these works without a key:
```sh
curl -s https://ethereum-rpc.publicnode.com -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x70a0823100000000000000000000000082c48875c17ee5812f909a9d75c0f64f7a8719fe"},"latest"]}'
curl -s https://eth.drpc.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","data":"0x70a0823100000000000000000000000082c48875c17ee5812f909a9d75c0f64f7a8719fe"},"latest"]}'
```
The answer is one 32-byte word in `result`, for example `"result":"0x0000000000000000000000000000000000000000000000001ae18cdf42a3beab"`.
```sh
export ETH_RPC_URL=https://ethereum-rpc.publicnode.com
# 1936984205269647019 [1.936e18], the same word decoded as a number
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'balanceOf(address)(uint256)' 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE
```
## 3. Convert to VERI
The word is the balance in base units. VERI has 18 decimals, so divide by 10^18:
```sh
python3 -c 'print(int("0x0000000000000000000000000000000000000000000000001ae18cdf42a3beab", 16) / 10**18)'
# 1.936984205269647
```
```sh
# 1.936984205269647019
cast call 0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374 'balanceOf(address)' 0x82c48875C17EE5812f909a9d75C0F64f7A8719FE | xargs cast from-wei
```
A result of `0x0000…0000` means the address holds no VERI.
## On Etherscan
Etherscan's Read Contract view runs `balanceOf` from the verified source, so the same three steps work in a browser:
1. Open the [contract page](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#readContract), choose the **Contract** tab, then **Read Contract**. Functions that take no input, such as `decimals` and `totalSupply`, show their value at once.
2. Open `balanceOf`, paste the address into the `_owner` field and press **Query**.
3. The result is labelled `uint256` and is the balance in base units, the same number `curl` returns in hex. Divide it by 10^18 for VERI.
The [token page](https://etherscan.io/token/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374) shows the balance already divided once you paste the address into the holder filter. Blockscout lists VERI with the other tokens on the address page, `https://eth.blockscout.com/address/
?tab=tokens`.
## Why not sum the Transfer logs
The VERI contract changed balances twice without emitting a `Transfer`: when it allocated the whole supply to the deployer, and when `transferOwnership` moved all of it to the current owner. A balance rebuilt from logs alone starts from zero for those addresses and is wrong for everything downstream. `balanceOf` reads the contract's own storage and is always right. See [How VERI differs from a modern ERC-20](https://veri.how/veri/erc20-quirks.md).
## For agents and tools
The committed [ABI](https://veri.how/abi/veri.json) decodes `balanceOf` and the other calls; `decimals()` returns `uint256` in it, not `uint8`. [/tokenlist.json](https://veri.how/tokenlist.json) and [/facts.json](https://veri.how/facts.json) carry the address and decimals; the [data files](https://veri.how/data.md) page lists every file. A historical balance (`"latest"` replaced by a block number in hex, or `--block ` with `cast`) needs an archive node; `https://eth.drpc.org` serves those without a key.
## Sources
1. [VERI verified source, Etherscan](https://etherscan.io/address/0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374#code)
2. [EIP-20: Token Standard](https://eips.ethereum.org/EIPS/eip-20)
3. [Ethereum JSON-RPC, eth_call](https://ethereum.org/developers/docs/apis/json-rpc/#eth-call)
## Related
- [VERI token contract 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374](https://veri.how/veri/contract.md): VERI is an ERC-20 token at 0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374 on Ethereum mainnet, deployed on 23 Apr 2017 with a fixed supply of 100,000,000 and no proxy, so the code that runs today is the code deployed then.
- [VERI supply is fixed at 100,000,000](https://veri.how/veri/supply.md): The VERI contract sets totalSupply to 100,000,000 tokens (10^26 base units at 18 decimals) once, when it is deployed, and has no mint, burn or pause function, so the supply cannot change.
- [How VERI differs from a modern ERC-20](https://veri.how/veri/erc20-quirks.md): VERI is 2017 code whose initial allocation and ownership transfer emit no Transfer event, whose decimals() returns uint256, whose failed transfers throw instead of returning false, which has no zero-address checks, and whose transferOwnership moves the owner's whole balance to the new owner, as its one call on 24 Apr 2017 did with all 100,000,000 VERI.
---
title: Veri SmartMetal
description: Veri SmartMetal tokens are ERC-1155 tokens on Base, one for each Veri SmartMetal silver round, built on the QRToken framework.
url: https://veri.how/smartmetal
area: smartmetal
kind: collection
updated: 2026-10-19T14:31:08Z
author: Patryk Dwórznik
license: CC BY 4.0
---
# Veri SmartMetal
Veri SmartMetal tokens are ERC-1155 tokens on Base, one for each Veri SmartMetal silver round, built on the QRToken framework.
## Facts
| Fact | Value |
| --- | --- |
| Address | [0x4516a5D613C30A36D157d3b579813734cbb929a4](https://basescan.org/token/0x4516a5d613c30a36d157d3b579813734cbb929a4) |
| Chain | [Base (eip155:8453)](https://basescan.org) |
| Standard | [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) |
| Proxy | [ERC-1967](https://eips.ethereum.org/EIPS/eip-1967) |
| Implementation | [Series1155V1 0x945D54B21a582d5D186Ae1E449DdC2a4Ce39E26c](https://basescan.org/address/0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c#code) |
| Deployed | [Block 30,569,433 · 22 May 2025](https://basescan.org/tx/0x565a24675da44a562bb5b747b81cdd9290ad0d58f86b1e635e7d888083e3c53e) |
| Source | [Verified on BaseScan](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4#code) |
| Transactions | [All transactions](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4) |
| ABI | [smartmetal.json](https://veri.how/abi/smartmetal.json) |
| Last verified | 13 Oct 2026 |
| 2024 | [Token ids 1–6,566 · 22 May 2025](https://basescan.org/tx/0xe9196b44618a89a3f9a1c8f9ce579aa704e4621d5a8899634290cef868b7742a) |
| Veri SmartMetal Limited Edition Azure Dragon | [16 token ids · 28 May 2026](https://basescan.org/tx/0xcbb3ab4f328c251b3ef6f79ee20682a236f2072121245737ffac3d25eac0f051) |
Each token stands for one Veri SmartMetal silver round of 1 oz .999 fine silver. The round carries a QR code with the key to its token. A minted token sits in the SeriesActivation contract until its holder activates it: the holder signs with that key and the token moves to their wallet.
Tokens are grouped in series that share one metadata folder on IPFS. The Fact sheet above lists each series with its token ids and on-chain creation date. The 2024 series holds the rounds minted in 2024.
The tokens use the Series1155 and SeriesActivation contracts from the [QRToken](https://docs.qrtoken.xyz) project, a framework for tokens tied to physical items through a QR code. Each token has a page at [veri.vip](https://veri.vip).
## Articles
- [Veri SmartMetal contracts on Base](https://veri.how/smartmetal/contracts.md): Veri SmartMetal is an ERC-1155 token at 0x4516a5D613C30A36D157d3b579813734cbb929a4 on Base, an ERC-1967 proxy in front of the Series1155V1 implementation, with a separate SeriesActivation contract that holds every token until its holder activates it; all three were deployed on 22 May 2025 and are built on QRToken.
- [SmartMetal series: 2024 and the Limited Edition Azure Dragon](https://veri.how/smartmetal/series.md): The Veri SmartMetal contract has two series, the 2024 series of 6,566 tokens (ids 1 to 6566, created on chain on 22 May 2025) and Veri SmartMetal Limited Edition Azure Dragon, 16 tokens created on 28 May 2026; each series is one metadata folder on IPFS, and its id is the keccak256 hash of that folder's CID.
- [Look up a SmartMetal token](https://veri.how/smartmetal/lookup.md): Given a SmartMetal token id, read its series with tokenSeries(id) and its metadata URI with uri(id) on the token contract, fetch the metadata JSON from any IPFS gateway, and ask SeriesActivation whether it is activated with tokenStatus(id); veri.how also serves the indexed answer at /smartmetal/tokens/.json.
- [Activate a SmartMetal](https://veri.how/smartmetal/activate.md): Activation is one transaction on Base, activate(timestamp, signature) on SeriesActivation, in which the key from the token's QR code signs the activator's address and a timestamp no more than an hour old, and the contract transfers the token from itself to the activator's wallet and emits TokenActivated.
- [veri.vip](https://veri.how/smartmetal/veri-vip.md): veri.vip is the website that shows one page per Veri SmartMetal token, at veri.vip/, built with QRToken; every value on a page is tagged as read from the Base blockchain or from the token's metadata file on IPFS, so each can be checked without the site.
---
title: Veri SmartMetal contracts on Base
description: Veri SmartMetal is an ERC-1155 token at 0x4516a5D613C30A36D157d3b579813734cbb929a4 on Base, an ERC-1967 proxy in front of the Series1155V1 implementation, with a separate SeriesActivation contract that holds every token until its holder activates it; all three were deployed on 22 May 2025 and are built on QRToken.
url: https://veri.how/smartmetal/contracts
area: smartmetal
kind: reference
updated: 2026-10-15T00:00:00Z
author: Patryk Dwórznik
license: CC BY 4.0
contracts:
- id: eip155:8453:0x4516a5d613c30a36d157d3b579813734cbb929a4
name: Veri SmartMetal
verified:
date: 2026-10-13
- id: eip155:8453:0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c
name: Series1155V1
verified:
date: 2026-10-13
- id: eip155:8453:0x412e962bbae0bb97ce98e74f3424543651a21ce3
name: SeriesActivation
verified:
date: 2026-10-13
sources:
- title: Veri SmartMetal proxy, verified source on BaseScan
url: https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4#code
- title: Series1155V1, verified source on BaseScan
url: https://basescan.org/address/0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c#code
- title: SeriesActivation, verified source on BaseScan
url: https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3#code
- title: Proxy creation transaction, BaseScan
url: https://basescan.org/tx/0x565a24675da44a562bb5b747b81cdd9290ad0d58f86b1e635e7d888083e3c53e
- title: QRToken contract reference, Series1155V1
url: https://docs.qrtoken.xyz/reference/contracts/series1155v1/
- title: QRToken contract reference, SeriesActivation
url: https://docs.qrtoken.xyz/reference/contracts/seriesactivation/
- title: "EIP-1967: Proxy Storage Slots"
url: https://eips.ethereum.org/EIPS/eip-1967
---
# Veri SmartMetal contracts on Base
Veri SmartMetal is an ERC-1155 token at 0x4516a5D613C30A36D157d3b579813734cbb929a4 on Base, an ERC-1967 proxy in front of the Series1155V1 implementation, with a separate SeriesActivation contract that holds every token until its holder activates it; all three were deployed on 22 May 2025 and are built on QRToken.
## Facts
**Veri SmartMetal**
| Fact | Value |
| --- | --- |
| Address | [0x4516a5D613C30A36D157d3b579813734cbb929a4](https://basescan.org/token/0x4516a5d613c30a36d157d3b579813734cbb929a4) |
| Chain | [Base (eip155:8453)](https://basescan.org) |
| Standard | [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) |
| Proxy | [ERC-1967](https://eips.ethereum.org/EIPS/eip-1967) |
| Implementation | [Series1155V1 0x945D54B21a582d5D186Ae1E449DdC2a4Ce39E26c](https://basescan.org/address/0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c#code) |
| Deployed | [Block 30,569,433 · 22 May 2025](https://basescan.org/tx/0x565a24675da44a562bb5b747b81cdd9290ad0d58f86b1e635e7d888083e3c53e) |
| Source | [Verified on BaseScan](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4#code) |
| Transactions | [All transactions](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4) |
| ABI | [smartmetal.json](https://veri.how/abi/smartmetal.json) |
| Last verified | 13 Oct 2026 |
**Series1155V1**
| Fact | Value |
| --- | --- |
| Address | [0x945D54B21a582d5D186Ae1E449DdC2a4Ce39E26c](https://basescan.org/address/0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c) |
| Chain | [Base (eip155:8453)](https://basescan.org) |
| Deployed | [Block 30,569,430 · 22 May 2025](https://basescan.org/tx/0xc80280659363686cc22ed1e14feca4d7834cf28d1b12d9d3b1dec92c496073ec) |
| Source | [Verified on BaseScan](https://basescan.org/address/0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c#code) |
| Transactions | [All transactions](https://basescan.org/address/0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c) |
| ABI | [series1155v1.json](https://veri.how/abi/series1155v1.json) |
| Last verified | 13 Oct 2026 |
**SeriesActivation**
| Fact | Value |
| --- | --- |
| Address | [0x412E962bbAE0bB97CE98e74f3424543651a21ce3](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3) |
| Chain | [Base (eip155:8453)](https://basescan.org) |
| Deployed | [Block 30,569,436 · 22 May 2025](https://basescan.org/tx/0x9c8f01b4f78f24f948e0f77ada064817637e548bbe9b8ae9ef010cbd8f1dcafa) |
| First activation | [Block 30,576,415 · 22 May 2025](https://basescan.org/tx/0x90aebc8390cc4b4ba96b0c7c4199353b577c4b4bc0b5f4e45e6d0575f406d754) |
| Owner | [0x73196fa74d6061e02648078246a1fE4D93a7AC2f](https://basescan.org/address/0x73196fa74d6061e02648078246a1fe4d93a7ac2f) |
| Source | [Verified on BaseScan](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3#code) |
| Transactions | [All transactions](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3) |
| ABI | [smartmetal-activation.json](https://veri.how/abi/smartmetal-activation.json) |
| Last verified | 13 Oct 2026 |
Three contracts make up Veri SmartMetal on Base (chain id 8453). The Fact sheets above list each one; this article says what each does, how they fit together and how to read them yourself. All three were deployed by the same account, 0x73196fa74d6061e02648078246a1fE4D93a7AC2f, within twelve seconds on 22 May 2025.
## How the three fit together
| Contract | Address | Role |
| ------------------ | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
| Veri SmartMetal | 0x4516a5D613C30A36D157d3b579813734cbb929a4 | The token. An ERC-1967 proxy: the address wallets and explorers know, holding the balances and the series. |
| `Series1155V1` | 0x945D54B21a582d5D186Ae1E449DdC2a4Ce39E26c | The implementation the proxy delegates to: an ERC-1155 token with series, roles, royalties and pausing. |
| `SeriesActivation` | 0x412E962bbAE0bB97CE98e74f3424543651a21ce3 | Holds every minted token until its holder activates it, then transfers it to the activator's wallet. |
A SmartMetal token's life runs through all three: the token contract mints it to `SeriesActivation`, `SeriesActivation` keeps it until someone proves they hold the key from its QR code, and the token then leaves for that person's wallet. [Activate a SmartMetal](https://veri.how/smartmetal/activate.md) walks through that last step.
## The token: an ERC-1967 proxy
The address 0x4516a5D613C30A36D157d3b579813734cbb929a4 is an [`ERC1967Proxy`](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4#code) of 129 bytes. It holds all the storage (balances, series, roles) and forwards every call to the implementation written in the [EIP-1967](https://eips.ethereum.org/EIPS/eip-1967) implementation slot. The proxy was created in block [30,569,433](https://basescan.org/block/30569433) on 22 May 2025 at 15:36:53 UTC ([transaction](https://basescan.org/tx/0x565a24675da44a562bb5b747b81cdd9290ad0d58f86b1e635e7d888083e3c53e)). That one transaction:
- emitted `Upgraded(0x945D54B21a582d5D186Ae1E449DdC2a4Ce39E26c)`, the constructor setting the first implementation;
- called `initialize(contractUri)` through the proxy, which emitted `Initialized(1)`;
- granted the deployer five roles (see [Roles](#roles)).
The implementation slot still holds `Series1155V1` at 0x945D54B21a582d5D186Ae1E449DdC2a4Ce39E26c (read on 13 Oct 2026; the command is under [Check it yourself](#check-it-yourself)). The upgrade path is UUPS (`UPGRADE_INTERFACE_VERSION()` returns `5.0.0`): `upgradeToAndCall` lives in the implementation, guarded by its `_authorizeUpgrade`, so the contract can be upgraded; the slot read on 13 Oct 2026 still names the original implementation.
## Series1155V1
`Series1155V1` at 0x945D54B21a582d5D186Ae1E449DdC2a4Ce39E26c was deployed three blocks before the proxy, in block [30,569,430](https://basescan.org/block/30569430) ([transaction](https://basescan.org/tx/0xc80280659363686cc22ed1e14feca4d7834cf28d1b12d9d3b1dec92c496073ec)). It is an [exact match](https://basescan.org/address/0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c#code) of its verified source, Solidity 0.8.28 with the optimizer on at 200 runs. It is part of [QRToken](https://docs.qrtoken.xyz), the framework Veri SmartMetal is built on. The [QRToken reference](https://docs.qrtoken.xyz/reference/contracts/series1155v1/) documents the contract in full; this section covers what you meet when you read the Veri deployment.
On top of OpenZeppelin's upgradeable ERC-1155 it adds:
- **Series.** A series is a group of tokens sharing one metadata folder on IPFS. `createSeries(cid, isFungible)` registers one; its id is `keccak256` of the CID string. `listSeries`, `seriesCount`, `seriesTokenCount`, `seriesTokens` and `tokenSeries` read them. [SmartMetal series](https://veri.how/smartmetal/series.md) lists the two that exist.
- **Minting by series.** `mintBatch(to, seriesId, tokenIds, amounts)` mints the given ids into a series; the caller chooses the ids. A non-fungible series only accepts an amount of 1 per id.
- **Metadata.** `uri(id)` returns `ipfs:///.json`. Series metadata can be updated or frozen in streamed steps (`updateSeriesInit` and `updateSeriesEmit`, `freezeSeriesInit` and `freezeSeriesEmit`); a frozen series emits a `PermanentURI` event per token. `contractURI()` holds the contract-level metadata and can be frozen too. On 13 Oct 2026 nothing was frozen.
- **Roles, royalties and pausing.** Access control by role (below), an [ERC-2981](https://eips.ethereum.org/EIPS/eip-2981) royalty that is unset (`royaltyInfo` returns the zero address and 0), and `pause` and `unpause`. It was not paused on 13 Oct 2026.
It reports support for the ERC-1155 (`0xd9b67a26`), ERC-1155 metadata URI (`0x0e89341c`) and ERC-2981 (`0x2a55205a`) interfaces.
### Roles
Role ids are `keccak256` of the role name, except `DEFAULT_ADMIN_ROLE`, which is `0x00`. The proxy's creation transaction granted the deployer, 0x73196fa74d6061e02648078246a1fE4D93a7AC2f, these five, and `hasRole` still returned `true` for each on 13 Oct 2026:
| Role | Id | Lets its holder |
| -------------------- | ------------- | ------------------------------------------------ |
| `DEFAULT_ADMIN_ROLE` | `0x00` | grant and revoke the other roles |
| `MINTER_ROLE` | `0x9f2d…56a6` | call `mintBatch` |
| `METADATA_ROLE` | `0x6bd6…2f80` | create series and update, freeze or set metadata |
| `PAUSER_ROLE` | `0x65d7…862a` | pause and unpause transfers |
| `ROYALTY_ROLE` | `0xeb54…d98e` | set, clear or freeze the royalty |
`ADMIN_ROLE` (`0xa498…1775`) exists in the contract but was not granted at deployment and the deployer does not hold it. `SeriesActivation` holds no role: it only receives tokens. Whether any other account has been granted a role since deployment was not checked; `hasRole(role, account)` answers for any address.
## SeriesActivation
`SeriesActivation` at 0x412E962bbAE0bB97CE98e74f3424543651a21ce3 was deployed three blocks after the proxy, in block [30,569,436](https://basescan.org/block/30569436) ([transaction](https://basescan.org/tx/0x9c8f01b4f78f24f948e0f77ada064817637e548bbe9b8ae9ef010cbd8f1dcafa)), with two constructor arguments: the token contract, 0x4516a5D613C30A36D157d3b579813734cbb929a4, and `_maxTimestampAge`, 3600 seconds. Both are still the values it returns. It is also part of QRToken and an exact match of its [verified source](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3#code).
It is `Ownable`, not role-based: `owner()` returns the deployer, 0x73196fa74d6061e02648078246a1fE4D93a7AC2f, who can register holders and change `maxTimestampAge`. What it stores, per token id:
- `tokenHolders(id)`: the address registered as the token's holder, the key the QR code carries. It is zero once the token is activated, and zero for an id that was never registered.
- `activatedTokens(id)`: `true` after activation.
- `tokenStatus(id)`: `0` for a registered token waiting for activation, `1` for an id with no registration, `2` for an activated token.
The contract only accepts tokens whose id has a registered holder: its `onERC1155Received` and `onERC1155BatchReceived` revert with `UnregisteredTokenTransfer` otherwise. That is why every series is registered first and minted second, as [SmartMetal series](https://veri.how/smartmetal/series.md) shows for both. `activate(timestamp, signature)` is the one function anyone can call; [Activate a SmartMetal](https://veri.how/smartmetal/activate.md) describes it.
## Check it yourself
Each command is a [JSON-RPC](https://ethereum.org/developers/docs/apis/json-rpc/) call to a public Base endpoint; swap in `https://base-rpc.publicnode.com` if the first one is busy.
```sh
# The proxy's implementation slot (EIP-1967): 0x…945d54b21a582d5d186ae1e449ddc2a4ce39e26c
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_getStorageAt","params":["0x4516a5d613c30a36d157d3b579813734cbb929a4","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","latest"]}'
# seriesCount(): 0x…02
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0xd7f2c0ef"},"latest"]}'
# hasRole(MINTER_ROLE, 0x7319…AC2f): 0x…01, which is true
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0x91d148549f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a600000000000000000000000073196fa74d6061e02648078246a1fe4d93a7ac2f"},"latest"]}'
# paused(): 0x…00, which is false
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0x5c975abb"},"latest"]}'
# SeriesActivation: tokenContract() is 0x…4516a5d613c30a36d157d3b579813734cbb929a4, maxTimestampAge() is 0x…e10 (3600), owner() is 0x…73196fa74d6061e02648078246a1fe4d93a7ac2f
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x412e962bbae0bb97ce98e74f3424543651a21ce3","data":"0x55a373d6"},"latest"]}'
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x412e962bbae0bb97ce98e74f3424543651a21ce3","data":"0x0dee2789"},"latest"]}'
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x412e962bbae0bb97ce98e74f3424543651a21ce3","data":"0x8da5cb5b"},"latest"]}'
```
With [Foundry](https://www.getfoundry.sh/introduction/installation) installed, its `cast` command runs the same checks and decodes the answers:
```sh
export ETH_RPC_URL=https://mainnet.base.org
# Implementation behind the proxy: 0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c
cast implementation 0x4516a5d613c30a36d157d3b579813734cbb929a4
# 2
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'seriesCount()(uint256)'
# true
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'hasRole(bytes32,address)(bool)' $(cast keccak MINTER_ROLE) 0x73196fa74d6061e02648078246a1fE4D93a7AC2f
# false
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'paused()(bool)'
# 0x4516a5D613C30A36D157d3b579813734cbb929a4, 3600, 0x73196fa74d6061e02648078246a1fE4D93a7AC2f
cast call 0x412e962bbae0bb97ce98e74f3424543651a21ce3 'tokenContract()(address)'
cast call 0x412e962bbae0bb97ce98e74f3424543651a21ce3 'maxTimestampAge()(uint256)'
cast call 0x412e962bbae0bb97ce98e74f3424543651a21ce3 'owner()(address)'
```
The ABIs are served at [/abi/smartmetal.json](https://veri.how/abi/smartmetal.json) (the proxy), [/abi/series1155v1.json](https://veri.how/abi/series1155v1.json) and [/abi/smartmetal-activation.json](https://veri.how/abi/smartmetal-activation.json). To decode calls to the token, use the `Series1155V1` ABI against the proxy address. The [data files](https://veri.how/data.md) page lists every file.
## Sources
1. [Veri SmartMetal proxy, verified source on BaseScan](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4#code)
2. [Series1155V1, verified source on BaseScan](https://basescan.org/address/0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c#code)
3. [SeriesActivation, verified source on BaseScan](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3#code)
4. [Proxy creation transaction, BaseScan](https://basescan.org/tx/0x565a24675da44a562bb5b747b81cdd9290ad0d58f86b1e635e7d888083e3c53e)
5. [QRToken contract reference, Series1155V1](https://docs.qrtoken.xyz/reference/contracts/series1155v1/)
6. [QRToken contract reference, SeriesActivation](https://docs.qrtoken.xyz/reference/contracts/seriesactivation/)
7. [EIP-1967: Proxy Storage Slots](https://eips.ethereum.org/EIPS/eip-1967)
## Related
- [SmartMetal series: 2024 and the Limited Edition Azure Dragon](https://veri.how/smartmetal/series.md): The Veri SmartMetal contract has two series, the 2024 series of 6,566 tokens (ids 1 to 6566, created on chain on 22 May 2025) and Veri SmartMetal Limited Edition Azure Dragon, 16 tokens created on 28 May 2026; each series is one metadata folder on IPFS, and its id is the keccak256 hash of that folder's CID.
- [Look up a SmartMetal token](https://veri.how/smartmetal/lookup.md): Given a SmartMetal token id, read its series with tokenSeries(id) and its metadata URI with uri(id) on the token contract, fetch the metadata JSON from any IPFS gateway, and ask SeriesActivation whether it is activated with tokenStatus(id); veri.how also serves the indexed answer at /smartmetal/tokens/.json.
- [Activate a SmartMetal](https://veri.how/smartmetal/activate.md): Activation is one transaction on Base, activate(timestamp, signature) on SeriesActivation, in which the key from the token's QR code signs the activator's address and a timestamp no more than an hour old, and the contract transfers the token from itself to the activator's wallet and emits TokenActivated.
- [veri.vip](https://veri.how/smartmetal/veri-vip.md): veri.vip is the website that shows one page per Veri SmartMetal token, at veri.vip/, built with QRToken; every value on a page is tagged as read from the Base blockchain or from the token's metadata file on IPFS, so each can be checked without the site.
---
title: "SmartMetal series: 2024 and the Limited Edition Azure Dragon"
description: The Veri SmartMetal contract has two series, the 2024 series of 6,566 tokens (ids 1 to 6566, created on chain on 22 May 2025) and Veri SmartMetal Limited Edition Azure Dragon, 16 tokens created on 28 May 2026; each series is one metadata folder on IPFS, and its id is the keccak256 hash of that folder's CID.
url: https://veri.how/smartmetal/series
area: smartmetal
kind: reference
updated: 2026-10-15T00:00:00Z
author: Patryk Dwórznik
license: CC BY 4.0
contracts:
- id: eip155:8453:0x4516a5d613c30a36d157d3b579813734cbb929a4
name: Veri SmartMetal
verified:
date: 2026-10-13
sources:
- title: SeriesCreated transaction of the 2024 series, BaseScan
url: https://basescan.org/tx/0xe9196b44618a89a3f9a1c8f9ce579aa704e4621d5a8899634290cef868b7742a
- title: SeriesCreated transaction of the Azure Dragon series, BaseScan
url: https://basescan.org/tx/0xcbb3ab4f328c251b3ef6f79ee20682a236f2072121245737ffac3d25eac0f051
- title: Azure Dragon mint transaction, BaseScan
url: https://basescan.org/tx/0x8feda5b27a8c8ea455575445b7165d7c2eadd5cfbc37269ac49c04177257beb0
- title: Metadata of token 1, IPFS
url: https://gateway.pinata.cloud/ipfs/QmU8oEWK3KNrJqHGtWgpZzjcUBukmSLutFY6ZxGGkcEdLf/1.json
- title: Metadata of token 7777, IPFS
url: https://gateway.pinata.cloud/ipfs/QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json
- title: QRToken contract reference, Series1155V1
url: https://docs.qrtoken.xyz/reference/contracts/series1155v1/
---
# SmartMetal series: 2024 and the Limited Edition Azure Dragon
The Veri SmartMetal contract has two series, the 2024 series of 6,566 tokens (ids 1 to 6566, created on chain on 22 May 2025) and Veri SmartMetal Limited Edition Azure Dragon, 16 tokens created on 28 May 2026; each series is one metadata folder on IPFS, and its id is the keccak256 hash of that folder's CID.
## Facts
| Fact | Value |
| --- | --- |
| Address | [0x4516a5D613C30A36D157d3b579813734cbb929a4](https://basescan.org/token/0x4516a5d613c30a36d157d3b579813734cbb929a4) |
| Chain | [Base (eip155:8453)](https://basescan.org) |
| Standard | [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) |
| Proxy | [ERC-1967](https://eips.ethereum.org/EIPS/eip-1967) |
| Implementation | [Series1155V1 0x945D54B21a582d5D186Ae1E449DdC2a4Ce39E26c](https://basescan.org/address/0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c#code) |
| Deployed | [Block 30,569,433 · 22 May 2025](https://basescan.org/tx/0x565a24675da44a562bb5b747b81cdd9290ad0d58f86b1e635e7d888083e3c53e) |
| Source | [Verified on BaseScan](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4#code) |
| Transactions | [All transactions](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4) |
| ABI | [smartmetal.json](https://veri.how/abi/smartmetal.json) |
| Last verified | 13 Oct 2026 |
A series is a group of SmartMetal tokens that share one metadata folder on IPFS. The token contract, 0x4516a5D613C30A36D157d3b579813734cbb929a4, had two on 13 Oct 2026 (`seriesCount()` returns 2), and `totalSupply()` returns 6,582, the two series added together. Every token in both is non-fungible: `totalSupply(id)` is 1 for each id.
| Series | Series id | Metadata folder (CID) | Token ids | Created on chain |
| -------------------------------------------- | ------------- | ------------------------------------------------ | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- |
| 2024 | `0x2ee2…939a` | `QmU8oEWK3KNrJqHGtWgpZzjcUBukmSLutFY6ZxGGkcEdLf` | 1 to 6566 (6,566 tokens) | 22 May 2025, block [30,569,486](https://basescan.org/tx/0xe9196b44618a89a3f9a1c8f9ce579aa704e4621d5a8899634290cef868b7742a) |
| Veri SmartMetal Limited Edition Azure Dragon | `0x2d3e…b9d6` | `QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht` | 16 ids, 7777 to 88888888888 (listed below) | 28 May 2026, block [46,583,469](https://basescan.org/tx/0xcbb3ab4f328c251b3ef6f79ee20682a236f2072121245737ffac3d25eac0f051) |
The same table is in [/facts.json](https://veri.how/facts.json) under `series`, with the full series ids.
## How a series id is made
[`createSeries(cid, isFungible)`](https://docs.qrtoken.xyz/reference/contracts/series1155v1/#createseries) sets the series id to `keccak256` of the CID string, exactly as written, so anyone can compute it offline:
```sh
# keccak256("QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht") = 0x2d3e0395c9e91e036ad74f6010443210c6a13260c88e93fc7c2fecc2d577b9d6
node -e 'const {keccak_256}=require("@noble/hashes/sha3.js");const {bytesToHex,utf8ToBytes}=require("@noble/hashes/utils.js");console.log("0x"+bytesToHex(keccak_256(utf8ToBytes("QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht"))))'
# or, with Foundry's cast
cast keccak QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht
```
The hash equals the `seriesId` topic of the series' `SeriesCreated` log, and `listSeries` returns the same pairs of id and CID. Because the id is the hash of the CID, the same metadata folder gets the same series id on any chain, and `createSeries` refuses a CID that was already registered.
## The 2024 series
The 2024 series holds the rounds minted in 2024: each token is named `Veri SmartMetal Silver Round #` and its metadata has `year: 2024`. On chain, the series was created on 22 May 2025 at 15:38:39 UTC in block [30,569,486](https://basescan.org/block/30569486) ([transaction](https://basescan.org/tx/0xe9196b44618a89a3f9a1c8f9ce579aa704e4621d5a8899634290cef868b7742a)), 53 blocks after the token contract itself, and its 6,566 tokens were minted over the following quarter of an hour:
- Ids 1 to 6566 were registered with `SeriesActivation` first, 100 per transaction, in 66 transactions between blocks [30,569,508](https://basescan.org/block/30569508) and [30,569,699](https://basescan.org/block/30569699).
- They were then minted to `SeriesActivation` (0x412E962bbAE0bB97CE98e74f3424543651a21ce3), again 100 per transaction, from block [30,569,702](https://basescan.org/block/30569702) ([ids 1 to 100](https://basescan.org/tx/0x10f9b315db348ad77383185cf198997446c4b39f93b1c1bcb6f1e65f2ee01f7a)) to block [30,569,892](https://basescan.org/block/30569892) ([ids 6501 to 6566](https://basescan.org/tx/0x0520a81086cda4a82b9839cba6cbf221c2e6c9b74d591955bd46e3417b1103a5)). Each mint emitted one `URI` event per token, one `TransferBatch` and one `SeriesTokensMinted`.
`seriesTokenCount` returns 6,566 and `seriesTokens` lists the ids 1, 2, 3 … 6566 with no gaps. Id 6567 does not exist (`exists(6567)` is false).
Every 2024 token shares one image, `ipfs://QmYsiGSYWx6mn3TgLZfoZVRqqNjuyvTLziWscfjme3tmAK`, and the same attributes apart from its serial number: metal Silver, purity 0.999, weight 1 oz, year 2024, mint Veritaseum, serial number equal to the token id. [Look up a SmartMetal token](https://veri.how/smartmetal/lookup.md) shows the full metadata file.
## Veri SmartMetal Limited Edition Azure Dragon
The second series was created on 28 May 2026 at 08:18:05 UTC in block [46,583,469](https://basescan.org/block/46583469) ([transaction](https://basescan.org/tx/0xcbb3ab4f328c251b3ef6f79ee20682a236f2072121245737ffac3d25eac0f051)). Its 16 holders were registered three blocks later ([transaction](https://basescan.org/tx/0x66a0b9b0d7803d535f95b2445e78a9e7941d208ea82faf14fd75c949bb12253a)) and the 16 tokens were minted to `SeriesActivation` in block [46,583,475](https://basescan.org/block/46583475) ([transaction](https://basescan.org/tx/0x8feda5b27a8c8ea455575445b7165d7c2eadd5cfbc37269ac49c04177257beb0)), twelve seconds after the series was created.
The token ids are the repdigits of 7 and 8 from four to eleven digits long:
| Length | Ids |
| ------ | ------------------------ |
| 4 | 7777, 8888 |
| 5 | 77777, 88888 |
| 6 | 777777, 888888 |
| 7 | 7777777, 8888888 |
| 8 | 77777777, 88888888 |
| 9 | 777777777, 888888888 |
| 10 | 7777777777, 8888888888 |
| 11 | 77777777777, 88888888888 |
Each token is named `Veri SmartMetal Limited Edition Azure Dragon #`, described as "The Azure Dragon of Ancient Chinese Mythology", with its own image (token 7777's is `ipfs://QmR2coRJYva1ACFU3gMzZRX2LaZztWTFcPrDKvG3FimH6S`) and the attributes metal Silver, purity 0.999, weight 1 oz, year 2026, mint Veritaseum, serial number equal to the token id.
## Check it yourself
Each command is an [`eth_call`](https://ethereum.org/developers/docs/apis/json-rpc/#eth-call) to a public Base endpoint; swap in `https://base-rpc.publicnode.com` if the first one is busy.
```sh
# seriesCount(): 0x…02
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0xd7f2c0ef"},"latest"]}'
# listSeries(0, 10): both series ids, then both CIDs as ABI-encoded strings
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0x71ab8b690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a"},"latest"]}'
# seriesTokenCount(2024 series): 0x…19a6, which is 6566
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0xe3c3d74a2ee24f76bf0ebc754064e8c31709a2241c2c2969694a5f3ba3dd956833de939a"},"latest"]}'
# seriesTokens(Azure Dragon series, 0, 16): the 16 ids, 7777 (0x1e61) first
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0xee47a9272d3e0395c9e91e036ad74f6010443210c6a13260c88e93fc7c2fecc2d577b9d600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010"},"latest"]}'
# totalSupply(): 0x…19b6, which is 6582
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0x18160ddd"},"latest"]}'
```
With [Foundry](https://www.getfoundry.sh/introduction/installation) installed, its `cast` command runs the same calls and decodes the answers:
```sh
export ETH_RPC_URL=https://mainnet.base.org
# 2
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'seriesCount()(uint256)'
# Both series ids, then both CIDs
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'listSeries(uint256,uint256)(bytes32[],string[])' 0 10
# 6566
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'seriesTokenCount(uint256)(uint256)' 0x2ee24f76bf0ebc754064e8c31709a2241c2c2969694a5f3ba3dd956833de939a
# [7777, 8888, 77777, …, 88888888888]
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'seriesTokens(uint256,uint256,uint256)(uint256[])' 0x2d3e0395c9e91e036ad74f6010443210c6a13260c88e93fc7c2fecc2d577b9d6 0 16
# 6582
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'totalSupply()(uint256)'
```
To read the series without curl, open the contract's [Read as Proxy](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4#readProxyContract) view on BaseScan and call `listSeries` with offset 0 and limit 10.
## Sources
1. [SeriesCreated transaction of the 2024 series, BaseScan](https://basescan.org/tx/0xe9196b44618a89a3f9a1c8f9ce579aa704e4621d5a8899634290cef868b7742a)
2. [SeriesCreated transaction of the Azure Dragon series, BaseScan](https://basescan.org/tx/0xcbb3ab4f328c251b3ef6f79ee20682a236f2072121245737ffac3d25eac0f051)
3. [Azure Dragon mint transaction, BaseScan](https://basescan.org/tx/0x8feda5b27a8c8ea455575445b7165d7c2eadd5cfbc37269ac49c04177257beb0)
4. [Metadata of token 1, IPFS](https://gateway.pinata.cloud/ipfs/QmU8oEWK3KNrJqHGtWgpZzjcUBukmSLutFY6ZxGGkcEdLf/1.json)
5. [Metadata of token 7777, IPFS](https://gateway.pinata.cloud/ipfs/QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json)
6. [QRToken contract reference, Series1155V1](https://docs.qrtoken.xyz/reference/contracts/series1155v1/)
## Related
- [Veri SmartMetal contracts on Base](https://veri.how/smartmetal/contracts.md): Veri SmartMetal is an ERC-1155 token at 0x4516a5D613C30A36D157d3b579813734cbb929a4 on Base, an ERC-1967 proxy in front of the Series1155V1 implementation, with a separate SeriesActivation contract that holds every token until its holder activates it; all three were deployed on 22 May 2025 and are built on QRToken.
- [Look up a SmartMetal token](https://veri.how/smartmetal/lookup.md): Given a SmartMetal token id, read its series with tokenSeries(id) and its metadata URI with uri(id) on the token contract, fetch the metadata JSON from any IPFS gateway, and ask SeriesActivation whether it is activated with tokenStatus(id); veri.how also serves the indexed answer at /smartmetal/tokens/.json.
- [Activate a SmartMetal](https://veri.how/smartmetal/activate.md): Activation is one transaction on Base, activate(timestamp, signature) on SeriesActivation, in which the key from the token's QR code signs the activator's address and a timestamp no more than an hour old, and the contract transfers the token from itself to the activator's wallet and emits TokenActivated.
- [veri.vip](https://veri.how/smartmetal/veri-vip.md): veri.vip is the website that shows one page per Veri SmartMetal token, at veri.vip/, built with QRToken; every value on a page is tagged as read from the Base blockchain or from the token's metadata file on IPFS, so each can be checked without the site.
---
title: Look up a SmartMetal token
description: Given a SmartMetal token id, read its series with tokenSeries(id) and its metadata URI with uri(id) on the token contract, fetch the metadata JSON from any IPFS gateway, and ask SeriesActivation whether it is activated with tokenStatus(id); veri.how also serves the indexed answer at /smartmetal/tokens/.json.
url: https://veri.how/smartmetal/lookup
area: smartmetal
kind: howto
updated: 2026-10-15T00:00:00Z
author: Patryk Dwórznik
license: CC BY 4.0
contracts:
- id: eip155:8453:0x4516a5d613c30a36d157d3b579813734cbb929a4
name: Veri SmartMetal
verified:
date: 2026-10-13
- id: eip155:8453:0x412e962bbae0bb97ce98e74f3424543651a21ce3
name: SeriesActivation
verified:
date: 2026-10-13
sources:
- title: Veri SmartMetal token on BaseScan
url: https://basescan.org/token/0x4516a5d613c30a36d157d3b579813734cbb929a4
- title: Metadata of token 7777, IPFS
url: https://gateway.pinata.cloud/ipfs/QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json
- title: Metadata of token 1, IPFS
url: https://gateway.pinata.cloud/ipfs/QmU8oEWK3KNrJqHGtWgpZzjcUBukmSLutFY6ZxGGkcEdLf/1.json
- title: QRToken contract reference, SeriesActivation
url: https://docs.qrtoken.xyz/reference/contracts/seriesactivation/
- title: "EIP-1155: Multi Token Standard, metadata"
url: https://eips.ethereum.org/EIPS/eip-1155#metadata
---
# Look up a SmartMetal token
Given a SmartMetal token id, read its series with tokenSeries(id) and its metadata URI with uri(id) on the token contract, fetch the metadata JSON from any IPFS gateway, and ask SeriesActivation whether it is activated with tokenStatus(id); veri.how also serves the indexed answer at /smartmetal/tokens/.json.
## Facts
**Veri SmartMetal**
| Fact | Value |
| --- | --- |
| Address | [0x4516a5D613C30A36D157d3b579813734cbb929a4](https://basescan.org/token/0x4516a5d613c30a36d157d3b579813734cbb929a4) |
| Chain | [Base (eip155:8453)](https://basescan.org) |
| Standard | [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) |
| Proxy | [ERC-1967](https://eips.ethereum.org/EIPS/eip-1967) |
| Implementation | [Series1155V1 0x945D54B21a582d5D186Ae1E449DdC2a4Ce39E26c](https://basescan.org/address/0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c#code) |
| Deployed | [Block 30,569,433 · 22 May 2025](https://basescan.org/tx/0x565a24675da44a562bb5b747b81cdd9290ad0d58f86b1e635e7d888083e3c53e) |
| Source | [Verified on BaseScan](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4#code) |
| Transactions | [All transactions](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4) |
| ABI | [smartmetal.json](https://veri.how/abi/smartmetal.json) |
| Last verified | 13 Oct 2026 |
**SeriesActivation**
| Fact | Value |
| --- | --- |
| Address | [0x412E962bbAE0bB97CE98e74f3424543651a21ce3](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3) |
| Chain | [Base (eip155:8453)](https://basescan.org) |
| Deployed | [Block 30,569,436 · 22 May 2025](https://basescan.org/tx/0x9c8f01b4f78f24f948e0f77ada064817637e548bbe9b8ae9ef010cbd8f1dcafa) |
| First activation | [Block 30,576,415 · 22 May 2025](https://basescan.org/tx/0x90aebc8390cc4b4ba96b0c7c4199353b577c4b4bc0b5f4e45e6d0575f406d754) |
| Owner | [0x73196fa74d6061e02648078246a1fE4D93a7AC2f](https://basescan.org/address/0x73196fa74d6061e02648078246a1fe4d93a7ac2f) |
| Source | [Verified on BaseScan](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3#code) |
| Transactions | [All transactions](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3) |
| ABI | [smartmetal-activation.json](https://veri.how/abi/smartmetal-activation.json) |
| Last verified | 13 Oct 2026 |
You need a token id and `curl`. The id is the serial number on the piece and in its QR code; veri.vip shows it as `#`. The examples use token 7777, from the Limited Edition Azure Dragon series; replace it with yours. In calldata, the id is a 32-byte word: 7777 is `0x1e61`, left-padded with zeros to 64 hex characters. Each call below is an [`eth_call`](https://ethereum.org/developers/docs/apis/json-rpc/#eth-call) to a public Base endpoint; Base uses the Ethereum JSON-RPC API.
## 1. Find its series
Call [`tokenSeries(id)`](https://docs.qrtoken.xyz/reference/contracts/series1155v1/#tokenseries), selector `0x44bdde08`, on the token contract. The answer is the series id, which [SmartMetal series](https://veri.how/smartmetal/series.md) maps to a name and a metadata folder:
```sh
# tokenSeries(7777): 0x2d3e0395…b9d6, the Azure Dragon series
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0x44bdde080000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'
```
With [Foundry](https://www.getfoundry.sh/introduction/installation) installed, its `cast` command runs the same call and decodes the answers:
```sh
export ETH_RPC_URL=https://mainnet.base.org
# 0x2d3e0395c9e91e036ad74f6010443210c6a13260c88e93fc7c2fecc2d577b9d6
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'tokenSeries(uint256)(bytes32)' 7777
```
`cast` takes the id in decimal, so there is no padding to do. Later steps show `cast` the same way.
An id that was never minted answers all zeros. Without a call, the rule in [/facts.json](https://veri.how/facts.json) gives the same answer: ids 1 to 6566 are the 2024 series, and the 16 repdigit ids from 7777 to 88888888888 are the Azure Dragon series.
## 2. Read its metadata
`uri(id)`, selector `0x0e89341c`, returns an ABI-encoded string of the form `ipfs:///.json`:
```sh
# uri(7777): "ipfs://QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json"
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0x0e89341c0000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'
```
```sh
export ETH_RPC_URL=https://mainnet.base.org
# "ipfs://QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json"
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'uri(uint256)(string)' 7777
```
Fetch the file from a public IPFS gateway by replacing `ipfs://` with the gateway's `/ipfs/` path:
```sh
curl -s https://gateway.pinata.cloud/ipfs/QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json
curl -s https://dweb.link/ipfs/QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json
```
veri.vip links the same file on its own gateway, `ipfs.veridao.io`, which answers browsers but turns crawlers away in its robots.txt.
The file for token 7777, as served on 13 Oct 2026:
```json
{
"name": "Veri SmartMetal Limited Edition Azure Dragon #7777",
"description": "The Azure Dragon of Ancient Chinese Mythology",
"image": "ipfs://QmR2coRJYva1ACFU3gMzZRX2LaZztWTFcPrDKvG3FimH6S",
"external_url": "https://veri.vip/7777",
"attributes": [
{ "key": "metal", "trait_type": "Metal", "value": "Silver" },
{ "key": "purity", "trait_type": "Purity", "value": 0.999, "display_type": "number" },
{ "key": "weight_oz", "trait_type": "Weight (oz)", "value": 1, "display_type": "number" },
{ "key": "year", "trait_type": "Year", "value": 2026, "display_type": "date" },
{ "key": "mint", "trait_type": "Mint", "value": "Veritaseum" },
{
"key": "serial_number",
"trait_type": "Serial Number",
"value": 7777,
"display_type": "number"
},
{ "key": "ai_agent_access", "trait_type": "AI Agent Access", "value": true },
{ "key": "p2p_trading", "trait_type": "P2P Trading", "value": true },
{ "key": "derivatives", "trait_type": "Derivatives", "value": true }
],
"properties": {
"metal": "Silver",
"purity": { "name": "Purity", "value": 0.999, "display_value": "99.9%" },
"weight_oz": { "name": "Weight (oz)", "value": 1, "display_value": "1oz" },
"year": 2026,
"mint": "Veritaseum",
"serial_number": { "name": "Serial Number", "value": 7777, "display_value": "7777" },
"ai_agent_access": true,
"p2p_trading": true,
"derivatives": true
}
}
```
The fields, which both series share:
| Field | Meaning |
| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `name`, `description`, `image`, `external_url` | The usual ERC-1155 metadata. `image` is an `ipfs://` CID; `external_url` is the token's page on veri.vip. |
| `attributes[]` | One entry per trait with `key`, `trait_type`, `value` and, for numbers and dates, `display_type`. The shape marketplaces read. |
| `properties{}` | The same values keyed by name, with a `display_value` string where the number needs a unit ("99.9%", "1oz"). |
| `ai_agent_access`, `p2p_trading`, `derivatives` | Boolean flags, `true` on every token seen. veri.vip shows their labels with no value. |
A 2024 token's file has the same shape with `name` `Veri SmartMetal Silver Round #`, `description` "This is a Veri SmartMetal token.", `year` 2024, `display_value` "1 oz" and one shared image, `ipfs://QmYsiGSYWx6mn3TgLZfoZVRqqNjuyvTLziWscfjme3tmAK`. The `year` is the year the round was minted; the on-chain dates are in [SmartMetal series](https://veri.how/smartmetal/series.md).
## 3. Check whether it is activated
Ask `SeriesActivation`, 0x412E962bbAE0bB97CE98e74f3424543651a21ce3. [`tokenStatus(id)`](https://docs.qrtoken.xyz/reference/contracts/seriesactivation/#tokenstatus), selector `0xb01ce31f`, returns one byte:
| Value | Meaning |
| ----- | ------------------------------------------------------------------- |
| `0` | Registered and waiting for activation; `SeriesActivation` holds it. |
| `1` | No registration for this id: it is not a SmartMetal token. |
| `2` | Activated: the token has left for its activator's wallet. |
```sh
# tokenStatus(7777): 0x…00 on 13 Oct 2026, not yet activated
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x412e962bbae0bb97ce98e74f3424543651a21ce3","data":"0xb01ce31f0000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'
# activatedTokens(7777): the same answer as a boolean, 0x…00
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x412e962bbae0bb97ce98e74f3424543651a21ce3","data":"0x4e0619c00000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'
# tokenHolders(7777): the registered holder address while it waits; all zeros once activated
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x412e962bbae0bb97ce98e74f3424543651a21ce3","data":"0x923108d90000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'
```
```sh
export ETH_RPC_URL=https://mainnet.base.org
# 0, false, then the registered holder address
cast call 0x412e962bbae0bb97ce98e74f3424543651a21ce3 'tokenStatus(uint256)(uint8)' 7777
cast call 0x412e962bbae0bb97ce98e74f3424543651a21ce3 'activatedTokens(uint256)(bool)' 7777
cast call 0x412e962bbae0bb97ce98e74f3424543651a21ce3 'tokenHolders(uint256)(address)' 7777
```
`tokenHolders(id)` is the ephemeral address whose key is in the token's QR code, not the owner of the piece. It is cleared on activation, so it says nothing about who holds an activated token. For that, read `balanceOf(address, id)` on the token contract (selector `0x00fdd58e`), or the `TransferSingle` log of the activation transaction; how the transfer happens is in [Activate a SmartMetal](https://veri.how/smartmetal/activate.md).
```sh
# balanceOf(SeriesActivation, 7777): 0x…01 while the token is unactivated
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0x00fdd58e000000000000000000000000412e962bbae0bb97ce98e74f3424543651a21ce30000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'
```
```sh
export ETH_RPC_URL=https://mainnet.base.org
# 1
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'balanceOf(address,uint256)(uint256)' 0x412e962bbae0bb97ce98e74f3424543651a21ce3 7777
```
## The indexed answer
veri.how indexes the activation and transfer logs of both contracts about every 15 minutes and serves one JSON file per token:
```sh
curl -s https://veri.how/smartmetal/tokens/7777.json
```
It returns the series, whether the token is activated and when (time, block and transaction), the current holder, the metadata CID, `asOfBlock` (the last Base block the answer includes) and `check`, a curl command that asks `SeriesActivation` directly, as in step 3. [`/smartmetal/tokens.json`](https://veri.how/smartmetal/tokens.json) lists every token the same way, and an id in no series answers 404. The [data files](https://veri.how/data.md) page lists the site's data files. The file is a convenience: when it matters, re-check on chain, since the snapshot can be up to 15 minutes and a few blocks behind.
## On BaseScan
BaseScan runs the same three reads in a browser. The token contract is a proxy, so its functions are under **Read as Proxy**, not **Read Contract**, which only lists the proxy's own code:
1. Open the [token contract](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4#readProxyContract), choose the **Contract** tab, then **Read as Proxy**. It lists the implementation's functions; those that take no input, such as `seriesCount` and `totalSupply`, show their value at once.
2. Open `tokenSeries`, enter the token id in `tokenId` and press **Query**. The result is the series id from step 1 as a decimal number; `cast to-hex` or `python3 -c 'print(hex())'` turns it back into the `0x2d3e…b9d6` form.
3. Open `uri`, enter the same id and press **Query**. The result is the `ipfs:///.json` path from step 2; fetch it through a gateway as above.
4. For the status, open the [activation contract](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3#readContract), choose **Contract**, then **Read Contract**, open `tokenStatus`, enter the id and press **Query**. The result is `0`, `1` or `2` as in the table in step 3. `tokenHolders` with the same id returns the holder key's address, or the zero address once the token is activated.
BaseScan also shows a token at `https://basescan.org/token/0x4516a5d613c30a36d157d3b579813734cbb929a4?a=`, with its transfers, and [veri.vip](https://veri.how/smartmetal/veri-vip.md) shows one page per token at `https://veri.vip/`, with each value tagged by its source.
## For agents and tools
The committed ABIs decode every call above: [/abi/series1155v1.json](https://veri.how/abi/series1155v1.json) for the token (call it at the proxy address) and [/abi/smartmetal-activation.json](https://veri.how/abi/smartmetal-activation.json) for `SeriesActivation`. [/facts.json](https://veri.how/facts.json) carries both addresses, the series with their id ranges and CIDs, and the metadata lookup rule, so a tool can go from an id to a metadata URL without a call.
## Sources
1. [Veri SmartMetal token on BaseScan](https://basescan.org/token/0x4516a5d613c30a36d157d3b579813734cbb929a4)
2. [Metadata of token 7777, IPFS](https://gateway.pinata.cloud/ipfs/QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json)
3. [Metadata of token 1, IPFS](https://gateway.pinata.cloud/ipfs/QmU8oEWK3KNrJqHGtWgpZzjcUBukmSLutFY6ZxGGkcEdLf/1.json)
4. [QRToken contract reference, SeriesActivation](https://docs.qrtoken.xyz/reference/contracts/seriesactivation/)
5. [EIP-1155: Multi Token Standard, metadata](https://eips.ethereum.org/EIPS/eip-1155#metadata)
## Related
- [Veri SmartMetal contracts on Base](https://veri.how/smartmetal/contracts.md): Veri SmartMetal is an ERC-1155 token at 0x4516a5D613C30A36D157d3b579813734cbb929a4 on Base, an ERC-1967 proxy in front of the Series1155V1 implementation, with a separate SeriesActivation contract that holds every token until its holder activates it; all three were deployed on 22 May 2025 and are built on QRToken.
- [SmartMetal series: 2024 and the Limited Edition Azure Dragon](https://veri.how/smartmetal/series.md): The Veri SmartMetal contract has two series, the 2024 series of 6,566 tokens (ids 1 to 6566, created on chain on 22 May 2025) and Veri SmartMetal Limited Edition Azure Dragon, 16 tokens created on 28 May 2026; each series is one metadata folder on IPFS, and its id is the keccak256 hash of that folder's CID.
- [Activate a SmartMetal](https://veri.how/smartmetal/activate.md): Activation is one transaction on Base, activate(timestamp, signature) on SeriesActivation, in which the key from the token's QR code signs the activator's address and a timestamp no more than an hour old, and the contract transfers the token from itself to the activator's wallet and emits TokenActivated.
- [veri.vip](https://veri.how/smartmetal/veri-vip.md): veri.vip is the website that shows one page per Veri SmartMetal token, at veri.vip/, built with QRToken; every value on a page is tagged as read from the Base blockchain or from the token's metadata file on IPFS, so each can be checked without the site.
---
title: Activate a SmartMetal
description: Activation is one transaction on Base, activate(timestamp, signature) on SeriesActivation, in which the key from the token's QR code signs the activator's address and a timestamp no more than an hour old, and the contract transfers the token from itself to the activator's wallet and emits TokenActivated.
url: https://veri.how/smartmetal/activate
area: smartmetal
kind: howto
updated: 2026-10-15T00:00:00Z
author: Patryk Dwórznik
license: CC BY 4.0
contracts:
- id: eip155:8453:0x412e962bbae0bb97ce98e74f3424543651a21ce3
name: SeriesActivation
verified:
date: 2026-10-13
sources:
- title: SeriesActivation, verified source on BaseScan
url: https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3#code
- title: QRToken contract reference, SeriesActivation
url: https://docs.qrtoken.xyz/reference/contracts/seriesactivation/
- title: QRToken getting started, Activate
url: https://docs.qrtoken.xyz/getting-started/#6-activate
- title: Activation of token 2259 on 25 Aug 2026, BaseScan
url: https://basescan.org/tx/0x09cebf3a9f8c278722d10849ede67deada5712753f39f1319c19ebd9c590a7ba
- title: "EIP-191: Signed Data Standard"
url: https://eips.ethereum.org/EIPS/eip-191
---
# Activate a SmartMetal
Activation is one transaction on Base, activate(timestamp, signature) on SeriesActivation, in which the key from the token's QR code signs the activator's address and a timestamp no more than an hour old, and the contract transfers the token from itself to the activator's wallet and emits TokenActivated.
## Facts
| Fact | Value |
| --- | --- |
| Address | [0x412E962bbAE0bB97CE98e74f3424543651a21ce3](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3) |
| Chain | [Base (eip155:8453)](https://basescan.org) |
| Deployed | [Block 30,569,436 · 22 May 2025](https://basescan.org/tx/0x9c8f01b4f78f24f948e0f77ada064817637e548bbe9b8ae9ef010cbd8f1dcafa) |
| First activation | [Block 30,576,415 · 22 May 2025](https://basescan.org/tx/0x90aebc8390cc4b4ba96b0c7c4199353b577c4b4bc0b5f4e45e6d0575f406d754) |
| Owner | [0x73196fa74d6061e02648078246a1fE4D93a7AC2f](https://basescan.org/address/0x73196fa74d6061e02648078246a1fe4d93a7ac2f) |
| Source | [Verified on BaseScan](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3#code) |
| Transactions | [All transactions](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3) |
| ABI | [smartmetal-activation.json](https://veri.how/abi/smartmetal-activation.json) |
| Last verified | 13 Oct 2026 |
Every SmartMetal token is minted to `SeriesActivation`, 0x412E962bbAE0bB97CE98e74f3424543651a21ce3, and stays there until it is activated. Activation is how the token reaches the wallet of whoever holds the physical piece. This article covers what happens on chain, which is the same whichever app sends the transaction. It does not cover the QR code itself.
## What you need
- **The key from the piece's QR code.** The QR code carries a private key, the holder key. Its address was registered with `SeriesActivation` before the token was minted (`tokenHolders(id)` returns it), and it can sign for that one token only.
- **A wallet on Base** with a little ETH for gas. This wallet, the activator, sends the transaction and receives the token. In the one example below, activation used 94,541 gas.
- **A token that is still waiting.** `tokenStatus(id)` must return `0`; see [Look up a SmartMetal token](https://veri.how/smartmetal/lookup.md#3-check-whether-it-is-activated).
## 1. Sign the message with the holder key
The holder key signs the current Unix timestamp and the activator's address, packed together, as an [EIP-191](https://eips.ethereum.org/EIPS/eip-191) personal message:
```
message = keccak256(abi.encodePacked(timestamp, activator)) // uint256, then address
signature = sign("\x19Ethereum Signed Message:\n32" ‖ message) // 65 bytes: r, s, v
```
This is the format the [QRToken documentation](https://docs.qrtoken.xyz/getting-started/#6-activate) gives; the signature must recover to the registered holder, so any other message fails. Because the activator's address is inside the signed message, a signature only works for the wallet it was made for, and because the timestamp is inside it, it only works for an hour.
## 2. Send activate from the activator wallet
Call [`activate(uint256 timestamp, bytes signature)`](https://docs.qrtoken.xyz/reference/contracts/seriesactivation/#activate), selector `0x5314e9fa`, on 0x412E962bbAE0bB97CE98e74f3424543651a21ce3 from the activator wallet. No token id is passed: the contract recovers the signer from the signature and looks the token up with `holderTokenIds(signer)`, the reverse of `tokenHolders`. Anyone may call the function; what it checks is the signature, not the caller.
## 3. What the contract checks
The errors `activate` declares for these checks, from the ABI and the [QRToken reference](https://docs.qrtoken.xyz/reference/contracts/seriesactivation/); the order they are checked in is in the [verified source](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3#code):
| Error | When |
| --------------------------- | -------------------------------------------------------------------------------- |
| `FutureTimestampNotAllowed` | declared for a timestamp later than the block's time; see the note below |
| `TimestampTooOld` | the timestamp is more than `maxTimestampAge` seconds old, 3,600 since deployment |
| `InvalidSignature` | the signature is malformed or does not recover to a registered holder |
| `HolderNotRegistered` | the recovered signer is not registered for any token |
| `TokenAlreadyActivated` | that holder's token was activated before |
A timestamp even one second ahead of the block does not reach `FutureTimestampNotAllowed` in the deployed contract: a dry run on 15 Oct 2026 reverted with an arithmetic panic (`Panic(0x11)`) instead. Take the timestamp from the chain, not from your computer's clock, as the example below does.
The checks need no backend, oracle or allow-list: the only inputs are the timestamp and the signature, and the only state is what was registered at mint.
## 4. What happens
When the checks pass, in one transaction:
1. `SeriesActivation` marks the token activated (`activatedTokens(id)` becomes `true`, `tokenStatus(id)` becomes `2`) and clears `tokenHolders(id)` to the zero address, so the holder key cannot be used again.
2. It transfers the token to the activator: the token contract emits `TransferSingle(operator, from, to, id, 1)` with `from` and `operator` both `SeriesActivation` and `to` the activator.
3. It emits `TokenActivated(tokenId, holder, activator)`.
From then on the token is an ordinary ERC-1155 token in the activator's wallet, transferable like any other.
## Activate with cast
[Foundry](https://www.getfoundry.sh/introduction/installation)'s `cast` can sign and send the activation from a terminal. `HOLDER_KEY` is the key from the QR code and `ACTIVATOR_KEY` the key of the wallet that receives the token:
```sh
export ETH_RPC_URL=https://mainnet.base.org
ACTIVATOR=$(cast wallet address $ACTIVATOR_KEY)
# The token this holder key activates, and its status: 0 means it is waiting
ID=$(cast call 0x412E962bbAE0bB97CE98e74f3424543651a21ce3 'holderTokenIds(address)(uint256)' $(cast wallet address $HOLDER_KEY))
cast call 0x412E962bbAE0bB97CE98e74f3424543651a21ce3 'tokenStatus(uint256)(uint8)' $ID
# 1. Sign keccak256(abi.encodePacked(timestamp, activator)) with the holder key
TS=$(cast block latest -f timestamp)
MESSAGE=$(cast keccak $(cast abi-encode --packed 'f(uint256,address)' $TS $ACTIVATOR))
SIGNATURE=$(cast wallet sign --private-key $HOLDER_KEY $MESSAGE)
# 2. Dry run: a revert here means the send would fail too
cast call 0x412E962bbAE0bB97CE98e74f3424543651a21ce3 'activate(uint256,bytes)' $TS $SIGNATURE --from $ACTIVATOR
# 3. Send it
cast send 0x412E962bbAE0bB97CE98e74f3424543651a21ce3 'activate(uint256,bytes)' $TS $SIGNATURE --private-key $ACTIVATOR_KEY
```
`cast wallet sign` treats a message that starts with `0x` as bytes and adds the EIP-191 prefix itself, which is the format `activate` expects. Use `--interactive` in place of `--private-key` to type a key at a prompt and keep it out of your shell history. Send within the hour, or `TimestampTooOld` rejects the signature and you sign again.
The same commands check the activation below, reading everything from the transaction: its message, built from its timestamp and sender, recovers to the holder in its `TokenActivated` log.
```sh
TX=0x09cebf3a9f8c278722d10849ede67deada5712753f39f1319c19ebd9c590a7ba
ARGS=$(cast decode-calldata 'activate(uint256,bytes)' $(cast tx $TX input))
TS=$(echo "$ARGS" | head -1 | cut -d' ' -f1)
SIGNATURE=$(echo "$ARGS" | tail -1)
HOLDER=$(cast parse-bytes32-address $(cast receipt $TX --json | jq -r '.logs[1].topics[2]'))
MESSAGE=$(cast keccak $(cast abi-encode --packed 'f(uint256,address)' $TS $(cast tx $TX from)))
# Validation succeeded. Address 0x42eF…a428 signed this message.
cast wallet verify --address $HOLDER $MESSAGE $SIGNATURE
```
## One activation on record
Token 2259 was activated on 25 Aug 2026 at 19:13:35 UTC in block [50,447,934](https://basescan.org/block/50447934) ([transaction](https://basescan.org/tx/0x09cebf3a9f8c278722d10849ede67deada5712753f39f1319c19ebd9c590a7ba)). The sender, 0x5685…4708, called `activate` with a timestamp of 1,787,685,205 (19:13:25 UTC, ten seconds before the block) and a 65-byte signature. The receipt has two logs:
- `TransferSingle` on the token contract: token 2259, amount 1, from 0x412E962bbAE0bB97CE98e74f3424543651a21ce3 to 0x5685…4708.
- `TokenActivated(2259, 0x42eF…a428, 0x5685…4708)` on `SeriesActivation`: the registered holder, then the activator.
`tokenStatus(2259)` has returned `2` since, and `tokenHolders(2259)` all zeros. The first activation of any SmartMetal came the day the contracts were deployed, 22 May 2025, in block [30,576,415](https://basescan.org/block/30576415) ([transaction](https://basescan.org/tx/0x90aebc8390cc4b4ba96b0c7c4199353b577c4b4bc0b5f4e45e6d0575f406d754), token 427).
## Check it yourself
Each command is an [`eth_call`](https://ethereum.org/developers/docs/apis/json-rpc/#eth-call) to a public Base endpoint.
```sh
# tokenStatus(2259): 0x…02, activated
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x412e962bbae0bb97ce98e74f3424543651a21ce3","data":"0xb01ce31f00000000000000000000000000000000000000000000000000000000000008d3"},"latest"]}'
# maxTimestampAge(): 0x…e10, which is 3600 seconds
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x412e962bbae0bb97ce98e74f3424543651a21ce3","data":"0x0dee2789"},"latest"]}'
# The receipt of the activation above: two logs, "status": "0x1", "gasUsed": "0x1714d" (94,541)
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_getTransactionReceipt","params":["0x09cebf3a9f8c278722d10849ede67deada5712753f39f1319c19ebd9c590a7ba"]}'
```
With [Foundry](https://www.getfoundry.sh/introduction/installation) installed, its `cast` command runs the same checks and decodes the answers:
```sh
export ETH_RPC_URL=https://mainnet.base.org
# 2
cast call 0x412e962bbae0bb97ce98e74f3424543651a21ce3 'tokenStatus(uint256)(uint8)' 2259
# 3600
cast call 0x412e962bbae0bb97ce98e74f3424543651a21ce3 'maxTimestampAge()(uint256)'
# The receipt: status 1 (success), gasUsed 94541, two logs
cast receipt 0x09cebf3a9f8c278722d10849ede67deada5712753f39f1319c19ebd9c590a7ba
```
`https://base-rpc.publicnode.com` answers the same calls if the first endpoint is busy. The [ABI](https://veri.how/abi/smartmetal-activation.json) decodes `activate`, the errors and both events. The indexed state of any token, including its activation time and transaction, is at `https://veri.how/smartmetal/tokens/.json` ([data files](https://veri.how/data.md)).
## Sources
1. [SeriesActivation, verified source on BaseScan](https://basescan.org/address/0x412e962bbae0bb97ce98e74f3424543651a21ce3#code)
2. [QRToken contract reference, SeriesActivation](https://docs.qrtoken.xyz/reference/contracts/seriesactivation/)
3. [QRToken getting started, Activate](https://docs.qrtoken.xyz/getting-started/#6-activate)
4. [Activation of token 2259 on 25 Aug 2026, BaseScan](https://basescan.org/tx/0x09cebf3a9f8c278722d10849ede67deada5712753f39f1319c19ebd9c590a7ba)
5. [EIP-191: Signed Data Standard](https://eips.ethereum.org/EIPS/eip-191)
## Related
- [Veri SmartMetal contracts on Base](https://veri.how/smartmetal/contracts.md): Veri SmartMetal is an ERC-1155 token at 0x4516a5D613C30A36D157d3b579813734cbb929a4 on Base, an ERC-1967 proxy in front of the Series1155V1 implementation, with a separate SeriesActivation contract that holds every token until its holder activates it; all three were deployed on 22 May 2025 and are built on QRToken.
- [SmartMetal series: 2024 and the Limited Edition Azure Dragon](https://veri.how/smartmetal/series.md): The Veri SmartMetal contract has two series, the 2024 series of 6,566 tokens (ids 1 to 6566, created on chain on 22 May 2025) and Veri SmartMetal Limited Edition Azure Dragon, 16 tokens created on 28 May 2026; each series is one metadata folder on IPFS, and its id is the keccak256 hash of that folder's CID.
- [Look up a SmartMetal token](https://veri.how/smartmetal/lookup.md): Given a SmartMetal token id, read its series with tokenSeries(id) and its metadata URI with uri(id) on the token contract, fetch the metadata JSON from any IPFS gateway, and ask SeriesActivation whether it is activated with tokenStatus(id); veri.how also serves the indexed answer at /smartmetal/tokens/.json.
- [veri.vip](https://veri.how/smartmetal/veri-vip.md): veri.vip is the website that shows one page per Veri SmartMetal token, at veri.vip/, built with QRToken; every value on a page is tagged as read from the Base blockchain or from the token's metadata file on IPFS, so each can be checked without the site.
---
title: veri.vip
description: veri.vip is the website that shows one page per Veri SmartMetal token, at veri.vip/, built with QRToken; every value on a page is tagged as read from the Base blockchain or from the token's metadata file on IPFS, so each can be checked without the site.
url: https://veri.how/smartmetal/veri-vip
area: smartmetal
kind: explainer
updated: 2026-10-15T00:00:00Z
author: Patryk Dwórznik
license: CC BY 4.0
contracts:
- id: eip155:8453:0x4516a5d613c30a36d157d3b579813734cbb929a4
name: Veri SmartMetal
verified:
date: 2026-10-13
sources:
- title: veri.vip, token 7777
url: https://veri.vip/7777
- title: veri.vip, token 1
url: https://veri.vip/1
- title: QRToken introduction, trust model
url: https://docs.qrtoken.xyz/introduction/#trust-model-provenance-by-source
- title: QRToken getting started, Verify
url: https://docs.qrtoken.xyz/getting-started/#7-verify
---
# veri.vip
veri.vip is the website that shows one page per Veri SmartMetal token, at veri.vip/, built with QRToken; every value on a page is tagged as read from the Base blockchain or from the token's metadata file on IPFS, so each can be checked without the site.
## Facts
| Fact | Value |
| --- | --- |
| Address | [0x4516a5D613C30A36D157d3b579813734cbb929a4](https://basescan.org/token/0x4516a5d613c30a36d157d3b579813734cbb929a4) |
| Chain | [Base (eip155:8453)](https://basescan.org) |
| Standard | [ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) |
| Proxy | [ERC-1967](https://eips.ethereum.org/EIPS/eip-1967) |
| Implementation | [Series1155V1 0x945D54B21a582d5D186Ae1E449DdC2a4Ce39E26c](https://basescan.org/address/0x945d54b21a582d5d186ae1e449ddc2a4ce39e26c#code) |
| Deployed | [Block 30,569,433 · 22 May 2025](https://basescan.org/tx/0x565a24675da44a562bb5b747b81cdd9290ad0d58f86b1e635e7d888083e3c53e) |
| Source | [Verified on BaseScan](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4#code) |
| Transactions | [All transactions](https://basescan.org/address/0x4516a5d613c30a36d157d3b579813734cbb929a4) |
| ABI | [smartmetal.json](https://veri.how/abi/smartmetal.json) |
| Last verified | 13 Oct 2026 |
veri.vip has one page for each Veri SmartMetal token, at `https://veri.vip/`, where `` is the token id: [veri.vip/1](https://veri.vip/1) for the first 2024 token, [veri.vip/7777](https://veri.vip/7777) for the first Azure Dragon. The token's metadata names that page as its `external_url`, so wallets and marketplaces link to it. The site is built with [QRToken](https://docs.qrtoken.xyz), a framework for tokens tied to physical items.
## What a page shows
The page header carries the token's name, series label as the site writes it ("2024 SERIES" or "2026 SERIES"), serial number and standard, plus links to the token on [BaseScan](https://basescan.org/token/0x4516a5d613c30a36d157d3b579813734cbb929a4?a=7777), to its raw metadata file and to its raw image on the IPFS gateway at `ipfs.veridao.io`. Below it, four tabs: Overview, Contract, Metadata and Media.
The Overview tab is a list of values, each tagged with its source:
| Value | Tag | Where it comes from |
| ----------------------------------------------------- | -------- | ----------------------------------------------------------------------------------- |
| Serial № | ON-CHAIN | The token id on the contract, 0x4516a5D613C30A36D157d3b579813734cbb929a4 |
| Metal, Purity, Weight (oz), Year, Mint, Serial Number | METADATA | The `attributes` of the token's metadata file at `ipfs:///.json` |
| AI Agent Access, P2P Trading, Derivatives | METADATA | Boolean attributes of the same file, `true`; the page shows the label with no value |
"ON-CHAIN values are read straight from the Base blockchain. METADATA values come from the token's metadata file, stored on IPFS", as the page puts it. Nothing on it is the site's own statement: every row is a value you can read yourself.
## Reading the same values without the site
The page is a view of two sources that are public on their own:
- **The contract.** `uri(id)` on the token contract returns the metadata URI, and `tokenSeries(id)` the series. `tokenStatus(id)` on `SeriesActivation` says whether the token has been activated.
- **The metadata file.** `ipfs:///.json`, fetched from any IPFS gateway, holds the name, description, image and attributes the page displays.
[Look up a SmartMetal token](https://veri.how/smartmetal/lookup.md) gives the `curl` command for each, and [SmartMetal series](https://veri.how/smartmetal/series.md) the two series' CIDs and token ids. If the page and the contract ever disagree, the contract is right; the point of the tags is that you never have to take the page's word for it. The QRToken documentation describes the same check from the issuer's side, in [its trust model](https://docs.qrtoken.xyz/introduction/#trust-model-provenance-by-source) and the [Verify step](https://docs.qrtoken.xyz/getting-started/#7-verify) of its getting-started guide.
## What veri.vip is not
It is not the contract, and holds no tokens: the token lives at 0x4516a5D613C30A36D157d3b579813734cbb929a4 on Base, and the pages read it. And it does not decide a token's state: whether a SmartMetal is activated is written in `SeriesActivation` by the activation transaction, as [Activate a SmartMetal](https://veri.how/smartmetal/activate.md) describes, and veri.vip can only report it.
## Sources
1. [veri.vip, token 7777](https://veri.vip/7777)
2. [veri.vip, token 1](https://veri.vip/1)
3. [QRToken introduction, trust model](https://docs.qrtoken.xyz/introduction/#trust-model-provenance-by-source)
4. [QRToken getting started, Verify](https://docs.qrtoken.xyz/getting-started/#7-verify)
## Related
- [Veri SmartMetal contracts on Base](https://veri.how/smartmetal/contracts.md): Veri SmartMetal is an ERC-1155 token at 0x4516a5D613C30A36D157d3b579813734cbb929a4 on Base, an ERC-1967 proxy in front of the Series1155V1 implementation, with a separate SeriesActivation contract that holds every token until its holder activates it; all three were deployed on 22 May 2025 and are built on QRToken.
- [SmartMetal series: 2024 and the Limited Edition Azure Dragon](https://veri.how/smartmetal/series.md): The Veri SmartMetal contract has two series, the 2024 series of 6,566 tokens (ids 1 to 6566, created on chain on 22 May 2025) and Veri SmartMetal Limited Edition Azure Dragon, 16 tokens created on 28 May 2026; each series is one metadata folder on IPFS, and its id is the keccak256 hash of that folder's CID.
- [Look up a SmartMetal token](https://veri.how/smartmetal/lookup.md): Given a SmartMetal token id, read its series with tokenSeries(id) and its metadata URI with uri(id) on the token contract, fetch the metadata JSON from any IPFS gateway, and ask SeriesActivation whether it is activated with tokenStatus(id); veri.how also serves the indexed answer at /smartmetal/tokens/.json.
- [Activate a SmartMetal](https://veri.how/smartmetal/activate.md): Activation is one transaction on Base, activate(timestamp, signature) on SeriesActivation, in which the key from the token's QR code signs the activator's address and a timestamp no more than an hour old, and the contract transfers the token from itself to the activator's wallet and emits TokenActivated.
---
title: Veritaseum
description: Veritaseum is the project behind the VERI token on Ethereum and Veri SmartMetal tokens on Base.
url: https://veri.how/veritaseum
area: veritaseum
kind: collection
updated: 2026-10-19T14:31:08Z
author: Patryk Dwórznik
license: CC BY 4.0
---
# Veritaseum
Veritaseum is the project behind the VERI token on Ethereum and Veri SmartMetal tokens on Base.
Veritaseum issued [VERI](https://veri.how/veri.md), an ERC-20 token, on Ethereum mainnet in 2017, and [Veri SmartMetal](https://veri.how/smartmetal.md), ERC-1155 tokens, one for each Veri SmartMetal silver round, on Base in 2025. Those two areas document the contracts: addresses, functions, events, series and metadata.
Reggie Middleton founded Veritaseum. Patryk Dwórznik was its Chief Architect from 2017 to 2020.
The SmartMetal contracts are built on [QRToken](https://docs.qrtoken.xyz).
## Timeline
- [Timeline](https://veri.how/timeline.md): What Veritaseum shipped and when, beside the industry’s events.
---
title: Timeline
description: Veritaseum built peer-to-peer asset swaps on Bitcoin in 2014 and tokenised exposures on Ethereum in 2018, before the DeFi protocols of 2018 to 2020; Veri SmartMetal followed on Base in 2025.
url: https://veri.how/timeline
area: veritaseum
kind: reference
updated: 2026-10-19T14:31:08Z
author: Patryk Dwórznik
license: CC BY 4.0
---
# Timeline
> When did Veritaseum ship what?
Veritaseum built peer-to-peer asset swaps on Bitcoin in 2014 and tokenised exposures on Ethereum in 2018, before the DeFi protocols of 2018 to 2020; Veri SmartMetal followed on Base in 2025.
| Date | Lane | Entry | Source tier | Source |
| --- | --- | --- | --- | --- |
| Jan 2009 | Industry | Bitcoin genesis block: Block 0 of the Bitcoin chain. | on-chain | [Blockstream: block 0](https://blockstream.info/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f) |
| Jul 2013 | Industry | Mastercoin announced: First protocol layer on Bitcoin to issue its own assets. | publication | [bitcointalk: Mastercoin thread](https://bitcointalk.org/index.php?topic=265488.0) |
| Jan 2014 | Industry | Counterparty launches: Asset issuance and an exchange on Bitcoin, opened by proof-of-burn. | on-chain | [Blockstream: block 278310](https://blockstream.info/block-height/278310); [bitcointalk: Counterparty thread](https://bitcointalk.org/index.php?topic=395761.0) |
| May 2014 | Veritaseum | ◆ US provisional application 61/990,795 filed: The priority date of the whole patent family. | register | [Google Patents: US 11,196,566 B2](https://patents.google.com/patent/US11196566B2/en) |
| Jul 2014 to Mar 2015 | Veritaseum | UltraCoin client development: Swaps and contracts for difference built as Bitcoin transactions, settled in bitcoin. | git | Git history of UltraCoin client (private repository) |
| Jul 2014 | Veritaseum | UltraCoin Java client released: Prototype client released as a soft launch. | publication | [Bitcoin Magazine: UltraCoin 101](https://bitcoinmagazine.com/business/ultracoin-101-1406564196) |
| Mar 2015 | Industry | Coinbase files its email-bitcoin patent: “Send cryptographic currency to email address”, later US 10,510,053 B2. | register | [Google Patents: US 10,510,053 B2](https://patents.google.com/patent/US10510053B2/en) |
| May 2015 | Veritaseum | ◆ International (PCT) application PCT/US2015/029196 filed: WO 2015/171580 A1; the US, European, Japanese and Chinese applications derive from it. | register | [Google Patents: US 11,196,566 B2](https://patents.google.com/patent/US11196566B2/en) |
| Jul 2015 | Industry | Ethereum Frontier launches: Ethereum mainnet opens. | on-chain | [Etherscan: block 1](https://etherscan.io/block/1); [Ethereum blog: Ethereum launches](https://blog.ethereum.org/2015/07/30/ethereum-launches) |
| Nov 2015 | Industry | ERC-20 proposed: The token interface VERI implements. | publication | [EIP-20](https://eips.ethereum.org/EIPS/eip-20) |
| Apr 2016 | Industry | The DAO deployed: Token-governed fund contract created on Ethereum. | on-chain | [Etherscan: creation tx](https://etherscan.io/tx/0xe9ebfecc2fa10100db51a4408d18193b3ac504584b51a4e55bdef1318f0a30f9) |
| Apr 2017 | Veritaseum | VERI contract deployed on Ethereum: Veritaseum (ERC-20), block 3,586,472. | on-chain | [Etherscan: Veritaseum creation tx](https://etherscan.io/tx/0xfda7aad54c81d9bc8e7a67e68821a24009c2bcd5e9b9a47b71f40d5a45f3a6fc) |
| Apr 2017 to May 2017 | Veritaseum | VERI sale: First to last successful purchase on the sale contract. | on-chain | [Etherscan: first purchase](https://etherscan.io/tx/0xd6170b9463807402c417408d1da6c5d523c8e5358d4729a3772a09a4e1e64dcb); [Etherscan: last purchase](https://etherscan.io/tx/0x52bcdd1b6afd3430ff80fad79aa0a4d532553492afef62764ecbf78a947fbf47) |
| Jun 2017 | Industry | Bancor token deployed: First automated market maker token on Ethereum. | on-chain | [Etherscan: BNT creation tx](https://etherscan.io/tx/0x750f6632f7884defd40b79be8174bbb44de9ef21ca4172a249d7a4fe10b45e8e) |
| Dec 2017 | Industry | MakerDAO Sai deployed: Single-collateral Dai token created. | on-chain | [Etherscan: Sai creation tx](https://etherscan.io/tx/0x91b318fd3498c14a1495357d6a4e895fd29c3d915ee695a6fbc8ef72908a1aa8) |
| Jan 2018 to Oct 2019 | Veritaseum | VeADIR development: Ethereum contracts for VERI exposures and the application around them. | git | Git history of VeADIR contracts (private repository); Git history of VeADIR monorepo (private repository) |
| Jan 2018 | Veritaseum | VeADIR private beta: Beta open to VERI holders, with real funds on mainnet. | publication | [Steemit: Veritaseum y su token VERI, lanzamiento beta](https://steemit.com/veritaseum/@gestionmercados/veritaseum-y-su-token-veri-lanzamiento-beta) |
| Jan 2018 | Veritaseum | VeRent and VeToken: VERI rental and token facilities, both in the first commit of the VeADIR contracts. | git | Git history of VeADIR contracts (private repository) |
| Jun 2018 | Veritaseum | VeADIR Beta 9.2 on mainnet: Built-in exchange for VERI subtokens, with contracts upgradable without interrupting exposures. | publication | [Veritaseum on X](https://x.com/veritaseuminc/status/1006920620578201603) |
| Jun 2018 | Industry | ERC-1155 proposed: The multi-token standard Veri SmartMetal implements. | publication | [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155) |
| Sep 2018 | Industry | Compound v1 deployed: Pooled lending market contract created. | on-chain | [Etherscan: MoneyMarket creation tx](https://etherscan.io/tx/0xdeaaf71ad7db996bc4f15bd1005fe87132cffb89487fdc70ab3d9e54ef5cb787) |
| Nov 2018 | Industry | First trade on Uniswap v1: First swap on the first Uniswap exchange. | on-chain | [Etherscan: factory creation tx](https://etherscan.io/tx/0xc1b2646d0ad4a3a151ebdaaa7ef72e3ab1aa13aa49d0b7a3ca020f5ee7b1b010); [Etherscan: first trade](https://etherscan.io/tx/0x2c3c1b35d28e46dc7b2c6cb105dd27621e5504668974ee8c91de3da1460cac4b) |
| Dec 2019 | Industry | Coinbase email-bitcoin patent granted: US 10,510,053 B2. | register | [Google Patents: US 10,510,053 B2](https://patents.google.com/patent/US10510053B2/en) |
| Jan 2020 | Industry | Aave v1 deployed: Lending pool with flash loans created. | on-chain | [Etherscan: LendingPool creation tx](https://etherscan.io/tx/0x4752f752f5262fb11733e0136033f7d53cdc90971441750f606cf1594a5fde4f) |
| May 2020 | Industry | Uniswap v2 deployed: Factory for token-to-token pairs created. | on-chain | [Etherscan: factory creation tx](https://etherscan.io/tx/0xc31d7e7e85cab1d38ce1b8ac17e821ccd47dbde00f9d57f2bd8613bff9428396) |
| Jun 2020 | Industry | COMP distribution begins: Compound starts handing out its governance token to users. | on-chain | [Etherscan: ProposalExecuted(7)](https://etherscan.io/tx/0x03dab5602fb58bb44c1a248fd1b283ca46b539969fe02db144983247d00cfb89); [The Block: Compound governance tokens begin trading](https://www.theblock.co/news/defi/2020-06-15-compound-governance-tokens-begin-its-first-day-of-trading-68369) |
| Jan 2021 | Veritaseum | ◆ JP 6813477 B2 granted: Japan Patent Office. | register | [Google Patents: JP 6813477 B2](https://patents.google.com/patent/JP6813477B2/en) |
| Dec 2021 | Veritaseum | ◆ US 11,196,566 B2 granted: United States Patent and Trademark Office. | register | [Google Patents: US 11,196,566 B2](https://patents.google.com/patent/US11196566B2/en) |
| Jan 2023 | Veritaseum | ◆ JP 7204231 B2 granted: Japan Patent Office; derives from JP 6813477 B2. | register | [Google Patents: JP 7204231 B2](https://patents.google.com/patent/JP7204231B2/en) |
| Jun 2023 | Industry | Base genesis block: Block 0 of Base, the Ethereum layer 2 Veri SmartMetal runs on. Base opened to the public in Aug 2023. | on-chain | [BaseScan: block 0](https://basescan.org/block/0) |
| Feb 2024 | Veritaseum | ◆ US 11,895,246 B2 granted: United States Patent and Trademark Office; derives from US 11,196,566 B2. | register | [Google Patents: US 11,895,246 B2](https://patents.google.com/patent/US11895246B2/en) |
| Aug 2024 | Veritaseum | ◆ JP 7533974 B2 granted: Japan Patent Office; derives from JP 7204231 B2. | register | [Google Patents: JP 7533974 B2](https://patents.google.com/patent/JP7533974B2/en) |
| Aug 2024 | Veritaseum | ◆ JP 7533983 B2 granted: Japan Patent Office; derives from JP 7204231 B2. | register | [Google Patents: JP 7533983 B2](https://patents.google.com/patent/JP7533983B2/en) |
| Feb 2025 | Veritaseum | ◆ US 12,231,579 B2 granted: United States Patent and Trademark Office; derives from US 11,895,246 B2. | register | [Google Patents: US 12,231,579 B2](https://patents.google.com/patent/US12231579B2/en) |
| May 2025 | Veritaseum | Veri SmartMetal contracts deployed on Base: Veri SmartMetal (ERC-1155), Series1155V1 and SeriesActivation, block 30,569,430. | on-chain | [BaseScan: Series1155V1 creation tx](https://basescan.org/tx/0xc80280659363686cc22ed1e14feca4d7834cf28d1b12d9d3b1dec92c496073ec); [BaseScan: Veri SmartMetal creation tx](https://basescan.org/tx/0x565a24675da44a562bb5b747b81cdd9290ad0d58f86b1e635e7d888083e3c53e); [BaseScan: SeriesActivation creation tx](https://basescan.org/tx/0x9c8f01b4f78f24f948e0f77ada064817637e548bbe9b8ae9ef010cbd8f1dcafa) |
| May 2025 | Veritaseum | Series “2024” created: Token ids 1 to 6,566 on Veri SmartMetal. | on-chain | [BaseScan: createSeries tx](https://basescan.org/tx/0xe9196b44618a89a3f9a1c8f9ce579aa704e4621d5a8899634290cef868b7742a) |
| May 2025 | Veritaseum | First Veri SmartMetal token activated: First TokenActivated event of SeriesActivation on Base. | on-chain | [BaseScan: activation tx](https://basescan.org/tx/0x90aebc8390cc4b4ba96b0c7c4199353b577c4b4bc0b5f4e45e6d0575f406d754) |
| Sep 2025 | Veritaseum | ◆ JP 7736305 B2 granted: Japan Patent Office; derives from JP 7533974 B2. | register | [Google Patents: JP 7736305 B2](https://patents.google.com/patent/JP7736305B2/en) |
| Dec 2025 | Veritaseum | ◆ EP 4148642 B1 granted: European Patent Office. | register | [Google Patents: EP 4148642 B1](https://patents.google.com/patent/EP4148642B1/en) |
| May 2026 | Veritaseum | ◆ HK 40091419 B granted: Hong Kong Intellectual Property Department. | register | [Google Patents: HK 40091419 B](https://patents.google.com/patent/HK40091419B/en) |
| May 2026 | Veritaseum | Series “Veri SmartMetal Limited Edition Azure Dragon” created: 16 token ids on Veri SmartMetal. | on-chain | [BaseScan: createSeries tx](https://basescan.org/tx/0xcbb3ab4f328c251b3ef6f79ee20682a236f2072121245737ffac3d25eac0f051) |
Dates are shown as months or years. Day-precise dates are in [/timeline.json](https://veri.how/timeline.json).
---
title: VeriDAO
description: VeriDAO is the DAO associated with Veritaseum.
url: https://veri.how/veridao
area: veridao
kind: collection
updated: 2026-10-19T14:31:08Z
author: Patryk Dwórznik
license: CC BY 4.0
---
# VeriDAO
VeriDAO is the DAO associated with Veritaseum.
[veridao.io](https://veridao.io) hosts the Veri SmartMetal product page, and its IPFS gateway, `ipfs.veridao.io`, serves the metadata folders that the tokens point to.