Criar uma Política
Uma política é um conjunto de regras que pode bloquear solicitações de assinatura. As solicitações de assinatura incluem transações de blockchain e solicitações para assinar dados, como dados digitados EIP-712. Cada regra armazenada tem um escopo, condições e uma resposta BLOCK. As regras ativadas se aplicam cumulativamente: se alguma regra aplicável corresponder, a solicitação será negada.
Se a avaliação da política for concluída com sucesso e nenhuma regra aplicável retornar uma resposta BLOCK, a solicitação poderá continuar depois que o UWM (Wallet Manager) do UWaaS autenticar o chamador, autorizar a wallet e a chave e validar a solicitação de assinatura.
Definir Condições da Regra
Uma regra combina condições com all, any e not. Você pode aninhar esses grupos para definir uma restrição:
allcorresponde quando cada condição filha corresponde.anycorresponde quando pelo menos uma condição filha corresponde.notcorresponde quando sua condição filha não corresponde.
Definir grupos de condições em linha. As referências de condição nomeada não são suportadas para regras de assinatura de UWM.
Uma folha de condição especifica um fato, um operador e um valor. Use path para selecionar uma propriedade aninhada de um fato. Valores priority mais altos são avaliados primeiro.
{
"fact": "to_address",
"operator": "in",
"value": ["<blocked-address>"]
}O operador in corresponde quando o fato é igual a um dos valores listados. Use all para combinar essa condição com uma condição operation. Use any quando uma das várias condições puder acionar a restrição.
Operadores
| Operador | Usá-lo quando |
|---|---|
equal, notEqual |
Um fato escalar deve ser igual ou diferente de um valor do mesmo tipo. |
in, notIn |
Um fato escalar deve aparecer ou não em uma lista de valores. |
contains, doesNotContain |
Um fato de matriz deve conter ou não um valor. |
lessThan, lessThanEquals (lessThanInclusive)
|
Um fato numérico deve ser menor que, ou menor ou igual a um valor numérico. |
greaterThan, greaterThanEquals (greaterThanInclusive)
|
Um fato numérico deve ser maior que, ou maior ou igual a um valor numérico. |
As comparações ordenadas em amount, amount_atomic e native_value_atomic usam aritmética decimal exata em /evaluate e /internal/v1/authorize.
Use strings decimais para quantidades atômicas e limites grandes. Por exemplo:
{ "fact": "amount_atomic", "operator": "greaterThanEquals", "value": "1000000000000000000" }O UWM fornece amount_atomic em unidades base e não o converte em decimais de token. O fato amount é suportado quando fornecido por um chamador do /evaluate; o UWM não o adiciona aos fatos de assinatura.
São aceitos números JSON decimais dentro do intervalo numérico seguro. Envie valores numéricos maiores como strings; literais numéricos maiores são rejeitados. Os nomes dos operadores greaterThanInclusive e lessThanInclusive permanecem suportados. Os operadores equal e notEqual comparam valores por tipo. Outros fatos mantêm seu comportamento de comparação existente.
Decoradores de matriz
Prefixe um operador com um decorador e dois-pontos, como someFact:equal. Os decoradores mudam a forma como o operador lida com matrizes ou seu resultado.
| Decorador | Usá-lo quando |
|---|---|
someFact |
Pelo menos um item em um fato de matriz corresponde. |
everyFact |
Cada item em um fato de matriz corresponde. |
someValue |
O fato corresponde a pelo menos um item em um valor de matriz. |
everyValue |
O fato corresponde a cada item em um valor de matriz. |
swap |
A comparação usa o valor como fato e o fato como valor. |
not |
O resultado do operador base deve ser negado. |
Por exemplo, o someFact:equal pode corresponder a um ID de token no array token_ids fornecido para uma chamada em batch ERC-1155 decodificada:
{
"fact": "token_ids",
"operator": "someFact:equal",
"value": "42"
}Use o grupo de condições not para lógica booliana e o decorador not: para negar um operador individual. A condição e as prioridades da regra definem a ordem de avaliação. Eles não permitem que uma regra substitua outra BLOCK correspondente.
Definir o Escopo da Regra
Defina scopelevels e targets para especificar quais solicitações de assinatura uma regra abrange. Cada escopo selecionado deve corresponder. Alvos dentro de um escopo são alternativas.
| Escopo | Destino obrigatório | Use-o para |
|---|---|---|
global |
Nenhum; especificar por si só. |
Uma restrição que se aplica a cada solicitação de assinatura. |
org |
targets.orgIds |
Uma restrição para uma ou mais organizações. |
wallet |
targets.walletIds |
Uma restrição para uma ou mais carteiras. |
instance |
targets.instanceIds |
Uma restrição para uma ou mais instâncias de rede. |
asset |
targets.assetIds |
Regras existentes no escopo do ativo; mantidas para compatibilidade. |
scopelevels: ["org",
"wallet"] requer que os alvos da organização e da wallet correspondam. Uma regra somente wallet não tem um limite de organização implícito. Use os IDs retornados por UWM, e não os nomes para exibição.Para restringir um método de contrato, corresponda a contract_address e function_selector nas condições. Adicione o escopo instance se o mesmo método exigir diferentes restrições em redes diferentes. O escopo asset é mantido para regras existentes; essas condições não o exigem.
Para targets.instanceIds, use o instanceId público mostrado pela wallet do UWM ou pela API de rede. Este é o infra_instance_id registrado, não a chave do banco de dados numérico ou o ID da cadeia. Atualize regras mais antigas no escopo da instância que usam uma chave do banco de dados; o UWM agora envia apenas o identificador de instância pública.
Corresponder à solicitação de assinatura
As condições podem usar somente fatos fornecidos para o operation da solicitação. O fato operation está disponível para cada solicitação de assinatura.
operation |
Fatos adicionais |
|---|---|
native-transfer |
amount_atomic, to_address |
erc20-transfer |
amount_atomic, to_address, contract_address |
contract-deployment |
amount_atomic, init_code_hash |
contract-call |
contract_address, native_value_atomic, function_selector, calldata_hash |
eip712 |
primary_type, verifying_contract, typed_data |
O UWM reconhece chamadas ERC-20 transfer(address,uint256) canônicas com valor nativo zero sem registro de token. O UWM não lê mais capability.approved-token-contracts.
O perfil erc20-transfer também fornece native_value_atomic ("0"), function_selector ("0xa9059cbb") e calldata_hash. Esses fatos permitem que as regras contract-call existentes mantenham suas restrições completas.
Uma operação erc20-transfer também é uma contract-call para condições de operação. Ambos os tipos de regra podem corresponder à mesma solicitação, e qualquer BLOCK correspondente a nega. Esse comportamento se aplica às condições Boolianas equal, notEqual, in, notIn e aninhadas em ambos os pontos finais de avaliação. Outros fatos mantêm sua semântica de igualdade normal.
A operação erc20-transfer corresponde aos métodos transfer, não transferFrom ou ERC-1155. Sempre inclua o contract_address pretendido nas regras de token.
As chamadas Canonical ERC-20 transferFrom, ERC-1155 safeTransferFrom e ERC-1155 safeBatchTransferFrom fornecem fatos adicionais contract-call:
| Chamada | Fatos adicionais |
|---|---|
ERC-20 transferFrom |
owner_address, to_address, amount_atomic |
ERC-1155 safeTransferFrom |
owner_address, to_address, token_id, amount_atomic |
ERC-1155 safeBatchTransferFrom |
owner_address, to_address, arrays token_ids e amounts paralelos
|
O UWM decodifica somente chamadas com um layout ABI canônico suportado. Outras chamadas mantêm os fatos contract-call genéricos.
owner_address é o endereço de origem nos dados de chamada, não a wallet de assinatura. Um seletor identifica o layout de dados de chamada, não o comportamento do contrato implantado. O ERC-20 e o ERC-721 compartilham o seletor transferFrom, portanto, aplique condições de valor apenas a um contrato conhecido por implementar o ERC-20. Endereços e seletores são normalizados para letras minúsculas; use valores de condição em letras minúsculas. Para chamadas em batch, não totalize valores para IDs de token diferentes.
amount_atomic e native_value_atomic são strings decimais em unidades base; o valor nativo está em wei. Os valores inteiros EIP-712 também são strings decimais. Para EIP-712, typed_data contém o domínio assinado e a mensagem. Um path é relativo a esse fato: use $.message.value para o valor da mensagem e $.domain.chainId para o ID da cadeia assinada.
As restrições de wallet, organização e rede pertencem aos escopos wallet, org e instance. Metadados de signatário, gás e nonce não são fatos de condição. O destino do escopo asset não adiciona um fato de condição asset.
Antes de ativar uma regra de assinatura
Use apenas os fatos listados para a operação em Corresponder à solicitação de assinatura. Inclua uma condição operation quando uma regra usar fatos específicos da operação.
Salvar uma regra não confirma que o UWM pode avaliá-la durante a assinatura. Por exemplo, o UWM não fornece um fato tier. Uma regra que verifica se tier é igual a gold pode causar falha na assinatura com um erro genérico 500.
Se a assinatura falhar depois que você ativar uma regra, revise seus fatos, condições e escopo. Corrija a regra ou peça a um administrador autorizado que a desative se for um espaço reservado não intencional. A desativação de uma restrição necessária remove sua proteção.
Antes de ativar a regra em produção, ative-a para o escopo pretendido em um contexto de teste e verifique se as solicitações de assinatura reais são permitidas ou bloqueadas conforme pretendido quando são enviadas. O ponto final /evaluate sozinho não verifica o comportamento durante a assinatura porque aceita fatos fornecidos pelo usuário, que podem diferir dos fornecidos durante a assinatura.
Criar Regra
Este exemplo bloqueia transferências nativas para um endereço de uma organização. Substitua os IDs exemplo e o endereço pelos valores de seu ambiente. A regra é desativada e não bloqueará solicitações até que você a ative. Revise o escopo e as condições antes de ativar a regra.
{
"name": "block-restricted-native-recipient",
"description": "Block native transfers to the restricted recipient",
"category": "transaction-policy",
"enabled": false,
"scopelevels": ["org"],
"targets": {
"orgIds": ["<organization-id>"]
},
"conditions": {
"all": [
{
"fact": "operation",
"operator": "equal",
"value": "native-transfer",
"priority": 100
},
{
"fact": "to_address",
"operator": "equal",
"value": "0x3333333333333333333333333333333333333333",
"priority": 1
}
]
},
"response": {
"type": "BLOCK",
"params": {
"reason": "restricted-recipient"
}
}
}Coloque a condição operation primeiro e atribua a ela uma prioridade mais alta do que os fatos específicos da operação. Durante a autorização de assinatura, a avaliação falha se ler um fato ausente; a solicitação não é permitida silenciosamente.
Os pontos finais de avaliação verificam as regras em relação aos fatos que você envia. A assinatura ao vivo usa fatos da solicitação validada e dos alvos de escopo da UWM de sua carteira resolvida. Use a avaliação para inspecionar uma condição e, em seguida, confirme o resultado através do fluxo de assinatura pretendido.