Skip to content

Commit

Permalink
feat: invoke normalizeRoute when planning
Browse files Browse the repository at this point in the history
  • Loading branch information
cristovaoth committed Jan 8, 2025
1 parent e1e8865 commit d98d7d5
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 60 deletions.
39 changes: 9 additions & 30 deletions src/addresses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,20 @@ export const formatPrefixedAddress = (
export const splitPrefixedAddress = (
prefixedAddress: PrefixedAddress | Address
): [ChainId | undefined, Address] => {
validatePrefixedAddress(prefixedAddress)

if (prefixedAddress.length == zeroAddress.length) {
if (!isAddress(prefixedAddress)) {
throw new Error(`Not an Address: ${prefixedAddress}`)
}
return [undefined, getAddress(prefixedAddress)]
} else {
if (prefixedAddress.indexOf(':') == -1) {
throw new Error(`Unsupported PrefixedAddress format: ${prefixedAddress}`)
}
const [prefix, address] = prefixedAddress.split(':')
const chain = chains.find(({ shortName }) => shortName === prefix)
if (prefix && prefix != 'eoa' && !chain) {
throw new Error(`Unsupported chain shortName: ${prefix}`)
}

return [chain?.chainId, getAddress(address)] as const
}
Expand All @@ -37,31 +44,3 @@ export const parsePrefixedAddress = (
const [, address] = splitPrefixedAddress(prefixedAddress)
return address
}

export const validatePrefixedAddress = (
prefixedAddress: PrefixedAddress | Address
) => {
if (prefixedAddress.length == zeroAddress.length) {
if (!isAddress(prefixedAddress)) {
throw new Error(`Not an Address: ${prefixedAddress}`)
}
} else {
if (prefixedAddress.indexOf(':') == -1) {
throw new Error(`Unsupported PrefixedAddress format: ${prefixedAddress}`)
}

const [prefix, address] = prefixedAddress.split(':')

if (
prefix &&
prefix != 'eoa' &&
chains.every((chain) => chain.shortName != prefix)
) {
throw new Error(`Unsupported chain shortName: ${prefix}`)
}

if (!isAddress(address)) {
throw new Error(`Not an Address: ${address}`)
}
}
}
19 changes: 8 additions & 11 deletions src/execute/normalizeRoute.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Address, encodeFunctionData, parseAbi } from 'viem'
import { encodeFunctionData, getAddress, parseAbi } from 'viem'

import { splitPrefixedAddress, validatePrefixedAddress } from '../addresses'
import { formatPrefixedAddress, splitPrefixedAddress } from '../addresses'

import {
Account,
Expand Down Expand Up @@ -55,7 +55,7 @@ async function normalizeAccount(
): Promise<Account> {
account = {
...account,
address: normalizeAddress(account.address),
address: getAddress(account.address),
prefixedAddress: normalizePrefixedAddress(account.prefixedAddress),
}

Expand All @@ -76,14 +76,11 @@ function normalizeConnection(connection: Connection): Connection {
}
}

function normalizeAddress(address: Address): Address {
validatePrefixedAddress(address)
return address.toLowerCase() as Address
}

function normalizePrefixedAddress(address: PrefixedAddress): PrefixedAddress {
validatePrefixedAddress(address)
return address.toLowerCase() as PrefixedAddress
function normalizePrefixedAddress(
prefixedAddress: PrefixedAddress
): PrefixedAddress {
const [chainId, address] = splitPrefixedAddress(prefixedAddress)
return formatPrefixedAddress(chainId, address)
}

async function fetchThreshold(
Expand Down
38 changes: 19 additions & 19 deletions src/execute/plan.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ describe('plan', () => {
[
{
data: '0x',
to: receiver.address as `0x{string}`,
to: receiver.address,
value: parseEther('1'),
operation: OperationType.Call,
},
Expand Down Expand Up @@ -126,7 +126,7 @@ describe('plan', () => {
[
{
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('1'),
operation: OperationType.Call,
},
Expand Down Expand Up @@ -192,7 +192,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('1'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -231,7 +231,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('1'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -277,7 +277,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver as `0x${string}`,
to: receiver,
value: parseEther('1'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -333,7 +333,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver as `0x${string}`,
to: receiver,
value: parseEther('1'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -436,7 +436,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('1'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -517,7 +517,7 @@ describe('plan', () => {
[
{
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('1'),
operation: OperationType.Call,
},
Expand Down Expand Up @@ -592,7 +592,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('0.123'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -658,7 +658,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('0.123'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -733,7 +733,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('0.123'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -825,7 +825,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('0.123'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -917,7 +917,7 @@ describe('plan', () => {
})

const route = eoaRolesSafeOwnsSafe({
eoa: member.address as `0x${string}`,
eoa: member.address,
roles,
roleId,
safe1,
Expand All @@ -926,7 +926,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('0.123'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -999,7 +999,7 @@ describe('plan', () => {
})

const route = eoaRolesSafeOwnsSafe({
eoa: member.address as `0x${string}`,
eoa: member.address,
roles,
roleId,
safe1,
Expand All @@ -1008,7 +1008,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('0.123'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -1106,7 +1106,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('0.123'),
operation: OperationType.Call,
}
Expand Down Expand Up @@ -1156,7 +1156,7 @@ describe('plan', () => {
).toEqual(parseEther('0.123'))
})

it('plans and executes independently', async () => {
it.only('plans and executes independently', async () => {
const owner = privateKeyToAccount(randomHash())
const eoa = privateKeyToAccount(randomHash())
const receiver = privateKeyToAccount(randomHash())
Expand Down Expand Up @@ -1204,7 +1204,7 @@ describe('plan', () => {

const transaction: MetaTransactionRequest = {
data: '0x',
to: receiver.address as `0x${string}`,
to: receiver.address,
value: parseEther('0.123'),
operation: OperationType.Call,
}
Expand Down
3 changes: 3 additions & 0 deletions src/execute/plan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Eip1193Provider } from '@safe-global/protocol-kit'

import { createPreApprovedSignature } from './signatures'
import { encodeMultiSend } from './multisend'
import { normalizeRoute } from './normalizeRoute'
import { prepareSafeTransaction } from './safeTransaction'

import { splitPrefixedAddress } from '../addresses'
Expand Down Expand Up @@ -64,6 +65,8 @@ export const planExecution = async (
route: Route,
options: Options = {}
): Promise<ExecutionPlan> => {
route = await normalizeRoute(route, options)

// encode batch using the appropriate multiSend contract address
const lastRolesAccount = route.waypoints.findLast(
(wp) => wp.account.type === AccountType.ROLES
Expand Down

0 comments on commit d98d7d5

Please sign in to comment.