0

I have a gnosis-safe and an ERC-20 contract with permit(owner, spender, value, deadline, v, r, s) method that requires v,r,s of the owner as the argument.

I have calculated the required v,r,s value for an EOA as owner using its private keys directly and it worked without any problem.

Now I am not able to figure out how to achieve the same for a gnosis-safe as the owner.

There is one method named signTypedData in gnosis-safe-sdk but it takes SafeTransaction type as input which is not at all similar to the kind of typed-data I am aware of.

typed-Data that I used while signing via EOA looks something like this,

{
  "types": {
    "EIP712Domain": [
      {
        "name": "name",
        "type": "string"
      },
      {
        "name": "version",
        "type": "string"
      },
      {
        "name": "chainId",
        "type": "uint256"
      },
      {
        "name": "verifyingContract",
        "type": "address"
      }
    ],
    "Permit": [
      {
        "name": "owner",
        "type": "address"
      },
      {
        "name": "spender",
        "type": "address"
      },
      {
        "name": "value",
        "type": "uint256"
      },
      {
        "name": "nonce",
        "type": "uint256"
      },
      {
        "name": "deadline",
        "type": "uint256"
      }
    ]
  },
  "primaryType": "Permit",
  "domain": {
    "name": "JEBA",
    "version": "1",
    "chainId": "0x61",
    "verifyingContract": "0xf2A622494b8328d2Ed0E6FB1AeEA9B750624a488"
  },
  "message": {
    "owner": "0xC20C81665AF4104Bb6405F9Bdb19a6FF645C6B0a",
    "spender": "0x24Cd34c77DFcb50b5C473b9eEEAa5c57Af730D64",
    "value": "10000000",
    "nonce": "0x0000000000000000000000000000000000000000000000000000000000000002",
    "deadline": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
  }
}

From an EOA account, this typed-data can be signed using both ecsign method of ethereumjs-util and ethers.SigningKey.signDigest, which gives me v,r and s value which is then can be used to call permit method.

whereas, the SafeTransaction type is something like this,

export declare enum OperationType {
    Call = 0,
    DelegateCall = 1
}
export interface MetaTransactionData {
    readonly to: string;
    readonly value: string;
    readonly data: string;
    readonly operation?: OperationType;
}
export interface SafeTransactionData extends MetaTransactionData {
    readonly operation: OperationType;
    readonly safeTxGas: number;
    readonly baseGas: number;
    readonly gasPrice: number;
    readonly gasToken: string;
    readonly refundReceiver: string;
    readonly nonce: number;
}
export interface SafeTransaction {
    readonly data: SafeTransactionData;
    readonly signatures: Map<string, SafeSignature>;
    addSignature(signature: SafeSignature): void;
    encodedSignatures(): string;
}

I am not able to figure out how to use typed-data json in the SafeTransaction object, so that I can call safeSdk.signTypedData(safeTransaction) with the safe account to get the v,r,s values.

1

1 Answer 1

0

It all depends on the implementation of the token contract, but the implementation defined by original permit standard doesn't imply smart contract wallet support.

Many smart contract wallets (incl. Safe) support transaction batching, so you can batch the approval and swap into single transaction. It makes permits redundant.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.