Usuário
Resumo
Nessa API ocorre o registro dos usuários com perfil de membros de uma comunidade ou usuário de uma empresa.
O usuário como membro terá acesso a sua que ele pertence e o de empresa terá acesso as funcionalidades da empresa criada.
Os usuários serão associados a permissões especificas que darão acessos específicos a nível de funcionalidades e sub funcionalidades.
Como funciona
O cliente com perfil de empresa passa pelo onboarding e com isso recebe um um usuário e senha para que possa utilizar na autenticação e receber a credencial "bearer" token.
Objeto User
Endpoints
/User
(JWT) Lista dados do usuário logado
GET https://goblockchain.io/gotokens-api/v1/user
Nível de permissionamento necessário: qualquer
Headers
authorization*
Bearer
JWT
{
"id": "633adbcaf51f5c4285saea8",
"name": "User 1",
"email": "[email protected]",
"address": "Av. Aristides Cunha, 1710, Itaiangá, São Paulo - SP - Brasil",
"companies":[
{
"id": "5i8u3d",
"role": "company_moderator"
}
],
"communities":[
{
"id": "4ew8wd",
"role": "community_admin"
}
]
}id- StringIdentificador único do usuário no Banco de Dados.
name- StringNome do usuário.
email- StringE-mail do usuário.
address- StringEndereço do usuário.
companies- Array of ObjectsArmazena o vínculo do usuário em diversas empresas, caso exista.
id- StringIdentificador da empresa.
role- StringIdentificador do nível de permissionamento na empresa.
communities- Array of ObjectsArmazena o vínculo do usuário em diversas comunidades, caso exista.
id- StringIdentificador da comunidade.
role- StringIdentificador do nível de permissionamento na comunidade.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
(JWT) Salva as informações alteradas do usuário
PATCH https://goblockchain.io/gotokens-api/v1/user
Nível de permissionamento necessário: qualquer
Headers
authorization*
Bearer
JWT
Request Body
name
String
Nome do Usuário.
String
E-mail do Usuário.
password
String
Senha do Usuário.
address
String
Endereço do Usuário.
{
"id": "633adbcaf51f5c42246d6ea6",
"name": "Clarisse",
"email": "[email protected]",
"password": "***********",
"address": "Av. Aristides Cunha, 1710, Itaiangá, São Paulo - SP - Brasil"
}id- StringIdentificador único de um usuário no Banco de Dados.
name- StringNome do usuário.
email- StringE-mail do usuário.
password- StringSenha do usuário armazenada de forma criptografada em um Vault.
address- StringEndereço do usuário.
400
MISSING_BODY
HTTP body is required.
400
UNKNOWN_FIELD_EXCEPTION
The indicated field is not allowed for this operation or is unknown.
400
INVALID_ID
The ID is invalid.
400
INVALID_NAME
NAME must be string.
400
INVALID_PASSWORD
PASSWORD is invalid.
400
INVALID_ADDRESS
ADDRESS must be string.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
/Wallets
(JWT) Lista as wallets com status "active" do usuário logado
GET https://goblockchain.io/gotokens-api/v1/wallets
Nível de permissionamento necessário: qualquer
Query Parameters
limit
String
Limite de resultados na busca
offset
String
Quantidade de resultados para avançar da busca
Headers
authorization*
Bearer
JWT
{
"wallets": [
{
"id": "5acfdde8-5c8c-11ed-9b6a-0242ac120002",
"address": "0x71080bc5bb5303053ef17ece60890f7e65573150",
"status": "active",
"provider": "firebase_google",
"providerId": "ddsooidnfos42x",
"email": "[email protected]",
"blockchain": "ethereum",
"network": "ethereum_mainnet"
},
{
"id": "a049ff02-5c7d-11ed-9b6a-0242ac120002",
"address": "0x44c1767ed909e808cee9a92d016ce3956d60871f",
"status": "active"
},
{
"id": "5acfdde8-5c8c-11ed-9b6a-0242ac120002",
"address": "0x71080bc5bb5303053ef17ece60890f7e65573150",
"status": "active",
"blockchain": "ethereum",
"network": "ethereum_mainnet"
}
]
}id- StringIdentificador único de uma Wallet no Banco de Dados.
address- StringEndereço publico da carteira do usuário.
providerId- StringIdentificador único associado à conta social com a qual o usuário criou a carteira. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
provider- StringNome do provedor da carteira criada pelo sistema da goTokens com login social. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
rescueDate- DateTimeInforma a data de revelação da
privateKeyda carteira do usuário, caso essa já tenha sido revelada. Caso contrário, esse campo é armazenado comonull. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
status- StringStatus da wallet no sistema. Pode variar entre
activeoudisabled.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
(JWT) Cria uma wallet com as informações passadas
POST https://goblockchain.io/gotokens-api/v1/wallets
Existem 3 padrões de parâmetros possíveis para criar uma wallet:
1 - Enviando apenas uma address + blockchain e network no body da requisição, é importada uma Wallet como externa, guardando apenas suas informações públicas.
2 - Enviando uma privateKey + blockchain e network no body da requisição, é instanciada uma Wallet assim como a original, a partir dessa privateKey.
3 - Enviando email, providerId e provider no body da requisição, é criada uma wallet nova, do zero. * Não há necessidade de envio de blockchain e network nesse caso. As wallets serão criadas por padrão em Ethereum
Nível de permissionamento necessário: qualquer
Headers
authorization*
Bearer
JWT
Request Body
address
String
Chave pública da Wallet
privateKey
String
Chave privada da Wallet
String
Email vindo do provider de autenticação externo de conta social (Ex: autenticação do Google via Firebase)
provider
String
Provider de autenticação externo de conta social (Ex: Google Firebase)
providerId
Id associado à conta social com a qual o usuário se cadastrou.
blockchain
Enum
"ethereum"
network
Enum
"ethereum_mainnet" | "ethereum_goerli" | "polygon_matic" | "celo_alfajores"
Enviando a privateKey + blockchain e network na requisição, é instanciada uma Wallet no banco de dados e a sua privateKey é salva em um Vault.
{
"id": "5acfdde8-5c8c-11ed-9b6a-0242ac120002",
"address": "0x71080bc5bb5303053ef17ece60890f7e65573150",
"status": "active",
"blockchain": "ethereum",
"network": "ethereum_mainnet"
}Enviando address + blockchain e network na requisição, é associada uma Wallet externa pelo endereço da wallet ao usuário.
{
"id": "5acfdde8-5c8c-11ed-9b6a-0242ac120002",
"address": "0x71080bc5bb5303053ef17ece60890f7e65573150",
"status": "active",
"blockchain": "ethereum",
"network": "ethereum_mainnet"
}Enviando email, providerId e provider no body da requisição, é criada uma wallet nova, do zero com dados relacionados ao Provider externo de autenticação via conta social, além dos dados da carteira.
{
"id": "5acfdde8-5c8c-11ed-9b6a-0242ac120002",
"address": "0x71080bc5bb5303053ef17ece60890f7e65573150",
"status": "active",
"provider": "firebase_google",
"providerId": "ddsooidnfos42x",
"email": "[email protected]",
"blockchain": "ethereum",
"network": "ethereum_mainnet"
}id- StringIdentificador único de uma Wallet no Banco de Dados.
address- StringEndereço publico da carteira do usuário.
origin- StringOrigem da carteira do usuário. Se for criada pela plataforma da goTokens, esse campo será preenchido como
internal. Caso a carteira tenha sido criada em outros provedores (Metamask, Torus, etc), ela ainda pode ser importada e esse campo será preenchido comexternal.
providerId- StringIdentificador único associado à conta social com a qual o usuário criou a carteira. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
provider- StringNome do provedor da carteira criada pelo sistema da goTokens com login social. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
privateKey- StringEndereço privado da carteira do usuário, guardado de forma criptografada em um Vault. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
rescueDate- DateTimeInforma a data de revelação da
privateKeyda carteira do usuário, caso essa já tenha sido revelada. Caso contrário, esse campo é armazenado comonull. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
status- StringStatus da wallet no sistema. Pode variar entre
activeoudisabled.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
(JWT) Lista dados de uma wallet do usuário logado
GET https://goblockchain.io/gotokens-api/v1/wallets/:walletId
Nível de permissionamento necessário: qualquer
Path Parameters
walletId*
String
ID da Wallet
Headers
authorization*
Bearer
JWT
{
"id": "1",
"address": "0x041234567890",
"providerId": "35wda23dfes5",
"provider": "firebase_facebook",
"rescueDate": "01/01/2009",
"rescueIp": "192.168.100.002",
"status": "active",
"blockchain": "ethereum",
"network": "ethereum_mainnet"
}id- StringIdentificador único de uma Wallet no Banco de Dados.
address- StringEndereço publico da carteira do usuário.
origin- StringOrigem da carteira do usuário. Se for criada pela plataforma da goTokens, esse campo será preenchido como
internally_created, se for associada ao endereço de uma carteira do usuário,associated_by_address, se for importada via privateKey,imported_from_pk`
providerId- StringIdentificador único associado à conta social com a qual o usuário criou a carteira. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
provider- Enum (firebase_google|facebook_google)Nome do provedor da carteira criada pelo sistema da goTokens com login social. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
privateKey- StringEndereço privado da carteira do usuário, guardado de forma criptografada em um Vault. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
network- Enum (ethereum_mainnet|ethereum_goerli|polygon_matic|celo_alfajores)
rescueDate- DateTimeInforma a data de revelação da
privateKeyda carteira do usuário, caso essa já tenha sido revelada. Caso contrário, esse campo é armazenado comonull. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
status- StringStatus da wallet no sistema. Pode variar entre
activeoudisabled.
1
Acesso restrito ao recurso.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
(JWT) Altera o status de uma wallet do usuário logado
PATCH https://goblockchain.io/gotokens-api/v1/wallets/:walletId
Nível de permissionamento necessário: qualquer
Headers
authorization*
Bearer
JWT
Request Body
status*
String
"active" | "disabled"
{
"id": "897erfs123grf",
"address": "0x041234567890",
"origin": "internal",
"providerId": "35wda23dfes5",
"provider": "firebase_google",
"rescueDate": null,
"rescueIp": null,
"status": "disabled"
}id- StringIdentificador único de uma Wallet no Banco de Dados.
address- StringEndereço publico da carteira do usuário.
origin- StringOrigem da carteira do usuário. Se for criada pela plataforma da goTokens, esse campo será preenchido como
internal. Caso a carteira tenha sido criada em outros provedores (Metamask, Torus, etc), ela ainda pode ser importada e esse campo será preenchido comexternal.
providerId- StringIdentificador único associado à conta social com a qual o usuário criou a carteira. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
provider- StringNome do provedor da carteira criada pelo sistema da goTokens com login social. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
privateKey- StringEndereço privado da carteira do usuário, guardado de forma criptografada em um Vault. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
rescueDate- DateTimeInforma a data de revelação da
privateKeyda carteira do usuário, caso essa já tenha sido revelada. Caso contrário, esse campo é armazenado comonull. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
status- StringStatus da wallet no sistema. Pode variar entre
activeoudisabled.
1
Acesso restrito ao recurso.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
(JWT) Revela uma chave privada de uma wallet do usuário logado
GET https://goblockchain.io/gotokens-api/v1/wallets/:walletId/privatekey
Ao revelar a chave, registramos a data no banco.
Nível de permissionamento necessário: qualquer
Path Parameters
walletId*
String
ID da Wallet
Headers
authorization*
Bearer
JWT
{
"id": "r9etw13fgsd5",
"address": "0x041234567890",
"origin": "internal",
"providerId": "35wda23dfes5",
"provider": "firebase",
"privateKey": "ddw8431dwdwhtf4845htfcx",
"rescueDate": "01/01/2009",
"rescueIp": "192.168.100.002",
"status": "active"
}id- StringIdentificador único de uma Wallet no Banco de Dados.
address- StringEndereço publico da carteira do usuário.
origin- StringOrigem da carteira do usuário. Se for criada pela plataforma da goTokens, esse campo será preenchido como
internal. Caso a carteira tenha sido criada em outros provedores (Metamask, Torus, etc), ela ainda pode ser importada e esse campo será preenchido comexternal.
providerId- StringIdentificador único associado à conta social com a qual o usuário criou a carteira. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
provider- StringNome do provedor da carteira criada pelo sistema da goTokens com login social. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
privateKey- StringEndereço privado da carteira do usuário, guardado de forma criptografada em um Vault. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
rescueDate- DateTimeInforma a data de revelação da
privateKeyda carteira do usuário, caso essa já tenha sido revelada. Caso contrário, esse campo é armazenado comonull. Campo válido apenas para carteiras criadas internamente pela plataforma da goTokens.
status- StringStatus da wallet no sistema. Pode variar entre
activeoudisabled.
1
Acesso restrito ao recurso.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
/Users
(JWT) Lista usuários de acordo com os campos buscados e permissionamento
GET https://goblockchain.io/gotokens-api/v1/users
Lista usuários que fazem parte da empresa ou comunidade do usuário logado.
Nível de permissionamento necessário: company_admin, company_moderator, community_admin, community_moderator
Query Parameters
name
String
Nome do Usuário
String
E-mail do Usuário
status
String
"active" | "disabled"
limit
String
Limite de resultados na busca
offset
String
Quantidade de resultados para avançar da busca
Headers
authorization*
Bearer
JWT
{
"users":[
{
"id": "633adbcaf51f5c4285saea8",
"name": "User 1",
"email": "[email protected]",
"status": "active",
"companies":[
{
"id": "5i8u3d",
"role": "company_moderator"
}
],
"communities":[
{
"id": "4ew8wd",
"role": "community_admin"
}
]
},
{
"id": "633adbcaf51f5c42246dawd7",
"name": "User 2",
"email": "[email protected]",
"status": "active",
"companies":[]
"communities":[
{
"id": "4ew8wd",
"role": "community_moderator"
}
]
},
{
"id": "633adbcaf51f5c42246bxb43",
"name": "User 5",
"email": "[email protected]",
"status": "active",
"companies":[],
"communities":[]
}
]
}id- StringIdentificador único de um usuário no Banco de Dados.
name- StringNome do usuário.
email- StringE-mail do usuário.
status- StringStatus do usuário no sistema. Pode variar entre
activeoudisabled.
companies- Array of Objectsid- StringIdentificador próprio da empresa no banco de dados.
role- StringNome do nível de permissionamento do usuário vinculado àquela empresa.
comunidade- Array of Objectsid- StringIdentificador próprio da comunidade no banco de dados.
role- StringNome do nível de permissionamento do usuário vinculado àquela comunidade.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
(JWT) Cria um usuário e uma wallet com as informações do usuário passadas
POST https://goblockchain.io/gotokens-api/v1/users
Nível de permissionamento necessário: company_admin
Request Body
name
String
Nome do Usuário
email*
String
E-mail do Usuário (único)
password*
String
Senha do Usuário
address
String
Endereço do Usuário
{
"id": "633adbcaf51f5c42246d6ea6",
"name": "Clarisse",
"email": "[email protected]",
"address": "Av. Aristides Cunha, 1710, Itaiangá, São Paulo - SP - Brasil",
"status": "active",
"walletPublicKey": "0x041234567890"
}id- StringIdentificador único de um usuário no Banco de Dados.
name- StringNome do usuário.
email- StringE-mail do usuário.
address- StringEndereço do usuário.
status- StringStatus do usuário no sistema. Pode variar entre
activeoudisabled.
400
1
Params Error
400
5
Must provide your access_token to proceed.
400
2001
Already posted the same request in the last minute.
400
4019
password atributte can't be null
400
4020
email atributte can't be null
400
INVALID_NAME
Name must be string.
400
INVALID_EMAIL
Email must be string.
400
VALIDATION_ERROR
Password must be valid
1
Acesso restrito ao recurso.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
(JWT) Lista dados de um usuário de acordo com o permissionamento
GET https://goblockchain.io/gotokens-api/v1/users/:userId
Nível de permissionamento necessário: company_admin, company_moderator, community_admin, community_moderator
Path Parameters
userId*
String
ID do Usuário
Headers
authorization*
Bearer
JWT
{
"id": "633adbcaf51f5c42246d6ea6",
"name": "Clarisse",
"email": "[email protected]",
"address": "Av. Aristides Cunha, 1710, Itaiangá, São Paulo - SP - Brasil",
"status": "active"
}id- StringIdentificador único de um usuário no Banco de Dados.
name- StringNome do usuário.
email- StringE-mail do usuário.
address- StringEndereço do usuário.
status- StringStatus do usuário no sistema. Pode variar entre
activeoudisabled.
1
Acesso restrito ao recurso.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
/Users/Companies
(JWT) Lista as empresas em que um determinado usuário tem acesso
GET https://goblockchain.io/gotokens-api/v1/users/:userId/companies
Lista à quais empresas um determinado usuário tem acesso em comum com o usuário logado. O acesso em comum garante que um usuário veja apenas empresas da qual ele também faz parte.
Nível de permissionamento necessário: company_admin, company_moderator
Path Parameters
userId*
String
ID do Usuário
Query Parameters
limit
String
Limite de resultados da busca
offset
String
Quantidade de resultados para avançar da busca
Headers
authorization*
Bearer
JWT
{
"companies": [
{
"id": "123",
"name": "Company A"
"role": "company_moderator",
},
{
"id": "456",
"name": "Company B"
"role": "company_admin",
}
]
}id- StringIdentificador único de uma Empresa no Banco de Dados.
name- StringNome da Comunidade.
role- StringNome identificador que guarda a referência de permissões de um nível de acesso à Comunidade.
1
Acesso restrito ao recurso.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
/Users/Communities
(JWT) Lista as comunidades em que um usuário participa
GET https://goblockchain.io/gotokens-api/v1/users/:userId/communities
Lista à quais comunidades um determinado usuário tem acesso em comum com o usuário logado. O acesso em comum garante que um usuário veja apenas comunidades da qual ele também faz parte.
Nível de permissionamento necessário: company_admin, company_moderator, community_admin, community_moderator
Path Parameters
userId*
String
ID do Usuário
Query Parameters
limit
String
Limite de resultados da busca
offset
String
Quantidade de resultados para avançar da busca
Headers
authorization*
Bearer
JWT
{
"communities": [
{
"publicId": "123",
"role": "member",
"name": "Community A",
"description": "Description of Community A"
},
{
"publicId": "456",
"role": "admin",
"name": "Community B",
"description": "Description of Community B"
}
]
}publicId- StringIdentificador único de uma Comunidade no Banco de Dados.
role- StringNome identificador que guarda a referência de permissões de um nível de acesso à Comunidade.
name- StringNome da Comunidade.
description- StringBreve descrição da Comunidade.
1
Acesso restrito ao recurso.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
/Users/Transactions
Fluxo de Status dos Pedidos
opened_order
Quando um usuário inicia uma solicitação de compra ou venda, é criado um Pedido com o status opened_order.
pending_payment
Ao selecionar o meio de pagamento e gerar a solicitação de pagamento, o status do Pedido é alterado para pending_payment.
processing_payment
Ao ser reconhecido o pagamento por meio do gateway, a ordem é processada e aguarda o retorno do gateway para o recolhimento do valor pago, identificado pelo status processing_payment.
approved_payment
Aprovado e recebido o pagamento, o status do pedido é alterado para approved_payment e é iniciado o processo de envio do token.
queue_send_token
Quando o token entra na fila para ser mintado/transferido, ele recebe o status queue_send_token.
success_send_token
Quando o token foi devidamente enviado ao seu destinatário, o fluxo de compra termina com o status success_send_token.
failed
Caso haja falha em algum dos passos anteriores, o status failed é aplicado e o pedido entra em uma fila de retentativas.
cancelled
Caso o numero de retentativas em algum dos status seja maior que o estipulado, o envio do token é cancelado, finalizando o fluxo com o status cancelled.
refounded
Caso o cancelamento de um pedido ocorra antes do envio do NFT com sucesso para seu comprador, o pagamento do mesmo será estornado para a origem e resultará no status de refounded.
(JWT) Lista as transações recentes de um usuário
GET https://goblockchain.io/gotokens-api/v1/users/:userId/transactions
Lista informações básicas das transações recentes de um determinado usuário .
Nível de permissionamento necessário: company_admin, company_moderator, community_admin, community_moderator
Path Parameters
userId*
String
ID do Usuário
Query Parameters
limit
String
Limite de resultados da busca
offset
String
Quantidade de resultados para avançar da busca
lastStatus
String
Último status da transação
Headers
authorization*
Bearer
JWT
{
"transactions": [
{
"id":"wda8971da3w2"
"item":{
"tokenId": "8wad12wa3ds",
"communityId": "8f7es7fs65",
"companyId": "ef7sef5sef"
},
"operation":{
"type": "buy",
},
"payment": {
"price": "120",
"decimals": "2",
"currency": "ETH",
"method": "pix",
}
"lastStatus": "success_send_token"
},
{
"id":"2"
"item":{
"tokenId": "ferswad85f8",
"communityId": "8f7es7fs65",
"companyId": "ef7sef5sef"
},
"operation":{
"type": "sell",
},
"payment": {
"price": "70",
"decimals": "2",
"currency": "MATIC",
"method": "credit_card",
}
"lastStatus": "processing_payment"
},
]
}id- StringIdentificador único de uma transação.
item- ObjectArmazena informações relativas ao item da transação.
tokenId- StringIdentificador que guarda a referência ao ID do token no banco de dados.
communityId- StringIdentificador que guarda a referência ao ID da comunidade gestora do token.
companyId- StringIdentificador que guarda a referência ao ID da empresa gestora do token.
operation- ObjectArmazena dados gerais de transação
type- StringTipo de operação da transação (
buypara operação de compra,sellpara operação de vendas,bidpara operação de lance em leilões,rent_outpara itens postos para alugar erentpara tokens alugados).
payment- ObjectArmazena dados relativos ao pagamento da transação
price- StringValor relativo ao preço agregado à transação do Token, seja para uma operação de compra, venda ou aluguel
decimals- StringNúmero de casas decimais que deve ser considerado em relação ao campo price.
currency- StringNome da moeda utilizada para o pagamento da transação, podendo ser relativo à moedas tradicionais ou criptomoedas.
method- StringNome do meio de pagamento utilizado na transação.
lastStatus- StringInforma o último status conhecido da transação, podendo ser
opened_order,pending_payment,processing_payment,approved_payment,queue_send_token,success_send_token,failed,cancelledourefounded.
1
Acesso restrito ao recurso.
10
Credenciais de acesso expiradas. Por favor, execute novamente sua autenticação na plataforma.
Last updated
Was this helpful?