strawberry-code / io-app

App IO
https://io.italia.it
European Union Public License 1.2
1 stars 0 forks source link

Logiche Wallet ERC20 #13

Open strawberry-code opened 3 years ago

strawberry-code commented 3 years ago

Implementazione delle logiche per la parte Wallet dell'app.

@V0nMis3s @despotes potete fare una breve checklist modificando il mio messaggio qui per favore?

V0nMis3s commented 3 years ago

Manca la parte legata al recupero dello userAddress (ethereum address) dell'utente, collegato alla coppia di chiavi pubblica e privata creata per ogni utente in fase di primo avvio dell'app. Tale userAddresssarà unico per ogni utente e sarà utilizzato unitamente alla private key sia nelle logiche che coinvolgono la parte di SSI che nelle logiche che coinvolgono la parte di ERC Wallet

strawberry-code commented 3 years ago

Ho aggiornato descrizione issue.

P.S. Su SA forse ho quasi finito e riesco a venire su SSI.

V0nMis3s commented 3 years ago

Inserisco uno snippet relativo alle "Logiche Send".

const Tx = require('ethereumjs-tx').Transaction;
const Web3 = require('web3')
const web3 = new Web3(new Web3.providers.HttpProvider('https://rpc-node.pub.blockchaincc.ga')); -->{{Qui dovremo prevedre un modo per iniziare il valore in conformità con l'ambiente, per testare possiamo usare questo}}

var assetAddress = "0xb8935fe854a081c329d1ddcaab554845a05d3951" -->{{Qui recuperi l'assetAddress dal selected address presente nello store}}

var assetContract = new web3.eth.Contract(config.ethereum.contracts.types.denarius.abi, assetAddress); -->{{Qui al posto di config.ethereum.contracts.types.denarius.abi recuperi l'ABI del selected address presente nello store}}

var transactionCount = parseInt(await web3.eth.getTransactionCount(config.ethereum.ethsigner.bankAddress)) -->{{Qui al posto di config.ethereum.ethsigner.bankAddress recuperi l'address dell'utente utilizzando la singleton, per testing possiamo usare il caro Dummy_user}}

var accountNonce = '0x' + (transactionCount).toString(16)
const customCommon = Common.default.forCustomChain(
  'mainnet',
  {
   name: 'openstack',
   networkId: 8283,
   chainId: 8485,
  },
  'petersburg',
)
var to = "0x7506f0045F03cC82c73341A45f190ab9A1a85A93";-->{{Qui dovresti recuperare l'address a cui inviare i token dal form di inserimento dell'address (che non mi sembra che ci sia al momento nel SsiWalletSendScreen. 
Ricorda che il form deve avere sul lato dx l'icona della fotocamera per inserire address di destinazione tramite scansione del qr code, è importante che su address inserito da utente o scansionato tramite qr venga fatto prima un controllo di conformità attraverso una regex o usando direttamente il seguente metodo presente nella liberia web3.js [Web3.utils.isAddress]}}

var amount = 300; --> {{Qui dovresti recuperare l'amount dal form di inserimento dell'amount, ricorda che l'utente può inserire un numero con la virgola fino al secondo decimale e che prima di popolare il campo amount della funzione che segue bisogna moltiplicarlo per 100.
Inoltre prima di procedere con la logica espressa in seguito sarebbe meglio inserire un controllo che ci assicuri che l'amount inserito sia =< del balance dell'utente che puoi a questo punto recuperare dalla schermata balance & transaction o più banalmente recuperare usando il seguente metodo di assetContracts: var balance = await assetContract.methods.balanceOf(userAddress).call().then(r=>utils.fixDecimal(r,16,1)).
Così facendo si può restituire un errore all'utente senza aspettare il risultato della chiamata che andremo a fare in seguito al click del tasto "send"
}}

var transfer = assetContract.methods.transfer(to, utils.fixDecimal(amount, 16, 0)).encodeABI();

var rawTx = { 
  nonce: accountNonce,
  from: config.ethereum.ethsigner.bankAddress, -->{{stesso discorso su address utente fatto sopra}}
  to: assetAddress,
  value: '0x0',
  data: transfer,
  gas: '0x1ffffffffffffe',
  gasPrice: '0x0'  
};
var privateKey = new Buffer.from(config.ethereum.bankPrivateKey, 'hex'); --> {{qui recuperiamo la priv Key dell'utente che per esigenze di testing possiamo aggiungere momentaneamente al Dummy_user facendolo diventare un oggetto con 2 proprietà: address e privKey}}

var tx = new Tx(rawTx, { common: customCommon });

tx.sign(privateKey);

var serializedTx = tx.serialize();

var rawTxHex = '0x' + serializedTx.toString('hex');

Una volta ottenuto il rawTxHex basterà effettuare una POST req, al click del tasto 'Send', verso l'API sendTx https://documenter.getpostman.com/view/11411882/TVmJizUT#719d52f6-6805-44a0-93af-33ae89814efd e popolare il body della req così come espresso nella documentazione. (per maggiore chiarezza la proprietà signedTx va inizializzata con il valore di rawTxHex)

In riferimento al metodo utils.fixDecimal , ecco uno snippet che illustra l'implementazione di tale metodo

fixDecimal = function (num, decimals, method){
  if(method==1) {
      var amount = num/(10**decimals);
      return Math.round((amount + Number.EPSILON) * 100) / 100;
   } else if(method==0) {
        var decimals = web3.utils.toBN(decimals);
        // Amount of token
      num = Math.round((num + Number.EPSILON) * 100) / 100;
        var tokenAmount = web3.utils.toBN(num);
        var amount = '0x' + tokenAmount.mul(web3.utils.toBN(10).pow(decimals)).toString('hex');
        return amount;
  }
}