---
# System prepended metadata

title: Ethereum API

---

# Ethereum API

## Contracts

### Get Instance with address
eth: `new ethers.Contract(address, abi, provider | signer);`
ae: `await aeSdk.getContractInstance({ contractAddress, source?, aci?, bytecode? });`

### Get Instance without address
eth: `new ethers.ContractFactory(abi, bytecode, provider | signer);`
ae: `await aeSdk.getContractInstance({ source?, aci?, bytecode? });`

### Deploy
eth: 
```
const factory = new ethers.ContractFactory(abi, bytecode, signer);
const contract = await factory.deploy(args);
await contract.deployTransaction.wait();
```
ae: 
```
const contract = await aeSdk.initializeContract({ sourceCode });
await contract.$deploy(args);
```

### Call Method
eth: `await contract.method(...args);`
ae: `await contract.method(...args, { callStatic?: boolean });`

## Transactions

### Build
eth: https://docs.ethers.io/v5/cookbook/transactions/
ae: `await aeSdk.buildTx(type, args);`

### Sign

eth: `await signer.signTransaction({ raw } | args)`
ae: `await aeSdk.signTransaction(rawTx);`

### Submit

eth: `N/A` (there seems no way to simply publish a raw signed tx)
ae: `await aeSdk.sendTransaction(signedTx);` or `await aeSdk.api.postTransaction({ tx });`


### SpendTx (Should be fairly easy)
eth: `await provider.send('eth_sendTransaction', { from, to, value })`
ae: `await aeSdk.spend(amount, address)`

## Sign Payload

eth: `await signer.signMessage(message)`
ae: `await sdk.signMessage(message);`


## Get

### Height

eth: `await provider.getBlockNumber()`
ae: `await aeSdk.height();`

### Blocks by Hash
eth: `await provider.getBlock(hash)`
ae: ` await aeSdk.getKeyBlock(hash)`

### Blocks by Number
eth: `await provider.getBlock(number)`
ae: ` await aeSdk.getKeyBlock(number)`

### Balance
eth: `await provider.getBalance(address)`
ae: `await aeSdk.getBalance(address)`

### Account (aka Signer) Address
eth: `await signer.getAddress()`
ae: `aeSdk.address()`

### Transactions by Hash
eth: `await provider.getTransaction(hash)`
ae: `await aeSdk.getTxInfo(hash)`

## ENS / AENS

### Resolve Name
eth: `await provider.resolveName(name)`
ae: `await aeSdk.resolveName(name)`

### Get Name Entry
eth: `N/A`
ae: `await aeSdk.getName(name)`

### Reverse Lookup
eth: `await provider.lookupAddress(address)`
ae: `N/A`


# Return Types

## Create a TX on chain
eth:
```
Transaction
hash: string<32>
to: address
from: address
nonce: number
gasLimit: BigNumber
gasPrice: BigNumber | null
maxFeePerGas: BigNumber
maxPriorityFeePerGas: BigNumber | null
data: Bytes
value: BigNumber
chainId: number (EIP155)

TransactionResponse extends Transaction
blockNumber: int | null
blockHash: string<32> | null
timestamp: int | null
confirmations: int | null
raw: string
wait(confirms): function --> TransactionReceipt
type: number (according to EIP2718)
accessList: array<string<32>> (according to  EIP-2930) 

TransactionReceipt
to: address | null
from: address
contractAddress: address | null
transactionIndex: number
type: number (EIP2718)
root: string (deprecated)
gasUsed: BigNumber
effectiveGasPrice: BigNumber
logsBloom: string
blockHash: string<32>
transactionHash: string<32>
logs: array<Log>
blockNumber: number
confirmations: number
cumulativeGasUsed: BigNumber
byzantium: boolean
status: tinyint

Log
blockNumber: number
blockHash: string<32>
removed: boolean
transactionLogIndex: number
address: string<32>
data: string
topics: array<string<32>>
transactionHash: string<32>
transactionIndex: number
logIndex: number #The index of this log across all logs in the entire block.
```

ae: https://github.com/aeternity/aepp-sdk-js/blob/a4df699f/src/tx/builder/schema.ts#L197

## Can they be merged?


### Transaction
| eth | ae | comment | 
| -------- | -------- | -------- |
| hash: string<32> | hash: string |
| to: address | toId: string |
| from: address | fromId: string |
| nonce: number | nonce: number |
| gasLimit: BigNumber | gasLimit: number |
| gasPrice: BigNumber | gasPrice: bigint | legacy option on eth |
| maxFeePerGas: BigNumber | gasPrice: bigint | amount of base fee + tip |
| maxPriorityFeePerGas: BigNumber | N/A  | size of the tip added to the base fee |
| data: Bytes | payload: string | could also be callData depending on the ethers implementation |
| value: BigNumber | amount: bigint | or fee sometimes |
| chainId: number (EIP155) | N/A | this is part of the signature in ae |


### TransactionResponse

| eth | ae | comment | 
| -------- | -------- | -------- |
| blockNumber: int | blockHeight: int | |
| blockHash: string<32> | blockHash: string | |
| timestamp: int | N/A | only available on block level |
| confirmations: int | N/A | can be calculated |
| raw: string | rawTx: string | |
| type: number | N/A | can be determined by attributes or just 0  |
| accessList: array<string<32>> | N/A | not implemented on ae |


### TransactionReceipt
| eth | ae | comment | 
| -------- | -------- | -------- |
| to: address | toId: string |
| from: address | fromId: string |
| contractAddress: address | contractId: string |
| transactionIndex: number | N/A | does not exist in ae |
| type: number | N/A | can be determined by attributes or just 0 |
| root: string | N/A | can be skipped, legacy field |
| gasUsed: BigNumber | gas: number |
| effectiveGasPrice: BigNumber | gasPrice: bigint |
| logsBloom: string | N/A | TBD |
| blockHash: string<32> | blockHash: string | |
| transactionHash: string<32> | hash: string |
| logs: array<Log> | log | has to be decoded but values are available |
| blockNumber: number | blockHeight: int |
| confirmations: number | N/A | can be calculated |
| cumulativeGasUsed: BigNumber | N/A | same as gas |
| byzantium: boolean | N/A | can be simply false
| status: tinyint | returnType | only available on contract tx, for other tx it can be inferred | |

