diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml
index 984d58a7..c4eae882 100644
--- a/.github/workflows/master.yml
+++ b/.github/workflows/master.yml
@@ -72,15 +72,6 @@ jobs:
repository: LedgerHQ/crypto-assets
event-type: submodules
- - name: Trigger update on LedgerHQ/crypto-assets-clear-signing-initiative
- if: ${{ !cancelled() }}
- timeout-minutes: 60
- uses: peter-evans/repository-dispatch@v3
- with:
- token: ${{ secrets.CI_BOT_TOKEN }}
- repository: LedgerHQ/crypto-assets-clear-signing-initiative
- event-type: submodules
-
- name: Trigger update on LedgerHQ/python-erc7730
if: ${{ !cancelled() }}
timeout-minutes: 60
diff --git a/README.md b/README.md
index 9b611ad0..e6c908e3 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# ERC-7730 (Clear Signing Metadata) Registry
-The objective of ERC-7730 is to establish a standardized method for clear signing contracts and messages on EVM chains, by offering metadata formatting that complements ABIs and message types. To learn more about the ERC-7730 standard, visit [Ledger Developer Portal](https://developers.ledger.com/docs/clear-signing/eip7730).
+The objective of ERC-7730 is to establish a standardized method for clear signing contracts and messages on EVM chains, by offering metadata formatting that complements ABIs and message types. To learn more about the ERC-7730 standard, visit [Ledger Developer Portal](https://developers.ledger.com/docs/clear-signing/erc7730).
This repository maintains records of past and current metadata files in the `registry` directory.
diff --git a/ercs/calldata-erc20-tokens.json b/ercs/calldata-erc20-tokens.json
index 675e780c..d02a1cc5 100644
--- a/ercs/calldata-erc20-tokens.json
+++ b/ercs/calldata-erc20-tokens.json
@@ -1,4 +1,5 @@
{
+ "$schema": "../specs/erc7730-v1.schema.json",
"context": {
"contract" : {
"abi": [
@@ -60,7 +61,16 @@
{
"path": "_to",
"label": "To",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "_value",
@@ -79,7 +89,16 @@
{
"path": "_spender",
"label": "Spender",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "_value",
diff --git a/ercs/calldata-erc721-nfts.json b/ercs/calldata-erc721-nfts.json
index 8afcf8c4..d9af57c6 100644
--- a/ercs/calldata-erc721-nfts.json
+++ b/ercs/calldata-erc721-nfts.json
@@ -1,4 +1,5 @@
{
+ "$schema": "../specs/erc7730-v1.schema.json",
"context": {
"contract" : {
"abi": [
@@ -83,15 +84,42 @@
"definitions": {
"from" : {
"label": "From",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
"to" : {
"label": "To",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
- "operator":{
+ "operator":{
"label": "Operator",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
"tokenId" : {
"label": "NFT",
@@ -131,12 +159,18 @@
"$id": "setApprovalForAll",
"intent": "Manage operator rights for",
"fields": [
- {
+ {
"path": "@.to",
"label": "Collection",
"format": "addressName",
"params": {
- "types": ["collection"]
+ "types": [
+ "collection"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
}
},
{ "path": "_operator", "$ref": "$.display.definitions.operator" },
diff --git a/ercs/eip712-erc2612-permit.json b/ercs/eip712-erc2612-permit.json
index b566d95b..492351f2 100644
--- a/ercs/eip712-erc2612-permit.json
+++ b/ercs/eip712-erc2612-permit.json
@@ -1,4 +1,5 @@
{
+ "$schema": "../specs/erc7730-v1.schema.json",
"context": {
"eip712": {
"schemas": [
@@ -58,7 +59,16 @@
{
"path": "spender",
"label": "Spender",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "value",
diff --git a/registry/1inch/calldata-AggregationRouterV3.json b/registry/1inch/calldata-AggregationRouterV3.json
new file mode 100644
index 00000000..e0ece271
--- /dev/null
+++ b/registry/1inch/calldata-AggregationRouterV3.json
@@ -0,0 +1,132 @@
+{
+ "$schema": "../../specs/erc7730-v1.schema.json",
+
+ "context": {
+ "$id": "AggregationRouterV3",
+ "contract": {
+ "abi": "https://api.etherscan.io/api?module=contract&action=getabi&address=0x11111112542d85b3ef69ae05771c2dccff4faa26",
+ "deployments": [
+ {
+ "chainId": 1,
+ "address": "0x11111112542D85B3EF69AE05771c2dCCff4fAa26"
+ },
+ {
+ "chainId": 56,
+ "address": "0x11111112542D85B3EF69AE05771c2dCCff4fAa26"
+ },
+ {
+ "chainId": 137,
+ "address": "0x11111112542D85B3EF69AE05771c2dCCff4fAa26"
+ }
+ ]
+ }
+ },
+
+ "metadata": {
+ "owner": "1inch",
+ "info": {
+ "url": "https://1inch.io/",
+ "legalName": "1inch Network",
+ "lastUpdate": "2021-03-14T20:28:50Z"
+ },
+ "constants": {
+ "addressAsEth": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
+ "addressAsNull": "0x0000000000000000000000000000000000000000"
+ }
+ },
+
+ "display": {
+ "definitions": {
+ "sendAmount": {
+ "label": "Amount to Send",
+ "format": "tokenAmount",
+ "params": {
+ "nativeCurrencyAddress": [
+ "$.metadata.constants.addressAsEth",
+ "$.metadata.constants.addressAsNull"
+ ]
+ }
+ },
+ "minReceiveAmount": {
+ "label": "Minimum to Receive",
+ "format": "tokenAmount",
+ "params": {
+ "nativeCurrencyAddress": [
+ "$.metadata.constants.addressAsEth",
+ "$.metadata.constants.addressAsNull"
+ ]
+ }
+ },
+ "beneficiary": {
+ "label": "Beneficiary",
+ "format": "addressName"
+ }
+ },
+ "formats": {
+ "swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags, bytes permit) desc, bytes data)" : {
+ "$id": "swap",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "desc.amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "desc.srcToken" }
+ },
+ {
+ "path": "desc.minReturnAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "desc.dstToken" }
+ },
+ {
+ "path": "desc.dstReceiver",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["desc.amount", "desc.minReturnAmount", "desc.dstReceiver"],
+ "excluded": ["caller", "desc.srcReceiver", "desc.flags", "desc.permit", "data"]
+ },
+ "unoswap(address srcToken, uint256 amount, uint256 minReturn, bytes32[] pools)" : {
+ "$id": "unoswap",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "@.from"],
+ "excluded": ["pools"]
+ },
+ "unoswapWithPermit(address srcToken, uint256 amount, uint256 minReturn, bytes32[] pools, bytes permit)" : {
+ "$id": "unoswapWithPermit",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "@.from"],
+ "excluded": ["pools", "permit"]
+ }
+ }
+ }
+}
diff --git a/registry/1inch/calldata-AggregationRouterV4-eth.json b/registry/1inch/calldata-AggregationRouterV4-eth.json
new file mode 100644
index 00000000..8d821660
--- /dev/null
+++ b/registry/1inch/calldata-AggregationRouterV4-eth.json
@@ -0,0 +1,86 @@
+{
+ "$schema": "../../specs/erc7730-v1.schema.json",
+ "includes": "common-AggregationRouterV4.json",
+
+ "context": {
+ "$id": "AggregationRouterV4",
+ "contract": {
+ "abi": "https://api.etherscan.io/api?module=contract&action=getabi&address=0x1111111254fb6c44bac0bed2854e76f90643097d",
+ "deployments": [
+ {
+ "chainId": 1,
+ "address": "0x1111111254fb6c44bAC0beD2854e76F90643097d"
+ }
+ ]
+ }
+ },
+
+ "display": {
+ "formats": {
+ "clipperSwap(address srcToken, address dstToken, uint256 amount, uint256 minReturn)" : {
+ "$id": "clipperSwap",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "dstToken" }
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "@.from"]
+ },
+ "clipperSwapTo(address recipient, address srcToken, address dstToken, uint256 amount, uint256 minReturn)" : {
+ "$id": "clipperSwapTo",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "dstToken" }
+ },
+ {
+ "path": "recipient",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "recipient"]
+ },
+ "clipperSwapToWithPermit(address recipient, address srcToken, address dstToken, uint256 amount, uint256 minReturn, bytes permit)" : {
+ "$id": "clipperSwapToWithPermit",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "dstToken" }
+ },
+ {
+ "path": "recipient",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "recipient"],
+ "excluded": ["permit"]
+ }
+ }
+ }
+}
diff --git a/registry/1inch/calldata-AggregationRouterV4.json b/registry/1inch/calldata-AggregationRouterV4.json
new file mode 100644
index 00000000..34778077
--- /dev/null
+++ b/registry/1inch/calldata-AggregationRouterV4.json
@@ -0,0 +1,21 @@
+{
+ "$schema": "../../specs/erc7730-v1.schema.json",
+ "includes": "common-AggregationRouterV4.json",
+
+ "context": {
+ "$id": "AggregationRouterV4",
+ "contract": {
+ "abi": "https://api.etherscan.io/v2/api?module=contract&action=getabi&chainid=56&address=0x1111111254fb6c44bac0bed2854e76f90643097d",
+ "deployments": [
+ {
+ "chainId": 56,
+ "address": "0x1111111254fb6c44bAC0beD2854e76F90643097d"
+ },
+ {
+ "chainId": 137,
+ "address": "0x1111111254fb6c44bAC0beD2854e76F90643097d"
+ }
+ ]
+ }
+ }
+}
diff --git a/registry/1inch/calldata-AggregationRouterV5.json b/registry/1inch/calldata-AggregationRouterV5.json
new file mode 100644
index 00000000..baa44bf3
--- /dev/null
+++ b/registry/1inch/calldata-AggregationRouterV5.json
@@ -0,0 +1,461 @@
+{
+ "$schema": "../../specs/erc7730-v1.schema.json",
+
+ "context": {
+ "$id": "AggregationRouterV5",
+ "contract": {
+ "abi": "https://api.etherscan.io/api?module=contract&action=getabi&address=0x1111111254eeb25477b68fb85ed929f73a960582",
+ "deployments": [
+ {
+ "chainId": 1,
+ "address": "0x1111111254EEB25477B68fb85Ed929f73A960582"
+ },
+ {
+ "chainId": 10,
+ "address": "0x1111111254EEB25477B68fb85Ed929f73A960582"
+ },
+ {
+ "chainId": 56,
+ "address": "0x1111111254EEB25477B68fb85Ed929f73A960582"
+ },
+ {
+ "chainId": 137,
+ "address": "0x1111111254EEB25477B68fb85Ed929f73A960582"
+ },
+ {
+ "chainId": 42161,
+ "address": "0x1111111254EEB25477B68fb85Ed929f73A960582"
+ }
+ ]
+ }
+ },
+
+ "metadata": {
+ "owner": "1inch",
+ "info": {
+ "url": "https://1inch.io/",
+ "legalName": "1inch Network",
+ "lastUpdate": "2022-11-04T06:04:59Z"
+ },
+ "constants": {
+ "addressAsEth": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
+ "addressAsNull": "0x0000000000000000000000000000000000000000"
+ }
+ },
+
+ "display": {
+ "definitions": {
+ "sendAmount": {
+ "label": "Amount to Send",
+ "format": "tokenAmount",
+ "params": {
+ "nativeCurrencyAddress": [
+ "$.metadata.constants.addressAsEth",
+ "$.metadata.constants.addressAsNull"
+ ]
+ }
+ },
+ "minReceiveAmount": {
+ "label": "Minimum to Receive",
+ "format": "tokenAmount",
+ "params": {
+ "nativeCurrencyAddress": [
+ "$.metadata.constants.addressAsEth",
+ "$.metadata.constants.addressAsNull"
+ ]
+ }
+ },
+ "beneficiary": {
+ "label": "Beneficiary",
+ "format": "addressName"
+ },
+ "expirationTime": {
+ "label": "Expiration time",
+ "format": "date",
+ "params": {
+ "encoding": "timestamp"
+ }
+ }
+ },
+ "formats": {
+ "swap(address executor, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags) desc, bytes permit, bytes data)" : {
+ "$id": "swap",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "desc.amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "desc.srcToken" }
+ },
+ {
+ "path": "desc.minReturnAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "desc.dstToken" }
+ },
+ {
+ "path": "desc.dstReceiver",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["desc.amount", "desc.minReturnAmount", "desc.dstReceiver"],
+ "excluded": ["executor", "desc.srcReceiver", "desc.flags", "permit", "data"]
+ },
+ "unoswap(address srcToken, uint256 amount, uint256 minReturn, uint256[] pools)" : {
+ "$id": "unoswap",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "@.from"],
+ "excluded": ["pools"]
+ },
+ "unoswapTo(address recipient, address srcToken, uint256 amount, uint256 minReturn, uint256[] pools)" : {
+ "$id": "unoswapTo",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "recipient",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "recipient"],
+ "excluded": ["pools"]
+ },
+ "unoswapToWithPermit(address recipient, address srcToken, uint256 amount, uint256 minReturn, uint256[] pools, bytes permit)" : {
+ "$id": "unoswapToWithPermit",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "recipient",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "recipient"],
+ "excluded": ["pools", "permit"]
+ },
+ "uniswapV3Swap(uint256 amount, uint256 minReturn, uint256[] pools)" : {
+ "$id": "uniswapV3Swap",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount"
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "@.from"],
+ "excluded": ["pools"]
+ },
+ "uniswapV3SwapTo(address recipient, uint256 amount, uint256 minReturn, uint256[] pools)" : {
+ "$id": "uniswapV3SwapTo",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount"
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "recipient",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "recipient"],
+ "excluded": ["pools"]
+ },
+ "uniswapV3SwapToWithPermit(address recipient, address srcToken, uint256 amount, uint256 minReturn, uint256[] pools, bytes permit)" : {
+ "$id": "uniswapV3SwapToWithPermit",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "recipient",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "recipient"],
+ "excluded": ["pools", "permit"]
+ },
+ "fillOrder((uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, uint256 offsets, bytes interactions) order, bytes signature, bytes interaction, uint256 makingAmount, uint256 takingAmount, uint256 skipPermitAndThresholdAmount)" : {
+ "$id": "fillOrder",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "order.takingAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "order.takerAsset" }
+ },
+ {
+ "path": "order.makingAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "order.makerAsset" }
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["order.takingAmount", "order.makingAmount", "@.from"],
+ "excluded": ["order.salt", "order.maker", "order.receiver", "order.allowedSender", "order.offsets", "order.interactions", "signature", "interaction", "makingAmount", "takingAmount", "skipPermitAndThresholdAmount"]
+ },
+ "fillOrderTo((uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, uint256 offsets, bytes interactions) order_, bytes signature, bytes interaction, uint256 makingAmount, uint256 takingAmount, uint256 skipPermitAndThresholdAmount, address target)" : {
+ "$id": "fillOrderTo",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "order_.takingAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "order_.takerAsset" }
+ },
+ {
+ "path": "order_.makingAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "order_.makerAsset" }
+ },
+ {
+ "path": "target",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["order_.takingAmount", "order_.makingAmount", "target"],
+ "excluded": ["order_.salt", "order_.maker", "order_.receiver", "order_.allowedSender", "order_.offsets", "order_.interactions", "signature", "interaction", "makingAmount", "takingAmount", "skipPermitAndThresholdAmount"]
+ },
+ "fillOrderToWithPermit((uint256 salt, address makerAsset, address takerAsset, address maker, address receiver, address allowedSender, uint256 makingAmount, uint256 takingAmount, uint256 offsets, bytes interactions) order, bytes signature, bytes interaction, uint256 makingAmount, uint256 takingAmount, uint256 skipPermitAndThresholdAmount, address target, bytes permit)" : {
+ "$id": "fillOrderToWithPermit",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "order.takingAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "order.takerAsset" }
+ },
+ {
+ "path": "order.makingAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "order.makerAsset" }
+ },
+ {
+ "path": "target",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["order.takingAmount", "order.makingAmount", "target"],
+ "excluded": ["order.salt", "order.maker", "order.receiver", "order.allowedSender", "order.offsets", "order.interactions", "signature", "interaction", "makingAmount", "takingAmount", "skipPermitAndThresholdAmount", "permit"]
+ },
+ "fillOrderRFQ((uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 flagsAndAmount)" : {
+ "$id": "fillOrderRFQ",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "order.takingAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "order.takerAsset" }
+ },
+ {
+ "path": "order.makingAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "order.makerAsset" }
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["order.takingAmount", "order.makingAmount", "@.from"],
+ "excluded": ["order.info", "order.maker", "order.allowedSender", "signature", "flagsAndAmount"]
+ },
+ "fillOrderRFQCompact((uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes32 r, bytes32 vs, uint256 flagsAndAmount)" : {
+ "$id": "fillOrderRFQCompact",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "order.takingAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "order.takerAsset" }
+ },
+ {
+ "path": "order.makingAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "order.makerAsset" }
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["order.takingAmount", "order.makingAmount", "@.from"],
+ "excluded": ["order.info", "order.maker", "order.allowedSender", "r", "vs", "flagsAndAmount"]
+ },
+ "fillOrderRFQTo((uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 flagsAndAmount, address target)" : {
+ "$id": "fillOrderRFQTo",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "order.takingAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "order.takerAsset" }
+ },
+ {
+ "path": "order.makingAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "order.makerAsset" }
+ },
+ {
+ "path": "target",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["order.takingAmount", "order.makingAmount", "target"],
+ "excluded": ["order.info", "order.maker", "order.allowedSender", "signature", "flagsAndAmount"]
+ },
+ "fillOrderRFQToWithPermit((uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 flagsAndAmount, address target, bytes permit)" : {
+ "$id": "fillOrderRFQToWithPermit",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "order.takingAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "order.takerAsset" }
+ },
+ {
+ "path": "order.makingAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "order.makerAsset" }
+ },
+ {
+ "path": "target",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["order.takingAmount", "order.makingAmount", "target"],
+ "excluded": ["order.info", "order.maker", "order.allowedSender", "signature", "flagsAndAmount", "permit"]
+ },
+ "clipperSwap(address clipperExchange, address srcToken, address dstToken, uint256 inputAmount, uint256 outputAmount, uint256 goodUntil, bytes32 r, bytes32 vs)" : {
+ "$id": "clipperSwap",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "inputAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "outputAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "dstToken" }
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ },
+ {
+ "path": "goodUntil",
+ "$ref": "$.display.definitions.expirationTime"
+ }
+ ],
+ "required": ["inputAmount", "outputAmount", "@.from", "goodUntil"],
+ "excluded": ["clipperExchange", "r", "vs"]
+ },
+ "clipperSwapTo(address clipperExchange, address recipient, address srcToken, address dstToken, uint256 inputAmount, uint256 outputAmount, uint256 goodUntil, bytes32 r, bytes32 vs)" : {
+ "$id": "clipperSwapTo",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "inputAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "outputAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "dstToken" }
+ },
+ {
+ "path": "recipient",
+ "$ref": "$.display.definitions.beneficiary"
+ },
+ {
+ "path": "goodUntil",
+ "$ref": "$.display.definitions.expirationTime"
+ }
+ ],
+ "required": ["inputAmount", "outputAmount", "recipient", "goodUntil"],
+ "excluded": ["clipperExchange", "r", "vs"]
+ },
+ "clipperSwapToWithPermit(address clipperExchange, address recipient, address srcToken, address dstToken, uint256 inputAmount, uint256 outputAmount, uint256 goodUntil, bytes32 r, bytes32 vs, bytes permit)" : {
+ "$id": "clipperSwapToWithPermit",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "inputAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "outputAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "dstToken" }
+ },
+ {
+ "path": "recipient",
+ "$ref": "$.display.definitions.beneficiary"
+ },
+ {
+ "path": "goodUntil",
+ "$ref": "$.display.definitions.expirationTime"
+ }
+ ],
+ "required": ["inputAmount", "outputAmount", "recipient", "goodUntil"],
+ "excluded": ["clipperExchange", "r", "vs", "permit"]
+ }
+ }
+ }
+}
diff --git a/registry/1inch/common-AggregationRouterV4.json b/registry/1inch/common-AggregationRouterV4.json
new file mode 100644
index 00000000..024b1e36
--- /dev/null
+++ b/registry/1inch/common-AggregationRouterV4.json
@@ -0,0 +1,238 @@
+{
+ "$schema": "../../specs/erc7730-v1.schema.json",
+
+ "metadata": {
+ "owner": "1inch",
+ "info": {
+ "url": "https://1inch.io/",
+ "legalName": "1inch Network",
+ "lastUpdate": "2021-11-05T10:18:09Z"
+ },
+ "constants": {
+ "addressAsEth": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
+ "addressAsNull": "0x0000000000000000000000000000000000000000"
+ }
+ },
+
+ "display": {
+ "definitions": {
+ "sendAmount": {
+ "label": "Amount to Send",
+ "format": "tokenAmount",
+ "params": {
+ "nativeCurrencyAddress": [
+ "$.metadata.constants.addressAsEth",
+ "$.metadata.constants.addressAsNull"
+ ]
+ }
+ },
+ "minReceiveAmount": {
+ "label": "Minimum to Receive",
+ "format": "tokenAmount",
+ "params": {
+ "nativeCurrencyAddress": [
+ "$.metadata.constants.addressAsEth",
+ "$.metadata.constants.addressAsNull"
+ ]
+ }
+ },
+ "beneficiary": {
+ "label": "Beneficiary",
+ "format": "addressName"
+ }
+ },
+ "formats": {
+ "swap(address caller, (address srcToken, address dstToken, address srcReceiver, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags, bytes permit) desc, bytes data)" : {
+ "$id": "swap",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "desc.amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "desc.srcToken" }
+ },
+ {
+ "path": "desc.minReturnAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "desc.dstToken" }
+ },
+ {
+ "path": "desc.dstReceiver",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["desc.amount", "desc.minReturnAmount", "desc.dstReceiver"],
+ "excluded": ["caller", "desc.srcReceiver", "desc.flags", "desc.permit", "data"]
+ },
+ "unoswap(address srcToken, uint256 amount, uint256 minReturn, bytes32[] pools)" : {
+ "$id": "unoswap",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "@.from"],
+ "excluded": ["pools"]
+ },
+ "unoswapWithPermit(address srcToken, uint256 amount, uint256 minReturn, bytes32[] pools, bytes permit)" : {
+ "$id": "unoswapWithPermit",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "@.from"],
+ "excluded": ["pools", "permit"]
+ },
+ "uniswapV3Swap(uint256 amount, uint256 minReturn, uint256[] pools)" : {
+ "$id": "uniswapV3Swap",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount"
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "@.from"],
+ "excluded": ["pools"]
+ },
+ "uniswapV3SwapTo(address recipient, uint256 amount, uint256 minReturn, uint256[] pools)" : {
+ "$id": "uniswapV3SwapTo",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount"
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "recipient",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "recipient"],
+ "excluded": ["pools"]
+ },
+ "uniswapV3SwapToWithPermit(address recipient, address srcToken, uint256 amount, uint256 minReturn, uint256[] pools, bytes permit)" : {
+ "$id": "uniswapV3SwapToWithPermit",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "amount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "srcToken" }
+ },
+ {
+ "path": "minReturn",
+ "$ref": "$.display.definitions.minReceiveAmount"
+ },
+ {
+ "path": "recipient",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["amount", "minReturn", "recipient"],
+ "excluded": ["pools", "permit"]
+ },
+ "fillOrderRFQ((uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 makingAmount, uint256 takingAmount)" : {
+ "$id": "fillOrderRFQ",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "order.takingAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "order.takerAsset" }
+ },
+ {
+ "path": "order.makingAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "order.makerAsset" }
+ },
+ {
+ "path": "@.from",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["order.takingAmount", "order.makingAmount", "@.from"],
+ "excluded": ["order.info", "order.maker", "order.allowedSender", "signature", "makingAmount", "takingAmount"]
+ },
+ "fillOrderRFQTo((uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 makingAmount, uint256 takingAmount, address target)" : {
+ "$id": "fillOrderRFQTo",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "order.takingAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "order.takerAsset" }
+ },
+ {
+ "path": "order.makingAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "order.makerAsset" }
+ },
+ {
+ "path": "target",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["order.takingAmount", "order.makingAmount", "target"],
+ "excluded": ["order.info", "order.maker", "order.allowedSender", "signature", "makingAmount", "takingAmount"]
+ },
+ "fillOrderRFQToWithPermit((uint256 info, address makerAsset, address takerAsset, address maker, address allowedSender, uint256 makingAmount, uint256 takingAmount) order, bytes signature, uint256 makingAmount, uint256 takingAmount, address target, bytes permit)" : {
+ "$id": "fillOrderRFQToWithPermit",
+ "intent": "Swap",
+ "fields": [
+ {
+ "path": "order.takingAmount",
+ "$ref": "$.display.definitions.sendAmount",
+ "params": { "tokenPath": "order.takerAsset" }
+ },
+ {
+ "path": "order.makingAmount",
+ "$ref": "$.display.definitions.minReceiveAmount",
+ "params": { "tokenPath": "order.makerAsset" }
+ },
+ {
+ "path": "target",
+ "$ref": "$.display.definitions.beneficiary"
+ }
+ ],
+ "required": ["order.takingAmount", "order.makingAmount", "target"],
+ "excluded": ["order.info", "order.maker", "order.allowedSender", "signature", "makingAmount", "takingAmount", "permit"]
+ }
+ }
+ }
+}
diff --git a/registry/aave/calldata-lpv2.json b/registry/aave/calldata-lpv2.json
index d3baa553..9205102f 100644
--- a/registry/aave/calldata-lpv2.json
+++ b/registry/aave/calldata-lpv2.json
@@ -58,7 +58,16 @@
{
"path": "onBehalfOf",
"format": "addressName",
- "label": "For debt holder"
+ "label": "For debt holder",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["amount", "rateMode", "onBehalfOf"]
@@ -71,7 +80,13 @@
"format": "addressName",
"label": "For asset",
"params": {
- "types": ["token"]
+ "types": [
+ "token"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
}
},
{
@@ -98,7 +113,16 @@
{
"path": "to",
"format": "addressName",
- "label": "To recipient"
+ "label": "To recipient",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["amount", "to"]
@@ -111,7 +135,13 @@
"format": "addressName",
"label": "For asset",
"params": {
- "types": ["token"]
+ "types": [
+ "token"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
}
},
{
@@ -147,7 +177,16 @@
{
"path": "onBehalfOf",
"format": "addressName",
- "label": "Debtor"
+ "label": "Debtor",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["amount", "onBehalfOf", "interestRateMode"]
@@ -167,7 +206,16 @@
{
"path": "onBehalfOf",
"format": "addressName",
- "label": "Collateral recipient"
+ "label": "Collateral recipient",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["amount", "onBehalfOf"]
diff --git a/registry/lido/calldata-OssifiableProxy.json b/registry/lido/calldata-OssifiableProxy.json
index 941468dc..f5bb4001 100644
--- a/registry/lido/calldata-OssifiableProxy.json
+++ b/registry/lido/calldata-OssifiableProxy.json
@@ -43,7 +43,16 @@
{
"path": "_owner",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["_amounts", "_owner"]
@@ -62,7 +71,16 @@
{
"path": "_owner",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["_amounts", "_owner"],
@@ -82,7 +100,16 @@
{
"path": "_owner",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["_amounts", "_owner"]
@@ -101,7 +128,16 @@
{
"path": "_owner",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["_amounts", "_owner"],
@@ -118,7 +154,16 @@
{
"path": "@.from",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["_requestId", "@.from"]
@@ -134,7 +179,16 @@
{
"path": "@.from",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["_requestIds", "@.from"],
@@ -151,7 +205,16 @@
{
"path": "_recipient",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["_requestIds", "_recipient"],
diff --git a/registry/lido/calldata-stETH.json b/registry/lido/calldata-stETH.json
index 0422345a..3d880307 100644
--- a/registry/lido/calldata-stETH.json
+++ b/registry/lido/calldata-stETH.json
@@ -36,7 +36,16 @@
{
"path": "_referral",
"label": "Referral",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["@.value"]
@@ -47,7 +56,16 @@
{
"path": "_spender",
"label": "Spender",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "_amount",
diff --git a/registry/lido/calldata-wstETH.json b/registry/lido/calldata-wstETH.json
index 417cabb6..5b5c0a4c 100644
--- a/registry/lido/calldata-wstETH.json
+++ b/registry/lido/calldata-wstETH.json
@@ -60,7 +60,16 @@
{
"path": "spender",
"label": "Spender",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "amount",
diff --git a/registry/paraswap/calldata-AugustusSwapper.json b/registry/paraswap/calldata-AugustusSwapper.json
index 55e6877b..a13f59a1 100644
--- a/registry/paraswap/calldata-AugustusSwapper.json
+++ b/registry/paraswap/calldata-AugustusSwapper.json
@@ -59,7 +59,16 @@
},
"beneficiary": {
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
"exchange": {
"label": "Exchange",
@@ -67,6 +76,10 @@
"params": {
"types": [
"contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
]
}
},
@@ -76,6 +89,10 @@
"params": {
"types": [
"contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
]
}
}
@@ -101,10 +118,7 @@
},
{
"path": "data.beneficiary",
- "$ref": "$.display.definitions.beneficiary",
- "params": {
- "tokenPath": "data.beneficiary"
- }
+ "$ref": "$.display.definitions.beneficiary"
}
],
"required": [
@@ -133,10 +147,7 @@
},
{
"path": "data.beneficiary",
- "$ref": "$.display.definitions.beneficiary",
- "params": {
- "tokenPath": "data.beneficiary"
- }
+ "$ref": "$.display.definitions.beneficiary"
}
],
"required": [
@@ -245,10 +256,7 @@
},
{
"path": "data.beneficiary",
- "$ref": "$.display.definitions.beneficiary",
- "params": {
- "tokenPath": "data.beneficiary"
- }
+ "$ref": "$.display.definitions.beneficiary"
}
],
"required": [
@@ -436,10 +444,7 @@
},
{
"path": "data.beneficiary",
- "$ref": "$.display.definitions.beneficiary",
- "params": {
- "tokenPath": "data.beneficiary"
- }
+ "$ref": "$.display.definitions.beneficiary"
}
],
"required": [
diff --git a/registry/poap/calldata-PoapBridge.json b/registry/poap/calldata-PoapBridge.json
index 89de5bc3..05b4f5ff 100644
--- a/registry/poap/calldata-PoapBridge.json
+++ b/registry/poap/calldata-PoapBridge.json
@@ -36,7 +36,16 @@
{
"path": "receiver",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "expirationTime",
diff --git a/registry/quickswap/calldata-QuickSwap.json b/registry/quickswap/calldata-QuickSwap.json
index 1ddf83af..381229ef 100644
--- a/registry/quickswap/calldata-QuickSwap.json
+++ b/registry/quickswap/calldata-QuickSwap.json
@@ -46,7 +46,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -79,7 +88,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -107,7 +125,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -143,7 +170,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -179,7 +215,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -212,7 +257,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -240,7 +294,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -292,7 +355,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -333,7 +405,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -369,7 +450,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -402,7 +492,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -438,7 +537,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -471,7 +579,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -504,7 +621,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
@@ -537,7 +663,16 @@
{
"path": "to",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "deadline",
diff --git a/registry/starkgate/calldata-StarkGate-STRK.json b/registry/starkgate/calldata-StarkGate-STRK.json
new file mode 100644
index 00000000..2ec861a9
--- /dev/null
+++ b/registry/starkgate/calldata-StarkGate-STRK.json
@@ -0,0 +1,57 @@
+{
+ "$schema": "../../specs/erc7730-v1.schema.json",
+
+ "context": {
+ "$id": "L1StarkGateSTRKbridge",
+ "contract": {
+ "abi": "https://api.etherscan.io/api?module=contract&action=getabi&address=0x6ad74D4B79A06A492C288eF66Ef868Dd981fdC85",
+ "deployments": [
+ {
+ "chainId": 1,
+ "address": "0xcE5485Cfb26914C5dcE00B9BAF0580364daFC7a4"
+ }
+ ]
+ }
+ },
+
+ "metadata": {
+ "owner": "Starknet",
+ "info": {
+ "url": "https://starkgate.starknet.io/",
+ "legalName": "StarkWare",
+ "lastUpdate": "2024-10-01T00:00:00Z"
+ }
+ },
+
+ "display": {
+ "formats": {
+ "deposit(address token, uint256 amount, uint256 l2Recipient)" : {
+ "$id": "deposit",
+ "intent": "Bridge",
+ "fields": [
+ {
+ "path": "token",
+ "label": "Token",
+ "format": "addressName",
+ "params": {
+ "types": [
+ "token"
+ ]
+ }
+ },
+ {
+ "path": "amount",
+ "label": "Amount",
+ "format": "amount"
+ },
+ {
+ "path": "l2Recipient",
+ "label": "Recipient",
+ "format": "raw"
+ }
+ ],
+ "required": ["token", "amount", "l2Recipient"]
+ }
+ }
+ }
+}
diff --git a/registry/uniswap/calldata-UniswapV3Router02.json b/registry/uniswap/calldata-UniswapV3Router02.json
index 6815b4fc..7bc363e9 100644
--- a/registry/uniswap/calldata-UniswapV3Router02.json
+++ b/registry/uniswap/calldata-UniswapV3Router02.json
@@ -48,7 +48,16 @@
{
"path": "params.recipient",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["params.amountIn", "params.amountOutMinimum", "params.recipient"]
@@ -86,7 +95,16 @@
{
"path": "params.recipient",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["params.amountIn", "params.amountOutMininimum", "params.fee", "params.recipient"]
@@ -114,7 +132,16 @@
{
"path": "params.recipient",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
],
"required": ["params.amountInMaximum", "params.amountOut", "params.recipient"]
@@ -152,7 +179,16 @@
{
"path": "params.recipient",
"label": "Beneficiary",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "eoa"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
]
},
diff --git a/registry/uniswap/eip712-UniswapX-DutchOrder.json b/registry/uniswap/eip712-UniswapX-DutchOrder.json
index 5831af38..655a91a5 100644
--- a/registry/uniswap/eip712-UniswapX-DutchOrder.json
+++ b/registry/uniswap/eip712-UniswapX-DutchOrder.json
@@ -142,7 +142,16 @@
{
"path": "spender",
"label": "Approve to spender",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "permitted.amount",
@@ -174,7 +183,16 @@
{
"path": "recipient",
"label": "On Addresses",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
]
},
diff --git a/registry/uniswap/eip712-UniswapX-ExclusiveDutchOrder.json b/registry/uniswap/eip712-UniswapX-ExclusiveDutchOrder.json
index 2a5355ec..f6e17fd4 100644
--- a/registry/uniswap/eip712-UniswapX-ExclusiveDutchOrder.json
+++ b/registry/uniswap/eip712-UniswapX-ExclusiveDutchOrder.json
@@ -151,7 +151,16 @@
{
"path": "spender",
"label": "Approve to spender",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "permitted.amount",
@@ -183,7 +192,16 @@
{
"path": "recipient",
"label": "On Addresses",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
]
},
diff --git a/registry/uniswap/eip712-UniswapX-LimitOrder.json b/registry/uniswap/eip712-UniswapX-LimitOrder.json
index 27992ef3..d2f804de 100644
--- a/registry/uniswap/eip712-UniswapX-LimitOrder.json
+++ b/registry/uniswap/eip712-UniswapX-LimitOrder.json
@@ -124,7 +124,16 @@
{
"path": "spender",
"label": "Approve to spender",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "permitted.amount",
@@ -156,7 +165,16 @@
{
"path": "recipient",
"label": "On Address",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
}
]
},
diff --git a/registry/uniswap/eip712-uniswap-permit2.json b/registry/uniswap/eip712-uniswap-permit2.json
index 40beb2b1..a235fbcc 100644
--- a/registry/uniswap/eip712-uniswap-permit2.json
+++ b/registry/uniswap/eip712-uniswap-permit2.json
@@ -122,7 +122,16 @@
{
"path": "spender",
"label": "Spender",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "details.amount",
@@ -158,7 +167,16 @@
{
"path": "spender",
"label": "Spender",
- "format": "addressName"
+ "format": "addressName",
+ "params": {
+ "types": [
+ "contract"
+ ],
+ "sources": [
+ "local",
+ "ens"
+ ]
+ }
},
{
"path": "details.[]",
diff --git a/specs/erc-7730.md b/specs/erc-7730.md
index f6430ced..ee1523de 100644
--- a/specs/erc-7730.md
+++ b/specs/erc-7730.md
@@ -1,7 +1,7 @@
---
eip: 7730
title: Structured Data Clear Signing Format
-description: Draft specification of a json format providing additional description of how to clear-sign smartcontract calls and typed messages
+description: Draft specification of a json format providing additional description of how to clear-sign smart contract calls and typed messages
author: Laurent Castillo (@lcastillo-ledger)
discussions-to: https://ethereum-magicians.org/t/eip-7730-proposal-for-a-clear-signing-standard-format-for-wallets/20403
status: Draft
@@ -15,7 +15,7 @@ requires: 712
This specification defines a JSON format carrying additional information required to correctly display structured data to a human for review on a wallet screen, before signature by the wallet.
-The [ERC-7730](./eip-7730.md) specification enriches type data contained in the ABIs and schemas of structured messages (structures like the calldata of an EVM transaction or an [EIP-712](./eip-712.md) message) with additional formatting information, so that wallets can construct a better UI when displaying the data before signature. For instance, a solidity field containing an amount, encoded as a uint256, can be converted to the right magnitude and appended with the correct ticker.
+The [ERC-7730](./eip-7730.md) specification enriches type data contained in the ABIs and schemas of structured messages (structures like the calldata of an EVM transaction or an [EIP-712](./eip-712.md) message) with additional formatting information, so that wallets can construct a better UI when displaying the data before signature. For instance, a solidity field containing an amount, encoded as an uint256, can be converted to the right magnitude and appended with the correct ticker.
Wallets will use (wallet-curated) ERC-7730 files alongside the raw data to sign in order to construct a display adapted to be reviewed by humans.
@@ -36,13 +36,13 @@ Providing this additional formatting information requires deep knowledge of the
> *Deployment model*
>
> Making the ERC-7730 available for wallets is a key factor of adoption. We have a few options:
-> - In each dApps github repository or web site: good for autonomy but can be problematic for discoverability by wallets of new ERC-7730 files
+> - In each dApps GitHub repository or website: good for autonomy but can be problematic for discoverability by wallets of new ERC-7730 files
> - Foundation operated repository, like ethereum chainID list: good alternative between decentralization and discoverability.
-> - Ledger repository: as a short term solution, Ledger is providing a central repository (See Ledger github repository)
+> - Ledger repository: as a short term solution, Ledger is providing a central repository (See Ledger GitHub repository)
## Specification
-The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 and RFC 8174.
+The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 and RFC 8174.
### Simple example
@@ -59,15 +59,15 @@ The following is a simple example of how to clear sign a `transfer` function cal
"deployments": [
{
"chainId": 1,
- "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
+ "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7"
},
{
"chainId": 137,
- "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
+ "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F"
},
{
"chainId": 42161,
- "address": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",
+ "address": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"
}
]
}
@@ -125,7 +125,7 @@ In this example, the metadata section contains only the recipient information, i
Finally, the `display` section contains the definitions of how to format each field of targeted contract calls under the `formats` key.
In this example, the function being described is identified by its solidity signature `transfer(address _to,uint256 _value)`. This is the signature used to compute the function selector `0xa9059cbb` (using the solidity signature guarantees unicity in the context of the contract).
-* The `intent` key contains a human readable string that wallets SHOULD display to explain to the user the intent of the function call.
+* The `intent` key contains a human-readable string that wallets SHOULD display to explain to the user the intent of the function call.
* The `fields` key contains all the parameters that CAN be displayed, and the way to format them
* The `required` key indicates which parameters wallets SHOULD display.
* The `excluded` key indicates which parameters are intentionally left out (none in this example).
@@ -143,11 +143,11 @@ In all the specification, key names starting with `$` are *internal* and have no
This specification intends to be extensible to describe the display formatting of any kind of *structured data*.
By *Structured data*, we target any data format that has:
-* A well defined *type* system; the data being described itself being of a specific type
+* A well-defined *type* system; the data being described itself being of a specific type
* A description of the type system, the *schema*, that should allow splitting the data into *fields*, each field clearly identified with a *path* that can be described as a string.
Displaying structured data is often done by wallets to review its content before authorizing an action in the form of a *signature* over some serialization of the structured data. As such, the structured data is contained in a *container structure*:
-* Container structure has a well defined *signature* scheme (a serialization scheme, a hashing scheme, and signature algorithm).
+* Container structure has a well-defined *signature* scheme (a serialization scheme, a hashing scheme, and signature algorithm).
* The container structure does not necessarily follow the same type system as the structured data.
* Wallets receive the full container structure and uses the signature scheme to generate a signature on the overall structure.
@@ -172,13 +172,13 @@ block-beta
Current specification covers EVM smart contract calldata:
* Defined in Solidity
-* The schema is the ABI (expected in json format when linked to))
+* The schema is the ABI (expected in json format when linked to)
* The container structure is an EVM Transaction serialized in RLP encoding
It also supports EIP-712 messages
* Defined in EIP-712
* The schema is extracted from the message itself, from the `types` definitions and the `primaryType` key.
-* An EIP-712 message is self contained, the signature is applied to the hashed message itself.
+* An EIP-712 message is self-contained, the signature is applied to the hashed message itself.
In the future, it could be extended to structured data like Meta Transaction in [EIP-2771](./eip-2771.md) or User Operations in [EIP-4337](./eip-4337.md).
@@ -193,19 +193,19 @@ It is sometime necessary for formatting of fields of the structured data to refe
This specification uses a limited [json path](https://www.rfc-editor.org/rfc/rfc9535) notation to reference values that can be found in multiple json documents.
Limitation to the json path specification are the following:
-* Pathes MUST use the dot notation, including for slice and array selectors (i.e an element of an array should be selected through `array_name.[index]`)
+* Paths MUST use the dot notation, including for slice and array selectors (i.e. an element of an array should be selected through `array_name.[index]`)
* Only name, index and slices selectors are supported.
* Slices selectors MUST NOT contain the optional step.
In addition, additional *roots* are introduced to support description of paths over multiple files in a single common notation. The root node identifier indicates which document or data location this path references, according to the following table:
-| Root node identifier | Refers to | Value location |
-| --- | --- | --- |
-| # | Path applies to the structured data *schema* (ABI path for contracts, path in the message types itself for EIP-712) | Values can be found in the serialized representation of the structured data |
-| $ | Path applies to the current file describing the structured data formatting, after merging with includes | Values can be found in the merged file itself |
-| @ | Path applies to the container of the structured data to be signed | Values can be found in the serialized container to sign, and are uniquely defined per container in the [Reference](#reference) section |
+| Root node identifier | Refers to | Value location |
+|----------------------|---------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|
+| # | Path applies to the structured data *schema* (ABI path for contracts, path in the message types itself for EIP-712) | Values can be found in the serialized representation of the structured data |
+| $ | Path applies to the current file describing the structured data formatting, after merging with includes | Values can be found in the merged file itself |
+| @ | Path applies to the container of the structured data to be signed | Values can be found in the serialized container to sign, and are uniquely defined per container in the [Reference](#reference) section |
-Root nodes and following separator can be omitted, in which case the path is *relative* to the structure being described. In case there is no encapsulating structure, relative pathes refer to the top-level structure described in the current file and are equivalent to `#.` root node.
+Root nodes and following separator can be omitted, in which case the path is *relative* to the structure being described. In case there is no encapsulating structure, relative paths refer to the top-level structure described in the current file and are equivalent to `#.` root node.
For paths referring to structured data fields, if a field has a variable length primitive type (like `bytes` or `string` in solidity), a slice selector can be appended to the path, to refer to the specific set of bytes indicated by the slice.
@@ -220,23 +220,23 @@ References to values in the serialized structured data
References to values in the format specification file
* `$.metadata.enums.interestRateMode` refers to the values of an enum defined in the specification file (typically to convert an integer into a displayed string)
-* `$.display.definitions.minReceiveAmount` refers to a common definition reused accross fields formatting definition
+* `$.display.definitions.minReceiveAmount` refers to a common definition reused across fields formatting definition
-References to values in the container (here a EVM Tx container)
+References to values in the container (here an EVM Tx container)
* `@.value` refers to the enclosing transaction native currency amount
-* `@.to` refers to the enclosing transaction destination address (usually, a smartcontract bound to this ERC-7730 through the `context` section)
+* `@.to` refers to the enclosing transaction destination address (usually, a smart contract bound to this ERC-7730 through the `context` section)
#### Organizing files
Smart contracts and EIP-712 messages are often re-using common interfaces or types that share similar display formatting. This specification supports a basic inclusion mechanism that enables sharing files describing specific interfaces or types.
-The `includes` top-level key is an URL pointing to an ERC-7730 file that MUST follow this specification.
+The `includes` top-level key is a URL pointing to an ERC-7730 file that MUST follow this specification.
A wallet using an ERC-7730 file including another file SHOULD merge those files into a single reference file. When merging, conflicts between common unique keys are resolved by prioritizing the including file.
*Merging field format specifications*
-Special care must be taken when merging [field format specifications](#field-format-specification). These objects are grouped in a array under the `fields` key, allowing ordering of field formatters. When merging the two arrays, a wallet SHOULD:
+Special care must be taken when merging [field format specifications](#field-format-specification). These objects are grouped in an array under the `fields` key, allowing ordering of field formatters. When merging the two arrays, a wallet SHOULD:
* Merge together objects sharing the same `path` value, overriding parameters of the included file with those of the including file.
* Append objects with `path` values not part of the included file to the resulting array.
@@ -246,7 +246,7 @@ This file defines a generic ERC-20 interface for a single `approve` function:
```json
{
"context": {
- "contract" : {
+ "contract": {
"abi": [
{
"inputs": [
@@ -265,7 +265,6 @@ This file defines a generic ERC-20 interface for a single `approve` function:
]
}
},
-
"display": {
"formats": {
"approve(address _spender,uint256 _value)": {
@@ -288,6 +287,7 @@ This file defines a generic ERC-20 interface for a single `approve` function:
}
],
"required": ["_spender", "_value"]
+ }
}
}
}
@@ -349,7 +349,7 @@ The `context` section describes a set of *constraints* that must be verified by
The current version of this specification only supports two types of binding context, EVM smart contracts and EIP-712 domains.
-All context support an `$id` sub-key as an internal identifier (only relevant to provide a human readable name to the ERC-7730 file)
+All context support an `$id` sub-key as an internal identifier (only relevant to provide a human-readable name to the ERC-7730 file)
#### EVM smart contract binding context (denoted 'calldata')
@@ -363,14 +363,14 @@ A wallet MUST verify that the ABI is applicable to the contract being called.
All paths described in the ERC-7730 starting with the `#.` root node (typically used to describe a single parameter of the contract call) are using selectors names coming from the parameter names of the ABI referenced.
-The `contract.abi` key is mandatory for a smartcontract ERC-7730 file.
+The `contract.abi` key is mandatory for a smart contract ERC-7730 file.
**`contract.deployments`**
An array of deployments options. Wallets MUST verify that the target chain and contract address of the containing transaction MUST match one of these deployment options.
A deployment option is an object with:
- * `chainId`: an [EIP-155 identifier](./eip-155.md) of the chain the descibed contract is deployed on.
+ * `chainId`: an [EIP-155 identifier](./eip-155.md) of the chain the described contract is deployed on.
* `address`: the address of the deployed contract on specified `chainId` chain.
---
@@ -384,7 +384,7 @@ A wallet MAY use this URL to check unknown addresses, default is to fail constra
**`contract.factory`**
-An object describing the factory used to deploy smartcontracts that can be clear signed using the ERC-7730 file.
+An object describing the factory used to deploy smart contracts that can be clear signed using the ERC-7730 file.
A factory is a json object with:
* `deployEvent` key, specifying the solidity signature of the events emitted when deploying a clear-signable contract.
@@ -428,7 +428,7 @@ In the sample EIP-712 message included in the specification [here](../assets/eip
{ "name": "name", "type": "string" },
{ "name": "version", "type": "string" },
{ "name": "chainId", "type": "uint256" },
- { "name": "verifyingContract", "type": "address" },
+ { "name": "verifyingContract", "type": "address" }
],
"Person": [
{ "name": "name", "type": "string" },
@@ -438,7 +438,7 @@ In the sample EIP-712 message included in the specification [here](../assets/eip
{ "name": "from", "type": "Person" },
{ "name": "to", "type": "Person" },
{ "name": "contents", "type": "string" }
- ],
+ ]
},
"primaryType": "Mail"
}
@@ -470,16 +470,16 @@ When an `eip712.deployments` constraint is set, the wallet MUST verify that:
* The `chainId` and `verifyingContract` values in the domain match ONE of the deployment option specified in `eip712.deployments`
A deployment option is an object with:
-* `chainId`: an EIP-155 identifier of the chain the descibed contract is deployed on.
+* `chainId`: an EIP-155 identifier of the chain the described contract is deployed on.
* `address`: the address of the deployed contract on specified `chainId` chain.
**`eip712.domainSeparator`**
-An hex string containg the value of the *domainSeparator* to check.
+An hex string containing the value of the *domainSeparator* to check.
Wallet MUST verify that the message *EIP-712 Domain* hashes (as defined in EIP-712) to the value in `eip712.domainSeparator`.
-When the exact construction of the EIP-712 domain is not known (for instance, when the smartcontract code only contains the hashe value of the domain separator), `domainSeparator` and `domain.verifyingContract` can still be used to target the right message recipients.
+When the exact construction of the EIP-712 domain is not known (for instance, when the smart contract code only contains the hash value of the domain separator), `domainSeparator` and `domain.verifyingContract` can still be used to target the right message recipients.
*Examples*
@@ -545,7 +545,7 @@ A wallet MAY use this information to display additional details about the target
The `token` key is only relevant for `contract` ERC-7730 files and only for contracts supporting an ERC-20 interface.
-It contains the ERC-20 metadata when the contract itself does not support the optional calls to retrieve it. It SHOULD NOT be present if the contract does support the `name()`, `symbol()` and `decimals()` smartcontract calls.
+It contains the ERC-20 metadata when the contract itself does not support the optional calls to retrieve it. It SHOULD NOT be present if the contract does support the `name()`, `symbol()` and `decimals()` smart contract calls.
The ERC-20 token metadata for the contract described is in the sub-keys `name`, `ticker` and `decimals`
@@ -566,11 +566,11 @@ It is a list of key / value pairs, the key being used to reference this constant
}
}
```
-This snippet introduces a constant `nativeAssetAddress` (an address typically used to represet the native network underying currency, which is smart contract specific). This constant can be referenced using the path `$.metadata.constants.nativeAssetAddress`
+This snippet introduces a constant `nativeAssetAddress` (an address typically used to represent the native network underlying currency, which is smart contract specific). This constant can be referenced using the path `$.metadata.constants.nativeAssetAddress`
**`metadata.enums`**
-The `enums` key contains displayable values for parameters that are enumerations (in a loose sense including parameters taking fixed number of well known values). These `enums` are used to replace specific paramater values with a human readable one.
+The `enums` key contains displayable values for parameters that are enumerations (in a loose sense including parameters taking fixed number of well known values). These `enums` are used to replace specific parameter values with a human-readable one.
Each key of the `enums` object is an *enumeration* name. Enumeration names can be referred to in the `display` section formatters by using a path starting with root node `$.` (i.e. `$.metadata.enums.ENUM_NAME`).
@@ -581,7 +581,7 @@ An enum is a json object with a flat list of key / value pairs, each key being t
Alternatively, rather than a json object with displayable values, an enum can be a simple string containing an URL. That URL MUST return the json object with the enumeration key-values.
-A wallet MAY use this URL to resolve more dynamic enumeration values uner the control of the owner of the URL.
+A wallet MAY use this URL to resolve more dynamic enumeration values under the control of the owner of the URL.
*Examples*
@@ -589,11 +589,11 @@ A wallet MAY use this URL to resolve more dynamic enumeration values uner the co
{
"metadata": {
"enums": {
- "interestRateMode" : {
+ "interestRateMode": {
"1": "stable",
"2": "variable"
},
- "vaultIDs": "http://example.com/vaultIDs"
+ "vaultIDs": "https://example.com/vaultIDs"
}
}
}
@@ -653,15 +653,15 @@ A *Structured data format specification* is used to describe how to format all t
**`$id`**
-This key is purely internal and used to specify a human readable identifier for this specification.
+This key is purely internal and used to specify a human-readable identifier for this specification.
**`intent`**
-Use to specify the *intent* of the function call or message signature in a user friendly way.
+Use to specify the *intent* of the function call or message signature in a user-friendly way.
An intent can take two forms:
-* A simple string with human readable content
-* A json object with a flat list of string key-value pairs, representing more complex intents. Both keys and values should be human readable and user friendly.
+* A simple string with human-readable content
+* A json object with a flat list of string key-value pairs, representing more complex intents. Both keys and values should be human-readable and user-friendly.
Wallets SHOULD use this `intent` value to display a clear intent when reviewing the structured data before signature. When displaying a complex json intent, it is expected that keys represent labels, and values should be displayed after their label.
@@ -679,7 +679,7 @@ Wallets SHOULD use this `intent` value to display a clear intent when reviewing
}
}
```
-This snippet defines an intent for a withdraw function on a contract, with an expectation that the intent would be displayed in a structured way on the wallet screen.
+This snippet defines an intent for a withdrawal function on a contract, with an expectation that the intent would be displayed in a structured way on the wallet screen.
**`fields`**
@@ -822,6 +822,7 @@ A slice on an array type means that the associated [field format specification](
"tokenPath": "params.path.[0:19]"
}
}
+ ]
}
}
}
@@ -891,19 +892,19 @@ This section describes all container structure supported by this specification a
#### EVM Transaction container
-| Value reference | Value Description | Examples |
-| --- | --- | --- |
-| @.from | The address of the sender of the transaction | |
-| @.value | The native currency value of the transaction | |
-| @.to | The destination address of the containing transaction, ie the target smart contract address | |
+| Value reference | Value Description | Examples |
+|-----------------|---------------------------------------------------------------------------------------------|----------|
+| @.from | The address of the sender of the transaction | |
+| @.value | The native currency value of the transaction | |
+| @.to | The destination address of the containing transaction, ie the target smart contract address | |
#### EIP-712 container
-| Value reference | Value Description | Examples |
-| --- | --- | --- |
-| @.from | The address of the signer of the message | |
-| @.value | EIP-712 have no underlying currency value transferred, so a wallet MAY interpret it as 0 | |
-| @.to | The verifying contract address, when known. If not known a wallet SHOULD reject using the ERC-7730 file to clear sign the message | |
+| Value reference | Value Description | Examples |
+|-----------------|-----------------------------------------------------------------------------------------------------------------------------------|----------|
+| @.from | The address of the signer of the message | |
+| @.value | EIP-712 have no underlying currency value transferred, so a wallet MAY interpret it as 0 | |
+| @.to | The verifying contract address, when known. If not known a wallet SHOULD reject using the ERC-7730 file to clear sign the message | |
### Field formats
@@ -912,160 +913,160 @@ In the following references, the format title is the value to use under the `for
#### Integer formats
-Formats useable for uint/int solidity types.
+Formats usable for uint/int solidity types.
---
-| **`raw`** | |
-| --- | --- |
-| *Description* | Display the integer as a raw int in natural, localized representation |
-| *Parameters* | None |
-| *Examples* | Value 1000 displayed as `1000` |
+| **`raw`** | |
+|---------------|-----------------------------------------------------------------------|
+| *Description* | Display the integer as a raw int in natural, localized representation |
+| *Parameters* | None |
+| *Examples* | Value 1000 displayed as `1000` |
---
-| **`amount`** | |
-| --- | --- |
-| *Description* | Display as an amount in native currency, using best ticker / magnitude match |
-| *Parameters* | None |
-| *Examples* | Value 0x2c1c986f1c48000 is displayed as `0.19866144 ETH` |
+| **`amount`** | |
+|---------------|------------------------------------------------------------------------------|
+| *Description* | Display as an amount in native currency, using best ticker / magnitude match |
+| *Parameters* | None |
+| *Examples* | Value 0x2c1c986f1c48000 is displayed as `0.19866144 ETH` |
---
-| **`tokenAmount`** | |
-| --- | --- |
-| *Description* | Convert value using token decimals, and append token ticker name. If value is above optional `threshold`, display instead `message` with ticker. |
-| *Parameters* | --- |
-| `tokenPath` | path reference to the address of the token contract. Used to associate correct ticker. If ticker is not found or tokenPath is not set, the wallet SHOULD display the raw value instead with an "Unknown token" warning |
-| `nativeCurencyAddress` | Either a string or an array of strings. If the address pointed to by `tokenPath` is equal to one of the addresses in `nativeCurrencyAddress`, the tokenAmount is interpreted as expressed in native currency |
-| `threshold` | integer value, above which value is displayed as a special message. Optional |
-| `message` | message to display above threshold. Optional, defaults to "Unlimited" |
-| *Examples* | --- |
-| `1 DAI` | Field value = 1000000
`tokenPath` =0x6B17...1d0F (DAI, 6 decimals) |
-| `Unlimited DAI` | Field value = 0xFFFFFFFF
`tokenPath` =0x6B17...1d0F (DAI, 6 decimals)
`threshold` "0xFFFFFFFF" |
-| `Max DAI` | Field value = 0xFFFFFFFF
`tokenPath` =0x6B17...1d0F (DAI, 6 decimals)
`threshold` "0xFFFFFFFF"
`message` = "Max" |
+| **`tokenAmount`** | |
+|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| *Description* | Convert value using token decimals, and append token ticker name. If value is above optional `threshold`, display instead `message` with ticker. |
+| *Parameters* | --- |
+| `tokenPath` | path reference to the address of the token contract. Used to associate correct ticker. If ticker is not found or tokenPath is not set, the wallet SHOULD display the raw value instead with an "Unknown token" warning |
+| `nativeCurencyAddress` | Either a string or an array of strings. If the address pointed to by `tokenPath` is equal to one of the addresses in `nativeCurrencyAddress`, the tokenAmount is interpreted as expressed in native currency |
+| `threshold` | integer value, above which value is displayed as a special message. Optional |
+| `message` | message to display above threshold. Optional, defaults to "Unlimited" |
+| *Examples* | --- |
+| `1 DAI` | Field value = 1000000
`tokenPath` =0x6B17...1d0F (DAI, 6 decimals) |
+| `Unlimited DAI` | Field value = 0xFFFFFFFF
`tokenPath` =0x6B17...1d0F (DAI, 6 decimals)
`threshold` "0xFFFFFFFF" |
+| `Max DAI` | Field value = 0xFFFFFFFF
`tokenPath` =0x6B17...1d0F (DAI, 6 decimals)
`threshold` "0xFFFFFFFF"
`message` = "Max" |
---
-| **`nftName`** | |
-| --- | --- |
-| *Description* | Display value as a specific NFT in a collection, if found by wallet, or fallback to a raw int token ID if not |
-| *Parameters* | --- |
-| `collectionPath` | A path reference to the collection address |
-| *Examples* | --- |
-| `ETH-USD December 10, 2021 3:48 PM GMT` | Field Value = 674
`collectionPath` = "0xaa3a...84ea" (from rarible) |
+| **`nftName`** | |
+|-----------------------------------------|---------------------------------------------------------------------------------------------------------------|
+| *Description* | Display value as a specific NFT in a collection, if found by wallet, or fallback to a raw int token ID if not |
+| *Parameters* | --- |
+| `collectionPath` | A path reference to the collection address |
+| *Examples* | --- |
+| `ETH-USD December 10, 2021 3:48 PM GMT` | Field Value = 674
`collectionPath` = "0xaa3a...84ea" (from rarible) |
---
-| **`date`** | |
-| --- | --- |
-| *Description* | Display int as a date, using specified encoding. Date display RECOMMENDED use of RFC 3339 |
-| *Parameters* | --- |
-| `"encoding": "timestamp"` | value is encoded as a unix timestamp |
-| `"encoding": "blockheight"` | value is a blockheight and is converted to an approximate unix timestamp |
-| *Examples* | --- |
-| `2024-02-29T08:27:12` | Field Value = 1709191632
`encoding` = "timestamp" |
-| `2024-02-29T09:00:35` | Field Value = 19332140
`encoding` = "blockheight" |
+| **`date`** | |
+|-----------------------------|-------------------------------------------------------------------------------------------|
+| *Description* | Display int as a date, using specified encoding. Date display RECOMMENDED use of RFC 3339 |
+| *Parameters* | --- |
+| `"encoding": "timestamp"` | value is encoded as a unix timestamp |
+| `"encoding": "blockheight"` | value is a blockheight and is converted to an approximate unix timestamp |
+| *Examples* | --- |
+| `2024-02-29T08:27:12` | Field Value = 1709191632
`encoding` = "timestamp" |
+| `2024-02-29T09:00:35` | Field Value = 19332140
`encoding` = "blockheight" |
---
-| **`duration`** | |
-| --- | --- |
-| *Description* | Display int as a duration interpreted in seconds and represented as a duration HH:MM:ss |
-| *Parameters* | None |
-| *Examples* | --- |
+| **`duration`** | |
+|----------------|-----------------------------------------------------------------------------------------|
+| *Description* | Display int as a duration interpreted in seconds and represented as a duration HH:MM:ss |
+| *Parameters* | None |
+| *Examples* | --- |
---
-| **`unit`** | |
-| --- | --- |
-| *Description* | Value is converted to a float using `decimals` (`value / 10^decimals`) and displayed appending the corresponding unit. If `prefix` is true, the value is further converted to scientific representation, minimizing the significand and converting the exponent to an SI prefix added in front of the unit symbol |
-| *Parameters* | --- |
-| `base` | The symbol of the base unit, an SI unit or other acceptable symbols like "%", "bps" |
-| `decimals` | Number of decimals in integer representation, defaults to 0 |
-| `prefix` | A boolean indicating whether an SI prefix should be appended, defaults to `False` |
-| *Examples* | --- |
+| **`unit`** | |
+|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| *Description* | Value is converted to a float using `decimals` (`value / 10^decimals`) and displayed appending the corresponding unit. If `prefix` is true, the value is further converted to scientific representation, minimizing the significand and converting the exponent to an SI prefix added in front of the unit symbol |
+| *Parameters* | --- |
+| `base` | The symbol of the base unit, an SI unit or other acceptable symbols like "%", "bps" |
+| `decimals` | Number of decimals in integer representation, defaults to 0 |
+| `prefix` | A boolean indicating whether an SI prefix should be appended, defaults to `False` |
+| *Examples* | --- |
---
-| **`enum`** | |
-| --- | --- |
-| *Description* | Value is converted using referenced constant enumeration values |
-| *Parameters* | --- |
-| `$ref` | An internal path (starting with root node `$.`) to an enumerations in `metadata.constants` |
-| *Examples* | |
+| **`enum`** | |
+|---------------|--------------------------------------------------------------------------------------------|
+| *Description* | Value is converted using referenced constant enumeration values |
+| *Parameters* | --- |
+| `$ref` | An internal path (starting with root node `$.`) to an enumerations in `metadata.constants` |
+| *Examples* | |
#### String formats
-Formats useable for strings.
+Formats usable for strings.
---
-| **`raw`** | |
-| --- | --- |
-| *Description* | Display as an UTF-8 encoded string |
-| *Parameters* | None |
-| *Examples* | --- |
-| `Ledger` | Field Value = ['4c','65','64','67','65','72'] |
+| **`raw`** | |
+|---------------|-----------------------------------------------|
+| *Description* | Display as an UTF-8 encoded string |
+| *Parameters* | None |
+| *Examples* | --- |
+| `Ledger` | Field Value = ['4c','65','64','67','65','72'] |
#### Bytes formats
-Formats useable for bytes
+Formats usable for bytes
---
-| **`raw`** | |
-| --- | --- |
-| *Description* | Display byte array as an hex-encoded string |
-| *Parameters* | None |
-| *Examples* | --- |
-| `123456789A` | Field Value = Value ['12','34','56','78','9a'] |
+| **`raw`** | |
+|---------------|------------------------------------------------|
+| *Description* | Display byte array as an hex-encoded string |
+| *Parameters* | None |
+| *Examples* | --- |
+| `123456789A` | Field Value = Value ['12','34','56','78','9a'] |
---
-| **`calldata`** | |
-| --- | --- |
-| *Description* | Data contains a call to another smartcontract. To look for relevant ERC-7730 files matching this embedded calldata, use `callee` parameter and `selector`. If an ERC-7730 is not found or if embedded calldata are not supported by the wallet, it MAY display a hash of the embedded calldata instead, with target `calleePath` resolved to a trusted name if possible. |
-| *Parameters* | --- |
-| `selector` | Optional selector, if not present the first 4 bytes of the calldata are interpreted as the selector |
-| `calleePath` | A path reference to the contract being called |
-| *Examples* | |
+| **`calldata`** | |
+|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| *Description* | Data contains a call to another smart contract. To look for relevant ERC-7730 files matching this embedded calldata, use `callee` parameter and `selector`. If an ERC-7730 is not found or if embedded calldata are not supported by the wallet, it MAY display a hash of the embedded calldata instead, with target `calleePath` resolved to a trusted name if possible. |
+| *Parameters* | --- |
+| `selector` | Optional selector, if not present the first 4 bytes of the calldata are interpreted as the selector |
+| `calleePath` | A path reference to the contract being called |
+| *Examples* | |
#### Address
-Formats useable for address
+Formats usable for address
---
-| **`raw`** | |
-| --- | --- |
-| *Description* | Display address as an [EIP-55](./eip-55.md) formatted string. Truncation is device dependent |
-| *Parameters* | None |
-| *Examples* | --- |
-| `0x5aAe...eAed` | Field Value 0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed |
+| **`raw`** | |
+|-----------------|----------------------------------------------------------------------------------------------|
+| *Description* | Display address as an [EIP-55](./eip-55.md) formatted string. Truncation is device dependent |
+| *Parameters* | None |
+| *Examples* | --- |
+| `0x5aAe...eAed` | Field Value 0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed |
---
-| **`addressName`** | |
-| --- | --- |
-| *Description* | Display address as a trusted name if a trusted source exists, an EIP-55 formatted address otherwise. See [next section](#address-trusted-sources) for a reference of trusted sources |
-| *Parameters* | --- |
-| `types` | An array of expected types of the address (see [next section](#address-types-and-sources)). If set, the wallet SHOULD check that the address matches one of the types provided |
-| `sources` | An array of acceptable sources for names (see [next section](#address-types-and-sources)). If set, the wallet SHOULD restrict name lookup to relevant sources |
-| *Examples* | --- |
-| `vitalik.eth` | Field Value 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 |
+| **`addressName`** | |
+|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| *Description* | Display address as a trusted name if a trusted source exists, an EIP-55 formatted address otherwise. See [next section](#address-types-and-sources) for a reference of trusted sources |
+| *Parameters* | --- |
+| `types` | An array of expected types of the address (see [next section](#address-types-and-sources)). If set, the wallet SHOULD check that the address matches one of the types provided |
+| `sources` | An array of acceptable sources for names (see [next section](#address-types-and-sources)). If set, the wallet SHOULD restrict name lookup to relevant sources |
+| *Examples* | --- |
+| `vitalik.eth` | Field Value 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 |
#### Address types and sources
-Address names trusted sources specify which type and source of trusted names SHOULD be used to replace an address with a human readable names.
+Address names trusted sources specify which type and source of trusted names SHOULD be used to replace an address with a human-readable names.
When specified a wallet MUST only use specified sources to resolve address names. Wallet MUST verify the type of the address if able to.
When omitted, a wallet MAY use any source to resolve an address.
-| Address type | Description |
-| --- | --- |
-| wallet | Address is an account controlled by the wallet |
-| eoa | Address is an Externally Owned Account |
-| contract | Address is a well known smartcontract |
-| token | Address is a well known ERC-20 token |
-| collection | Address is a well known NFT collection |
+| Address type | Description |
+|--------------|------------------------------------------------|
+| wallet | Address is an account controlled by the wallet |
+| eoa | Address is an Externally Owned Account |
+| contract | Address is a well known smart contract |
+| token | Address is a well known ERC-20 token |
+| collection | Address is a well known NFT collection |
A wallet MAY verify that a `wallet` address is in fact controlled by the wallet, and reject signing if not the case.
Sources values are wallet manufacturer specific. Some example values could be:
-| Source type | Description |
-|-------------| --- |
+| Source type | Description |
+|-------------|------------------------------------------------------------------------------------------------------------------------------------|
| local | Address MAY be replaced with a local name trusted by user. Wallets MAY consider that `local` setting for `sources` is always valid |
-| ens | Address MAY be replaced with an associated ENS domain |
+| ens | Address MAY be replaced with an associated ENS domain |
### Wallets
@@ -1092,7 +1093,7 @@ Wide support by wallets is key for adoption of this specification.
Hardware wallets tend to have more limited capabilities that will impact what they can display securely, especially since the intention of the specification is to create a strong security binding between the spec and the data being reviewed.
This consideration is driving a few choices done for ERC-7730:
-* Complex UI constructs like layouts, grouping and re-ordering of fields have been left to a wallet specific section, yet unspecified. After a time, we may see patterns emerge between wallets in term of minimal features.
+* Complex UI constructs like layouts, grouping and re-ordering of fields have been left to a wallet specific section, yet unspecified. After a time, we may see patterns emerge between wallets in terms of minimal features.
* Representation of fields has been created to allow "flattening" the list of fields, when handling complex message structures. This flattened representation is expected to work better with Hardware wallets in particular, and is recommended at first.
* Some formatters that require recursive constructs, like `calldata` are expected to work with restrictions at first, especially on Hardware wallets.
@@ -1120,7 +1121,7 @@ It is also expected that the way the formatting is applied to the data is not vu
### Curation model
-The second attack is not directly mitigated by the specification (beyond providing recommendations). It is rather expected that wallets will use a two step curation process, and NOT trust ERC-7730 files coming directly from the public repository.
+The second attack is not directly mitigated by the specification (beyond providing recommendations). It is rather expected that wallets will use a two-step curation process, and NOT trust ERC-7730 files coming directly from the public repository.
Rather wallets SHOULD do some additional verifications on the ERC-7730 file itself and corresponding dApps before trusting the file to build their user's UI.
diff --git a/specs/erc7730-v1.schema.json b/specs/erc7730-v1.schema.json
index 86352436..24f66de3 100644
--- a/specs/erc7730-v1.schema.json
+++ b/specs/erc7730-v1.schema.json
@@ -129,22 +129,32 @@
"properties" : {
"schemas" :
{
- "title": "EIP 712 Schemas constraint",
- "type": "array",
- "description": "An array of EIP712 schemas that can be used to validate the message. The message types should match exactly one of those schema.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/$definitions/eip712-json-schema"
- },
- {
- "title": "An EIP712 Schema url",
- "description": "URL of an EIP712 Schema bound to this file.",
- "type": "string",
- "format": "uri-reference"
+ "oneOf": [
+ {
+ "title": "An EIP712 Schemas url",
+ "description": "URL of an array of EIP712 schemas that can be used to validate the message. The message types should match exactly one of those schema.",
+ "type": "string",
+ "format": "uri-reference"
+ },
+ {
+ "title": "EIP 712 Schemas constraint",
+ "type": "array",
+ "description": "An array of EIP712 schemas that can be used to validate the message. The message types should match exactly one of those schema.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/$definitions/eip712-json-schema"
+ },
+ {
+ "title": "An EIP712 Schema url",
+ "description": "URL of an EIP712 Schema bound to this file.",
+ "type": "string",
+ "format": "uri-reference"
+ }
+ ]
}
- ]
- }
+ }
+ ]
},
"domain": {
"title": "EIP 712 Domain Binding constraint",