Skip to content

Commit

Permalink
feat(gar methods): add gar write methods to the ario client
Browse files Browse the repository at this point in the history
  • Loading branch information
Atticus committed Mar 27, 2024
1 parent dd02693 commit e01b08b
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 22 deletions.
35 changes: 24 additions & 11 deletions src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ export type ContractConfiguration = {
| {
contract?:
| (BaseContract<unknown> & ReadContract)
| (BaseContract<unknown> & ReadContract & WriteContract);
| (BaseContract<unknown> & ReadWriteContract);
}
| {
contractTxId: string;
Expand All @@ -53,7 +53,11 @@ export type ContractConfiguration = {

export function isContractConfiguration<T>(
config: ContractConfiguration,
): config is { contract: BaseContract<T> & ReadContract } {
): config is {
contract:
| (BaseContract<T> & ReadContract)
| (BaseContract<T> & ReadWriteContract);
} {
return 'contract' in config;
}

Expand Down Expand Up @@ -82,9 +86,7 @@ export type WriteParameters<Input> = {

export interface BaseContract<T> {
getState(params: EvaluationParameters): Promise<T>;
connect(
signer: ContractSigner,
): this & BaseContract<ArIOState> & ReadContract & WriteContract;
connect(signer: ContractSigner): this & BaseContract<T> & ReadWriteContract;
}

export interface ReadContract {
Expand All @@ -108,6 +110,8 @@ export interface WriteContract {
>;
}

export interface ReadWriteContract extends ReadContract, WriteContract {}

export interface SmartWeaveContract<T> {
getContractState(params: EvaluationParameters): Promise<T>;
readInteraction<I, K>({
Expand Down Expand Up @@ -181,22 +185,31 @@ export interface ArIOContract extends BaseContract<ArIOState> {
type?: RegistrationType;
}>): Promise<ArNSAuctionData>;
// write interactions
joinNetwork(params: JoinNetworkParams): Promise<Transaction>;
joinNetwork(params: JoinNetworkParams): Promise<WriteInteractionResult>;
updateGatewaySettings(
params: UpdateGatewaySettingsParams,
): Promise<Transaction | DataItem>;
increaseOperatorStake(params: { qty: number }): Promise<Transaction>;
decreaseOperatorStake(params: { qty: number }): Promise<Transaction>;
): Promise<WriteInteractionResult>;
increaseOperatorStake(params: {
qty: number;
}): Promise<WriteInteractionResult>;
decreaseOperatorStake(params: {
qty: number;
}): Promise<WriteInteractionResult>;
increaseDelegateState(params: {
target: WalletAddress;
qty: number;
}): Promise<Transaction>;
}): Promise<WriteInteractionResult>;
decreaseDelegateState(params: {
target: WalletAddress;
qty: number;
}): Promise<Transaction>;
}): Promise<WriteInteractionResult>;
}

export type WriteInteractionResult =
| Transaction
| DataItem
| InteractionResult<unknown, unknown>;

export type JoinNetworkParams = {
qty: number;
allowDelegatedStaking?: boolean;
Expand Down
47 changes: 37 additions & 10 deletions src/common/ar-io.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import { DataItem } from 'arbundles/node';
import { Transaction } from 'warp-contracts/web';

import { ARNS_TESTNET_REGISTRY_TX } from '../constants.js';
import {
ArIOContract,
Expand All @@ -37,11 +34,16 @@ import {
UpdateGatewaySettingsParams,
WeightedObserver,
WriteContract,
WriteInteractionResult,
isContractConfiguration,
isContractTxIdConfiguration,
} from '../types.js';
import { RemoteContract } from './contracts/remote-contract.js';
import { WarpContract } from './index.js';
import {
NO_SIGNER_ERROR,
WarpContract,
WriteInteractionError,
} from './index.js';

export class ArIO implements ArIOContract, BaseContract<ArIOState> {
private contract:
Expand Down Expand Up @@ -261,16 +263,25 @@ export class ArIO implements ArIOContract, BaseContract<ArIOState> {

return auctions;
}
// write methods

async joinNetwork(params: JoinNetworkParams): Promise<Transaction> {
async joinNetwork(
params: JoinNetworkParams,
): Promise<WriteInteractionResult> {
if (!this.signer) {
throw new WriteInteractionError(NO_SIGNER_ERROR);
}
return this.contract.connect(this.signer).writeInteraction({
functionName: 'joinNetwork',
inputs: params,
});
}
async updateGatewaySettings(
params: UpdateGatewaySettingsParams,
): Promise<Transaction | DataItem> {
): Promise<WriteInteractionResult> {
if (!this.signer) {
throw new WriteInteractionError(NO_SIGNER_ERROR);
}
return this.contract.connect(this.signer).writeInteraction({
functionName: 'updateGatewaySettings',
inputs: params,
Expand All @@ -280,7 +291,10 @@ export class ArIO implements ArIOContract, BaseContract<ArIOState> {
async increaseDelegateState(params: {
target: string;
qty: number;
}): Promise<Transaction> {
}): Promise<WriteInteractionResult> {
if (!this.signer) {
throw new WriteInteractionError(NO_SIGNER_ERROR);
}
return this.contract.connect(this.signer).writeInteraction({
functionName: 'delegateState',
inputs: params,
Expand All @@ -290,21 +304,34 @@ export class ArIO implements ArIOContract, BaseContract<ArIOState> {
async decreaseDelegateState(params: {
target: string;
qty: number;
}): Promise<Transaction> {
}): Promise<WriteInteractionResult> {
if (!this.signer) {
throw new WriteInteractionError(NO_SIGNER_ERROR);
}
return this.contract.connect(this.signer).writeInteraction({
functionName: 'decreaseDelegateState',
inputs: params,
});
}

async increaseOperatorStake(params: { qty: number }): Promise<Transaction> {
async increaseOperatorStake(params: {
qty: number;
}): Promise<WriteInteractionResult> {
if (!this.signer) {
throw new WriteInteractionError(NO_SIGNER_ERROR);
}
return this.contract.connect(this.signer).writeInteraction({
functionName: 'increaseOperatorStake',
inputs: params,
});
}

async decreaseOperatorStake(params: { qty: number }): Promise<Transaction> {
async decreaseOperatorStake(params: {
qty: number;
}): Promise<WriteInteractionResult> {
if (!this.signer) {
throw new WriteInteractionError(NO_SIGNER_ERROR);
}
return this.contract.connect(this.signer).writeInteraction({
functionName: 'decreaseOperatorStake',
inputs: params,
Expand Down
2 changes: 1 addition & 1 deletion src/common/contracts/warp-contract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ export class WarpContract<T>
};
}

connect(signer: ContractSigner) {
connect(signer: ContractSigner): this {
const warpSigner = new Signature(this.warp, {
signer: async (tx: Transaction) => {
const dataToSign = await tx.getSignatureData();
Expand Down
3 changes: 3 additions & 0 deletions src/common/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,6 @@ export class FailedRequestError extends BaseError {
export class UnknownError extends BaseError {}

export class WriteInteractionError extends BaseError {}

export const NO_SIGNER_ERROR =
'No signer provided in contract configuration. Connect a signer to write transaction.';

0 comments on commit e01b08b

Please sign in to comment.