Skip to content
This repository has been archived by the owner on Sep 14, 2023. It is now read-only.

target overrides should check whether the override chain has the same metadata #1173

Open
ryanleecode opened this issue Jul 13, 2023 · 3 comments
Labels
cli codegen needs input We need input from the team and/or others request

Comments

@ryanleecode
Copy link
Contributor

Based on my understanding when specifying a target in nets.ts, it only swaps out the connection and not the "chain rune".. i.e. westend does not become westendDev. So whatever extrinsics are created will use the original metadata regardless of what the metadata is on the target chain. If there's a runtime upgrade on the prod chain and you don't bump the version in bins, then your extrinsics can seemingly fail, without it being obvious to the end user why its failing.

For example given this nets config:

import { bins, net } from "capi/nets"

const bin = bins({
  polkadot: ["polkadot-fast", "v0.9.43"],
})

export const westendDev = net.dev({
  bin: bin.polkadot,
  chain: "westend-dev",
})

export const westend = net.ws({
  url: "wss://westend-rpc.polkadot.io/",
  targets: { dev: westendDev },
})

Had i used anything lower than v0.9.43, extrinsics would fail with:

Unhandled promise rejection Unhandled {
  value: ServerError: Invalid Transaction
    at RunMap.fn (http://localhost:1234/index.b7a05eb9.js:24333:36)
    at RunMap._evaluate (http://localhost:1234/index.b7a05eb9.js:23114:44)
    from execution of the ValueRune instantiated
        at new Rune (http://localhost:1234/index.b7a05eb9.js:22321:23)
        at new ValueRune (http://localhost:1234/index.b7a05eb9.js:22997:1)
        at Function.new (http://localhost:1234/index.b7a05eb9.js:22999:16)
        at ValueRune.map (http://localhost:1234/index.b7a05eb9.js:23002:29)
        at ConnectionRune.subscribe (http://localhost:1234/index.b7a05eb9.js:24332:177)
        at RunMap.fn (http://localhost:1234/index.b7a05eb9.js:24725:60)
        at RunMap._evaluate (http://localhost:1234/index.b7a05eb9.js:23114:44)
        from execution of the ValueRune instantiated
            at new Rune (http://localhost:1234/index.b7a05eb9.js:22321:23)
            at new ValueRune (http://localhost:1234/index.b7a05eb9.js:22997:1)
            at Function.new (http://localhost:1234/index.b7a05eb9.js:22999:16)
            at ValueRune.map (http://localhost:1234/index.b7a05eb9.js:23002:29)
            at SignedExtrinsicRune.sent (http://localhost:1234/index.b7a05eb9.js:24725:27)
            at transferDev (http://localhost:1234/index.b7a05eb9.js:653:13)

Similar to #961, #1052.

Ideally Capi should have a check in place to make sure the target chain is compatible with the prod chain.

@ryanleecode
Copy link
Contributor Author

#925 also mentioned

This would also open the door for us to validate prod-dev chain feature parity. We could produce console warnings about inconsistencies between the default and target-listed metadata.

so this issue should be seen as a follow up

@harrysolovay
Copy link
Contributor

Currently, specifying --target does not actually touch the codegen; it passes an env var, which is picked up by the detectConnect util. Although we could swap out the served chain rune, this could be treacherous for a few reasons:

  • cached code would frequently change / become invalid
  • extra codegen (for every target)
  • in Node projects, we'd need to write to chains' respective node modules (which could be stored in different places depending on the package manager)

Would warnings about incompatibilities suffice? Not sure we should try to do anything too fancy with --target.

@ryanleecode
Copy link
Contributor Author

Warnings seem like the best option 👍

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
cli codegen needs input We need input from the team and/or others request
Projects
Status: No status
Development

No branches or pull requests

3 participants