const service = maker.service('proxy');
El DSProxyService
(Servicio de DSProxy) incluye todas las funcionalidades necesarias para interactuar con ambos contratos del proxy que son utilizados en los productos de Maker: proxies de perfil y proxies de reenvío.
Los proxies de reenvío son contratos simples que agregan llamadas a funciones en el cuerpo de un solo método. Son utilizados en el Portal de CDP/vault y Oasis Directo para permitir a los usuarios ejecutar múltiples transacciones atómicamente, lo cual es seguro y más fácil de utilizar que implementar varios pasos como transacciones discretas.
// "proxy" de reenvío
function lockAndDraw(address tub_, bytes32 cup, uint wad) public payable {
lock(tub_, cup);
draw(tub_, cup, wad);
}
Los proxies de reenvío pretenden ser lo más simple posible, por lo que carecen de algunas características que podrían ser importantes si se van a utilizar como interfaces para una lógica de smart contracts más compleja. Este problema se puede resolver utilizando proxies de perfil (es decir, copias de DSProxy) para ejecutar las funcionalidades definidas en los proxies de reenvío.
La primera vez que una cuenta es utilizada para interactuar con cualquier aplicación de Maker, se le solicitará al usuario que implemente un proxy de perfil. Esta copia del DSProxy puede ser utilizada con cualquier producto, incluyendo dai.js, a través de un registro de proxy universal. Luego, los datos de llamada de cualquier función en el proxy de reenvío se pueden pasar al método execute()
(ejecutar) de DSProxy, que ejecuta el código proporcionado en el contexto del proxy de perfil.
// Llamando al "proxy" de reenvío con dai.js
function lockAndDraw(tubContractAddress, cdpId, daiAmount, ethAmount) {
const saiProxy = maker.service('smartContract').getContractByName('SAI_PROXY');
return saiProxy.lockAndDraw(
tubContractAddress,
cdpId,
daiAmount,
{
value: ethAmount,
dsProxy: true
}
);
}
Esto hace posible que las asignaciones de tokens de los usuarios persistan de una aplicación de Maker a otra, y permite a los usuarios recuperar cualquier fondo enviado por error a la dirección del proxy. Muchas de las funciones en DSProxyService
solo serán relevantes para power users
(usuarios con poder). Todo lo que es estrictamente requerido para generar de manera automática los datos de llamada de una función y encontrar el proxy de perfil correcto es la inclusión de { dsProxy: true }
en el objeto de opciones para cualquier transacción, siempre que el usuario ya haya implementado un proxy de perfil. Si eso no es seguro, también puede ser necesario consultar el registro para determinar si un usuario ya posee un proxy y crear (build
) uno si no lo tiene.
null
- nulo)Si la currentAccount
(cuenta actual) (según Web3Service
) ya ha implementado un DSProxy, currentProxy()
(proxy actual) devolverá su address. Si no, devuelve null
. Esta se actualizará de forma automática en el evento de que la cuenta activa sea cambiada. Esta función deberá ser utilizada para chequear si un usuario tiene un proxy antes de que intente crear uno.
async function getProxy() {
return maker.service('proxy').currentProxy();
}
TransactionObject
(Objeto de la Transacción)build
(construir) implementará una copia del DSProxy perteneciente a la cuenta actual. Esta transacción se revertirá si la cuenta actual ya tiene un proxy de perfil. Por defecto, build()
finaliza luego de que la transacción haya sido minada.
async function buildProxy() {
const proxyService = maker.service('proxy');
if (!proxyService.currentProxy()) {
return proxyService.build();
}
}