diff --git a/.gitignore b/.gitignore
index 42317bddc..9f5ba6191 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,6 +26,7 @@ npm-debug.log*
scTopics
yarn-debug.log*
yarn-error.log*
+*.pem
# packages
packages/aztec.js/package-lock.json
diff --git a/packages/extension/.env.example b/packages/extension/.env.example
index ace955b85..1a3beee6d 100644
--- a/packages/extension/.env.example
+++ b/packages/extension/.env.example
@@ -1 +1,2 @@
INFURA_API_KEY=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
+GANACHE_TESTING_ACCOUNT_0=0xb0bdbc385e3369992a69c33fc3360f35217d12f753f38577eaba64aab69cf249
diff --git a/packages/extension/contracts/Migrations.sol b/packages/extension/contracts/Migrations.sol
deleted file mode 100644
index de4413e3f..000000000
--- a/packages/extension/contracts/Migrations.sol
+++ /dev/null
@@ -1,23 +0,0 @@
-pragma solidity ^0.5.0;
-
-contract Migrations {
- address public owner;
- uint public lastCompletedMigration;
-
- constructor() public {
- owner = msg.sender;
- }
-
- modifier restricted() {
- if (msg.sender == owner) _;
- }
-
- function setCompleted(uint completed) public restricted {
- lastCompletedMigration = completed;
- }
-
- function upgrade(address newAddress) public restricted {
- Migrations upgraded = Migrations(newAddress);
- upgraded.setCompleted(lastCompletedMigration);
- }
-}
diff --git a/packages/extension/contracts/ZkAssetTemplate.sol b/packages/extension/contracts/ZkAssetTemplate.sol
deleted file mode 100644
index bfca7a30b..000000000
--- a/packages/extension/contracts/ZkAssetTemplate.sol
+++ /dev/null
@@ -1,19 +0,0 @@
-pragma solidity >=0.5.0 <0.6.0;
-
-import "@aztec/protocol/contracts/ACE/validators/joinSplit/JoinSplit.sol";
-import "@aztec/protocol/contracts/ACE/validators/joinSplitFluid/JoinSplitFluid.sol";
-import "@aztec/protocol/contracts/ACE/validators/swap/Swap.sol";
-import "@aztec/protocol/contracts/ACE/validators/privateRange/PrivateRange.sol";
-import "@aztec/protocol/contracts/ACE/validators/publicRange/PublicRange.sol";
-import "@aztec/protocol/contracts/ACE/validators/dividend/Dividend.sol";
-import "@aztec/protocol/contracts/ACE/noteRegistry/epochs/201907/base/FactoryBase201907.sol";
-import "@aztec/protocol/contracts/ACE/noteRegistry/epochs/201907/adjustable/FactoryAdjustable201907.sol";
-import "@aztec/protocol/contracts/ERC1724/ZkAssetMintable.sol";
-import "@aztec/protocol/contracts/ERC1724/ZkAssetBurnable.sol";
-import "@aztec/protocol/contracts/ERC1724/ZkAssetOwnable.sol";
-import "@aztec/protocol/contracts/ERC1724/ZkAsset.sol";
-import "@aztec/protocol/contracts/AccountRegistry/epochs/20200106/Behaviour20200106.sol";
-import "@aztec/protocol/contracts/AccountRegistry/AccountRegistryManager.sol";
-
-
-contract Dummy {}
diff --git a/packages/extension/demo/1_apis-usage/asset.js b/packages/extension/demo/1_apis-usage/asset.js
index d33b7b1ef..fff9056c4 100644
--- a/packages/extension/demo/1_apis-usage/asset.js
+++ b/packages/extension/demo/1_apis-usage/asset.js
@@ -1,267 +1,259 @@
'use strict';
(() => {
- const zkAssetAddress = document.body.getAttribute('asset');
- const {
- address: accountAddress,
- } = window.aztec.web3.getAccount();
- let asset;
- let allowanceStatus;
- let depositStatus;
- let withdrawStatus;
- let sendStatus;
- let fetchStatus;
- let createStatus;
-
- const makeStatusGenerator = (id) => {
- let statusLogs = [];
- const elem = document.getElementById(id);
- const log = (status, keepInLog = false) => {
- elem.style.color = 'inherit';
- elem.innerHTML = `
+ const zkAssetAddress = document.body.getAttribute('asset');
+ const {
+ address: accountAddress,
+ } = window.aztec.web3.getAccount();
+ let asset;
+ let allowanceStatus;
+ let depositStatus;
+ let withdrawStatus;
+ let sendStatus;
+ let fetchStatus;
+ let createStatus;
+
+ const makeStatusGenerator = (id) => {
+ let statusLogs = [];
+ const elem = document.getElementById(id);
+ const log = (status, keepInLog = false) => {
+ elem.style.color = 'inherit';
+ elem.innerHTML = `
${statusLogs.map(status => `${status}
`).join('')}
${status}
`;
- if (keepInLog) {
- statusLogs.push(status);
- }
+ if (keepInLog) {
+ statusLogs.push(status);
+ }
+ };
+ const error = (status, keepInLog) => {
+ log(status, keepInLog);
+ elem.style.color = 'red';
+ };
+ const clear = () => {
+ statusLogs = [];
+ elem.innerHTML = '';
+ };
+ return {
+ log,
+ error,
+ clear,
+ };
};
- const error = (status, keepInLog) => {
- log(status, keepInLog);
- elem.style.color = 'red';
- };
- const clear = () => {
- statusLogs = [];
- elem.innerHTML = '';
- };
- return {
- log,
- error,
- clear,
- };
- };
-
- async function initBalance() {
- const balance = await asset.balance();
- document.getElementById('asset-balance').innerHTML = `${balance}`;
- }
-
- async function refreshAllowance() {
- const allowance = await asset.allowanceOfLinkedToken(
- accountAddress,
- window.aztec.web3.getAddress('AccountRegistry'),
- );
- document.getElementById('erc20-allowance').innerHTML = `${allowance}`;
- }
-
- async function refreshERC20Balance() {
- const balance = await asset.balanceOfLinkedToken();
- document.getElementById('erc20-balance').innerHTML = `${balance}`;
- }
-
- async function refreshAssetBalances() {
- refreshERC20Balance();
- refreshAllowance();
- }
-
- function updateAssetBalance(balance) {
- document.getElementById('asset-balance').innerHTML = `${balance}`;
- }
-
- async function initAsset() {
- asset = await window.aztec.zkAsset(zkAssetAddress);
- asset.subscribeToBalance(updateAssetBalance);
- const apisElem = document.getElementById('asset-apis');
- if (!asset.isValid()) {
- apisElem.innerHTML = 'This asset is not valid.';
- apisElem.style.color = 'red';
- } else {
- allowanceStatus = makeStatusGenerator('allowance-status');
- depositStatus = makeStatusGenerator('deposit-status');
- withdrawStatus = makeStatusGenerator('withdraw-status');
- sendStatus = makeStatusGenerator('send-status');
- fetchStatus = makeStatusGenerator('fetch-status');
- createStatus = makeStatusGenerator('create-status');
- document.getElementById('linked-erc20-address').innerHTML = asset.linkedTokenAddress;
- initBalance();
- refreshAssetBalances();
+
+ async function initBalance() {
+ const balance = await asset.balance();
+ document.getElementById('asset-balance').innerHTML = `${balance}`;
}
- apisElem.style.display = 'block';
- }
- async function approveAllowance() {
- allowanceStatus.clear();
+ async function refreshAllowance() {
+ const allowance = await asset.allowanceOfLinkedToken(
+ accountAddress,
+ window.aztec.web3.getAddress('AccountRegistry'),
+ );
+ document.getElementById('erc20-allowance').innerHTML = `${allowance}`;
+ }
- const allowanceInput = document.getElementById('erc20-allowance-value');
- const value = parseInt(allowanceInput.value);
- if (!value) {
- allowanceStatus.error('× Allowance value must be larger than 0');
- return;
+ async function refreshERC20Balance() {
+ const balance = await asset.balanceOfLinkedToken();
+ document.getElementById('erc20-balance').innerHTML = `${balance}`;
}
- const registryAddress = window.aztec.web3.getAddress('AccountRegistry');
- const erc20Address = asset.linkedTokenAddress;
- await window.aztec.web3
- .useContract('ERC20')
- .at(erc20Address)
- .method('approve')
- .send(
- registryAddress,
- value,
- );
-
- await refreshAllowance();
- allowanceInput.value = '';
- }
-
- async function deposit() {
- depositStatus.clear();
-
- const numberOfOutputNotes = document.getElementById('deposit-output-number').value;
- const toAddress = document.getElementById('deposit-to-address').value;
- const amount = document.getElementById('deposit-value').value;
-
- try {
- const resp = await asset.deposit(
- [
- {
- amount,
- to: toAddress,
- },
- ],
- {
- numberOfOutputNotes,
- },
- );
- console.log('>> deposit response', resp);
- refreshAssetBalances();
- } catch (error) {
- console.error(error);
- depositStatus.error(error.message);
+ async function refreshAssetBalances() {
+ refreshERC20Balance();
+ refreshAllowance();
}
- }
-
- async function withdraw() {
- withdrawStatus.clear();
-
- const amount = document.getElementById('withdraw-value').value;
- const toAddress = document.getElementById('withdraw-to-address').value;
- const numberOfInputNotes = document.getElementById('withdraw-input-number').value;
-
- try {
- const resp = await asset.withdraw(
- amount,
- {
- to: toAddress,
- numberOfInputNotes,
- },
- );
- console.log('>> withdraw response', resp);
- refreshAssetBalances();
- } catch (error) {
- console.error(error);
- withdrawStatus.error(error.message);
+
+ function updateAssetBalance(balance) {
+ document.getElementById('asset-balance').innerHTML = `${balance}`;
}
- }
-
- async function send() {
- sendStatus.clear();
-
- const numberOfInputNotes = document.getElementById('send-input-number').value;
- const numberOfOutputNotes = document.getElementById('send-output-number').value;
- const amount = document.getElementById('send-value').value;
- const address = document.getElementById('send-address').value;
-
- try {
- const resp = await asset.send(
- [
- {
- to: address,
- amount,
- },
- ],
- {
- numberOfInputNotes,
- numberOfOutputNotes,
- },
- );
- console.log('>> send response', resp);
- refreshAssetBalances();
- } catch (error) {
- console.error(error);
- sendStatus.error(error.message);
+
+ async function initAsset() {
+ asset = await window.aztec.zkAsset(zkAssetAddress);
+ asset.subscribeToBalance(updateAssetBalance);
+ const apisElem = document.getElementById('asset-apis');
+ if (!asset.isValid()) {
+ apisElem.innerHTML = 'This asset is not valid.';
+ apisElem.style.color = 'red';
+ } else {
+ allowanceStatus = makeStatusGenerator('allowance-status');
+ depositStatus = makeStatusGenerator('deposit-status');
+ withdrawStatus = makeStatusGenerator('withdraw-status');
+ sendStatus = makeStatusGenerator('send-status');
+ fetchStatus = makeStatusGenerator('fetch-status');
+ createStatus = makeStatusGenerator('create-status');
+ document.getElementById('linked-erc20-address').innerHTML = asset.linkedTokenAddress;
+ initBalance();
+ refreshAssetBalances();
+ }
+ apisElem.style.display = 'block';
}
- }
-
- async function createNoteFromBalance() {
- createStatus.clear();
-
- const numberOfInputNotes = document.getElementById('create-input-number').value;
- const numberOfOutputNotes = document.getElementById('create-output-number').value;
- const value = document.getElementById('create-amount').value;
- const userAccess = [];
- for (let i = 0; i < 10; i += 1) {
- const elem = document.getElementById(`create-access-${i}`);
- if (!elem) break;
- if (elem.value) {
- userAccess.push(elem.value);
- }
+
+ async function approveAllowance() {
+ allowanceStatus.clear();
+
+ const allowanceInput = document.getElementById('erc20-allowance-value');
+ const value = parseInt(allowanceInput.value);
+ if (!value) {
+ allowanceStatus.error('× Allowance value must be larger than 0');
+ return;
+ }
+
+ const registryAddress = window.aztec.web3.getAddress('AccountRegistry');
+ const erc20Address = asset.linkedTokenAddress;
+ await window.aztec.web3
+ .useContract('ERC20')
+ .at(erc20Address)
+ .method('approve')
+ .send(
+ registryAddress,
+ value,
+ );
+
+ await refreshAllowance();
+ allowanceInput.value = '';
+ }
+
+ async function deposit() {
+ depositStatus.clear();
+
+ const numberOfOutputNotes = document.getElementById('deposit-output-number').value;
+ const toAddress = document.getElementById('deposit-to-address').value;
+ const amount = document.getElementById('deposit-value').value;
+
+ try {
+ const resp = await asset.deposit(
+ [{
+ amount,
+ to: toAddress,
+ }, ], {
+ numberOfOutputNotes,
+ },
+ );
+ console.log('>> deposit response', resp);
+ refreshAssetBalances();
+ } catch (error) {
+ console.error(error);
+ depositStatus.error(error.message);
+ }
}
- try {
- const resp = await asset.createNoteFromBalance(
- value,
- {
- userAccess,
- numberOfInputNotes,
- numberOfOutputNotes,
- },
- );
- console.log('>> create note from balance response', resp);
- refreshAssetBalances();
- } catch (error) {
- console.error(error);
- createStatus.error(error.message);
+ async function withdraw() {
+ withdrawStatus.clear();
+
+ const amount = document.getElementById('withdraw-value').value;
+ const toAddress = document.getElementById('withdraw-to-address').value;
+ const numberOfInputNotes = document.getElementById('withdraw-input-number').value;
+
+ try {
+ const resp = await asset.withdraw(
+ amount, {
+ to: toAddress,
+ numberOfInputNotes,
+ },
+ );
+ console.log('>> withdraw response', resp);
+ refreshAssetBalances();
+ } catch (error) {
+ console.error(error);
+ withdrawStatus.error(error.message);
+ }
}
- }
-
- async function fetchNotesFromBalance() {
- fetchStatus.clear();
-
- const equalTo = document.getElementById('fetch-eq-value').value;
- const greaterThan = document.getElementById('fetch-gt-value').value;
- const lessThan = document.getElementById('fetch-lt-value').value;
- const numberOfNotes = document.getElementById('fetch-count-value').value;
-
- let notes;
- try {
- notes = await asset.fetchNotesFromBalance({
- equalTo,
- lessThan,
- greaterThan,
- numberOfNotes,
- });
- console.log('>> fetch notes from balance response', notes);
- } catch (error) {
- console.error(error);
- fetchStatus.error(error.message);
- return;
+
+ async function send() {
+ sendStatus.clear();
+
+ const numberOfInputNotes = document.getElementById('send-input-number').value;
+ const numberOfOutputNotes = document.getElementById('send-output-number').value;
+ const amount = document.getElementById('send-value').value;
+ const address = document.getElementById('send-address').value;
+
+ try {
+ const resp = await asset.send(
+ [{
+ to: address,
+ amount,
+ }, ], {
+ numberOfInputNotes,
+ numberOfOutputNotes,
+ },
+ );
+ console.log('>> send response', resp);
+ refreshAssetBalances();
+ } catch (error) {
+ console.error(error);
+ sendStatus.error(error.message);
+ }
+ }
+
+ async function createNoteFromBalance() {
+ createStatus.clear();
+
+ const numberOfInputNotes = document.getElementById('create-input-number').value;
+ const numberOfOutputNotes = document.getElementById('create-output-number').value;
+ const value = document.getElementById('create-amount').value;
+ const userAccess = [];
+ for (let i = 0; i < 10; i += 1) {
+ const elem = document.getElementById(`create-access-${i}`);
+ if (!elem) break;
+ if (elem.value) {
+ userAccess.push(elem.value);
+ }
+ }
+
+ try {
+ const resp = await asset.createNoteFromBalance(
+ value, {
+ userAccess,
+ numberOfInputNotes,
+ numberOfOutputNotes,
+ },
+ );
+ console.log('>> create note from balance response', resp);
+ refreshAssetBalances();
+ } catch (error) {
+ console.error(error);
+ createStatus.error(error.message);
+ }
}
- if (!notes.length) {
- fetchStatus.log('Cannot find any notes that meet the requirements.');
- } else {
- fetchStatus.log(`Found ${notes.length} note${notes.length === 1 ? '' : 's'}:`, true);
- notes.forEach(({
- noteHash,
- value,
- }) => {
- fetchStatus.log(`${value} - ${noteHash}`, true);
- });
+ async function fetchNotesFromBalance() {
+ fetchStatus.clear();
+
+ const equalTo = document.getElementById('fetch-eq-value').value;
+ const greaterThan = document.getElementById('fetch-gt-value').value;
+ const lessThan = document.getElementById('fetch-lt-value').value;
+ const numberOfNotes = document.getElementById('fetch-count-value').value;
+
+ let notes;
+ try {
+ notes = await asset.fetchNotesFromBalance({
+ equalTo,
+ lessThan,
+ greaterThan,
+ numberOfNotes,
+ });
+ console.log('>> fetch notes from balance response', notes);
+ } catch (error) {
+ console.error(error);
+ fetchStatus.error(error.message);
+ return;
+ }
+
+ if (!notes.length) {
+ fetchStatus.log('Cannot find any notes that meet the requirements.');
+ } else {
+ fetchStatus.log(`Found ${notes.length} note${notes.length === 1 ? '' : 's'}:`, true);
+ notes.forEach(({
+ noteHash,
+ value,
+ }) => {
+ fetchStatus.log(`${value} - ${noteHash}`, true);
+ });
+ }
}
- }
- document.getElementById('app').innerHTML = `
+ document.getElementById('app').innerHTML = `
n?1:-1;else for(i=o=0;i >>0?1:0)|0;le=le+ue|0;fe=fe+ce+(le>>>0a?c+r-a&-16:0,h=c+r-l,d=0;if((o-1<<4)+c+r>k)throw new RangeError("counter overflow");for(var p=new Uint8Array(l);r>h;)c+=d=f(i,s+c,e,t,r-h),t+=d,r-=d,d=n.cipher(g.DEC.CTR,g.HEAP_DATA+s,d),(d=n.mac(g.MAC.CBC,g.HEAP_DATA+s,d))&&p.set(i.subarray(s,s+d),u),o+=d>>>4,u+=d,s=0,c=0;return r>0&&(c+=f(i,0,e,t,r)),this.counter=o,this.pos=s,this.len=c,p},t.prototype.AES_CCM_Decrypt_finish=function(){var e=this.asm,t=this.heap,r=this.tagSize,n=this.pos,i=this.len,o=i-r;if(i>>29,t[4]=u>>>21,t[5]=u>>>13&255,t[6]=u>>>5&255,t[7]=u<<3&255,t[8]=t[9]=t[10]=0,t[11]=f>>>29,t[12]=f>>>21&255,t[13]=f>>>13&255,t[14]=f>>>5&255,t[15]=f<<3&255,e.mac(g.MAC.GCM,g.HEAP_DATA,16),e.get_iv(g.HEAP_DATA),e.set_counter(0,0,0,this.gamma0),e.cipher(g.ENC.CTR,g.HEAP_DATA,16),s.set(t.subarray(0,n),a),this.counter=1,this.pos=0,this.len=0,s},t.prototype.AES_GCM_Decrypt_process=function(e){var t=0,r=e.length||0,n=this.asm,i=this.heap,o=this.counter,a=this.tagSize,s=this.pos,c=this.len,u=0,l=c+r>a?c+r-a&-16:0,h=c+r-l,d=0;if((o-1<<4)+c+r>I)throw new RangeError("counter overflow");for(var p=new Uint8Array(l);r>h;)c+=d=f(i,s+c,e,t,r-h),t+=d,r-=d,d=n.mac(g.MAC.GCM,g.HEAP_DATA+s,d),(d=n.cipher(g.DEC.CTR,g.HEAP_DATA+s,d))&&p.set(i.subarray(s,s+d),u),o+=d>>>4,u+=d,s=0,c=0;return r>0&&(c+=f(i,0,e,t,r)),this.counter=o,this.pos=s,this.len=c,p},t.prototype.AES_GCM_Decrypt_finish=function(){var e=this.asm,t=this.heap,r=this.tagSize,n=this.adata,i=this.counter,o=this.pos,a=this.len,s=a-r;if(a