---
title: Walk Through of [Marigold Training 4](https://github.com/marigold-dev/training-dapp-4)
author: Michael Kernaghan
---
# Walk Through of [Marigold Training 4](https://github.com/marigold-dev/training-dapp-4)
# Training dapp nΒ°4 - βοΈ Upgradable Poke game
## π Prerequisites
Use previous demo results code
## π Upgrades
### π΅ Naive approach
### Stored Lambda function β
β
taq compile pokeGame.jsligo
β
taq deploy pokeGame.tz -e testing
```
βββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ¬βββββββββββ¬ββββββββββββββ
β Contract β Address β Alias β Destination β
βββββββββββββββΌβββββββββββββββββββββββββββββββββββββββΌβββββββββββΌββββββββββββββ€
β pokeGame.tz β KT1NNmpuVCZYNQ9eFFNSRecuzxtvb8Zqx1Fk β pokeGame β ghostnet β
βββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββ΄βββββββββββ΄ββββββββββββββ
```
β
taq generate types ./app/src
cd app
yarn run start
When you restart the server there are compilation errors:
Demo notes
>Note : like in previous training, export the Storage type on ./app/src/pokeGame.types.ts like this export type Storage = { Bug : on taqueria version <= v0.19.3, lambda type are not supported. add the type manually on ./app/src/pokeGame.types.ts like this type lambda = (oracleAddress : address) => string; and remove the wrong import lambda from './type-aliases'
So change ./app/src/pokeGame.types.ts from

to

β
taq create contract pokeGame.parameters.jsligo
β
taq compile pokeGame.jsligo
β
taq call pokeGame --param pokeGame.parameter.default_parameter.tz -e testing
```
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββ¬βββββββββββββββββββββββββββββββββ
β Contract Alias β Contract Address β Tez Transfer β Parameter β Entrypoint β Destination β
ββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββΌβββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββΌβββββββββββββββββββββββββββββββββ€
β pokeGame β KT1LRznPG4W99BF2KBd8mrkS4RaW8hjLbwWV β 0 β (Right (Right { DROP ; PUSH string "YEAH!!!" })) β default β https://ghostnet.ecadinfra.com β
β β β β β β β
ββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββ΄βββββββββββββββββββββββββββββββββ
```
There is no taq call equivalent in VSCode extensions

To fix,
β
taq stop sandbox local
β
taq start sandbox local
### Proxy pattern ββ
β
taq create contract tzip18.jsligo
β
taq compile pokeGame.jsligo
```
ββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β Contract β Artifact β
ββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββ€
β pokeGame.jsligo β artifacts/pokeGame.tz β
ββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββ€
β pokeGame.storages.jsligo β artifacts/pokeGame.default_storage.tz β
ββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββ
```
β
taq create contract proxy.jsligo
β
taq compile proxy.jsligo
```
ββββββββββββββββ¬βββββββββββββββββββββ
β Contract β Artifact β
ββββββββββββββββΌβββββββββββββββββββββ€
β proxy.jsligo β artifacts/proxy.tz β
ββββββββββββββββ΄βββββββββββββββββββββ
```
β
taq create contract proxy.storages.jsligo
β
taq compile proxy.jsligo
β
taq deploy proxy.tz -e testing
```
ββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ¬ββββββββ¬ββββββββββββββ
β Contract β Address β Alias β Destination β
ββββββββββββΌβββββββββββββββββββββββββββββββββββββββΌββββββββΌββββββββββββββ€
β proxy.tz β KT1CEYeFCUTugBf7wVq37P3bAcwbs7dvb2g2 β proxy β ghostnet β
ββββββββββββ΄βββββββββββββββββββββββββββββββββββββββ΄ββββββββ΄ββββββββββββββ
```
Change with the address on file pokeGame.storages.jsligo
β
taq compile pokeGame.jsligo
β
taq deploy pokeGame.tz -e testing
```
βββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ¬βββββββββββ¬ββββββββββββββ
β Contract β Address β Alias β Destination β
βββββββββββββββΌβββββββββββββββββββββββββββββββββββββββΌβββββββββββΌββββββββββββββ€
β pokeGame.tz β KT1MVp7ZTHGoBYkcgMFATb7EoTPgnDsi9VZP β pokeGame β ghostnet β
βββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββ΄βββββββββββ΄ββββββββββββββ
```
β
taq create contract proxy.parameters.jsligo
β
taq compile proxy.jsligo
```
βββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββ
β Contract β Artifact β
βββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββ€
β proxy.jsligo β artifacts/proxy.tz β
βββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββ€
β proxy.storages.jsligo β artifacts/proxy.default_storage.tz β
βββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββ€
β proxy.parameters.jsligo β artifacts/proxy.parameter.initProxyWithV1.tz β
βββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββ
```
β
taq call proxy --param proxy.parameter.initProxyWithV1.tz -e testing
```
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ
β Contract Alias β Contract Address β Tez Transfer β Parameter β Entrypoint β Destination β
ββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββΌβββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββΌββββββββββββββββββββββββββββββββββββββ€
β proxy β KT1CEYeFCUTugBf7wVq37P3bAcwbs7dvb2g2 β 0 β (Right β default β https://ghostnet.tezos.marigold.dev β
β β β β (Pair { Pair (Pair (Some (Pair "KT1XJ3HaQ8khTjLmvAKxzEiHNasZiSwA8LJ7" "Poke")) False) "Poke" ; β β β
β β β β Pair (Pair (Some (Pair "KT1XJ3HaQ8khTjLmvAKxzEiHNasZiSwA8LJ7" "PokeAndGetFeedback")) False) β β β
β β β β "PokeAndGetFeedback" ; β β β
β β β β Pair (Pair (Some (Pair "KT1XJ3HaQ8khTjLmvAKxzEiHNasZiSwA8LJ7" "Init")) False) "Init" ; β β β
β β β β Pair (Pair (Some (Pair "KT1XJ3HaQ8khTjLmvAKxzEiHNasZiSwA8LJ7" "changeVersion")) False) β β β
β β β β "changeVersion" ; β β β
β β β β Pair (Pair (Some (Pair "KT1XJ3HaQ8khTjLmvAKxzEiHNasZiSwA8LJ7" "feedback")) False) β β β
β β β β "feedback" } β β β
β β β β None)) β β β
β β β β β β β
ββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββ΄ββββββββββββββββββββββββββββββββββββββ
```
#### Lets' go to the frontend
Note : don't forget to export Storage type like in previous training:
>β οΈ Note : we will need to use Storage type on the frontend side, by default, taquito does not export it. Export the type on the file pokeGame.types.ts adding a keywork export as it : export type Storage = { ...
β
taq compile pokeGame.jsligo
β
taq compile proxy.jsligo
βtaq generate types ./app/src1
The types generate ok, but the output includes:
```
...
Processing /proxy.parameter.initProxyWithV1.tz...
Unknown method: pair {
node: {
prim: 'pair',
args: [ [Object], [Object] ],
[Symbol(source_reference)]: { first: 12, last: 60 }
},
args: [
{
prim: 'string',
annots: [Array],
[Symbol(source_reference)]: [Object]
},
{
prim: 'bytes',
annots: [Array],
[Symbol(source_reference)]: [Object]
}
]
}
...
```
You can do all the same actions as before through the proxy.
β1. Login
π the local site never comes up on :3000
2. Refresh the contract list
3. Mint 1 ticket
4. Wait for confirmation popup
5. Poke
6. Wait for confirmation popup
7. Refresh the contract list
#### Let's deploy a new contract V2 and test it again.
β
taq compile pokeGame.jsligo
β
taq deploy pokeGame.tz -e testing --storage pokeGame.storage.storageV2.tz
```
βββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ¬βββββββββββ¬ββββββββββββββ
β Contract β Address β Alias β Destination β
βββββββββββββββΌβββββββββββββββββββββββββββββββββββββββΌβββββββββββΌββββββββββββββ€
β pokeGame.tz β KT1GfY3MVM5tStetD7re8XWHSJbodHPJ1qrV β pokeGame β ghostnet β
βββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββ΄βββββββββββ΄ββββββββββββββ
```
β
taq compile proxy.jsligo
β
taq call proxy --param proxy.parameter.initProxyWithV2.tz -e testing
```
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ
β Contract Alias β Contract Address β Tez Transfer β Parameter β Entrypoint β Destination β
ββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββΌβββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββΌββββββββββββββββββββββββββββββββββββββ€
β proxy β KT1CEYeFCUTugBf7wVq37P3bAcwbs7dvb2g2 β 0 β (Right β default β https://ghostnet.tezos.marigold.dev β
β β β β (Pair { Pair (Pair (Some (Pair "KT1AxZbF6hoXHGWZjcAn4MzLDRsVYgZGDmCL" "Poke")) False) "Poke" ; β β β
β β β β Pair (Pair (Some (Pair "KT1AxZbF6hoXHGWZjcAn4MzLDRsVYgZGDmCL" "PokeAndGetFeedback")) False) β β β
β β β β "PokeAndGetFeedback" ; β β β
β β β β Pair (Pair (Some (Pair "KT1AxZbF6hoXHGWZjcAn4MzLDRsVYgZGDmCL" "Init")) False) "Init" ; β β β
β β β β Pair (Pair (Some (Pair "KT1AxZbF6hoXHGWZjcAn4MzLDRsVYgZGDmCL" "changeVersion")) False) β β β
β β β β "changeVersion" ; β β β
β β β β Pair (Pair (Some (Pair "KT1AxZbF6hoXHGWZjcAn4MzLDRsVYgZGDmCL" "feedback")) False) β β β
β β β β "feedback" } β β β
β β β β None)) β β β
β β β β β β β
ββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββ΄ββββββββββββββββββββββββββββββββββββββ
```
Back to the web app, test the flow again :
π the local site never comes up on :3000
1. Refresh the contract list
2. Mint 1 ticket
3. Wait for confirmation popup
4. Poke
5. Wait for confirmation popup
6. Refresh the contract list
#### Last part is to set the old smart contract as obsolete
β
taq compile proxy.jsligo
β taq call proxy --param proxy.parameter.changeVersionV1ToV2.tz -e testing
π I don't see in the instructions that artifacts/proxy.parameter.changeVersionV1ToV2.tz is created, or what code it should have. Did I miss it?
β
Check on an indexer that the V1 storage.tzip18.contractNext is pointing to the next version address V2 : https://ghostnet.tzkt.io/KT1MVp7ZTHGoBYkcgMFATb7EoTPgnDsi9VZP/storage/

# End
[Beyond the End](https://github.com/michaelkernaghan?tab=repositories)