pactpact-lang

enforce-guard fails in Zelcore and XWallet


Whenever I call a function that has (enforce-guard some-guard) from X-wallet or Zelcore it always fails with the error Keyset failure (keys-all)

I have no issues when doing this from Chainweaver


Solution

  • How to fix this

    This is an issue if you are also providing capabilities with your request.

    To fix this, you will need to put enforce-guard within a capability too. So you will need to do something like

    (defcap VERIFY_GUARD (some-guard:guard)
        (enforce-guard some-guard)
    )
    

    And wherever you would call enforce-guard , you will then need to do

    (with-capability (VERIFY_GAURD some-guard) 
       ; Guarded code here
    )
    

    Why does this happen?

    Chainweaver allows you to select unrestricted signing keys, which provides a key/guard for enforce-guard to work with.

    However X-Wallet and Zelcore don't provide this if capabilities present on the request (otherwise they do).

    It is probably better practice to add enforce-guard into capabilities anyways and use require-capability in places where you expect the guard to pass.