-
Notifications
You must be signed in to change notification settings - Fork 45
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: contract definition load impl from RedStone Gateway
- Loading branch information
1 parent
027019f
commit 15f9bff
Showing
2 changed files
with
49 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
48 changes: 48 additions & 0 deletions
48
src/core/modules/impl/RedstoneGatewayContractDefinitionLoader.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
import { ContractDefinition, LoggerFactory, stripTrailingSlash, SwCache } from '@smartweave'; | ||
import Arweave from 'arweave'; | ||
import 'isomorphic-fetch'; | ||
import { ContractDefinitionLoader } from './ContractDefinitionLoader'; | ||
|
||
/** | ||
* An extension to {@link ContractDefinitionLoader} that makes use of | ||
* Redstone Gateway ({@link https://github.com/redstone-finance/redstone-sw-gateway}) | ||
* to load Contract Data. | ||
* | ||
* If the contract data is not available on RedStone Gateway - it fallbacks to default implementation | ||
* in {@link ContractDefinitionLoader} - i.e. loads the definition from Arweave gateway. | ||
*/ | ||
export class RedstoneGatewayContractDefinitionLoader extends ContractDefinitionLoader { | ||
private readonly rLogger = LoggerFactory.INST.create('ContractDefinitionLoader'); | ||
|
||
constructor( | ||
private readonly baseUrl: string, | ||
arweave: Arweave, | ||
cache?: SwCache<string, ContractDefinition<unknown>> | ||
) { | ||
super(arweave, cache); | ||
this.baseUrl = stripTrailingSlash(baseUrl); | ||
} | ||
|
||
async doLoad<State>(contractTxId: string, forcedSrcTxId?: string): Promise<ContractDefinition<State>> { | ||
if (forcedSrcTxId) { | ||
// no support for the evolve yet.. | ||
return await super.doLoad(contractTxId, forcedSrcTxId); | ||
} | ||
|
||
try { | ||
return await fetch(`${this.baseUrl}/gateway/contracts/${contractTxId}`) | ||
.then((res) => { | ||
return res.ok ? res.json() : Promise.reject(res); | ||
}) | ||
.catch((error) => { | ||
if (error.body?.message) { | ||
this.rLogger.error(error.body.message); | ||
} | ||
throw new Error(`Unable to retrieve contract data. Redstone gateway responded with status ${error.status}.`); | ||
}); | ||
} catch (e) { | ||
this.rLogger.warn('Falling back to default contracts loader'); | ||
return await super.doLoad(contractTxId, forcedSrcTxId); | ||
} | ||
} | ||
} |