Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add command to set the transfer proxy #16

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,13 @@ For the full documentation, please install the cli and explore the commands and
* `spawn-proxy` - Sets the spawn-proxy address for the points.
* `network-key` - Sets the network keys for the points, which is required to be able to boot the Urbit.
* `transfer` - Transfers the point to a target address or the wallet files.
* `transfer-proxy` - Sets the transfer proxy address for the points.
* `modify-l2` - Modifies the state of one or more points via a L2 roller. The roller then submits the changes to the L2 Ethereum contract. Any point modified via this command, needs to be on L2.
* `spawn` - Spawns multiple points to the supplied address. The galaxy or star that spawns needs to be on L2 or the spawn proxy needs to be on L2.
* `management-proxy` - Sets the management proxy address for the points.
* `network-key` - Sets the network keys for the points, which is required to be able to boot the Urbit.
* `transfer` - Transfers the point to a target address or the wallet files.
* `transfer-proxy` - Sets the transfer proxy address for the points.

### Examples
#### Spawn, Set Network Keys, and Transfer to Master Ticket on Azimuth (L1)
Expand Down
54 changes: 54 additions & 0 deletions cmds/modify-l1_cmds/transfer-proxy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
const ob = require('urbit-ob')
const ajs = require('azimuth-js')
const _ = require('lodash')
const {files, validate, eth, azimuth, findPoints} = require('../../utils')

exports.command = 'transfer-proxy'
exports.desc = 'Set the transfer proxy of one or more points.'

exports.builder = function(yargs) {
}

exports.handler = async function (argv)
{
const workDir = files.ensureWorkDir(argv.workDir);
const privateKey = await eth.getPrivateKey(argv);
const ctx = await eth.createContext(argv);
const ethAccount = eth.getAccount(ctx.web3, privateKey);

const wallets = argv.useWalletFiles ? findPoints.getWallets(workDir) : null;
const points = findPoints.getPoints(argv, workDir, wallets);

console.log(`Will set transfer proxy for ${points.length} points`);
for (const p of points)
{
let patp = ob.patp(p);
console.log(`Trying to set transfer proxy for ${patp} (${p}).`);

let wallet = argv.useWalletFiles ? wallets[patp] : null;
let targetAddress =
argv.address != undefined
? argv.address
: argv.useWalletFiles
? wallet.ownership.keys.address :
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The wallet.json has ownership.keys and transfer.keys so I'm not sure which is the correct one to use here.

My assumption is that the goal is for the point to end up being owned by the ownership key, so I should set the transfer proxy to the ownership key and then the ownership key will use the transfer proxy rights to transfer the point to itself. But then I don't see what is the point of the separate "transfer" keys in the wallet.

null; //fail
targetAddress = validate.address(targetAddress, true);

if(await azimuth.isTransferProxy(ctx.contracts, p, targetAddress)){
console.log(`Target address ${targetAddress} is already transfer proxy for ${patp}.`);
continue;
}

var res = await ajs.check.canSetTransferProxy(ctx.contracts, p, ethAccount.address);
if(!res.result){
console.log(`Cannot set transfer proxy for ${patp}: ${res.reason}`);
continue;
}

//create and send tx
let tx = ajs.ecliptic.setTransferProxy(ctx.contracts, p, targetAddress)
await eth.setGasSignSendAndSaveTransaction(ctx, tx, privateKey, argv, workDir, patp, 'transferproxy');
} //end for each point

process.exit(0);
};
66 changes: 66 additions & 0 deletions cmds/modify-l2_cmds/transfer-proxy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
const ob = require('urbit-ob')
const _ = require('lodash')
const ajsUtils = require('azimuth-js').utils;
var Accounts = require('web3-eth-accounts');
const {files, validate, eth, findPoints, rollerApi} = require('../../utils')

exports.command = 'transfer-proxy'
exports.desc = 'Set the transfer proxy of one or more L2 points.'

exports.builder = function(yargs) {
}

exports.handler = async function (argv)
{
const rollerClient = rollerApi.createClient(argv);
const workDir = files.ensureWorkDir(argv.workDir);
const privateKey = await eth.getPrivateKey(argv);
const account = new Accounts().privateKeyToAccount(privateKey);
const signingAddress = account.address;

const wallets = argv.useWalletFiles ? findPoints.getWallets(workDir) : null;
const points = findPoints.getPoints(argv, workDir, wallets);

console.log(`Will set transfer proxy for ${points.length} points`);
for (const p of points)
{
let patp = ob.patp(p);
console.log(`Trying to set transfer proxy for ${patp} (${p}).`);

const pointInfo = await rollerApi.getPoint(rollerClient, patp);
if(pointInfo.dominion != 'l2'){
console.log(`This point in not on L2, please use the L1 modify command.`);
continue;
}

let wallet = argv.useWalletFiles ? wallets[patp] : null;
let targetAddress =
argv.address != undefined
? argv.address
: argv.useWalletFiles
? wallet.ownership.keys.address :
null; //fail
targetAddress = validate.address(targetAddress, true);

if(ajsUtils.addressEquals(pointInfo.ownership.transferProxy.address, targetAddress)){
console.log(`Target address ${targetAddress} is already transfer proxy for ${patp}.`);
continue;
}

//the proxy type must be 'own', indicating that the signing address is the same as the point owner,
// bc only the point owner can set the mgmt proxy
if((await rollerApi.getManagementProxyType(rollerClient, patp, signingAddress)) != 'own'){
console.log(`Cannot set transfer proxy for ${patp}, must be owner.`);
continue;
}

//create and send tx
var receipt = await rollerApi.setTransferProxy(rollerClient, patp, targetAddress, signingAddress, privateKey);
console.log("Tx hash: "+receipt.hash);

let receiptFileName = patp.substring(1)+`-receipt-L2-${receipt.type}.json`;
files.writeFile(workDir, receiptFileName, receipt);
} //end for each point

process.exit(0);
};