diff --git a/README.md b/README.md index b9cb54d..a5be549 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/cmds/modify-l1_cmds/transfer-proxy.js b/cmds/modify-l1_cmds/transfer-proxy.js new file mode 100644 index 0000000..a65265d --- /dev/null +++ b/cmds/modify-l1_cmds/transfer-proxy.js @@ -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 : + 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); +}; diff --git a/cmds/modify-l2_cmds/transfer-proxy.js b/cmds/modify-l2_cmds/transfer-proxy.js new file mode 100644 index 0000000..28f38a7 --- /dev/null +++ b/cmds/modify-l2_cmds/transfer-proxy.js @@ -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); +};