es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

LLAMADAS cruzadas de contrato cercano (permiten a una cuenta liberar fondos de garantía a una cuenta diferente)

Estoy tratando de aprender cómo permitir que una cuenta (un “coordinador de donaciones”) deposite fondos en una segunda cuenta (este contrato, que sirve como una cuenta “de garantía”), que luego una tercera cuenta (un “donante” regular) puede activar para enviar a una cuarta cuenta (el “destinatario”, como una organización benéfica).

La función que he escrito como marcador de posición probablemente no tiene sentido porque asumo que (como está escrito actualmente) probablemente transferiría fondos del llamador/firmante en lugar de la cuenta de garantía/propia/contrato:

function transferFromEscrow(destinationAccount: AccountId, amount: u128): ContractPromiseBatch {
// TODO: ¡Arreglar esta función!
const toDestinationAccount = ContractPromiseBatch.create(destinationAccount);
return toDestinationAccount.transfer(amount);
}

¡Gracias por cualquier ayuda!

Este repositorio oficial de NEAR me llevó a esperar ver ejemplos funcionales en index.ts y 02.using-multiple-calls, pero no veo ninguno.

También publiqué esta pregunta en https://github.com/near-examples/cross-contract-calls/issues/13

Tags:  

Answer

  1. Avatar for davy.ai

    Para permitir que la cuenta de coincidencia de donaciones deposite fondos en la cuenta de garantía, puede modificar la función transferFromEscrow de la siguiente manera:

    function transferFromEscrow(destinationAccount: AccountId, amount: u128): ContractPromiseBatch {
      const toDestinationAccount = ContractPromiseBatch.create(destinationAccount);
      // Especificar la cuenta de garantía como el remitente de la transferencia
      toDestinationAccount.transfer(amount).asContract(ESCROW_ACCOUNT);
      return toDestinationAccount;
    }
    

    En esta función modificada, especificamos la cuenta de garantía como el remitente de la transferencia llamando al método asContract en la promesa de transferencia. Esto asegura que los fondos se transfieran desde la cuenta de garantía en lugar del llamador/firmante de la función.

    Para permitir que la cuenta del donante active la transferencia de fondos de la cuenta de garantía a la cuenta del destinatario, puede implementar una función separada en el contrato de garantía, como:

    function transferToRecipient(recipientAccount: AccountId, amount: u128): ContractPromiseBatch {
      const fromEscrowAccount = ContractPromiseBatch.create(ESCROW_ACCOUNT);
      const toRecipientAccount = ContractPromiseBatch.create(recipientAccount);
    
      // Agrupar las promesas de contrato para garantizar que la transferencia solo suceda si todas las promesas tienen éxito
      fromEscrowAccount.transfer(amount).then(
        toRecipientAccount.functionCall("receiveFunds", {}, amount, 0)
      );
    
      return fromEscrowAccount;
    }
    

    En esta función, creamos dos promesas de contrato separadas: una para transferir fondos desde la cuenta de garantía y otra para llamar a una función receiveFunds en la cuenta del destinatario. Al agrupar estas promesas juntas, aseguramos que la transferencia solo ocurra si la llamada receiveFunds tiene éxito.

    Tenga en cuenta que la función receiveFunds debe implementarse en la cuenta del destinatario para que esta transferencia tenga éxito.

Comments are closed.